const options: babel.TransformOptions = { ast: true, sourceMaps: true }; babel.transform("code();", options, (err, result) => { const { code, map, ast } = result!; }); const transformSyncResult = babel.transformSync("code();", options); if (transformSyncResult) { const { code, map, ast } = transformSyncResult; } babel.transformFile("filename.js", options, (err, result) => { const { code, map, ast } = result!; }); babel.transformFileSync("filename.js", options)!.code; const sourceCode = "if (true) return;"; const parsedAst = babel.parse(sourceCode, options); babel.transformFromAst(parsedAst!, sourceCode, options, (err, result) => { const { code, map, ast } = result!; }); const transformFromAstSyncResult = babel.transformFromAstSync(parsedAst!, sourceCode, options); const { code, map, ast } = transformFromAstSyncResult!;
export async function buildBackend(modulePath: string) { let babelConfig: babel.TransformOptions = { presets: [ [ '@babel/preset-env', { targets: { node: 'current' } } ], '@babel/preset-typescript', '@babel/preset-react' ], parserOpts: { allowReturnOutsideFunction: true }, plugins: ['@babel/plugin-proposal-class-properties', '@babel/plugin-proposal-function-bind'], sourceType: 'module', cwd: modulePath } const babelFile = path.join(modulePath, 'babel.backend.js') if (fs.existsSync(babelFile)) { debug('Babel override found for backend') babelConfig = require(babelFile)(babelConfig) } const files = glob.sync('src/**/*.+(ts|js|jsx|tsx)', { cwd: modulePath, ignore: ['**/*.d.ts', '**/views/**/*.*', '**/config.ts'] }) rimraf.sync(path.join(modulePath, 'dist')) // Allows to copy additional files to the dist directory of the module const extrasFile = path.join(modulePath, 'build.extras.js') if (fs.existsSync(extrasFile)) { const extras = require(extrasFile) if (extras && extras.copyFiles) { for (const instruction of extras.copyFiles) { const toCopy = glob.sync(instruction, { cwd: modulePath }) for (const file of toCopy) { const fromFull = path.join(modulePath, file) const dest = file.replace(/^src\//i, 'dist/').replace(/\.ts$/i, '.js') const destFull = path.join(modulePath, dest) mkdirp.sync(path.dirname(destFull)) fse.copySync(fromFull, destFull) debug(`Copied "${file}" -> "${dest}"`) } } } } const outputFiles = [] for (const file of files) { try { const dBefore = Date.now() const result = babel.transformFileSync(file, babelConfig) const dest = file.replace(/^src\//i, 'dist/').replace(/.ts$/i, '.js') mkdirp.sync(path.dirname(dest)) fs.writeFileSync(dest, result.code) const totalTime = Date.now() - dBefore debug(`Generated "${dest}" (${totalTime} ms)`) outputFiles.push(dest) } catch (err) { error(`Error transpiling file "${file}"`) // TODO Better error throw err } } }