nx/packages/nx-plugin/src/utils/testing-utils/create-package-cli.ts

73 lines
2.4 KiB
TypeScript

import { workspaceRoot } from '@nx/devkit';
import { tmpFolder } from './paths';
import { fork } from 'child_process';
/**
* This function is used to run the create package CLI command.
* It builds the plugin library and the create package library and run the create package command with for the plugin library.
* It needs to be ran inside an Nx project. It would assume that an Nx project already exists.
* @param projectToBeCreated project name to be created using the cli
* @param pluginLibraryBuildPath e.g. dist/packages/my-plugin
* @param createPackageLibraryBuildPath e.g. dist/packages/create-my-plugin-package
* @param extraArguments extra arguments to be passed to the create package command
* @param verbose if true, NX_VERBOSE_LOGGING will be set to true
* @returns results for the create package command
*/
export function runCreatePackageCli(
projectToBeCreated: string,
{
pluginLibraryBuildPath,
createPackageLibraryBuildPath,
extraArguments,
verbose,
}: {
pluginLibraryBuildPath: string;
createPackageLibraryBuildPath: string;
extraArguments?: string[];
verbose?: boolean;
}
): Promise<string> {
return new Promise((resolve, reject) => {
const childProcess = fork(
`${workspaceRoot}/${createPackageLibraryBuildPath}/bin/index.js`,
[projectToBeCreated, ...(extraArguments || [])],
{
stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
env: {
...process.env,
[`NX_E2E_PRESET_VERSION`]: `file:${workspaceRoot}/${pluginLibraryBuildPath}`,
// only add NX_VERBOSE_LOGGING if verbose is true
...(verbose && { NX_VERBOSE_LOGGING: 'true' }),
},
cwd: tmpFolder(),
}
);
// Ensure the child process is killed when the parent exits
process.on('exit', () => childProcess.kill());
process.on('SIGTERM', () => childProcess.kill());
let allMessages = '';
childProcess.on('message', (message) => {
allMessages += message;
});
childProcess.stdout.on('data', (data) => {
allMessages += data;
});
childProcess.on('error', (error) => {
reject(error);
});
childProcess.on('exit', (code) => {
if (code === 0) {
resolve(allMessages);
} else {
reject(allMessages);
}
});
});
}
export function generatedPackagePath(projectToBeCreated: string) {
return `${tmpFolder()}/${projectToBeCreated}`;
}