Skip to content

Commit

Permalink
feat: add --resursive and --ignore options (#24)
Browse files Browse the repository at this point in the history
`--resursive`: Create/update index files recursively. Halts on any unsafe "index.js" files.

`--ignore-unsafe`: Ignores unsafe "index.js" files instead of halting.
  • Loading branch information
laggingreflex authored and gajus committed Nov 30, 2016
1 parent 2450b72 commit 219f546
Show file tree
Hide file tree
Showing 8 changed files with 85 additions and 41 deletions.
12 changes: 7 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,11 +82,13 @@ npm install create-index
create-index --help

Options:
--update, -u Recursively iterates target directories looking for "index.js"
files that start with "// @create-index\n" (create-index index
file). Updates found index files. Does not create new index
files. [boolean] [default: false]
--banner Add a custom banner at the top of the index file [string]
--recursive, -r Create/update index files recursively. Halts on any unsafe
"index.js" files. [boolean] [default: false]
--ignoreUnsafe, -i Ignores unsafe "index.js" files instead of halting.
[boolean] [default: false]
--update, -u Updates only previously created index files (recursively).
[boolean] [default: false]
--banner Add a custom banner at the top of the index file [string]

Examples:
create-index ./src ./src/utilities Creates or updates an existing
Expand Down
20 changes: 19 additions & 1 deletion src/bin/create-index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,27 @@ import {

const argv = yargs
.demand(1)
.options({
recursive: {
alias: 'r',
default: false,
description: 'Create/update index files recursively. Halts on any unsafe "index.js" files.',
type: 'boolean'
}
})
.options({
ignoreUnsafe: {
alias: 'i',
default: false,
description: 'Ignores unsafe "index.js" files instead of halting.',
type: 'boolean'
}
})
.options({
update: {
alias: 'u',
default: false,
description: 'Recursively iterates target directories looking for "index.js" files that start with "// @create-index\\n" (create-index index file). Updates found index files. Does not create new index files.',
description: 'Updates only previously created index files (recursively).',
type: 'boolean'
}
})
Expand All @@ -27,5 +43,7 @@ const argv = yargs

writeIndexCli(argv._, {
banner: argv.banner,
ignoreUnsafe: argv.ignoreUnsafe,
recursive: argv.recursive,
updateIndex: argv.update
});
23 changes: 9 additions & 14 deletions src/utilities/findIndexFiles.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,18 @@ import _ from 'lodash';
import glob from 'glob';
import validateTargetDirectory from './validateTargetDirectory';

export default (directoryPath) => {
let targetDirectories;
export default (directoryPath, options = {}) => {
let fileName, targetDirectories;

targetDirectories = glob.sync(path.join(directoryPath, './**/index.js'));
fileName = options.fileName || 'index.js';
fileName = './**/' + fileName;

targetDirectories = _.filter(targetDirectories, (targetDirectoryPath) => {
try {
validateTargetDirectory(path.dirname(targetDirectoryPath));

return true;

// eslint-disable-next-line no-empty
} catch (error) {
targetDirectories = glob.sync(path.join(directoryPath, fileName));

}

return false;
targetDirectories = _.filter(targetDirectories, (targetDirectoryPath) => {
return validateTargetDirectory(path.dirname(targetDirectoryPath), {
silent: options.silent
});
});

targetDirectories = _.map(targetDirectories, path.dirname);
Expand Down
6 changes: 4 additions & 2 deletions src/utilities/readDirectory.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,12 @@ const removeDuplicates = (files) => {
});
};

export default (directoryPath) => {
export default (directoryPath, options = {}) => {
let children;

validateTargetDirectory(directoryPath);
if (!validateTargetDirectory(directoryPath, {silent: options.silent})) {
return false;
}

children = fs.readdirSync(directoryPath);

Expand Down
25 changes: 19 additions & 6 deletions src/utilities/validateTargetDirectory.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,26 @@
import fs from 'fs';
import path from 'path';
import _ from 'lodash';

export default (targetDirectory) => {
export default (targetDirectory, options = {}) => {
const silent = options.silent;
let stats;

try {
stats = fs.statSync(targetDirectory);
} catch (error) {
throw new Error('Directory "' + targetDirectory + '" does not exist.');
if (silent) {
return false;
} else {
throw new Error('Directory "' + targetDirectory + '" does not exist.');
}
}

if (!stats.isDirectory()) {
throw new Error('"' + targetDirectory + '" is not a directory.');
if (silent) {
return false;
} else {
throw new Error('"' + targetDirectory + '" is not a directory.');
}
}

const indexFilePath = path.resolve(targetDirectory, './index.js');
Expand All @@ -25,9 +33,14 @@ export default (targetDirectory) => {

const indexFile = fs.readFileSync(indexFilePath, 'utf8');

if (!_.startsWith(indexFile, '// @create-index\n')) {
throw new Error('"' + indexFilePath + '" unsafe index.');
if (!indexFile.match(/(?:^|[\n\r]+)\/\/ @create-index[\n\r]+/)) {
if (silent) {
return false;
} else {
throw new Error('"' + indexFilePath + '" unsafe index.');
}
}

return true;
};

11 changes: 5 additions & 6 deletions src/utilities/writeIndex.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,11 @@ import validateTargetDirectory from './validateTargetDirectory';
import readDirectory from './readDirectory';
import sortByDepth from './sortByDepth';

export default (directoryPaths) => {
const sortedDirectoryPaths = sortByDepth(directoryPaths);

_.forEach(sortedDirectoryPaths, (directoryPath) => {
validateTargetDirectory(directoryPath);
});
export default (directoryPaths, options = {}) => {
const sortedDirectoryPaths = sortByDepth(directoryPaths)
.filter((directoryPath) => {
return validateTargetDirectory(directoryPath, {silent: options.ignoreUnsafe});
});

_.forEach(sortedDirectoryPaths, (directoryPath) => {
const siblings = readDirectory(directoryPath);
Expand Down
24 changes: 17 additions & 7 deletions src/utilities/writeIndexCli.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,25 +15,35 @@ export default (directoryPaths, options = {}) => {
sortedDirectoryPaths = sortByDepth(directoryPaths);

log('Target directories', sortedDirectoryPaths);
log('Update index:', options.updateIndex ? chalk.green('true') : chalk.red('false'));

if (options.updateIndex) {
sortedDirectoryPaths = _.map(sortedDirectoryPaths, findIndexFiles);
log('Update index:', options.updateIndex ? chalk.green('true') : chalk.red('false'));
} else {
log('Recursive:', options.ignoreUnsafe ? chalk.green('true') : chalk.red('false'));
log('Ignore unsafe:', options.ignoreUnsafe ? chalk.green('true') : chalk.red('false'));
}

if (options.updateIndex || options.recursive) {
sortedDirectoryPaths = _.map(sortedDirectoryPaths, (dir) => {
return findIndexFiles(dir, {
fileName: options.updateIndex ? 'index.js' : '*',
silent: options.updateIndex || options.ignoreUnsafe
});
});
sortedDirectoryPaths = _.flatten(sortedDirectoryPaths);
sortedDirectoryPaths = _.uniq(sortedDirectoryPaths);
sortedDirectoryPaths = sortByDepth(sortedDirectoryPaths);

log('Found index file in:', sortedDirectoryPaths);
log('Updating index files in:', sortedDirectoryPaths.reverse().join(', '));
}

_.forEach(sortedDirectoryPaths, (directoryPath) => {
validateTargetDirectory(directoryPath);
sortedDirectoryPaths = sortedDirectoryPaths.filter((directoryPath) => {
return validateTargetDirectory(directoryPath, {silent: options.ignoreUnsafe});
});

_.forEach(sortedDirectoryPaths, (directoryPath) => {
let existingIndexCode;

const siblings = readDirectory(directoryPath);
const siblings = readDirectory(directoryPath, {silent: options.ignoreUnsafe});

const indexCode = createIndexCode(siblings, {
banner: options.banner
Expand Down
5 changes: 5 additions & 0 deletions test/validateTargetDirectory.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,5 +43,10 @@ describe('validateTargetDirectory()', () => {
}).to.throw(Error, '"' + path.resolve(fixturesPath, 'unsafe-index/index.js') + '" unsafe index.');
});
});
context('unsafe ignored', () => {
it('returns false', () => {
expect(validateTargetDirectory(path.resolve(fixturesPath, 'unsafe-index'), {silent: true})).to.equal(false);
});
});
});
});

0 comments on commit 219f546

Please sign in to comment.