tolkfmt-test-dev
Version:
Code formatter for the Tolk programming language
73 lines • 2.39 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ImportCategory = void 0;
exports.extractImportPath = extractImportPath;
exports.categorizeImport = categorizeImport;
exports.getImportSubcategory = getImportSubcategory;
exports.sortImports = sortImports;
var ImportCategory;
(function (ImportCategory) {
ImportCategory[ImportCategory["stdlib"] = 0] = "stdlib";
ImportCategory[ImportCategory["relativeCurrent"] = 1] = "relativeCurrent";
ImportCategory[ImportCategory["relativeNested"] = 2] = "relativeNested";
ImportCategory[ImportCategory["relativeParent"] = 3] = "relativeParent";
ImportCategory[ImportCategory["absolute"] = 4] = "absolute";
})(ImportCategory || (exports.ImportCategory = ImportCategory = {}));
function extractImportPath(node) {
const pathN = node.childForFieldName("path");
if (!pathN)
return ""; // cannot happen
return pathN.text.slice(1, -1).replace(/\\/g, "/");
}
function categorizeImport(path) {
if (path.startsWith("@stdlib/")) {
return ImportCategory.stdlib;
}
if (path.startsWith("./")) {
return ImportCategory.relativeCurrent;
}
if (path.startsWith("../")) {
return ImportCategory.relativeParent;
}
if (path.startsWith("/")) {
return ImportCategory.absolute;
}
if (path.includes("/")) {
return ImportCategory.relativeNested;
}
return ImportCategory.relativeCurrent;
}
function getImportSubcategory(path, category) {
switch (category) {
case ImportCategory.stdlib: {
return 0;
}
case ImportCategory.relativeCurrent: {
return 0;
}
case ImportCategory.relativeParent: {
return (path.match(/\.\.\//g) ?? []).length;
}
case ImportCategory.relativeNested: {
return (path.match(/\//g) ?? []).length;
}
case ImportCategory.absolute: {
return 0;
}
default: {
return 0;
}
}
}
function sortImports(imports) {
return imports.sort((a, b) => {
if (a.category !== b.category) {
return a.category - b.category;
}
if (a.subcategory !== b.subcategory) {
return a.subcategory - b.subcategory;
}
return a.path.localeCompare(b.path);
});
}
//# sourceMappingURL=imports.js.map