Files
freeCodeCamp/common/utils/polyvinyl.js

106 lines
2.1 KiB
JavaScript
Raw Normal View History

// originally base off of https://github.com/gulpjs/vinyl
import path from 'path';
import replaceExt from 'replace-ext';
2016-05-10 23:38:11 -07:00
import invariant from 'invariant';
2016-05-10 23:38:11 -07:00
// interface PolyVinyl {
// contents: String,
// path: String,
// history: [...String],
// error: Null|Object
// }
//
// createPoly({
// path: String,
// contents: String,
// history?: [...String],
// }) => PolyVinyl, throws
2016-05-14 16:46:20 -07:00
export function createPoly({ path, contents, history, ...rest } = {}) {
2016-05-10 23:38:11 -07:00
invariant(
typeof path === 'string',
'path must be a string but got %s',
path
);
2016-05-10 23:38:11 -07:00
invariant(
typeof contents === 'string',
'contents must be a string but got %s',
contents
);
2016-05-10 23:38:11 -07:00
return {
2016-05-14 16:46:20 -07:00
...rest,
2016-05-10 23:38:11 -07:00
history: Array.isArray(history) ? history : [ path ],
path: path,
contents: contents,
error: null
};
}
2016-05-10 23:38:11 -07:00
// isPoly(poly: Any) => Boolean
export function isPoly(poly) {
return poly &&
typeof poly.contents === 'string' &&
typeof poly.path === 'string' &&
Array.isArray(poly.history);
}
2016-05-10 23:38:11 -07:00
// checkPoly(poly: Any) => Void, throws
export function checkPoly(poly) {
invariant(
isPoly(poly),
'function should receive a PolyVinyl, but got %s',
poly
);
}
2016-05-10 23:38:11 -07:00
// isEmpty(poly: PolyVinyl) => Boolean, throws
export function isEmpty(poly) {
checkPoly(poly);
return !!poly.contents;
}
2016-05-10 23:38:11 -07:00
// updateContents(contents: String, poly: PolyVinyl) => PolyVinyl
export function updateContents(contents, poly) {
checkPoly(poly);
return {
...poly,
contents
};
}
2016-05-10 23:38:11 -07:00
export function getExt(poly) {
checkPoly(poly);
invariant(
!!poly.path,
'No path specified! Can not get extname'
);
return path.extname(poly.path);
}
2016-05-10 23:38:11 -07:00
export function setExt(extname, poly) {
invariant(
poly.path,
'No path specified! Can not set extname',
);
const newPoly = {
...poly,
path: replaceExt(this.path, extname)
};
newPoly.history = [ ...poly.history, newPoly.path ];
return newPoly;
}
2016-05-10 23:38:11 -07:00
export function setError(error, poly) {
invariant(
typeof error === 'object',
'error must be an object or null, but got %',
error
);
checkPoly(poly);
return {
...poly,
error
};
}