dts-cli
Version:
Zero-config TypeScript package development
118 lines (117 loc) • 5.14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.babelPluginDts = exports.createConfigItems = exports.mergeConfigItems = exports.isTruthy = void 0;
const tslib_1 = require("tslib");
const core_1 = require("@babel/core");
const plugin_babel_1 = require("@rollup/plugin-babel");
const lodash_merge_1 = tslib_1.__importDefault(require("lodash.merge"));
const utils_1 = require("./utils");
const isTruthy = (obj) => {
if (!obj) {
return false;
}
return obj.constructor !== Object || Object.keys(obj).length > 0;
};
exports.isTruthy = isTruthy;
// replace lodash with lodash-es, but not lodash/fp
const replacements = [{ original: 'lodash(?!/fp)', replacement: 'lodash-es' }];
const mergeConfigItems = (type, ...configItemsToMerge) => {
const mergedItems = [];
configItemsToMerge.forEach((configItemToMerge) => {
configItemToMerge.forEach((item) => {
const itemToMergeWithIndex = mergedItems.findIndex((mergedItem) => mergedItem.file.resolved === item.file.resolved);
if (itemToMergeWithIndex === -1) {
mergedItems.push(item);
return;
}
mergedItems[itemToMergeWithIndex] = (0, core_1.createConfigItem)([
mergedItems[itemToMergeWithIndex].file.resolved,
(0, lodash_merge_1.default)(mergedItems[itemToMergeWithIndex].options, item.options),
], {
type,
});
});
});
return mergedItems;
};
exports.mergeConfigItems = mergeConfigItems;
const createConfigItems = (type, items) => {
return items.map((_a) => {
var { name } = _a, options = tslib_1.__rest(_a, ["name"]);
return (0, core_1.createConfigItem)([require.resolve(name), options], { type });
});
};
exports.createConfigItems = createConfigItems;
exports.babelPluginDts = (0, plugin_babel_1.createBabelInputPluginFactory)(() => ({
// Passed the plugin options.
options(_a) {
var { custom: customOptions } = _a, pluginOptions = tslib_1.__rest(_a, ["custom"]);
return {
// Pull out any custom options that the plugin might have.
customOptions,
// Pass the options back with the two custom options removed.
pluginOptions,
};
},
config(config, { customOptions }) {
const defaultPlugins = (0, exports.createConfigItems)('plugin', [
// {
// name: '@babel/plugin-transform-react-jsx',
// pragma: customOptions.jsx || 'h',
// pragmaFrag: customOptions.jsxFragment || 'Fragment',
// },
{ name: (0, utils_1.resolve)('babel-plugin-macros') },
{ name: (0, utils_1.resolve)('babel-plugin-annotate-pure-calls') },
{ name: (0, utils_1.resolve)('babel-plugin-dev-expression') },
customOptions.format !== 'cjs' && {
name: (0, utils_1.resolve)('babel-plugin-transform-rename-import'),
replacements,
},
{
name: (0, utils_1.resolve)('babel-plugin-polyfill-regenerator'),
// don't pollute global env as this is being used in a library
method: 'usage-pure',
},
{
name: (0, utils_1.resolve)('@babel/plugin-proposal-class-properties'),
loose: true,
},
(0, exports.isTruthy)(customOptions.extractErrors) && {
name: './errors/transformErrorMessages',
},
].filter(Boolean));
const babelOptions = config.options || {};
babelOptions.presets = babelOptions.presets || [];
const presetEnvIdx = babelOptions.presets.findIndex((preset) => preset.file.request.includes('@babel/preset-env'));
// if they use preset-env, merge their options with ours
if (presetEnvIdx !== -1) {
const presetEnv = babelOptions.presets[presetEnvIdx];
babelOptions.presets[presetEnvIdx] = (0, core_1.createConfigItem)([
presetEnv.file.resolved,
(0, lodash_merge_1.default)({
loose: true,
targets: customOptions.targets,
}, presetEnv.options, {
modules: false,
}),
], {
type: `preset`,
});
}
else {
// if no preset-env, add it & merge with their presets
const defaultPresets = (0, exports.createConfigItems)('preset', [
{
name: (0, utils_1.resolve)('@babel/preset-env'),
targets: customOptions.targets,
modules: false,
loose: true,
},
]);
babelOptions.presets = (0, exports.mergeConfigItems)('preset', defaultPresets, babelOptions.presets);
}
// Merge babelrc & our plugins together
babelOptions.plugins = (0, exports.mergeConfigItems)('plugin', defaultPlugins, babelOptions.plugins || []);
return babelOptions;
},
}));