diff --git a/.npmignore b/.npmignore index e8add85..bf4749d 100755 --- a/.npmignore +++ b/.npmignore @@ -1,3 +1,4 @@ +fixtures src tests coverage diff --git a/README.md b/README.md index 8cdfbcf..4918e92 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,81 @@ `create-index` program creates (and maintains) ES6 `./index.js` file in target directories that imports and exports sibling files and directories. +## Usage + +### Using CLI Program + +```sh +npm install create-index + +create-index --help + +Options: + --update-index 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] + +Examples: + create-index ./src ./src/utilities Creates or updates an existing + create-index index file in the + target (./src, ./src/utilities) + directories. + create-index --update-index ./src Finds all create-index index files + ./tests in the target directories and + descending directories. Updates + found index files. +``` + +### Using `create-index` Programmatically + +```js +import { + writeIndex +} from 'create-index'; + +/** + * @type {Function} + * @param {Array} directoryPaths + * @throws {Error} Directory "..." does not exist. + * @throws {Error} "..." is not a directory. + * @throws {Error} "..." unsafe index. + * @returns {boolean} + */ +writeIndex; +``` + +Note that the `writeIndex` function is synchronous. + +```js +import { + findIndexFiles +} from 'create-index'; + +/** + * @type {Function} + * @param {string} directoryPath + * @returns {Array} List of directory paths that have create-index index file. + */ +findIndexFiles; +``` + +### Gulp + +Since [Gulp](http://gulpjs.com/) can ran arbitrary JavaScript code, there is no need for a separate plugin. See [Using `create-index` Programmatically](#using-create-index-programmatically). + +```js +import { + writeIndex +} from 'create-index'; + +gulp.task('create-index', () => { + writeIndex(['./target_directory']); +}); +``` + +Note that the `writeIndex` function is synchronous. + ## Implementation `create-index` program will look into the target directory. @@ -51,49 +126,3 @@ Directories that do not have `./index.js` in themselves will be excluded. When run again, `create-index` will update existing `./index.js` if it starts with `'create index';\n\n`. If `create-index` is executed against a directory that contains `./index.js`, which does not start with `'create index';\n\n`, an error will be thrown. - -## Usage - -### Using CLI Program - -```sh -npm install create-index - -create-index ./directory1 ./directory2 ./directory3 ... -``` - -### Using `create-index` Programmatically - -```js -import { - writeIndex -} from 'create-index'; - -/** - * @type {Function} - * @param {Array} directoryPaths - * @throws {Error} Directory "..." does not exist. - * @throws {Error} "..." is not a directory. - * @throws {Error} "..." unsafe index. - * @returns {boolean} - */ -writeIndex; -``` - -Note that the `writeIndex` function is synchronous. - -### Gulp - -Since [Gulp](http://gulpjs.com/) can ran arbitrary JavaScript code, there is no need for a separate plugin. See [Using `create-index` Programmatically](#using-create-index-programmatically). - -```js -import { - writeIndex -} from 'create-index'; - -gulp.task('create-index', () => { - writeIndex(['./target_directory']); -}); -``` - -Note that the `writeIndex` function is synchronous. diff --git a/tests/fixtures/read-directory/children-directories-and-files/foo/index.js b/fixtures/find-index-files/do-not-find-no-index/not-index.js similarity index 100% rename from tests/fixtures/read-directory/children-directories-and-files/foo/index.js rename to fixtures/find-index-files/do-not-find-no-index/not-index.js diff --git a/fixtures/find-index-files/do-not-find/index.js b/fixtures/find-index-files/do-not-find/index.js new file mode 100644 index 0000000..e884c1f --- /dev/null +++ b/fixtures/find-index-files/do-not-find/index.js @@ -0,0 +1 @@ +// 'create index'; diff --git a/tests/fixtures/read-directory/children-directories-unsafe-name/bar-bar/index.js b/fixtures/find-index-files/find-1/index.js similarity index 100% rename from tests/fixtures/read-directory/children-directories-unsafe-name/bar-bar/index.js rename to fixtures/find-index-files/find-1/index.js diff --git a/fixtures/find-index-files/nested/do-not-find/index.js b/fixtures/find-index-files/nested/do-not-find/index.js new file mode 100644 index 0000000..e884c1f --- /dev/null +++ b/fixtures/find-index-files/nested/do-not-find/index.js @@ -0,0 +1 @@ +// 'create index'; diff --git a/tests/fixtures/read-directory/children-directories-unsafe-name/foo-foo/index.js b/fixtures/find-index-files/nested/find-2/index.js similarity index 100% rename from tests/fixtures/read-directory/children-directories-unsafe-name/foo-foo/index.js rename to fixtures/find-index-files/nested/find-2/index.js diff --git a/tests/fixtures/read-directory/children-directories-unsafe-name/present/index.js b/fixtures/find-index-files/nested/find-3/index.js similarity index 100% rename from tests/fixtures/read-directory/children-directories-unsafe-name/present/index.js rename to fixtures/find-index-files/nested/find-3/index.js diff --git a/tests/fixtures/read-directory/children-directories-and-files/foo.js b/fixtures/read-directory/children-directories-and-files/foo.js similarity index 100% rename from tests/fixtures/read-directory/children-directories-and-files/foo.js rename to fixtures/read-directory/children-directories-and-files/foo.js diff --git a/tests/fixtures/read-directory/children-directories/bar/index.js b/fixtures/read-directory/children-directories-and-files/foo/index.js similarity index 100% rename from tests/fixtures/read-directory/children-directories/bar/index.js rename to fixtures/read-directory/children-directories-and-files/foo/index.js diff --git a/tests/fixtures/read-directory/children-directories-and-files/present.js b/fixtures/read-directory/children-directories-and-files/present.js similarity index 100% rename from tests/fixtures/read-directory/children-directories-and-files/present.js rename to fixtures/read-directory/children-directories-and-files/present.js diff --git a/tests/fixtures/read-directory/children-directories/foo/index.js b/fixtures/read-directory/children-directories-unsafe-name/bar-bar/index.js similarity index 100% rename from tests/fixtures/read-directory/children-directories/foo/index.js rename to fixtures/read-directory/children-directories-unsafe-name/bar-bar/index.js diff --git a/tests/fixtures/read-directory/children-index/bar/index.js b/fixtures/read-directory/children-directories-unsafe-name/foo-foo/index.js similarity index 100% rename from tests/fixtures/read-directory/children-index/bar/index.js rename to fixtures/read-directory/children-directories-unsafe-name/foo-foo/index.js diff --git a/tests/fixtures/read-directory/children-index/foo/index.js b/fixtures/read-directory/children-directories-unsafe-name/present/index.js similarity index 100% rename from tests/fixtures/read-directory/children-index/foo/index.js rename to fixtures/read-directory/children-directories-unsafe-name/present/index.js diff --git a/tests/fixtures/read-directory/children-directories-without-index/bar/bar.js b/fixtures/read-directory/children-directories-without-index/bar/bar.js similarity index 100% rename from tests/fixtures/read-directory/children-directories-without-index/bar/bar.js rename to fixtures/read-directory/children-directories-without-index/bar/bar.js diff --git a/tests/fixtures/read-directory/children-directories-without-index/foo/foo.js b/fixtures/read-directory/children-directories-without-index/foo/foo.js similarity index 100% rename from tests/fixtures/read-directory/children-directories-without-index/foo/foo.js rename to fixtures/read-directory/children-directories-without-index/foo/foo.js diff --git a/tests/fixtures/read-directory/children-directories-without-index/present.js b/fixtures/read-directory/children-directories-without-index/present.js similarity index 100% rename from tests/fixtures/read-directory/children-directories-without-index/present.js rename to fixtures/read-directory/children-directories-without-index/present.js diff --git a/tests/fixtures/read-directory/children-index/index.js b/fixtures/read-directory/children-directories/bar/index.js similarity index 100% rename from tests/fixtures/read-directory/children-index/index.js rename to fixtures/read-directory/children-directories/bar/index.js diff --git a/tests/fixtures/validate-target-directory/safe-index/index.js b/fixtures/read-directory/children-directories/foo/index.js similarity index 100% rename from tests/fixtures/validate-target-directory/safe-index/index.js rename to fixtures/read-directory/children-directories/foo/index.js diff --git a/tests/fixtures/read-directory/children-dot-files/present.js b/fixtures/read-directory/children-dot-files/present.js similarity index 100% rename from tests/fixtures/read-directory/children-dot-files/present.js rename to fixtures/read-directory/children-dot-files/present.js diff --git a/tests/fixtures/read-directory/children-files-multiple-extensions/bar.bar.js b/fixtures/read-directory/children-files-multiple-extensions/bar.bar.js similarity index 100% rename from tests/fixtures/read-directory/children-files-multiple-extensions/bar.bar.js rename to fixtures/read-directory/children-files-multiple-extensions/bar.bar.js diff --git a/tests/fixtures/read-directory/children-files-multiple-extensions/foo.foo.js b/fixtures/read-directory/children-files-multiple-extensions/foo.foo.js similarity index 100% rename from tests/fixtures/read-directory/children-files-multiple-extensions/foo.foo.js rename to fixtures/read-directory/children-files-multiple-extensions/foo.foo.js diff --git a/tests/fixtures/read-directory/children-files-multiple-extensions/present.js b/fixtures/read-directory/children-files-multiple-extensions/present.js similarity index 100% rename from tests/fixtures/read-directory/children-files-multiple-extensions/present.js rename to fixtures/read-directory/children-files-multiple-extensions/present.js diff --git a/tests/fixtures/read-directory/children-files-no-extension/bar b/fixtures/read-directory/children-files-no-extension/bar similarity index 100% rename from tests/fixtures/read-directory/children-files-no-extension/bar rename to fixtures/read-directory/children-files-no-extension/bar diff --git a/tests/fixtures/read-directory/children-files-no-extension/foo b/fixtures/read-directory/children-files-no-extension/foo similarity index 100% rename from tests/fixtures/read-directory/children-files-no-extension/foo rename to fixtures/read-directory/children-files-no-extension/foo diff --git a/tests/fixtures/read-directory/children-files-no-extension/present.js b/fixtures/read-directory/children-files-no-extension/present.js similarity index 100% rename from tests/fixtures/read-directory/children-files-no-extension/present.js rename to fixtures/read-directory/children-files-no-extension/present.js diff --git a/tests/fixtures/read-directory/children-files/bar.js b/fixtures/read-directory/children-files/bar.js similarity index 100% rename from tests/fixtures/read-directory/children-files/bar.js rename to fixtures/read-directory/children-files/bar.js diff --git a/tests/fixtures/read-directory/children-files/foo.js b/fixtures/read-directory/children-files/foo.js similarity index 100% rename from tests/fixtures/read-directory/children-files/foo.js rename to fixtures/read-directory/children-files/foo.js diff --git a/tests/fixtures/write-index/mixed/bar/index.js b/fixtures/read-directory/children-index/bar/index.js similarity index 100% rename from tests/fixtures/write-index/mixed/bar/index.js rename to fixtures/read-directory/children-index/bar/index.js diff --git a/tests/fixtures/write-index/mixed/foo/index.js b/fixtures/read-directory/children-index/foo/index.js similarity index 100% rename from tests/fixtures/write-index/mixed/foo/index.js rename to fixtures/read-directory/children-index/foo/index.js diff --git a/fixtures/read-directory/children-index/index.js b/fixtures/read-directory/children-index/index.js new file mode 100644 index 0000000..a45ca72 --- /dev/null +++ b/fixtures/read-directory/children-index/index.js @@ -0,0 +1 @@ +'create index'; diff --git a/tests/fixtures/validate-target-directory/no-index/present.js b/fixtures/validate-target-directory/no-index/present.js similarity index 100% rename from tests/fixtures/validate-target-directory/no-index/present.js rename to fixtures/validate-target-directory/no-index/present.js diff --git a/tests/fixtures/validate-target-directory/not-a-directory.js b/fixtures/validate-target-directory/not-a-directory.js similarity index 100% rename from tests/fixtures/validate-target-directory/not-a-directory.js rename to fixtures/validate-target-directory/not-a-directory.js diff --git a/fixtures/validate-target-directory/safe-index/index.js b/fixtures/validate-target-directory/safe-index/index.js new file mode 100644 index 0000000..a45ca72 --- /dev/null +++ b/fixtures/validate-target-directory/safe-index/index.js @@ -0,0 +1 @@ +'create index'; diff --git a/tests/fixtures/validate-target-directory/unsafe-index/index.js b/fixtures/validate-target-directory/unsafe-index/index.js similarity index 100% rename from tests/fixtures/validate-target-directory/unsafe-index/index.js rename to fixtures/validate-target-directory/unsafe-index/index.js diff --git a/fixtures/write-index/mixed/bar/index.js b/fixtures/write-index/mixed/bar/index.js new file mode 100644 index 0000000..a45ca72 --- /dev/null +++ b/fixtures/write-index/mixed/bar/index.js @@ -0,0 +1 @@ +'create index'; diff --git a/tests/fixtures/write-index/mixed/foo.js b/fixtures/write-index/mixed/foo.js similarity index 100% rename from tests/fixtures/write-index/mixed/foo.js rename to fixtures/write-index/mixed/foo.js diff --git a/fixtures/write-index/mixed/foo/index.js b/fixtures/write-index/mixed/foo/index.js new file mode 100644 index 0000000..a45ca72 --- /dev/null +++ b/fixtures/write-index/mixed/foo/index.js @@ -0,0 +1 @@ +'create index'; diff --git a/fixtures/write-index/mixed/index.js b/fixtures/write-index/mixed/index.js new file mode 100644 index 0000000..1c830cb --- /dev/null +++ b/fixtures/write-index/mixed/index.js @@ -0,0 +1,5 @@ +'create index'; + +export bar from './bar'; +export foo from './foo.js'; + diff --git a/package.json b/package.json index 28d1db3..1c6ab8d 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "pragmatist": "^3.0.3" }, "dependencies": { + "glob": "^6.0.4", "lodash": "^4.0.1", "yargs": "^4.0.0-alpha1" } diff --git a/src/bin/create-index.js b/src/bin/create-index.js index e02b411..1793604 100644 --- a/src/bin/create-index.js +++ b/src/bin/create-index.js @@ -9,6 +9,17 @@ let argv; argv = yargs .demand(1) + .options({ + 'update-index': { + 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.', + type: 'boolean' + } + }) + .example('create-index ./src ./src/utilities', 'Creates or updates an existing create-index index file in the target (./src, ./src/utilities) directories.') + .example('create-index --update-index ./src ./tests', 'Finds all create-index index files in the target directories and descending directories. Updates found index files.') .argv; -writeIndexCli(argv._); +writeIndexCli(argv._, { + updateIndex: argv.updateIndex +}); diff --git a/src/index.js b/src/index.js index c0f42c0..498c0a2 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,4 @@ export { - createIndexCode, - readDirectory, - validateTargetDirectory, + findIndexFiles, writeIndex } from './utilities'; diff --git a/src/utilities/findIndexFiles.js b/src/utilities/findIndexFiles.js new file mode 100644 index 0000000..4e276c2 --- /dev/null +++ b/src/utilities/findIndexFiles.js @@ -0,0 +1,28 @@ +import _ from 'lodash'; +import glob from 'glob'; +import path from 'path'; +import validateTargetDirectory from './validateTargetDirectory'; + +export default (directoryPath) => { + let targetDirectories; + + targetDirectories = glob.sync(path.join(directoryPath, './**/index.js')); + + targetDirectories = _.filter(targetDirectories, (targetDirectoryPath) => { + try { + validateTargetDirectory(path.dirname(targetDirectoryPath)); + + return true; + /* eslint-disable no-empty */ + } catch (error) { + + } + /* eslint-enable no-empty */ + + return false; + }); + + targetDirectories = _.map(targetDirectories, path.dirname); + + return targetDirectories; +}; diff --git a/src/utilities/index.js b/src/utilities/index.js index 66da76d..ffbc3fa 100644 --- a/src/utilities/index.js +++ b/src/utilities/index.js @@ -1,6 +1,7 @@ 'create index'; export createIndexCode from './createIndexCode.js'; +export findIndexFiles from './findIndexFiles.js'; export log from './log.js'; export readDirectory from './readDirectory.js'; export sortByDepth from './sortByDepth.js'; diff --git a/src/utilities/writeIndexCli.js b/src/utilities/writeIndexCli.js index ef5c566..b9df349 100644 --- a/src/utilities/writeIndexCli.js +++ b/src/utilities/writeIndexCli.js @@ -6,14 +6,25 @@ import validateTargetDirectory from './validateTargetDirectory'; import readDirectory from './readDirectory'; import sortByDepth from './sortByDepth'; import log from './log'; +import findIndexFiles from './findIndexFiles'; import chalk from 'chalk'; -export default (directoryPaths) => { +export default (directoryPaths, options = {}) => { let sortedDirectoryPaths; 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); + sortedDirectoryPaths = _.flatten(sortedDirectoryPaths); + sortedDirectoryPaths = _.uniq(sortedDirectoryPaths); + sortedDirectoryPaths = sortByDepth(sortedDirectoryPaths); + + log('Found index file in:', sortedDirectoryPaths); + } _.forEach(sortedDirectoryPaths, (directoryPath) => { validateTargetDirectory(directoryPath); diff --git a/tests/findIndexFiles.js b/tests/findIndexFiles.js new file mode 100644 index 0000000..56445aa --- /dev/null +++ b/tests/findIndexFiles.js @@ -0,0 +1,20 @@ +import { + expect +} from 'chai'; + +import path from 'path'; +import glob from 'glob'; +import findIndexFiles from './../src/utilities/findIndexFiles'; + +const fixturesPath = path.resolve(__dirname, './../../fixtures/find-index-files'); + +describe('findIndexFiles()', () => { + it('finds only the directories that have an existing valid index file', () => { + let names; + + names = findIndexFiles(path.resolve(fixturesPath)); + names = names.sort(); + + expect(names).to.deep.equal(glob.sync(path.resolve(fixturesPath, './**/find-*'))); + }); +}); diff --git a/tests/readDirectory.js b/tests/readDirectory.js index ef60de9..4d05974 100644 --- a/tests/readDirectory.js +++ b/tests/readDirectory.js @@ -5,7 +5,7 @@ import { import path from 'path'; import readDirectory from './../src/utilities/readDirectory'; -const fixturesPath = path.resolve(__dirname, './fixtures/read-directory'); +const fixturesPath = path.resolve(__dirname, './../../fixtures/read-directory'); describe('readDirectory()', () => { context('target directory contains child directories', () => { @@ -35,7 +35,7 @@ describe('readDirectory()', () => { expect(names).to.deep.equal(['present']); }); }); - context.skip('target directory contains ./index.js', () => { + context('target directory contains ./index.js', () => { it('does not include ./index.js', () => { let names; diff --git a/tests/validateTargetDirectory.js b/tests/validateTargetDirectory.js index 427615a..c0687fe 100644 --- a/tests/validateTargetDirectory.js +++ b/tests/validateTargetDirectory.js @@ -6,7 +6,7 @@ import { import path from 'path'; import validateTargetDirectory from './../src/utilities/validateTargetDirectory'; -const fixturesPath = path.resolve(__dirname, './fixtures/validate-target-directory'); +const fixturesPath = path.resolve(__dirname, './../../fixtures/validate-target-directory'); describe('validateTargetDirectory()', () => { describe('directory path', () => { @@ -31,7 +31,7 @@ describe('validateTargetDirectory()', () => { expect(validateTargetDirectory(path.resolve(fixturesPath, 'no-index'))).to.equal(true); }); }); - context.skip('safe', () => { + context('safe', () => { it('returns true', () => { expect(validateTargetDirectory(path.resolve(fixturesPath, 'safe-index'))).to.equal(true); }); diff --git a/tests/writeIndex.js b/tests/writeIndex.js index 825a850..ffd48fb 100644 --- a/tests/writeIndex.js +++ b/tests/writeIndex.js @@ -8,7 +8,7 @@ import path from 'path'; import codeExample from './codeExample'; import writeIndex from './../src/utilities/writeIndex'; -const fixturesPath = path.resolve(__dirname, './fixtures/write-index'); +const fixturesPath = path.resolve(__dirname, './../../fixtures/write-index'); describe('writeIndex()', () => { it('creates index in target directory', () => {