95 lines
2.5 KiB
JavaScript
Raw Normal View History

2020-02-21 20:05:52 -08:00
2020-02-29 16:27:55 -08:00
process.env.BLUEBIRD_DEBUG = true;
2020-02-27 18:57:39 -08:00
const loadPublicFiles = require('./public');
2020-02-29 16:27:55 -08:00
const loadPostFiles = require('./posts');
2020-02-25 19:37:10 -08:00
const Cache = require('./cache');
2020-02-27 18:57:39 -08:00
const Promise = require('bluebird');
const fs = require('fs-extra');
const { sortBy } = require('lodash');
2020-02-21 20:05:52 -08:00
2020-02-27 18:57:39 -08:00
const primeTweets = require('./page-tweets');
const pageWriter = require('./page-writer');
2020-02-25 19:37:10 -08:00
const evaluate = require('./evaluate');
2020-02-27 18:57:39 -08:00
const { resolve } = require('./resolve');
2020-02-21 20:05:52 -08:00
2020-02-25 19:37:10 -08:00
const favicon = require('./favicon');
const scss = require('./scss');
2020-02-27 18:57:39 -08:00
const svg = require('./svg');
const scripts = require('./scripts');
2020-02-21 20:05:52 -08:00
2020-02-25 19:37:10 -08:00
exports.everything = function (prod = false) {
2020-02-29 16:27:55 -08:00
async function fn () {
2020-02-21 20:05:52 -08:00
2020-02-29 16:27:55 -08:00
// load a directory scan of the public and post folders
const [ PublicFiles, PostFiles ] = await Promise.all([
loadPublicFiles(),
loadPostFiles(),
]);
2020-02-27 18:57:39 -08:00
// load data for all the files in that folder
await Promise.map(PublicFiles.assets, (p) => p.load());
await Promise.map(PublicFiles.pages, (p) => p.load(PublicFiles));
2020-02-21 20:05:52 -08:00
2020-02-29 16:27:55 -08:00
await Promise.map(PostFiles.assets, (p) => p.load());
await Promise.map(PostFiles.pages, (p) => p.load(PostFiles));
2020-02-27 18:57:39 -08:00
// prime tweet data for all pages
const pages = await primeTweets(PublicFiles.pages.filter((p) => !p.meta.ignore));
2020-02-29 16:27:55 -08:00
let posts = await primeTweets(PostFiles.pages.filter((p) => !p.meta.ignore));
posts = sortBy(posts, 'date');
2020-03-02 20:28:46 -08:00
posts.reverse();
2020-02-21 20:05:52 -08:00
2020-02-27 18:57:39 -08:00
// compile all tasks to be completed
2020-02-25 19:37:10 -08:00
const tasks = await Promise.all([
2020-02-27 18:57:39 -08:00
PublicFiles.tasks,
2020-02-29 16:27:55 -08:00
PostFiles.tasks,
scss(prod),
scripts(prod),
2020-02-27 18:57:39 -08:00
svg(prod),
2020-02-25 19:37:10 -08:00
favicon(prod),
]);
2020-02-21 20:05:52 -08:00
await fs.writeFile(resolve('pages.json'), JSON.stringify(pages.map((p) => p.toJson()), null, 2));
2020-02-29 16:27:55 -08:00
await fs.writeFile(resolve('posts.json'), JSON.stringify(posts.map((p) => p.toJson()), null, 2));
await fs.ensureDir(resolve('dist'));
const cache = new Cache({ prod });
await cache.load();
await evaluate(tasks.flat(), cache);
await cache.save();
await pageWriter(pages, posts, prod);
2020-02-29 16:27:55 -08:00
}
2020-02-21 20:05:52 -08:00
2020-02-29 16:27:55 -08:00
fn.displayName = prod ? 'buildForProd' : 'build';
return fn;
2020-02-25 19:37:10 -08:00
};
exports.task = function (action, prod = false) {
const fn = async () => {
const tasks = await {
scss,
favicon,
svg,
scripts,
}[action](prod);
if (!tasks.length) return;
await fs.ensureDir(resolve('dist'));
const cache = new Cache({ prod });
await cache.load();
await evaluate(tasks, cache);
await evaluate(tasks.flat(), cache);
await cache.save();
};
fn.displayName = prod ? action + 'ForProd' : action;
return fn;
};