sortier
Version:
An opinionated code sorter
64 lines (63 loc) • 2.2 kB
JavaScript
import { ArrayUtils } from "../../utilities/array-utils.js";
const defaultObjectTypeOrder = ["undefined", "null", "*", "function"];
let lastCalculatedRankOptions = undefined;
let lastCalculatedRankMap = undefined;
export function getObjectTypeRanks(options) {
// Use defaults if passed undefined
options = options || defaultObjectTypeOrder;
// Figure out if we can use the cache and recache if we can't
if (lastCalculatedRankOptions != null &&
lastCalculatedRankMap != null &&
ArrayUtils.isEqual(lastCalculatedRankOptions, options)) {
return lastCalculatedRankMap;
}
else {
lastCalculatedRankOptions = options;
}
// Determine the map
let everythingRank = options.indexOf("*");
if (everythingRank === -1) {
everythingRank = options.length;
}
let nullRank = options.indexOf("null");
if (nullRank === -1) {
nullRank = everythingRank;
}
let undefinedRank = options.indexOf("undefined");
if (undefinedRank === -1) {
undefinedRank = everythingRank;
}
let objectRank = options.indexOf("object");
if (objectRank === -1) {
objectRank = everythingRank;
}
let functionRank = options.indexOf("function");
if (functionRank === -1) {
functionRank = everythingRank;
}
lastCalculatedRankMap = {
everything: everythingRank,
function: functionRank,
null: nullRank,
object: objectRank,
undefined: undefinedRank,
};
return lastCalculatedRankMap;
}
export function getSpreadGroups(allNodes) {
// Any time there is a spread operator, we need to sort around it... moving it could cause functionality changes
const spreadGroups = [];
let currentStart = 0;
for (let x = 0; x < allNodes.length; x++) {
if (allNodes[x].type.includes("Spread") || allNodes[x].type.includes("Rest")) {
if (currentStart !== x) {
spreadGroups.push(allNodes.slice(currentStart, x));
}
currentStart = x + 1;
}
}
if (currentStart !== allNodes.length) {
spreadGroups.push(allNodes.slice(currentStart));
}
return spreadGroups;
}