From ef78a4a6d157d84bf8aa2961613a7cd62a22c68f Mon Sep 17 00:00:00 2001 From: dxvladislavvolkov Date: Mon, 11 May 2026 17:31:42 +0400 Subject: [PATCH 1/9] Remove the usage of exec for variable cases --- .../utils/create-bundles/Angular/bundler.ts | 5 ++--- apps/demos/utils/ts-to-js-converter/converter.ts | 16 ++++++++++------ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/apps/demos/utils/create-bundles/Angular/bundler.ts b/apps/demos/utils/create-bundles/Angular/bundler.ts index ca2d8dbe953e..61d0ea7eab88 100644 --- a/apps/demos/utils/create-bundles/Angular/bundler.ts +++ b/apps/demos/utils/create-bundles/Angular/bundler.ts @@ -1,4 +1,4 @@ -import { exec } from 'child_process'; +import { spawn } from 'child_process'; import { BuildOptions } from 'esbuild'; import { existsSync, mkdirSync, removeSync } from 'fs-extra'; import { Demo, Framework } from '../helper/types'; @@ -42,8 +42,7 @@ export default class AngularBundler implements Bundler { createDemoLayout(demo, this.framework); - const ngBuildCommand = `npm run build-angular -- ${getProjectNameByDemo(demo)}`; - const ngBuildProcess = exec(ngBuildCommand); + const ngBuildProcess = spawn('npm', ['run', 'build-angular', '--', getProjectNameByDemo(demo)]); ngBuildProcess.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); diff --git a/apps/demos/utils/ts-to-js-converter/converter.ts b/apps/demos/utils/ts-to-js-converter/converter.ts index b56d1bf6ff4a..709276abeba3 100644 --- a/apps/demos/utils/ts-to-js-converter/converter.ts +++ b/apps/demos/utils/ts-to-js-converter/converter.ts @@ -78,12 +78,16 @@ const pipeSource = async ( })); }; -// eslint-disable-next-line require-await -const execTsc = async (directory: string, args: string): Promise => new Promise((resolve, reject) => { - cps.exec(`tsc ${args}`, (error, stdout, stderr) => { - if (error != null) { +const execTsc = async (directory: string, args: string[]): Promise => new Promise((resolve, reject) => { + const proc = cps.spawn('tsc', args); + let stdout = ''; + let stderr = ''; + proc.stdout.on('data', (data: Buffer) => { stdout += data.toString(); }); + proc.stderr.on('data', (data: Buffer) => { stderr += data.toString(); }); + proc.on('close', (code: number) => { + if (code !== 0) { // eslint-disable-next-line prefer-promise-reject-errors - return reject(`${error}\n${stderr}\n${stdout}`); + return reject(`Exit code ${code}\n${stderr}\n${stdout}`); } return resolve(stdout); }); @@ -110,7 +114,7 @@ const compile = async (resolve: PathResolvers, log: Logger) => { ), ); - await execTsc(resolve.source('./'), `--build ${tsconfigFile}`); + await execTsc(resolve.source('./'), ['--build', tsconfigFile]); }; const copyAssets = async (resolve: PathResolvers, log: Logger) => { From e7ace915dd981e5038d15fbb5258964eaca8e7ea Mon Sep 17 00:00:00 2001 From: dxvladislavvolkov Date: Tue, 12 May 2026 12:06:29 +0400 Subject: [PATCH 2/9] Refactoring --- apps/demos/utils/ts-to-js-converter/converter.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/apps/demos/utils/ts-to-js-converter/converter.ts b/apps/demos/utils/ts-to-js-converter/converter.ts index 709276abeba3..6c2ae7974f98 100644 --- a/apps/demos/utils/ts-to-js-converter/converter.ts +++ b/apps/demos/utils/ts-to-js-converter/converter.ts @@ -79,15 +79,23 @@ const pipeSource = async ( }; const execTsc = async (directory: string, args: string[]): Promise => new Promise((resolve, reject) => { - const proc = cps.spawn('tsc', args); + const proc = cps.spawn('tsc', args, { cwd: directory }); let stdout = ''; let stderr = ''; proc.stdout.on('data', (data: Buffer) => { stdout += data.toString(); }); proc.stderr.on('data', (data: Buffer) => { stderr += data.toString(); }); - proc.on('close', (code: number) => { + proc.on('error', (err: Error) => { + // eslint-disable-next-line prefer-promise-reject-errors + reject(`tsc failed to spawn: ${err.message}`); + }); + proc.on('close', (code: number | null, signal: NodeJS.Signals | null) => { + if (signal !== null) { + // eslint-disable-next-line prefer-promise-reject-errors + return reject(`tsc killed by signal ${signal}\n${stderr}\n${stdout}`); + } if (code !== 0) { // eslint-disable-next-line prefer-promise-reject-errors - return reject(`Exit code ${code}\n${stderr}\n${stdout}`); + return reject(`tsc exited with code ${code}\n${stderr}\n${stdout}`); } return resolve(stdout); }); From 6b3d9a7bb9e0e96d52e51ccf2bd286efcbeb005f Mon Sep 17 00:00:00 2001 From: dxvladislavvolkov Date: Tue, 12 May 2026 15:48:07 +0400 Subject: [PATCH 3/9] Fix for Windows --- apps/demos/utils/ts-to-js-converter/converter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/demos/utils/ts-to-js-converter/converter.ts b/apps/demos/utils/ts-to-js-converter/converter.ts index 6c2ae7974f98..2e171ed0b697 100644 --- a/apps/demos/utils/ts-to-js-converter/converter.ts +++ b/apps/demos/utils/ts-to-js-converter/converter.ts @@ -79,7 +79,7 @@ const pipeSource = async ( }; const execTsc = async (directory: string, args: string[]): Promise => new Promise((resolve, reject) => { - const proc = cps.spawn('tsc', args, { cwd: directory }); + const proc = cps.spawn('tsc', args, { cwd: directory, shell: isWindows() }); let stdout = ''; let stderr = ''; proc.stdout.on('data', (data: Buffer) => { stdout += data.toString(); }); From 2329b25a7f96d2e16bf49a29a83a4cf92bc4d64a Mon Sep 17 00:00:00 2001 From: dxvladislavvolkov Date: Tue, 12 May 2026 17:13:03 +0400 Subject: [PATCH 4/9] Fix bundler for windows --- apps/demos/utils/create-bundles/Angular/bundler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/demos/utils/create-bundles/Angular/bundler.ts b/apps/demos/utils/create-bundles/Angular/bundler.ts index 61d0ea7eab88..ba567e31d289 100644 --- a/apps/demos/utils/create-bundles/Angular/bundler.ts +++ b/apps/demos/utils/create-bundles/Angular/bundler.ts @@ -42,7 +42,7 @@ export default class AngularBundler implements Bundler { createDemoLayout(demo, this.framework); - const ngBuildProcess = spawn('npm', ['run', 'build-angular', '--', getProjectNameByDemo(demo)]); + const ngBuildProcess = spawn('npm', ['run', 'build-angular', '--', getProjectNameByDemo(demo)], { shell: process.platform === 'win32' }); ngBuildProcess.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); From 4184da5f0d5a4fb5097cc9cef35e1743d4f32ba4 Mon Sep 17 00:00:00 2001 From: dxvladislavvolkov Date: Tue, 12 May 2026 17:20:42 +0400 Subject: [PATCH 5/9] Change fix for windows (do not use shell) --- apps/demos/utils/create-bundles/Angular/bundler.ts | 3 ++- apps/demos/utils/ts-to-js-converter/converter.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/demos/utils/create-bundles/Angular/bundler.ts b/apps/demos/utils/create-bundles/Angular/bundler.ts index ba567e31d289..d005c14218e0 100644 --- a/apps/demos/utils/create-bundles/Angular/bundler.ts +++ b/apps/demos/utils/create-bundles/Angular/bundler.ts @@ -42,7 +42,8 @@ export default class AngularBundler implements Bundler { createDemoLayout(demo, this.framework); - const ngBuildProcess = spawn('npm', ['run', 'build-angular', '--', getProjectNameByDemo(demo)], { shell: process.platform === 'win32' }); + const npmExecutable = process.platform === 'win32' ? 'npm.cmd' : 'npm'; + const ngBuildProcess = spawn(npmExecutable, ['run', 'build-angular', '--', getProjectNameByDemo(demo)], { shell: false }); ngBuildProcess.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); diff --git a/apps/demos/utils/ts-to-js-converter/converter.ts b/apps/demos/utils/ts-to-js-converter/converter.ts index 2e171ed0b697..5d1f9d36f2f6 100644 --- a/apps/demos/utils/ts-to-js-converter/converter.ts +++ b/apps/demos/utils/ts-to-js-converter/converter.ts @@ -79,7 +79,8 @@ const pipeSource = async ( }; const execTsc = async (directory: string, args: string[]): Promise => new Promise((resolve, reject) => { - const proc = cps.spawn('tsc', args, { cwd: directory, shell: isWindows() }); + const tscExecutable = isWindows() ? 'tsc.cmd' : 'tsc'; + const proc = cps.spawn(tscExecutable, args, { cwd: directory, shell: false }); let stdout = ''; let stderr = ''; proc.stdout.on('data', (data: Buffer) => { stdout += data.toString(); }); From 2d4e7c609a10127e66abb7a72f190ece526e7217 Mon Sep 17 00:00:00 2001 From: dxvladislavvolkov Date: Tue, 12 May 2026 17:25:11 +0400 Subject: [PATCH 6/9] Revert "Change fix for windows (do not use shell)" This reverts commit 4184da5f0d5a4fb5097cc9cef35e1743d4f32ba4. --- apps/demos/utils/create-bundles/Angular/bundler.ts | 3 +-- apps/demos/utils/ts-to-js-converter/converter.ts | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/demos/utils/create-bundles/Angular/bundler.ts b/apps/demos/utils/create-bundles/Angular/bundler.ts index d005c14218e0..ba567e31d289 100644 --- a/apps/demos/utils/create-bundles/Angular/bundler.ts +++ b/apps/demos/utils/create-bundles/Angular/bundler.ts @@ -42,8 +42,7 @@ export default class AngularBundler implements Bundler { createDemoLayout(demo, this.framework); - const npmExecutable = process.platform === 'win32' ? 'npm.cmd' : 'npm'; - const ngBuildProcess = spawn(npmExecutable, ['run', 'build-angular', '--', getProjectNameByDemo(demo)], { shell: false }); + const ngBuildProcess = spawn('npm', ['run', 'build-angular', '--', getProjectNameByDemo(demo)], { shell: process.platform === 'win32' }); ngBuildProcess.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); diff --git a/apps/demos/utils/ts-to-js-converter/converter.ts b/apps/demos/utils/ts-to-js-converter/converter.ts index 5d1f9d36f2f6..2e171ed0b697 100644 --- a/apps/demos/utils/ts-to-js-converter/converter.ts +++ b/apps/demos/utils/ts-to-js-converter/converter.ts @@ -79,8 +79,7 @@ const pipeSource = async ( }; const execTsc = async (directory: string, args: string[]): Promise => new Promise((resolve, reject) => { - const tscExecutable = isWindows() ? 'tsc.cmd' : 'tsc'; - const proc = cps.spawn(tscExecutable, args, { cwd: directory, shell: false }); + const proc = cps.spawn('tsc', args, { cwd: directory, shell: isWindows() }); let stdout = ''; let stderr = ''; proc.stdout.on('data', (data: Buffer) => { stdout += data.toString(); }); From af7ce00dd73c9d72c2337817903f74e5ec7987e7 Mon Sep 17 00:00:00 2001 From: dxvladislavvolkov Date: Tue, 12 May 2026 19:04:33 +0400 Subject: [PATCH 7/9] Fix lint --- apps/demos/utils/ts-to-js-converter/converter.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/demos/utils/ts-to-js-converter/converter.ts b/apps/demos/utils/ts-to-js-converter/converter.ts index 2e171ed0b697..dc4564bf4f11 100644 --- a/apps/demos/utils/ts-to-js-converter/converter.ts +++ b/apps/demos/utils/ts-to-js-converter/converter.ts @@ -78,7 +78,7 @@ const pipeSource = async ( })); }; -const execTsc = async (directory: string, args: string[]): Promise => new Promise((resolve, reject) => { +const execTsc = (directory: string, args: string[]): Promise => new Promise((resolve, reject) => { const proc = cps.spawn('tsc', args, { cwd: directory, shell: isWindows() }); let stdout = ''; let stderr = ''; @@ -88,7 +88,7 @@ const execTsc = async (directory: string, args: string[]): Promise => ne // eslint-disable-next-line prefer-promise-reject-errors reject(`tsc failed to spawn: ${err.message}`); }); - proc.on('close', (code: number | null, signal: NodeJS.Signals | null) => { + proc.on('close', (code: number | null, signal: string | null) => { if (signal !== null) { // eslint-disable-next-line prefer-promise-reject-errors return reject(`tsc killed by signal ${signal}\n${stderr}\n${stdout}`); From 3166c07f96f342f0fc43269a3c1e2b12cc57b6db Mon Sep 17 00:00:00 2001 From: dxvladislavvolkov Date: Wed, 13 May 2026 14:59:54 +0400 Subject: [PATCH 8/9] Set shell value to true --- apps/demos/utils/create-bundles/Angular/bundler.ts | 2 +- apps/demos/utils/ts-to-js-converter/converter.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/demos/utils/create-bundles/Angular/bundler.ts b/apps/demos/utils/create-bundles/Angular/bundler.ts index ba567e31d289..9c36af7a15ec 100644 --- a/apps/demos/utils/create-bundles/Angular/bundler.ts +++ b/apps/demos/utils/create-bundles/Angular/bundler.ts @@ -42,7 +42,7 @@ export default class AngularBundler implements Bundler { createDemoLayout(demo, this.framework); - const ngBuildProcess = spawn('npm', ['run', 'build-angular', '--', getProjectNameByDemo(demo)], { shell: process.platform === 'win32' }); + const ngBuildProcess = spawn('npm', ['run', 'build-angular', '--', getProjectNameByDemo(demo)], { shell: true }); ngBuildProcess.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); diff --git a/apps/demos/utils/ts-to-js-converter/converter.ts b/apps/demos/utils/ts-to-js-converter/converter.ts index dc4564bf4f11..5894ca04923c 100644 --- a/apps/demos/utils/ts-to-js-converter/converter.ts +++ b/apps/demos/utils/ts-to-js-converter/converter.ts @@ -79,7 +79,7 @@ const pipeSource = async ( }; const execTsc = (directory: string, args: string[]): Promise => new Promise((resolve, reject) => { - const proc = cps.spawn('tsc', args, { cwd: directory, shell: isWindows() }); + const proc = cps.spawn('tsc', args, { cwd: directory, shell: true }); let stdout = ''; let stderr = ''; proc.stdout.on('data', (data: Buffer) => { stdout += data.toString(); }); From 5dbbd7a77abc956c2ad186f22919013155197b47 Mon Sep 17 00:00:00 2001 From: dxvladislavvolkov Date: Thu, 14 May 2026 13:50:41 +0400 Subject: [PATCH 9/9] Use execFile instead of spawn to optimize process --- .../utils/ts-to-js-converter/converter.ts | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/apps/demos/utils/ts-to-js-converter/converter.ts b/apps/demos/utils/ts-to-js-converter/converter.ts index 5894ca04923c..cc55cd62862e 100644 --- a/apps/demos/utils/ts-to-js-converter/converter.ts +++ b/apps/demos/utils/ts-to-js-converter/converter.ts @@ -79,23 +79,10 @@ const pipeSource = async ( }; const execTsc = (directory: string, args: string[]): Promise => new Promise((resolve, reject) => { - const proc = cps.spawn('tsc', args, { cwd: directory, shell: true }); - let stdout = ''; - let stderr = ''; - proc.stdout.on('data', (data: Buffer) => { stdout += data.toString(); }); - proc.stderr.on('data', (data: Buffer) => { stderr += data.toString(); }); - proc.on('error', (err: Error) => { - // eslint-disable-next-line prefer-promise-reject-errors - reject(`tsc failed to spawn: ${err.message}`); - }); - proc.on('close', (code: number | null, signal: string | null) => { - if (signal !== null) { - // eslint-disable-next-line prefer-promise-reject-errors - return reject(`tsc killed by signal ${signal}\n${stderr}\n${stdout}`); - } - if (code !== 0) { + cps.execFile('tsc', args, { shell: true, cwd: directory }, (error, stdout, stderr) => { + if (error != null) { // eslint-disable-next-line prefer-promise-reject-errors - return reject(`tsc exited with code ${code}\n${stderr}\n${stdout}`); + return reject(`${error}\n${stderr}\n${stdout}`); } return resolve(stdout); });