t-comm
Version:
专业、稳定、纯粹的工具库
163 lines (160 loc) • 5.2 kB
JavaScript
import { _ as __assign, a as __spreadArray } from '../tslib.es6-096fffdd.js';
import { I as IImportType } from '../types-f29b26c8.js';
/**
* 替换引用
*
* @param {string} content 输入内容
* @param {Array<IParsedConfigItem>} parsedConfigList 替换配置
* @param {string} keyword 提前返回关键词
* @returns {string} 处理后的内容
*
* @example
* ```ts
* replaceDependencies('', [], '@tx/pmd-vue')
* ```
*/
function replaceDependencies(content, parsedConfigList, keyword) {
var parser = require('@babel/parser');
var traverse = require('@babel/traverse')["default"];
var generator = require('@babel/generator');
var replaced = false;
var ast = parser.parse(content, {
// 不加这个配置,报错:SyntaxError: 'import' and 'export' may appear only with 'sourceType: "module"'
sourceType: 'module',
plugins: ['typescript']
});
traverse(ast, {
ImportDeclaration: function ImportDeclaration(path) {
var sourceValue = path.node.source.value;
var importedList = path.node.specifiers.map(function (item) {
var _a;
var type = item.type;
return {
type: type,
local: item.local.name,
imported: ((_a = item.imported) === null || _a === void 0 ? void 0 : _a.name) || ''
};
});
if (sourceValue.includes(keyword)) return;
var target = getTarget(sourceValue, importedList, parsedConfigList);
target.forEach(function (item) {
path.insertAfter(item);
});
if (target.length) {
path.remove();
replaced = true;
}
}
});
var output = generator["default"](ast, {});
if (replaced) {
return output.code;
}
return content;
}
function localFlatten(list) {
return list.reduce(function (acc, current) {
var target = current.target;
if (acc[target]) {
acc[target].push(current);
} else {
acc[target] = [current];
}
return acc;
}, {});
}
function getTarget(originSource, originImportedList, parsedConfigList) {
if (!originImportedList.length) {
var foundItem = parsedConfigList.find(function (item) {
return item.source === originSource;
});
if (!(foundItem === null || foundItem === void 0 ? void 0 : foundItem.target)) {
return [];
}
return [genNewImport(foundItem === null || foundItem === void 0 ? void 0 : foundItem.target, [])];
}
var parsedImportList = originImportedList.map(function (curOrigin) {
var current = parsedConfigList.find(function (item) {
var source = item.source,
sourceType = item.sourceType,
sourceName = item.sourceName;
if (originSource !== source || curOrigin.type !== sourceType) {
return false;
}
if (sourceType === IImportType.ImportSpecifier) {
return curOrigin.imported === sourceName;
}
// ImportDefaultSpecifier 和 ImportNamespaceSpecifier 直接返回 true
return true;
});
if (!current) {
return __assign(__assign({}, curOrigin), {
_type: 'OLD',
target: originSource,
targetName: curOrigin.imported,
targetType: curOrigin.type
});
}
return __assign(__assign(__assign({}, current), curOrigin), {
_type: 'NEW'
});
});
var newImportList = parsedImportList.filter(function (item) {
return item._type === 'NEW';
});
var oldImportList = parsedImportList.filter(function (item) {
return item._type === 'OLD';
});
var obj = localFlatten(newImportList);
var oldObj = localFlatten(oldImportList);
// newImportList.reduce((acc: Record<string, Array<{
// type: IImportType;
// local: string;
// imported: string;
// source: string;
// target: string;
// sourceName: string;
// sourceType: IImportType;
// targetName: string;
// targetType: IImportType;
// }>>, current) => {
// const { target } = current!;
// if (acc[target]) {
// acc[target].push(current!);
// } else {
// acc[target] = [current!];
// }
// return acc;
// }, {});
var nodeList = Object.keys(obj).map(function (source) {
var node = genNewImport(source, obj[source]);
return node;
});
var oldNodeList = Object.keys(oldObj).map(function (source) {
var node = genNewImport(source, oldObj[source]);
return node;
});
if (nodeList.length) {
return __spreadArray(__spreadArray([], nodeList, true), [oldNodeList], false);
}
return [];
}
function genNewImport(source, importedList) {
var t = require('@babel/types');
var list = importedList.map(function (current) {
var local = current.local,
targetType = current.targetType,
targetName = current.targetName;
if (targetType === IImportType.ImportSpecifier) {
return t.ImportSpecifier(t.identifier(local), t.identifier(targetName));
}
if (targetType === IImportType.ImportDefaultSpecifier) {
return t.ImportDefaultSpecifier(t.identifier(local));
}
if (targetType === IImportType.importNamespaceSpecifier) {
return t.ImportNamespaceSpecifier(t.identifier(local));
}
});
return t.ImportDeclaration(list, t.StringLiteral(source));
}
export { replaceDependencies };