# Directory structure for JavaScript/Node Projects

While the following structure is not an absolute requirement or enforced by the tools, it is a recommendation based on what the JavaScript and in particular Node community at large have been following by convention.

Beyond a suggested structure, no tooling recommendations, or sub-module structure is outlined here.

## Directories

* `lib/` is intended for code that can run as-is
* `src/` is intended for code that needs to be manipulated before it can be used
* `build/` is for any scripts or tooling needed to build your project
* `dist/` is for compiled modules that can be used with other systems.
* `bin/` is for any executable scripts, or compiled binaries used with, or built from your module.
* `test/` is for all of your project/module's test scripts
 * `unit/` is a sub-directory for unit tests
 * `integration/` is a sub-directory for integration tests
 * `env/` is for any environment that's needed for testing 

## lib & src

The difference in using `lib` vs `src` should be:

* `lib` if you can use node's `require()` directly
* `src` if you can not, or the file must otherwise be manipulated before use

If you are committing copies of module/files that are from other systems, the use of `(lib|src)/vendor/(vendor-name)/(project-name)/` is suggested.

## build

If you have scripts/tools that are needed in order to build your project, they should reside in the `build` directory.  Examples include scripts to fetch externally sourced data as part of your build process.  Another example would be using `build/tasks/` as a directory for separating tasks in a project.

## dist

If your project/module is to be built for use with other platforms (either directly in the browser), or in an `AMD` system (such as `require.js`), then these outputted files should reside under the `dist` directory.

It is recommended to use a `(module)-(version).(platform).[min].js` format for the files that output into this directory.  For example `foo-0.1.0.browser.min.js` or `foo-0.1.0.amd.js`.

## bin

The `bin` folder is for any system modules your package will use and/or generate.

* The compiled `node_gyp` output for your module's binary code.
* Pre-compiled platform binaries
* <code>[package.json/bin](http://browsenpm.org/package.json#bin)</code> scripts for your module


