UNPKG

@storm-stack/core

Version:

A build toolkit and runtime used by Storm Software in TypeScript applications

165 lines (163 loc) 6.75 kB
import { isDuplicatePlugin, getPluginName } from './chunk-O6TGR4ZK.js'; import { getString, getMagicString } from './chunk-K4ZS2URJ.js'; import { __name } from './chunk-43IZMM3W.js'; import { transformAsync } from '@babel/core'; import { LogLevelLabel } from '@storm-software/config-tools/types'; import { isParentPath } from '@stryke/path/is-parent-path'; import { joinPaths } from '@stryke/path/join-paths'; import { resolvePackage } from '@stryke/path/resolve'; import { isFunction } from '@stryke/type-checks/is-function'; import { isSetString } from '@stryke/type-checks/is-set-string'; import chalk from 'chalk'; import { defu } from 'defu'; async function transform(log, context, source, options = {}) { try { const corePath = process.env.STORM_STACK_LOCAL ? joinPaths(context.options.workspaceRoot, "packages/core") : await resolvePackage("@storm-stack/core"); if (!corePath) { throw new Error("Could not resolve @storm-stack/core package location."); } let sourceFile = source; if (process.env.STORM_STACK_LOCAL && isParentPath(sourceFile.id, corePath) || options.skipAllTransforms || getString(sourceFile.code).includes("/* @storm-ignore */") || getString(sourceFile.code).includes("/* @storm-disable */")) { return sourceFile; } const babelOptions = { ...context.options.babel, ...options.babel }; if (!babelOptions || !babelOptions.plugins && !babelOptions.presets || Array.isArray(babelOptions.plugins) && babelOptions.plugins.length === 0 && Array.isArray(babelOptions.presets) && babelOptions.presets.length === 0) { log(LogLevelLabel.WARN, `No Babel plugins or presets configured for ${sourceFile.id}. Skipping Babel transformation.`); return sourceFile; } const plugins = babelOptions.plugins.reduce((ret, plugin) => { if (!isDuplicatePlugin(ret, plugin)) { if (Array.isArray(plugin) && plugin.length > 0 && plugin[0]) { if (plugin.length > 2 && plugin[2] && isFunction(plugin[2].filter) && // eslint-disable-next-line ts/no-unsafe-call !plugin[2].filter(sourceFile)) { log(LogLevelLabel.DEBUG, `Skipping filtered Babel plugin ${chalk.bold.cyanBright(getPluginName(plugin) || "unnamed")} for ${sourceFile.id}`); return ret; } ret.push([ isFunction(plugin[0]) ? plugin[0](context) : plugin[0], { ...plugin.length > 1 && plugin[1] ? plugin[1] : {}, options }, plugin.length > 2 ? plugin[2] : void 0 ]); } else { ret.push([ isFunction(plugin) ? plugin(context) : plugin, { options }, void 0 ]); } } else { log(LogLevelLabel.INFO, `Skipping duplicate Babel plugin ${getPluginName(plugin)} for ${sourceFile.id}`); } return ret; }, []); const presets = babelOptions.presets.reduce((ret, preset) => { if (!isDuplicatePlugin(ret, preset)) { if (Array.isArray(preset) && preset.length > 0 && preset[0]) { if (preset.length > 2 && preset[2] && isFunction(preset[2].filter) && // eslint-disable-next-line ts/no-unsafe-call !preset[2].filter(sourceFile)) { log(LogLevelLabel.INFO, `Skipping filtered Babel preset ${getPluginName(preset)} for ${sourceFile.id}`); return ret; } ret.push([ isFunction(preset[0]) ? preset[0](context) : preset[0], { ...preset.length > 1 && preset[1] ? preset[1] : {}, options }, preset.length > 2 ? preset[2] : void 0 ]); } else { ret.push([ isFunction(preset) ? preset(context) : preset, { options }, void 0 ]); } } else { log(LogLevelLabel.INFO, `Skipping duplicate Babel preset ${getPluginName(preset)} for ${sourceFile.id}`); } return ret; }, []); for (const plugin of plugins.filter((plugin2) => isFunction(plugin2[2]?.onPreTransform))) { sourceFile = await Promise.resolve(plugin[2].onPreTransform(context, sourceFile)); } for (const preset of presets.filter((preset2) => isFunction(preset2[2]?.onPreTransform))) { sourceFile = await Promise.resolve(preset[2].onPreTransform(context, sourceFile)); } log(LogLevelLabel.TRACE, `Transforming ${sourceFile.id} with Babel`); const result = await transformAsync(getString(sourceFile.code), defu({ filename: sourceFile.id, plugins: [ "@babel/plugin-syntax-typescript", ...plugins.map((plugin) => { return [ plugin[0], defu(plugin.length > 1 && plugin[1] ? plugin[1] : {}, { options }), plugin[0]?.name ]; }) ], presets: presets.map((preset) => { return [ preset[0], defu(preset.length > 1 && preset[1] ? preset[1] : {}, { options }), preset[0]?.name ]; }) }, babelOptions ? { ...babelOptions, plugins: [], presets: [] } : {}, { highlightCode: true, code: true, ast: false, cloneInputAst: false, comments: true, sourceType: "module", configFile: false, babelrc: false, envName: context.options.mode, caller: { name: "storm-stack" } })); if (!result?.code) { throw new Error(`BabelPluginStormStack failed to compile ${sourceFile.id}`); } log(LogLevelLabel.TRACE, `Completed Babel transformations of ${sourceFile.id}`); sourceFile.code = getMagicString(result.code); for (const plugin of plugins.filter((plugin2) => isFunction(plugin2[2]?.onPostTransform))) { sourceFile = await Promise.resolve(plugin[2].onPostTransform(context, sourceFile)); } for (const preset of presets.filter((preset2) => isFunction(preset2[2]?.onPostTransform))) { sourceFile = await Promise.resolve(preset[2].onPostTransform(context, sourceFile)); } return sourceFile; } catch (error) { context.log(LogLevelLabel.ERROR, `Error during Babel transformation: ${error?.message ? isSetString(error.message) ? error.message.length > 5e3 ? `${error.message.slice(0, 5e3)}... ${error.message.slice(-100)}` : error.message : error.message : "Unknown error"} ${error?.stack ? ` Stack trace: ${error.stack} ` : ""}`); throw new Error(`Babel transformation failed for ${source.id}`); } } __name(transform, "transform"); export { transform }; //# sourceMappingURL=chunk-DNI4FJXL.js.map //# sourceMappingURL=chunk-DNI4FJXL.js.map