@serverless-guru/prettier-plugin-import-order
Version:
A prettier plugin to sort TS/JS import declarations by provided Regular Expression order
91 lines (90 loc) • 3.67 kB
JavaScript
;
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeNodesWithMatchingImportFlavors = void 0;
var constants_1 = require("../constants");
var get_import_flavor_of_node_1 = require("./get-import-flavor-of-node");
function isMergeableFlavor(flavor) {
return constants_1.mergeableImportFlavors.includes(flavor);
}
function selectMergeableNodesByImportFlavor(nodes) {
var _a;
return nodes.reduce(function (groups, node) {
var flavor = (0, get_import_flavor_of_node_1.getImportFlavorOfNode)(node);
if (isMergeableFlavor(flavor)) {
groups[flavor].push(node);
}
return groups;
}, (_a = {},
_a[constants_1.importFlavorValue] = [],
_a[constants_1.importFlavorType] = [],
_a));
}
function selectNodeImportSource(node) {
return node.source.value;
}
function nodeIsImportNamespaceSpecifier(node) {
return node.type === 'ImportNamespaceSpecifier';
}
function nodeIsImportDefaultSpecifier(node) {
return node.type === 'ImportDefaultSpecifier';
}
function mergeIsSafe(nodeToKeep, nodeToForget) {
if (nodeToKeep.specifiers.some(nodeIsImportNamespaceSpecifier) ||
nodeToForget.specifiers.some(nodeIsImportNamespaceSpecifier)) {
return false;
}
if (nodeToKeep.specifiers.some(nodeIsImportDefaultSpecifier) &&
nodeToForget.specifiers.some(nodeIsImportDefaultSpecifier)) {
return false;
}
return true;
}
function mergeNodes(nodeToKeep, nodeToForget) {
var _a;
if (!mergeIsSafe(nodeToKeep, nodeToForget)) {
return false;
}
(_a = nodeToKeep.specifiers).push.apply(_a, nodeToForget.specifiers);
nodeToKeep.leadingComments = __spreadArray(__spreadArray([], (nodeToKeep.leadingComments || []), true), (nodeToForget.leadingComments || []), true);
nodeToKeep.innerComments = __spreadArray(__spreadArray([], (nodeToKeep.innerComments || []), true), (nodeToForget.innerComments || []), true);
nodeToKeep.trailingComments = __spreadArray(__spreadArray([], (nodeToKeep.trailingComments || []), true), (nodeToForget.trailingComments || []), true);
return true;
}
function mutateContextAndMerge(_a) {
var context = _a.context, nodesToDelete = _a.nodesToDelete, insertableNode = _a.insertableNode;
var source = selectNodeImportSource(insertableNode);
if (context[source]) {
if (mergeNodes(context[source], insertableNode)) {
nodesToDelete.push(insertableNode);
}
}
else {
context[source] = insertableNode;
}
}
var mergeNodesWithMatchingImportFlavors = function (input) {
var nodesToDelete = [];
for (var _i = 0, _a = Object.values(selectMergeableNodesByImportFlavor(input)); _i < _a.length; _i++) {
var group = _a[_i];
var context = {};
for (var _b = 0, group_1 = group; _b < group_1.length; _b++) {
var insertableNode = group_1[_b];
mutateContextAndMerge({
context: context,
nodesToDelete: nodesToDelete,
insertableNode: insertableNode,
});
}
}
return input.filter(function (n) { return !nodesToDelete.includes(n); });
};
exports.mergeNodesWithMatchingImportFlavors = mergeNodesWithMatchingImportFlavors;