Ghost/core/server/utils/read-directory.js
Katharina Irrgang 3ed009ac7b feature: define redirects in a custom file (#7719) (#7945)
refs #7707

- be able to add a custom redirect file into the content folder
- define redirects as JSON format

The redirects feature is already present in the LTS branch.
I was not able to cherry-pick over, too many changes or conflicts.
Creating a PR to ensure 1. tests pass and 2. overview of code changes.
I had to add an example active theme to our test fixture utils, because otherwise Ghost will complain when forking Ghost.
2017-02-06 15:32:40 +01:00

100 lines
2.5 KiB
JavaScript

/**
* Dependencies
*/
var parsePackageJson = require('./parse-package-json'),
Promise = require('bluebird'),
join = require('path').join,
fs = require('fs'),
statFile = Promise.promisify(fs.stat),
readDir = Promise.promisify(fs.readdir);
/**
* Recursively read directory
*/
function readDirectory(dir, options) {
var ignore;
if (!options) {
options = {};
}
ignore = options.ignore || [];
ignore.push('node_modules', 'bower_components', '.DS_Store', '.git');
return readDir(dir)
.filter(function (filename) {
return ignore.indexOf(filename) === -1;
})
.map(function (filename) {
var absolutePath = join(dir, filename);
return statFile(absolutePath).then(function (stat) {
var item = {
name: filename,
path: absolutePath,
stat: stat
};
return item;
});
})
.map(function (item) {
if (item.name === 'package.json') {
return parsePackageJson(item.path)
.then(function (pkg) {
item.content = pkg;
return item;
})
.catch(function () {
// ignore invalid package.json for now,
// because Ghost does not rely/use them at the moment
// in the future, this .catch() will need to be removed,
// so that error is thrown on invalid json syntax
item.content = null;
return item;
});
}
if (item.stat.isDirectory()) {
return readDirectory(item.path).then(function (files) {
item.content = files;
return item;
});
}
// if there's no custom handling needed
// set absolute path as `item`'s `content`
item.content = item.path;
return item;
})
.then(function (items) {
var tree = {};
items.forEach(function (item) {
tree[item.name] = item.content;
});
return tree;
})
.catch(function (err) {
if (err.code === 'ENOENT') {
return;
}
return Promise.reject(err);
});
}
/**
* Expose `readDirectory`
*/
module.exports = readDirectory;