diff --git a/src/filesystem/list-directory.js b/src/filesystem/list-directory.js index 29f0f4f..cfa3d2b 100644 --- a/src/filesystem/list-directory.js +++ b/src/filesystem/list-directory.js @@ -3,7 +3,9 @@ const Promise = require("bluebird"); const fs = Promise.promisifyAll(require("fs")); const path = require("path"); -const naturalSort = require("natural-sort"); +const rfr = require("rfr"); + +const directorySorter = rfr("lib/sorting/directory")(); function statComplete(target) { return Promise.try(() => { @@ -75,16 +77,6 @@ module.exports = function(basePath, options = {}) { } }) }).then((entries) => { - let sorter = naturalSort(); - - return entries.sort((entryA, entryB) => { - if (entryA.targetType == "folder" && entryB.targetType != "folder") { - return -1; - } else if (entryB.targetType == "folder" && entryA.targetType != "folder") { - return 1; - } else { - return sorter(entryA.name, entryB.name); - } - }); + return entries.sort(directorySorter); }); } \ No newline at end of file diff --git a/src/sorting/directory.js b/src/sorting/directory.js new file mode 100644 index 0000000..92b734d --- /dev/null +++ b/src/sorting/directory.js @@ -0,0 +1,28 @@ +'use strict'; + +const naturalSort = require("natural-sort"); +const rfr = require("rfr"); +const priorityRules = rfr("lib/sorting/priority-rules"); + +module.exports = function() { + let naturalSorter = naturalSort(); + + let ruleSorter = priorityRules([ + function(entry) { + return entry.name === ".."; + }, + function(entry) { + return entry.targetType === "folder"; + } + ]); + + return function(entryA, entryB) { + let result = ruleSorter(entryA, entryB); + + if (result !== 0) { + return result; + } else { + return naturalSorter(entryA.name, entryB.name); + } + } +} \ No newline at end of file diff --git a/src/sorting/priority-rules.js b/src/sorting/priority-rules.js new file mode 100644 index 0000000..08dfdd7 --- /dev/null +++ b/src/sorting/priority-rules.js @@ -0,0 +1,19 @@ +'use strict'; + +module.exports = function(rules) { + return function(entryA, entryB) { + for (let i = 0; i < rules.length; i++) { + let rule = rules[i]; + let resultA = !!(rule(entryA)); + let resultB = !!(rule(entryB)); + + if (resultA && !resultB) { + return -1; + } else if (resultB && !resultA) { + return 1; + } + } + + return 0; + } +} \ No newline at end of file