@storm-stack/core
Version:
A build toolkit and runtime used by Storm Software in TypeScript applications
165 lines (163 loc) • 6.75 kB
JavaScript
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