UNPKG

@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
"use strict"; 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;