mikser
Version:
Real-time static site generator
103 lines (89 loc) • 2.86 kB
JavaScript
let glob = require('glob');
let path = require('path');
let fs = require('fs-extra-promise');
let rp = require('request-promise');
module.exports = function (mikser, context) {
function isUrl (path) {
return /^http[s]?:\/\//.test(path);
}
context.glob = function (pattern, globFolder) {
let globFolders = [mikser.config.filesFolder, mikser.config.sharedFolder];
let result = [];
function getStats(cwd, urlFlag) {
glob.sync(pattern, {cwd: cwd}).forEach((file) => {
let source = path.join(cwd, file)
let stats = fs.statSync(source);
if (urlFlag) {
let destination = mikser.utils.predictDestination(source);
destination = mikser.utils.resolveDestination(destination, context.entity.destination);
stats.url = mikser.utils.getUrl(destination);
} else {
stats.url = mikser.utils.getUrl(file);
}
stats.toString = function() {
return stats.url;
}
result.push(stats);
});
}
console.log(globFolder);
if (globFolder) {
let cwd = path.join(mikser.options.workingFolder, globFolder);
console.log(cwd);
getStats(cwd, false);
} else {
for (let cwd of globFolders) {
getStats(cwd, true);
}
}
return result;
}
context.file = function (file, encoding, optional) {
if (typeof encoding == 'boolean') {
optional = encoding;
encoding = undefined;
}
optional = optional || false;
encoding = encoding || 'utf8';
let source = mikser.utils.findSource(file);
if (optional && !fs.existsSync(source)) return '';
let content = fs.readFileSync(source, {
encoding: encoding
});
return content;
}
context.write = function(file, content) {
context.process(() => {
return fs.createFileAsync(file).then(() => {
return fs.writeFileAsync(file, content);
});
});
}
context.copy = function(source, destination) {
source = mikser.utils.findSource(source);
destination = mikser.utils.resolveDestination(destination, context.entity.destination);
fs.copySync(source, destination);
}
context.stat = function (file) {
let source = mikser.utils.findSource(file);
if (source) {
let stats = fs.statSync(source);
let destination = mikser.utils.predictDestination(source);
destination = mikser.utils.resolveDestination(destination, context.entity.destination);
let url = mikser.utils.getUrl(destination);
if (url) {
stats.url = url;
}
return stats;
}
}
context.embed = function(source) {
if (isUrl(source)) {
return context.async(rp(source, {encoding: null}).then((data) => 'base64,' + data.toString('base64')));
} else {
source = mikser.utils.findSource(source);
return context.async(fs.readFileAsync(source).then((data) => 'base64,' + data.toString('base64')));
}
}
}