fix(core): prevent breaking error when registering transpiler (#16929)

This commit is contained in:
passbyval 2023-05-12 11:22:59 -07:00 committed by GitHub
parent f00c0295e4
commit 8460c63bd6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -21,9 +21,9 @@ export const registerTsProject = (
configFilename = 'tsconfig.json'
): (() => void) => {
const tsConfigPath = join(path, configFilename);
const compilerOptions: CompilerOptions = readCompilerOptions(tsConfigPath);
const cleanupFunctions = [
const cleanupFunctions: ((...args: unknown[]) => unknown)[] = [
registerTsConfigPaths(tsConfigPath),
registerTranspiler(compilerOptions),
];
@ -35,6 +35,53 @@ export const registerTsProject = (
};
};
export function getSwcTranspiler(
compilerOptions: CompilerOptions
): (...args: unknown[]) => unknown {
type ISwcRegister = typeof import('@swc-node/register/register')['register'];
// These are requires to prevent it from registering when it shouldn't
const register = require('@swc-node/register/register')
.register as ISwcRegister;
const cleanupFn = register(compilerOptions);
return typeof cleanupFn === 'function' ? cleanupFn : () => {};
}
export function getTsNodeTranspiler(
compilerOptions: CompilerOptions
): (...args: unknown[]) => unknown {
const { register } = require('ts-node') as typeof import('ts-node');
// ts-node doesn't provide a cleanup method
const service = register({
transpileOnly: true,
compilerOptions: getTsNodeCompilerOptions(compilerOptions),
});
const { transpiler, swc } = service.options;
// Don't warn if a faster transpiler is enabled
if (!transpiler && !swc) {
warnTsNodeUsage();
}
return () => {};
}
export function getTranspiler(compilerOptions: CompilerOptions) {
const preferTsNode = process.env.NX_PREFER_TS_NODE === 'true';
if (swcNodeInstalled && !preferTsNode) {
return () => getSwcTranspiler(compilerOptions);
}
// We can fall back on ts-node if it's available
if (tsNodeInstalled) {
return () => getTsNodeTranspiler(compilerOptions);
}
}
/**
* Register ts-node or swc-node given a set of compiler options.
*
@ -47,42 +94,14 @@ export function registerTranspiler(
compilerOptions: CompilerOptions
): () => void {
// Function to register transpiler that returns cleanup function
let registerTranspiler: () => () => void;
const transpiler = getTranspiler(compilerOptions);
const preferTsNode = process.env.NX_PREFER_TS_NODE === 'true';
if (swcNodeInstalled && !preferTsNode) {
// These are requires to prevent it from registering when it shouldn't
const { register } =
require('@swc-node/register/register') as typeof import('@swc-node/register/register');
registerTranspiler = () => register(compilerOptions);
} else {
// We can fall back on ts-node if it's available
if (tsNodeInstalled) {
const { register } = require('ts-node') as typeof import('ts-node');
// ts-node doesn't provide a cleanup method
registerTranspiler = () => {
const service = register({
transpileOnly: true,
compilerOptions: getTsNodeCompilerOptions(compilerOptions),
});
// Don't warn if a faster transpiler is enabled
if (!service.options.transpiler && !service.options.swc) {
warnTsNodeUsage();
}
return () => {};
};
}
}
if (registerTranspiler) {
return registerTranspiler();
} else {
if (!transpiler) {
warnNoTranspiler();
return () => {};
}
return transpiler();
}
/**