fs-jetpack
Advanced tools
Comparing version 0.7.3 to 0.8.0
@@ -12,6 +12,6 @@ /* eslint no-console: 0 */ | ||
var startTimer = function () { | ||
var start = Date.now(); | ||
return function stop() { | ||
return Date.now() - start; | ||
}; | ||
var start = Date.now(); | ||
return function stop() { | ||
return Date.now() - start; | ||
}; | ||
}; | ||
@@ -23,4 +23,4 @@ | ||
for (var i = 0; i < 10000; i += 1) { | ||
toCopyDir.file(i + '.txt', { content: 'text' }); | ||
toCopyDir.file(i + '.md', { content: 'markdown' }); | ||
toCopyDir.file(i + '.txt', { content: 'text' }); | ||
toCopyDir.file(i + '.md', { content: 'markdown' }); | ||
} | ||
@@ -36,24 +36,24 @@ | ||
.then(function () { | ||
jetpackTime = stop(); | ||
console.log('Jetpack took ' + jetpackTime + 'ms'); | ||
stop = startTimer(); | ||
return toCopyDir.copyAsync('.', testDir.path('copied-filtered-jetpack'), { | ||
matching: '*.txt', | ||
}); | ||
jetpackTime = stop(); | ||
console.log('Jetpack took ' + jetpackTime + 'ms'); | ||
stop = startTimer(); | ||
return toCopyDir.copyAsync('.', testDir.path('copied-filtered-jetpack'), { | ||
matching: '*.txt' | ||
}); | ||
}) | ||
.then(function () { | ||
jetpackFilteredTime = stop(); | ||
console.log('Jetpack with *.txt filter took ' + jetpackFilteredTime + 'ms'); | ||
stop = startTimer(); | ||
return promisedExec('cp -R ' + toCopyDir.path() + ' ' + testDir.path('copied-native')); | ||
jetpackFilteredTime = stop(); | ||
console.log('Jetpack with *.txt filter took ' + jetpackFilteredTime + 'ms'); | ||
stop = startTimer(); | ||
return promisedExec('cp -R ' + toCopyDir.path() + ' ' + testDir.path('copied-native')); | ||
}) | ||
.then(function () { | ||
nativeTime = stop(); | ||
console.log('Native took ' + nativeTime + 'ms'); | ||
var times = jetpackTime / nativeTime; | ||
console.log('Jetpack is ' + times.toFixed(1) + ' times slower than native'); | ||
testDir.remove('.'); | ||
nativeTime = stop(); | ||
console.log('Native took ' + nativeTime + 'ms'); | ||
var times = jetpackTime / nativeTime; | ||
console.log('Jetpack is ' + times.toFixed(1) + ' times slower than native'); | ||
testDir.remove('.'); | ||
}) | ||
.catch(function (err) { | ||
console.log(err); | ||
console.log(err); | ||
}); |
@@ -0,1 +1,13 @@ | ||
0.8.0 (2016-04-09) | ||
------------------- | ||
* **(breaking change)** `find()` now distinguishes between files and directories and by default searches only for files (previously searched for both). | ||
* **(breaking change)** `find()` no longer can be configured with `returnAs` parameter and returns always relative paths (previously returned absolute). | ||
* **(breaking change)** `list()` no longer accepts `useInspect` as a parameter. To achieve old behaviour use `jetpack.list()` with `Array.map()`. | ||
* **(deprecation)** Don't do `jetpack.read('sth', 'buf')`, do `jetpack.read('sth', 'buffer')` instead. | ||
* `remove()`, `list()` and `find()` now can be called without provided `path`, and defaults to CWD in that case. | ||
0.7.3 (2016-03-21) | ||
------------------- | ||
* Bugfixed `copy()` with symlink overwrite | ||
0.7.2 (2016-03-09) | ||
@@ -2,0 +14,0 @@ ------------------- |
252
lib/copy.js
@@ -1,2 +0,2 @@ | ||
"use strict"; | ||
'use strict'; | ||
@@ -15,29 +15,29 @@ var pathUtil = require('path'); | ||
var parseOptions = function (options, from) { | ||
var parsedOptions = {}; | ||
options = options || {}; | ||
var parsedOptions = {}; | ||
options = options || {}; | ||
parsedOptions.overwrite = options.overwrite; | ||
parsedOptions.overwrite = options.overwrite; | ||
if (options.matching) { | ||
parsedOptions.allowedToCopy = matcher.create(options.matching, from); | ||
} else { | ||
parsedOptions.allowedToCopy = function () { | ||
// Default behaviour - copy everything. | ||
return true; | ||
}; | ||
} | ||
if (options.matching) { | ||
parsedOptions.allowedToCopy = matcher.create(options.matching, from); | ||
} else { | ||
parsedOptions.allowedToCopy = function () { | ||
// Default behaviour - copy everything. | ||
return true; | ||
}; | ||
} | ||
return parsedOptions; | ||
return parsedOptions; | ||
}; | ||
var generateNoSourceError = function (path) { | ||
var err = new Error("Path to copy doesn't exist " + path); | ||
err.code = 'ENOENT'; | ||
return err; | ||
var err = new Error("Path to copy doesn't exist " + path); | ||
err.code = 'ENOENT'; | ||
return err; | ||
}; | ||
var generateDestinationExistsError = function (path) { | ||
var err = new Error('Destination path already exists ' + path); | ||
err.code = 'EEXIST'; | ||
return err; | ||
var err = new Error('Destination path already exists ' + path); | ||
err.code = 'EEXIST'; | ||
return err; | ||
}; | ||
@@ -50,46 +50,45 @@ | ||
var copySync = function (inspectData, to) { | ||
var mod = mode.normalizeFileMode(inspectData.mode); | ||
if (inspectData.type === 'dir') { | ||
mkdirp.sync(to, { mode: mod }); | ||
} else if (inspectData.type === 'file') { | ||
var data = fs.readFileSync(inspectData.absolutePath); | ||
fileOps.write(to, data, { mode: mod }); | ||
} else if (inspectData.type === 'symlink') { | ||
var symlinkPointsAt = fs.readlinkSync(inspectData.absolutePath); | ||
try { | ||
fs.symlinkSync(symlinkPointsAt, to); | ||
} catch (err) { | ||
// There is already file/symlink with this name on destination location. | ||
// Must erase it manually, otherwise system won't allow us to place symlink there. | ||
if (err.code === 'EEXIST') { | ||
fs.unlinkSync(to); | ||
// Retry... | ||
fs.symlinkSync(symlinkPointsAt, to); | ||
} else { | ||
throw err; | ||
} | ||
} | ||
var mod = mode.normalizeFileMode(inspectData.mode); | ||
if (inspectData.type === 'dir') { | ||
mkdirp.sync(to, { mode: mod }); | ||
} else if (inspectData.type === 'file') { | ||
var data = fs.readFileSync(inspectData.absolutePath); | ||
fileOps.write(to, data, { mode: mod }); | ||
} else if (inspectData.type === 'symlink') { | ||
var symlinkPointsAt = fs.readlinkSync(inspectData.absolutePath); | ||
try { | ||
fs.symlinkSync(symlinkPointsAt, to); | ||
} catch (err) { | ||
// There is already file/symlink with this name on destination location. | ||
// Must erase it manually, otherwise system won't allow us to place symlink there. | ||
if (err.code === 'EEXIST') { | ||
fs.unlinkSync(to); | ||
// Retry... | ||
fs.symlinkSync(symlinkPointsAt, to); | ||
} else { | ||
throw err; | ||
} | ||
} | ||
} | ||
}; | ||
var sync = function (from, to, options) { | ||
options = parseOptions(options, from); | ||
options = parseOptions(options, from); | ||
if (!exists.sync(from)) { | ||
throw generateNoSourceError(from); | ||
} | ||
if (!exists.sync(from)) { | ||
throw generateNoSourceError(from); | ||
} | ||
if (exists.sync(to) && !options.overwrite) { | ||
throw generateDestinationExistsError(to); | ||
} | ||
if (exists.sync(to) && !options.overwrite) { | ||
throw generateDestinationExistsError(to); | ||
var walker = inspector.createTreeWalkerSync(from); | ||
while (walker.hasNext()) { | ||
var inspectData = walker.getNext(); | ||
var destPath = pathUtil.join(to, inspectData.relativePath); | ||
if (options.allowedToCopy(inspectData.absolutePath)) { | ||
copySync(inspectData, destPath); | ||
} | ||
var walker = inspector.createTreeWalkerSync(from); | ||
while (walker.hasNext()) { | ||
var inspectData = walker.getNext(); | ||
var destPath = pathUtil.join(to, inspectData.relativePath); | ||
if (options.allowedToCopy(inspectData.absolutePath)) { | ||
copySync(inspectData, destPath); | ||
} | ||
} | ||
} | ||
}; | ||
@@ -108,84 +107,83 @@ | ||
var copyAsync = function (inspectData, to) { | ||
var mod = mode.normalizeFileMode(inspectData.mode); | ||
if (inspectData.type === 'dir') { | ||
return promisedMkdirp(to, { mode: mod }); | ||
} else if (inspectData.type === 'file') { | ||
return promisedReadFile(inspectData.absolutePath) | ||
.then(function (data) { | ||
return fileOps.writeAsync(to, data, { mode: mod }); | ||
}); | ||
} else if (inspectData.type === 'symlink') { | ||
return promisedReadlink(inspectData.absolutePath) | ||
.then(function (symlinkPointsAt) { | ||
var deferred = Q.defer(); | ||
var mod = mode.normalizeFileMode(inspectData.mode); | ||
if (inspectData.type === 'dir') { | ||
return promisedMkdirp(to, { mode: mod }); | ||
} else if (inspectData.type === 'file') { | ||
return promisedReadFile(inspectData.absolutePath) | ||
.then(function (data) { | ||
return fileOps.writeAsync(to, data, { mode: mod }); | ||
}); | ||
} else if (inspectData.type === 'symlink') { | ||
return promisedReadlink(inspectData.absolutePath) | ||
.then(function (symlinkPointsAt) { | ||
var deferred = Q.defer(); | ||
promisedSymlink(symlinkPointsAt, to) | ||
.then(deferred.resolve) | ||
.catch(function (err) { | ||
if (err.code === 'EEXIST') { | ||
// There is already file/symlink with this name on destination location. | ||
// Must erase it manually, otherwise system won't allow us to place symlink there. | ||
promisedUnlink(to) | ||
.then(function () { | ||
// Retry... | ||
return promisedSymlink(symlinkPointsAt, to) | ||
}) | ||
.then(deferred.resolve, deferred.reject); | ||
} else { | ||
deferred.reject(err); | ||
} | ||
}); | ||
promisedSymlink(symlinkPointsAt, to) | ||
.then(deferred.resolve) | ||
.catch(function (err) { | ||
if (err.code === 'EEXIST') { | ||
// There is already file/symlink with this name on destination location. | ||
// Must erase it manually, otherwise system won't allow us to place symlink there. | ||
promisedUnlink(to) | ||
.then(function () { | ||
// Retry... | ||
return promisedSymlink(symlinkPointsAt, to); | ||
}) | ||
.then(deferred.resolve, deferred.reject); | ||
} else { | ||
deferred.reject(err); | ||
} | ||
}); | ||
return deferred.promise; | ||
}); | ||
} | ||
return deferred.promise; | ||
}); | ||
} | ||
}; | ||
var async = function (from, to, options) { | ||
var deferred = Q.defer(); | ||
var deferred = Q.defer(); | ||
var startCopying = function () { | ||
var startCopying = function () { | ||
var copyNext = function (walker) { | ||
if (walker.hasNext()) { | ||
var inspectData = walker.getNext(); | ||
var destPath = pathUtil.join(to, inspectData.relativePath); | ||
if (options.allowedToCopy(inspectData.absolutePath)) { | ||
copyAsync(inspectData, destPath) | ||
.then(function () { | ||
copyNext(walker); | ||
}) | ||
.catch(deferred.reject); | ||
} else { | ||
copyNext(walker); | ||
} | ||
} else { | ||
deferred.resolve(); | ||
} | ||
}; | ||
var copyNext = function (walker) { | ||
if (walker.hasNext()) { | ||
var inspectData = walker.getNext(); | ||
var destPath = pathUtil.join(to, inspectData.relativePath); | ||
if (options.allowedToCopy(inspectData.absolutePath)) { | ||
copyAsync(inspectData, destPath) | ||
.then(function () { | ||
copyNext(walker); | ||
}) | ||
.catch(deferred.reject); | ||
} else { | ||
copyNext(walker); | ||
} | ||
} else { | ||
deferred.resolve(); | ||
} | ||
}; | ||
inspector.createTreeWalkerAsync(from).then(copyNext); | ||
}; | ||
inspector.createTreeWalkerAsync(from).then(copyNext); | ||
}; | ||
options = parseOptions(options, from); | ||
options = parseOptions(options, from); | ||
// Checks before copying | ||
exists.async(from) | ||
.then(function (srcPathExists) { | ||
if (!srcPathExists) { | ||
throw generateNoSourceError(from); | ||
} else { | ||
return exists.async(to); | ||
} | ||
}) | ||
.then(function (destPathExists) { | ||
if (destPathExists && !options.overwrite) { | ||
throw generateDestinationExistsError(to); | ||
} else { | ||
startCopying(); | ||
} | ||
}) | ||
.catch(deferred.reject); | ||
// Checks before copying | ||
exists.async(from) | ||
.then(function (srcPathExists) { | ||
if (!srcPathExists) { | ||
throw generateNoSourceError(from); | ||
} else { | ||
return exists.async(to); | ||
} | ||
}) | ||
.then(function (destPathExists) { | ||
if (destPathExists && !options.overwrite) { | ||
throw generateDestinationExistsError(to); | ||
} else { | ||
startCopying(); | ||
} | ||
}) | ||
.catch(deferred.reject); | ||
return deferred.promise; | ||
return deferred.promise; | ||
}; | ||
@@ -192,0 +190,0 @@ |
266
lib/dir.js
@@ -1,2 +0,2 @@ | ||
"use strict"; | ||
'use strict'; | ||
@@ -12,12 +12,12 @@ var pathUtil = require('path'); | ||
function getCriteriaDefaults(criteria) { | ||
if (criteria === undefined) { | ||
criteria = {}; | ||
} | ||
if (typeof criteria.empty !== 'boolean') { | ||
criteria.empty = false; | ||
} | ||
if (criteria.mode !== undefined) { | ||
criteria.mode = modeUtil.normalizeFileMode(criteria.mode); | ||
} | ||
return criteria; | ||
if (criteria === undefined) { | ||
criteria = {}; | ||
} | ||
if (typeof criteria.empty !== 'boolean') { | ||
criteria.empty = false; | ||
} | ||
if (criteria.mode !== undefined) { | ||
criteria.mode = modeUtil.normalizeFileMode(criteria.mode); | ||
} | ||
return criteria; | ||
} | ||
@@ -30,43 +30,39 @@ | ||
var sync = function (path, criteria) { | ||
criteria = getCriteriaDefaults(criteria); | ||
criteria = getCriteriaDefaults(criteria); | ||
try { | ||
var stat = fs.statSync(path); | ||
} catch (err) { | ||
// Detection if path already exists | ||
if (err.code !== 'ENOENT') { | ||
throw err; | ||
} | ||
try { | ||
var stat = fs.statSync(path); | ||
} catch (err) { | ||
// Detection if path already exists | ||
if (err.code !== 'ENOENT') { | ||
throw err; | ||
} | ||
} | ||
if (stat && stat.isFile()) { | ||
// This is file, but should be directory. | ||
fs.unlinkSync(path); | ||
// Clear stat variable to indicate now nothing is there | ||
stat = undefined; | ||
if (stat && stat.isFile()) { | ||
// This is file, but should be directory. | ||
fs.unlinkSync(path); | ||
// Clear stat variable to indicate now nothing is there | ||
stat = undefined; | ||
} | ||
if (stat) { | ||
// Ensure existing directory matches criteria | ||
if (criteria.empty) { | ||
// Delete everything inside this directory | ||
var list = fs.readdirSync(path); | ||
list.forEach(function (filename) { | ||
rimraf.sync(pathUtil.resolve(path, filename)); | ||
}); | ||
} | ||
if (stat) { | ||
// Ensure existing directory matches criteria | ||
if (criteria.empty) { | ||
// Delete everything inside this directory | ||
var list = fs.readdirSync(path); | ||
list.forEach(function (filename) { | ||
rimraf.sync(pathUtil.resolve(path, filename)); | ||
}); | ||
} | ||
var mode = modeUtil.normalizeFileMode(stat.mode); | ||
if (criteria.mode !== undefined && criteria.mode !== mode) { | ||
// Mode is different than specified in criteria, fix that. | ||
fs.chmodSync(path, criteria.mode); | ||
} | ||
} else { | ||
// Directory doesn't exist now. Create it. | ||
mkdirp.sync(path, { mode: criteria.mode }); | ||
var mode = modeUtil.normalizeFileMode(stat.mode); | ||
if (criteria.mode !== undefined && criteria.mode !== mode) { | ||
// Mode is different than specified in criteria, fix that. | ||
fs.chmodSync(path, criteria.mode); | ||
} | ||
} else { | ||
// Directory doesn't exist now. Create it. | ||
mkdirp.sync(path, { mode: criteria.mode }); | ||
} | ||
}; | ||
@@ -86,112 +82,110 @@ | ||
var empty = function (path) { | ||
var deferred = Q.defer(); | ||
var deferred = Q.defer(); | ||
promisedReaddir(path) | ||
.then(function (list) { | ||
promisedReaddir(path) | ||
.then(function (list) { | ||
var doOne = function (index) { | ||
if (index === list.length) { | ||
deferred.resolve(); | ||
} else { | ||
var subPath = pathUtil.resolve(path, list[index]); | ||
promisedRimraf(subPath).then(function () { | ||
doOne(index + 1); | ||
}); | ||
} | ||
}; | ||
var doOne = function (index) { | ||
if (index === list.length) { | ||
deferred.resolve(); | ||
} else { | ||
var subPath = pathUtil.resolve(path, list[index]); | ||
promisedRimraf(subPath).then(function () { | ||
doOne(index + 1); | ||
}); | ||
} | ||
}; | ||
doOne(0); | ||
}) | ||
.catch(deferred.reject); | ||
doOne(0); | ||
}) | ||
.catch(deferred.reject); | ||
return deferred.promise; | ||
return deferred.promise; | ||
}; | ||
var async = function (path, criteria) { | ||
var deferred = Q.defer(); | ||
var deferred = Q.defer(); | ||
criteria = getCriteriaDefaults(criteria); | ||
criteria = getCriteriaDefaults(criteria); | ||
var checkWhatWeHaveNow = function () { | ||
var checkDeferred = Q.defer(); | ||
var checkWhatWeHaveNow = function () { | ||
var checkDeferred = Q.defer(); | ||
promisedStat(path) | ||
.then(function (stat) { | ||
if (stat.isFile()) { | ||
// This is not a directory, and should be. | ||
promisedRimraf(path) | ||
.then(function () { | ||
// We just deleted that path, so can't | ||
// pass stat further down. | ||
checkDeferred.resolve(undefined); | ||
}) | ||
.catch(checkDeferred.reject); | ||
} else { | ||
checkDeferred.resolve(stat); | ||
} | ||
promisedStat(path) | ||
.then(function (stat) { | ||
if (stat.isFile()) { | ||
// This is not a directory, and should be. | ||
promisedRimraf(path) | ||
.then(function () { | ||
// We just deleted that path, so can't | ||
// pass stat further down. | ||
checkDeferred.resolve(undefined); | ||
}) | ||
.catch(function (err) { | ||
if (err.code === 'ENOENT') { | ||
// Path doesn't exist | ||
checkDeferred.resolve(undefined); | ||
} else { | ||
// This is other error that nonexistent path, so end here. | ||
checkDeferred.reject(err); | ||
} | ||
}); | ||
.catch(checkDeferred.reject); | ||
} else { | ||
checkDeferred.resolve(stat); | ||
} | ||
}) | ||
.catch(function (err) { | ||
if (err.code === 'ENOENT') { | ||
// Path doesn't exist | ||
checkDeferred.resolve(undefined); | ||
} else { | ||
// This is other error that nonexistent path, so end here. | ||
checkDeferred.reject(err); | ||
} | ||
}); | ||
return checkDeferred.promise; | ||
}; | ||
return checkDeferred.promise; | ||
}; | ||
var checkWhatShouldBe = function (stat) { | ||
var checkDeferred = Q.defer(); | ||
var checkWhatShouldBe = function (stat) { | ||
var checkDeferred = Q.defer(); | ||
var needToCheckMoreCriteria = function () { | ||
var needToCheckMoreCriteria = function () { | ||
var checkEmptiness = function () { | ||
if (criteria.empty) { | ||
// Delete everything inside this directory | ||
empty(path) | ||
.then(checkDeferred.resolve, checkDeferred.reject); | ||
} else { | ||
// Everything done! | ||
checkDeferred.resolve(); | ||
} | ||
}; | ||
var checkEmptiness = function () { | ||
if (criteria.empty) { | ||
// Delete everything inside this directory | ||
empty(path) | ||
.then(checkDeferred.resolve, checkDeferred.reject); | ||
} else { | ||
// Everything done! | ||
checkDeferred.resolve(); | ||
} | ||
}; | ||
var checkMode = function () { | ||
var mode = modeUtil.normalizeFileMode(stat.mode); | ||
if (criteria.mode !== undefined && criteria.mode !== mode) { | ||
// Mode is different than specified in criteria, fix that | ||
promisedChmod(path, criteria.mode) | ||
.then(checkEmptiness, checkDeferred.reject); | ||
} else { | ||
checkEmptiness(); | ||
} | ||
}; | ||
var checkMode = function () { | ||
var mode = modeUtil.normalizeFileMode(stat.mode); | ||
if (criteria.mode !== undefined && criteria.mode !== mode) { | ||
// Mode is different than specified in criteria, fix that | ||
promisedChmod(path, criteria.mode) | ||
.then(checkEmptiness, checkDeferred.reject); | ||
} else { | ||
checkEmptiness(); | ||
} | ||
}; | ||
checkMode(); | ||
}; | ||
checkMode(); | ||
}; | ||
var checkExistence = function () { | ||
if (!stat) { | ||
promisedMkdirp(path, { mode: criteria.mode }) | ||
.then(checkDeferred.resolve, checkDeferred.reject); | ||
} else { | ||
// Directory exists, but we still don't | ||
// know if it matches all criteria. | ||
needToCheckMoreCriteria(); | ||
} | ||
}; | ||
var checkExistence = function () { | ||
if (!stat) { | ||
promisedMkdirp(path, { mode: criteria.mode }) | ||
.then(checkDeferred.resolve, checkDeferred.reject); | ||
} else { | ||
// Directory exists, but we still don't | ||
// know if it matches all criteria. | ||
needToCheckMoreCriteria(); | ||
} | ||
}; | ||
checkExistence(); | ||
checkExistence(); | ||
return checkDeferred.promise; | ||
}; | ||
return checkDeferred.promise; | ||
}; | ||
checkWhatWeHaveNow() | ||
.then(checkWhatShouldBe) | ||
.then(deferred.resolve, deferred.reject); | ||
checkWhatWeHaveNow() | ||
.then(checkWhatShouldBe) | ||
.then(deferred.resolve, deferred.reject); | ||
return deferred.promise; | ||
return deferred.promise; | ||
}; | ||
@@ -198,0 +192,0 @@ |
@@ -1,2 +0,2 @@ | ||
"use strict"; | ||
'use strict'; | ||
@@ -11,18 +11,17 @@ var fs = require('fs'); | ||
var sync = function (path) { | ||
try { | ||
var stat = fs.statSync(path); | ||
if (stat.isDirectory()) { | ||
return 'dir'; | ||
} else if (stat.isFile()) { | ||
return 'file'; | ||
} | ||
return 'other'; | ||
} catch (err) { | ||
if (err.code !== 'ENOENT' && err.code !== 'ENOTDIR') { | ||
throw err; | ||
} | ||
try { | ||
var stat = fs.statSync(path); | ||
if (stat.isDirectory()) { | ||
return 'dir'; | ||
} else if (stat.isFile()) { | ||
return 'file'; | ||
} | ||
return 'other'; | ||
} catch (err) { | ||
if (err.code !== 'ENOENT' && err.code !== 'ENOTDIR') { | ||
throw err; | ||
} | ||
} | ||
return false; | ||
return false; | ||
}; | ||
@@ -35,21 +34,21 @@ | ||
var async = function (path) { | ||
var deferred = Q.defer(); | ||
var deferred = Q.defer(); | ||
fs.stat(path, function (err, stat) { | ||
if (err) { | ||
if (err.code === 'ENOENT' || err.code === 'ENOTDIR') { | ||
deferred.resolve(false); | ||
} else { | ||
deferred.reject(err); | ||
} | ||
} else if (stat.isDirectory()) { | ||
deferred.resolve('dir'); | ||
} else if (stat.isFile()) { | ||
deferred.resolve('file'); | ||
} else { | ||
deferred.resolve('other'); | ||
} | ||
}); | ||
fs.stat(path, function (err, stat) { | ||
if (err) { | ||
if (err.code === 'ENOENT' || err.code === 'ENOTDIR') { | ||
deferred.resolve(false); | ||
} else { | ||
deferred.reject(err); | ||
} | ||
} else if (stat.isDirectory()) { | ||
deferred.resolve('dir'); | ||
} else if (stat.isFile()) { | ||
deferred.resolve('file'); | ||
} else { | ||
deferred.resolve('other'); | ||
} | ||
}); | ||
return deferred.promise; | ||
return deferred.promise; | ||
}; | ||
@@ -56,0 +55,0 @@ |
// Simple operations on a file: read, write, append. | ||
"use strict"; | ||
'use strict'; | ||
@@ -11,3 +11,3 @@ var fs = require('fs'); | ||
// Temporary file extensions used for atomic file overwriting. | ||
var newExt = ".__new__"; | ||
var newExt = '.__new__'; | ||
@@ -17,31 +17,32 @@ // Matches strings generated by Date.toJSON() | ||
var jsonDateParser = function (key, value) { | ||
var reISO = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$/; | ||
if (typeof value === 'string') { | ||
if (reISO.exec(value)) { | ||
return new Date(value); | ||
} | ||
var reISO = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$/; | ||
if (typeof value === 'string') { | ||
if (reISO.exec(value)) { | ||
return new Date(value); | ||
} | ||
return value; | ||
} | ||
return value; | ||
}; | ||
var processDataToWrite = function (data, options) { | ||
// If data is a s simple object convert it to JSON. | ||
if (typeof data === 'object' | ||
&& !Buffer.isBuffer(data) | ||
&& data !== null) { | ||
var indent = options.jsonIndent; | ||
if (typeof indent !== 'number') { | ||
indent = 2; | ||
} | ||
data = JSON.stringify(data, null, indent); | ||
var indent = options.jsonIndent; | ||
// If data is a s simple object convert it to JSON. | ||
if (typeof data === 'object' | ||
&& !Buffer.isBuffer(data) | ||
&& data !== null) { | ||
if (typeof indent !== 'number') { | ||
indent = 2; | ||
} | ||
return JSON.stringify(data, null, indent); | ||
} | ||
return data; | ||
return data; | ||
}; | ||
var makeNicerJsonParsingError = function (path, err) { | ||
var nicerError = new Error('JSON parsing failed while reading ' | ||
+ path + ' [' + err + ']'); | ||
nicerError.originalError = err; | ||
return nicerError; | ||
var nicerError = new Error('JSON parsing failed while reading ' | ||
+ path + ' [' + err + ']'); | ||
nicerError.originalError = err; | ||
return nicerError; | ||
}; | ||
@@ -54,81 +55,85 @@ | ||
var readSync = function (path, returnAs) { | ||
returnAs = returnAs || 'utf8'; | ||
var retAs = returnAs || 'utf8'; | ||
var data; | ||
var encoding = 'utf8'; | ||
if (returnAs === 'buf') { | ||
encoding = null; | ||
} | ||
var encoding = 'utf8'; | ||
if (retAs === 'buffer') { | ||
encoding = null; | ||
} else if (retAs === 'buf') { | ||
console.warn("[fs-jetpack] DEPRECATION WARNING: Please use 'buffer' " + | ||
"instead of 'buf' in read() method."); | ||
encoding = null; | ||
} | ||
var data; | ||
try { | ||
data = fs.readFileSync(path, { encoding: encoding }); | ||
} catch (err) { | ||
if (err.code === 'ENOENT') { | ||
// If file doesn't exist just return null, no need to throw | ||
data = null; | ||
} else { | ||
// Otherwise rethrow the error | ||
throw err; | ||
} | ||
try { | ||
data = fs.readFileSync(path, { encoding: encoding }); | ||
} catch (err) { | ||
if (err.code === 'ENOENT') { | ||
// If file doesn't exist just return null, no need to throw | ||
data = null; | ||
} else { | ||
// Otherwise rethrow the error | ||
throw err; | ||
} | ||
} | ||
try { | ||
if (returnAs === 'json') { | ||
data = JSON.parse(data); | ||
} else if (returnAs === 'jsonWithDates') { | ||
data = JSON.parse(data, jsonDateParser); | ||
} | ||
} catch (err) { | ||
throw makeNicerJsonParsingError(path, err); | ||
try { | ||
if (retAs === 'json') { | ||
data = JSON.parse(data); | ||
} else if (retAs === 'jsonWithDates') { | ||
data = JSON.parse(data, jsonDateParser); | ||
} | ||
} catch (err) { | ||
throw makeNicerJsonParsingError(path, err); | ||
} | ||
return data; | ||
return data; | ||
}; | ||
var writeFileSync = function (path, data, options) { | ||
try { | ||
fs.writeFileSync(path, data, options); | ||
} catch (err) { | ||
if (err.code === 'ENOENT') { | ||
// Means parent directory doesn't exist, so create it and try again. | ||
mkdirp.sync(pathUtil.dirname(path)); | ||
fs.writeFileSync(path, data, options); | ||
} else { | ||
throw err; | ||
} | ||
try { | ||
fs.writeFileSync(path, data, options); | ||
} catch (err) { | ||
if (err.code === 'ENOENT') { | ||
// Means parent directory doesn't exist, so create it and try again. | ||
mkdirp.sync(pathUtil.dirname(path)); | ||
fs.writeFileSync(path, data, options); | ||
} else { | ||
throw err; | ||
} | ||
} | ||
}; | ||
var writeAtomicSync = function (path, data, options) { | ||
// we are assuming there is file on given path, and we don't want | ||
// to touch it until we are sure our data has been saved correctly, | ||
// so write the data into temporary file... | ||
writeFileSync(path + newExt, data, options); | ||
// ...next rename temp file to replace real path. | ||
fs.renameSync(path + newExt, path); | ||
// we are assuming there is file on given path, and we don't want | ||
// to touch it until we are sure our data has been saved correctly, | ||
// so write the data into temporary file... | ||
writeFileSync(path + newExt, data, options); | ||
// ...next rename temp file to replace real path. | ||
fs.renameSync(path + newExt, path); | ||
}; | ||
var writeSync = function (path, data, options) { | ||
options = options || {}; | ||
data = processDataToWrite(data, options); | ||
var opts = options || {}; | ||
var processedData = processDataToWrite(data, opts); | ||
var writeStrategy = writeFileSync; | ||
if (options.atomic) { | ||
writeStrategy = writeAtomicSync; | ||
} | ||
writeStrategy(path, data, { mode: options.mode }); | ||
var writeStrategy = writeFileSync; | ||
if (opts.atomic) { | ||
writeStrategy = writeAtomicSync; | ||
} | ||
writeStrategy(path, processedData, { mode: opts.mode }); | ||
}; | ||
var appendSync = function (path, data, options) { | ||
try { | ||
fs.appendFileSync(path, data, options); | ||
} catch (err) { | ||
if (err.code === 'ENOENT') { | ||
// Parent directory doesn't exist, | ||
// so just create it and write the file. | ||
writeFileSync(path, data, options); | ||
} else { | ||
throw err; | ||
} | ||
try { | ||
fs.appendFileSync(path, data, options); | ||
} catch (err) { | ||
if (err.code === 'ENOENT') { | ||
// Parent directory doesn't exist, | ||
// so just create it and write the file. | ||
writeFileSync(path, data, options); | ||
} else { | ||
throw err; | ||
} | ||
} | ||
}; | ||
@@ -147,110 +152,112 @@ | ||
var readAsync = function (path, returnAs) { | ||
var deferred = Q.defer(); | ||
var deferred = Q.defer(); | ||
returnAs = returnAs || 'utf8'; | ||
var retAs = returnAs || 'utf8'; | ||
var encoding = 'utf8'; | ||
if (retAs === 'buffer') { | ||
encoding = null; | ||
} else if (retAs === 'buf') { | ||
console.warn("[fs-jetpack] DEPRECATION WARNING: Please use 'buffer' " + | ||
"instead of 'buf' in read() method."); | ||
encoding = null; | ||
} | ||
var encoding = 'utf8'; | ||
if (returnAs === 'buf') { | ||
encoding = null; | ||
promisedReadFile(path, { encoding: encoding }) | ||
.then(function (data) { | ||
// Make final parsing of the data before returning. | ||
try { | ||
if (retAs === 'json') { | ||
deferred.resolve(JSON.parse(data)); | ||
} else if (retAs === 'jsonWithDates') { | ||
deferred.resolve(JSON.parse(data, jsonDateParser)); | ||
} else { | ||
deferred.resolve(data); | ||
} | ||
} catch (err) { | ||
deferred.reject(makeNicerJsonParsingError(path, err)); | ||
} | ||
}) | ||
.catch(function (err) { | ||
if (err.code === 'ENOENT') { | ||
// If file doesn't exist just return null, | ||
// no need to raise an error. | ||
deferred.resolve(null); | ||
} else { | ||
// Otherwise throw | ||
deferred.reject(err); | ||
} | ||
}); | ||
promisedReadFile(path, { encoding: encoding }) | ||
.then(function (data) { | ||
// Make final parsing of the data before returning. | ||
try { | ||
if (returnAs === 'json') { | ||
data = JSON.parse(data); | ||
} else if (returnAs === 'jsonWithDates') { | ||
data = JSON.parse(data, jsonDateParser); | ||
} | ||
deferred.resolve(data); | ||
} catch (err) { | ||
deferred.reject(makeNicerJsonParsingError(path, err)); | ||
} | ||
}) | ||
.catch(function (err) { | ||
if (err.code === 'ENOENT') { | ||
// If file doesn't exist just return null, | ||
// no need to raise an error. | ||
deferred.resolve(null); | ||
} else { | ||
// Otherwise throw | ||
deferred.reject(err); | ||
} | ||
}); | ||
return deferred.promise; | ||
return deferred.promise; | ||
}; | ||
var writeFileAsync = function (path, data, options) { | ||
var deferred = Q.defer(); | ||
var deferred = Q.defer(); | ||
promisedWriteFile(path, data, options) | ||
.then(deferred.resolve) | ||
.catch(function (err) { | ||
// First attempt to write a file ended with error. | ||
// Check if this is not due to nonexistent parent directory. | ||
if (err.code === 'ENOENT') { | ||
// Parent directory doesn't exist, so create it and try again. | ||
promisedMkdirp(pathUtil.dirname(path)) | ||
.then(function () { | ||
return promisedWriteFile(path, data, options); | ||
}) | ||
.then(deferred.resolve, deferred.reject); | ||
} else { | ||
// Nope, some other error, throw it. | ||
deferred.reject(err); | ||
} | ||
}); | ||
promisedWriteFile(path, data, options) | ||
.then(deferred.resolve) | ||
.catch(function (err) { | ||
// First attempt to write a file ended with error. | ||
// Check if this is not due to nonexistent parent directory. | ||
if (err.code === 'ENOENT') { | ||
// Parent directory doesn't exist, so create it and try again. | ||
promisedMkdirp(pathUtil.dirname(path)) | ||
.then(function () { | ||
return promisedWriteFile(path, data, options); | ||
}) | ||
.then(deferred.resolve, deferred.reject); | ||
} else { | ||
// Nope, some other error, throw it. | ||
deferred.reject(err); | ||
} | ||
}); | ||
return deferred.promise; | ||
return deferred.promise; | ||
}; | ||
var writeAtomicAsync = function (path, data, options) { | ||
var deferred = Q.defer(); | ||
var deferred = Q.defer(); | ||
// We are assuming there is file on given path, and we don't want | ||
// to touch it until we are sure our data has been saved correctly, | ||
// so write the data into temporary file... | ||
writeFileAsync(path + newExt, data, options) | ||
.then(function () { | ||
// ...next rename temp file to real path. | ||
return promisedRename(path + newExt, path); | ||
}) | ||
.then(deferred.resolve, deferred.reject); | ||
// We are assuming there is file on given path, and we don't want | ||
// to touch it until we are sure our data has been saved correctly, | ||
// so write the data into temporary file... | ||
writeFileAsync(path + newExt, data, options) | ||
.then(function () { | ||
// ...next rename temp file to real path. | ||
return promisedRename(path + newExt, path); | ||
}) | ||
.then(deferred.resolve, deferred.reject); | ||
return deferred.promise; | ||
return deferred.promise; | ||
}; | ||
var writeAsync = function (path, data, options) { | ||
options = options || {}; | ||
data = processDataToWrite(data, options); | ||
var opts = options || {}; | ||
var processedData = processDataToWrite(data, opts); | ||
var writeStrategy = writeFileAsync; | ||
if (options.atomic) { | ||
writeStrategy = writeAtomicAsync; | ||
} | ||
return writeStrategy(path, data, { mode: options.mode }); | ||
var writeStrategy = writeFileAsync; | ||
if (opts.atomic) { | ||
writeStrategy = writeAtomicAsync; | ||
} | ||
return writeStrategy(path, processedData, { mode: opts.mode }); | ||
}; | ||
var appendAsync = function (path, data, options) { | ||
var deferred = Q.defer(); | ||
var deferred = Q.defer(); | ||
promisedAppendFile(path, data, options) | ||
.then(deferred.resolve, function (err) { | ||
promisedAppendFile(path, data, options) | ||
.then(deferred.resolve, function (err) { | ||
if (err.code === 'ENOENT') { | ||
// If parent directory doesn't exist create it. | ||
promisedMkdirp(pathUtil.dirname(path)) | ||
.then(function () { | ||
return appendAsync(path, data, options); | ||
}) | ||
.then(deferred.resolve, deferred.reject); | ||
} else { | ||
deferred.reject(err); | ||
} | ||
}); | ||
if (err.code === 'ENOENT') { | ||
// If parent directory doesn't exist create it. | ||
promisedMkdirp(pathUtil.dirname(path)) | ||
.then(function () { | ||
return appendAsync(path, data, options); | ||
}) | ||
.then(deferred.resolve, deferred.reject); | ||
} else { | ||
deferred.reject(err); | ||
} | ||
}); | ||
return deferred.promise; | ||
return deferred.promise; | ||
}; | ||
@@ -257,0 +264,0 @@ |
239
lib/file.js
@@ -1,2 +0,2 @@ | ||
"use strict"; | ||
'use strict'; | ||
@@ -11,9 +11,9 @@ var fs = require('fs'); | ||
function getCriteriaDefaults(criteria) { | ||
if (criteria === undefined) { | ||
criteria = {}; | ||
} | ||
if (criteria.mode !== undefined) { | ||
criteria.mode = modeUtils.normalizeFileMode(criteria.mode); | ||
} | ||
return criteria; | ||
if (criteria === undefined) { | ||
criteria = {}; | ||
} | ||
if (criteria.mode !== undefined) { | ||
criteria.mode = modeUtils.normalizeFileMode(criteria.mode); | ||
} | ||
return criteria; | ||
} | ||
@@ -26,50 +26,45 @@ | ||
var sync = function (path, criteria) { | ||
criteria = getCriteriaDefaults(criteria); | ||
criteria = getCriteriaDefaults(criteria); | ||
try { | ||
var stat = fs.statSync(path); | ||
} catch (err) { | ||
// Detection if path exists | ||
if (err.code !== 'ENOENT') { | ||
throw err; | ||
} | ||
try { | ||
var stat = fs.statSync(path); | ||
} catch (err) { | ||
// Detection if path exists | ||
if (err.code !== 'ENOENT') { | ||
throw err; | ||
} | ||
} | ||
if (stat && !stat.isFile()) { | ||
// This have to be file, so if is directory must be removed. | ||
rimraf.sync(path); | ||
// Clear stat variable to indicate now nothing is there. | ||
stat = undefined; | ||
if (stat && !stat.isFile()) { | ||
// This have to be file, so if is directory must be removed. | ||
rimraf.sync(path); | ||
// Clear stat variable to indicate now nothing is there. | ||
stat = undefined; | ||
} | ||
if (stat) { | ||
// Ensure file mode | ||
var mode = modeUtils.normalizeFileMode(stat.mode); | ||
if (criteria.mode !== undefined && criteria.mode !== mode) { | ||
fs.chmodSync(path, criteria.mode); | ||
} | ||
if (stat) { | ||
// Ensure file mode | ||
var mode = modeUtils.normalizeFileMode(stat.mode); | ||
if (criteria.mode !== undefined && criteria.mode !== mode) { | ||
fs.chmodSync(path, criteria.mode); | ||
} | ||
// Ensure file content | ||
if (criteria.content !== undefined) { | ||
fileOps.write(path, criteria.content, { | ||
mode: mode, | ||
jsonIndent: criteria.jsonIndent, | ||
}); | ||
} | ||
} else { | ||
// File doesn't exist. Create it. | ||
var content = ''; | ||
if (criteria.content !== undefined) { | ||
content = criteria.content; | ||
} | ||
fileOps.write(path, content, { | ||
mode: criteria.mode, | ||
jsonIndent: criteria.jsonIndent, | ||
}); | ||
// Ensure file content | ||
if (criteria.content !== undefined) { | ||
fileOps.write(path, criteria.content, { | ||
mode: mode, | ||
jsonIndent: criteria.jsonIndent | ||
}); | ||
} | ||
} else { | ||
// File doesn't exist. Create it. | ||
var content = ''; | ||
if (criteria.content !== undefined) { | ||
content = criteria.content; | ||
} | ||
fileOps.write(path, content, { | ||
mode: criteria.mode, | ||
jsonIndent: criteria.jsonIndent | ||
}); | ||
} | ||
}; | ||
@@ -86,91 +81,87 @@ | ||
var async = function (path, criteria) { | ||
var deferred = Q.defer(); | ||
var deferred = Q.defer(); | ||
criteria = getCriteriaDefaults(criteria); | ||
criteria = getCriteriaDefaults(criteria); | ||
var checkWhatWeHaveNow = function () { | ||
var checkDeferred = Q.defer(); | ||
var checkWhatWeHaveNow = function () { | ||
var checkDeferred = Q.defer(); | ||
promisedStat(path) | ||
.then(function (stat) { | ||
if (stat.isDirectory()) { | ||
// This is not a file, so remove it. | ||
promisedRimraf(path) | ||
.then(function () { | ||
// Clear stat variable to indicate now nothing is there | ||
checkDeferred.resolve(undefined); | ||
}) | ||
.catch(checkDeferred.reject); | ||
} else { | ||
checkDeferred.resolve(stat); | ||
} | ||
promisedStat(path) | ||
.then(function (stat) { | ||
if (stat.isDirectory()) { | ||
// This is not a file, so remove it. | ||
promisedRimraf(path) | ||
.then(function () { | ||
// Clear stat variable to indicate now nothing is there | ||
checkDeferred.resolve(undefined); | ||
}) | ||
.catch(function (err) { | ||
if (err.code === 'ENOENT') { | ||
// Path doesn't exist. | ||
checkDeferred.resolve(undefined); | ||
} else { | ||
// This is other error. Must end here. | ||
checkDeferred.reject(err); | ||
} | ||
}); | ||
.catch(checkDeferred.reject); | ||
} else { | ||
checkDeferred.resolve(stat); | ||
} | ||
}) | ||
.catch(function (err) { | ||
if (err.code === 'ENOENT') { | ||
// Path doesn't exist. | ||
checkDeferred.resolve(undefined); | ||
} else { | ||
// This is other error. Must end here. | ||
checkDeferred.reject(err); | ||
} | ||
}); | ||
return checkDeferred.promise; | ||
}; | ||
return checkDeferred.promise; | ||
}; | ||
var checkWhatShouldBe = function (stat) { | ||
var checkDeferred = Q.defer(); | ||
var checkWhatShouldBe = function (stat) { | ||
var checkDeferred = Q.defer(); | ||
if (!stat) { | ||
if (!stat) { | ||
// Path doesn't exist now. Put file there. | ||
var content = ''; | ||
if (criteria.content !== undefined) { | ||
content = criteria.content; | ||
} | ||
fileOps.writeAsync(path, content, { | ||
mode: criteria.mode, | ||
jsonIndent: criteria.jsonIndent | ||
}) | ||
.then(checkDeferred.resolve, checkDeferred.reject); | ||
} else { | ||
// File already exists. Must do more checking. | ||
// Path doesn't exist now. Put file there. | ||
var mode = modeUtils.normalizeFileMode(stat.mode); | ||
var content = ''; | ||
if (criteria.content !== undefined) { | ||
content = criteria.content; | ||
} | ||
fileOps.writeAsync(path, content, { | ||
mode: criteria.mode, | ||
jsonIndent: criteria.jsonIndent, | ||
}) | ||
.then(checkDeferred.resolve, checkDeferred.reject); | ||
var checkMode = function () { | ||
if (criteria.mode !== undefined && criteria.mode !== mode) { | ||
promisedChmod(path, criteria.mode) | ||
.then(checkDeferred.resolve, checkDeferred.reject); | ||
} else { | ||
checkDeferred.resolve(); | ||
} | ||
}; | ||
var checkContent = function () { | ||
if (criteria.content !== undefined) { | ||
fileOps.writeAsync(path, criteria.content, { | ||
mode: mode, | ||
jsonIndent: criteria.jsonIndent | ||
}) | ||
.then(checkDeferred.resolve, checkDeferred.reject); | ||
} else { | ||
checkMode(); | ||
} | ||
}; | ||
// File already exists. Must do more checking. | ||
checkContent(); | ||
} | ||
var mode = modeUtils.normalizeFileMode(stat.mode); | ||
return checkDeferred.promise; | ||
}; | ||
var checkMode = function () { | ||
if (criteria.mode !== undefined && criteria.mode !== mode) { | ||
promisedChmod(path, criteria.mode) | ||
.then(checkDeferred.resolve, checkDeferred.reject); | ||
} else { | ||
checkDeferred.resolve(); | ||
} | ||
}; | ||
checkWhatWeHaveNow() | ||
.then(checkWhatShouldBe) | ||
.then(deferred.resolve, deferred.reject); | ||
var checkContent = function () { | ||
if (criteria.content !== undefined) { | ||
fileOps.writeAsync(path, criteria.content, { | ||
mode: mode, | ||
jsonIndent: criteria.jsonIndent, | ||
}) | ||
.then(checkDeferred.resolve, checkDeferred.reject); | ||
} else { | ||
checkMode(); | ||
} | ||
}; | ||
checkContent(); | ||
} | ||
return checkDeferred.promise; | ||
}; | ||
checkWhatWeHaveNow() | ||
.then(checkWhatShouldBe) | ||
.then(deferred.resolve, deferred.reject); | ||
return deferred.promise; | ||
return deferred.promise; | ||
}; | ||
@@ -177,0 +168,0 @@ |
128
lib/find.js
@@ -1,3 +0,4 @@ | ||
"use strict"; | ||
'use strict'; | ||
var pathUtil = require('path'); | ||
var Q = require('q'); | ||
@@ -7,37 +8,48 @@ var inspector = require('./inspector'); | ||
var normalizeOptions = function (options) { | ||
var opts = options || {}; | ||
// defaults: | ||
if (opts.files === undefined) { | ||
opts.files = true; | ||
} | ||
if (opts.directories === undefined) { | ||
opts.directories = false; | ||
} | ||
return opts; | ||
}; | ||
var filterTree = function (tree, options) { | ||
var matchesAnyOfGlobs = matcher.create(options.matching, tree.absolutePath); | ||
var matchesAnyOfGlobs = matcher.create(options.matching, tree.absolutePath); | ||
return inspector.utils.flattenTree(tree).filter(function (inspectObj) { | ||
return matchesAnyOfGlobs(inspectObj.absolutePath); | ||
}); | ||
return inspector.utils.flattenTree(tree) | ||
.filter(function (inspectObj) { | ||
return matchesAnyOfGlobs(inspectObj.absolutePath); | ||
}) | ||
.filter(function (inspectObj) { | ||
if (inspectObj.type === 'file' && options.files === true) { | ||
return true; | ||
} | ||
if (inspectObj.type === 'dir' && options.directories === true) { | ||
return true; | ||
} | ||
return false; | ||
}); | ||
}; | ||
var processFoundObjects = function (foundObjects, returnAs) { | ||
returnAs = returnAs || 'absolutePath'; | ||
switch (returnAs) { | ||
case 'absolutePath': | ||
return foundObjects.map(function (inspectObj) { | ||
return inspectObj.absolutePath; | ||
}); | ||
case 'relativePath': | ||
return foundObjects.map(function (inspectObj) { | ||
return inspectObj.relativePath; | ||
}); | ||
case 'inspect': | ||
return foundObjects; | ||
} | ||
var processFoundObjects = function (foundObjects, cwd) { | ||
return foundObjects.map(function (inspectObj) { | ||
return pathUtil.relative(cwd, inspectObj.absolutePath); | ||
}); | ||
}; | ||
var generatePathDoesntExistError = function (path) { | ||
var err = new Error("Path you want to find stuff in doesn't exist " + path); | ||
err.code = 'ENOENT'; | ||
return err; | ||
var err = new Error("Path you want to find stuff in doesn't exist " + path); | ||
err.code = 'ENOENT'; | ||
return err; | ||
}; | ||
var generatePathNotDirectoryError = function (path) { | ||
var err = new Error("Path you want to find stuff in must be a directory " + path); | ||
err.code = 'ENOTDIR'; | ||
return err; | ||
var err = new Error('Path you want to find stuff in must be a directory ' + path); | ||
err.code = 'ENOTDIR'; | ||
return err; | ||
}; | ||
@@ -49,17 +61,18 @@ | ||
var sync = function (path, options, returnAs) { | ||
var sync = function (path, options) { | ||
var foundInspectObjects; | ||
var tree; | ||
var tree = inspector.tree(path, { | ||
relativePath: true, | ||
absolutePath: true, | ||
}); | ||
tree = inspector.tree(path, { | ||
absolutePath: true | ||
}); | ||
if (tree === null) { | ||
throw generatePathDoesntExistError(path); | ||
} else if (tree.type !== 'dir') { | ||
throw generatePathNotDirectoryError(path); | ||
} | ||
if (tree === null) { | ||
throw generatePathDoesntExistError(path); | ||
} else if (tree.type !== 'dir') { | ||
throw generatePathNotDirectoryError(path); | ||
} | ||
var foundInspectObjects = filterTree(tree, options); | ||
return processFoundObjects(foundInspectObjects, returnAs); | ||
foundInspectObjects = filterTree(tree, normalizeOptions(options)); | ||
return processFoundObjects(foundInspectObjects, options.cwd); | ||
}; | ||
@@ -71,23 +84,26 @@ | ||
var async = function (path, options, returnAs) { | ||
var deferred = Q.defer(); | ||
var async = function (path, options) { | ||
var deferred = Q.defer(); | ||
inspector.treeAsync(path, { | ||
relativePath: true, | ||
absolutePath: true, | ||
}) | ||
.then(function (tree) { | ||
if (tree === null) { | ||
throw generatePathDoesntExistError(path); | ||
} else if (tree.type !== 'dir') { | ||
throw generatePathNotDirectoryError(path); | ||
} | ||
inspector.treeAsync(path, { | ||
relativePath: true, | ||
absolutePath: true | ||
}) | ||
.then(function (tree) { | ||
var foundInspectObjects; | ||
var toReturn; | ||
var foundInspectObjects = filterTree(tree, options); | ||
var toReturn = processFoundObjects(foundInspectObjects, returnAs); | ||
deferred.resolve(toReturn); | ||
}) | ||
.catch(deferred.reject); | ||
if (tree === null) { | ||
throw generatePathDoesntExistError(path); | ||
} else if (tree.type !== 'dir') { | ||
throw generatePathNotDirectoryError(path); | ||
} | ||
return deferred.promise; | ||
foundInspectObjects = filterTree(tree, normalizeOptions(options)); | ||
toReturn = processFoundObjects(foundInspectObjects, options.cwd); | ||
deferred.resolve(toReturn); | ||
}) | ||
.catch(deferred.reject); | ||
return deferred.promise; | ||
}; | ||
@@ -94,0 +110,0 @@ |
@@ -1,2 +0,2 @@ | ||
"use strict"; | ||
'use strict'; | ||
@@ -9,32 +9,32 @@ var fs = require('fs'); | ||
var createInspectObj = function (path, options, stat) { | ||
var obj = {}; | ||
var obj = {}; | ||
obj.name = pathUtil.basename(path); | ||
obj.name = pathUtil.basename(path); | ||
if (stat.isFile()) { | ||
obj.type = 'file'; | ||
obj.size = stat.size; | ||
} else if (stat.isDirectory()) { | ||
obj.type = 'dir'; | ||
} else if (stat.isSymbolicLink()) { | ||
obj.type = 'symlink'; | ||
} else { | ||
obj.type = 'other'; | ||
} | ||
if (stat.isFile()) { | ||
obj.type = 'file'; | ||
obj.size = stat.size; | ||
} else if (stat.isDirectory()) { | ||
obj.type = 'dir'; | ||
} else if (stat.isSymbolicLink()) { | ||
obj.type = 'symlink'; | ||
} else { | ||
obj.type = 'other'; | ||
} | ||
if (options.mode) { | ||
obj.mode = stat.mode; | ||
} | ||
if (options.mode) { | ||
obj.mode = stat.mode; | ||
} | ||
if (options.times) { | ||
obj.accessTime = stat.atime; | ||
obj.modifyTime = stat.mtime; | ||
obj.changeTime = stat.ctime; | ||
} | ||
if (options.times) { | ||
obj.accessTime = stat.atime; | ||
obj.modifyTime = stat.mtime; | ||
obj.changeTime = stat.ctime; | ||
} | ||
if (options.absolutePath) { | ||
obj.absolutePath = path; | ||
} | ||
if (options.absolutePath) { | ||
obj.absolutePath = path; | ||
} | ||
return obj; | ||
return obj; | ||
}; | ||
@@ -45,7 +45,7 @@ | ||
var checksumOfDir = function (inspectList, algo) { | ||
var hash = crypto.createHash(algo); | ||
inspectList.forEach(function (inspectObj) { | ||
hash.update(inspectObj.name + inspectObj[algo]); | ||
}); | ||
return hash.digest('hex'); | ||
var hash = crypto.createHash(algo); | ||
inspectList.forEach(function (inspectObj) { | ||
hash.update(inspectObj.name + inspectObj[algo]); | ||
}); | ||
return hash.digest('hex'); | ||
}; | ||
@@ -55,14 +55,14 @@ | ||
var flattenTree = function (tree) { | ||
var treeAsList = []; | ||
var treeAsList = []; | ||
var crawl = function (inspectObj) { | ||
treeAsList.push(inspectObj); | ||
if (inspectObj.children) { | ||
inspectObj.children.forEach(crawl); | ||
} | ||
}; | ||
var crawl = function (inspectObj) { | ||
treeAsList.push(inspectObj); | ||
if (inspectObj.children) { | ||
inspectObj.children.forEach(crawl); | ||
} | ||
}; | ||
crawl(tree); | ||
crawl(tree); | ||
return treeAsList; | ||
return treeAsList; | ||
}; | ||
@@ -75,123 +75,107 @@ | ||
var fileChecksum = function (path, algo) { | ||
var hash = crypto.createHash(algo); | ||
var data = fs.readFileSync(path); | ||
hash.update(data); | ||
return hash.digest('hex'); | ||
var hash = crypto.createHash(algo); | ||
var data = fs.readFileSync(path); | ||
hash.update(data); | ||
return hash.digest('hex'); | ||
}; | ||
var inspectSync = function (path, options) { | ||
options = options || {}; | ||
options = options || {}; | ||
var statFlavour = fs.statSync; | ||
if (options.symlinks) { | ||
statFlavour = fs.lstatSync; | ||
} | ||
var statFlavour = fs.statSync; | ||
if (options.symlinks) { | ||
statFlavour = fs.lstatSync; | ||
} | ||
try { | ||
var stat = statFlavour(path); | ||
} catch (err) { | ||
// Detection if path exists | ||
if (err.code === 'ENOENT') { | ||
// Doesn't exist. Return null instead of throwing. | ||
return null; | ||
} | ||
throw err; | ||
try { | ||
var stat = statFlavour(path); | ||
} catch (err) { | ||
// Detection if path exists | ||
if (err.code === 'ENOENT') { | ||
// Doesn't exist. Return null instead of throwing. | ||
return null; | ||
} | ||
throw err; | ||
} | ||
var inspectObj = createInspectObj(path, options, stat); | ||
var inspectObj = createInspectObj(path, options, stat); | ||
if (inspectObj.type === 'file' && options.checksum) { | ||
inspectObj[options.checksum] = fileChecksum(path, options.checksum); | ||
} else if (inspectObj.type === 'symlink') { | ||
inspectObj.pointsAt = fs.readlinkSync(path); | ||
} | ||
if (inspectObj.type === 'file' && options.checksum) { | ||
inspectObj[options.checksum] = fileChecksum(path, options.checksum); | ||
} else if (inspectObj.type === 'symlink') { | ||
inspectObj.pointsAt = fs.readlinkSync(path); | ||
} | ||
return inspectObj; | ||
return inspectObj; | ||
}; | ||
var listSync = function (path, useInspect) { | ||
try { | ||
var simpleList = fs.readdirSync(path); | ||
} catch (err) { | ||
// Detection if path exists | ||
if (err.code === 'ENOENT' || err.code === 'ENOTDIR') { | ||
// Doesn't exist or is a file, not directory. | ||
// Return null instead of throwing. | ||
return null; | ||
} | ||
throw err; | ||
var listSync = function (path) { | ||
try { | ||
return fs.readdirSync(path); | ||
} catch (err) { | ||
// Detection if path exists | ||
if (err.code === 'ENOENT' || err.code === 'ENOTDIR') { | ||
// Doesn't exist or is a file, not directory. | ||
// Return null instead of throwing. | ||
return null; | ||
} | ||
if (!useInspect) { | ||
return simpleList; | ||
} | ||
var inspectConfig = {}; | ||
if (typeof useInspect === 'object') { | ||
// useInspec contains config | ||
inspectConfig = useInspect; | ||
} | ||
var inspectedList = simpleList.map(function (filename) { | ||
return inspectSync(pathUtil.join(path, filename), inspectConfig); | ||
}); | ||
return inspectedList; | ||
throw err; | ||
} | ||
}; | ||
var crawlTreeSync = function (path, options, parent) { | ||
var treeBranch = inspectSync(path, options); | ||
var treeBranch = inspectSync(path, options); | ||
if (treeBranch) { | ||
if (treeBranch) { | ||
if (options.relativePath) { | ||
if (!parent) { | ||
treeBranch.relativePath = '.'; | ||
} else { | ||
treeBranch.relativePath = parent.relativePath + '/' + pathUtil.basename(path); | ||
} | ||
} | ||
if (options.relativePath) { | ||
if (!parent) { | ||
treeBranch.relativePath = '.'; | ||
} else { | ||
treeBranch.relativePath = parent.relativePath + '/' + pathUtil.basename(path); | ||
} | ||
} | ||
if (treeBranch.type === 'dir') { | ||
treeBranch.size = 0; | ||
if (treeBranch.type === 'dir') { | ||
treeBranch.size = 0; | ||
// Process all children | ||
treeBranch.children = listSync(path).map(function (filename) { | ||
// Go one level deeper with crawling | ||
var treeSubBranch = crawlTreeSync(pathUtil.join(path, filename), options, treeBranch); | ||
// Add together all childrens' size | ||
treeBranch.size += treeSubBranch.size || 0; | ||
// Process all children | ||
treeBranch.children = listSync(path).map(function (filename) { | ||
// Go one level deeper with crawling | ||
var treeSubBranch = crawlTreeSync(pathUtil.join(path, filename), options, treeBranch); | ||
// Add together all childrens' size | ||
treeBranch.size += treeSubBranch.size || 0; | ||
return treeSubBranch; | ||
}); | ||
return treeSubBranch; | ||
}); | ||
if (options.checksum) { | ||
treeBranch[options.checksum] = checksumOfDir(treeBranch.children, options.checksum); | ||
} | ||
} | ||
if (options.checksum) { | ||
treeBranch[options.checksum] = checksumOfDir(treeBranch.children, options.checksum); | ||
} | ||
} | ||
} | ||
return treeBranch; | ||
return treeBranch; | ||
}; | ||
var treeSync = function (path, options) { | ||
options = options || {}; | ||
options.symlinks = true; | ||
options = options || {}; | ||
options.symlinks = true; | ||
return crawlTreeSync(path, options, null); | ||
return crawlTreeSync(path, options, null); | ||
}; | ||
var createTreeWalkerSync = function (startPath) { | ||
var allFiles = flattenTree(treeSync(startPath, { | ||
absolutePath: true, | ||
relativePath: true, | ||
mode: true, | ||
})); | ||
return { | ||
hasNext: function () { | ||
return allFiles.length > 0; | ||
}, | ||
getNext: function () { | ||
return allFiles.shift(); | ||
}, | ||
}; | ||
var allFiles = flattenTree(treeSync(startPath, { | ||
absolutePath: true, | ||
relativePath: true, | ||
mode: true | ||
})); | ||
return { | ||
hasNext: function () { | ||
return allFiles.length > 0; | ||
}, | ||
getNext: function () { | ||
return allFiles.shift(); | ||
} | ||
}; | ||
}; | ||
@@ -209,205 +193,174 @@ | ||
var fileChecksumAsync = function (path, algo) { | ||
var deferred = Q.defer(); | ||
var deferred = Q.defer(); | ||
var hash = crypto.createHash(algo); | ||
var s = fs.createReadStream(path); | ||
s.on('data', function (data) { | ||
hash.update(data); | ||
}); | ||
s.on('end', function () { | ||
deferred.resolve(hash.digest('hex')); | ||
}); | ||
s.on('error', deferred.reject); | ||
var hash = crypto.createHash(algo); | ||
var s = fs.createReadStream(path); | ||
s.on('data', function (data) { | ||
hash.update(data); | ||
}); | ||
s.on('end', function () { | ||
deferred.resolve(hash.digest('hex')); | ||
}); | ||
s.on('error', deferred.reject); | ||
return deferred.promise; | ||
return deferred.promise; | ||
}; | ||
var inspectAsync = function (path, options) { | ||
var deferred = Q.defer(); | ||
var deferred = Q.defer(); | ||
options = options || {}; | ||
options = options || {}; | ||
var statFlavour = promisedStat; | ||
if (options.symlinks) { | ||
statFlavour = promisedLstat; | ||
var statFlavour = promisedStat; | ||
if (options.symlinks) { | ||
statFlavour = promisedLstat; | ||
} | ||
statFlavour(path) | ||
.then(function (stat) { | ||
var inspectObj = createInspectObj(path, options, stat); | ||
if (inspectObj.type === 'file' && options.checksum) { | ||
fileChecksumAsync(path, options.checksum) | ||
.then(function (checksum) { | ||
inspectObj[options.checksum] = checksum; | ||
deferred.resolve(inspectObj); | ||
}) | ||
.catch(deferred.reject); | ||
} else if (inspectObj.type === 'symlink') { | ||
promisedReadlink(path) | ||
.then(function (linkPath) { | ||
inspectObj.pointsAt = linkPath; | ||
deferred.resolve(inspectObj); | ||
}) | ||
.catch(deferred.reject); | ||
} else { | ||
deferred.resolve(inspectObj); | ||
} | ||
}) | ||
.catch(function (err) { | ||
// Detection if path exists | ||
if (err.code === 'ENOENT') { | ||
// Doesn't exist. Return null instead of throwing. | ||
deferred.resolve(null); | ||
} else { | ||
deferred.reject(err); | ||
} | ||
}); | ||
statFlavour(path) | ||
.then(function (stat) { | ||
var inspectObj = createInspectObj(path, options, stat); | ||
if (inspectObj.type === 'file' && options.checksum) { | ||
fileChecksumAsync(path, options.checksum) | ||
.then(function (checksum) { | ||
inspectObj[options.checksum] = checksum; | ||
deferred.resolve(inspectObj); | ||
}) | ||
.catch(deferred.reject); | ||
} else if (inspectObj.type === 'symlink') { | ||
promisedReadlink(path) | ||
.then(function (linkPath) { | ||
inspectObj.pointsAt = linkPath; | ||
deferred.resolve(inspectObj); | ||
}) | ||
.catch(deferred.reject); | ||
} else { | ||
deferred.resolve(inspectObj); | ||
} | ||
}) | ||
.catch(function (err) { | ||
// Detection if path exists | ||
if (err.code === 'ENOENT') { | ||
// Doesn't exist. Return null instead of throwing. | ||
deferred.resolve(null); | ||
} else { | ||
deferred.reject(err); | ||
} | ||
}); | ||
return deferred.promise; | ||
return deferred.promise; | ||
}; | ||
var listAsync = function (path, useInspect) { | ||
var deferred = Q.defer(); | ||
var listAsync = function (path) { | ||
var deferred = Q.defer(); | ||
var turnSimpleListIntoInspectObjectsList = function (pathsList) { | ||
var inspectConfig = {}; | ||
if (typeof useInspect === 'object') { | ||
// useInspec contains config | ||
inspectConfig = useInspect; | ||
} | ||
promisedReaddir(path) | ||
.then(function (list) { | ||
deferred.resolve(list); | ||
}) | ||
.catch(function (err) { | ||
// Detection if path exists | ||
if (err.code === 'ENOENT' || err.code === 'ENOTDIR') { | ||
// Doesn't exist or is a file, not directory. | ||
// Return null instead of throwing. | ||
deferred.resolve(null); | ||
} else { | ||
deferred.reject(err); | ||
} | ||
}); | ||
var doOne = function (index) { | ||
if (index === pathsList.length) { | ||
deferred.resolve(pathsList); | ||
} else { | ||
var itemPath = pathUtil.join(path, pathsList[index]); | ||
inspectAsync(itemPath, inspectConfig) | ||
.then(function (inspectObj) { | ||
pathsList[index] = inspectObj; | ||
doOne(index + 1); | ||
}) | ||
.catch(deferred.reject); | ||
} | ||
}; | ||
doOne(0); | ||
}; | ||
promisedReaddir(path) | ||
.then(function (simpleList) { | ||
if (!useInspect) { | ||
// Only list of paths is required. We are done. | ||
deferred.resolve(simpleList); | ||
} else { | ||
turnSimpleListIntoInspectObjectsList(simpleList); | ||
} | ||
}) | ||
.catch(function (err) { | ||
// Detection if path exists | ||
if (err.code === 'ENOENT' || err.code === 'ENOTDIR') { | ||
// Doesn't exist or is a file, not directory. | ||
// Return null instead of throwing. | ||
deferred.resolve(null); | ||
} else { | ||
deferred.reject(err); | ||
} | ||
}); | ||
return deferred.promise; | ||
return deferred.promise; | ||
}; | ||
var crawlTreeAsync = function (path, options, parent) { | ||
var deferred = Q.defer(); | ||
var deferred = Q.defer(); | ||
inspectAsync(path, options) | ||
.then(function (treeBranch) { | ||
inspectAsync(path, options) | ||
.then(function (treeBranch) { | ||
if (!treeBranch) { | ||
// Given path doesn't exist, or it is a file. We are done. | ||
deferred.resolve(treeBranch); | ||
return; | ||
} | ||
if (!treeBranch) { | ||
// Given path doesn't exist, or it is a file. We are done. | ||
deferred.resolve(treeBranch); | ||
return; | ||
} | ||
if (options.relativePath) { | ||
if (!parent) { | ||
treeBranch.relativePath = '.'; | ||
} else { | ||
treeBranch.relativePath = parent.relativePath + '/' + pathUtil.basename(path); | ||
} | ||
} | ||
if (options.relativePath) { | ||
if (!parent) { | ||
treeBranch.relativePath = '.'; | ||
} else { | ||
treeBranch.relativePath = parent.relativePath + '/' + pathUtil.basename(path); | ||
} | ||
} | ||
if (treeBranch.type !== 'dir') { | ||
// This is a file, we are done here. | ||
deferred.resolve(treeBranch); | ||
return; | ||
} | ||
if (treeBranch.type !== 'dir') { | ||
// This is a file, we are done here. | ||
deferred.resolve(treeBranch); | ||
return; | ||
} | ||
// Ok, this is a directory, must inspect all its children as well. | ||
// Ok, this is a directory, must inspect all its children as well. | ||
listAsync(path) | ||
.then(function (children) { | ||
treeBranch.children = children; | ||
treeBranch.size = 0; | ||
listAsync(path) | ||
.then(function (children) { | ||
treeBranch.children = children; | ||
treeBranch.size = 0; | ||
var done = function () { | ||
if (options.checksum) { | ||
// We are done, but still have to calculate checksum of whole directory. | ||
treeBranch[options.checksum] = checksumOfDir(treeBranch.children, options.checksum); | ||
} | ||
var done = function () { | ||
if (options.checksum) { | ||
// We are done, but still have to calculate checksum of whole directory. | ||
treeBranch[options.checksum] = checksumOfDir(treeBranch.children, options.checksum); | ||
} | ||
deferred.resolve(treeBranch); | ||
}; | ||
deferred.resolve(treeBranch); | ||
}; | ||
var doOne = function (index) { | ||
if (index === children.length) { | ||
done(); | ||
} else { | ||
var subPath = pathUtil.join(path, children[index]); | ||
crawlTreeAsync(subPath, options, treeBranch) | ||
.then(function (treeSubBranch) { | ||
children[index] = treeSubBranch; | ||
treeBranch.size += treeSubBranch.size || 0; | ||
doOne(index + 1); | ||
}) | ||
.catch(deferred.reject); | ||
} | ||
}; | ||
var doOne = function (index) { | ||
if (index === children.length) { | ||
done(); | ||
} else { | ||
var subPath = pathUtil.join(path, children[index]); | ||
crawlTreeAsync(subPath, options, treeBranch) | ||
.then(function (treeSubBranch) { | ||
children[index] = treeSubBranch; | ||
treeBranch.size += treeSubBranch.size || 0; | ||
doOne(index + 1); | ||
}) | ||
.catch(deferred.reject); | ||
} | ||
}; | ||
doOne(0); | ||
}); | ||
}) | ||
.catch(deferred.reject); | ||
doOne(0); | ||
}); | ||
}) | ||
.catch(deferred.reject); | ||
return deferred.promise; | ||
return deferred.promise; | ||
}; | ||
var treeAsync = function (path, options) { | ||
options = options || {}; | ||
options.symlinks = true; | ||
options = options || {}; | ||
options.symlinks = true; | ||
return crawlTreeAsync(path, options); | ||
return crawlTreeAsync(path, options); | ||
}; | ||
var createTreeWalkerAsync = function (startPath) { | ||
var deferred = Q.defer(); | ||
var deferred = Q.defer(); | ||
treeAsync(startPath, { | ||
absolutePath: true, | ||
relativePath: true, | ||
mode: true, | ||
}) | ||
.then(function (wholeTree) { | ||
var allFiles = flattenTree(wholeTree); | ||
deferred.resolve({ | ||
hasNext: function () { | ||
return allFiles.length > 0; | ||
}, | ||
getNext: function () { | ||
return allFiles.shift(); | ||
}, | ||
}); | ||
treeAsync(startPath, { | ||
absolutePath: true, | ||
relativePath: true, | ||
mode: true | ||
}) | ||
.then(function (wholeTree) { | ||
var allFiles = flattenTree(wholeTree); | ||
deferred.resolve({ | ||
hasNext: function () { | ||
return allFiles.length > 0; | ||
}, | ||
getNext: function () { | ||
return allFiles.shift(); | ||
} | ||
}); | ||
}); | ||
return deferred.promise; | ||
return deferred.promise; | ||
}; | ||
@@ -430,3 +383,3 @@ | ||
module.exports.utils = { | ||
flattenTree: flattenTree, | ||
flattenTree: flattenTree | ||
}; |
@@ -1,4 +0,4 @@ | ||
// The main thing. Here everything starts. | ||
/* eslint no-param-reassign:0 */ | ||
"use strict"; | ||
'use strict'; | ||
@@ -24,178 +24,193 @@ var pathUtil = require('path'); | ||
var jetpackContext = function (cwdPath) { | ||
var getCwdPath = function () { | ||
return cwdPath || process.cwd(); | ||
}; | ||
var getCwdPath = function () { | ||
return cwdPath || process.cwd(); | ||
}; | ||
var cwd = function () { | ||
var args; | ||
var pathParts; | ||
var cwd = function () { | ||
// return current CWD if no arguments specified... | ||
if (arguments.length === 0) { | ||
return getCwdPath(); | ||
} | ||
// ...create new CWD context otherwise | ||
var args = Array.prototype.slice.call(arguments); | ||
var pathParts = [getCwdPath()].concat(args); | ||
return jetpackContext(pathUtil.resolve.apply(null, pathParts)); | ||
}; | ||
// return current CWD if no arguments specified... | ||
if (arguments.length === 0) { | ||
return getCwdPath(); | ||
} | ||
// resolves path to inner CWD path of this jetpack instance | ||
var resolvePath = function (path) { | ||
return pathUtil.resolve(getCwdPath(), path); | ||
}; | ||
// ...create new CWD context otherwise | ||
args = Array.prototype.slice.call(arguments); | ||
pathParts = [getCwdPath()].concat(args); | ||
return jetpackContext(pathUtil.resolve.apply(null, pathParts)); | ||
}; | ||
var getPath = function () { | ||
// add CWD base path as first element of arguments array | ||
Array.prototype.unshift.call(arguments, getCwdPath()); | ||
return pathUtil.resolve.apply(null, arguments); | ||
}; | ||
// resolves path to inner CWD path of this jetpack instance | ||
var resolvePath = function (path) { | ||
return pathUtil.resolve(getCwdPath(), path); | ||
}; | ||
var normalizeOptions = function (options) { | ||
options = options || {}; | ||
options.cwd = getCwdPath(); | ||
return options; | ||
}; | ||
var getPath = function () { | ||
// add CWD base path as first element of arguments array | ||
Array.prototype.unshift.call(arguments, getCwdPath()); | ||
return pathUtil.resolve.apply(null, arguments); | ||
}; | ||
// API | ||
var normalizeOptions = function (options) { | ||
var opts = options || {}; | ||
opts.cwd = getCwdPath(); | ||
return opts; | ||
}; | ||
return { | ||
cwd: cwd, | ||
path: getPath, | ||
// API | ||
append: function (path, data, options) { | ||
fileOps.append(resolvePath(path), data, options); | ||
}, | ||
appendAsync: function (path, data, options) { | ||
return fileOps.appendAsync(resolvePath(path), data, options); | ||
}, | ||
return { | ||
cwd: cwd, | ||
path: getPath, | ||
copy: function (from, to, options) { | ||
options = normalizeOptions(options); | ||
copy.sync(resolvePath(from), resolvePath(to), options); | ||
}, | ||
copyAsync: function (from, to, options) { | ||
options = normalizeOptions(options); | ||
return copy.async(resolvePath(from), resolvePath(to), options); | ||
}, | ||
append: function (path, data, options) { | ||
fileOps.append(resolvePath(path), data, options); | ||
}, | ||
appendAsync: function (path, data, options) { | ||
return fileOps.appendAsync(resolvePath(path), data, options); | ||
}, | ||
createWriteStream: function (path, options) { | ||
return streams.createWriteStream(resolvePath(path), options); | ||
}, | ||
createReadStream: function (path, options) { | ||
return streams.createReadStream(resolvePath(path), options); | ||
}, | ||
copy: function (from, to, options) { | ||
var normalizedOptions = normalizeOptions(options); | ||
copy.sync(resolvePath(from), resolvePath(to), normalizedOptions); | ||
}, | ||
copyAsync: function (from, to, options) { | ||
var normalizedOptions = normalizeOptions(options); | ||
return copy.async(resolvePath(from), resolvePath(to), normalizedOptions); | ||
}, | ||
dir: function (path, criteria) { | ||
var normalizedPath = resolvePath(path); | ||
dir.sync(normalizedPath, criteria); | ||
return cwd(normalizedPath); | ||
}, | ||
dirAsync: function (path, criteria) { | ||
var deferred = Q.defer(); | ||
var normalizedPath = resolvePath(path); | ||
dir.async(normalizedPath, criteria) | ||
.then(function () { | ||
deferred.resolve(cwd(normalizedPath)); | ||
}, deferred.reject); | ||
return deferred.promise; | ||
}, | ||
createWriteStream: function (path, options) { | ||
return streams.createWriteStream(resolvePath(path), options); | ||
}, | ||
createReadStream: function (path, options) { | ||
return streams.createReadStream(resolvePath(path), options); | ||
}, | ||
exists: function (path) { | ||
return exists.sync(resolvePath(path)); | ||
}, | ||
existsAsync: function (path) { | ||
return exists.async(resolvePath(path)); | ||
}, | ||
dir: function (path, criteria) { | ||
var normalizedPath = resolvePath(path); | ||
dir.sync(normalizedPath, criteria); | ||
return cwd(normalizedPath); | ||
}, | ||
dirAsync: function (path, criteria) { | ||
var deferred = Q.defer(); | ||
var normalizedPath = resolvePath(path); | ||
dir.async(normalizedPath, criteria) | ||
.then(function () { | ||
deferred.resolve(cwd(normalizedPath)); | ||
}, deferred.reject); | ||
return deferred.promise; | ||
}, | ||
file: function (path, criteria) { | ||
file.sync(resolvePath(path), criteria); | ||
return this; | ||
}, | ||
fileAsync: function (path, criteria) { | ||
var deferred = Q.defer(); | ||
var that = this; | ||
file.async(resolvePath(path), criteria) | ||
.then(function () { | ||
deferred.resolve(that); | ||
}, deferred.reject); | ||
return deferred.promise; | ||
}, | ||
exists: function (path) { | ||
return exists.sync(resolvePath(path)); | ||
}, | ||
existsAsync: function (path) { | ||
return exists.async(resolvePath(path)); | ||
}, | ||
find: function (startPath, options, returnAs) { | ||
options = normalizeOptions(options); | ||
return find.sync(resolvePath(startPath), options, returnAs); | ||
}, | ||
findAsync: function (startPath, options, returnAs) { | ||
options = normalizeOptions(options); | ||
return find.async(resolvePath(startPath), options, returnAs); | ||
}, | ||
file: function (path, criteria) { | ||
file.sync(resolvePath(path), criteria); | ||
return this; | ||
}, | ||
fileAsync: function (path, criteria) { | ||
var deferred = Q.defer(); | ||
var that = this; | ||
file.async(resolvePath(path), criteria) | ||
.then(function () { | ||
deferred.resolve(that); | ||
}, deferred.reject); | ||
return deferred.promise; | ||
}, | ||
inspect: function (path, fieldsToInclude) { | ||
return inspector.inspect(resolvePath(path), fieldsToInclude); | ||
}, | ||
inspectAsync: function (path, fieldsToInclude) { | ||
return inspector.inspectAsync(resolvePath(path), fieldsToInclude); | ||
}, | ||
find: function (startPath, options) { | ||
// startPath is optional parameter, if not specified move rest of params | ||
// to proper places and default startPath to CWD. | ||
if (typeof startPath !== 'string') { | ||
options = startPath; | ||
startPath = '.'; | ||
} | ||
return find.sync(resolvePath(startPath), normalizeOptions(options)); | ||
}, | ||
findAsync: function (startPath, options) { | ||
// startPath is optional parameter, if not specified move rest of params | ||
// to proper places and default startPath to CWD. | ||
if (typeof startPath !== 'string') { | ||
options = startPath; | ||
startPath = '.'; | ||
} | ||
return find.async(resolvePath(startPath), normalizeOptions(options)); | ||
}, | ||
inspectTree: function (path, options) { | ||
return inspector.tree(resolvePath(path), options); | ||
}, | ||
inspectTreeAsync: function (path, options) { | ||
return inspector.treeAsync(resolvePath(path), options); | ||
}, | ||
inspect: function (path, fieldsToInclude) { | ||
return inspector.inspect(resolvePath(path), fieldsToInclude); | ||
}, | ||
inspectAsync: function (path, fieldsToInclude) { | ||
return inspector.inspectAsync(resolvePath(path), fieldsToInclude); | ||
}, | ||
list: function (path, useInspect) { | ||
return inspector.list(resolvePath(path), useInspect); | ||
}, | ||
listAsync: function (path, useInspect) { | ||
return inspector.listAsync(resolvePath(path), useInspect); | ||
}, | ||
inspectTree: function (path, options) { | ||
return inspector.tree(resolvePath(path), options); | ||
}, | ||
inspectTreeAsync: function (path, options) { | ||
return inspector.treeAsync(resolvePath(path), options); | ||
}, | ||
move: function (from, to) { | ||
move.sync(resolvePath(from), resolvePath(to)); | ||
}, | ||
moveAsync: function (from, to) { | ||
return move.async(resolvePath(from), resolvePath(to)); | ||
}, | ||
list: function (path) { | ||
return inspector.list(resolvePath(path || '.')); | ||
}, | ||
listAsync: function (path) { | ||
return inspector.listAsync(resolvePath(path || '.')); | ||
}, | ||
read: function (path, returnAs) { | ||
return fileOps.read(resolvePath(path), returnAs); | ||
}, | ||
readAsync: function (path, returnAs) { | ||
return fileOps.readAsync(resolvePath(path), returnAs); | ||
}, | ||
move: function (from, to) { | ||
move.sync(resolvePath(from), resolvePath(to)); | ||
}, | ||
moveAsync: function (from, to) { | ||
return move.async(resolvePath(from), resolvePath(to)); | ||
}, | ||
remove: function (path) { | ||
remove.sync(resolvePath(path)); | ||
}, | ||
removeAsync: function (path) { | ||
return remove.async(resolvePath(path)); | ||
}, | ||
read: function (path, returnAs) { | ||
return fileOps.read(resolvePath(path), returnAs); | ||
}, | ||
readAsync: function (path, returnAs) { | ||
return fileOps.readAsync(resolvePath(path), returnAs); | ||
}, | ||
rename: function (path, newName) { | ||
path = resolvePath(path); | ||
var newPath = pathUtil.join(pathUtil.dirname(path), newName); | ||
move.sync(path, newPath); | ||
}, | ||
renameAsync: function (path, newName) { | ||
path = resolvePath(path); | ||
var newPath = pathUtil.join(pathUtil.dirname(path), newName); | ||
return move.async(path, newPath); | ||
}, | ||
remove: function (path) { | ||
// If path not specified defaults to CWD | ||
remove.sync(resolvePath(path || '.')); | ||
}, | ||
removeAsync: function (path) { | ||
// If path not specified defaults to CWD | ||
return remove.async(resolvePath(path || '.')); | ||
}, | ||
symlink: function (symlinkValue, path) { | ||
symlink.sync(symlinkValue, resolvePath(path)); | ||
}, | ||
symlinkAsync: function (symlinkValue, path) { | ||
return symlink.async(symlinkValue, resolvePath(path)); | ||
}, | ||
rename: function (path, newName) { | ||
var resolvedPath = resolvePath(path); | ||
var newPath = pathUtil.join(pathUtil.dirname(resolvedPath), newName); | ||
move.sync(resolvedPath, newPath); | ||
}, | ||
renameAsync: function (path, newName) { | ||
var resolvedPath = resolvePath(path); | ||
var newPath = pathUtil.join(pathUtil.dirname(resolvedPath), newName); | ||
return move.async(resolvedPath, newPath); | ||
}, | ||
write: function (path, data, options) { | ||
fileOps.write(resolvePath(path), data, options); | ||
}, | ||
writeAsync: function (path, data, options) { | ||
return fileOps.writeAsync(resolvePath(path), data, options); | ||
}, | ||
}; | ||
symlink: function (symlinkValue, path) { | ||
symlink.sync(symlinkValue, resolvePath(path)); | ||
}, | ||
symlinkAsync: function (symlinkValue, path) { | ||
return symlink.async(symlinkValue, resolvePath(path)); | ||
}, | ||
write: function (path, data, options) { | ||
fileOps.write(resolvePath(path), data, options); | ||
}, | ||
writeAsync: function (path, data, options) { | ||
return fileOps.writeAsync(resolvePath(path), data, options); | ||
} | ||
}; | ||
}; | ||
module.exports = jetpackContext; |
122
lib/move.js
@@ -1,2 +0,2 @@ | ||
"use strict"; | ||
'use strict'; | ||
@@ -10,5 +10,5 @@ var pathUtil = require('path'); | ||
var generateSourceDoesntExistError = function (path) { | ||
var err = new Error("Path to move doesn't exist " + path); | ||
err.code = 'ENOENT'; | ||
return err; | ||
var err = new Error("Path to move doesn't exist " + path); | ||
err.code = 'ENOENT'; | ||
return err; | ||
}; | ||
@@ -21,22 +21,22 @@ | ||
var sync = function (from, to) { | ||
try { | ||
try { | ||
fs.renameSync(from, to); | ||
} catch (err) { | ||
if (err.code !== 'ENOENT') { | ||
// We can't make sense of this error. Rethrow it. | ||
throw err; | ||
} else { | ||
// Ok, source or destination path doesn't exist. | ||
// Must do more investigation. | ||
if (!exists.sync(from)) { | ||
throw generateSourceDoesntExistError(from); | ||
} | ||
if (!exists.sync(to)) { | ||
var destDir = pathUtil.dirname(to); | ||
mkdirp.sync(destDir); | ||
// Retry the attempt | ||
fs.renameSync(from, to); | ||
} catch (err) { | ||
if (err.code !== 'ENOENT') { | ||
// We can't make sense of this error. Rethrow it. | ||
throw err; | ||
} else { | ||
// Ok, source or destination path doesn't exist. | ||
// Must do more investigation. | ||
if (!exists.sync(from)) { | ||
throw generateSourceDoesntExistError(from); | ||
} | ||
if (!exists.sync(to)) { | ||
var destDir = pathUtil.dirname(to); | ||
mkdirp.sync(destDir); | ||
// Retry the attempt | ||
fs.renameSync(from, to); | ||
} | ||
} | ||
} | ||
} | ||
} | ||
}; | ||
@@ -52,50 +52,50 @@ | ||
var ensureDestinationPathExistsAsync = function (to) { | ||
var deferred = Q.defer(); | ||
var deferred = Q.defer(); | ||
var destDir = pathUtil.dirname(to); | ||
exists.async(destDir) | ||
.then(function (dstExists) { | ||
if (!dstExists) { | ||
promisedMkdirp(destDir) | ||
.then(deferred.resolve, deferred.reject); | ||
} else { | ||
// Hah, no idea. | ||
deferred.reject(); | ||
} | ||
}) | ||
.catch(deferred.reject); | ||
var destDir = pathUtil.dirname(to); | ||
exists.async(destDir) | ||
.then(function (dstExists) { | ||
if (!dstExists) { | ||
promisedMkdirp(destDir) | ||
.then(deferred.resolve, deferred.reject); | ||
} else { | ||
// Hah, no idea. | ||
deferred.reject(); | ||
} | ||
}) | ||
.catch(deferred.reject); | ||
return deferred.promise; | ||
return deferred.promise; | ||
}; | ||
var async = function (from, to) { | ||
var deferred = Q.defer(); | ||
var deferred = Q.defer(); | ||
promisedRename(from, to) | ||
.then(deferred.resolve) | ||
.catch(function (err) { | ||
if (err.code !== 'ENOENT') { | ||
// Something unknown. Rethrow original error. | ||
deferred.reject(err); | ||
promisedRename(from, to) | ||
.then(deferred.resolve) | ||
.catch(function (err) { | ||
if (err.code !== 'ENOENT') { | ||
// Something unknown. Rethrow original error. | ||
deferred.reject(err); | ||
} else { | ||
// Ok, source or destination path doesn't exist. | ||
// Must do more investigation. | ||
exists.async(from) | ||
.then(function (srcExists) { | ||
if (!srcExists) { | ||
deferred.reject(generateSourceDoesntExistError(from)); | ||
} else { | ||
// Ok, source or destination path doesn't exist. | ||
// Must do more investigation. | ||
exists.async(from) | ||
.then(function (srcExists) { | ||
if (!srcExists) { | ||
deferred.reject(generateSourceDoesntExistError(from)); | ||
} else { | ||
ensureDestinationPathExistsAsync(to) | ||
.then(function () { | ||
// Retry the attempt | ||
return promisedRename(from, to); | ||
}) | ||
.then(deferred.resolve, deferred.reject); | ||
} | ||
}) | ||
.catch(deferred.reject); | ||
ensureDestinationPathExistsAsync(to) | ||
.then(function () { | ||
// Retry the attempt | ||
return promisedRename(from, to); | ||
}) | ||
.then(deferred.resolve, deferred.reject); | ||
} | ||
}); | ||
}) | ||
.catch(deferred.reject); | ||
} | ||
}); | ||
return deferred.promise; | ||
return deferred.promise; | ||
}; | ||
@@ -102,0 +102,0 @@ |
@@ -1,2 +0,2 @@ | ||
"use strict"; | ||
'use strict'; | ||
@@ -11,3 +11,3 @@ var Q = require('q'); | ||
var sync = function (path) { | ||
rimraf.sync(path); | ||
rimraf.sync(path); | ||
}; | ||
@@ -22,3 +22,3 @@ | ||
var async = function (path) { | ||
return qRimraf(path); | ||
return qRimraf(path); | ||
}; | ||
@@ -25,0 +25,0 @@ |
@@ -1,2 +0,2 @@ | ||
"use strict"; | ||
'use strict'; | ||
@@ -3,0 +3,0 @@ var fs = require('fs'); |
@@ -1,2 +0,2 @@ | ||
"use strict"; | ||
'use strict'; | ||
@@ -13,13 +13,13 @@ var Q = require('q'); | ||
var sync = function (symlinkValue, path) { | ||
try { | ||
fs.symlinkSync(symlinkValue, path); | ||
} catch (err) { | ||
if (err.code === 'ENOENT') { | ||
// Parent directories don't exist. Just create them and rety. | ||
mkdirp.sync(pathUtil.dirname(path)); | ||
fs.symlinkSync(symlinkValue, path); | ||
} else { | ||
throw err; | ||
} | ||
try { | ||
fs.symlinkSync(symlinkValue, path); | ||
} catch (err) { | ||
if (err.code === 'ENOENT') { | ||
// Parent directories don't exist. Just create them and rety. | ||
mkdirp.sync(pathUtil.dirname(path)); | ||
fs.symlinkSync(symlinkValue, path); | ||
} else { | ||
throw err; | ||
} | ||
} | ||
}; | ||
@@ -35,20 +35,20 @@ | ||
var async = function (symlinkValue, path) { | ||
var deferred = Q.defer(); | ||
var deferred = Q.defer(); | ||
promisedSymlink(symlinkValue, path) | ||
.then(deferred.resolve) | ||
.catch(function (err) { | ||
if (err.code === 'ENOENT') { | ||
// Parent directories don't exist. Just create them and rety. | ||
promisedMkdirp(pathUtil.dirname(path)) | ||
.then(function () { | ||
return promisedSymlink(symlinkValue, path); | ||
}) | ||
.then(deferred.resolve, deferred.reject); | ||
} else { | ||
deferred.reject(err); | ||
} | ||
}); | ||
promisedSymlink(symlinkValue, path) | ||
.then(deferred.resolve) | ||
.catch(function (err) { | ||
if (err.code === 'ENOENT') { | ||
// Parent directories don't exist. Just create them and rety. | ||
promisedMkdirp(pathUtil.dirname(path)) | ||
.then(function () { | ||
return promisedSymlink(symlinkValue, path); | ||
}) | ||
.then(deferred.resolve, deferred.reject); | ||
} else { | ||
deferred.reject(err); | ||
} | ||
}); | ||
return deferred.promise; | ||
return deferred.promise; | ||
}; | ||
@@ -55,0 +55,0 @@ |
// Matcher for glob patterns (e.g. *.txt, /a/b/**/z) | ||
"use strict"; | ||
'use strict'; | ||
@@ -8,81 +8,80 @@ var Minimatch = require('minimatch').Minimatch; | ||
var create = function (patterns, basePath) { | ||
if (typeof patterns === 'string') { | ||
patterns = [patterns]; | ||
} | ||
if (typeof patterns === 'string') { | ||
patterns = [patterns]; | ||
} | ||
// Convert patterns to absolute paths | ||
patterns = patterns.map(function (pattern) { | ||
var hasSlash = (pattern.indexOf('/') !== -1); | ||
// All patterns without slash are left as they are | ||
if (hasSlash) { | ||
// Maybe already is in the format we wanted | ||
var isAbsolute = /^!?\//.test(pattern); // Starts with '/' or '!/' | ||
if (!isAbsolute) { | ||
var isNegated = (pattern[0] === '!'); | ||
// Convert patterns to absolute paths | ||
patterns = patterns.map(function (pattern) { | ||
var hasSlash = (pattern.indexOf('/') !== -1); | ||
// All patterns without slash are left as they are | ||
if (hasSlash) { | ||
// Maybe already is in the format we wanted | ||
var isAbsolute = /^!?\//.test(pattern); // Starts with '/' or '!/' | ||
if (!isAbsolute) { | ||
var isNegated = (pattern[0] === '!'); | ||
// Remove starting characters which have meaning '!' and '.' | ||
// and first slash to normalize the path. | ||
if (isNegated) { | ||
pattern = pattern.substring(1); | ||
} | ||
if (pattern[0] === '.') { | ||
pattern = pattern.substring(1); | ||
} | ||
if (pattern[0] === '/') { | ||
pattern = pattern.substring(1); | ||
} | ||
// Remove starting characters which have meaning '!' and '.' | ||
// and first slash to normalize the path. | ||
if (isNegated) { | ||
pattern = pattern.substring(1); | ||
} | ||
if (pattern[0] === '.') { | ||
pattern = pattern.substring(1); | ||
} | ||
if (pattern[0] === '/') { | ||
pattern = pattern.substring(1); | ||
} | ||
// Finally construct ready pattern | ||
if (isNegated) { | ||
pattern = '!' + basePath + '/' + pattern; | ||
} else { | ||
pattern = basePath + '/' + pattern; | ||
} | ||
} | ||
// Finally construct ready pattern | ||
if (isNegated) { | ||
pattern = '!' + basePath + '/' + pattern; | ||
} else { | ||
pattern = basePath + '/' + pattern; | ||
} | ||
return pattern; | ||
}); | ||
} | ||
} | ||
return pattern; | ||
}); | ||
var matchers = patterns.map(function (pattern) { | ||
return new Minimatch(pattern, { | ||
matchBase: true, | ||
nocomment: true, | ||
dot: true, | ||
}); | ||
var matchers = patterns.map(function (pattern) { | ||
return new Minimatch(pattern, { | ||
matchBase: true, | ||
nocomment: true, | ||
dot: true | ||
}); | ||
}); | ||
var doMatch = function (path) { | ||
var mode = 'matching'; | ||
var weHaveMatch = false; | ||
var doMatch = function (path) { | ||
var mode = 'matching'; | ||
var weHaveMatch = false; | ||
for (var i = 0; i < matchers.length; i += 1) { | ||
var ma = matchers[i]; | ||
for (var i = 0; i < matchers.length; i += 1) { | ||
var ma = matchers[i]; | ||
if (ma.negate) { | ||
mode = 'negation'; | ||
if (i === 0) { | ||
// There are only negated patterns in the set, | ||
// so make everything match by default and | ||
// start to reject stuff. | ||
weHaveMatch = true; | ||
} | ||
} | ||
if (ma.negate) { | ||
mode = 'negation'; | ||
if (i === 0) { | ||
// There are only negated patterns in the set, | ||
// so make everything match by default and | ||
// start to reject stuff. | ||
weHaveMatch = true; | ||
} | ||
} | ||
if (mode === 'negation' && weHaveMatch && !ma.match(path)) { | ||
// One negation match is enought to know we can reject this one. | ||
return false; | ||
} | ||
if (mode === 'negation' && weHaveMatch && !ma.match(path)) { | ||
// One negation match is enought to know we can reject this one. | ||
return false; | ||
} | ||
if (mode === 'matching' && !weHaveMatch) { | ||
weHaveMatch = ma.match(path); | ||
} | ||
} | ||
if (mode === 'matching' && !weHaveMatch) { | ||
weHaveMatch = ma.match(path); | ||
} | ||
} | ||
return weHaveMatch; | ||
}; | ||
return weHaveMatch; | ||
}; | ||
return doMatch; | ||
return doMatch; | ||
}; | ||
module.exports.create = create; |
// Logic for unix file mode operations. | ||
"use strict"; | ||
'use strict'; | ||
// Converts mode to string 3 characters long. | ||
module.exports.normalizeFileMode = function (rawMode) { | ||
if (typeof rawMode === 'number') { | ||
rawMode = rawMode.toString(8); | ||
} | ||
return rawMode.substring(rawMode.length - 3); | ||
if (typeof rawMode === 'number') { | ||
rawMode = rawMode.toString(8); | ||
} | ||
return rawMode.substring(rawMode.length - 3); | ||
}; |
@@ -1,2 +0,2 @@ | ||
"use strict"; | ||
'use strict'; | ||
@@ -3,0 +3,0 @@ var jetpack = require('./lib/jetpack'); |
{ | ||
"name": "fs-jetpack", | ||
"description": "Better file system API", | ||
"version": "0.7.3", | ||
"version": "0.8.0", | ||
"author": "Jakub Szwacz <jakub@szwacz.com>", | ||
@@ -13,3 +13,4 @@ "dependencies": { | ||
"devDependencies": { | ||
"eslint": "^1.6.0", | ||
"eslint": "^2.6.0", | ||
"eslint-config-airbnb": "^6.2.0", | ||
"fs-extra": "^0.16.3", | ||
@@ -16,0 +17,0 @@ "jasmine": "^2.2.1", |
@@ -321,15 +321,13 @@ fs-jetpack [![Build Status](https://travis-ci.org/szwacz/fs-jetpack.svg?branch=master)](https://travis-ci.org/szwacz/fs-jetpack) [![Build status](https://ci.appveyor.com/api/projects/status/er206e91fpuuqf58?svg=true)](https://ci.appveyor.com/project/szwacz/fs-jetpack) | ||
## <a name="find"></a> find(path, searchOptions, [returnAs]) | ||
asynchronous: **findAsync(path, searchOptions, [returnAs])** | ||
## <a name="find"></a> find([path], searchOptions) | ||
asynchronous: **findAsync([path], searchOptions)** | ||
Finds in directory specified by `path` all files fulfilling `searchOptions`. | ||
Finds in directory specified by `path` all files fulfilling `searchOptions`. Returned paths are relative to current CWD of jetpack instance. | ||
**parameters:** | ||
`path` path to start search in (all subdirectories will be searched). | ||
`path` (optional, defaults to `'.'`) path to start search in (all subdirectories will be searched). | ||
`searchOptions` is an `Object` with possible fields: | ||
* `matching` glob patterns of files you would like to find. | ||
`returnAs` (optional) how the results should be returned. Could be one of: | ||
* `'absolutePath'` (default) returns array of absolute paths. | ||
* `'relativePath'` returns array of relative paths. The paths are relative to `path` you started search in, not to CWD. | ||
* `'inspect'` returns array of objects like you called [inspect](#inspect) on every of those files. | ||
* `files` (default `true`) whether or not should search for files. | ||
* `directories` (default `false`) whether or not should search for directories. | ||
@@ -341,11 +339,14 @@ **returns:** | ||
```javascript | ||
// Finds all files or directories which has 2015 in the name | ||
// Finds all files which has 2015 in the name | ||
jetpack.find('my-work', { matching: '*2015*' }); | ||
// Finds all .js files inside 'my-project' but with exclusion of 'vendor' directory. | ||
// Finds all .js files inside 'my-project' but excluding those in 'vendor' subtree. | ||
jetpack.find('my-project', { matching: ['*.js', '!vendor/**/*'] }); | ||
// Finds all jpg and png files and gives you back the list of inspect objects | ||
// (like you called jetpack.inspect on every of those paths) | ||
jetpack.find('my-work', { matching: ['*.jpg', '*.png'] }, 'inspect'); | ||
// Looks for all directories named 'foo' (and will omit all files named 'foo'). | ||
jetpack.find('my-work', { matching: ['foo'], files: false, directories: true }); | ||
// Path parameter might be omitted and CWD is used as path in that case. | ||
var myStuffDir = jetpack.cwd('my-stuff'); | ||
myStuffDir.find({ matching: ['*.md'] }); | ||
``` | ||
@@ -430,16 +431,12 @@ | ||
## <a name="list"></a> list(path, [useInspect]) | ||
## <a name="list"></a> list([path]) | ||
asynchronous: **listAsync(path, [useInspect])** | ||
Lists the contents of directory. | ||
Lists the contents of directory. Equivalent of `fs.readdir`. | ||
**parameters:** | ||
`path` path to directory you would like to list. | ||
`useInspect` (optional) the type of data this call should return. Possible values: | ||
* `false` (default) returns just a list of filenames (the same as `fs.readdir`) | ||
* `true` performs [inspect](#inspect) on every item in directory, and returns array of those objects | ||
* `object` if object has been passed to this parameter, it is treated as `options` parameter for [inspect](#inspect) method, and will alter returned inspect objects | ||
`path` (optional) path to directory you would like to list. If not specified defaults to CWD. | ||
**returns:** | ||
`Array` of strings or objects depending on call properies. Or `null` if given path doesn't exist. | ||
Array of file names inside given path, or `null` if given path doesn't exist. | ||
@@ -487,3 +484,4 @@ | ||
* `'utf8'` (default) content will be returned as UTF-8 String. | ||
* `'buf'` content will be returned as Buffer. | ||
* `'buffer'` content will be returned as a Buffer. | ||
* `'buf'` **deprecated** use `'buffer'` instead. | ||
* `'json'` content will be returned as parsed JSON object. | ||
@@ -496,4 +494,4 @@ * `'jsonWithDates'` content will be returned as parsed JSON object, and date strings in [ISO format](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) will be automatically turned into Date objects. | ||
## <a name="remove"></a> remove(path) | ||
asynchronous: **removeAsync(path)** | ||
## <a name="remove"></a> remove([path]) | ||
asynchronous: **removeAsync([path])** | ||
@@ -503,3 +501,3 @@ Deletes given path, no matter what it is (file or directory). If path already doesn't exist ends without throwing, so you can use it as 'ensure path doesn't exist'. | ||
**parameters:** | ||
`path` path to file or directory you want to remove. | ||
`path` (optional) path to file or directory you want to remove. If not specified the remove action will be performed on current working directory (CWD). | ||
@@ -516,2 +514,7 @@ **returns:** | ||
jetpack.remove('my_work/important_stuff'); | ||
// Remove can be called with no parameters and will default to CWD then. | ||
// In this example folder 'my_work' will cease to exist. | ||
var myStuffDir = jetpack.cwd('my_stuff'); | ||
myStuffDir.remove(); | ||
``` | ||
@@ -553,3 +556,3 @@ | ||
`path` path to file. | ||
`content` data to be written. This could be `String`, `Buffer`, `Object` or `Array` (if last two used, the data will be outputed into file as JSON). | ||
`data` data to be written. This could be `String`, `Buffer`, `Object` or `Array` (if last two used, the data will be outputted into file as JSON). | ||
`options` (optional) `Object` with possible fields: | ||
@@ -556,0 +559,0 @@ * `atomic` (default `false`) if set to `true` the file will be written using strategy which is much more resistant to data loss. The trick is very simple, [read this to get the concept](http://stackoverflow.com/questions/17047994/transactionally-writing-files-in-node-js). |
/* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
describe('append |', function () { | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
it('appends String to file', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.writeFileSync('file.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('file.txt').toBeFileWithContent('abcxyz'); | ||
}; | ||
it('appends String to file', function (done) { | ||
// SYNC | ||
preparations(); | ||
jetpack.append('file.txt', 'xyz'); | ||
expectations(); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.writeFileSync('file.txt', 'abc'); | ||
}; | ||
// ASYNC | ||
preparations(); | ||
jetpack.appendAsync('file.txt', 'xyz') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
var expectations = function () { | ||
expect('file.txt').toBeFileWithContent('abcxyz'); | ||
}; | ||
it('appends Buffer to file', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.writeFileSync('file.txt', new Buffer([11])); | ||
}; | ||
var expectations = function () { | ||
var buf = fse.readFileSync('file.txt'); | ||
expect(buf[0]).toBe(11); | ||
expect(buf[1]).toBe(22); | ||
expect(buf.length).toBe(2); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.append('file.txt', 'xyz'); | ||
expectations(); | ||
// SYNC | ||
preparations(); | ||
jetpack.append('file.txt', new Buffer([22])); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.appendAsync('file.txt', 'xyz') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.appendAsync('file.txt', new Buffer([22])) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it('appends Buffer to file', function (done) { | ||
it("if file doesn't exist creates it", function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect('file.txt').toBeFileWithContent('xyz'); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.writeFileSync('file.txt', new Buffer([11])); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.append('file.txt', 'xyz'); | ||
expectations(); | ||
var expectations = function () { | ||
var buf = fse.readFileSync('file.txt'); | ||
expect(buf[0]).toBe(11); | ||
expect(buf[1]).toBe(22); | ||
expect(buf.length).toBe(2); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.append('file.txt', new Buffer([22])); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.appendAsync('file.txt', new Buffer([22])) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.appendAsync('file.txt', 'xyz') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("if file doesn't exist creates it", function (done) { | ||
it("if parent directory doesn't exist creates it as well", function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect('dir/dir/file.txt').toBeFileWithContent('xyz'); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.append('dir/dir/file.txt', 'xyz'); | ||
expectations(); | ||
var expectations = function () { | ||
expect('file.txt').toBeFileWithContent('xyz'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.append('file.txt', 'xyz'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.appendAsync('file.txt', 'xyz') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.appendAsync('dir/dir/file.txt', 'xyz') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("if parent directory doesn't exist creates it as well", function (done) { | ||
it('respects internal CWD of jetpack instance', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('a/b.txt').toBeFileWithContent('abcxyz'); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var jetContext = jetpack.cwd('a'); | ||
var expectations = function () { | ||
expect('dir/dir/file.txt').toBeFileWithContent('xyz'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetContext.append('b.txt', 'xyz'); | ||
expectations(); | ||
// SYNC | ||
preparations(); | ||
jetpack.append('dir/dir/file.txt', 'xyz'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.appendAsync('dir/dir/file.txt', 'xyz') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetContext.appendAsync('b.txt', 'xyz') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("respects internal CWD of jetpack instance", function (done) { | ||
describe('*nix specyfic |', function () { | ||
if (process.platform === 'win32') { | ||
return; | ||
} | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b.txt', 'abc'); | ||
}; | ||
it('sets file mode on created file', function (done) { | ||
var expectations = function () { | ||
expect('file.txt').toHaveMode('711'); | ||
}; | ||
var expectations = function () { | ||
expect('a/b.txt').toBeFileWithContent('abcxyz'); | ||
}; | ||
// SYNC | ||
jetpack.append('file.txt', 'abc', { mode: '711' }); | ||
expectations(); | ||
var jetContext = jetpack.cwd('a'); | ||
helper.clearWorkingDir(); | ||
// SYNC | ||
preparations(); | ||
jetContext.append('b.txt', 'xyz'); | ||
// AYNC | ||
jetpack.appendAsync('file.txt', 'abc', { mode: '711' }) | ||
.then(function () { | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetContext.appendAsync('b.txt', 'xyz') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
done(); | ||
}); | ||
}); | ||
describe('*nix specyfic |', function () { | ||
if (process.platform === 'win32') { | ||
return; | ||
} | ||
it('sets file mode on created file', function (done) { | ||
var expectations = function () { | ||
expect('file.txt').toHaveMode('711'); | ||
}; | ||
// SYNC | ||
jetpack.append('file.txt', 'abc', { mode: '711' }); | ||
expectations(); | ||
helper.clearWorkingDir(); | ||
// AYNC | ||
jetpack.appendAsync('file.txt', 'abc', { mode: '711' }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
}); | ||
}); |
/* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
describe('copy |', function () { | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
it('copies a file', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('file.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('file.txt').toBeFileWithContent('abc'); | ||
expect('file_1.txt').toBeFileWithContent('abc'); | ||
}; | ||
it("copies a file", function (done) { | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('file.txt', 'file_1.txt'); | ||
expectations(); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('file.txt', 'abc'); | ||
}; | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('file.txt', 'file_1.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
var expectations = function () { | ||
expect('file.txt').toBeFileWithContent('abc'); | ||
expect('file_1.txt').toBeFileWithContent('abc'); | ||
}; | ||
it('can copy file to nonexistent directory (will create directory)', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('file.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('file.txt').toBeFileWithContent('abc'); | ||
expect('dir/dir/file.txt').toBeFileWithContent('abc'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('file.txt', 'file_1.txt'); | ||
expectations(); | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('file.txt', 'dir/dir/file.txt'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('file.txt', 'file_1.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('file.txt', 'dir/dir/file.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("can copy file to nonexistent directory (will create directory)", function (done) { | ||
it('copies empty directory', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirsSync('dir'); | ||
}; | ||
var expectations = function () { | ||
expect('a/dir').toBeDirectory(); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('file.txt', 'abc'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('dir', 'a/dir'); | ||
expectations(); | ||
var expectations = function () { | ||
expect('file.txt').toBeFileWithContent('abc'); | ||
expect('dir/dir/file.txt').toBeFileWithContent('abc'); | ||
}; | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('dir', 'a/dir') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('file.txt', 'dir/dir/file.txt'); | ||
expectations(); | ||
it('copies a tree of files', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/f1.txt', 'abc'); | ||
fse.outputFileSync('a/b/f2.txt', '123'); | ||
fse.mkdirsSync('a/b/c'); | ||
}; | ||
var expectations = function () { | ||
expect('dir/a/f1.txt').toBeFileWithContent('abc'); | ||
expect('dir/a/b/c').toBeDirectory(); | ||
expect('dir/a/b/f2.txt').toBeFileWithContent('123'); | ||
}; | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('file.txt', 'dir/dir/file.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('a', 'dir/a'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('a', 'dir/a') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("copies empty directory", function (done) { | ||
it("generates nice error if source path doesn't exist", function (done) { | ||
var expectations = function (err) { | ||
expect(err.code).toBe('ENOENT'); | ||
expect(err.message).toMatch(/^Path to copy doesn't exist/); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirsSync('dir'); | ||
}; | ||
// SYNC | ||
try { | ||
jetpack.copy('a', 'b'); | ||
throw new Error('to make sure this code throws'); | ||
} catch (err) { | ||
expectations(err); | ||
} | ||
var expectations = function () { | ||
expect('a/dir').toBeDirectory(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('dir', 'a/dir'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('dir', 'a/dir') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.copyAsync('a', 'b') | ||
.catch(function (err) { | ||
expectations(err); | ||
done(); | ||
}); | ||
}); | ||
it("copies a tree of files", function (done) { | ||
it('respects internal CWD of jetpack instance', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('a/b.txt').toBeFileWithContent('abc'); | ||
expect('a/x.txt').toBeFileWithContent('abc'); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/f1.txt', 'abc'); | ||
fse.outputFileSync('a/b/f2.txt', '123'); | ||
fse.mkdirsSync('a/b/c'); | ||
}; | ||
var jetContext = jetpack.cwd('a'); | ||
var expectations = function () { | ||
expect('dir/a/f1.txt').toBeFileWithContent('abc'); | ||
expect('dir/a/b/c').toBeDirectory(); | ||
expect('dir/a/b/f2.txt').toBeFileWithContent('123'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetContext.copy('b.txt', 'x.txt'); | ||
expectations(); | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('a', 'dir/a'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('a', 'dir/a') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetContext.copyAsync('b.txt', 'x.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("generates nice error if source path doesn't exist", function (done) { | ||
describe('overwriting behaviour', function () { | ||
it('does not overwrite by default', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/file.txt', 'abc'); | ||
fse.mkdirsSync('b'); | ||
}; | ||
var expectations = function (err) { | ||
expect(err.code).toBe('EEXIST'); | ||
expect(err.message).toMatch(/^Destination path already exists/); | ||
}; | ||
var expectations = function (err) { | ||
expect(err.code).toBe('ENOENT'); | ||
expect(err.message).toMatch(/^Path to copy doesn't exist/); | ||
}; | ||
// SYNC | ||
preparations(); | ||
try { | ||
jetpack.copy('a', 'b'); | ||
throw new Error('to make sure this code throws'); | ||
} catch (err) { | ||
expectations(err); | ||
} | ||
// SYNC | ||
try { | ||
jetpack.copy('a', 'b'); | ||
throw new Error("to make sure this code throws"); | ||
} catch (err) { | ||
expectations(err); | ||
} | ||
// ASYNC | ||
jetpack.copyAsync('a', 'b') | ||
.catch(function (err) { | ||
expectations(err); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('a', 'b') | ||
.catch(function (err) { | ||
expectations(err); | ||
done(); | ||
}); | ||
}); | ||
it("respects internal CWD of jetpack instance", function (done) { | ||
it('overwrites if it was specified', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/file.txt', 'abc'); | ||
fse.outputFileSync('b/file.txt', 'xyz'); | ||
}; | ||
var expectations = function () { | ||
expect('a/file.txt').toBeFileWithContent('abc'); | ||
expect('b/file.txt').toBeFileWithContent('abc'); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b.txt', 'abc'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('a', 'b', { overwrite: true }); | ||
expectations(); | ||
var expectations = function () { | ||
expect('a/b.txt').toBeFileWithContent('abc'); | ||
expect('a/x.txt').toBeFileWithContent('abc'); | ||
}; | ||
var jetContext = jetpack.cwd('a'); | ||
// SYNC | ||
preparations(); | ||
jetContext.copy('b.txt', 'x.txt'); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('a', 'b', { overwrite: true }) | ||
.then(function () { | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetContext.copyAsync('b.txt', 'x.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
describe('overwriting behaviour', function () { | ||
describe('filter what to copy |', function () { | ||
it('by simple pattern', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('dir/file.txt', '1'); | ||
fse.outputFileSync('dir/file.md', 'm1'); | ||
fse.outputFileSync('dir/a/file.txt', '2'); | ||
fse.outputFileSync('dir/a/file.md', 'm2'); | ||
fse.outputFileSync('dir/a/b/file.txt', '3'); | ||
fse.outputFileSync('dir/a/b/file.md', 'm3'); | ||
}; | ||
var expectations = function () { | ||
expect('copy/file.txt').toBeFileWithContent('1'); | ||
expect('copy/file.md').not.toExist(); | ||
expect('copy/a/file.txt').toBeFileWithContent('2'); | ||
expect('copy/a/file.md').not.toExist(); | ||
expect('copy/a/b/file.txt').toBeFileWithContent('3'); | ||
expect('copy/a/b/file.md').not.toExist(); | ||
}; | ||
it("does not overwrite by default", function (done) { | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('dir', 'copy', { matching: '*.txt' }); | ||
expectations(); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/file.txt', 'abc'); | ||
fse.mkdirsSync('b'); | ||
}; | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('dir', 'copy', { matching: '*.txt' }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
var expectations = function (err) { | ||
expect(err.code).toBe('EEXIST'); | ||
expect(err.message).toMatch(/^Destination path already exists/); | ||
}; | ||
it('by pattern anchored to copied directory', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('x/y/dir/file.txt', '1'); | ||
fse.outputFileSync('x/y/dir/a/file.txt', '2'); | ||
fse.outputFileSync('x/y/dir/a/b/file.txt', '3'); | ||
}; | ||
var expectations = function () { | ||
expect('copy/file.txt').not.toExist(); | ||
expect('copy/a/file.txt').toBeFileWithContent('2'); | ||
expect('copy/a/b/file.txt').not.toExist(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
try { | ||
jetpack.copy('a', 'b'); | ||
throw new Error("to make sure this code throws"); | ||
} catch (err) { | ||
expectations(err); | ||
} | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('x/y/dir', 'copy', { matching: 'a/*.txt' }); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('a', 'b') | ||
.catch(function (err) { | ||
expectations(err); | ||
done(); | ||
}); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('x/y/dir', 'copy', { matching: 'a/*.txt' }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("overwrites if it was specified", function (done) { | ||
it('can use ./ as indication of anchor directory', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('x/y/a.txt', '123'); | ||
fse.outputFileSync('x/y/b/a.txt', '456'); | ||
}; | ||
var expectations = function () { | ||
expect('copy/a.txt').toExist(); | ||
expect('copy/b/a.txt').not.toExist(); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/file.txt', 'abc'); | ||
fse.outputFileSync('b/file.txt', 'xyz'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('x/y', 'copy', { matching: './a.txt' }); | ||
expectations(); | ||
var expectations = function () { | ||
expect('a/file.txt').toBeFileWithContent('abc'); | ||
expect('b/file.txt').toBeFileWithContent('abc'); | ||
}; | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('x/y', 'copy', { matching: './a.txt' }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('a', 'b', { overwrite: true }); | ||
expectations(); | ||
it('matching works also if copying single file', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a', '123'); | ||
fse.outputFileSync('x', '456'); | ||
}; | ||
var expectations = function () { | ||
expect('a-copy').not.toExist(); | ||
expect('x-copy').toExist(); | ||
}; | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('a', 'b', { overwrite: true }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('a', 'a-copy', { matching: 'x' }); | ||
jetpack.copy('x', 'x-copy', { matching: 'x' }); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('a', 'a-copy', { matching: 'x' }) | ||
.then(function () { | ||
return jetpack.copyAsync('x', 'x-copy', { matching: 'x' }); | ||
}) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
describe('filter what to copy |', function () { | ||
it('can use negation in patterns', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirsSync('x/y/dir/a/b'); | ||
fse.mkdirsSync('x/y/dir/a/x'); | ||
fse.mkdirsSync('x/y/dir/a/y'); | ||
fse.mkdirsSync('x/y/dir/a/z'); | ||
}; | ||
var expectations = function () { | ||
expect('copy/dir/a/b').toBeDirectory(); | ||
expect('copy/dir/a/x').not.toExist(); | ||
expect('copy/dir/a/y').not.toExist(); | ||
expect('copy/dir/a/z').not.toExist(); | ||
}; | ||
it("by simple pattern", function (done) { | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('x/y', 'copy', { | ||
matching: [ | ||
'**', | ||
// Three different pattern types to test: | ||
'!x', | ||
'!dir/a/y', | ||
'!./dir/a/z' | ||
] | ||
}); | ||
expectations(); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('dir/file.txt', '1'); | ||
fse.outputFileSync('dir/file.md', 'm1'); | ||
fse.outputFileSync('dir/a/file.txt', '2'); | ||
fse.outputFileSync('dir/a/file.md', 'm2'); | ||
fse.outputFileSync('dir/a/b/file.txt', '3'); | ||
fse.outputFileSync('dir/a/b/file.md', 'm3'); | ||
}; | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('x/y', 'copy', { | ||
matching: [ | ||
'**', | ||
// Three different pattern types to test: | ||
'!x', | ||
'!dir/a/y', | ||
'!./dir/a/z' | ||
] | ||
}) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
var expectations = function () { | ||
expect('copy/file.txt').toBeFileWithContent('1'); | ||
expect('copy/file.md').not.toExist(); | ||
expect('copy/a/file.txt').toBeFileWithContent('2'); | ||
expect('copy/a/file.md').not.toExist(); | ||
expect('copy/a/b/file.txt').toBeFileWithContent('3'); | ||
expect('copy/a/b/file.md').not.toExist(); | ||
}; | ||
it('wildcard copies everything', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
// Just a file | ||
fse.outputFileSync('x/file.txt', '123'); | ||
// Dot file | ||
fse.outputFileSync('x/y/.dot', 'dot'); | ||
// Empty directory | ||
fse.mkdirsSync('x/y/z'); | ||
}; | ||
var expectations = function () { | ||
expect('copy/file.txt').toBeFileWithContent('123'); | ||
expect('copy/y/.dot').toBeFileWithContent('dot'); | ||
expect('copy/y/z').toBeDirectory(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('dir', 'copy', { matching: '*.txt' }); | ||
expectations(); | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('x', 'copy', { matching: '**' }); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('dir', 'copy', { matching: '*.txt' }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('x', 'copy', { matching: '**' }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
it("by pattern anchored to copied directory", function (done) { | ||
describe('*nix specific |', function () { | ||
if (process.platform === 'win32') { | ||
return; | ||
} | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('x/y/dir/file.txt', '1'); | ||
fse.outputFileSync('x/y/dir/a/file.txt', '2'); | ||
fse.outputFileSync('x/y/dir/a/b/file.txt', '3'); | ||
}; | ||
it('copies also file permissions', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b/c.txt', 'abc'); | ||
fse.chmodSync('a/b', '700'); | ||
fse.chmodSync('a/b/c.txt', '711'); | ||
}; | ||
var expectations = function () { | ||
expect('x/b').toHaveMode('700'); | ||
expect('x/b/c.txt').toHaveMode('711'); | ||
}; | ||
var expectations = function () { | ||
expect('copy/file.txt').not.toExist(); | ||
expect('copy/a/file.txt').toBeFileWithContent('2'); | ||
expect('copy/a/b/file.txt').not.toExist(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('a', 'x'); | ||
expectations(); | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('x/y/dir', 'copy', { matching: 'a/*.txt' }); | ||
expectations(); | ||
// AYNC | ||
preparations(); | ||
jetpack.copyAsync('a', 'x') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('x/y/dir', 'copy', { matching: 'a/*.txt' }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it('can copy symlink', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirsSync('to_copy'); | ||
fse.symlinkSync('some/file', 'to_copy/symlink'); | ||
}; | ||
var expectations = function () { | ||
expect(fse.lstatSync('copied/symlink').isSymbolicLink()).toBe(true); | ||
expect(fse.readlinkSync('copied/symlink')).toBe('some/file'); | ||
}; | ||
it("can use ./ as indication of anchor directory", function (done) { | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('to_copy', 'copied'); | ||
expectations(); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('x/y/a.txt', '123'); | ||
fse.outputFileSync('x/y/b/a.txt', '456'); | ||
}; | ||
var expectations = function () { | ||
expect('copy/a.txt').toExist(); | ||
expect('copy/b/a.txt').not.toExist(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('x/y', 'copy', { matching: './a.txt' }); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('x/y', 'copy', { matching: './a.txt' }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("matching works also if copying single file", function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a', '123'); | ||
fse.outputFileSync('x', '456'); | ||
}; | ||
var expectations = function () { | ||
expect('a-copy').not.toExist(); | ||
expect('x-copy').toExist(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('a', 'a-copy', { matching: 'x' }); | ||
jetpack.copy('x', 'x-copy', { matching: 'x' }); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('a', 'a-copy', { matching: 'x' }) | ||
.then(function () { | ||
return jetpack.copyAsync('x', 'x-copy', { matching: 'x' }); | ||
}) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it('can use negation in patterns', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirsSync('x/y/dir/a/b'); | ||
fse.mkdirsSync('x/y/dir/a/x'); | ||
fse.mkdirsSync('x/y/dir/a/y'); | ||
fse.mkdirsSync('x/y/dir/a/z'); | ||
}; | ||
var expectations = function () { | ||
expect('copy/dir/a/b').toBeDirectory(); | ||
expect('copy/dir/a/x').not.toExist(); | ||
expect('copy/dir/a/y').not.toExist(); | ||
expect('copy/dir/a/z').not.toExist(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('x/y', 'copy', { | ||
matching: [ | ||
'**', | ||
// Three different pattern types to test: | ||
'!x', | ||
'!dir/a/y', | ||
'!./dir/a/z', | ||
], | ||
}); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('x/y', 'copy', { | ||
matching: [ | ||
'**', | ||
// Three different pattern types to test: | ||
'!x', | ||
'!dir/a/y', | ||
'!./dir/a/z', | ||
], | ||
}) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("wildcard copies everything", function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
// Just a file | ||
fse.outputFileSync('x/file.txt', '123'); | ||
// Dot file | ||
fse.outputFileSync('x/y/.dot', 'dot'); | ||
// Empty directory | ||
fse.mkdirsSync('x/y/z'); | ||
}; | ||
var expectations = function () { | ||
expect('copy/file.txt').toBeFileWithContent('123'); | ||
expect('copy/y/.dot').toBeFileWithContent('dot'); | ||
expect('copy/y/z').toBeDirectory(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('x', 'copy', { matching: '**' }); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('x', 'copy', { matching: '**' }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('to_copy', 'copied') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
describe('*nix specific |', function () { | ||
it('can overwrite symlink', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirsSync('to_copy'); | ||
fse.symlinkSync('some/file', 'to_copy/symlink'); | ||
fse.mkdirsSync('copied'); | ||
fse.symlinkSync('some/other_file', 'copied/symlink'); | ||
}; | ||
var expectations = function () { | ||
expect(fse.lstatSync('copied/symlink').isSymbolicLink()).toBe(true); | ||
expect(fse.readlinkSync('copied/symlink')).toBe('some/file'); | ||
}; | ||
if (process.platform === 'win32') { | ||
return; | ||
} | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('to_copy', 'copied', { overwrite: true }); | ||
expectations(); | ||
it('copies also file permissions', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b/c.txt', 'abc'); | ||
fse.chmodSync('a/b', '700'); | ||
fse.chmodSync('a/b/c.txt', '711'); | ||
}; | ||
var expectations = function () { | ||
expect('x/b').toHaveMode('700'); | ||
expect('x/b/c.txt').toHaveMode('711'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('a', 'x'); | ||
expectations(); | ||
// AYNC | ||
preparations(); | ||
jetpack.copyAsync('a', 'x') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it('can copy symlink', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirsSync('to_copy'); | ||
fse.symlinkSync('some/file', 'to_copy/symlink'); | ||
}; | ||
var expectations = function () { | ||
expect(fse.lstatSync('copied/symlink').isSymbolicLink()).toBe(true); | ||
expect(fse.readlinkSync('copied/symlink')).toBe('some/file'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('to_copy', 'copied'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('to_copy', 'copied') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it('can overwrite symlink', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirsSync('to_copy'); | ||
fse.symlinkSync('some/file', 'to_copy/symlink'); | ||
fse.mkdirsSync('copied'); | ||
fse.symlinkSync('some/other_file', 'copied/symlink'); | ||
}; | ||
var expectations = function () { | ||
expect(fse.lstatSync('copied/symlink').isSymbolicLink()).toBe(true); | ||
expect(fse.readlinkSync('copied/symlink')).toBe('some/file'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.copy('to_copy', 'copied', { overwrite: true }); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('to_copy', 'copied', { overwrite: true }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.copyAsync('to_copy', 'copied', { overwrite: true }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
}); |
/* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
describe('cwd', function () { | ||
var pathUtil = require('path'); | ||
var jetpack = require('..'); | ||
var pathUtil = require('path'); | ||
var jetpack = require('..'); | ||
it('returns the same path as process.cwd for main instance of jetpack', function () { | ||
expect(jetpack.cwd()).toBe(process.cwd()); | ||
}); | ||
it('returns the same path as process.cwd for main instance of jetpack', function () { | ||
expect(jetpack.cwd()).toBe(process.cwd()); | ||
}); | ||
it('can create new context with different cwd', function () { | ||
var jetCwd = jetpack.cwd('/'); // absolute path | ||
expect(jetCwd.cwd()).toBe(pathUtil.resolve(process.cwd(), '/')); | ||
it('can create new context with different cwd', function () { | ||
var jetCwd = jetpack.cwd('/'); // absolute path | ||
expect(jetCwd.cwd()).toBe(pathUtil.resolve(process.cwd(), '/')); | ||
jetCwd = jetpack.cwd('../..'); // relative path | ||
expect(jetCwd.cwd()).toBe(pathUtil.resolve(process.cwd(), '../..')); | ||
jetCwd = jetpack.cwd('../..'); // relative path | ||
expect(jetCwd.cwd()).toBe(pathUtil.resolve(process.cwd(), '../..')); | ||
expect(jetpack.cwd()).toBe(process.cwd()); // cwd of main lib should be intact | ||
}); | ||
expect(jetpack.cwd()).toBe(process.cwd()); // cwd of main lib should be intact | ||
}); | ||
it('cwd contexts can be created recursively', function () { | ||
var jetCwd1; | ||
var jetCwd2; | ||
it('cwd contexts can be created recursively', function () { | ||
var jetCwd1, jetCwd2; | ||
jetCwd1 = jetpack.cwd('..'); | ||
expect(jetCwd1.cwd()).toBe(pathUtil.resolve(process.cwd(), '..')); | ||
jetCwd1 = jetpack.cwd('..'); | ||
expect(jetCwd1.cwd()).toBe(pathUtil.resolve(process.cwd(), '..')); | ||
jetCwd2 = jetCwd1.cwd('..'); | ||
expect(jetCwd2.cwd()).toBe(pathUtil.resolve(process.cwd(), '../..')); | ||
}); | ||
jetCwd2 = jetCwd1.cwd('..'); | ||
expect(jetCwd2.cwd()).toBe(pathUtil.resolve(process.cwd(), '../..')); | ||
}); | ||
it('cwd can join path parts', function () { | ||
var jetCwd = jetpack.cwd('a', 'b', 'c'); | ||
expect(jetCwd.cwd()).toBe(pathUtil.resolve(process.cwd(), 'a', 'b', 'c')); | ||
}); | ||
it('cwd can join path parts', function () { | ||
var jetCwd = jetpack.cwd('a', 'b', 'c'); | ||
expect(jetCwd.cwd()).toBe(pathUtil.resolve(process.cwd(), 'a', 'b', 'c')); | ||
}); | ||
}); |
/* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
describe('dir |', function () { | ||
var fse = require('fs-extra'); | ||
var pathUtil = require('path'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
var fse = require('fs-extra'); | ||
var pathUtil = require('path'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
describe('ensure dir exists |', function () { | ||
it("creates dir if it doesn't exist", function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect('x').toBeDirectory(); | ||
}; | ||
describe('ensure dir exists |', function () { | ||
// SYNC | ||
preparations(); | ||
jetpack.dir('x'); | ||
expectations(); | ||
it("creates dir if it doesn't exist", function (done) { | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('x') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
it('does nothing if dir already exists', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirsSync('x'); | ||
}; | ||
var expectations = function () { | ||
expect('x').toBeDirectory(); | ||
}; | ||
var expectations = function () { | ||
expect('x').toBeDirectory(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.dir('x'); | ||
expectations(); | ||
// SYNC | ||
preparations(); | ||
jetpack.dir('x'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('x') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('x') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it('creates nested directories if necessary', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect('a/b/c').toBeDirectory(); | ||
}; | ||
it('does nothing if dir already exists', function (done) { | ||
// SYNC | ||
preparations(); | ||
jetpack.dir('a/b/c'); | ||
expectations(); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirsSync('x'); | ||
}; | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('a/b/c') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
var expectations = function () { | ||
expect('x').toBeDirectory(); | ||
}; | ||
describe('ensures dir empty |', function () { | ||
it('not bothers about emptiness if not specified', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirsSync('a/b'); | ||
}; | ||
var expectations = function () { | ||
expect('a/b').toExist(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.dir('x'); | ||
expectations(); | ||
// SYNC | ||
preparations(); | ||
jetpack.dir('a'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('x') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('a') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it('creates nested directories if necessary', function (done) { | ||
it('makes dir empty', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b/file.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('a/b/file.txt').not.toExist(); | ||
expect('a').toExist(); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.dir('a', { empty: true }); | ||
expectations(); | ||
var expectations = function () { | ||
expect('a/b/c').toBeDirectory(); | ||
}; | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('a', { empty: true }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
// SYNC | ||
preparations(); | ||
jetpack.dir('a/b/c'); | ||
expectations(); | ||
it('if given path is file, deletes it and places dir instead', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('a').toBeDirectory(); | ||
}; | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('a/b/c') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// SYNC | ||
preparations(); | ||
jetpack.dir('a'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('a') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
describe('ensures dir empty |', function () { | ||
it('respects internal CWD of jetpack instance', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect('a/b').toBeDirectory(); | ||
}; | ||
it('not bothers about emptiness if not specified', function (done) { | ||
var jetContext = jetpack.cwd('a'); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirsSync('a/b'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetContext.dir('b'); | ||
expectations(); | ||
var expectations = function () { | ||
expect('a/b').toExist(); | ||
}; | ||
// ASYNC | ||
preparations(); | ||
jetContext.dirAsync('b') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// SYNC | ||
preparations(); | ||
jetpack.dir('a'); | ||
expectations(); | ||
it('returns jetack instance pointing on this directory', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function (jetpackContext) { | ||
expect(jetpackContext.cwd()).toBe(pathUtil.resolve('a')); | ||
}; | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('a') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// SYNC | ||
preparations(); | ||
expectations(jetpack.dir('a')); | ||
it('makes dir empty', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b/file.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('a/b/file.txt').not.toExist(); | ||
expect('a').toExist(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.dir('a', { empty: true }); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('a', { empty: true }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('a') | ||
.then(function (jetpackContext) { | ||
expectations(jetpackContext); | ||
done(); | ||
}); | ||
}); | ||
it('if given path is file, deletes it and places dir instead', function (done) { | ||
describe('windows specyfic |', function () { | ||
if (process.platform !== 'win32') { | ||
return; | ||
} | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a', 'abc'); | ||
}; | ||
it('specyfying mode have no effect, and throws no error', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect('x').toBeDirectory(); | ||
}; | ||
var expectations = function () { | ||
expect('a').toBeDirectory(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.dir('x', { mode: '511' }); | ||
expectations(); | ||
// SYNC | ||
preparations(); | ||
jetpack.dir('a'); | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('x', { mode: '511' }) | ||
.then(function () { | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('a') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
it("respects internal CWD of jetpack instance", function (done) { | ||
describe('*nix specyfic |', function () { | ||
if (process.platform === 'win32') { | ||
return; | ||
} | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
// Tests assume umask is not greater than 022 | ||
var expectations = function () { | ||
expect('a/b').toBeDirectory(); | ||
}; | ||
it('sets mode to newly created directory', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect('a').toHaveMode('511'); | ||
}; | ||
var jetContext = jetpack.cwd('a'); | ||
// SYNC | ||
// mode as a string | ||
preparations(); | ||
jetpack.dir('a', { mode: '511' }); | ||
expectations(); | ||
// SYNC | ||
preparations(); | ||
jetContext.dir('b'); | ||
// mode as a number | ||
preparations(); | ||
jetpack.dir('a', { mode: parseInt('511', 8) }); | ||
expectations(); | ||
// ASYNC | ||
// mode as a string | ||
preparations(); | ||
jetpack.dirAsync('a', { mode: '511' }) | ||
.then(function () { | ||
expectations(); | ||
// ASYNC | ||
// mode as a number | ||
preparations(); | ||
jetContext.dirAsync('b') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
return jetpack.dirAsync('a', { mode: parseInt('511', 8) }); | ||
}) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("returns jetack instance pointing on this directory", function (done) { | ||
it('sets that mode to every created directory', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect('a').toHaveMode('711'); | ||
expect('a/b').toHaveMode('711'); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.dir('a/b', { mode: '711' }); | ||
expectations(); | ||
var expectations = function (jetpackContext) { | ||
expect(jetpackContext.cwd()).toBe(pathUtil.resolve('a')); | ||
}; | ||
// SYNC | ||
preparations(); | ||
var jetpackContextSync = jetpack.dir('a'); | ||
expectations(jetpackContextSync); | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('a') | ||
.then(function (jetpackContextAsync) { | ||
expectations(jetpackContextAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('a/b', { mode: '711' }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
describe('windows specyfic |', function () { | ||
it('changes mode of existing directory to desired', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirSync('a', '777'); | ||
}; | ||
var expectations = function () { | ||
expect('a').toHaveMode('511'); | ||
}; | ||
if (process.platform !== 'win32') { | ||
return; | ||
} | ||
// SYNC | ||
preparations(); | ||
jetpack.dir('a', { mode: '511' }); | ||
expectations(); | ||
it('specyfying mode have no effect, and throws no error', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect('x').toBeDirectory(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.dir('x', { mode: '511' }); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('x', { mode: '511' }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('a', { mode: '511' }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
describe('*nix specyfic |', function () { | ||
it('leaves mode of directory intact if this option was not specified', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirSync('a', '700'); | ||
}; | ||
var expectations = function () { | ||
expect('a').toHaveMode('700'); | ||
}; | ||
if (process.platform === 'win32') { | ||
return; | ||
} | ||
// SYNC | ||
preparations(); | ||
jetpack.dir('a'); | ||
expectations(); | ||
// Tests assume umask is not greater than 022 | ||
it('sets mode to newly created directory', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect('a').toHaveMode('511'); | ||
}; | ||
// SYNC | ||
// mode as string | ||
preparations(); | ||
jetpack.dir('a', { mode: '511' }); | ||
expectations(); | ||
// mode as number | ||
preparations(); | ||
jetpack.dir('a', { mode: parseInt('511', 8) }); | ||
expectations(); | ||
// ASYNC | ||
// mode as string | ||
preparations(); | ||
jetpack.dirAsync('a', { mode: '511' }) | ||
.then(function () { | ||
expectations(); | ||
// mode as number | ||
preparations(); | ||
return jetpack.dirAsync('a', { mode: parseInt('511', 8) }); | ||
}) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it('sets that mode to every created directory', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect('a').toHaveMode('711'); | ||
expect('a/b').toHaveMode('711'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.dir('a/b', { mode: '711' }); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('a/b', { mode: '711' }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it('changes mode of existing directory to desired', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirSync('a', '777'); | ||
}; | ||
var expectations = function () { | ||
expect('a').toHaveMode('511'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.dir('a', { mode: '511' }); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('a', { mode: '511' }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it('leaves mode of directory intact if this option was not specified', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirSync('a', '700'); | ||
}; | ||
var expectations = function () { | ||
expect('a').toHaveMode('700'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.dir('a'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('a') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.dirAsync('a') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
}); |
/* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
describe('exists', function () { | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
it("returns false if file doesn't exist", function (done) { | ||
// SYNC | ||
expect(jetpack.exists('file.txt')).toBe(false); | ||
it("returns false if file doesn't exist", function (done) { | ||
// SYNC | ||
var existsSync = jetpack.exists('file.txt'); | ||
expect(existsSync).toBe(false); | ||
// ASYNC | ||
jetpack.existsAsync('file.txt') | ||
.then(function (existsAsync) { | ||
expect(existsAsync).toBe(false); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.existsAsync('file.txt') | ||
.then(function (exists) { | ||
expect(exists).toBe(false); | ||
done(); | ||
}); | ||
}); | ||
it("returns 'dir' if directory exists on given path", function (done) { | ||
fse.mkdirsSync('a'); | ||
it("returns 'dir' if directory exists on given path", function (done) { | ||
fse.mkdirsSync('a'); | ||
// SYNC | ||
var existsSync = jetpack.exists('a'); | ||
expect(existsSync).toBe('dir'); | ||
// SYNC | ||
expect(jetpack.exists('a')).toBe('dir'); | ||
// ASYNC | ||
jetpack.existsAsync('a') | ||
.then(function (existsAsync) { | ||
expect(existsAsync).toBe('dir'); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.existsAsync('a') | ||
.then(function (exists) { | ||
expect(exists).toBe('dir'); | ||
done(); | ||
}); | ||
}); | ||
it("returns 'file' if file exists on given path", function (done) { | ||
fse.outputFileSync('text.txt', 'abc'); | ||
it("returns 'file' if file exists on given path", function (done) { | ||
fse.outputFileSync('text.txt', 'abc'); | ||
// SYNC | ||
var existsSync = jetpack.exists('text.txt'); | ||
expect(existsSync).toBe('file'); | ||
// SYNC | ||
expect(jetpack.exists('text.txt')).toBe('file'); | ||
// ASYNC | ||
jetpack.existsAsync('text.txt') | ||
.then(function (existsAsync) { | ||
expect(existsAsync).toBe('file'); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.existsAsync('text.txt') | ||
.then(function (exists) { | ||
expect(exists).toBe('file'); | ||
done(); | ||
}); | ||
}); | ||
it("respects internal CWD of jetpack instance", function (done) { | ||
fse.outputFileSync('a/text.txt', 'abc'); | ||
it('respects internal CWD of jetpack instance', function (done) { | ||
var jetContext = jetpack.cwd('a'); | ||
var jetContext = jetpack.cwd('a'); | ||
fse.outputFileSync('a/text.txt', 'abc'); | ||
// SYNC | ||
var existsSync = jetContext.exists('text.txt'); | ||
expect(existsSync).toBe('file'); | ||
// SYNC | ||
expect(jetContext.exists('text.txt')).toBe('file'); | ||
// ASYNC | ||
jetContext.existsAsync('text.txt') | ||
.then(function (existsAsync) { | ||
expect(existsAsync).toBe('file'); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetContext.existsAsync('text.txt') | ||
.then(function (exists) { | ||
expect(exists).toBe('file'); | ||
done(); | ||
}); | ||
}); | ||
describe("edge cases", function () { | ||
describe('edge cases', function () { | ||
it("ENOTDIR error changes into 'false'", function (done) { | ||
// We have here malformed path: /some/dir/file.txt/some_dir | ||
// (so file is in the middle of path, not at the end). | ||
// This leads to ENOTDIR error, but technically speaking this | ||
// path doesn't exist so let's just return false. | ||
it("ENOTDIR error changes into 'false'", function (done) { | ||
// We have here malformed path: /some/dir/file.txt/some_dir | ||
// (so file is in the middle of path, not at the end). | ||
// This leads to ENOTDIR error, but technically speaking this | ||
// path doesn't exist so let's just return false. | ||
fse.outputFileSync('text.txt', 'abc'); | ||
fse.outputFileSync('text.txt', 'abc'); | ||
// SYNC | ||
expect(jetpack.exists('text.txt/something')).toBe(false); | ||
// SYNC | ||
var existsSync = jetpack.exists('text.txt/something'); | ||
expect(existsSync).toBe(false); | ||
// ASYNC | ||
jetpack.existsAsync('text.txt/something') | ||
.then(function (existsAsync) { | ||
expect(existsAsync).toBe(false); | ||
done(); | ||
}); | ||
}); | ||
// ASYNC | ||
jetpack.existsAsync('text.txt/something') | ||
.then(function (exists) { | ||
expect(exists).toBe(false); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
}); |
/* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
describe('file |', function () { | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
describe('ensure file exists |', function () { | ||
it("file doesn't exist before call", function (done) { | ||
var prepartions = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect('file.txt').toBeFileWithContent(''); | ||
}; | ||
describe('ensure file exists |', function () { | ||
// SYNC | ||
prepartions(); | ||
jetpack.file('file.txt'); | ||
expectations(); | ||
it("file doesn't exist before call", function (done) { | ||
// ASYNC | ||
prepartions(); | ||
jetpack.fileAsync('file.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
var prepartions = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
it('file already exists', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('file.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('file.txt').toBeFileWithContent('abc'); | ||
}; | ||
var expectations = function () { | ||
expect('file.txt').toBeFileWithContent(''); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.file('file.txt'); | ||
expectations(); | ||
// SYNC | ||
prepartions(); | ||
jetpack.file('file.txt'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.fileAsync('file.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
// ASYNC | ||
prepartions(); | ||
jetpack.fileAsync('file.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
describe('ensures file content |', function () { | ||
it('from string', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect('file.txt').toBeFileWithContent('ąbć'); | ||
}; | ||
it("file already exists", function (done) { | ||
// SYNC | ||
preparations(); | ||
jetpack.file('file.txt', { content: 'ąbć' }); | ||
expectations(); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('file.txt', 'abc'); | ||
}; | ||
// ASYNC | ||
preparations(); | ||
jetpack.fileAsync('file.txt', { content: 'ąbć' }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
var expectations = function () { | ||
expect('file.txt').toBeFileWithContent('abc'); | ||
}; | ||
it('from buffer', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
var buf = fse.readFileSync('file'); | ||
expect(buf[0]).toBe(11); | ||
expect(buf[1]).toBe(22); | ||
expect(buf.length).toBe(2); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.file('file.txt'); | ||
expectations(); | ||
// SYNC | ||
preparations(); | ||
jetpack.file('file', { content: new Buffer([11, 22]) }); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.fileAsync('file.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.fileAsync('file', { content: new Buffer([11, 22]) }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
describe('ensures file content |', function () { | ||
it('from object (json)', function (done) { | ||
var obj = { | ||
a: 'abc', | ||
b: 123 | ||
}; | ||
it("from string", function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
var data = JSON.parse(fse.readFileSync('file.txt', 'utf8')); | ||
expect(data).toEqual(obj); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.file('file.txt', { content: obj }); | ||
expectations(); | ||
var expectations = function () { | ||
expect('file.txt').toBeFileWithContent('ąbć'); | ||
}; | ||
// ASYNC | ||
preparations(); | ||
jetpack.fileAsync('file.txt', { content: obj }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// SYNC | ||
preparations(); | ||
jetpack.file('file.txt', { content: 'ąbć' }); | ||
expectations(); | ||
it('written JSON data can be indented', function (done) { | ||
var obj = { | ||
a: 'abc', | ||
b: 123 | ||
}; | ||
// ASYNC | ||
preparations(); | ||
jetpack.fileAsync('file.txt', { content: 'ąbć' }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
var sizeA = fse.statSync('a.json').size; | ||
var sizeB = fse.statSync('b.json').size; | ||
var sizeC = fse.statSync('c.json').size; | ||
expect(sizeB).toBeGreaterThan(sizeA); | ||
expect(sizeC).toBeGreaterThan(sizeB); | ||
}; | ||
it("from buffer", function (done) { | ||
// SYNC | ||
preparations(); | ||
jetpack.file('a.json', { content: obj, jsonIndent: 0 }); | ||
jetpack.file('b.json', { content: obj }); // Default indent = 2 | ||
jetpack.file('c.json', { content: obj, jsonIndent: 4 }); | ||
expectations(); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
// ASYNC | ||
preparations(); | ||
jetpack.fileAsync('a.json', { content: obj, jsonIndent: 0 }) | ||
.then(function () { | ||
return jetpack.fileAsync('b.json', { content: obj }); // Default indent = 2 | ||
}) | ||
.then(function () { | ||
return jetpack.fileAsync('c.json', { content: obj, jsonIndent: 4 }); | ||
}) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
var expectations = function () { | ||
var buf = fse.readFileSync('file'); | ||
expect(buf[0]).toBe(11); | ||
expect(buf[1]).toBe(22); | ||
expect(buf.length).toBe(2); | ||
}; | ||
it('replaces content of already existing file', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.writeFileSync('file.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('file.txt').toBeFileWithContent('123'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.file('file', { content: new Buffer([11, 22]) }); | ||
expectations(); | ||
// SYNC | ||
preparations(); | ||
jetpack.file('file.txt', { content: '123' }); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.fileAsync('file', { content: new Buffer([11, 22]) }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.fileAsync('file.txt', { content: '123' }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
it("from object (json)", function (done) { | ||
it('if given path is directory, should delete it and place file instead', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
// Create nested directories to be sure we can delete non-empty dir. | ||
fse.outputFileSync('a/b/c.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('a').toBeFileWithContent(''); | ||
}; | ||
var obj = { a: "abc", b: 123 }; | ||
// SYNC | ||
preparations(); | ||
jetpack.file('a'); | ||
expectations(); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
// ASYNC | ||
preparations(); | ||
jetpack.fileAsync('a') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
var expectations = function () { | ||
var data = JSON.parse(fse.readFileSync('file.txt', 'utf8')); | ||
expect(data).toEqual(obj); | ||
}; | ||
it("if directory for file doesn't exist creates it too", function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect('a/b/c.txt').toBeFileWithContent(''); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.file('file.txt', { content: obj }); | ||
expectations(); | ||
// SYNC | ||
preparations(); | ||
jetpack.file('a/b/c.txt'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.fileAsync('file.txt', { content: obj }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.fileAsync('a/b/c.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it('written JSON data can be indented', function (done) { | ||
it('returns currently used jetpack instance', function (done) { | ||
// SYNC | ||
expect(jetpack.file('file.txt')).toBe(jetpack); | ||
var obj = { a: "abc", b: 123 }; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
var sizeA = fse.statSync('a.json').size; | ||
var sizeB = fse.statSync('b.json').size; | ||
var sizeC = fse.statSync('c.json').size; | ||
expect(sizeB).toBeGreaterThan(sizeA); | ||
expect(sizeC).toBeGreaterThan(sizeB); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.file('a.json', { content: obj, jsonIndent: 0 }); | ||
jetpack.file('b.json', { content: obj }); // Default indent = 2 | ||
jetpack.file('c.json', { content: obj, jsonIndent: 4 }); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.fileAsync('a.json', { content: obj, jsonIndent: 0 }) | ||
.then(function () { | ||
return jetpack.fileAsync('b.json', { content: obj }); // Default indent = 2 | ||
}) | ||
.then(function () { | ||
return jetpack.fileAsync('c.json', { content: obj, jsonIndent: 4 }); | ||
}) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("replaces content of already existing file", function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.writeFileSync('file.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('file.txt').toBeFileWithContent('123'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.file('file.txt', { content: '123' }); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.fileAsync('file.txt', { content: '123' }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// ASYNC | ||
jetpack.fileAsync('file.txt') | ||
.then(function (jetpackContext) { | ||
expect(jetpackContext).toBe(jetpack); | ||
done(); | ||
}); | ||
}); | ||
it('if given path is directory, should delete it and place file instead', function (done) { | ||
it('respects internal CWD of jetpack instance', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect('a/b.txt').toBeFileWithContent(''); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
// Create nested directories to be sure we can delete non-empty dir. | ||
fse.outputFileSync('a/b/c.txt', 'abc'); | ||
}; | ||
var jetContext = jetpack.cwd('a'); | ||
var expectations = function () { | ||
expect('a').toBeFileWithContent(''); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetContext.file('b.txt'); | ||
expectations(); | ||
// SYNC | ||
preparations(); | ||
jetpack.file('a'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.fileAsync('a') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetContext.fileAsync('b.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("if directory for file doesn't exist creates it too", function (done) { | ||
describe('windows specyfic |', function () { | ||
if (process.platform !== 'win32') { | ||
return; | ||
} | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
it('specyfying mode should have no effect, and throw no error', function (done) { | ||
// SYNC | ||
jetpack.file('file.txt', { mode: '511' }); | ||
var expectations = function () { | ||
expect('a/b/c.txt').toBeFileWithContent(''); | ||
}; | ||
helper.clearWorkingDir(); | ||
// SYNC | ||
preparations(); | ||
jetpack.file('a/b/c.txt'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.fileAsync('a/b/c.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.fileAsync('file.txt', { mode: '511' }) | ||
.then(function () { | ||
done(); | ||
}); | ||
}); | ||
}); | ||
it('returns currently used jetpack instance', function (done) { | ||
// SYNC | ||
var jetpackContextSync = jetpack.file('file.txt'); | ||
expect(jetpackContextSync).toBe(jetpack); | ||
describe('*nix specyfic |', function () { | ||
if (process.platform === 'win32') { | ||
return; | ||
} | ||
// ASYNC | ||
jetpack.fileAsync('file.txt') | ||
.then(function (jetpackContextAsync) { | ||
expect(jetpackContextAsync).toBe(jetpack); | ||
done(); | ||
}); | ||
}); | ||
// Tests assume umask is not greater than 022 | ||
it("respects internal CWD of jetpack instance", function (done) { | ||
it('sets mode of newly created file', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect('file.txt').toHaveMode('511'); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
// SYNC | ||
// mode as string | ||
preparations(); | ||
jetpack.file('file.txt', { mode: '511' }); | ||
expectations(); | ||
var expectations = function () { | ||
expect('a/b.txt').toBeFileWithContent(''); | ||
}; | ||
// mode as number | ||
preparations(); | ||
jetpack.file('file.txt', { mode: parseInt('511', 8) }); | ||
expectations(); | ||
var jetContext = jetpack.cwd('a'); | ||
// AYNC | ||
// mode as string | ||
preparations(); | ||
jetpack.fileAsync('file.txt', { mode: '511' }) | ||
.then(function () { | ||
expectations(); | ||
// SYNC | ||
// mode as number | ||
preparations(); | ||
jetContext.file('b.txt'); | ||
return jetpack.fileAsync('file.txt', { mode: parseInt('511', 8) }); | ||
}) | ||
.then(function () { | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetContext.fileAsync('b.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
done(); | ||
}); | ||
}); | ||
describe('windows specyfic |', function () { | ||
it("changes mode of existing file if doesn't match", function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.writeFileSync('file.txt', 'abc', { mode: '700' }); | ||
}; | ||
var expectations = function () { | ||
expect('file.txt').toHaveMode('511'); | ||
}; | ||
if (process.platform !== 'win32') { | ||
return; | ||
} | ||
// SYNC | ||
preparations(); | ||
jetpack.file('file.txt', { mode: '511' }); | ||
expectations(); | ||
it('specyfying mode should have no effect, and throw no error', function (done) { | ||
// SYNC | ||
jetpack.file('file.txt', { mode: '511' }); | ||
helper.clearWorkingDir(); | ||
// ASYNC | ||
jetpack.fileAsync('file.txt', { mode: '511' }) | ||
.then(function () { | ||
done(); | ||
}); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.fileAsync('file.txt', { mode: '511' }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
describe('*nix specyfic |', function () { | ||
it('leaves mode of file intact if not explicitly specified', function (done) { | ||
var preparations = function () { | ||
fse.writeFileSync('file.txt', 'abc', { mode: '700' }); | ||
}; | ||
var expectations = function () { | ||
expect('file.txt').toHaveMode('700'); | ||
}; | ||
if (process.platform === 'win32') { | ||
return; | ||
} | ||
preparations(); | ||
// Tests assume umask is not greater than 022 | ||
// SYNC | ||
// ensure exists | ||
jetpack.file('file.txt'); | ||
expectations(); | ||
it('sets mode of newly created file', function (done) { | ||
// make file empty | ||
jetpack.file('file.txt', { empty: true }); | ||
expectations(); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
// set file content | ||
jetpack.file('file.txt', { content: '123' }); | ||
expectations(); | ||
var expectations = function () { | ||
expect('file.txt').toHaveMode('511'); | ||
}; | ||
// AYNC | ||
// ensure exists | ||
jetpack.fileAsync('file.txt') | ||
.then(function () { | ||
expectations(); | ||
// SYNC | ||
// mode as string | ||
preparations(); | ||
jetpack.file('file.txt', { mode: '511' }); | ||
expectations(); | ||
// make file empty | ||
return jetpack.fileAsync('file.txt', { empty: true }); | ||
}) | ||
.then(function () { | ||
expectations(); | ||
// mode as number | ||
preparations(); | ||
jetpack.file('file.txt', { mode: parseInt('511', 8) }); | ||
expectations(); | ||
// AYNC | ||
// mode as string | ||
preparations(); | ||
jetpack.fileAsync('file.txt', { mode: '511' }) | ||
.then(function () { | ||
expectations(); | ||
// mode as number | ||
preparations(); | ||
return jetpack.fileAsync('file.txt', { mode: parseInt('511', 8) }); | ||
}) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("changes mode of existing file if doesn't match", function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.writeFileSync('file.txt', 'abc', { mode: '700' }); | ||
}; | ||
var expectations = function () { | ||
expect('file.txt').toHaveMode('511'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.file('file.txt', { mode: '511' }); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.fileAsync('file.txt', { mode: '511' }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it('leaves mode of file intact if not explicitly specified', function (done) { | ||
var preparations = function () { | ||
fse.writeFileSync('file.txt', 'abc', { mode: '700' }); | ||
}; | ||
var expectations = function () { | ||
expect('file.txt').toHaveMode('700'); | ||
}; | ||
preparations(); | ||
// SYNC | ||
// ensure exists | ||
jetpack.file('file.txt'); | ||
expectations(); | ||
// make file empty | ||
jetpack.file('file.txt', { empty: true }); | ||
expectations(); | ||
// set file content | ||
jetpack.file('file.txt', { content: '123' }); | ||
expectations(); | ||
// AYNC | ||
// ensure exists | ||
jetpack.fileAsync('file.txt') | ||
.then(function () { | ||
expectations(); | ||
// make file empty | ||
return jetpack.fileAsync('file.txt', { empty: true }); | ||
}) | ||
.then(function () { | ||
expectations(); | ||
// set file content | ||
return jetpack.fileAsync('file.txt', { content: '123' }); | ||
}) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// set file content | ||
return jetpack.fileAsync('file.txt', { content: '123' }); | ||
}) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
}); |
/* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
describe('find |', function () { | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
var fse = require('fs-extra'); | ||
var pathUtil = require('path'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
it('returns list of relative paths anchored to CWD', function (done) { | ||
var expectations = function (found) { | ||
var normalizedFound = helper.convertToUnixPathSeparators(found); | ||
expect(normalizedFound).toEqual(['a/b/file.txt']); | ||
}; | ||
it("returns list of absolute paths by default", function (done) { | ||
fse.outputFileSync('a/b/file.txt', 'abc'); | ||
var preparations = function () { | ||
fse.outputFileSync('a/b/file.txt', 'abc'); | ||
}; | ||
// SYNC | ||
expectations(jetpack.find('a', { matching: '*.txt' })); | ||
var expectations = function (found) { | ||
var expectedPath = pathUtil.resolve('./a/b/file.txt'); | ||
expect(found).toEqual([expectedPath]); | ||
}; | ||
preparations(); | ||
// SYNC | ||
var foundSync = jetpack.find('a', { matching: '*.txt' }); // default | ||
expectations(foundSync); | ||
foundSync = jetpack.find('a', { matching: '*.txt' }, 'absolutePath'); // explicit | ||
expectations(foundSync); | ||
// ASYNC | ||
jetpack.findAsync('a', { matching: '*.txt' }) // default | ||
.then(function (foundAsync) { | ||
expectations(foundAsync); | ||
return jetpack.findAsync('a', { matching: '*.txt' }, 'absolutePath'); // explicit | ||
}) | ||
.then(function (foundAsync) { | ||
expectations(foundAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.findAsync('a', { matching: '*.txt' }) | ||
.then(function (found) { | ||
expectations(found); | ||
done(); | ||
}); | ||
}); | ||
it("can return list of relative paths", function (done) { | ||
it('defaults to CWD if no path provided', function (done) { | ||
var expectations = function (found) { | ||
var normalizedFound = helper.convertToUnixPathSeparators(found); | ||
expect(normalizedFound).toEqual(['a/b/file.txt']); | ||
}; | ||
var preparations = function () { | ||
fse.outputFileSync('a/b/file.txt', 'abc'); | ||
}; | ||
fse.outputFileSync('a/b/file.txt', 'abc'); | ||
var expectations = function (found) { | ||
var normalizedFound = helper.convertToUnixPathSeparators(found); | ||
expect(normalizedFound).toEqual(['./b/file.txt']); | ||
}; | ||
// SYNC | ||
expectations(jetpack.find({ matching: '*.txt' })); | ||
preparations(); | ||
// SYNC | ||
var foundSync = jetpack.find('a', { matching: '*.txt' }, 'relativePath'); | ||
expectations(foundSync); | ||
// ASYNC | ||
jetpack.findAsync('a', { matching: '*.txt' }, 'relativePath') | ||
.then(function (foundAsync) { | ||
expectations(foundAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.findAsync({ matching: '*.txt' }) | ||
.then(function (found) { | ||
expectations(found); | ||
done(); | ||
}); | ||
}); | ||
it("can return list of inspect objects", function (done) { | ||
it('returns empty list if nothing found', function (done) { | ||
var expectations = function (found) { | ||
expect(found).toEqual([]); | ||
}; | ||
var preparations = function () { | ||
fse.outputFileSync('a/b/c.txt', 'abc'); | ||
}; | ||
fse.outputFileSync('a/b/c.md', 'abc'); | ||
var expectations = function (found) { | ||
expect(found[0].name).toBe('c.txt'); | ||
}; | ||
// SYNC | ||
expectations(jetpack.find('a', { matching: '*.txt' })); | ||
preparations(); | ||
// SYNC | ||
var foundSync = jetpack.find('a', { matching: '*.txt' }, 'inspect'); | ||
expectations(foundSync); | ||
// ASYNC | ||
jetpack.findAsync('a', { matching: '*.txt' }, 'inspect') | ||
.then(function (foundAsync) { | ||
expectations(foundAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.findAsync('a', { matching: '*.txt' }) | ||
.then(function (found) { | ||
expectations(found); | ||
done(); | ||
}); | ||
}); | ||
it("returns empty list if nothing found", function (done) { | ||
it('finds all paths which match globs', function (done) { | ||
var expectations = function (found) { | ||
var normalizedFound = helper.convertToUnixPathSeparators(found); | ||
normalizedFound.sort(); | ||
expect(normalizedFound).toEqual([ | ||
'a/b/c/file.txt', | ||
'a/b/file.txt', | ||
'a/x/y/z' | ||
]); | ||
}; | ||
var preparations = function () { | ||
fse.outputFileSync('a/b/c.md', 'abc'); | ||
}; | ||
fse.outputFileSync('a/b/file.txt', '1'); | ||
fse.outputFileSync('a/b/c/file.txt', '2'); | ||
fse.outputFileSync('a/b/c/file.md', '3'); | ||
fse.outputFileSync('a/x/y/z', 'Zzzzz...'); | ||
var expectations = function (found) { | ||
expect(found).toEqual([]); | ||
}; | ||
// SYNC | ||
expectations(jetpack.find('a', { matching: ['*.txt', 'z'] })); | ||
preparations(); | ||
// SYNC | ||
var foundSync = jetpack.find('a', { matching: '*.txt' }); | ||
expectations(foundSync); | ||
// ASYNC | ||
jetpack.findAsync('a', { matching: '*.txt' }) | ||
.then(function (foundAsync) { | ||
expectations(foundAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.findAsync('a', { matching: ['*.txt', 'z'] }) | ||
.then(function (found) { | ||
expectations(found); | ||
done(); | ||
}); | ||
}); | ||
it("finds all paths which match globs", function (done) { | ||
it("anchors globs to directory you're finding in", function (done) { | ||
var expectations = function (found) { | ||
var normalizedFound = helper.convertToUnixPathSeparators(found); | ||
expect(normalizedFound).toEqual(['x/y/a/b/file.txt']); | ||
}; | ||
var preparations = function () { | ||
fse.outputFileSync('a/b/file.txt', '1'); | ||
fse.outputFileSync('a/b/c/file.txt', '2'); | ||
fse.outputFileSync('a/b/c/file.md', '3'); | ||
fse.mkdirsSync('a/x/y/z'); | ||
}; | ||
fse.outputFileSync('x/y/a/b/file.txt', '123'); | ||
fse.outputFileSync('x/y/a/b/c/file.txt', '456'); | ||
var expectations = function (found) { | ||
var normalizedFound = helper.convertToUnixPathSeparators(found); | ||
normalizedFound.sort(); | ||
expect(normalizedFound).toEqual([ | ||
'./b/c/file.txt', | ||
'./b/file.txt', | ||
'./x/y/z', | ||
]); | ||
}; | ||
// SYNC | ||
expectations(jetpack.find('x/y/a', { matching: 'b/*.txt' })); | ||
preparations(); | ||
// SYNC | ||
var foundSync = jetpack.find('a', { matching: ['*.txt', 'z'] }, 'relativePath'); | ||
expectations(foundSync); | ||
// ASYNC | ||
jetpack.findAsync('a', { matching: ['*.txt', 'z'] }, 'relativePath') | ||
.then(function (foundAsync) { | ||
expectations(foundAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.findAsync('x/y/a', { matching: 'b/*.txt' }) | ||
.then(function (found) { | ||
expectations(found); | ||
done(); | ||
}); | ||
}); | ||
it("anchors globs to directory you're finding in", function (done) { | ||
it('can use ./ as indication of anchor directory', function (done) { | ||
var expectations = function (found) { | ||
var normalizedFound = helper.convertToUnixPathSeparators(found); | ||
expect(normalizedFound).toEqual(['x/y/file.txt']); | ||
}; | ||
var preparations = function () { | ||
fse.outputFileSync('x/y/a/b/file.txt', '1'); | ||
fse.outputFileSync('x/y/a/b/file.md', '2'); | ||
fse.outputFileSync('x/y/a/b/c/file.txt', '3'); | ||
}; | ||
fse.outputFileSync('x/y/file.txt', '123'); | ||
fse.outputFileSync('x/y/b/file.txt', '456'); | ||
var expectations = function (found) { | ||
var normalizedFound = helper.convertToUnixPathSeparators(found); | ||
expect(normalizedFound).toEqual(['./b/file.txt']); | ||
}; | ||
// SYNC | ||
expectations(jetpack.find('x/y', { matching: './file.txt' })); | ||
preparations(); | ||
// SYNC | ||
var foundSync = jetpack.find('x/y/a', { matching: 'b/*.txt' }, 'relativePath'); | ||
expectations(foundSync); | ||
// ASYNC | ||
jetpack.findAsync('x/y/a', { matching: 'b/*.txt' }, 'relativePath') | ||
.then(function (foundAsync) { | ||
expectations(foundAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.findAsync('x/y', { matching: './file.txt' }) | ||
.then(function (found) { | ||
expectations(found); | ||
done(); | ||
}); | ||
}); | ||
it("can use ./ as indication of anchor directory", function (done) { | ||
it('deals with negation globs', function (done) { | ||
var expectations = function (found) { | ||
var normalizedFound = helper.convertToUnixPathSeparators(found); | ||
expect(normalizedFound).toEqual(['x/y/a/b']); | ||
}; | ||
var preparations = function () { | ||
fse.outputFileSync('x/y/a.txt', '123'); | ||
fse.outputFileSync('x/y/b/a.txt', '456'); | ||
}; | ||
fse.outputFileSync('x/y/a/b', 'bbb'); | ||
fse.outputFileSync('x/y/a/x', 'xxx'); | ||
fse.outputFileSync('x/y/a/y', 'yyy'); | ||
fse.outputFileSync('x/y/a/z', 'zzz'); | ||
var expectations = function (found) { | ||
var normalizedFound = helper.convertToUnixPathSeparators(found); | ||
expect(normalizedFound).toEqual(['./a.txt']); | ||
}; | ||
// SYNC | ||
expectations(jetpack.find('x/y', { | ||
matching: [ | ||
'a/*', | ||
// Three different pattern types to test: | ||
'!x', | ||
'!a/y', | ||
'!./a/z' | ||
] | ||
})); | ||
preparations(); | ||
// SYNC | ||
var foundSync = jetpack.find('x/y', { matching: './a.txt' }, 'relativePath'); | ||
expectations(foundSync); | ||
// ASYNC | ||
jetpack.findAsync('x/y', { matching: './a.txt' }, 'relativePath') | ||
.then(function (foundAsync) { | ||
expectations(foundAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.findAsync('x/y', { | ||
matching: [ | ||
'a/*', | ||
// Three different pattern types to test: | ||
'!x', | ||
'!a/y', | ||
'!./a/z' | ||
] | ||
}) | ||
.then(function (found) { | ||
expectations(found); | ||
done(); | ||
}); | ||
}); | ||
it('deals with negation globs', function (done) { | ||
it("throws if path doesn't exist", function (done) { | ||
var expectations = function (err) { | ||
expect(err.code).toBe('ENOENT'); | ||
expect(err.message).toMatch(/^Path you want to find stuff in doesn't exist/); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirsSync('x/y/a/b'); | ||
fse.mkdirsSync('x/y/a/x'); | ||
fse.mkdirsSync('x/y/a/y'); | ||
fse.mkdirsSync('x/y/a/z'); | ||
}; | ||
// SYNC | ||
try { | ||
jetpack.find('a', { matching: '*.txt' }); | ||
} catch (err) { | ||
expectations(err); | ||
} | ||
var expectations = function (found) { | ||
var normalizedFound = helper.convertToUnixPathSeparators(found); | ||
expect(normalizedFound).toEqual(['./a/b']); | ||
}; | ||
// SYNC | ||
preparations(); | ||
var foundSync = jetpack.find('x/y', { | ||
matching: [ | ||
'a/*', | ||
// Three different pattern types to test: | ||
'!x', | ||
'!a/y', | ||
'!./a/z', | ||
], | ||
}, 'relativePath'); | ||
expectations(foundSync); | ||
// ASYNC | ||
preparations(); | ||
jetpack.findAsync('x/y', { | ||
matching: [ | ||
'a/*', | ||
// Three different pattern types to test: | ||
'!x', | ||
'!a/y', | ||
'!./a/z', | ||
], | ||
}, 'relativePath') | ||
.then(function (foundAsync) { | ||
expectations(foundAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.findAsync('a', { matching: '*.txt' }) | ||
.catch(function (err) { | ||
expectations(err); | ||
done(); | ||
}); | ||
}); | ||
it("throws if path doesn't exist", function (done) { | ||
it('throws if path is a file, not a directory', function (done) { | ||
var expectations = function (err) { | ||
expect(err.code).toBe('ENOTDIR'); | ||
expect(err.message).toContain('Path you want to find stuff in must be a directory'); | ||
}; | ||
var expectations = function (err) { | ||
expect(err.code).toBe('ENOENT'); | ||
expect(err.message).toMatch(/^Path you want to find stuff in doesn't exist/); | ||
}; | ||
fse.outputFileSync('a/b', 'abc'); | ||
// SYNC | ||
try { | ||
jetpack.find('a', { matching: '*.txt' }); | ||
} catch (err) { | ||
expectations(err); | ||
} | ||
// SYNC | ||
try { | ||
jetpack.find('a/b', { matching: '*.txt' }); | ||
} catch (err) { | ||
expectations(err); | ||
} | ||
// ASYNC | ||
jetpack.findAsync('a', { matching: '*.txt' }) | ||
.catch(function (err) { | ||
expectations(err); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.findAsync('a/b', { matching: '*.txt' }) | ||
.catch(function (err) { | ||
expectations(err); | ||
done(); | ||
}); | ||
}); | ||
it("throws if path is a file, not a directory", function (done) { | ||
it('respects internal CWD of jetpack instance', function (done) { | ||
var expectations = function (found) { | ||
expect(found).toEqual(['b/c/d.txt']); // NOT a/b/c/d.txt | ||
}; | ||
var preparations = function () { | ||
fse.outputFileSync('a/b', 'abc'); | ||
}; | ||
var jetContext = jetpack.cwd('a'); | ||
var expectations = function (err) { | ||
expect(err.code).toBe('ENOTDIR'); | ||
expect(err.message).toMatch(/^Path you want to find stuff in must be a directory/); | ||
}; | ||
fse.outputFileSync('a/b/c/d.txt', 'abc'); | ||
preparations(); | ||
// SYNC | ||
expectations(jetContext.find('b', { matching: '*.txt' })); | ||
// SYNC | ||
try { | ||
jetpack.find('a/b', { matching: '*.txt' }); | ||
} catch (err) { | ||
expectations(err); | ||
} | ||
// ASYNC | ||
jetpack.findAsync('a/b', { matching: '*.txt' }) | ||
.catch(function (err) { | ||
expectations(err); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetContext.findAsync('b', { matching: '*.txt' }) | ||
.then(function (found) { | ||
expectations(found); | ||
done(); | ||
}); | ||
it("respects internal CWD of jetpack instance", function (done) { | ||
var preparations = function () { | ||
fse.outputFileSync('a/b/c.txt', 'abc'); | ||
}; | ||
var expectations = function (found) { | ||
expect(found[0].name).toBe('c.txt'); | ||
}; | ||
preparations(); | ||
var jetContext = jetpack.cwd('a'); | ||
// SYNC | ||
var foundSync = jetContext.find('b', { matching: '*.txt' }, 'inspect'); | ||
expectations(foundSync); | ||
// ASYNC | ||
jetContext.findAsync('b', { matching: '*.txt' }, 'inspect') | ||
.then(function (foundAsync) { | ||
expectations(foundAsync); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
}); |
/* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
describe('inspectTree |', function () { | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
it('inspects whole tree of files', function (done) { | ||
var expectations = function (data) { | ||
expect(data).toEqual({ | ||
name: 'dir', | ||
type: 'dir', | ||
size: 7, | ||
children: [ | ||
{ | ||
name: 'file.txt', | ||
type: 'file', | ||
size: 3 | ||
}, { | ||
name: 'subdir', | ||
type: 'dir', | ||
size: 4, | ||
children: [ | ||
{ | ||
name: 'file.txt', | ||
type: 'file', | ||
size: 4 | ||
} | ||
] | ||
} | ||
] | ||
}); | ||
}; | ||
it('inspects whole tree of files', function (done) { | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
fse.outputFileSync('dir/subdir/file.txt', 'defg'); | ||
var preparations = function () { | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
fse.outputFileSync('dir/subdir/file.txt', 'defg'); | ||
}; | ||
// SYNC | ||
expectations(jetpack.inspectTree('dir')); | ||
var expectations = function (data) { | ||
expect(data).toEqual({ | ||
name: 'dir', | ||
type: 'dir', | ||
size: 7, | ||
children: [ | ||
{ | ||
name: 'file.txt', | ||
type: 'file', | ||
size: 3, | ||
}, { | ||
name: 'subdir', | ||
type: 'dir', | ||
size: 4, | ||
children: [ | ||
{ | ||
name: 'file.txt', | ||
type: 'file', | ||
size: 4, | ||
}, | ||
], | ||
}, | ||
], | ||
}); | ||
}; | ||
preparations(); | ||
// SYNC | ||
var treeSync = jetpack.inspectTree('dir'); | ||
expectations(treeSync); | ||
// ASYNC | ||
jetpack.inspectTreeAsync('dir') | ||
.then(function (treeAsync) { | ||
expectations(treeAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.inspectTreeAsync('dir') | ||
.then(function (tree) { | ||
expectations(tree); | ||
done(); | ||
}); | ||
}); | ||
it('can calculate size of a whole tree', function (done) { | ||
it('can calculate size of a whole tree', function (done) { | ||
var expectations = function (data) { | ||
// dir | ||
expect(data.size).toBe(7); | ||
// dir/empty | ||
expect(data.children[0].size).toBe(0); | ||
// dir/empty.txt | ||
expect(data.children[1].size).toBe(0); | ||
// dir/file.txt | ||
expect(data.children[2].size).toBe(3); | ||
// dir/subdir | ||
expect(data.children[3].size).toBe(4); | ||
// dir/subdir/file.txt | ||
expect(data.children[3].children[0].size).toBe(4); | ||
}; | ||
var preparations = function () { | ||
fse.mkdirsSync('dir/empty'); | ||
fse.outputFileSync('dir/empty.txt', ''); | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
fse.outputFileSync('dir/subdir/file.txt', 'defg'); | ||
}; | ||
fse.mkdirsSync('dir/empty'); | ||
fse.outputFileSync('dir/empty.txt', ''); | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
fse.outputFileSync('dir/subdir/file.txt', 'defg'); | ||
var expectations = function (data) { | ||
// dir | ||
expect(data.size).toBe(7); | ||
// dir/empty | ||
expect(data.children[0].size).toBe(0); | ||
// dir/empty.txt | ||
expect(data.children[1].size).toBe(0); | ||
// dir/file.txt | ||
expect(data.children[2].size).toBe(3); | ||
// dir/subdir | ||
expect(data.children[3].size).toBe(4); | ||
// dir/subdir/file.txt | ||
expect(data.children[3].children[0].size).toBe(4); | ||
}; | ||
// SYNC | ||
expectations(jetpack.inspectTree('dir')); | ||
preparations(); | ||
// SYNC | ||
var treeSync = jetpack.inspectTree('dir'); | ||
expectations(treeSync); | ||
// ASYNC | ||
jetpack.inspectTreeAsync('dir') | ||
.then(function (treeAsync) { | ||
expectations(treeAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.inspectTreeAsync('dir') | ||
.then(function (tree) { | ||
expectations(tree); | ||
done(); | ||
}); | ||
}); | ||
it('can compute checksum of a whole tree', function (done) { | ||
it('can compute checksum of a whole tree', function (done) { | ||
var expectations = function (data) { | ||
// md5 of | ||
// 'a.txt' + '900150983cd24fb0d6963f7d28e17f72' + | ||
// 'b.txt' + '025e4da7edac35ede583f5e8d51aa7ec' | ||
expect(data.md5).toBe('b0ff9df854172efe752cb36b96c8bccd'); | ||
// md5 of 'abc' | ||
expect(data.children[0].md5).toBe('900150983cd24fb0d6963f7d28e17f72'); | ||
// md5 of 'defg' | ||
expect(data.children[1].md5).toBe('025e4da7edac35ede583f5e8d51aa7ec'); | ||
}; | ||
var preparations = function () { | ||
fse.outputFileSync('dir/a.txt', 'abc'); | ||
fse.outputFileSync('dir/b.txt', 'defg'); | ||
}; | ||
fse.outputFileSync('dir/a.txt', 'abc'); | ||
fse.outputFileSync('dir/b.txt', 'defg'); | ||
var expectations = function (data) { | ||
// md5 of 'a.txt' + '900150983cd24fb0d6963f7d28e17f72' + 'b.txt' + '025e4da7edac35ede583f5e8d51aa7ec' | ||
expect(data.md5).toBe('b0ff9df854172efe752cb36b96c8bccd'); | ||
// md5 of 'abc' | ||
expect(data.children[0].md5).toBe('900150983cd24fb0d6963f7d28e17f72'); | ||
// md5 of 'defg' | ||
expect(data.children[1].md5).toBe('025e4da7edac35ede583f5e8d51aa7ec'); | ||
}; | ||
// SYNC | ||
expectations(jetpack.inspectTree('dir', { checksum: 'md5' })); | ||
preparations(); | ||
// SYNC | ||
var treeSync = jetpack.inspectTree('dir', { checksum: 'md5' }); | ||
expectations(treeSync); | ||
// ASYNC | ||
jetpack.inspectTreeAsync('dir', { checksum: 'md5' }) | ||
.then(function (treeAsync) { | ||
expectations(treeAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.inspectTreeAsync('dir', { checksum: 'md5' }) | ||
.then(function (tree) { | ||
expectations(tree); | ||
done(); | ||
}); | ||
}); | ||
it('can deal with empty directories while computing checksum', function (done) { | ||
it('can deal with empty directories while computing checksum', function (done) { | ||
var expectations = function (data) { | ||
// md5 of | ||
// 'empty_dir' + 'd41d8cd98f00b204e9800998ecf8427e' + | ||
// 'file.txt' + '900150983cd24fb0d6963f7d28e17f72' | ||
expect(data.md5).toBe('4715a354a7871a1db629b379e6267b95'); | ||
// md5 of empty directory -> md5 of empty string | ||
expect(data.children[0].md5).toBe('d41d8cd98f00b204e9800998ecf8427e'); | ||
// md5 of 'abc' | ||
expect(data.children[1].md5).toBe('900150983cd24fb0d6963f7d28e17f72'); | ||
}; | ||
var preparations = function () { | ||
fse.mkdirsSync('dir/empty_dir'); | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
}; | ||
fse.mkdirsSync('dir/empty_dir'); | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
var expectations = function (data) { | ||
// md5 of 'empty_dir' + 'd41d8cd98f00b204e9800998ecf8427e' + 'file.txt' + '900150983cd24fb0d6963f7d28e17f72' | ||
expect(data.md5).toBe('4715a354a7871a1db629b379e6267b95'); | ||
// md5 of empty directory -> md5 of empty string | ||
expect(data.children[0].md5).toBe('d41d8cd98f00b204e9800998ecf8427e'); | ||
// md5 of 'abc' | ||
expect(data.children[1].md5).toBe('900150983cd24fb0d6963f7d28e17f72'); | ||
}; | ||
// SYNC | ||
expectations(jetpack.inspectTree('dir', { checksum: 'md5' })); | ||
preparations(); | ||
// SYNC | ||
var treeSync = jetpack.inspectTree('dir', { checksum: 'md5' }); | ||
expectations(treeSync); | ||
// ASYNC | ||
jetpack.inspectTreeAsync('dir', { checksum: 'md5' }) | ||
.then(function (treeAsync) { | ||
expectations(treeAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.inspectTreeAsync('dir', { checksum: 'md5' }) | ||
.then(function (tree) { | ||
expectations(tree); | ||
done(); | ||
}); | ||
}); | ||
it('can output relative path for every tree node', function (done) { | ||
it('can output relative path for every tree node', function (done) { | ||
var expectations = function (data) { | ||
// data will look like... | ||
// { | ||
// name: 'dir', | ||
// relativePath: '.', | ||
// children: [ | ||
// { | ||
// name: 'subdir', | ||
// relativePath: './subdir', | ||
// children: [ | ||
// { | ||
// name: 'file.txt', | ||
// relativePath: './subdir/file.txt' | ||
// } | ||
// ] | ||
// } | ||
// ] | ||
// } | ||
expect(data.relativePath).toBe('.'); | ||
expect(data.children[0].relativePath).toBe('./subdir'); | ||
expect(data.children[0].children[0].relativePath).toBe('./subdir/file.txt'); | ||
}; | ||
var preparations = function () { | ||
fse.outputFileSync('dir/subdir/file.txt', 'defg'); | ||
}; | ||
fse.outputFileSync('dir/subdir/file.txt', 'defg'); | ||
var expectations = function (data) { | ||
// data will look like... | ||
/* { | ||
name: 'dir', | ||
relativePath: '.', | ||
children: [ | ||
{ | ||
name: 'subdir', | ||
relativePath: './subdir', | ||
children: [ | ||
{ | ||
name: 'file.txt', | ||
relativePath: './subdir/file.txt' | ||
} | ||
] | ||
} | ||
] | ||
} */ | ||
expect(data.relativePath).toBe('.'); | ||
expect(data.children[0].relativePath).toBe('./subdir'); | ||
expect(data.children[0].children[0].relativePath).toBe('./subdir/file.txt'); | ||
}; | ||
// SYNC | ||
expectations(jetpack.inspectTree('dir', { relativePath: true })); | ||
preparations(); | ||
// SYNC | ||
var treeSync = jetpack.inspectTree('dir', { relativePath: true }); | ||
expectations(treeSync); | ||
// ASYNC | ||
jetpack.inspectTreeAsync('dir', { relativePath: true }) | ||
.then(function (treeAsync) { | ||
expectations(treeAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.inspectTreeAsync('dir', { relativePath: true }) | ||
.then(function (tree) { | ||
expectations(tree); | ||
done(); | ||
}); | ||
}); | ||
it('if given path is a file still works OK', function (done) { | ||
it('if given path is a file still works OK', function (done) { | ||
var expectations = function (data) { | ||
expect(data).toEqual({ | ||
name: 'file.txt', | ||
type: 'file', | ||
size: 3 | ||
}); | ||
}; | ||
var preparations = function () { | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
}; | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
var expectations = function (data) { | ||
expect(data).toEqual({ | ||
name: 'file.txt', | ||
type: 'file', | ||
size: 3, | ||
}); | ||
}; | ||
// SYNC | ||
expectations(jetpack.inspectTree('dir/file.txt')); | ||
preparations(); | ||
// SYNC | ||
var treeSync = jetpack.inspectTree('dir/file.txt'); | ||
expectations(treeSync); | ||
// ASYNC | ||
jetpack.inspectTreeAsync('dir/file.txt') | ||
.then(function (treeAsync) { | ||
expectations(treeAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.inspectTreeAsync('dir/file.txt') | ||
.then(function (tree) { | ||
expectations(tree); | ||
done(); | ||
}); | ||
}); | ||
it('deals ok with empty directory', function (done) { | ||
it('deals ok with empty directory', function (done) { | ||
var expectations = function (data) { | ||
expect(data).toEqual({ | ||
name: 'empty', | ||
type: 'dir', | ||
size: 0, | ||
children: [] | ||
}); | ||
}; | ||
var preparations = function () { | ||
fse.mkdirsSync('empty'); | ||
}; | ||
fse.mkdirsSync('empty'); | ||
var expectations = function (data) { | ||
expect(data).toEqual({ | ||
name: 'empty', | ||
type: 'dir', | ||
size: 0, | ||
children: [], | ||
}); | ||
}; | ||
// SYNC | ||
expectations(jetpack.inspectTree('empty')); | ||
preparations(); | ||
// SYNC | ||
var treeSync = jetpack.inspectTree('empty'); | ||
expectations(treeSync); | ||
// ASYNC | ||
jetpack.inspectTreeAsync('empty') | ||
.then(function (treeAsync) { | ||
expectations(treeAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.inspectTreeAsync('empty') | ||
.then(function (tree) { | ||
expectations(tree); | ||
done(); | ||
}); | ||
}); | ||
it("returns null if path doesn't exist", function (done) { | ||
it("returns null if path doesn't exist", function (done) { | ||
var expectations = function (data) { | ||
expect(data).toBe(null); | ||
}; | ||
var expectations = function (data) { | ||
expect(data).toBe(null); | ||
}; | ||
// SYNC | ||
expectations(jetpack.inspectTree('nonexistent')); | ||
// SYNC | ||
var dataSync = jetpack.inspectTree('nonexistent'); | ||
expectations(dataSync); | ||
// ASYNC | ||
jetpack.inspectTreeAsync('nonexistent') | ||
.then(function (dataAsync) { | ||
expectations(dataAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.inspectTreeAsync('nonexistent') | ||
.then(function (dataAsync) { | ||
expectations(dataAsync); | ||
done(); | ||
}); | ||
}); | ||
it("respects internal CWD of jetpack instance", function (done) { | ||
it('respects internal CWD of jetpack instance', function (done) { | ||
var expectations = function (data) { | ||
expect(data.name).toBe('b.txt'); | ||
}; | ||
var preparations = function () { | ||
fse.outputFileSync('a/b.txt', 'abc'); | ||
}; | ||
var jetContext = jetpack.cwd('a'); | ||
var expectations = function (data) { | ||
expect(data.name).toBe('b.txt'); | ||
}; | ||
fse.outputFileSync('a/b.txt', 'abc'); | ||
preparations(); | ||
// SYNC | ||
expectations(jetContext.inspectTree('b.txt')); | ||
var jetContext = jetpack.cwd('a'); | ||
// ASYNC | ||
jetContext.inspectTreeAsync('b.txt') | ||
.then(function (data) { | ||
expectations(data); | ||
done(); | ||
}); | ||
}); | ||
// SYNC | ||
var dataSync = jetContext.inspectTree('b.txt'); | ||
expectations(dataSync); | ||
describe('*nix specific', function () { | ||
if (process.platform === 'win32') { | ||
return; | ||
} | ||
// ASYNC | ||
jetContext.inspectTreeAsync('b.txt') | ||
.then(function (dataAsync) { | ||
expectations(dataAsync); | ||
done(); | ||
it('can deal with symlink', function (done) { | ||
var expectations = function (tree) { | ||
expect(tree).toEqual({ | ||
name: 'dir', | ||
type: 'dir', | ||
size: 3, | ||
children: [{ | ||
name: 'file.txt', | ||
type: 'file', | ||
size: 3 | ||
}, { | ||
name: 'symlinked_file.txt', | ||
type: 'symlink', | ||
pointsAt: 'dir/file.txt' | ||
}] | ||
}); | ||
}); | ||
}; | ||
describe('*nix specific', function () { | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
fse.symlinkSync('dir/file.txt', 'dir/symlinked_file.txt'); | ||
if (process.platform === 'win32') { | ||
return; | ||
} | ||
// SYNC | ||
expectations(jetpack.inspectTree('dir')); | ||
it('can deal with symlink', function (done) { | ||
var preparations = function () { | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
fse.symlinkSync('dir/file.txt', 'dir/symlinked_file.txt'); | ||
}; | ||
var expectations = function (data) { | ||
expect(data).toEqual({ | ||
name: 'dir', | ||
type: 'dir', | ||
size: 3, | ||
children: [{ | ||
name: 'file.txt', | ||
type: 'file', | ||
size: 3, | ||
}, { | ||
name: 'symlinked_file.txt', | ||
type: 'symlink', | ||
pointsAt: 'dir/file.txt', | ||
}], | ||
}); | ||
}; | ||
preparations(); | ||
// SYNC | ||
var dataSync = jetpack.inspectTree('dir'); | ||
expectations(dataSync); | ||
// ASYNC | ||
jetpack.inspectTreeAsync('dir') | ||
.then(function (dataAsync) { | ||
expectations(dataAsync); | ||
done(); | ||
}); | ||
}); | ||
// ASYNC | ||
jetpack.inspectTreeAsync('dir') | ||
.then(function (tree) { | ||
expectations(tree); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
}); |
/* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
describe('inspect |', function () { | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
it('can inspect a file', function (done) { | ||
var expectations = function (data) { | ||
expect(data).toEqual({ | ||
name: 'file.txt', | ||
type: 'file', | ||
size: 3 | ||
}); | ||
}; | ||
it('can inspect a file', function (done) { | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
var preparations = function () { | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
}; | ||
// SYNC | ||
expectations(jetpack.inspect('dir/file.txt')); | ||
var expectations = function (data) { | ||
expect(data).toEqual({ | ||
name: 'file.txt', | ||
type: 'file', | ||
size: 3, | ||
}); | ||
}; | ||
// ASYNC | ||
jetpack.inspectAsync('dir/file.txt') | ||
.then(function (data) { | ||
expectations(data); | ||
done(); | ||
}); | ||
}); | ||
preparations(); | ||
it('can inspect a directory', function (done) { | ||
var expectations = function (data) { | ||
expect(data).toEqual({ | ||
name: 'empty', | ||
type: 'dir' | ||
}); | ||
}; | ||
// SYNC | ||
var dataSync = jetpack.inspect('dir/file.txt'); | ||
expectations(dataSync); | ||
fse.mkdirsSync('dir/empty'); | ||
// ASYNC | ||
jetpack.inspectAsync('dir/file.txt') | ||
.then(function (dataAsync) { | ||
expectations(dataAsync); | ||
done(); | ||
}); | ||
// SYNC | ||
expectations(jetpack.inspect('dir/empty')); | ||
// ASYNC | ||
jetpack.inspectAsync('dir/empty') | ||
.then(function (data) { | ||
expectations(data); | ||
done(); | ||
}); | ||
}); | ||
it('can inspect a directory', function (done) { | ||
it("returns null if path doesn't exist", function (done) { | ||
var expectations = function (data) { | ||
expect(data).toBe(null); | ||
}; | ||
var preparations = function () { | ||
fse.mkdirsSync('dir/empty'); | ||
}; | ||
// SYNC | ||
expectations(jetpack.inspect('nonexistent')); | ||
var expectations = function (data) { | ||
expect(data).toEqual({ | ||
name: 'empty', | ||
type: 'dir', | ||
}); | ||
}; | ||
preparations(); | ||
// SYNC | ||
var dataSync = jetpack.inspect('dir/empty'); | ||
expectations(dataSync); | ||
// ASYNC | ||
jetpack.inspectAsync('dir/empty') | ||
.then(function (dataAsync) { | ||
expectations(dataAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.inspectAsync('nonexistent') | ||
.then(function (data) { | ||
expectations(data); | ||
done(); | ||
}); | ||
}); | ||
it("returns null if path doesn't exist", function (done) { | ||
it('can output file times (ctime, mtime, atime)', function (done) { | ||
var expectations = function (data) { | ||
expect(typeof data.accessTime.getTime).toBe('function'); | ||
expect(typeof data.modifyTime.getTime).toBe('function'); | ||
expect(typeof data.changeTime.getTime).toBe('function'); | ||
}; | ||
var expectations = function (data) { | ||
expect(data).toBe(null); | ||
}; | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
// SYNC | ||
var dataSync = jetpack.inspect('nonexistent'); | ||
expectations(dataSync); | ||
// SYNC | ||
expectations(jetpack.inspect('dir/file.txt', { times: true })); | ||
// ASYNC | ||
jetpack.inspectAsync('nonexistent') | ||
.then(function (dataAsync) { | ||
expectations(dataAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.inspectAsync('dir/file.txt', { times: true }) | ||
.then(function (data) { | ||
expectations(data); | ||
done(); | ||
}); | ||
}); | ||
it('can output file times (ctime, mtime, atime)', function (done) { | ||
it('can output absolute path', function (done) { | ||
var expectations = function (data) { | ||
expect(data.absolutePath).toBe(jetpack.path('dir/file.txt')); | ||
}; | ||
var preparations = function () { | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
}; | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
var expectations = function (data) { | ||
expect(typeof data.accessTime.getTime).toBe('function'); | ||
expect(typeof data.modifyTime.getTime).toBe('function'); | ||
expect(typeof data.changeTime.getTime).toBe('function'); | ||
}; | ||
// SYNC | ||
expectations(jetpack.inspect('dir/file.txt', { absolutePath: true })); | ||
preparations(); | ||
// SYNC | ||
var dataSync = jetpack.inspect('dir/file.txt', { times: true }); | ||
expectations(dataSync); | ||
// ASYNC | ||
jetpack.inspectAsync('dir/file.txt', { times: true }) | ||
.then(function (dataAsync) { | ||
expectations(dataAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.inspectAsync('dir/file.txt', { absolutePath: true }) | ||
.then(function (data) { | ||
expectations(data); | ||
done(); | ||
}); | ||
}); | ||
it('can output absolute path', function (done) { | ||
it('respects internal CWD of jetpack instance', function (done) { | ||
var expectations = function (data) { | ||
expect(data.name).toBe('b.txt'); | ||
}; | ||
var preparations = function () { | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
}; | ||
var jetContext = jetpack.cwd('a'); | ||
var expectations = function (data) { | ||
expect(data.absolutePath).toBe(jetpack.path('dir/file.txt')); | ||
}; | ||
fse.outputFileSync('a/b.txt', 'abc'); | ||
preparations(); | ||
// SYNC | ||
expectations(jetContext.inspect('b.txt')); | ||
// SYNC | ||
var dataSync = jetpack.inspect('dir/file.txt', { absolutePath: true }); | ||
expectations(dataSync); | ||
// ASYNC | ||
jetpack.inspectAsync('dir/file.txt', { absolutePath: true }) | ||
.then(function (dataAsync) { | ||
expectations(dataAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetContext.inspectAsync('b.txt') | ||
.then(function (data) { | ||
expectations(data); | ||
done(); | ||
}); | ||
}); | ||
it("respects internal CWD of jetpack instance", function (done) { | ||
var preparations = function () { | ||
fse.outputFileSync('a/b.txt', 'abc'); | ||
}; | ||
describe('checksums |', function () { | ||
[ | ||
{ | ||
name: 'md5', | ||
content: 'abc', | ||
expected: '900150983cd24fb0d6963f7d28e17f72' | ||
}, | ||
{ | ||
name: 'sha1', | ||
content: 'abc', | ||
expected: 'a9993e364706816aba3e25717850c26c9cd0d89d' | ||
}, | ||
{ | ||
name: 'sha256', | ||
content: 'abc', | ||
expected: 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad' | ||
}, | ||
{ | ||
name: 'md5', | ||
content: '', // just to check if we are counting checksums of empty file correctly | ||
expected: 'd41d8cd98f00b204e9800998ecf8427e' | ||
} | ||
].forEach(function (test) { | ||
it(test.name, function (done) { | ||
var expectations = function (data) { | ||
expect(data.name).toBe('b.txt'); | ||
expect(data[test.name]).toBe(test.expected); | ||
}; | ||
preparations(); | ||
fse.outputFileSync('file.txt', test.content); | ||
var jetContext = jetpack.cwd('a'); | ||
// SYNC | ||
preparations(); | ||
var dataSync = jetContext.inspect('b.txt'); | ||
expectations(dataSync); | ||
expectations(jetpack.inspect('file.txt', { checksum: test.name })); | ||
// ASYNC | ||
preparations(); | ||
jetContext.inspectAsync('b.txt') | ||
.then(function (dataAsync) { | ||
expectations(dataAsync); | ||
done(); | ||
jetpack.inspectAsync('file.txt', { checksum: test.name }) | ||
.then(function (data) { | ||
expectations(data); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
}); | ||
describe('checksums |', function () { | ||
describe('*nix specific', function () { | ||
if (process.platform === 'win32') { | ||
return; | ||
} | ||
[ | ||
{ | ||
name: 'md5', | ||
content: 'abc', | ||
expected: '900150983cd24fb0d6963f7d28e17f72', | ||
}, | ||
{ | ||
name: 'sha1', | ||
content: 'abc', | ||
expected: 'a9993e364706816aba3e25717850c26c9cd0d89d', | ||
}, | ||
{ | ||
name: 'sha256', | ||
content: 'abc', | ||
expected: 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad', | ||
}, | ||
{ | ||
name: 'md5', | ||
content: '', // just to check if we are counting checksums of empty file correctly | ||
expected: 'd41d8cd98f00b204e9800998ecf8427e', | ||
}, | ||
].forEach(function (test) { | ||
it('can output file mode', function (done) { | ||
var expectations = function (data) { | ||
expect(typeof data.mode).toBe('number'); | ||
}; | ||
it(test.name, function (done) { | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
var preparations = function () { | ||
fse.outputFileSync('file.txt', test.content); | ||
}; | ||
// SYNC | ||
expectations(jetpack.inspect('dir/file.txt', { mode: true })); | ||
var expectations = function (data) { | ||
expect(data[test.name]).toBe(test.expected); | ||
}; | ||
preparations(); | ||
// SYNC | ||
var dataSync = jetpack.inspect('file.txt', { checksum: test.name }); | ||
expectations(dataSync); | ||
// ASYNC | ||
jetpack.inspectAsync('file.txt', { checksum: test.name }) | ||
.then(function (dataAsync) { | ||
expectations(dataAsync); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
// ASYNC | ||
jetpack.inspectAsync('dir/file.txt', { mode: true }) | ||
.then(function (data) { | ||
expectations(data); | ||
done(); | ||
}); | ||
}); | ||
describe('*nix specific', function () { | ||
if (process.platform === 'win32') { | ||
return; | ||
} | ||
it('can output file mode', function (done) { | ||
var preparations = function () { | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
}; | ||
var expectations = function (data) { | ||
expect(typeof data.mode).toBe('number'); | ||
}; | ||
preparations(); | ||
// SYNC | ||
var dataSync = jetpack.inspect('dir/file.txt', { mode: true }); | ||
expectations(dataSync); | ||
// ASYNC | ||
jetpack.inspectAsync('dir/file.txt', { mode: true }) | ||
.then(function (dataAsync) { | ||
expectations(dataAsync); | ||
done(); | ||
}); | ||
it('follows symlink by default', function (done) { | ||
var expectations = function (data) { | ||
expect(data).toEqual({ | ||
name: 'symlinked_file.txt', | ||
type: 'file', | ||
size: 3 | ||
}); | ||
}; | ||
it('follows symlink by default', function (done) { | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
fse.symlinkSync('dir/file.txt', 'symlinked_file.txt'); | ||
var preparations = function () { | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
fse.symlinkSync('dir/file.txt', 'symlinked_file.txt'); | ||
}; | ||
// SYNC | ||
expectations(jetpack.inspect('symlinked_file.txt')); | ||
var expectations = function (data) { | ||
expect(data).toEqual({ | ||
name: 'symlinked_file.txt', | ||
type: 'file', | ||
size: 3, | ||
}); | ||
}; | ||
// ASYNC | ||
jetpack.inspectAsync('symlinked_file.txt') | ||
.then(function (data) { | ||
expectations(data); | ||
done(); | ||
}); | ||
}); | ||
preparations(); | ||
// SYNC | ||
var dataSync = jetpack.inspect('symlinked_file.txt'); | ||
expectations(dataSync); | ||
// ASYNC | ||
jetpack.inspectAsync('symlinked_file.txt') | ||
.then(function (dataAsync) { | ||
expectations(dataAsync); | ||
done(); | ||
}); | ||
it('stats symlink if option specified', function (done) { | ||
var expectations = function (data) { | ||
expect(data).toEqual({ | ||
name: 'symlinked_file.txt', | ||
type: 'symlink', | ||
pointsAt: 'dir/file.txt' | ||
}); | ||
}; | ||
it('stats symlink if option specified', function (done) { | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
fse.symlinkSync('dir/file.txt', 'symlinked_file.txt'); | ||
var preparations = function () { | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
fse.symlinkSync('dir/file.txt', 'symlinked_file.txt'); | ||
}; | ||
// SYNC | ||
expectations(jetpack.inspect('symlinked_file.txt', { symlinks: true })); | ||
var expectations = function (data) { | ||
expect(data).toEqual({ | ||
name: 'symlinked_file.txt', | ||
type: 'symlink', | ||
pointsAt: 'dir/file.txt', | ||
}); | ||
}; | ||
preparations(); | ||
// SYNC | ||
var dataSync = jetpack.inspect('symlinked_file.txt', { symlinks: true }); | ||
expectations(dataSync); | ||
// ASYNC | ||
jetpack.inspectAsync('symlinked_file.txt', { symlinks: true }) | ||
.then(function (dataAsync) { | ||
expectations(dataAsync); | ||
done(); | ||
}); | ||
}); | ||
// ASYNC | ||
jetpack.inspectAsync('symlinked_file.txt', { symlinks: true }) | ||
.then(function (data) { | ||
expectations(data); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
}); |
/* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
describe('list |', function () { | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
it('lists file names in given path', function (done) { | ||
var expectations = function (data) { | ||
expect(data).toEqual(['empty', 'empty.txt', 'file.txt', 'subdir']); | ||
}; | ||
it('lists file names by default', function (done) { | ||
fse.mkdirsSync('dir/empty'); | ||
fse.outputFileSync('dir/empty.txt', ''); | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
fse.outputFileSync('dir/subdir/file.txt', 'defg'); | ||
var preparations = function () { | ||
fse.mkdirsSync('dir/empty'); | ||
fse.outputFileSync('dir/empty.txt', ''); | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
fse.outputFileSync('dir/subdir/file.txt', 'defg'); | ||
}; | ||
// SYNC | ||
expectations(jetpack.list('dir')); | ||
var expectations = function (data) { | ||
expect(data).toEqual(['empty', 'empty.txt', 'file.txt', 'subdir']); | ||
}; | ||
preparations(); | ||
// SYNC | ||
var listSync = jetpack.list('dir'); | ||
expectations(listSync); | ||
// ASYNC | ||
jetpack.listAsync('dir') | ||
.then(function (listAsync) { | ||
expectations(listAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.listAsync('dir') | ||
.then(function (listAsync) { | ||
expectations(listAsync); | ||
done(); | ||
}); | ||
}); | ||
it('lists inspect objects if true passed as second parameter', function (done) { | ||
it('lists CWD if no path parameter passed', function (done) { | ||
var expectations = function (data) { | ||
expect(data).toEqual(['a', 'b']); | ||
}; | ||
var preparations = function () { | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
fse.mkdirsSync('dir/next'); | ||
}; | ||
var jetContext = jetpack.cwd('dir'); | ||
var expectations = function (data) { | ||
expect(data).toEqual([ | ||
{ | ||
name: 'file.txt', | ||
type: 'file', | ||
size: 3, | ||
}, { | ||
name: 'next', | ||
type: 'dir', | ||
}, | ||
]); | ||
}; | ||
fse.mkdirsSync('dir/a'); | ||
fse.outputFileSync('dir/b'); | ||
preparations(); | ||
// SYNC | ||
expectations(jetContext.list()); | ||
// SYNC | ||
var listSync = jetpack.list('dir', true); | ||
expectations(listSync); | ||
// ASYNC | ||
jetpack.listAsync('dir', true) | ||
.then(function (listAsync) { | ||
expectations(listAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetContext.listAsync() | ||
.then(function (list) { | ||
expectations(list); | ||
done(); | ||
}); | ||
}); | ||
it('lists inspect objects with additional options if options passed as second parameter', function (done) { | ||
it("returns null if path doesn't exist", function (done) { | ||
var expectations = function (data) { | ||
expect(data).toBe(null); | ||
}; | ||
var preparations = function () { | ||
fse.outputFileSync('dir/file.txt', 'abc'); | ||
}; | ||
// SYNC | ||
expectations(jetpack.list('nonexistent')); | ||
var expectations = function (data) { | ||
expect(data[0].md5).toBeDefined(); | ||
}; | ||
preparations(); | ||
// SYNC | ||
var listSync = jetpack.list('dir', { checksum: 'md5' }); | ||
expectations(listSync); | ||
// ASYNC | ||
jetpack.listAsync('dir', { checksum: 'md5' }) | ||
.then(function (listAsync) { | ||
expectations(listAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.listAsync('nonexistent') | ||
.then(function (data) { | ||
expectations(data); | ||
done(); | ||
}); | ||
}); | ||
it("returns null if path doesn't exist", function (done) { | ||
it('returns null if given path is a file', function (done) { | ||
var expectations = function (list) { | ||
expect(list).toBe(null); | ||
}; | ||
var expectations = function (data) { | ||
expect(data).toBe(null); | ||
}; | ||
fse.outputFileSync('file.txt', 'abc'); | ||
// SYNC | ||
var dataSync = jetpack.list('nonexistent'); | ||
expectations(dataSync); | ||
// SYNC | ||
expectations(jetpack.list('file.txt')); | ||
// ASYNC | ||
jetpack.listAsync('nonexistent') | ||
.then(function (dataAsync) { | ||
expectations(dataAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.listAsync('file.txt') | ||
.then(function (list) { | ||
expectations(list); | ||
done(); | ||
}); | ||
}); | ||
it("returns null if given path is a file", function (done) { | ||
it('respects internal CWD of jetpack instance', function (done) { | ||
var expectations = function (data) { | ||
expect(data).toEqual(['c.txt']); | ||
}; | ||
var preparations = function () { | ||
fse.outputFileSync('file.txt', 'abc'); | ||
}; | ||
var jetContext = jetpack.cwd('a'); | ||
var expectations = function (list) { | ||
expect(list).toBe(null); | ||
}; | ||
fse.outputFileSync('a/b/c.txt', 'abc'); | ||
preparations(); | ||
// SYNC | ||
expectations(jetContext.list('b')); | ||
// SYNC | ||
var listSync = jetpack.list('file.txt'); | ||
expectations(listSync); | ||
// ASYNC | ||
jetpack.listAsync('file.txt') | ||
.then(function (listAsync) { | ||
expectations(listAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetContext.listAsync('b') | ||
.then(function (data) { | ||
expectations(data); | ||
done(); | ||
}); | ||
it("respects internal CWD of jetpack instance", function (done) { | ||
var preparations = function () { | ||
fse.outputFileSync('a/b/c.txt', 'abc'); | ||
}; | ||
var expectations = function (data) { | ||
expect(data).toEqual(['c.txt']); | ||
}; | ||
preparations(); | ||
var jetContext = jetpack.cwd('a'); | ||
// SYNC | ||
preparations(); | ||
var dataSync = jetContext.list('b'); | ||
expectations(dataSync); | ||
// ASYNC | ||
preparations(); | ||
jetContext.listAsync('b') | ||
.then(function (dataAsync) { | ||
expectations(dataAsync); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
}); |
/* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
describe('move |', function () { | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
it('moves file', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('a/b.txt').not.toExist(); | ||
expect('c.txt').toBeFileWithContent('abc'); | ||
}; | ||
it("moves file", function (done) { | ||
// SYNC | ||
preparations(); | ||
jetpack.move('a/b.txt', 'c.txt'); | ||
expectations(); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('a/b.txt').not.toExist(); | ||
expect('c.txt').toBeFileWithContent('abc'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.move('a/b.txt', 'c.txt'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.moveAsync('a/b.txt', 'c.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.moveAsync('a/b.txt', 'c.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("moves directory", function (done) { | ||
it('moves directory', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b/c.txt', 'abc'); | ||
fse.mkdirsSync('x'); | ||
}; | ||
var expectations = function () { | ||
expect('a').not.toExist(); | ||
expect('x/y/b/c.txt').toBeFileWithContent('abc'); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b/c.txt', 'abc'); | ||
fse.mkdirsSync('x'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.move('a', 'x/y'); | ||
expectations(); | ||
var expectations = function () { | ||
expect('a').not.toExist(); | ||
expect('x/y/b/c.txt').toBeFileWithContent('abc'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.move('a', 'x/y'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.moveAsync('a', 'x/y') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.moveAsync('a', 'x/y') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("creates nonexistent directories for destination path", function (done) { | ||
it('creates nonexistent directories for destination path', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('a.txt').not.toExist(); | ||
expect('a/b/z.txt').toBeFileWithContent('abc'); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a.txt', 'abc'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.move('a.txt', 'a/b/z.txt'); | ||
expectations(); | ||
var expectations = function () { | ||
expect('a.txt').not.toExist(); | ||
expect('a/b/z.txt').toBeFileWithContent('abc'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.move('a.txt', 'a/b/z.txt'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.moveAsync('a.txt', 'a/b/z.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.moveAsync('a.txt', 'a/b/z.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("generates nice error when source path doesn't exist", function (done) { | ||
it("generates nice error when source path doesn't exist", function (done) { | ||
var expectations = function (err) { | ||
expect(err.code).toBe('ENOENT'); | ||
expect(err.message).toMatch(/^Path to move doesn't exist/); | ||
}; | ||
var expectations = function (err) { | ||
expect(err.code).toBe('ENOENT'); | ||
expect(err.message).toMatch(/^Path to move doesn't exist/); | ||
}; | ||
// SYNC | ||
try { | ||
jetpack.move('a', 'b'); | ||
throw new Error('to make sure this code throws'); | ||
} catch (err) { | ||
expectations(err); | ||
} | ||
// SYNC | ||
try { | ||
jetpack.move('a', 'b'); | ||
throw new Error("to make sure this code throws"); | ||
} catch (err) { | ||
expectations(err); | ||
} | ||
// ASYNC | ||
jetpack.moveAsync('a', 'b') | ||
.catch(function (err) { | ||
expectations(err); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.moveAsync('a', 'b') | ||
.catch(function (err) { | ||
expectations(err); | ||
done(); | ||
}); | ||
}); | ||
it("respects internal CWD of jetpack instance", function (done) { | ||
it('respects internal CWD of jetpack instance', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('a/b.txt').not.toExist(); | ||
expect('a/x.txt').toBeFileWithContent('abc'); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b.txt', 'abc'); | ||
}; | ||
var jetContext = jetpack.cwd('a'); | ||
var expectations = function () { | ||
expect('a/b.txt').not.toExist(); | ||
expect('a/x.txt').toBeFileWithContent('abc'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetContext.move('b.txt', 'x.txt'); | ||
expectations(); | ||
var jetContext = jetpack.cwd('a'); | ||
// SYNC | ||
preparations(); | ||
jetContext.move('b.txt', 'x.txt'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetContext.moveAsync('b.txt', 'x.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetContext.moveAsync('b.txt', 'x.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
}); |
/* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
describe('path', function () { | ||
var pathUtil = require('path'); | ||
var jetpack = require('..'); | ||
var pathUtil = require('path'); | ||
var jetpack = require('..'); | ||
it('if empty returns same path as cwd()', function () { | ||
expect(jetpack.path()).toBe(jetpack.cwd()); | ||
expect(jetpack.path('')).toBe(jetpack.cwd()); | ||
expect(jetpack.path('.')).toBe(jetpack.cwd()); | ||
}); | ||
it('if empty returns same path as cwd()', function () { | ||
expect(jetpack.path()).toBe(jetpack.cwd()); | ||
expect(jetpack.path('')).toBe(jetpack.cwd()); | ||
expect(jetpack.path('.')).toBe(jetpack.cwd()); | ||
}); | ||
it('is absolute if prepending slash present', function () { | ||
expect(jetpack.path('/blah')).toBe(pathUtil.resolve('/blah')); | ||
}); | ||
it('is absolute if prepending slash present', function () { | ||
expect(jetpack.path('/blah')).toBe(pathUtil.resolve('/blah')); | ||
}); | ||
it('resolves to CWD path of this jetpack instance', function () { | ||
var a = pathUtil.join(jetpack.cwd(), 'a'); | ||
// Create jetpack instance with other CWD | ||
var jetpackSubdir = jetpack.cwd('subdir'); | ||
var b = pathUtil.join(jetpack.cwd(), 'subdir', 'b'); | ||
expect(jetpack.path('a')).toBe(a); | ||
expect(jetpackSubdir.path('b')).toBe(b); | ||
}); | ||
it('resolves to CWD path of this jetpack instance', function () { | ||
var a = pathUtil.join(jetpack.cwd(), 'a'); | ||
expect(jetpack.path('a')).toBe(a); | ||
// Create jetpack instance with other CWD | ||
var jetpackSubdir = jetpack.cwd('subdir'); | ||
var b = pathUtil.join(jetpack.cwd(), 'subdir', 'b'); | ||
expect(jetpackSubdir.path('b')).toBe(b); | ||
}); | ||
it('can take unlimited number of arguments as path parts', function () { | ||
var abc = pathUtil.join(jetpack.cwd(), 'a', 'b', 'c'); | ||
expect(jetpack.path('a', 'b', 'c')).toBe(abc); | ||
}); | ||
it('can take unlimited number of arguments as path parts', function () { | ||
var abc = pathUtil.join(jetpack.cwd(), 'a', 'b', 'c'); | ||
expect(jetpack.path('a', 'b', 'c')).toBe(abc); | ||
}); | ||
}); |
/* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
describe('read |', function () { | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
it('reads file as a string', function (done) { | ||
var expectations = function (content) { | ||
expect(content).toBe('abc'); | ||
}; | ||
it('reads file as a string', function (done) { | ||
fse.outputFileSync('file.txt', 'abc'); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('file.txt', 'abc'); | ||
}; | ||
// SYNC | ||
expectations(jetpack.read('file.txt')); // defaults to 'utf8' | ||
expectations(jetpack.read('file.txt', 'utf8')); // explicitly specified | ||
var expectations = function (content) { | ||
expect(content).toBe('abc'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
var contentSync = jetpack.read('file.txt'); // defaults to 'utf8' | ||
expectations(contentSync); | ||
contentSync = jetpack.read('file.txt', 'utf8'); // explicitly said | ||
expectations(contentSync); | ||
// ASYNC | ||
preparations(); | ||
jetpack.readAsync('file.txt') // defaults to 'utf8' | ||
.then(function (contentAsync) { | ||
expectations(contentAsync); | ||
return jetpack.readAsync('file.txt', 'utf8'); // explicitly said | ||
}) | ||
.then(function (contentAsync) { | ||
expectations(contentAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.readAsync('file.txt') // defaults to 'utf8' | ||
.then(function (content) { | ||
expectations(content); | ||
return jetpack.readAsync('file.txt', 'utf8'); // explicitly said | ||
}) | ||
.then(function (content) { | ||
expectations(content); | ||
done(); | ||
}); | ||
}); | ||
it('reads file as a Buffer', function (done) { | ||
it('reads file as a Buffer', function (done) { | ||
var expectations = function (content) { | ||
expect(Buffer.isBuffer(content)).toBe(true); | ||
expect(content.length).toBe(2); | ||
expect(content[0]).toBe(11); | ||
expect(content[1]).toBe(22); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('file.txt', new Buffer([11, 22])); | ||
}; | ||
fse.outputFileSync('file.txt', new Buffer([11, 22])); | ||
var expectations = function (content) { | ||
expect(Buffer.isBuffer(content)).toBe(true); | ||
expect(content.length).toBe(2); | ||
expect(content[0]).toBe(11); | ||
expect(content[1]).toBe(22); | ||
}; | ||
// SYNC | ||
expectations(jetpack.read('file.txt', 'buffer')); | ||
// SYNC | ||
preparations(); | ||
var contentSync = jetpack.read('file.txt', 'buf'); | ||
expectations(contentSync); | ||
// ASYNC | ||
preparations(); | ||
jetpack.readAsync('file.txt', 'buf') | ||
.then(function (contentAsync) { | ||
expectations(contentAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.readAsync('file.txt', 'buffer') | ||
.then(function (content) { | ||
expectations(content); | ||
done(); | ||
}); | ||
}); | ||
it('reads file as JSON', function (done) { | ||
it('reads file as a Buffer (deprecated)', function (done) { | ||
var expectations = function (content) { | ||
expect(Buffer.isBuffer(content)).toBe(true); | ||
expect(content.length).toBe(2); | ||
expect(content[0]).toBe(11); | ||
expect(content[1]).toBe(22); | ||
}; | ||
var obj = { | ||
utf8: "ąćłźż", | ||
}; | ||
fse.outputFileSync('file.txt', new Buffer([11, 22])); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('file.json', JSON.stringify(obj)); | ||
}; | ||
// SYNC | ||
expectations(jetpack.read('file.txt', 'buf')); | ||
var expectations = function (content) { | ||
expect(content).toEqual(obj); | ||
}; | ||
// SYNC | ||
preparations(); | ||
var contentSync = jetpack.read('file.json', 'json'); | ||
expectations(contentSync); | ||
// ASYNC | ||
preparations(); | ||
jetpack.readAsync('file.json', 'json') | ||
.then(function (contentAsync) { | ||
expectations(contentAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.readAsync('file.txt', 'buf') | ||
.then(function (content) { | ||
expectations(content); | ||
done(); | ||
}); | ||
}); | ||
it('gives nice error message when JSON parsing failed', function (done) { | ||
it('reads file as JSON', function (done) { | ||
var obj = { | ||
utf8: 'ąćłźż' | ||
}; | ||
var expectations = function (content) { | ||
expect(content).toEqual(obj); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('file.json', '{ "abc: 123 }'); // Malformed JSON | ||
}; | ||
fse.outputFileSync('file.json', JSON.stringify(obj)); | ||
var expectations = function (err) { | ||
expect(err.message).toContain('JSON parsing failed while reading'); | ||
}; | ||
// SYNC | ||
expectations(jetpack.read('file.json', 'json')); | ||
// SYNC | ||
preparations(); | ||
try { | ||
jetpack.read('file.json', 'json'); | ||
} catch (err) { | ||
expectations(err); | ||
} | ||
// ASYNC | ||
preparations(); | ||
jetpack.readAsync('file.json', 'json') | ||
.catch(function (err) { | ||
expectations(err); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.readAsync('file.json', 'json') | ||
.then(function (content) { | ||
expectations(content); | ||
done(); | ||
}); | ||
}); | ||
it('reads file as JSON with Date parsing', function (done) { | ||
it('gives nice error message when JSON parsing failed', function (done) { | ||
var expectations = function (err) { | ||
expect(err.message).toContain('JSON parsing failed while reading'); | ||
}; | ||
var obj = { | ||
utf8: "ąćłźż", | ||
date: new Date(), | ||
}; | ||
fse.outputFileSync('file.json', '{ "abc: 123 }'); // Malformed JSON | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('file.json', JSON.stringify(obj)); | ||
}; | ||
// SYNC | ||
try { | ||
jetpack.read('file.json', 'json'); | ||
} catch (err) { | ||
expectations(err); | ||
} | ||
var expectations = function (content) { | ||
expect(content).toEqual(obj); | ||
}; | ||
// SYNC | ||
preparations(); | ||
var contentSync = jetpack.read('file.json', 'jsonWithDates'); | ||
expectations(contentSync); | ||
// ASYNC | ||
preparations(); | ||
jetpack.readAsync('file.json', 'jsonWithDates') | ||
.then(function (contentAsync) { | ||
expectations(contentAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.readAsync('file.json', 'json') | ||
.catch(function (err) { | ||
expectations(err); | ||
done(); | ||
}); | ||
}); | ||
it("returns null if file doesn't exist", function (done) { | ||
it('reads file as JSON with Date parsing', function (done) { | ||
var obj = { | ||
utf8: 'ąćłźż', | ||
date: new Date() | ||
}; | ||
var expectations = function (content) { | ||
expect(content).toEqual(obj); | ||
}; | ||
var expectations = function (content) { | ||
expect(content).toBe(null); | ||
}; | ||
fse.outputFileSync('file.json', JSON.stringify(obj)); | ||
// SYNC | ||
var contentSync = jetpack.read('nonexistent.txt'); | ||
expectations(contentSync); | ||
// SYNC | ||
expectations(jetpack.read('file.json', 'jsonWithDates')); | ||
// ASYNC | ||
jetpack.readAsync('nonexistent.txt') | ||
.then(function (contentAsync) { | ||
expectations(contentAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.readAsync('file.json', 'jsonWithDates') | ||
.then(function (content) { | ||
expectations(content); | ||
done(); | ||
}); | ||
}); | ||
it("throws if given path is a directory", function (done) { | ||
it("returns null if file doesn't exist", function (done) { | ||
var expectations = function (content) { | ||
expect(content).toBe(null); | ||
}; | ||
var preparations = function () { | ||
fse.mkdirsSync('dir'); | ||
}; | ||
// SYNC | ||
expectations(jetpack.read('nonexistent.txt')); | ||
var expectations = function (err) { | ||
expect(err.code).toBe('EISDIR'); | ||
}; | ||
// ASYNC | ||
jetpack.readAsync('nonexistent.txt') | ||
.then(function (content) { | ||
expectations(content); | ||
done(); | ||
}); | ||
}); | ||
preparations(); | ||
it('throws if given path is a directory', function (done) { | ||
var expectations = function (err) { | ||
expect(err.code).toBe('EISDIR'); | ||
}; | ||
// SYNC | ||
try { | ||
jetpack.read('dir'); | ||
throw new Error('to make sure this code throws'); | ||
} catch (err) { | ||
expectations(err); | ||
} | ||
fse.mkdirsSync('dir'); | ||
// ASYNC | ||
jetpack.readAsync('dir') | ||
.catch(function (err) { | ||
expectations(err); | ||
done(); | ||
}); | ||
// SYNC | ||
try { | ||
jetpack.read('dir'); | ||
throw new Error('to make sure this code throws'); | ||
} catch (err) { | ||
expectations(err); | ||
} | ||
// ASYNC | ||
jetpack.readAsync('dir') | ||
.catch(function (err) { | ||
expectations(err); | ||
done(); | ||
}); | ||
}); | ||
it("respects internal CWD of jetpack instance", function (done) { | ||
it('respects internal CWD of jetpack instance', function (done) { | ||
var expectations = function (data) { | ||
expect(data).toBe('abc'); | ||
}; | ||
var preparations = function () { | ||
fse.outputFileSync('a/file.txt', 'abc'); | ||
}; | ||
var jetContext = jetpack.cwd('a'); | ||
fse.outputFileSync('a/file.txt', 'abc'); | ||
var expectations = function (data) { | ||
expect(data).toBe('abc'); | ||
}; | ||
// SYNC | ||
expectations(jetContext.read('file.txt')); | ||
preparations(); | ||
var jetContext = jetpack.cwd('a'); | ||
// SYNC | ||
var dataSync = jetContext.read('file.txt'); | ||
expectations(dataSync); | ||
// ASYNC | ||
jetContext.readAsync('file.txt') | ||
.then(function (dataAsync) { | ||
expectations(dataAsync); | ||
done(); | ||
}); | ||
// ASYNC | ||
jetContext.readAsync('file.txt') | ||
.then(function (data) { | ||
expectations(data); | ||
done(); | ||
}); | ||
}); | ||
}); |
/* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
describe('remove', function () { | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
it("doesn't throw if path already doesn't exist", function (done) { | ||
// SYNC | ||
jetpack.remove('dir'); | ||
it("doesn't throw if path already doesn't exist", function (done) { | ||
// SYNC | ||
jetpack.remove('dir'); | ||
// ASYNC | ||
jetpack.removeAsync('dir') | ||
.then(function () { | ||
done(); | ||
}); | ||
// ASYNC | ||
jetpack.removeAsync('dir') | ||
.then(function () { | ||
done(); | ||
}); | ||
}); | ||
it("should delete file", function (done) { | ||
it('should delete file', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('file.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('file.txt').not.toExist(); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('file.txt', 'abc'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.remove('file.txt'); | ||
expectations(); | ||
var expectations = function () { | ||
expect('file.txt').not.toExist(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.remove('file.txt'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.removeAsync('file.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.removeAsync('file.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("removes directory with stuff inside", function (done) { | ||
it('removes directory with stuff inside', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirsSync('a/b/c'); | ||
fse.outputFileSync('a/f.txt', 'abc'); | ||
fse.outputFileSync('a/b/f.txt', '123'); | ||
}; | ||
var expectations = function () { | ||
expect('a').not.toExist(); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirsSync('a/b/c'); | ||
fse.outputFileSync('a/f.txt', 'abc'); | ||
fse.outputFileSync('a/b/f.txt', '123'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.remove('a'); | ||
expectations(); | ||
var expectations = function () { | ||
expect('a').not.toExist(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.remove('a'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.removeAsync('a') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.removeAsync('a') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("respects internal CWD of jetpack instance", function (done) { | ||
it('respects internal CWD of jetpack instance', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b/c.txt', '123'); | ||
}; | ||
var expectations = function () { | ||
expect('a').toExist(); | ||
expect('a/b').not.toExist(); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b/c.txt', '123'); | ||
}; | ||
var jetContext = jetpack.cwd('a'); | ||
var expectations = function () { | ||
expect('a').toExist(); | ||
expect('a/b').not.toExist(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetContext.remove('b'); | ||
expectations(); | ||
var jetContext = jetpack.cwd('a'); | ||
// SYNC | ||
preparations(); | ||
jetContext.remove('b'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetContext.removeAsync('b') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetContext.removeAsync('b') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
describe('*nix specific', function () { | ||
it('can be called witn no parameters, what will remove CWD directory', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b/c.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('a').not.toExist(); | ||
}; | ||
if (process.platform === 'win32') { | ||
return; | ||
} | ||
var jetContext = jetpack.cwd('a'); | ||
it('removes only symlinks, never real content where symlinks point', function (done) { | ||
// SYNC | ||
preparations(); | ||
jetContext.remove(); | ||
expectations(); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('have_to_stay_file', 'abc'); | ||
fse.mkdirsSync('to_remove'); | ||
fse.symlinkSync('../have_to_stay_file', 'to_remove/symlink'); | ||
// Make sure we symlinked it properly. | ||
expect(fse.readFileSync('to_remove/symlink', 'utf8')).toBe('abc'); | ||
}; | ||
// ASYNC | ||
preparations(); | ||
jetContext.removeAsync() | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
var expectations = function () { | ||
expect('have_to_stay_file').toBeFileWithContent('abc'); | ||
expect('to_remove').not.toExist(); | ||
}; | ||
describe('*nix specific', function () { | ||
if (process.platform === 'win32') { | ||
return; | ||
} | ||
// SYNC | ||
preparations(); | ||
jetpack.remove('to_remove'); | ||
expectations(); | ||
it('removes only symlinks, never real content where symlinks point', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('have_to_stay_file', 'abc'); | ||
fse.mkdirsSync('to_remove'); | ||
fse.symlinkSync('../have_to_stay_file', 'to_remove/symlink'); | ||
// Make sure we symlinked it properly. | ||
expect(fse.readFileSync('to_remove/symlink', 'utf8')).toBe('abc'); | ||
}; | ||
var expectations = function () { | ||
expect('have_to_stay_file').toBeFileWithContent('abc'); | ||
expect('to_remove').not.toExist(); | ||
}; | ||
// ASYNC | ||
preparations(); | ||
jetpack.removeAsync('to_remove') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
// SYNC | ||
preparations(); | ||
jetpack.remove('to_remove'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.removeAsync('to_remove') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
}); |
/* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
describe('rename |', function () { | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
it('renames file', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('a/b.txt').not.toExist(); | ||
expect('a/x.txt').toBeFileWithContent('abc'); | ||
}; | ||
it("renames file", function (done) { | ||
// SYNC | ||
preparations(); | ||
jetpack.rename('a/b.txt', 'x.txt'); | ||
expectations(); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('a/b.txt').not.toExist(); | ||
expect('a/x.txt').toBeFileWithContent('abc'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.rename('a/b.txt', 'x.txt'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.renameAsync('a/b.txt', 'x.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.renameAsync('a/b.txt', 'x.txt') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("renames directory", function (done) { | ||
it('renames directory', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b/c.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('a/b').not.toExist(); | ||
expect('a/x').toBeDirectory(); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b/c.txt', 'abc'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.rename('a/b', 'x'); | ||
expectations(); | ||
var expectations = function () { | ||
expect('a/b').not.toExist(); | ||
expect('a/x').toBeDirectory(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.rename('a/b', 'x'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.renameAsync('a/b', 'x') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.renameAsync('a/b', 'x') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("respects internal CWD of jetpack instance", function (done) { | ||
it('respects internal CWD of jetpack instance', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b/c.txt', 'abc'); | ||
}; | ||
var expectations = function () { | ||
expect('a/b').not.toExist(); | ||
expect('a/x').toBeDirectory(); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync('a/b/c.txt', 'abc'); | ||
}; | ||
var jetContext = jetpack.cwd('a'); | ||
var expectations = function () { | ||
expect('a/b').not.toExist(); | ||
expect('a/x').toBeDirectory(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetContext.rename('b', 'x'); | ||
expectations(); | ||
var jetContext = jetpack.cwd('a'); | ||
// SYNC | ||
preparations(); | ||
jetContext.rename('b', 'x'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetContext.renameAsync('b', 'x') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetContext.renameAsync('b', 'x') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
}); |
/* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
describe('streams |', function () { | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
it('exposes vanilla stream methods', function (done) { | ||
var input; | ||
var output; | ||
it("exposes vanilla stream methods", function (done) { | ||
fse.outputFileSync('a.txt', 'abc'); | ||
fse.outputFileSync('a.txt', 'abc'); | ||
var output = jetpack.createWriteStream('b.txt'); | ||
var input = jetpack.createReadStream('a.txt'); | ||
output.on('finish', function () { | ||
expect('b.txt').toBeFileWithContent('abc'); | ||
done(); | ||
}); | ||
input.pipe(output); | ||
input = jetpack.createReadStream('a.txt'); | ||
output = jetpack.createWriteStream('b.txt'); | ||
output.on('finish', function () { | ||
expect('b.txt').toBeFileWithContent('abc'); | ||
done(); | ||
}); | ||
input.pipe(output); | ||
}); | ||
it("stream methods respect jetpack internal CWD", function (done) { | ||
fse.outputFileSync('dir/a.txt', 'abc'); | ||
it('stream methods respect jetpack internal CWD', function (done) { | ||
var input; | ||
var output; | ||
var dir = jetpack.cwd('dir'); | ||
var output = dir.createWriteStream('b.txt'); | ||
var input = dir.createReadStream('a.txt'); | ||
output.on('finish', function () { | ||
expect('dir/b.txt').toBeFileWithContent('abc'); | ||
done(); | ||
}); | ||
input.pipe(output); | ||
var dir = jetpack.cwd('dir'); | ||
fse.outputFileSync('dir/a.txt', 'abc'); | ||
input = dir.createReadStream('a.txt'); | ||
output = dir.createWriteStream('b.txt'); | ||
output.on('finish', function () { | ||
expect('dir/b.txt').toBeFileWithContent('abc'); | ||
done(); | ||
}); | ||
input.pipe(output); | ||
}); | ||
}); |
@@ -6,100 +6,102 @@ 'use strict'; | ||
module.exports.toExist = function () { | ||
return { | ||
compare: function (path) { | ||
var pass = true; | ||
var message = 'Path ' + path + ' should exist'; | ||
try { | ||
fs.statSync(path); | ||
} catch (err) { | ||
pass = false; | ||
} | ||
return { | ||
pass: pass, | ||
message: message, | ||
}; | ||
}, | ||
negativeCompare: function (path) { | ||
var pass = false; | ||
var message = "Path " + path + " shouldn't exist"; | ||
try { | ||
fs.statSync(path); | ||
} catch (err) { | ||
pass = true; | ||
} | ||
return { | ||
pass: pass, | ||
message: message, | ||
}; | ||
}, | ||
}; | ||
return { | ||
compare: function (path) { | ||
var pass = true; | ||
var message = 'Path ' + path + ' should exist'; | ||
try { | ||
fs.statSync(path); | ||
} catch (err) { | ||
pass = false; | ||
} | ||
return { | ||
pass: pass, | ||
message: message | ||
}; | ||
}, | ||
negativeCompare: function (path) { | ||
var pass = false; | ||
var message = 'Path ' + path + " shouldn't exist"; | ||
try { | ||
fs.statSync(path); | ||
} catch (err) { | ||
pass = true; | ||
} | ||
return { | ||
pass: pass, | ||
message: message | ||
}; | ||
} | ||
}; | ||
}; | ||
module.exports.toBeDirectory = function () { | ||
return { | ||
compare: function (path) { | ||
var pass; | ||
var message = 'Path ' + path + ' should be directory'; | ||
try { | ||
var stat = fs.statSync(path); | ||
pass = stat.isDirectory(); | ||
} catch (err) { | ||
// For sure not a directory. | ||
pass = false; | ||
} | ||
return { | ||
pass: pass, | ||
message: message, | ||
}; | ||
}, | ||
}; | ||
return { | ||
compare: function (path) { | ||
var pass; | ||
var message = 'Path ' + path + ' should be directory'; | ||
var stat; | ||
try { | ||
stat = fs.statSync(path); | ||
pass = stat.isDirectory(); | ||
} catch (err) { | ||
// For sure not a directory. | ||
pass = false; | ||
} | ||
return { | ||
pass: pass, | ||
message: message | ||
}; | ||
} | ||
}; | ||
}; | ||
module.exports.toBeFileWithContent = function () { | ||
return { | ||
compare: function (path, expectedContent) { | ||
var pass = true; | ||
var message = 'File ' + path + ' should have content "' | ||
+ expectedContent + '"'; | ||
try { | ||
var fileContent = fs.readFileSync(path, 'utf8'); | ||
if (fileContent !== expectedContent) { | ||
pass = false; | ||
message = 'File ' + path + ' should have content "' | ||
+ expectedContent + '" but have "' + fileContent + '"'; | ||
} | ||
} catch (err) { | ||
pass = false; | ||
message = 'File ' + path + ' should exist'; | ||
} | ||
return { | ||
pass: pass, | ||
message: message, | ||
}; | ||
}, | ||
}; | ||
return { | ||
compare: function (path, expectedContent) { | ||
var pass = true; | ||
var message = 'File ' + path + ' should have content "' + expectedContent + '"'; | ||
var fileContent; | ||
try { | ||
fileContent = fs.readFileSync(path, 'utf8'); | ||
if (fileContent !== expectedContent) { | ||
pass = false; | ||
message = 'File ' + path + ' should have content "' | ||
+ expectedContent + '" but have "' + fileContent + '"'; | ||
} | ||
} catch (err) { | ||
pass = false; | ||
message = 'File ' + path + ' should exist'; | ||
} | ||
return { | ||
pass: pass, | ||
message: message | ||
}; | ||
} | ||
}; | ||
}; | ||
module.exports.toHaveMode = function () { | ||
return { | ||
compare: function (path, expectedMode) { | ||
var pass = true; | ||
var message = 'File ' + path + ' should have mode ' + expectedMode; | ||
try { | ||
var mode = fs.statSync(path).mode.toString(8); | ||
mode = mode.substring(mode.length - 3); | ||
if (mode !== expectedMode) { | ||
pass = false; | ||
message = 'File ' + path + ' should have mode ' | ||
+ expectedMode + ' but has ' + mode; | ||
} | ||
} catch (err) { | ||
pass = false; | ||
message = 'File ' + path + ' should exist'; | ||
} | ||
return { | ||
pass: pass, | ||
message: message, | ||
}; | ||
}, | ||
}; | ||
return { | ||
compare: function (path, expectedMode) { | ||
var pass = true; | ||
var message = 'File ' + path + ' should have mode ' + expectedMode; | ||
var mode; | ||
try { | ||
mode = fs.statSync(path).mode.toString(8); | ||
mode = mode.substring(mode.length - 3); | ||
if (mode !== expectedMode) { | ||
pass = false; | ||
message = 'File ' + path + ' should have mode ' | ||
+ expectedMode + ' but has ' + mode; | ||
} | ||
} catch (err) { | ||
pass = false; | ||
message = 'File ' + path + ' should exist'; | ||
} | ||
return { | ||
pass: pass, | ||
message: message | ||
}; | ||
} | ||
}; | ||
}; |
@@ -5,3 +5,3 @@ /* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
@@ -14,4 +14,2 @@ var fse = require('fs-extra'); | ||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000; | ||
var originalCwd = process.cwd(); | ||
@@ -22,46 +20,48 @@ // The directory we will be using as CWD for tests. | ||
var clearWorkingDir = function () { | ||
// Clear all contents, but don't remove the main directory | ||
// (you can't because it is CWD). | ||
fse.readdirSync('.').forEach(function (filename) { | ||
fse.removeSync(filename); | ||
}); | ||
// Clear all contents, but don't remove the main directory | ||
// (you can't because it is CWD). | ||
fse.readdirSync('.').forEach(function (filename) { | ||
fse.removeSync(filename); | ||
}); | ||
if (fse.readdirSync('.').length > 0) { | ||
throw new Error("Clearing working directory failed!"); | ||
} | ||
if (fse.readdirSync('.').length > 0) { | ||
throw new Error('Clearing working directory failed!'); | ||
} | ||
}; | ||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000; | ||
module.exports.clearWorkingDir = clearWorkingDir; | ||
module.exports.beforeEach = function (done) { | ||
jasmine.addMatchers(customMatchers); | ||
jasmine.addMatchers(customMatchers); | ||
// Create brand new working directory | ||
fse.remove(workingDir, function () { | ||
fse.mkdirSync(workingDir); | ||
// Create brand new working directory | ||
fse.remove(workingDir, function () { | ||
fse.mkdirSync(workingDir); | ||
// Set CWD there | ||
process.chdir(workingDir); | ||
// Better to be safe than sorry | ||
if (pathUtil.basename(process.cwd()) !== 'fs-jetpack-test') { | ||
throw new Error("CWD switch failed!"); | ||
} | ||
// Set CWD there | ||
process.chdir(workingDir); | ||
// Better to be safe than sorry | ||
if (pathUtil.basename(process.cwd()) !== 'fs-jetpack-test') { | ||
throw new Error('CWD switch failed!'); | ||
} | ||
done(); | ||
}); | ||
done(); | ||
}); | ||
}; | ||
module.exports.afterEach = function (done) { | ||
// Switch CWD back where we were, and clean the clutter. | ||
process.chdir(originalCwd); | ||
fse.remove(workingDir, done); | ||
// Switch CWD back where we were, and clean the clutter. | ||
process.chdir(originalCwd); | ||
fse.remove(workingDir, done); | ||
}; | ||
module.exports.convertToUnixPathSeparators = function (thing) { | ||
if (Array.isArray(thing)) { | ||
return thing.map(function (path) { | ||
return path.replace(/\\/g, '/'); | ||
}); | ||
} | ||
return thing.replace(/\\/g, '/'); | ||
if (Array.isArray(thing)) { | ||
return thing.map(function (path) { | ||
return path.replace(/\\/g, '/'); | ||
}); | ||
} | ||
return thing.replace(/\\/g, '/'); | ||
}; |
/* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
describe('symlink |', function () { | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
it('can create a symlink', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect(fse.lstatSync('symlink').isSymbolicLink()).toBe(true); | ||
expect(fse.readlinkSync('symlink')).toBe('some_path'); | ||
}; | ||
it("can create a symlink", function (done) { | ||
// SYNC | ||
preparations(); | ||
jetpack.symlink('some_path', 'symlink'); | ||
expectations(); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect(fse.lstatSync('symlink').isSymbolicLink()).toBe(true); | ||
expect(fse.readlinkSync('symlink')).toBe('some_path'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.symlink('some_path', 'symlink'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.symlinkAsync('some_path', 'symlink') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.symlinkAsync('some_path', 'symlink') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("can create nonexistent parent directories", function (done) { | ||
it('can create nonexistent parent directories', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect(fse.lstatSync('a/b/symlink').isSymbolicLink()).toBe(true); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.symlink('whatever', 'a/b/symlink'); | ||
expectations(); | ||
var expectations = function () { | ||
expect(fse.lstatSync('a/b/symlink').isSymbolicLink()).toBe(true); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.symlink('whatever', 'a/b/symlink'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.symlinkAsync('whatever', 'a/b/symlink') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.symlinkAsync('whatever', 'a/b/symlink') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("respects internal CWD of jetpack instance", function (done) { | ||
it('respects internal CWD of jetpack instance', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirsSync('a/b'); | ||
}; | ||
var expectations = function () { | ||
expect(fse.lstatSync('a/b/symlink').isSymbolicLink()).toBe(true); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.mkdirsSync('a/b'); | ||
}; | ||
var jetContext = jetpack.cwd('a/b'); | ||
var expectations = function () { | ||
expect(fse.lstatSync('a/b/symlink').isSymbolicLink()).toBe(true); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetContext.symlink('whatever', 'symlink'); | ||
expectations(); | ||
var jetContext = jetpack.cwd('a/b'); | ||
// SYNC | ||
preparations(); | ||
jetContext.symlink('whatever', 'symlink'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetContext.symlinkAsync('whatever', 'symlink') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetContext.symlinkAsync('whatever', 'symlink') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
}); |
/* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
describe('matcher |', function () { | ||
var matcher = require('../../lib/utils/matcher'); | ||
var matcher = require('../../lib/utils/matcher'); | ||
it('can test against one pattern passed as a string', function () { | ||
var test = matcher.create('a'); | ||
expect(test('/a')).toBe(true); | ||
expect(test('/b')).toBe(false); | ||
}); | ||
it("can test against one pattern passed as a string", function () { | ||
var test = matcher.create('a'); | ||
expect(test('/a')).toBe(true); | ||
expect(test('/b')).toBe(false); | ||
it('can test against many patterns passed as an array', function () { | ||
var test = matcher.create(['a', 'b']); | ||
expect(test('/a')).toBe(true); | ||
expect(test('/b')).toBe(true); | ||
expect(test('/c')).toBe(false); | ||
}); | ||
describe('possible mask tokens |', function () { | ||
it('*', function () { | ||
var test = matcher.create(['*']); | ||
expect(test('/a')).toBe(true); | ||
expect(test('/a/b.txt')).toBe(true); | ||
test = matcher.create(['a*b']); | ||
expect(test('/ab')).toBe(true); | ||
expect(test('/a_b')).toBe(true); | ||
expect(test('/a__b')).toBe(true); | ||
}); | ||
it("can test against many patterns passed as an array", function () { | ||
var test = matcher.create(['a', 'b']); | ||
expect(test('/a')).toBe(true); | ||
expect(test('/b')).toBe(true); | ||
expect(test('/c')).toBe(false); | ||
it('/*', function () { | ||
var test = matcher.create(['/*']); | ||
expect(test('/a')).toBe(true); | ||
expect(test('/a/b')).toBe(false); | ||
}); | ||
describe('possible mask tokens |', function () { | ||
it('**', function () { | ||
var test = matcher.create(['**']); | ||
expect(test('/a')).toBe(true); | ||
expect(test('/a/b')).toBe(true); | ||
it("*", function () { | ||
var test = matcher.create(['*']); | ||
expect(test('/a')).toBe(true); | ||
expect(test('/a/b.txt')).toBe(true); | ||
test = matcher.create(['/a/**/d']); | ||
expect(test('/a/d')).toBe(true); | ||
expect(test('/a/b/d')).toBe(true); | ||
expect(test('/a/b/c/d')).toBe(true); | ||
expect(test('/a')).toBe(false); | ||
expect(test('/d')).toBe(false); | ||
}); | ||
test = matcher.create(['a*b']); | ||
expect(test('/ab')).toBe(true); | ||
expect(test('/a_b')).toBe(true); | ||
expect(test('/a__b')).toBe(true); | ||
}); | ||
it('/**/something', function () { | ||
var test = matcher.create(['/**/a']); | ||
expect(test('/a')).toBe(true); | ||
expect(test('/x/a')).toBe(true); | ||
expect(test('/x/y/a')).toBe(true); | ||
expect(test('/a/b')).toBe(false); | ||
}); | ||
it("/*", function () { | ||
var test = matcher.create(['/*']); | ||
expect(test('/a')).toBe(true); | ||
expect(test('/a/b')).toBe(false); | ||
}); | ||
it('+(option1|option2)', function () { | ||
var test = matcher.create(['*.+(txt|md)']); | ||
expect(test('/a.txt')).toBe(true); | ||
expect(test('/b.md')).toBe(true); | ||
expect(test('/c.rtf')).toBe(false); | ||
}); | ||
it("**", function () { | ||
var test = matcher.create(['**']); | ||
expect(test('/a')).toBe(true); | ||
expect(test('/a/b')).toBe(true); | ||
it('{a,b}', function () { | ||
var test = matcher.create(['*.{jpg,png}']); | ||
expect(test('a.jpg')).toBe(true); | ||
expect(test('b.png')).toBe(true); | ||
expect(test('c.txt')).toBe(false); | ||
}); | ||
test = matcher.create(['/a/**/d']); | ||
expect(test('/a/d')).toBe(true); | ||
expect(test('/a/b/d')).toBe(true); | ||
expect(test('/a/b/c/d')).toBe(true); | ||
expect(test('/a')).toBe(false); | ||
expect(test('/d')).toBe(false); | ||
}); | ||
it('?', function () { | ||
var test = matcher.create(['a?c']); | ||
expect(test('/abc')).toBe(true); | ||
expect(test('/ac')).toBe(false); | ||
expect(test('/abbc')).toBe(false); | ||
}); | ||
it("/**/something", function () { | ||
var test = matcher.create(['/**/a']); | ||
expect(test('/a')).toBe(true); | ||
expect(test('/x/a')).toBe(true); | ||
expect(test('/x/y/a')).toBe(true); | ||
expect(test('/a/b')).toBe(false); | ||
}); | ||
it('comment character # havs no special meaning', function () { | ||
var test = matcher.create(['#a']); | ||
expect(test('/#a')).toBe(true); | ||
}); | ||
}); | ||
it("+(option1|option2)", function () { | ||
var test = matcher.create(['*.+(txt|md)']); | ||
expect(test('/a.txt')).toBe(true); | ||
expect(test('/b.md')).toBe(true); | ||
expect(test('/c.rtf')).toBe(false); | ||
}); | ||
describe('negation', function () { | ||
it('selects everything except negated for one defined pattern', function () { | ||
var test = matcher.create('!abc'); | ||
expect(test('/abc')).toBe(false); | ||
expect(test('/xyz')).toBe(true); | ||
}); | ||
it("{a,b}", function () { | ||
var test = matcher.create(['*.{jpg,png}']); | ||
expect(test('a.jpg')).toBe(true); | ||
expect(test('b.png')).toBe(true); | ||
expect(test('c.txt')).toBe(false); | ||
}); | ||
it("?", function () { | ||
var test = matcher.create(['a?c']); | ||
expect(test('/abc')).toBe(true); | ||
expect(test('/ac')).toBe(false); | ||
expect(test('/abbc')).toBe(false); | ||
}); | ||
it("comment character # havs no special meaning", function () { | ||
var test = matcher.create(['#a']); | ||
expect(test('/#a')).toBe(true); | ||
}); | ||
it('selects everything except negated for multiple patterns', function () { | ||
var test = matcher.create(['!abc', '!xyz']); | ||
expect(test('/abc')).toBe(false); | ||
expect(test('/xyz')).toBe(false); | ||
expect(test('/whatever')).toBe(true); | ||
}); | ||
describe("negation", function () { | ||
it("selects everything except negated for one defined pattern", function () { | ||
var test = matcher.create('!abc'); | ||
expect(test('/abc')).toBe(false); | ||
expect(test('/xyz')).toBe(true); | ||
}); | ||
it("selects everything except negated for multiple patterns", function () { | ||
var test = matcher.create(['!abc', '!xyz']); | ||
expect(test('/abc')).toBe(false); | ||
expect(test('/xyz')).toBe(false); | ||
expect(test('/whatever')).toBe(true); | ||
}); | ||
it("filters previous match if negation is farther in order", function () { | ||
var test = matcher.create(['abc', '123', '!/xyz/**', '!/789/**']); | ||
expect(test('/abc')).toBe(true); | ||
expect(test('/456/123')).toBe(true); | ||
expect(test('/xyz/abc')).toBe(false); | ||
expect(test('/789/123')).toBe(false); | ||
expect(test('/whatever')).toBe(false); | ||
}); | ||
it('filters previous match if negation is farther in order', function () { | ||
var test = matcher.create(['abc', '123', '!/xyz/**', '!/789/**']); | ||
expect(test('/abc')).toBe(true); | ||
expect(test('/456/123')).toBe(true); | ||
expect(test('/xyz/abc')).toBe(false); | ||
expect(test('/789/123')).toBe(false); | ||
expect(test('/whatever')).toBe(false); | ||
}); | ||
}); | ||
}); |
/* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
describe('atomic write |', function () { | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
var path = 'file.txt'; | ||
var newPath = path + '.__new__'; | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
var path = 'file.txt'; | ||
var newPath = path + '.__new__'; | ||
it("fresh write (file doesn't exist yet)", function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect(path).toBeFileWithContent('abc'); | ||
expect(newPath).not.toExist(); | ||
}; | ||
it("fresh write (file doesn't exist yet)", function (done) { | ||
// SYNC | ||
preparations(); | ||
jetpack.write(path, 'abc', { atomic: true }); | ||
expectations(); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect(path).toBeFileWithContent('abc'); | ||
expect(newPath).not.toExist(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.write(path, 'abc', { atomic: true }); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.writeAsync(path, 'abc', { atomic: true }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.writeAsync(path, 'abc', { atomic: true }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it('overwrite existing file', function (done) { | ||
it('overwrite existing file', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync(path, 'xyz'); | ||
}; | ||
var expectations = function () { | ||
expect(path).toBeFileWithContent('abc'); | ||
expect(newPath).not.toExist(); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync(path, 'xyz'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.write(path, 'abc', { atomic: true }); | ||
expectations(); | ||
var expectations = function () { | ||
expect(path).toBeFileWithContent('abc'); | ||
expect(newPath).not.toExist(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.write(path, 'abc', { atomic: true }); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.writeAsync(path, 'abc', { atomic: true }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.writeAsync(path, 'abc', { atomic: true }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it('if previous operation failed', function (done) { | ||
it('if previous operation failed', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync(path, 'xyz'); | ||
// File from interrupted previous operation remained. | ||
fse.outputFileSync(newPath, '123'); | ||
}; | ||
var expectations = function () { | ||
expect(path).toBeFileWithContent('abc'); | ||
expect(newPath).not.toExist(); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
fse.outputFileSync(path, 'xyz'); | ||
// File from interrupted previous operation remained. | ||
fse.outputFileSync(newPath, '123'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.write(path, 'abc', { atomic: true }); | ||
expectations(); | ||
var expectations = function () { | ||
expect(path).toBeFileWithContent('abc'); | ||
expect(newPath).not.toExist(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.write(path, 'abc', { atomic: true }); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.writeAsync(path, 'abc', { atomic: true }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.writeAsync(path, 'abc', { atomic: true }) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
}); |
/* eslint-env jasmine */ | ||
"use strict"; | ||
'use strict'; | ||
describe('write |', function () { | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
var fse = require('fs-extra'); | ||
var helper = require('./support/spec_helper'); | ||
var jetpack = require('..'); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
beforeEach(helper.beforeEach); | ||
afterEach(helper.afterEach); | ||
it('writes data from string', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect('file.txt').toBeFileWithContent('abc'); | ||
}; | ||
it('writes data from string', function (done) { | ||
// SYNC | ||
preparations(); | ||
jetpack.write('file.txt', 'abc'); | ||
expectations(); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect('file.txt').toBeFileWithContent('abc'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.write('file.txt', 'abc'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.writeAsync('file.txt', 'abc') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.writeAsync('file.txt', 'abc') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it('writes data from Buffer', function (done) { | ||
it('writes data from Buffer', function (done) { | ||
var buf = new Buffer([11, 22]); | ||
var buf = new Buffer([11, 22]); | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
var content = fse.readFileSync('file.txt'); | ||
expect(content.length).toBe(2); | ||
expect(content[0]).toBe(11); | ||
expect(content[1]).toBe(22); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.write('file.txt', buf); | ||
expectations(); | ||
var expectations = function () { | ||
var content = fse.readFileSync('file.txt'); | ||
expect(content.length).toBe(2); | ||
expect(content[0]).toBe(11); | ||
expect(content[1]).toBe(22); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.write('file.txt', buf); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.writeAsync('file.txt', buf) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.writeAsync('file.txt', buf) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it('writes data as JSON', function (done) { | ||
it('writes data as JSON', function (done) { | ||
var obj = { | ||
utf8: 'ąćłźż' | ||
}; | ||
var obj = { | ||
utf8: "ąćłźż", | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
var content = JSON.parse(fse.readFileSync('file.json', 'utf8')); | ||
expect(content).toEqual(obj); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.write('file.json', obj); | ||
expectations(); | ||
var expectations = function () { | ||
var content = JSON.parse(fse.readFileSync('file.json', 'utf8')); | ||
expect(content).toEqual(obj); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.write('file.json', obj); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.writeAsync('file.json', obj) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.writeAsync('file.json', obj) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it('written JSON data can be indented', function (done) { | ||
it('written JSON data can be indented', function (done) { | ||
var obj = { | ||
utf8: 'ąćłźż' | ||
}; | ||
var obj = { | ||
utf8: "ąćłźż", | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
var sizeA = fse.statSync('a.json').size; | ||
var sizeB = fse.statSync('b.json').size; | ||
var sizeC = fse.statSync('c.json').size; | ||
expect(sizeB).toBeGreaterThan(sizeA); | ||
expect(sizeC).toBeGreaterThan(sizeB); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.write('a.json', obj, { jsonIndent: 0 }); | ||
jetpack.write('b.json', obj); // Default indent = 2 | ||
jetpack.write('c.json', obj, { jsonIndent: 4 }); | ||
expectations(); | ||
var expectations = function () { | ||
var sizeA = fse.statSync('a.json').size; | ||
var sizeB = fse.statSync('b.json').size; | ||
var sizeC = fse.statSync('c.json').size; | ||
expect(sizeB).toBeGreaterThan(sizeA); | ||
expect(sizeC).toBeGreaterThan(sizeB); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.write('a.json', obj, { jsonIndent: 0 }); | ||
jetpack.write('b.json', obj); // Default indent = 2 | ||
jetpack.write('c.json', obj, { jsonIndent: 4 }); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.writeAsync('a.json', obj, { jsonIndent: 0 }) | ||
.then(function () { | ||
return jetpack.writeAsync('b.json', obj); // Default indent = 2 | ||
}) | ||
.then(function () { | ||
return jetpack.writeAsync('c.json', obj, { jsonIndent: 4 }); | ||
}) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.writeAsync('a.json', obj, { jsonIndent: 0 }) | ||
.then(function () { | ||
return jetpack.writeAsync('b.json', obj); // Default indent = 2 | ||
}) | ||
.then(function () { | ||
return jetpack.writeAsync('c.json', obj, { jsonIndent: 4 }); | ||
}) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it('writes and reads file as JSON with Date parsing', function (done) { | ||
it('writes and reads file as JSON with Date parsing', function (done) { | ||
var obj = { | ||
date: new Date() | ||
}; | ||
var obj = { | ||
date: new Date(), | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
var content = JSON.parse(fse.readFileSync('file.json', 'utf8')); | ||
expect(content.date).toBe(obj.date.toISOString()); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.write('file.json', obj); | ||
expectations(); | ||
var expectations = function () { | ||
var content = JSON.parse(fse.readFileSync('file.json', 'utf8')); | ||
expect(content.date).toBe(obj.date.toISOString()); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.write('file.json', obj); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.writeAsync('file.json', obj) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.writeAsync('file.json', obj) | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("write can create nonexistent parent directories", function (done) { | ||
it('write can create nonexistent parent directories', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect('a/b/c.txt').toBeFileWithContent('abc'); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.write('a/b/c.txt', 'abc'); | ||
expectations(); | ||
var expectations = function () { | ||
expect('a/b/c.txt').toBeFileWithContent('abc'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetpack.write('a/b/c.txt', 'abc'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetpack.writeAsync('a/b/c.txt', 'abc') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetpack.writeAsync('a/b/c.txt', 'abc') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
it("respects internal CWD of jetpack instance", function (done) { | ||
it('respects internal CWD of jetpack instance', function (done) { | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var expectations = function () { | ||
expect('a/b/c.txt').toBeFileWithContent('abc'); | ||
}; | ||
var preparations = function () { | ||
helper.clearWorkingDir(); | ||
}; | ||
var jetContext = jetpack.cwd('a'); | ||
var expectations = function () { | ||
expect('a/b/c.txt').toBeFileWithContent('abc'); | ||
}; | ||
// SYNC | ||
preparations(); | ||
jetContext.write('b/c.txt', 'abc'); | ||
expectations(); | ||
var jetContext = jetpack.cwd('a'); | ||
// SYNC | ||
preparations(); | ||
jetContext.write('b/c.txt', 'abc'); | ||
expectations(); | ||
// ASYNC | ||
preparations(); | ||
jetContext.writeAsync('b/c.txt', 'abc') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
// ASYNC | ||
preparations(); | ||
jetContext.writeAsync('b/c.txt', 'abc') | ||
.then(function () { | ||
expectations(); | ||
done(); | ||
}); | ||
}); | ||
}); |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
50
556
171715
5
4910
30