next
Version:
The React Framework
63 lines (62 loc) • 2.07 kB
JavaScript
import { join } from 'node:path';
import { readFile } from 'node:fs/promises';
import { deregisterHook, registerHook, requireFromString } from './require-hook';
import { parseJsonFile } from '../load-jsconfig';
function resolveSWCOptions(cwd, compilerOptions) {
const resolvedBaseUrl = join(cwd, compilerOptions.baseUrl ?? '.');
return {
jsc: {
target: 'es5',
parser: {
syntax: 'typescript'
},
paths: compilerOptions.paths,
baseUrl: resolvedBaseUrl
},
module: {
type: 'commonjs'
},
isModule: 'unknown'
};
}
async function lazilyGetTSConfig(cwd) {
let tsConfig;
try {
tsConfig = parseJsonFile(join(cwd, 'tsconfig.json'));
} catch (error) {
// ignore if tsconfig.json does not exist
if (error.code !== 'ENOENT') {
throw error;
}
tsConfig = {
compilerOptions: {}
};
}
return tsConfig;
}
export async function transpileConfig({ nextConfigPath, cwd }) {
let hasRequire = false;
try {
const { compilerOptions } = await lazilyGetTSConfig(cwd);
const swcOptions = resolveSWCOptions(cwd, compilerOptions);
const nextConfigString = await readFile(nextConfigPath, 'utf8');
// lazy require swc since it loads React before even setting NODE_ENV
// resulting loading Development React on Production
const { transform } = require('../swc');
const { code } = await transform(nextConfigString, swcOptions);
// register require hook only if require exists
if (code.includes('require(')) {
registerHook(swcOptions);
hasRequire = true;
}
// filename & extension don't matter here
return requireFromString(code, join(cwd, 'next.config.compiled.js'));
} catch (error) {
throw error;
} finally{
if (hasRequire) {
deregisterHook();
}
}
}
//# sourceMappingURL=transpile-config.js.map