You're Invited:Meet the Socket Team at RSAC and BSidesSF 2026, March 23–26.RSVP
Socket
Book a DemoSign in
Socket

@backstage/cli-common

Package Overview
Dependencies
Maintainers
3
Versions
236
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@backstage/cli-common - npm Package Compare versions

Comparing version
0.2.0-next.1
to
0.2.0-next.2
+6
-0
CHANGELOG.md
# @backstage/cli-common
## 0.2.0-next.2
### Patch Changes
- 9361965: Fixed `runCheck` to ignore stdio of the spawned process, preventing unwanted output from leaking to the terminal.
## 0.2.0-next.1

@@ -4,0 +10,0 @@

+1
-1

@@ -115,3 +115,3 @@ 'use strict';

try {
await run(args).waitForExit();
await run(args, { stdio: "ignore" }).waitForExit();
return true;

@@ -118,0 +118,0 @@ } catch {

@@ -1,1 +0,1 @@

{"version":3,"file":"run.cjs.js","sources":["../src/run.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ChildProcess, SpawnOptions } from 'node:child_process';\nimport spawn from 'cross-spawn';\nimport { ExitCodeError } from './errors';\nimport { assertError } from '@backstage/errors';\n\n/**\n * Callback function that can be used to receive stdout or stderr data from a child process.\n *\n * @public\n */\nexport type RunOnOutput = (data: Buffer) => void;\n\n/**\n * Options for running a child process with {@link run} or related functions.\n *\n * @public\n */\nexport type RunOptions = Omit<SpawnOptions, 'env'> & {\n env?: Partial<NodeJS.ProcessEnv>;\n onStdout?: RunOnOutput;\n onStderr?: RunOnOutput;\n stdio?: SpawnOptions['stdio'];\n};\n\n/**\n * Child process handle returned by {@link run}.\n *\n * @public\n */\nexport interface RunChildProcess extends ChildProcess {\n /**\n * Waits for the child process to exit.\n *\n * @remarks\n *\n * Resolves when the process exits successfully (exit code 0) or is terminated by a signal.\n * If the process exits with a non-zero exit code, the promise is rejected with an {@link ExitCodeError}.\n *\n * @returns A promise that resolves when the process exits successfully or is terminated by a signal, or rejects on error.\n */\n waitForExit(): Promise<void>;\n}\n\n/**\n * Runs a command and returns a child process handle.\n *\n * @public\n */\nexport function run(args: string[], options: RunOptions = {}): RunChildProcess {\n if (args.length === 0) {\n throw new Error('run requires at least one argument');\n }\n\n const [name, ...cmdArgs] = args;\n\n const { onStdout, onStderr, stdio: customStdio, ...spawnOptions } = options;\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n FORCE_COLOR: 'true',\n ...(options.env ?? {}),\n };\n\n const stdio =\n customStdio ??\n ([\n 'inherit',\n onStdout ? 'pipe' : 'inherit',\n onStderr ? 'pipe' : 'inherit',\n ] as ('inherit' | 'pipe')[]);\n\n const child = spawn(name, cmdArgs, {\n ...spawnOptions,\n stdio,\n env,\n }) as RunChildProcess;\n\n if (onStdout && child.stdout) {\n child.stdout.on('data', onStdout);\n }\n if (onStderr && child.stderr) {\n child.stderr.on('data', onStderr);\n }\n\n const commandName = args.join(' ');\n\n let waitPromise: Promise<void> | undefined;\n\n child.waitForExit = async (): Promise<void> => {\n if (waitPromise) {\n return waitPromise;\n }\n\n waitPromise = new Promise<void>((resolve, reject) => {\n if (typeof child.exitCode === 'number') {\n if (child.exitCode) {\n reject(new ExitCodeError(child.exitCode, commandName));\n } else {\n resolve();\n }\n return;\n }\n\n function onError(error: Error) {\n cleanup();\n reject(error);\n }\n\n function onExit(code: number | null) {\n cleanup();\n if (code) {\n reject(new ExitCodeError(code, commandName));\n } else {\n resolve();\n }\n }\n\n function onSignal() {\n if (!child.killed && child.exitCode === null) {\n child.kill();\n }\n }\n\n function cleanup() {\n for (const signal of ['SIGINT', 'SIGTERM'] as const) {\n process.removeListener(signal, onSignal);\n }\n child.removeListener('error', onError);\n child.removeListener('exit', onExit);\n }\n\n child.once('error', onError);\n child.once('exit', onExit);\n\n for (const signal of ['SIGINT', 'SIGTERM'] as const) {\n process.addListener(signal, onSignal);\n }\n });\n\n return waitPromise;\n };\n\n return child;\n}\n\n/**\n * Runs a command and returns the stdout.\n *\n * @remarks\n *\n * On error, both stdout and stderr are attached to the error object as properties.\n *\n * @public\n */\nexport async function runOutput(\n args: string[],\n options?: RunOptions,\n): Promise<string> {\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n\n if (args.length === 0) {\n throw new Error('runOutput requires at least one argument');\n }\n\n try {\n await run(args, {\n ...options,\n onStdout: data => {\n stdoutChunks.push(data);\n options?.onStdout?.(data);\n },\n onStderr: data => {\n stderrChunks.push(data);\n options?.onStderr?.(data);\n },\n }).waitForExit();\n\n return Buffer.concat(stdoutChunks).toString().trim();\n } catch (error) {\n assertError(error);\n\n (error as Error & { stdout?: string }).stdout =\n Buffer.concat(stdoutChunks).toString();\n (error as Error & { stderr?: string }).stderr =\n Buffer.concat(stderrChunks).toString();\n\n throw error;\n }\n}\n\n/**\n * Runs a command and returns true if it exits with code 0, false otherwise.\n *\n * @public\n */\nexport async function runCheck(args: string[]): Promise<boolean> {\n try {\n await run(args).waitForExit();\n return true;\n } catch {\n return false;\n }\n}\n"],"names":["spawn","ExitCodeError","assertError"],"mappings":"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"}
{"version":3,"file":"run.cjs.js","sources":["../src/run.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ChildProcess, SpawnOptions } from 'node:child_process';\nimport spawn from 'cross-spawn';\nimport { ExitCodeError } from './errors';\nimport { assertError } from '@backstage/errors';\n\n/**\n * Callback function that can be used to receive stdout or stderr data from a child process.\n *\n * @public\n */\nexport type RunOnOutput = (data: Buffer) => void;\n\n/**\n * Options for running a child process with {@link run} or related functions.\n *\n * @public\n */\nexport type RunOptions = Omit<SpawnOptions, 'env'> & {\n env?: Partial<NodeJS.ProcessEnv>;\n onStdout?: RunOnOutput;\n onStderr?: RunOnOutput;\n stdio?: SpawnOptions['stdio'];\n};\n\n/**\n * Child process handle returned by {@link run}.\n *\n * @public\n */\nexport interface RunChildProcess extends ChildProcess {\n /**\n * Waits for the child process to exit.\n *\n * @remarks\n *\n * Resolves when the process exits successfully (exit code 0) or is terminated by a signal.\n * If the process exits with a non-zero exit code, the promise is rejected with an {@link ExitCodeError}.\n *\n * @returns A promise that resolves when the process exits successfully or is terminated by a signal, or rejects on error.\n */\n waitForExit(): Promise<void>;\n}\n\n/**\n * Runs a command and returns a child process handle.\n *\n * @public\n */\nexport function run(args: string[], options: RunOptions = {}): RunChildProcess {\n if (args.length === 0) {\n throw new Error('run requires at least one argument');\n }\n\n const [name, ...cmdArgs] = args;\n\n const { onStdout, onStderr, stdio: customStdio, ...spawnOptions } = options;\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n FORCE_COLOR: 'true',\n ...(options.env ?? {}),\n };\n\n const stdio =\n customStdio ??\n ([\n 'inherit',\n onStdout ? 'pipe' : 'inherit',\n onStderr ? 'pipe' : 'inherit',\n ] as ('inherit' | 'pipe')[]);\n\n const child = spawn(name, cmdArgs, {\n ...spawnOptions,\n stdio,\n env,\n }) as RunChildProcess;\n\n if (onStdout && child.stdout) {\n child.stdout.on('data', onStdout);\n }\n if (onStderr && child.stderr) {\n child.stderr.on('data', onStderr);\n }\n\n const commandName = args.join(' ');\n\n let waitPromise: Promise<void> | undefined;\n\n child.waitForExit = async (): Promise<void> => {\n if (waitPromise) {\n return waitPromise;\n }\n\n waitPromise = new Promise<void>((resolve, reject) => {\n if (typeof child.exitCode === 'number') {\n if (child.exitCode) {\n reject(new ExitCodeError(child.exitCode, commandName));\n } else {\n resolve();\n }\n return;\n }\n\n function onError(error: Error) {\n cleanup();\n reject(error);\n }\n\n function onExit(code: number | null) {\n cleanup();\n if (code) {\n reject(new ExitCodeError(code, commandName));\n } else {\n resolve();\n }\n }\n\n function onSignal() {\n if (!child.killed && child.exitCode === null) {\n child.kill();\n }\n }\n\n function cleanup() {\n for (const signal of ['SIGINT', 'SIGTERM'] as const) {\n process.removeListener(signal, onSignal);\n }\n child.removeListener('error', onError);\n child.removeListener('exit', onExit);\n }\n\n child.once('error', onError);\n child.once('exit', onExit);\n\n for (const signal of ['SIGINT', 'SIGTERM'] as const) {\n process.addListener(signal, onSignal);\n }\n });\n\n return waitPromise;\n };\n\n return child;\n}\n\n/**\n * Runs a command and returns the stdout.\n *\n * @remarks\n *\n * On error, both stdout and stderr are attached to the error object as properties.\n *\n * @public\n */\nexport async function runOutput(\n args: string[],\n options?: RunOptions,\n): Promise<string> {\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n\n if (args.length === 0) {\n throw new Error('runOutput requires at least one argument');\n }\n\n try {\n await run(args, {\n ...options,\n onStdout: data => {\n stdoutChunks.push(data);\n options?.onStdout?.(data);\n },\n onStderr: data => {\n stderrChunks.push(data);\n options?.onStderr?.(data);\n },\n }).waitForExit();\n\n return Buffer.concat(stdoutChunks).toString().trim();\n } catch (error) {\n assertError(error);\n\n (error as Error & { stdout?: string }).stdout =\n Buffer.concat(stdoutChunks).toString();\n (error as Error & { stderr?: string }).stderr =\n Buffer.concat(stderrChunks).toString();\n\n throw error;\n }\n}\n\n/**\n * Runs a command and returns true if it exits with code 0, false otherwise.\n *\n * @public\n */\nexport async function runCheck(args: string[]): Promise<boolean> {\n try {\n await run(args, { stdio: 'ignore' }).waitForExit();\n return true;\n } catch {\n return false;\n }\n}\n"],"names":["spawn","ExitCodeError","assertError"],"mappings":";;;;;;;;;;AAgEO,SAAS,GAAA,CAAI,IAAA,EAAgB,OAAA,GAAsB,EAAC,EAAoB;AAC7E,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,EACtD;AAEA,EAAA,MAAM,CAAC,IAAA,EAAM,GAAG,OAAO,CAAA,GAAI,IAAA;AAE3B,EAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAU,OAAO,WAAA,EAAa,GAAG,cAAa,GAAI,OAAA;AACpE,EAAA,MAAM,GAAA,GAAyB;AAAA,IAC7B,GAAG,OAAA,CAAQ,GAAA;AAAA,IACX,WAAA,EAAa,MAAA;AAAA,IACb,GAAI,OAAA,CAAQ,GAAA,IAAO;AAAC,GACtB;AAEA,EAAA,MAAM,QACJ,WAAA,IACC;AAAA,IACC,SAAA;AAAA,IACA,WAAW,MAAA,GAAS,SAAA;AAAA,IACpB,WAAW,MAAA,GAAS;AAAA,GACtB;AAEF,EAAA,MAAM,KAAA,GAAQA,sBAAA,CAAM,IAAA,EAAM,OAAA,EAAS;AAAA,IACjC,GAAG,YAAA;AAAA,IACH,KAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,IAAI,QAAA,IAAY,MAAM,MAAA,EAAQ;AAC5B,IAAA,KAAA,CAAM,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,QAAQ,CAAA;AAAA,EAClC;AACA,EAAA,IAAI,QAAA,IAAY,MAAM,MAAA,EAAQ;AAC5B,IAAA,KAAA,CAAM,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,QAAQ,CAAA;AAAA,EAClC;AAEA,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAEjC,EAAA,IAAI,WAAA;AAEJ,EAAA,KAAA,CAAM,cAAc,YAA2B;AAC7C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAO,WAAA;AAAA,IACT;AAEA,IAAA,WAAA,GAAc,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AACnD,MAAA,IAAI,OAAO,KAAA,CAAM,QAAA,KAAa,QAAA,EAAU;AACtC,QAAA,IAAI,MAAM,QAAA,EAAU;AAClB,UAAA,MAAA,CAAO,IAAIC,oBAAA,CAAc,KAAA,CAAM,QAAA,EAAU,WAAW,CAAC,CAAA;AAAA,QACvD,CAAA,MAAO;AACL,UAAA,OAAA,EAAQ;AAAA,QACV;AACA,QAAA;AAAA,MACF;AAEA,MAAA,SAAS,QAAQ,KAAA,EAAc;AAC7B,QAAA,OAAA,EAAQ;AACR,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,MACd;AAEA,MAAA,SAAS,OAAO,IAAA,EAAqB;AACnC,QAAA,OAAA,EAAQ;AACR,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,MAAA,CAAO,IAAIA,oBAAA,CAAc,IAAA,EAAM,WAAW,CAAC,CAAA;AAAA,QAC7C,CAAA,MAAO;AACL,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF;AAEA,MAAA,SAAS,QAAA,GAAW;AAClB,QAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,aAAa,IAAA,EAAM;AAC5C,UAAA,KAAA,CAAM,IAAA,EAAK;AAAA,QACb;AAAA,MACF;AAEA,MAAA,SAAS,OAAA,GAAU;AACjB,QAAA,KAAA,MAAW,MAAA,IAAU,CAAC,QAAA,EAAU,SAAS,CAAA,EAAY;AACnD,UAAA,OAAA,CAAQ,cAAA,CAAe,QAAQ,QAAQ,CAAA;AAAA,QACzC;AACA,QAAA,KAAA,CAAM,cAAA,CAAe,SAAS,OAAO,CAAA;AACrC,QAAA,KAAA,CAAM,cAAA,CAAe,QAAQ,MAAM,CAAA;AAAA,MACrC;AAEA,MAAA,KAAA,CAAM,IAAA,CAAK,SAAS,OAAO,CAAA;AAC3B,MAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,MAAM,CAAA;AAEzB,MAAA,KAAA,MAAW,MAAA,IAAU,CAAC,QAAA,EAAU,SAAS,CAAA,EAAY;AACnD,QAAA,OAAA,CAAQ,WAAA,CAAY,QAAQ,QAAQ,CAAA;AAAA,MACtC;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,WAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO,KAAA;AACT;AAWA,eAAsB,SAAA,CACpB,MACA,OAAA,EACiB;AACjB,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,MAAM,eAAyB,EAAC;AAEhC,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,EAC5D;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,IAAI,IAAA,EAAM;AAAA,MACd,GAAG,OAAA;AAAA,MACH,UAAU,CAAA,IAAA,KAAQ;AAChB,QAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AACtB,QAAA,OAAA,EAAS,WAAW,IAAI,CAAA;AAAA,MAC1B,CAAA;AAAA,MACA,UAAU,CAAA,IAAA,KAAQ;AAChB,QAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AACtB,QAAA,OAAA,EAAS,WAAW,IAAI,CAAA;AAAA,MAC1B;AAAA,KACD,EAAE,WAAA,EAAY;AAEf,IAAA,OAAO,OAAO,MAAA,CAAO,YAAY,CAAA,CAAE,QAAA,GAAW,IAAA,EAAK;AAAA,EACrD,SAAS,KAAA,EAAO;AACd,IAAAC,oBAAA,CAAY,KAAK,CAAA;AAEjB,IAAC,MAAsC,MAAA,GACrC,MAAA,CAAO,MAAA,CAAO,YAAY,EAAE,QAAA,EAAS;AACvC,IAAC,MAAsC,MAAA,GACrC,MAAA,CAAO,MAAA,CAAO,YAAY,EAAE,QAAA,EAAS;AAEvC,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAOA,eAAsB,SAAS,IAAA,EAAkC;AAC/D,EAAA,IAAI;AACF,IAAA,MAAM,IAAI,IAAA,EAAM,EAAE,OAAO,QAAA,EAAU,EAAE,WAAA,EAAY;AACjD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;;;;"}
{
"name": "@backstage/cli-common",
"version": "0.2.0-next.1",
"version": "0.2.0-next.2",
"description": "Common functionality used by cli, backend, and create-app",

@@ -65,3 +65,3 @@ "backstage": {

"devDependencies": {
"@backstage/cli": "0.36.0-next.1",
"@backstage/cli": "0.36.0-next.2",
"@types/cross-spawn": "^6.0.2",

@@ -68,0 +68,0 @@ "@types/node": "^22.13.14"