@tdb/web
Version:
Common condiguration for serving a web-site and testing web-based UI components.
66 lines (54 loc) • 1.52 kB
JavaScript
import MemoryFileSystem from 'memory-fs';
import fs from './utils/fs';
import Promise from 'bluebird';
import { cacheDir } from './paths';
import path from 'path';
const { stringify, parse } = JSON;
const initializeMFS = () => {
const mfs = new MemoryFileSystem();
mfs.mkdirSync('/assets');
return mfs;
};
const cleanup = mfs => {
mfs.rmdirSync('/assets');
mfs.mkdirSync('/assets');
return mfs;
};
const createSync = (cacheDir, fs, mfs) => (hash, stats) => {
mfs = cleanup(mfs);
mfs.writeFileSync('/stats.json', stringify(stats));
return Promise.resolve(stats.assets)
.map(({ name }) => name)
.map(filename => {
return Promise.props({
filename,
buffer: fs.readFileAsync(path.join(cacheDir, hash, filename)),
});
})
.each(({ filename, buffer }) => {
mfs.writeFileSync(path.posix.join('/assets', filename), buffer);
});
};
const createGetAssets = mfs => () => {
return mfs.readdirSync('/assets').map(filename => ({
filename,
buffer: mfs.readFileSync(path.posix.join('/assets', filename)),
}));
};
const createGetStats = mfs => () => {
try {
const buffer = mfs.readFileSync('/stats.json');
return parse(buffer);
} catch (err) {
return null;
}
};
export const _createMemory = (fs, cacheDir) => () => {
const mfs = initializeMFS();
return {
sync: createSync(cacheDir, fs, mfs),
getAssets: createGetAssets(mfs),
getStats: createGetStats(mfs),
};
};
export default _createMemory(fs, cacheDir);