146 lines
3.0 KiB
JavaScript
Raw Normal View History

2020-02-25 19:37:10 -08:00
const path = require('path');
const ROOT = path.resolve(__dirname, '..');
2020-02-25 19:37:10 -08:00
const fs = require('fs-extra');
2020-02-28 10:31:13 -08:00
const { is: _is } = require('./lib/util');
2020-02-27 18:57:39 -08:00
function is (...args) {
const fn = _is(...args);
const ret = (ext) => fn(normalizedExt(ext));
ret.matching = args;
return ret;
}
function dictMatch (dict, def) {
const arr = Object.entries(dict);
return (tok) => {
for (const [ key, fn ] of arr) {
// console.log({ key, tok, r: fn(tok), matching: fn.matching })
if (fn(tok)) return key;
}
return def;
};
}
const EXT = exports.EXT = {
JPG: '.jpg',
JPEG: '.jpeg',
PNG: '.png',
GIF: '.gif',
MP4: '.mp4',
M4V: '.m4v',
MD: '.md',
HBS: '.hbs',
HTML: '.html',
XML: '.xml',
CSS: '.css',
SCSS: '.scss',
JS: '.js',
JSX: '.jsx',
2020-02-27 18:57:39 -08:00
};
const {
JPG,
JPEG,
PNG,
GIF,
MP4,
M4V,
MD,
HBS,
HTML,
XML,
CSS,
SCSS,
JS,
JSX,
2020-02-27 18:57:39 -08:00
} = EXT;
const NORMALIZE_EXT = {
[JPG]: JPEG,
[M4V]: MP4,
[HBS]: HTML,
[JSX]: JS,
2020-02-27 18:57:39 -08:00
};
const normalizedExt = exports.normalizedExt = (ext) => {
if (ext[0] !== '.') ext = '.' + ext.split('.').pop();
return NORMALIZE_EXT[ext] || ext;
};
const isVideo = exports.isVideo = is(MP4, M4V);
const isImage = exports.isImage = is(JPG, JPEG, PNG, GIF);
const isHandlebars = exports.isHandlebars = is(XML, HBS, HTML);
const isMarkdown = exports.isMarkdown = is(MD);
const isPage = exports.isPage = is(isHandlebars, isMarkdown);
const isAsset = exports.isAsset = is(isImage, isVideo);
const isArtifact = exports.isArtifact = is(CSS, SCSS, JS, JSX);
2020-02-27 20:42:33 -08:00
exports.isCleanUrl = is(HBS, MD);
2020-02-27 18:57:39 -08:00
const TYPE = exports.TYPE = {
2020-03-07 18:04:37 -08:00
IMAGE: 'TYPE_IMAGE',
VIDEO: 'TYPE_VIDEO',
HANDLEBARS: 'TYPE_HANDLEBARS',
MARKDOWN: 'TYPE_MARKDOWN',
SCRIPT: 'TYPE_SCRIPT',
STYLE: 'TYPE_STYLE',
OTHER: 'TYPE_OTHER',
2020-02-27 18:57:39 -08:00
};
exports.type = dictMatch({
[TYPE.IMAGE]: isImage,
[TYPE.HANDLEBARS]: isHandlebars,
[TYPE.MARKDOWN]: isMarkdown,
[TYPE.VIDEO]: isVideo,
[TYPE.SCRIPT]: is(JS, JSX),
[TYPE.STYLE]: is(SCSS, CSS),
2020-02-27 18:57:39 -08:00
}, TYPE.OTHER);
const KIND = exports.KIND = {
2020-03-07 18:04:37 -08:00
PAGE: 'KIND_PAGE',
POST: 'KIND_POST',
ASSET: 'KIND_ASSET',
ARTIFACT: 'KIND_ARTIFACT',
OTHER: 'KIND_OTHER',
2020-02-27 18:57:39 -08:00
};
exports.kind = dictMatch({
[KIND.ASSET]: isAsset,
[KIND.PAGE]: isPage,
[KIND.ARTIFACT]: isArtifact,
2020-02-27 18:57:39 -08:00
}, KIND.OTHER);
2020-03-07 18:04:37 -08:00
exports.ENGINE = {
HTML: 'ENGINE_HTML',
PAGE: 'ENGINE_PAGE',
POST: 'ENGINE_POST',
OTHER: 'ENGINE_OTHER',
2020-02-27 18:57:39 -08:00
};
2020-02-25 19:37:10 -08:00
exports.readFile = function readFile (fpath) {
fpath = exports.resolve(fpath);
return fs.readFile(fpath).catch((err) => {
throw new Error(err.message);
2020-02-25 19:37:10 -08:00
});
};
exports.resolve = function resolve (...args) {
args = args.filter(Boolean);
const fpath = args.shift();
2020-02-25 19:37:10 -08:00
if (!fpath) return ROOT;
return path.resolve(ROOT, fpath, ...args);
};
exports.relative = function relative (fpath) {
return path.relative(ROOT, fpath);
};
exports.ROOT = ROOT;