Skip to content

Commit

Permalink
Update: Resolve options based on definition
Browse files Browse the repository at this point in the history
  • Loading branch information
phated committed Nov 30, 2017
1 parent a751c41 commit 19004c7
Show file tree
Hide file tree
Showing 24 changed files with 206 additions and 141 deletions.
22 changes: 14 additions & 8 deletions lib/dest/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,34 @@
var lead = require('lead');
var pumpify = require('pumpify');
var mkdirpStream = require('fs-mkdirp-stream');
var number = require('value-or-function').number;
var createResolver = require('resolve-options');

var config = require('./options');
var prepare = require('./prepare');
var sourcemap = require('./sourcemap');
var writeContents = require('./write-contents');

var folderConfig = {
outFolder: {
type: 'string',
},
};

function dest(outFolder, opt) {
if (!opt) {
opt = {};
}
var optResolver = createResolver(config, opt);
var folderResolver = createResolver(folderConfig, { outFolder: outFolder });

function dirpath(file, callback) {
var dirMode = number(opt.dirMode, file);
var dirMode = optResolver.resolve('dirMode', file);

callback(null, file.dirname, dirMode);
}

var saveStream = pumpify.obj(
prepare(outFolder, opt),
sourcemap(opt),
prepare(folderResolver, optResolver),
sourcemap(optResolver),
mkdirpStream.obj(dirpath),
writeContents(opt)
writeContents(optResolver)
);

// Sink the output stream to start flowing
Expand Down
34 changes: 34 additions & 0 deletions lib/dest/options.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
'use strict';

var config = {
cwd: {
type: 'string',
default: process.cwd,
},
mode: {
type: 'number',
default: function(file) {
return file.stat ? file.stat.mode : null;
},
},
dirMode: {
type: 'number',
},
overwrite: {
type: 'boolean',
default: true,
},
flag: {
type: 'string',
default: function(file) {
var overwrite = this.resolve('overwrite', file);
return (overwrite ? 'w': 'wx');
},
},
sourcemaps: {
type: ['string', 'boolean'],
default: false,
},
};

module.exports = config;
23 changes: 6 additions & 17 deletions lib/dest/prepare.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,19 @@
var path = require('path');

var fs = require('graceful-fs');
var koalas = require('koalas');
var through = require('through2');
var valueOrFunction = require('value-or-function');

var string = valueOrFunction.string;
var number = valueOrFunction.number;
var boolean = valueOrFunction.boolean;

function prepareWrite(outFolder, opt) {
if (!opt) {
opt = {};
}

if (!outFolder) {
function prepareWrite(folderResolver, optResolver) {
if (!folderResolver) {
throw new Error('Invalid output folder');
}

function normalize(file, enc, cb) {
var defaultMode = file.stat ? file.stat.mode : null;
var mode = koalas(number(opt.mode, file), defaultMode);
var flag = koalas(boolean(opt.overwrite, file), true) ? 'w' : 'wx';
var cwd = path.resolve(koalas(string(opt.cwd, file), process.cwd()));
var mode = optResolver.resolve('mode', file);
var flag = optResolver.resolve('flag', file);
var cwd = path.resolve(optResolver.resolve('cwd', file));

var outFolderPath = string(outFolder, file);
var outFolderPath = folderResolver.resolve('outFolder', file);
if (!outFolderPath) {
return cb(new Error('Invalid output folder'));
}
Expand Down
7 changes: 2 additions & 5 deletions lib/dest/sourcemap.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,13 @@

var through = require('through2');
var sourcemap = require('vinyl-sourcemap');
var valueOrFunction = require('value-or-function');

var stringOrBool = valueOrFunction.bind(null, ['string', 'boolean']);

function sourcemapStream(opt) {
function sourcemapStream(optResolver) {

function saveSourcemap(file, enc, callback) {
var self = this;

var srcMap = stringOrBool(opt.sourcemaps, file);
var srcMap = optResolver.resolve('sourcemaps', file);

if (!srcMap) {
return callback(null, file);
Expand Down
13 changes: 7 additions & 6 deletions lib/dest/write-contents/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,27 @@ var writeSymbolicLink = require('./write-symbolic-link');

var fo = require('../../file-operations');

function writeContents(opt) {
function writeContents(optResolver) {

function writeFile(file, enc, callback) {
// If directory then mkdirp it
if (file.isDirectory()) {
return writeDir(file, onWritten);
return writeDir(file, optResolver, onWritten);
}

// Stream it to disk yo
if (file.isStream()) {
return writeStream(file, onWritten);
return writeStream(file, optResolver, onWritten);
}

// Write it as a symlink
if (file.symlink) {
return writeSymbolicLink(file, onWritten);
return writeSymbolicLink(file, optResolver, onWritten);
}

// Write it like normal
if (file.isBuffer()) {
return writeBuffer(file, onWritten);
return writeBuffer(file, optResolver, onWritten);
}

// If no contents then do nothing
Expand All @@ -40,7 +40,8 @@ function writeContents(opt) {
// This is invoked by the various writeXxx modules when they've finished
// writing the contents.
function onWritten(writeErr) {
if (fo.isFatalOverwriteError(writeErr, file.flag)) {
var flag = optResolver.resolve('flag', file);
if (fo.isFatalOverwriteError(writeErr, flag)) {
return callback(writeErr);
}

Expand Down
4 changes: 2 additions & 2 deletions lib/dest/write-contents/write-buffer.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

var fo = require('../../file-operations');

function writeBuffer(file, onWritten) {
function writeBuffer(file, optResolver, onWritten) {
var opt = {
mode: file.stat.mode,
flag: file.flag,
flag: optResolver.resolve('flag', file),
};

fo.writeFile(file.path, file.contents, opt, onWriteFile);
Expand Down
2 changes: 1 addition & 1 deletion lib/dest/write-contents/write-dir.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ var mkdirp = require('fs-mkdirp-stream/mkdirp');

var fo = require('../../file-operations');

function writeDir(file, onWritten) {
function writeDir(file, optResolver, onWritten) {
mkdirp(file.path, file.stat.mode, onMkdirp);

function onMkdirp(mkdirpErr) {
Expand Down
4 changes: 2 additions & 2 deletions lib/dest/write-contents/write-stream.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
var fo = require('../../file-operations');
var readStream = require('../../src/read-contents/read-stream');

function writeStream(file, onWritten) {
function writeStream(file, optResolver, onWritten) {
var opt = {
mode: file.stat.mode,
// TODO: need to test this (node calls this `flags` property)
flag: file.flag,
flag: optResolver.resolve('flag', file),
};

// TODO: is this the best API?
Expand Down
2 changes: 1 addition & 1 deletion lib/dest/write-contents/write-symbolic-link.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ var fs = require('graceful-fs');

var fo = require('../../file-operations');

function writeSymbolicLink(file, onWritten) {
function writeSymbolicLink(file, optResolver, onWritten) {
// TODO handle symlinks properly
fs.symlink(file.symlink, file.path, function(symlinkErr) {
if (fo.isFatalOverwriteError(symlinkErr)) {
Expand Down
16 changes: 8 additions & 8 deletions lib/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,29 @@ var gs = require('glob-stream');
var pumpify = require('pumpify');
var toThrough = require('to-through');
var isValidGlob = require('is-valid-glob');
var createResolver = require('resolve-options');

var config = require('./options');
var prepare = require('./prepare');
var wrapVinyl = require('./wrap-vinyl');
var sourcemap = require('./sourcemap');
var readContents = require('./read-contents');
var resolveSymlinks = require('./resolve-symlinks');

function src(glob, opt) {
if (!opt) {
opt = {};
}
var optResolver = createResolver(config, opt);

if (!isValidGlob(glob)) {
throw new Error('Invalid glob argument: ' + glob);
}

var streams = [
gs(glob, opt),
wrapVinyl(opt),
resolveSymlinks(opt),
prepare(opt),
readContents(opt),
sourcemap(opt),
wrapVinyl(optResolver),
resolveSymlinks(optResolver),
prepare(optResolver),
readContents(optResolver),
sourcemap(optResolver),
];

var outputStream = pumpify.obj(streams);
Expand Down
29 changes: 29 additions & 0 deletions lib/src/options.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
'use strict';

var config = {
buffer: {
type: 'boolean',
default: true,
},
read: {
type: 'boolean',
default: true,
},
since: {
type: 'date',
},
stripBOM: {
type: 'boolean',
default: true,
},
sourcemaps: {
type: 'boolean',
default: false,
},
resolveSymlinks: {
type: 'boolean',
default: true,
},
};

module.exports = config;
20 changes: 5 additions & 15 deletions lib/src/prepare.js
Original file line number Diff line number Diff line change
@@ -1,26 +1,16 @@
'use strict';

var through = require('through2');
var valueOrFunction = require('value-or-function');

var date = valueOrFunction.date;

function prepareRead(opt) {
if (!opt) {
opt = {};
}
function prepareRead(optResolver) {

function normalize(file, enc, callback) {

var since = optResolver.resolve('since', file);

// Skip this file if since option is set and current file is too old
if (opt.since != null) {
var since = date(opt.since, file);
if (since === null) {
return callback(new Error('Invalid since option'));
}
if (file.stat && file.stat.mtime <= since) {
return callback();
}
if (file.stat && file.stat.mtime <= since) {
return callback();
}

return callback(null, file);
Expand Down
20 changes: 9 additions & 11 deletions lib/src/read-contents/index.js
Original file line number Diff line number Diff line change
@@ -1,42 +1,40 @@
'use strict';

var through = require('through2');
var valueOrFunction = require('value-or-function');
var koalas = require('koalas');

var readDir = require('./read-dir');
var readStream = require('./read-stream');
var readBuffer = require('./read-buffer');
var readSymbolicLink = require('./read-symbolic-link');

var boolean = valueOrFunction.boolean;

function readContents(opt) {
function readContents(optResolver) {

function readFile(file, enc, callback) {

// Skip reading contents if read option says so
if (!koalas(boolean(opt.read, file), true)) {
var read = optResolver.resolve('read', file);
if (!read) {
return callback(null, file);
}

// Don't fail to read a directory
if (file.isDirectory()) {
return readDir(file, opt, onRead);
return readDir(file, optResolver, onRead);
}

// Process symbolic links included with `resolveSymlinks` option
if (file.stat && file.stat.isSymbolicLink()) {
return readSymbolicLink(file, opt, onRead);
return readSymbolicLink(file, optResolver, onRead);
}

// Read and pass full contents
if (koalas(boolean(opt.buffer, file), true)) {
return readBuffer(file, opt, onRead);
var buffer = optResolver.resolve('buffer', file);
if (buffer) {
return readBuffer(file, optResolver, onRead);
}

// Don't buffer anything - just pass streams
return readStream(file, opt, onRead);
return readStream(file, optResolver, onRead);

// This is invoked by the various readXxx modules when they've finished
// reading the contents.
Expand Down
10 changes: 3 additions & 7 deletions lib/src/read-contents/read-buffer.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,16 @@
var fs = require('graceful-fs');
var stripBom = require('strip-bom');

var valueOrFunction = require('value-or-function');
var koalas = require('koalas');

var boolean = valueOrFunction.boolean;

function bufferFile(file, opt, onRead) {
function bufferFile(file, optResolver, onRead) {
fs.readFile(file.path, onReadFile);

function onReadFile(readErr, data) {
if (readErr) {
return onRead(readErr);
}

if (koalas(boolean(opt.stripBOM, file), true)) {
var stripBOM = optResolver.resolve('stripBOM', file);
if (stripBOM) {
file.contents = stripBom(data);
} else {
file.contents = data;
Expand Down
Loading

0 comments on commit 19004c7

Please sign in to comment.