diff --git a/app/Components/EndaPage.php b/app/Components/EndaPage.php
new file mode 100644
index 00000000..537780a1
--- /dev/null
+++ b/app/Components/EndaPage.php
@@ -0,0 +1,135 @@
+
+ * Time: 2015.11.12 下午6:16
+ */
+namespace App\Components;
+
+use Illuminate\Contracts\Pagination\Presenter;
+use Illuminate\Contracts\Pagination\Paginator as PaginatorContract;
+use Illuminate\Pagination\BootstrapThreePresenter;
+class EndaPage extends BootstrapThreePresenter implements Presenter
+{
+ public $paginator;
+
+ public function __construct(PaginatorContract $paginator)
+ {
+ $this->paginator = $paginator;
+ }
+
+ /**
+ * Determine if the underlying paginator being presented has pages to show.
+ *
+ * @return bool
+ */
+ public function hasPages()
+ {
+ return $this->paginator->hasPages() && count($this->paginator->items()) > 0;
+ }
+
+ /**
+ * Convert the URL window into Bootstrap HTML.
+ *
+ * @return string
+ */
+ public function render()
+ {
+ if ($this->hasPages()) {
+ return sprintf(
+ '
',
+ $this->getPreviousButton('←上一页'),
+ $this->getNextButton('下一页→')
+ );
+ }
+
+ return '';
+ }
+
+ /**
+ * 获取上一页按钮
+ *
+ * @param string $text
+ * @return string
+ */
+ public function getPreviousButton($text = '«')
+ {
+ if ($this->paginator->currentPage() <= 1) {
+ return $this->getPreviousDisabledTextWrapper($text);
+ }
+
+ $url = $this->paginator->url(
+ $this->paginator->currentPage() - 1
+ );
+
+ return $this->getPreviousPageWrapper($url, $text, 'prev');
+ }
+
+
+ /**
+ * 获取上一页li
+ * @param $url
+ * @param $page
+ * @param null $rel
+ * @return string
+ */
+ protected function getPreviousPageWrapper($url, $page, $rel = null)
+ {
+ $rel = is_null($rel) ? '' : ' rel="'.$rel.'"';
+
+ return ''.$page.'';
+ }
+
+ /**
+ * 获取下一页按钮
+ *
+ * @param string $text
+ * @return string
+ */
+ public function getNextButton($text = '»')
+ {
+ if (! $this->paginator->hasMorePages()) {
+ return $this->getDisabledTextWrapper($text);
+ }
+
+ $url = $this->paginator->url($this->paginator->currentPage() + 1);
+
+ return $this->getNextPageWrapper($url, $text, 'next');
+ }
+
+ /**
+ * 获取上一页li
+ * @param $url
+ * @param $page
+ * @param null $rel
+ * @return string
+ */
+ protected function getNextPageWrapper($url, $page, $rel = null)
+ {
+ $rel = is_null($rel) ? '' : ' rel="'.$rel.'"';
+
+ return ''.$page.'';
+ }
+
+
+ /**
+ * 获取上一页选择状态下的li
+ *
+ * @param string $text
+ * @return string
+ */
+ protected function getPreviousDisabledTextWrapper($text)
+ {
+ return ''.$text.'';
+ }
+
+ /**
+ * 获取下一页选择状态下的li
+ *
+ * @param string $text
+ * @return string
+ */
+ protected function getNextDisabledTextWrapper($text)
+ {
+ return ''.$text.'';
+ }
+}
diff --git a/app/Http/Controllers/AboutController.php b/app/Http/Controllers/AboutController.php
index 60183e84..405def1c 100644
--- a/app/Http/Controllers/AboutController.php
+++ b/app/Http/Controllers/AboutController.php
@@ -9,35 +9,6 @@
class AboutController extends Controller {
- /**
- * Display a listing of the resource.
- *
- * @return Response
- */
- public function index()
- {
- //
- }
-
- /**
- * Show the form for creating a new resource.
- *
- * @return Response
- */
- public function create()
- {
- //
- }
-
- /**
- * Store a newly created resource in storage.
- *
- * @return Response
- */
- public function store()
- {
- //
- }
/**
* Display the specified resource.
@@ -61,37 +32,4 @@ public function show($id)
]);
}
- /**
- * Show the form for editing the specified resource.
- *
- * @param int $id
- * @return Response
- */
- public function edit($id)
- {
- //
- }
-
- /**
- * Update the specified resource in storage.
- *
- * @param int $id
- * @return Response
- */
- public function update($id)
- {
- //
- }
-
- /**
- * Remove the specified resource from storage.
- *
- * @param int $id
- * @return Response
- */
- public function destroy($id)
- {
- //
- }
-
}
diff --git a/app/Http/Controllers/ArticleController.php b/app/Http/Controllers/ArticleController.php
index f7d6d074..7607e7ac 100644
--- a/app/Http/Controllers/ArticleController.php
+++ b/app/Http/Controllers/ArticleController.php
@@ -1,5 +1,6 @@
$article,
- 'hotArticle'=>$hotArticle
+ $page = new EndaPage($article['page']);
+ return homeView('index', array(
+ 'articleList' => $article,
+ 'page' => $page
));
- }
-
-
- /**
- * Display the specified resource.
- *
- * @param int $id
- * @return Response
- */
- public function show($id)
- {
- //
+ }
+
+
+ /**
+ * Display the specified resource.
+ *
+ * @param int $id
+ * @return Response
+ */
+ public function show($id)
+ {
$article = Article::getArticleModelByArticleId($id);
- $tags = Tag::getTagModelByTagIds($article->tags);
- $authorArticle = Article::getArticleModelByUserId($article->user_id);
ArticleStatus::updateViewNumber($id);
$data = array(
- 'article'=>$article,
- 'tags'=>$tags,
- 'authorArticle'=>$authorArticle,
+ 'article' => $article,
);
viewInit();
- return homeView('article',$data);
- }
+ return homeView('article', $data);
+ }
}
diff --git a/app/Http/Controllers/CategoryController.php b/app/Http/Controllers/CategoryController.php
index fc84757c..555b446f 100644
--- a/app/Http/Controllers/CategoryController.php
+++ b/app/Http/Controllers/CategoryController.php
@@ -6,92 +6,31 @@
use App\Model\Article;
use App\Model\Category;
use Illuminate\Http\Request;
-
-class CategoryController extends Controller {
-
- /**
- * Display a listing of the resource.
- *
- * @return Response
- */
- public function index()
- {
- //
- }
-
- /**
- * Show the form for creating a new resource.
- *
- * @return Response
- */
- public function create()
- {
- //
- }
-
- /**
- * Store a newly created resource in storage.
- *
- * @return Response
- */
- public function store()
- {
- //
- }
-
- /**
- * Display the specified resource.
- *
- * @param int $id
- * @return Response
- */
- public function show($id)
- {
- //
+use App\Components\EndaPage;
+class CategoryController extends Controller
+{
+
+ /**
+ * Display the specified resource.
+ *
+ * @param int $id
+ * @return Response
+ */
+ public function show($id)
+ {
+ //
viewInit();
$category = Category::getCatInfoModelByAsName($id);
- if(empty($category)){
+ if (empty($category)) {
return redirect(url(route('article.index')));
}
- $article = Article::getArticleListByCatId($category->id,10);
-
- return homeView('category',[
- 'category'=>$category,
- 'article'=>$article
+ $article = Article::getArticleListByCatId($category->id, 10);
+ $page = new EndaPage($article['page']);
+ return homeView('category', [
+ 'category' => $category,
+ 'articleList' => $article,
+ 'page' => $page
]);
- }
-
- /**
- * Show the form for editing the specified resource.
- *
- * @param int $id
- * @return Response
- */
- public function edit($id)
- {
- //
- }
-
- /**
- * Update the specified resource in storage.
- *
- * @param int $id
- * @return Response
- */
- public function update($id)
- {
- //
- }
-
- /**
- * Remove the specified resource from storage.
- *
- * @param int $id
- * @return Response
- */
- public function destroy($id)
- {
- //
- }
+ }
}
diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php
index f0d6bf64..c5e7cbb6 100644
--- a/app/Http/Controllers/SearchController.php
+++ b/app/Http/Controllers/SearchController.php
@@ -1,5 +1,6 @@
input('keyword');
- if(empty($keyword)){
+ if (empty($keyword)) {
return redirect()->route('article.index');
}
$article = Article::getArticleListByKeyword($keyword);
-
+ $page = new EndaPage($article['page']);
viewInit();
return homeView('search', [
- 'article' => $article,
- 'keyword' => $keyword
+ 'articleList' => $article,
+ 'keyword' => $keyword,
+ 'page' => $page
]);
}
@@ -32,11 +34,12 @@ public function getTag($id)
{
$article = Article::getArticleListByTagId($id);
-
+ $page = new EndaPage($article['page']);
viewInit();
return homeView('searchTag', [
- 'article' => $article,
- 'tagName'=> Tag::getTagNameByTagId($id)
+ 'articleList' => $article,
+ 'tagName' => Tag::getTagNameByTagId($id),
+ 'page' => $page
]);
}
diff --git a/app/Http/Controllers/backend/LinksController.php b/app/Http/Controllers/backend/LinksController.php
new file mode 100644
index 00000000..21fb3ba9
--- /dev/null
+++ b/app/Http/Controllers/backend/LinksController.php
@@ -0,0 +1,125 @@
+ Links::all(),
+ ]);
+ }
+
+ /**
+ * Show the form for creating a new resource.
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function create()
+ {
+ //
+ return backendView('create');
+ }
+
+ /**
+ * Store a newly created resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @return \Illuminate\Http\Response
+ */
+ public function store(LinksRequest $request)
+ {
+ //
+ try {
+ if (Links::create($request->all())) {
+ Notification::success('添加成功');
+ return redirect()->route('backend.links.index');
+ }
+ } catch (\Exception $e) {
+ return redirect()->back()->withErrors(array('error' => $e->getMessage()))->withInput();
+ }
+ }
+
+ /**
+ * Display the specified resource.
+ *
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function show($id)
+ {
+ //
+ }
+
+ /**
+ * Show the form for editing the specified resource.
+ *
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function edit($id)
+ {
+ //
+ return backendView('edit', [
+ 'link' => Links::find($id),
+ ]);
+ }
+
+ /**
+ * Update the specified resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function update(LinksRequest $request, $id)
+ {
+ //
+ try {
+ if (Links::find($id)->update($request->all())) {
+ Notification::success('修改成功');
+ }
+ return redirect()->route('backend.links.index');
+ } catch (\Exception $e) {
+ return redirect()->back()->withErrors(array('error' => $e->getMessage()))->withInput();
+ }
+ }
+
+ /**
+ * Remove the specified resource from storage.
+ *
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function destroy($id)
+ {
+ //
+ try {
+ Links::destroy($id);
+ Notification::success('删除成功');
+ } catch (\Exception $e) {
+ Notification::error($e->getMessage());
+ }
+
+
+ return redirect()->route('backend.links.index');
+ }
+}
diff --git a/app/Http/Controllers/backend/NavigationController.php b/app/Http/Controllers/backend/NavigationController.php
index 93e30f21..af30a483 100644
--- a/app/Http/Controllers/backend/NavigationController.php
+++ b/app/Http/Controllers/backend/NavigationController.php
@@ -23,9 +23,9 @@ public function __construct()
*/
public function index()
{
- //
+
return backendView('index', [
- 'list' => Navigation::getTreeNavigationAll(),
+ 'list' => Navigation::getNavigationAll(),
]);
}
@@ -34,14 +34,10 @@ public function index()
*
* @return Response
*/
- public function create(Request $request)
+ public function create()
{
//
- $parentId = $request->input('parentId', 0);
-
- return backendView('create', [
- 'parent_id' => $parentId
- ]);
+ return backendView('create');
}
/**
@@ -52,14 +48,13 @@ public function create(Request $request)
public function store(NavigationForm $request)
{
- //
try {
if (Navigation::create($request->all())) {
Notification::success('添加成功');
return redirect()->route('backend.nav.index');
}
} catch (\Exception $e) {
- return redirect()->back()->withInput();
+ return redirect()->back()->withErrors(array('error' => $e->getMessage()))->withInput();
}
}
@@ -97,16 +92,12 @@ public function edit($id)
*/
public function update(NavigationForm $request, $id)
{
- //
try {
- $data = $request->all();
- unset($data['_method']);
- unset($data['_token']);
- if (Navigation::where('id', $id)->update($data)) {
+ if (Navigation::find($id)->update($request->all())) {
Notification::success('修改成功');
- return redirect()->route('backend.nav.index');
}
+ return redirect()->route('backend.nav.index');
} catch (\Exception $e) {
return redirect()->back()->withErrors(array('error' => $e->getMessage()))->withInput();
}
@@ -121,18 +112,15 @@ public function update(NavigationForm $request, $id)
*/
public function destroy($id)
{
- //
- if (Navigation::isChildNav($id)) {
- Notification::error('该导航包含子导航,请先删除');
- } else {
- try {
- Navigation::destroy($id);
- Notification::success('删除成功');
- } catch (\Exception $e) {
- Notification::error($e->getMessage());
- }
+
+ try {
+ Navigation::destroy($id);
+ Notification::success('删除成功');
+ } catch (\Exception $e) {
+ Notification::error($e->getMessage());
}
+
return redirect()->route('backend.nav.index');
}
diff --git a/app/Http/Requests/LinksRequest.php b/app/Http/Requests/LinksRequest.php
new file mode 100644
index 00000000..bad3ae7a
--- /dev/null
+++ b/app/Http/Requests/LinksRequest.php
@@ -0,0 +1,23 @@
+ 'required|integer',
+ 'name' => 'required',
+ 'url' => 'required|url',
+ ];
+ }
+}
diff --git a/app/Http/Requests/NavigationForm.php b/app/Http/Requests/NavigationForm.php
index a001af59..f3054d5d 100644
--- a/app/Http/Requests/NavigationForm.php
+++ b/app/Http/Requests/NavigationForm.php
@@ -14,7 +14,6 @@ public function rules()
{
return [
- 'parent_id' => 'required|integer',
'sequence' => 'required|integer',
'name' => 'required',
'url' => 'required|url',
diff --git a/app/Http/routes.php b/app/Http/routes.php
index a3600423..8f96eeb1 100644
--- a/app/Http/routes.php
+++ b/app/Http/routes.php
@@ -36,6 +36,7 @@
Route::resource('user','backend\UserController');
Route::resource('comment','backend\CommentController');
Route::resource('nav','backend\NavigationController');
+ Route::resource('links','backend\LinksController');
Route::controllers([
'system'=>'backend\SystemController',
'upload'=>'backend\UploadFileController'
diff --git a/app/Model/Article.php b/app/Model/Article.php
index d1726975..39b744c7 100644
--- a/app/Model/Article.php
+++ b/app/Model/Article.php
@@ -204,7 +204,7 @@ public static function getArticleListByKeyword($keyword)
$page = Input::get('page', 1);
$cacheName = $page . '_' . md5($keyword);
- if ($model = empty(Cache::tags(self::REDIS_ARTICLE_PAGE_TAG)->get(self::REDIS_SEARCH_ARTICLE_CACHE . $cacheName))) {
+ if (empty($model = Cache::tags(self::REDIS_ARTICLE_PAGE_TAG)->get(self::REDIS_SEARCH_ARTICLE_CACHE . $cacheName))) {
$model = self::select('id')->where('title', 'like', "%$keyword%")->orderBy('id', 'desc')->simplePaginate(10);
Cache::tags(self::REDIS_ARTICLE_PAGE_TAG)->put(self::REDIS_SEARCH_ARTICLE_CACHE . $cacheName, $model, self::$cacheMinutes);
}
diff --git a/app/Model/Links.php b/app/Model/Links.php
new file mode 100644
index 00000000..408121bc
--- /dev/null
+++ b/app/Model/Links.php
@@ -0,0 +1,30 @@
+
+ */
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class Links extends Model
+{
+ //
+ protected $table;
+ protected $fillable = [
+ 'sequence',
+ 'name',
+ 'url'
+ ];
+
+ /**
+ * 获取链接列表
+ * @param int $limit
+ * @return mixed
+ */
+ public static function getLinkList($limit = 5)
+ {
+ return self::orderBy('sequence', 'asc')->limit($limit)->get();
+ }
+
+
+}
diff --git a/app/Model/Navigation.php b/app/Model/Navigation.php
index 0a4a8701..05bfb73d 100644
--- a/app/Model/Navigation.php
+++ b/app/Model/Navigation.php
@@ -11,47 +11,19 @@ class Navigation extends Model
public $child;
protected $fillable = [
- 'parent_id',
'sequence',
'name',
'url'
];
- static $navigation = [
- 0 => '顶级导航'
- ];
-
- public static function getNavigationAll()
- {
- return self::orderBy('sequence', 'asc')->get();
- }
+ static $navigation = [];
- /**
- * 方便以后扩展
- * @return \Illuminate\Database\Eloquent\Collection|static[]
- */
- public static function getTreeNavigationAll()
+ public static function getNavigationAll($limit = 5)
{
- return tree(self::getNavigationAll());
+ return self::orderBy('sequence', 'asc')->limit($limit)->get();
}
- /**
- * 获取所有导航
- * @return array
- */
- public static function getNavigationArray()
- {
- if (empty(self::$navigation)) {
- $model = self::getTreeNavigationAll();
- if (!empty($model)) {
- foreach ($model as $nav) {
- self::$navigation[$nav->id] = $nav->html . $nav->name;
- }
- }
- }
- return self::$navigation;
- }
/**
* 获得导航名称
@@ -68,45 +40,4 @@ public static function getNavNameByNavId($id)
}
return isset(self::$navigation[$id]) ? self::$navigation[$id] : '';
}
-
- /**
- * 获取子导航
- * @param $id
- * @return mixed
- */
- public static function getChildNav($id)
- {
- return self::where('parent_id', $id)->get();
- }
-
-
- /**
- * 是否包含子级
- * @param $id
- * @return bool
- */
- public static function isChildNav($id)
- {
- $child = self::where('parent_id', '=', $id)->first();
- return !empty($child) ? true : false;
- }
-
- public static function getNavList()
- {
- $model = self::getNavigationAll();
- $data = [];
- if (!empty($model)) {
- foreach ($model as $key => $nav) {
- if($nav->parent_id == 0){
- $data[$key] = $nav;
- foreach ($model as $navigation) {
- if ($navigation->parent_id == $nav->id) {
- $data[$key]->child[] = $navigation;
- }
- }
- }
- }
- }
- return $data;
- }
}
diff --git a/composer.json b/composer.json
index 2ee44150..7b22587e 100644
--- a/composer.json
+++ b/composer.json
@@ -27,7 +27,7 @@
"App\\": "app/"
},
"files": [
- "app/helpers/functions.php"
+ "helpers/functions.php"
]
},
"autoload-dev": {
diff --git a/config/app.php b/config/app.php
index 68e346e0..072ef223 100644
--- a/config/app.php
+++ b/config/app.php
@@ -81,7 +81,7 @@
'key' => env('APP_KEY', 'SomeRandomString'),
'cipher' => MCRYPT_RIJNDAEL_128,
- 'themes' => 'keylime',
+ 'themes' => 'default',
/*
|--------------------------------------------------------------------------
diff --git a/config/path.php b/config/path.php
index 7cc7488a..e2fbeead 100644
--- a/config/path.php
+++ b/config/path.php
@@ -15,6 +15,7 @@
'tags'=>CONTENT.'tags.',
'system'=>SYSTEM.'system.',
'navigation'=>SYSTEM.'navigation.',
+ 'links'=>SYSTEM.'links.',
'user'=>USER,
'comment'=>CONTENT.'comment.'
],
diff --git a/database/migrations/2015_11_12_145600_edit_navigation_table.php b/database/migrations/2015_11_12_145600_edit_navigation_table.php
new file mode 100644
index 00000000..71152c92
--- /dev/null
+++ b/database/migrations/2015_11_12_145600_edit_navigation_table.php
@@ -0,0 +1,33 @@
+dropColumn('parent_id');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::table('navigation', function (Blueprint $table) {
+ //
+ $table->integer('parent_id');
+ });
+ }
+}
diff --git a/database/migrations/2015_11_13_023030_create_links_table.php b/database/migrations/2015_11_13_023030_create_links_table.php
new file mode 100644
index 00000000..b2fd6987
--- /dev/null
+++ b/database/migrations/2015_11_13_023030_create_links_table.php
@@ -0,0 +1,35 @@
+increments('id');
+ $table->integer('sequence');
+ $table->string('name');
+ $table->string('url');
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ //
+ Schema::drop('links');
+ }
+}
diff --git a/app/helpers/functions.php b/helpers/functions.php
similarity index 93%
rename from app/helpers/functions.php
rename to helpers/functions.php
index 5a9b29eb..c102e1d1 100644
--- a/app/helpers/functions.php
+++ b/helpers/functions.php
@@ -124,18 +124,16 @@ function strCut($string, $length, $suffix = '...')
function viewInit()
{
$article = app('App\Model\Article');
- $articleStatus = app('App\Model\ArticleStatus');
$tags = app('App\Model\Tag');
$view = app('view');
+ $nav = app('App\Model\Navigation');
+ $links = app('App\Model\Links');
- $count = array(
- 'article' => $article->count(),
- 'visit' => $articleStatus->sum('view_number'),
- );
- $view->share('recentArticle', $article::getNewsArticle(3)['data']);
- $view->share('hotTags', $tags::getHotTags(12));
- $view->share('dataCount', $count);
+ $view->share('hotArticleList', $article::getHotArticle(3));
+ $view->share('tagList', $tags::getHotTags(12));
+ $view->share('navList', $nav::getNavigationAll());
+ $view->share('linkList', $links::getLinkList());
}
}
@@ -224,8 +222,8 @@ function systemConfig($field, $default = '')
function getArticleImg($image = '')
{
$imageUrl = 'images/01.jpg';
- if(!empty($image)){
- $imageUrl = 'uploads'.'/'.$image;
+ if (!empty($image)) {
+ $imageUrl = 'uploads' . '/' . $image;
}
return asset($imageUrl);
}
diff --git a/node_modules/.bin/gulp b/node_modules/.bin/gulp
new file mode 120000
index 00000000..5de73328
--- /dev/null
+++ b/node_modules/.bin/gulp
@@ -0,0 +1 @@
+../gulp/bin/gulp.js
\ No newline at end of file
diff --git a/node_modules/gulp/CHANGELOG.md b/node_modules/gulp/CHANGELOG.md
new file mode 100644
index 00000000..d9846eab
--- /dev/null
+++ b/node_modules/gulp/CHANGELOG.md
@@ -0,0 +1,233 @@
+# gulp changelog
+
+## 3.9.0
+
+- add babel support
+- add transpiler fallback support
+- add support for some renamed transpilers (livescript, etc)
+- add JSCS
+- update dependecies (liftoff, interpret)
+- documentation tweaks
+
+## 3.8.11
+
+- fix node 0.12/iojs problems
+- add node 0.12 and iojs to travis
+- update dependencies (liftoff, v8flags)
+- documentation tweaks
+
+## 3.8.10
+
+- add link to spanish docs
+- update dependencies (archy, semver, mocha, etc)
+- documentation tweaks
+
+## 3.8.9
+
+- fix local version undefined output
+- add completion for fish shell
+- fix powershell completion line splitting
+- add support for arbitrary node flags (oops, should have been a minor bump)
+- add v8flags dependency
+- update dependencies (liftoff)
+- documentation tweaks
+
+## 3.8.8
+
+- update dependencies (minimist, tildify)
+- documentation tweaks
+
+## 3.8.7
+
+- handle errors a bit better
+- update dependencies (gulp-util, semver, etc)
+- documentation tweaks
+
+## 3.8.6
+
+- remove executable flag from LICENSE
+- update dependencies (chalk, minimist, liftoff, etc)
+- documentation tweaks
+
+## 3.8.5
+
+- simplify --silent and --tasks-simple
+- fix bug in autocomplete where errors would come out
+
+## 3.8.4
+
+- CLI will use exit code 1 on exit when any task fails during the lifetime of the process
+
+
+## 3.8.3
+
+- Tweak error formatting to work better with PluginErrors and strings
+
+## 3.8.2
+
+- add manpage generation
+
+## 3.8.1
+
+- the CLI now adds process.env.INIT_CWD which is the original cwd it was launched from
+
+## 3.8.0
+
+- update vinyl-fs
+ - gulp.src is now a writable passthrough, this means you can use it to add files to your pipeline at any point
+ - gulp.dest can now take a function to determine the folder
+
+This is now possible!
+
+```js
+gulp.src('lib/*.js')
+ .pipe(uglify())
+ .pipe(gulp.src('styles/*.css'))
+ .pipe(gulp.dest(function(file){
+ // I don't know, you can do something cool here
+ return 'build/whatever';
+ }));
+```
+
+## 3.7.0
+
+- update vinyl-fs to remove BOM from UTF8 files
+- add --tasks-simple flag for plaintext task listings
+- updated autocomplete scripts to be simpler and use new --tasks-simple flag
+- added support for transpilers via liftoff 0.11 and interpret
+ - just npm install your compiler (coffee-script for example) and it will work out of the box
+
+## 3.5.5
+
+- update deps
+- gulp.dest now support mode option, uses source file mode by default (file.stat.mode)
+- use chalk for colors in bin
+- update gulp.env deprecation msg to be more helpful
+
+
+## 3.5.2
+
+- add -V for version on CLI (unix standard)
+- -v is deprecated, use -V
+- add -T as an alias for --tasks
+- documentation
+
+## 3.5
+
+- added `gulp.watch(globs, tasksArray)` sugar
+- remove gulp.taskQueue
+- deprecate gulp.run
+- deprecate gulp.env
+- add engineStrict to prevent people with node < 0.9 from installing
+
+## 3.4
+
+- added `--tasks` that prints out the tree of tasks + deps
+- global cli + local install mismatch is no longer fatal
+- remove tests for fs stuff
+- switch core src, dest, and watch to vinyl-fs
+- internal cleaning
+
+## 3.3.4
+
+- `--base` is now `--cwd`
+
+## 3.3.3
+
+- support for `--base` CLI arg to change where the search for gulpfile/`--require`s starts
+- support for `--gulpfile` CLI arg to point to a gulpfile specifically
+
+## 3.3.0
+
+- file.contents streams are no longer paused coming out of src
+- dest now passes files through before they are empty to fix passing to multiple dests
+
+## 3.2.4
+
+- Bug fix - we didn't have any CLI tests
+
+## 3.2.3
+
+- Update dependencies for bug fixes
+- autocomplete stuff in the completion folder
+
+## 3.2
+
+- File object is now [vinyl](https://github.com/wearefractal/vinyl)
+- .watch() is now [glob-watcher](https://github.com/wearefractal/glob-watcher)
+- Fix CLI -v when no gulpfile found
+- gulp-util updated
+- Logging moved to CLI bin file
+ - Will cause double logging if you update global CLI to 3.2 but not local
+ - Will cause no logging if you update local to 3.1 but not global CLI
+- Drop support for < 0.9
+
+## 3.1.3
+
+- Move isStream and isBuffer to gulp-util
+
+## 3.1
+
+- Move file class to gulp-util
+
+## 3.0
+
+- Ability to pass multiple globs and glob negations to glob-stream
+- Breaking change to the way glob-stream works
+- File object is now a class
+- file.shortened changed to file.relative
+- file.cwd added
+- Break out getStats to avoid nesting
+- Major code reorganization
+
+## 2.7
+
+- Breaking change to the way options are passed to glob-stream
+- Introduce new File object to ease pain of computing shortened names (now a getter)
+
+## 2.4 - 2.6
+
+- Moved stuff to gulp-util
+- Quit exposing createGlobStream (just use the glob-stream module)
+- More logging
+- Prettier time durations
+- Tons of documentation changes
+- gulp.trigger(tasks...) as a through stream
+
+## 1.2-2.4 (11/12/13)
+
+- src buffer=false fixed for 0.8 and 0.9 (remember to .resume() on these versions before consuming)
+- CLI completely rewritten
+ - Colorful logging
+ - Uses local version of gulp to run tasks
+ - Uses findup to locate gulpfile (so you can run it anywhere in your project)
+ - chdir to gulpfile directory before loading it
+ - Correct exit codes on errors
+- silent flag added to gulp to disable logging
+- Fixes to task orchestration (3rd party)
+- Better support for globbed directories (thanks @robrich)
+
+## 1.2 (10/28/13)
+
+- Can specify buffer=false on src streams to make file.content a stream
+- Can specify read=false on src streams to disable file.content
+
+## 1.1 (10/21/13)
+
+- Can specify run callback
+- Can specify task dependencies
+- Tasks can accept callback or return promise
+- `gulp.verbose` exposes run-time internals
+
+## 1.0 (9/26/13)
+
+- Specify dependency versions
+- Updated docs
+
+## 0.2 (8/6/13)
+
+- Rename .files() to .src() and .folder() to .dest()
+
+## 0.1 (7/18/13)
+
+- Initial Release
diff --git a/node_modules/gulp/LICENSE b/node_modules/gulp/LICENSE
new file mode 100644
index 00000000..a64cd85d
--- /dev/null
+++ b/node_modules/gulp/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2013-2015 Fractal
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/gulp/README.md b/node_modules/gulp/README.md
new file mode 100644
index 00000000..eba26acd
--- /dev/null
+++ b/node_modules/gulp/README.md
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+# gulp
+**The streaming build system**
+
+[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Support us][gittip-image]][gittip-url] [![Build Status][travis-image]][travis-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url]
+
+## Like what we do?
+
+[Support us via Gratipay](https://gratipay.com/WeAreFractal/)
+
+## Documentation
+
+For a Getting started guide, API docs, recipes, making a plugin, etc. see the [documentation page](/docs/README.md)!
+
+## Sample `gulpfile.js`
+
+This file is just a quick sample to give you a taste of what gulp does.
+
+```js
+var gulp = require('gulp');
+var coffee = require('gulp-coffee');
+var concat = require('gulp-concat');
+var uglify = require('gulp-uglify');
+var imagemin = require('gulp-imagemin');
+var sourcemaps = require('gulp-sourcemaps');
+var del = require('del');
+
+var paths = {
+ scripts: ['client/js/**/*.coffee', '!client/external/**/*.coffee'],
+ images: 'client/img/**/*'
+};
+
+// Not all tasks need to use streams
+// A gulpfile is just another node program and you can use all packages available on npm
+gulp.task('clean', function(cb) {
+ // You can use multiple globbing patterns as you would with `gulp.src`
+ del(['build'], cb);
+});
+
+gulp.task('scripts', ['clean'], function() {
+ // Minify and copy all JavaScript (except vendor scripts)
+ // with sourcemaps all the way down
+ return gulp.src(paths.scripts)
+ .pipe(sourcemaps.init())
+ .pipe(coffee())
+ .pipe(uglify())
+ .pipe(concat('all.min.js'))
+ .pipe(sourcemaps.write())
+ .pipe(gulp.dest('build/js'));
+});
+
+// Copy all static images
+gulp.task('images', ['clean'], function() {
+ return gulp.src(paths.images)
+ // Pass in options to the task
+ .pipe(imagemin({optimizationLevel: 5}))
+ .pipe(gulp.dest('build/img'));
+});
+
+// Rerun the task when a file changes
+gulp.task('watch', function() {
+ gulp.watch(paths.scripts, ['scripts']);
+ gulp.watch(paths.images, ['images']);
+});
+
+// The default task (called when you run `gulp` from cli)
+gulp.task('default', ['watch', 'scripts', 'images']);
+```
+
+## Incremental Builds
+
+We recommend these plugins:
+
+- [gulp-changed](https://github.com/sindresorhus/gulp-changed) - only pass through changed files
+- [gulp-cached](https://github.com/wearefractal/gulp-cached) - in-memory file cache, not for operation on sets of files
+- [gulp-remember](https://github.com/ahaurw01/gulp-remember) - pairs nicely with gulp-cached
+- [gulp-newer](https://github.com/tschaub/gulp-newer) - pass through newer source files only, supports many:1 source:dest
+
+## Want to contribute?
+
+Anyone can help make this project better - check out the [Contributing guide](/CONTRIBUTING.md)!
+
+
+[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/wearefractal/gulp/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
+
+[gittip-url]: https://www.gittip.com/WeAreFractal/
+[gittip-image]: http://img.shields.io/gittip/WeAreFractal.svg
+
+[downloads-image]: http://img.shields.io/npm/dm/gulp.svg
+[npm-url]: https://npmjs.org/package/gulp
+[npm-image]: http://img.shields.io/npm/v/gulp.svg
+
+[travis-url]: https://travis-ci.org/gulpjs/gulp
+[travis-image]: http://img.shields.io/travis/gulpjs/gulp.svg
+
+[coveralls-url]: https://coveralls.io/r/gulpjs/gulp
+[coveralls-image]: http://img.shields.io/coveralls/gulpjs/gulp/master.svg
+
+[gitter-url]: https://gitter.im/gulpjs/gulp
+[gitter-image]: https://badges.gitter.im/gulpjs/gulp.png
diff --git a/node_modules/gulp/bin/gulp.js b/node_modules/gulp/bin/gulp.js
new file mode 100755
index 00000000..a5374c11
--- /dev/null
+++ b/node_modules/gulp/bin/gulp.js
@@ -0,0 +1,212 @@
+#!/usr/bin/env node
+
+'use strict';
+var gutil = require('gulp-util');
+var prettyTime = require('pretty-hrtime');
+var chalk = require('chalk');
+var semver = require('semver');
+var archy = require('archy');
+var Liftoff = require('liftoff');
+var tildify = require('tildify');
+var interpret = require('interpret');
+var v8flags = require('v8flags');
+var completion = require('../lib/completion');
+var argv = require('minimist')(process.argv.slice(2));
+var taskTree = require('../lib/taskTree');
+
+// Set env var for ORIGINAL cwd
+// before anything touches it
+process.env.INIT_CWD = process.cwd();
+
+var cli = new Liftoff({
+ name: 'gulp',
+ completions: completion,
+ extensions: interpret.jsVariants,
+ v8flags: v8flags,
+});
+
+// Exit with 0 or 1
+var failed = false;
+process.once('exit', function(code) {
+ if (code === 0 && failed) {
+ process.exit(1);
+ }
+});
+
+// Parse those args m8
+var cliPackage = require('../package');
+var versionFlag = argv.v || argv.version;
+var tasksFlag = argv.T || argv.tasks;
+var tasks = argv._;
+var toRun = tasks.length ? tasks : ['default'];
+
+// This is a hold-over until we have a better logging system
+// with log levels
+var simpleTasksFlag = argv['tasks-simple'];
+var shouldLog = !argv.silent && !simpleTasksFlag;
+
+if (!shouldLog) {
+ gutil.log = function() {};
+}
+
+cli.on('require', function(name) {
+ gutil.log('Requiring external module', chalk.magenta(name));
+});
+
+cli.on('requireFail', function(name) {
+ gutil.log(chalk.red('Failed to load external module'), chalk.magenta(name));
+});
+
+cli.on('respawn', function(flags, child) {
+ var nodeFlags = chalk.magenta(flags.join(', '));
+ var pid = chalk.magenta(child.pid);
+ gutil.log('Node flags detected:', nodeFlags);
+ gutil.log('Respawned to PID:', pid);
+});
+
+cli.launch({
+ cwd: argv.cwd,
+ configPath: argv.gulpfile,
+ require: argv.require,
+ completion: argv.completion,
+}, handleArguments);
+
+// The actual logic
+function handleArguments(env) {
+ if (versionFlag && tasks.length === 0) {
+ gutil.log('CLI version', cliPackage.version);
+ if (env.modulePackage && typeof env.modulePackage.version !== 'undefined') {
+ gutil.log('Local version', env.modulePackage.version);
+ }
+ process.exit(0);
+ }
+
+ if (!env.modulePath) {
+ gutil.log(
+ chalk.red('Local gulp not found in'),
+ chalk.magenta(tildify(env.cwd))
+ );
+ gutil.log(chalk.red('Try running: npm install gulp'));
+ process.exit(1);
+ }
+
+ if (!env.configPath) {
+ gutil.log(chalk.red('No gulpfile found'));
+ process.exit(1);
+ }
+
+ // Check for semver difference between cli and local installation
+ if (semver.gt(cliPackage.version, env.modulePackage.version)) {
+ gutil.log(chalk.red('Warning: gulp version mismatch:'));
+ gutil.log(chalk.red('Global gulp is', cliPackage.version));
+ gutil.log(chalk.red('Local gulp is', env.modulePackage.version));
+ }
+
+ // Chdir before requiring gulpfile to make sure
+ // we let them chdir as needed
+ if (process.cwd() !== env.cwd) {
+ process.chdir(env.cwd);
+ gutil.log(
+ 'Working directory changed to',
+ chalk.magenta(tildify(env.cwd))
+ );
+ }
+
+ // This is what actually loads up the gulpfile
+ require(env.configPath);
+ gutil.log('Using gulpfile', chalk.magenta(tildify(env.configPath)));
+
+ var gulpInst = require(env.modulePath);
+ logEvents(gulpInst);
+
+ process.nextTick(function() {
+ if (simpleTasksFlag) {
+ return logTasksSimple(env, gulpInst);
+ }
+ if (tasksFlag) {
+ return logTasks(env, gulpInst);
+ }
+ gulpInst.start.apply(gulpInst, toRun);
+ });
+}
+
+function logTasks(env, localGulp) {
+ var tree = taskTree(localGulp.tasks);
+ tree.label = 'Tasks for ' + chalk.magenta(tildify(env.configPath));
+ archy(tree)
+ .split('\n')
+ .forEach(function(v) {
+ if (v.trim().length === 0) {
+ return;
+ }
+ gutil.log(v);
+ });
+}
+
+function logTasksSimple(env, localGulp) {
+ console.log(Object.keys(localGulp.tasks)
+ .join('\n')
+ .trim());
+}
+
+// Format orchestrator errors
+function formatError(e) {
+ if (!e.err) {
+ return e.message;
+ }
+
+ // PluginError
+ if (typeof e.err.showStack === 'boolean') {
+ return e.err.toString();
+ }
+
+ // Normal error
+ if (e.err.stack) {
+ return e.err.stack;
+ }
+
+ // Unknown (string, number, etc.)
+ return new Error(String(e.err)).stack;
+}
+
+// Wire up logging events
+function logEvents(gulpInst) {
+
+ // Total hack due to poor error management in orchestrator
+ gulpInst.on('err', function() {
+ failed = true;
+ });
+
+ gulpInst.on('task_start', function(e) {
+ // TODO: batch these
+ // so when 5 tasks start at once it only logs one time with all 5
+ gutil.log('Starting', '\'' + chalk.cyan(e.task) + '\'...');
+ });
+
+ gulpInst.on('task_stop', function(e) {
+ var time = prettyTime(e.hrDuration);
+ gutil.log(
+ 'Finished', '\'' + chalk.cyan(e.task) + '\'',
+ 'after', chalk.magenta(time)
+ );
+ });
+
+ gulpInst.on('task_err', function(e) {
+ var msg = formatError(e);
+ var time = prettyTime(e.hrDuration);
+ gutil.log(
+ '\'' + chalk.cyan(e.task) + '\'',
+ chalk.red('errored after'),
+ chalk.magenta(time)
+ );
+ gutil.log(msg);
+ });
+
+ gulpInst.on('task_not_found', function(err) {
+ gutil.log(
+ chalk.red('Task \'' + err.task + '\' is not in your gulpfile')
+ );
+ gutil.log('Please check the documentation for proper gulpfile formatting');
+ process.exit(1);
+ });
+}
diff --git a/node_modules/gulp/completion/README.md b/node_modules/gulp/completion/README.md
new file mode 100644
index 00000000..c0e8c913
--- /dev/null
+++ b/node_modules/gulp/completion/README.md
@@ -0,0 +1,20 @@
+# Completion for gulp
+> Thanks to grunt team and Tyler Kellen
+
+To enable tasks auto-completion in shell you should add `eval "$(gulp --completion=shell)"` in your `.shellrc` file.
+
+## Bash
+
+Add `eval "$(gulp --completion=bash)"` to `~/.bashrc`.
+
+## Zsh
+
+Add `eval "$(gulp --completion=zsh)"` to `~/.zshrc`.
+
+## Powershell
+
+Add `Invoke-Expression ((gulp --completion=powershell) -join [System.Environment]::NewLine)` to `$PROFILE`.
+
+## Fish
+
+Add `gulp --completion=fish | source` to `~/.config/fish/config.fish`.
diff --git a/node_modules/gulp/completion/bash b/node_modules/gulp/completion/bash
new file mode 100644
index 00000000..704c27c1
--- /dev/null
+++ b/node_modules/gulp/completion/bash
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+# Borrowed from grunt-cli
+# http://gruntjs.com/
+#
+# Copyright (c) 2012 Tyler Kellen, contributors
+# Licensed under the MIT license.
+# https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
+
+# Usage:
+#
+# To enable bash completion for gulp, add the following line (minus the
+# leading #, which is the bash comment character) to your ~/.bashrc file:
+#
+# eval "$(gulp --completion=bash)"
+
+# Enable bash autocompletion.
+function _gulp_completions() {
+ # The currently-being-completed word.
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ #Grab tasks
+ local compls=$(gulp --tasks-simple)
+ # Tell complete what stuff to show.
+ COMPREPLY=($(compgen -W "$compls" -- "$cur"))
+}
+
+complete -o default -F _gulp_completions gulp
diff --git a/node_modules/gulp/completion/fish b/node_modules/gulp/completion/fish
new file mode 100644
index 00000000..f27f2248
--- /dev/null
+++ b/node_modules/gulp/completion/fish
@@ -0,0 +1,10 @@
+#!/usr/bin/env fish
+
+# Usage:
+#
+# To enable fish completion for gulp, add the following line to
+# your ~/.config/fish/config.fish file:
+#
+# gulp --completion=fish | source
+
+complete -c gulp -a "(gulp --tasks-simple)" -f
diff --git a/node_modules/gulp/completion/powershell b/node_modules/gulp/completion/powershell
new file mode 100644
index 00000000..08ec4382
--- /dev/null
+++ b/node_modules/gulp/completion/powershell
@@ -0,0 +1,61 @@
+# Copyright (c) 2014 Jason Jarrett
+#
+# Tab completion for the `gulp`
+#
+# Usage:
+#
+# To enable powershell completion for gulp you need to be running
+# at least PowerShell v3 or greater and add the below to your $PROFILE
+#
+# Invoke-Expression ((gulp --completion=powershell) -join [System.Environment]::NewLine)
+#
+#
+
+$gulp_completion_Process = {
+ param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter)
+
+
+ # Load up an assembly to read the gulpfile's sha1
+ if(-not $global:GulpSHA1Managed) {
+ [Reflection.Assembly]::LoadWithPartialName("System.Security") | out-null
+ $global:GulpSHA1Managed = new-Object System.Security.Cryptography.SHA1Managed
+ }
+
+ # setup a global (in-memory) cache
+ if(-not $global:GulpfileShaCache) {
+ $global:GulpfileShaCache = @{};
+ }
+
+ $cache = $global:GulpfileShaCache;
+
+ # Get the gulpfile's sha1
+ $sha1gulpFile = (resolve-path gulpfile.js -ErrorAction Ignore | %{
+ $file = [System.IO.File]::Open($_.Path, "open", "read")
+ [string]::join('', ($global:GulpSHA1Managed.ComputeHash($file) | %{ $_.ToString("x2") }))
+ $file.Dispose()
+ })
+
+ # lookup the sha1 for previously cached task lists.
+ if($cache.ContainsKey($sha1gulpFile)){
+ $tasks = $cache[$sha1gulpFile];
+ } else {
+ $tasks = (gulp --tasks-simple).split("`n");
+ $cache[$sha1gulpFile] = $tasks;
+ }
+
+
+ $tasks |
+ where { $_.startswith($commandName) }
+ Sort-Object |
+ foreach { New-Object System.Management.Automation.CompletionResult $_, $_, 'ParameterValue', ('{0}' -f $_) }
+}
+
+if (-not $global:options) {
+ $global:options = @{
+ CustomArgumentCompleters = @{};
+ NativeArgumentCompleters = @{}
+ }
+}
+
+$global:options['NativeArgumentCompleters']['gulp'] = $gulp_completion_Process
+$function:tabexpansion2 = $function:tabexpansion2 -replace 'End\r\n{','End { if ($null -ne $options) { $options += $global:options} else {$options = $global:options}'
diff --git a/node_modules/gulp/completion/zsh b/node_modules/gulp/completion/zsh
new file mode 100644
index 00000000..8169b22d
--- /dev/null
+++ b/node_modules/gulp/completion/zsh
@@ -0,0 +1,25 @@
+#!/bin/zsh
+
+# Borrowed from grunt-cli
+# http://gruntjs.com/
+#
+# Copyright (c) 2012 Tyler Kellen, contributors
+# Licensed under the MIT license.
+# https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
+
+# Usage:
+#
+# To enable zsh completion for gulp, add the following line (minus the
+# leading #, which is the zsh comment character) to your ~/.zshrc file:
+#
+# eval "$(gulp --completion=zsh)"
+
+# Enable zsh autocompletion.
+function _gulp_completion() {
+ # Grab tasks
+ compls=$(gulp --tasks-simple)
+ completions=(${=compls})
+ compadd -- $completions
+}
+
+compdef _gulp_completion gulp
diff --git a/node_modules/gulp/index.js b/node_modules/gulp/index.js
new file mode 100644
index 00000000..42bc69b3
--- /dev/null
+++ b/node_modules/gulp/index.js
@@ -0,0 +1,63 @@
+'use strict';
+
+var util = require('util');
+var Orchestrator = require('orchestrator');
+var gutil = require('gulp-util');
+var deprecated = require('deprecated');
+var vfs = require('vinyl-fs');
+
+function Gulp() {
+ Orchestrator.call(this);
+}
+util.inherits(Gulp, Orchestrator);
+
+Gulp.prototype.task = Gulp.prototype.add;
+Gulp.prototype.run = function() {
+ // `run()` is deprecated as of 3.5 and will be removed in 4.0
+ // Use task dependencies instead
+
+ // Impose our opinion of "default" tasks onto orchestrator
+ var tasks = arguments.length ? arguments : ['default'];
+
+ this.start.apply(this, tasks);
+};
+
+Gulp.prototype.src = vfs.src;
+Gulp.prototype.dest = vfs.dest;
+Gulp.prototype.watch = function(glob, opt, fn) {
+ if (typeof opt === 'function' || Array.isArray(opt)) {
+ fn = opt;
+ opt = null;
+ }
+
+ // Array of tasks given
+ if (Array.isArray(fn)) {
+ return vfs.watch(glob, opt, function() {
+ this.start.apply(this, fn);
+ }.bind(this));
+ }
+
+ return vfs.watch(glob, opt, fn);
+};
+
+// Let people use this class from our instance
+Gulp.prototype.Gulp = Gulp;
+
+// Deprecations
+deprecated.field('gulp.env has been deprecated. ' +
+ 'Use your own CLI parser instead. ' +
+ 'We recommend using yargs or minimist.',
+ console.warn,
+ Gulp.prototype,
+ 'env',
+ gutil.env
+);
+
+Gulp.prototype.run = deprecated.method('gulp.run() has been deprecated. ' +
+ 'Use task dependencies or gulp.watch task triggering instead.',
+ console.warn,
+ Gulp.prototype.run
+);
+
+var inst = new Gulp();
+module.exports = inst;
diff --git a/node_modules/gulp/lib/completion.js b/node_modules/gulp/lib/completion.js
new file mode 100644
index 00000000..7000250b
--- /dev/null
+++ b/node_modules/gulp/lib/completion.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var fs = require('fs');
+var path = require('path');
+
+module.exports = function(name) {
+ if (typeof name !== 'string') {
+ throw new Error('Missing completion type');
+ }
+ var file = path.join(__dirname, '../completion', name);
+ try {
+ console.log(fs.readFileSync(file, 'utf8'));
+ process.exit(0);
+ } catch (err) {
+ console.log(
+ 'echo "gulp autocompletion rules for',
+ '\'' + name + '\'',
+ 'not found"'
+ );
+ process.exit(5);
+ }
+};
diff --git a/node_modules/gulp/lib/taskTree.js b/node_modules/gulp/lib/taskTree.js
new file mode 100644
index 00000000..accb1a77
--- /dev/null
+++ b/node_modules/gulp/lib/taskTree.js
@@ -0,0 +1,14 @@
+'use strict';
+
+module.exports = function(tasks) {
+ return Object.keys(tasks)
+ .reduce(function(prev, task) {
+ prev.nodes.push({
+ label: task,
+ nodes: tasks[task].dep,
+ });
+ return prev;
+ }, {
+ nodes: [],
+ });
+};
diff --git a/node_modules/gulp/node_modules/.bin/semver b/node_modules/gulp/node_modules/.bin/semver
new file mode 120000
index 00000000..317eb293
--- /dev/null
+++ b/node_modules/gulp/node_modules/.bin/semver
@@ -0,0 +1 @@
+../semver/bin/semver
\ No newline at end of file
diff --git a/node_modules/gulp/node_modules/archy/.travis.yml b/node_modules/gulp/node_modules/archy/.travis.yml
new file mode 100644
index 00000000..895dbd36
--- /dev/null
+++ b/node_modules/gulp/node_modules/archy/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+ - 0.6
+ - 0.8
diff --git a/node_modules/gulp/node_modules/archy/LICENSE b/node_modules/gulp/node_modules/archy/LICENSE
new file mode 100644
index 00000000..ee27ba4b
--- /dev/null
+++ b/node_modules/gulp/node_modules/archy/LICENSE
@@ -0,0 +1,18 @@
+This software is released under the MIT license:
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/gulp/node_modules/archy/examples/beep.js b/node_modules/gulp/node_modules/archy/examples/beep.js
new file mode 100644
index 00000000..9c070479
--- /dev/null
+++ b/node_modules/gulp/node_modules/archy/examples/beep.js
@@ -0,0 +1,24 @@
+var archy = require('../');
+var s = archy({
+ label : 'beep',
+ nodes : [
+ 'ity',
+ {
+ label : 'boop',
+ nodes : [
+ {
+ label : 'o_O',
+ nodes : [
+ {
+ label : 'oh',
+ nodes : [ 'hello', 'puny' ]
+ },
+ 'human'
+ ]
+ },
+ 'party\ntime!'
+ ]
+ }
+ ]
+});
+console.log(s);
diff --git a/node_modules/gulp/node_modules/archy/examples/multi_line.js b/node_modules/gulp/node_modules/archy/examples/multi_line.js
new file mode 100644
index 00000000..8afdfada
--- /dev/null
+++ b/node_modules/gulp/node_modules/archy/examples/multi_line.js
@@ -0,0 +1,25 @@
+var archy = require('../');
+
+var s = archy({
+ label : 'beep\none\ntwo',
+ nodes : [
+ 'ity',
+ {
+ label : 'boop',
+ nodes : [
+ {
+ label : 'o_O\nwheee',
+ nodes : [
+ {
+ label : 'oh',
+ nodes : [ 'hello', 'puny\nmeat' ]
+ },
+ 'creature'
+ ]
+ },
+ 'party\ntime!'
+ ]
+ }
+ ]
+});
+console.log(s);
diff --git a/node_modules/gulp/node_modules/archy/index.js b/node_modules/gulp/node_modules/archy/index.js
new file mode 100644
index 00000000..869d64e6
--- /dev/null
+++ b/node_modules/gulp/node_modules/archy/index.js
@@ -0,0 +1,35 @@
+module.exports = function archy (obj, prefix, opts) {
+ if (prefix === undefined) prefix = '';
+ if (!opts) opts = {};
+ var chr = function (s) {
+ var chars = {
+ '│' : '|',
+ '└' : '`',
+ '├' : '+',
+ '─' : '-',
+ '┬' : '-'
+ };
+ return opts.unicode === false ? chars[s] : s;
+ };
+
+ if (typeof obj === 'string') obj = { label : obj };
+
+ var nodes = obj.nodes || [];
+ var lines = (obj.label || '').split('\n');
+ var splitter = '\n' + prefix + (nodes.length ? chr('│') : ' ') + ' ';
+
+ return prefix
+ + lines.join(splitter) + '\n'
+ + nodes.map(function (node, ix) {
+ var last = ix === nodes.length - 1;
+ var more = node.nodes && node.nodes.length;
+ var prefix_ = prefix + (last ? ' ' : chr('│')) + ' ';
+
+ return prefix
+ + (last ? chr('└') : chr('├')) + chr('─')
+ + (more ? chr('┬') : chr('─')) + ' '
+ + archy(node, prefix_, opts).slice(prefix.length + 2)
+ ;
+ }).join('')
+ ;
+};
diff --git a/node_modules/gulp/node_modules/archy/package.json b/node_modules/gulp/node_modules/archy/package.json
new file mode 100644
index 00000000..a98bbfe7
--- /dev/null
+++ b/node_modules/gulp/node_modules/archy/package.json
@@ -0,0 +1,80 @@
+{
+ "name": "archy",
+ "version": "1.0.0",
+ "description": "render nested hierarchies `npm ls` style with unicode pipes",
+ "main": "index.js",
+ "devDependencies": {
+ "tap": "~0.3.3",
+ "tape": "~0.1.1"
+ },
+ "scripts": {
+ "test": "tap test"
+ },
+ "testling": {
+ "files": "test/*.js",
+ "browsers": {
+ "iexplore": [
+ "6.0",
+ "7.0",
+ "8.0",
+ "9.0"
+ ],
+ "chrome": [
+ "20.0"
+ ],
+ "firefox": [
+ "10.0",
+ "15.0"
+ ],
+ "safari": [
+ "5.1"
+ ],
+ "opera": [
+ "12.0"
+ ]
+ }
+ },
+ "repository": {
+ "type": "git",
+ "url": "http://github.com/substack/node-archy.git"
+ },
+ "keywords": [
+ "hierarchy",
+ "npm ls",
+ "unicode",
+ "pretty",
+ "print"
+ ],
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "license": "MIT",
+ "gitHead": "30223c16191e877bf027b15b12daf077b9b55b84",
+ "bugs": {
+ "url": "https://github.com/substack/node-archy/issues"
+ },
+ "homepage": "https://github.com/substack/node-archy",
+ "_id": "archy@1.0.0",
+ "_shasum": "f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40",
+ "_from": "archy@>=1.0.0 <2.0.0",
+ "_npmVersion": "1.4.25",
+ "_npmUser": {
+ "name": "substack",
+ "email": "mail@substack.net"
+ },
+ "maintainers": [
+ {
+ "name": "substack",
+ "email": "mail@substack.net"
+ }
+ ],
+ "dist": {
+ "shasum": "f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40",
+ "tarball": "http://registry.npmjs.org/archy/-/archy-1.0.0.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/gulp/node_modules/archy/readme.markdown b/node_modules/gulp/node_modules/archy/readme.markdown
new file mode 100644
index 00000000..ef7a5cf3
--- /dev/null
+++ b/node_modules/gulp/node_modules/archy/readme.markdown
@@ -0,0 +1,88 @@
+# archy
+
+Render nested hierarchies `npm ls` style with unicode pipes.
+
+[![browser support](http://ci.testling.com/substack/node-archy.png)](http://ci.testling.com/substack/node-archy)
+
+[![build status](https://secure.travis-ci.org/substack/node-archy.png)](http://travis-ci.org/substack/node-archy)
+
+# example
+
+``` js
+var archy = require('archy');
+var s = archy({
+ label : 'beep',
+ nodes : [
+ 'ity',
+ {
+ label : 'boop',
+ nodes : [
+ {
+ label : 'o_O',
+ nodes : [
+ {
+ label : 'oh',
+ nodes : [ 'hello', 'puny' ]
+ },
+ 'human'
+ ]
+ },
+ 'party\ntime!'
+ ]
+ }
+ ]
+});
+console.log(s);
+```
+
+output
+
+```
+beep
+├── ity
+└─┬ boop
+ ├─┬ o_O
+ │ ├─┬ oh
+ │ │ ├── hello
+ │ │ └── puny
+ │ └── human
+ └── party
+ time!
+```
+
+# methods
+
+var archy = require('archy')
+
+## archy(obj, prefix='', opts={})
+
+Return a string representation of `obj` with unicode pipe characters like how
+`npm ls` looks.
+
+`obj` should be a tree of nested objects with `'label'` and `'nodes'` fields.
+`'label'` is a string of text to display at a node level and `'nodes'` is an
+array of the descendents of the current node.
+
+If a node is a string, that string will be used as the `'label'` and an empty
+array of `'nodes'` will be used.
+
+`prefix` gets prepended to all the lines and is used by the algorithm to
+recursively update.
+
+If `'label'` has newlines they will be indented at the present indentation level
+with the current prefix.
+
+To disable unicode results in favor of all-ansi output set `opts.unicode` to
+`false`.
+
+# install
+
+With [npm](http://npmjs.org) do:
+
+```
+npm install archy
+```
+
+# license
+
+MIT
diff --git a/node_modules/gulp/node_modules/archy/test/beep.js b/node_modules/gulp/node_modules/archy/test/beep.js
new file mode 100644
index 00000000..4ea74f9c
--- /dev/null
+++ b/node_modules/gulp/node_modules/archy/test/beep.js
@@ -0,0 +1,40 @@
+var test = require('tape');
+var archy = require('../');
+
+test('beep', function (t) {
+ var s = archy({
+ label : 'beep',
+ nodes : [
+ 'ity',
+ {
+ label : 'boop',
+ nodes : [
+ {
+ label : 'o_O',
+ nodes : [
+ {
+ label : 'oh',
+ nodes : [ 'hello', 'puny' ]
+ },
+ 'human'
+ ]
+ },
+ 'party!'
+ ]
+ }
+ ]
+ });
+ t.equal(s, [
+ 'beep',
+ '├── ity',
+ '└─┬ boop',
+ ' ├─┬ o_O',
+ ' │ ├─┬ oh',
+ ' │ │ ├── hello',
+ ' │ │ └── puny',
+ ' │ └── human',
+ ' └── party!',
+ ''
+ ].join('\n'));
+ t.end();
+});
diff --git a/node_modules/gulp/node_modules/archy/test/multi_line.js b/node_modules/gulp/node_modules/archy/test/multi_line.js
new file mode 100644
index 00000000..2cf2154d
--- /dev/null
+++ b/node_modules/gulp/node_modules/archy/test/multi_line.js
@@ -0,0 +1,45 @@
+var test = require('tape');
+var archy = require('../');
+
+test('multi-line', function (t) {
+ var s = archy({
+ label : 'beep\none\ntwo',
+ nodes : [
+ 'ity',
+ {
+ label : 'boop',
+ nodes : [
+ {
+ label : 'o_O\nwheee',
+ nodes : [
+ {
+ label : 'oh',
+ nodes : [ 'hello', 'puny\nmeat' ]
+ },
+ 'creature'
+ ]
+ },
+ 'party\ntime!'
+ ]
+ }
+ ]
+ });
+ t.equal(s, [
+ 'beep',
+ '│ one',
+ '│ two',
+ '├── ity',
+ '└─┬ boop',
+ ' ├─┬ o_O',
+ ' │ │ wheee',
+ ' │ ├─┬ oh',
+ ' │ │ ├── hello',
+ ' │ │ └── puny',
+ ' │ │ meat',
+ ' │ └── creature',
+ ' └── party',
+ ' time!',
+ ''
+ ].join('\n'));
+ t.end();
+});
diff --git a/node_modules/gulp/node_modules/archy/test/non_unicode.js b/node_modules/gulp/node_modules/archy/test/non_unicode.js
new file mode 100644
index 00000000..7204d332
--- /dev/null
+++ b/node_modules/gulp/node_modules/archy/test/non_unicode.js
@@ -0,0 +1,40 @@
+var test = require('tape');
+var archy = require('../');
+
+test('beep', function (t) {
+ var s = archy({
+ label : 'beep',
+ nodes : [
+ 'ity',
+ {
+ label : 'boop',
+ nodes : [
+ {
+ label : 'o_O',
+ nodes : [
+ {
+ label : 'oh',
+ nodes : [ 'hello', 'puny' ]
+ },
+ 'human'
+ ]
+ },
+ 'party!'
+ ]
+ }
+ ]
+ }, '', { unicode : false });
+ t.equal(s, [
+ 'beep',
+ '+-- ity',
+ '`-- boop',
+ ' +-- o_O',
+ ' | +-- oh',
+ ' | | +-- hello',
+ ' | | `-- puny',
+ ' | `-- human',
+ ' `-- party!',
+ ''
+ ].join('\n'));
+ t.end();
+});
diff --git a/node_modules/gulp/node_modules/chalk/index.js b/node_modules/gulp/node_modules/chalk/index.js
new file mode 100644
index 00000000..2d85a917
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/index.js
@@ -0,0 +1,116 @@
+'use strict';
+var escapeStringRegexp = require('escape-string-regexp');
+var ansiStyles = require('ansi-styles');
+var stripAnsi = require('strip-ansi');
+var hasAnsi = require('has-ansi');
+var supportsColor = require('supports-color');
+var defineProps = Object.defineProperties;
+var isSimpleWindowsTerm = process.platform === 'win32' && !/^xterm/i.test(process.env.TERM);
+
+function Chalk(options) {
+ // detect mode if not set manually
+ this.enabled = !options || options.enabled === undefined ? supportsColor : options.enabled;
+}
+
+// use bright blue on Windows as the normal blue color is illegible
+if (isSimpleWindowsTerm) {
+ ansiStyles.blue.open = '\u001b[94m';
+}
+
+var styles = (function () {
+ var ret = {};
+
+ Object.keys(ansiStyles).forEach(function (key) {
+ ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');
+
+ ret[key] = {
+ get: function () {
+ return build.call(this, this._styles.concat(key));
+ }
+ };
+ });
+
+ return ret;
+})();
+
+var proto = defineProps(function chalk() {}, styles);
+
+function build(_styles) {
+ var builder = function () {
+ return applyStyle.apply(builder, arguments);
+ };
+
+ builder._styles = _styles;
+ builder.enabled = this.enabled;
+ // __proto__ is used because we must return a function, but there is
+ // no way to create a function with a different prototype.
+ /* eslint-disable no-proto */
+ builder.__proto__ = proto;
+
+ return builder;
+}
+
+function applyStyle() {
+ // support varags, but simply cast to string in case there's only one arg
+ var args = arguments;
+ var argsLen = args.length;
+ var str = argsLen !== 0 && String(arguments[0]);
+
+ if (argsLen > 1) {
+ // don't slice `arguments`, it prevents v8 optimizations
+ for (var a = 1; a < argsLen; a++) {
+ str += ' ' + args[a];
+ }
+ }
+
+ if (!this.enabled || !str) {
+ return str;
+ }
+
+ var nestedStyles = this._styles;
+ var i = nestedStyles.length;
+
+ // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe,
+ // see https://github.com/chalk/chalk/issues/58
+ // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop.
+ var originalDim = ansiStyles.dim.open;
+ if (isSimpleWindowsTerm && (nestedStyles.indexOf('gray') !== -1 || nestedStyles.indexOf('grey') !== -1)) {
+ ansiStyles.dim.open = '';
+ }
+
+ while (i--) {
+ var code = ansiStyles[nestedStyles[i]];
+
+ // Replace any instances already present with a re-opening code
+ // otherwise only the part of the string until said closing code
+ // will be colored, and the rest will simply be 'plain'.
+ str = code.open + str.replace(code.closeRe, code.open) + code.close;
+ }
+
+ // Reset the original 'dim' if we changed it to work around the Windows dimmed gray issue.
+ ansiStyles.dim.open = originalDim;
+
+ return str;
+}
+
+function init() {
+ var ret = {};
+
+ Object.keys(styles).forEach(function (name) {
+ ret[name] = {
+ get: function () {
+ return build.call(this, [name]);
+ }
+ };
+ });
+
+ return ret;
+}
+
+defineProps(Chalk.prototype, init());
+
+module.exports = new Chalk();
+module.exports.styles = ansiStyles;
+module.exports.hasColor = hasAnsi;
+module.exports.stripColor = stripAnsi;
+module.exports.supportsColor = supportsColor;
diff --git a/node_modules/gulp/node_modules/chalk/license b/node_modules/gulp/node_modules/chalk/license
new file mode 100644
index 00000000..654d0bfe
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/ansi-styles/index.js b/node_modules/gulp/node_modules/chalk/node_modules/ansi-styles/index.js
new file mode 100644
index 00000000..78945278
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/ansi-styles/index.js
@@ -0,0 +1,65 @@
+'use strict';
+
+function assembleStyles () {
+ var styles = {
+ modifiers: {
+ reset: [0, 0],
+ bold: [1, 22], // 21 isn't widely supported and 22 does the same thing
+ dim: [2, 22],
+ italic: [3, 23],
+ underline: [4, 24],
+ inverse: [7, 27],
+ hidden: [8, 28],
+ strikethrough: [9, 29]
+ },
+ colors: {
+ black: [30, 39],
+ red: [31, 39],
+ green: [32, 39],
+ yellow: [33, 39],
+ blue: [34, 39],
+ magenta: [35, 39],
+ cyan: [36, 39],
+ white: [37, 39],
+ gray: [90, 39]
+ },
+ bgColors: {
+ bgBlack: [40, 49],
+ bgRed: [41, 49],
+ bgGreen: [42, 49],
+ bgYellow: [43, 49],
+ bgBlue: [44, 49],
+ bgMagenta: [45, 49],
+ bgCyan: [46, 49],
+ bgWhite: [47, 49]
+ }
+ };
+
+ // fix humans
+ styles.colors.grey = styles.colors.gray;
+
+ Object.keys(styles).forEach(function (groupName) {
+ var group = styles[groupName];
+
+ Object.keys(group).forEach(function (styleName) {
+ var style = group[styleName];
+
+ styles[styleName] = group[styleName] = {
+ open: '\u001b[' + style[0] + 'm',
+ close: '\u001b[' + style[1] + 'm'
+ };
+ });
+
+ Object.defineProperty(styles, groupName, {
+ value: group,
+ enumerable: false
+ });
+ });
+
+ return styles;
+}
+
+Object.defineProperty(module, 'exports', {
+ enumerable: true,
+ get: assembleStyles
+});
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/ansi-styles/license b/node_modules/gulp/node_modules/chalk/node_modules/ansi-styles/license
new file mode 100644
index 00000000..654d0bfe
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/ansi-styles/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/ansi-styles/package.json b/node_modules/gulp/node_modules/chalk/node_modules/ansi-styles/package.json
new file mode 100644
index 00000000..962e7743
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/ansi-styles/package.json
@@ -0,0 +1,80 @@
+{
+ "name": "ansi-styles",
+ "version": "2.1.0",
+ "description": "ANSI escape codes for styling strings in the terminal",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/chalk/ansi-styles"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "maintainers": [
+ {
+ "name": "sindresorhus",
+ "email": "sindresorhus@gmail.com"
+ },
+ {
+ "name": "jbnicolai",
+ "email": "jappelman@xebia.com"
+ }
+ ],
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "scripts": {
+ "test": "mocha"
+ },
+ "files": [
+ "index.js"
+ ],
+ "keywords": [
+ "ansi",
+ "styles",
+ "color",
+ "colour",
+ "colors",
+ "terminal",
+ "console",
+ "cli",
+ "string",
+ "tty",
+ "escape",
+ "formatting",
+ "rgb",
+ "256",
+ "shell",
+ "xterm",
+ "log",
+ "logging",
+ "command-line",
+ "text"
+ ],
+ "devDependencies": {
+ "mocha": "*"
+ },
+ "gitHead": "18421cbe4a2d93359ec2599a894f704be126d066",
+ "bugs": {
+ "url": "https://github.com/chalk/ansi-styles/issues"
+ },
+ "homepage": "https://github.com/chalk/ansi-styles",
+ "_id": "ansi-styles@2.1.0",
+ "_shasum": "990f747146927b559a932bf92959163d60c0d0e2",
+ "_from": "ansi-styles@>=2.1.0 <3.0.0",
+ "_npmVersion": "2.10.1",
+ "_nodeVersion": "0.12.4",
+ "_npmUser": {
+ "name": "jbnicolai",
+ "email": "jappelman@xebia.com"
+ },
+ "dist": {
+ "shasum": "990f747146927b559a932bf92959163d60c0d0e2",
+ "tarball": "http://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz",
+ "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/ansi-styles/readme.md b/node_modules/gulp/node_modules/chalk/node_modules/ansi-styles/readme.md
new file mode 100644
index 00000000..3f933f61
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/ansi-styles/readme.md
@@ -0,0 +1,86 @@
+# ansi-styles [![Build Status](https://travis-ci.org/chalk/ansi-styles.svg?branch=master)](https://travis-ci.org/chalk/ansi-styles)
+
+> [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal
+
+You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings.
+
+![](screenshot.png)
+
+
+## Install
+
+```
+$ npm install --save ansi-styles
+```
+
+
+## Usage
+
+```js
+var ansi = require('ansi-styles');
+
+console.log(ansi.green.open + 'Hello world!' + ansi.green.close);
+```
+
+
+## API
+
+Each style has an `open` and `close` property.
+
+
+## Styles
+
+### Modifiers
+
+- `reset`
+- `bold`
+- `dim`
+- `italic` *(not widely supported)*
+- `underline`
+- `inverse`
+- `hidden`
+- `strikethrough` *(not widely supported)*
+
+### Colors
+
+- `black`
+- `red`
+- `green`
+- `yellow`
+- `blue`
+- `magenta`
+- `cyan`
+- `white`
+- `gray`
+
+### Background colors
+
+- `bgBlack`
+- `bgRed`
+- `bgGreen`
+- `bgYellow`
+- `bgBlue`
+- `bgMagenta`
+- `bgCyan`
+- `bgWhite`
+
+
+## Advanced usage
+
+By default you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module.
+
+- `ansi.modifiers`
+- `ansi.colors`
+- `ansi.bgColors`
+
+
+###### Example
+
+```js
+console.log(ansi.colors.green.open);
+```
+
+
+## License
+
+MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/escape-string-regexp/index.js b/node_modules/gulp/node_modules/chalk/node_modules/escape-string-regexp/index.js
new file mode 100644
index 00000000..ac6572ca
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/escape-string-regexp/index.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
+
+module.exports = function (str) {
+ if (typeof str !== 'string') {
+ throw new TypeError('Expected a string');
+ }
+
+ return str.replace(matchOperatorsRe, '\\$&');
+};
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/escape-string-regexp/license b/node_modules/gulp/node_modules/chalk/node_modules/escape-string-regexp/license
new file mode 100644
index 00000000..654d0bfe
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/escape-string-regexp/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/escape-string-regexp/package.json b/node_modules/gulp/node_modules/chalk/node_modules/escape-string-regexp/package.json
new file mode 100644
index 00000000..749f5ded
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/escape-string-regexp/package.json
@@ -0,0 +1,70 @@
+{
+ "name": "escape-string-regexp",
+ "version": "1.0.3",
+ "description": "Escape RegExp special characters",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/sindresorhus/escape-string-regexp"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "http://sindresorhus.com"
+ },
+ "maintainers": [
+ {
+ "name": "sindresorhus",
+ "email": "sindresorhus@gmail.com"
+ },
+ {
+ "name": "jbnicolai",
+ "email": "jappelman@xebia.com"
+ }
+ ],
+ "engines": {
+ "node": ">=0.8.0"
+ },
+ "scripts": {
+ "test": "mocha"
+ },
+ "files": [
+ "index.js"
+ ],
+ "keywords": [
+ "regex",
+ "regexp",
+ "re",
+ "regular",
+ "expression",
+ "escape",
+ "string",
+ "str",
+ "special",
+ "characters"
+ ],
+ "devDependencies": {
+ "mocha": "*"
+ },
+ "gitHead": "1e446e6b4449b5f1f8868cd31bf8fd25ee37fb4b",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/escape-string-regexp/issues"
+ },
+ "homepage": "https://github.com/sindresorhus/escape-string-regexp",
+ "_id": "escape-string-regexp@1.0.3",
+ "_shasum": "9e2d8b25bc2555c3336723750e03f099c2735bb5",
+ "_from": "escape-string-regexp@>=1.0.2 <2.0.0",
+ "_npmVersion": "2.1.16",
+ "_nodeVersion": "0.10.35",
+ "_npmUser": {
+ "name": "jbnicolai",
+ "email": "jappelman@xebia.com"
+ },
+ "dist": {
+ "shasum": "9e2d8b25bc2555c3336723750e03f099c2735bb5",
+ "tarball": "http://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz",
+ "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/escape-string-regexp/readme.md b/node_modules/gulp/node_modules/chalk/node_modules/escape-string-regexp/readme.md
new file mode 100644
index 00000000..808a963a
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/escape-string-regexp/readme.md
@@ -0,0 +1,27 @@
+# escape-string-regexp [![Build Status](https://travis-ci.org/sindresorhus/escape-string-regexp.svg?branch=master)](https://travis-ci.org/sindresorhus/escape-string-regexp)
+
+> Escape RegExp special characters
+
+
+## Install
+
+```sh
+$ npm install --save escape-string-regexp
+```
+
+
+## Usage
+
+```js
+var escapeStringRegexp = require('escape-string-regexp');
+
+var escapedString = escapeStringRegexp('how much $ for a unicorn?');
+//=> how much \$ for a unicorn\?
+
+new RegExp(escapedString);
+```
+
+
+## License
+
+MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/index.js b/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/index.js
new file mode 100644
index 00000000..98fae067
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/index.js
@@ -0,0 +1,4 @@
+'use strict';
+var ansiRegex = require('ansi-regex');
+var re = new RegExp(ansiRegex().source); // remove the `g` flag
+module.exports = re.test.bind(re);
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/license b/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/license
new file mode 100644
index 00000000..654d0bfe
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/index.js b/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/index.js
new file mode 100644
index 00000000..4906755b
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/index.js
@@ -0,0 +1,4 @@
+'use strict';
+module.exports = function () {
+ return /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;
+};
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/license b/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/license
new file mode 100644
index 00000000..654d0bfe
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/package.json b/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/package.json
new file mode 100644
index 00000000..f109fc0a
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/package.json
@@ -0,0 +1,86 @@
+{
+ "name": "ansi-regex",
+ "version": "2.0.0",
+ "description": "Regular expression for matching ANSI escape codes",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/sindresorhus/ansi-regex"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "maintainers": [
+ {
+ "name": "sindresorhus",
+ "email": "sindresorhus@gmail.com"
+ },
+ {
+ "name": "jbnicolai",
+ "email": "jappelman@xebia.com"
+ }
+ ],
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "scripts": {
+ "test": "mocha test/test.js",
+ "view-supported": "node test/viewCodes.js"
+ },
+ "files": [
+ "index.js"
+ ],
+ "keywords": [
+ "ansi",
+ "styles",
+ "color",
+ "colour",
+ "colors",
+ "terminal",
+ "console",
+ "cli",
+ "string",
+ "tty",
+ "escape",
+ "formatting",
+ "rgb",
+ "256",
+ "shell",
+ "xterm",
+ "command-line",
+ "text",
+ "regex",
+ "regexp",
+ "re",
+ "match",
+ "test",
+ "find",
+ "pattern"
+ ],
+ "devDependencies": {
+ "mocha": "*"
+ },
+ "gitHead": "57c3f2941a73079fa8b081e02a522e3d29913e2f",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/ansi-regex/issues"
+ },
+ "homepage": "https://github.com/sindresorhus/ansi-regex",
+ "_id": "ansi-regex@2.0.0",
+ "_shasum": "c5061b6e0ef8a81775e50f5d66151bf6bf371107",
+ "_from": "ansi-regex@>=2.0.0 <3.0.0",
+ "_npmVersion": "2.11.2",
+ "_nodeVersion": "0.12.5",
+ "_npmUser": {
+ "name": "sindresorhus",
+ "email": "sindresorhus@gmail.com"
+ },
+ "dist": {
+ "shasum": "c5061b6e0ef8a81775e50f5d66151bf6bf371107",
+ "tarball": "http://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz",
+ "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/readme.md b/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/readme.md
new file mode 100644
index 00000000..1a4894ec
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/readme.md
@@ -0,0 +1,31 @@
+# ansi-regex [![Build Status](https://travis-ci.org/sindresorhus/ansi-regex.svg?branch=master)](https://travis-ci.org/sindresorhus/ansi-regex)
+
+> Regular expression for matching [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)
+
+
+## Install
+
+```
+$ npm install --save ansi-regex
+```
+
+
+## Usage
+
+```js
+var ansiRegex = require('ansi-regex');
+
+ansiRegex().test('\u001b[4mcake\u001b[0m');
+//=> true
+
+ansiRegex().test('cake');
+//=> false
+
+'\u001b[4mcake\u001b[0m'.match(ansiRegex());
+//=> ['\u001b[4m', '\u001b[0m']
+```
+
+
+## License
+
+MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/package.json b/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/package.json
new file mode 100644
index 00000000..3ad76fc9
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/package.json
@@ -0,0 +1,85 @@
+{
+ "name": "has-ansi",
+ "version": "2.0.0",
+ "description": "Check if a string has ANSI escape codes",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/sindresorhus/has-ansi"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "maintainers": [
+ {
+ "name": "sindresorhus",
+ "email": "sindresorhus@gmail.com"
+ },
+ {
+ "name": "jbnicolai",
+ "email": "jappelman@xebia.com"
+ }
+ ],
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "scripts": {
+ "test": "node test.js"
+ },
+ "files": [
+ "index.js"
+ ],
+ "keywords": [
+ "ansi",
+ "styles",
+ "color",
+ "colour",
+ "colors",
+ "terminal",
+ "console",
+ "string",
+ "tty",
+ "escape",
+ "shell",
+ "xterm",
+ "command-line",
+ "text",
+ "regex",
+ "regexp",
+ "re",
+ "match",
+ "test",
+ "find",
+ "pattern",
+ "has"
+ ],
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "devDependencies": {
+ "ava": "0.0.4"
+ },
+ "gitHead": "0722275e1bef139fcd09137da6e5550c3cd368b9",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/has-ansi/issues"
+ },
+ "homepage": "https://github.com/sindresorhus/has-ansi",
+ "_id": "has-ansi@2.0.0",
+ "_shasum": "34f5049ce1ecdf2b0649af3ef24e45ed35416d91",
+ "_from": "has-ansi@>=2.0.0 <3.0.0",
+ "_npmVersion": "2.11.2",
+ "_nodeVersion": "0.12.5",
+ "_npmUser": {
+ "name": "sindresorhus",
+ "email": "sindresorhus@gmail.com"
+ },
+ "dist": {
+ "shasum": "34f5049ce1ecdf2b0649af3ef24e45ed35416d91",
+ "tarball": "http://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/readme.md b/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/readme.md
new file mode 100644
index 00000000..02bc7c23
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/has-ansi/readme.md
@@ -0,0 +1,36 @@
+# has-ansi [![Build Status](https://travis-ci.org/sindresorhus/has-ansi.svg?branch=master)](https://travis-ci.org/sindresorhus/has-ansi)
+
+> Check if a string has [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)
+
+
+## Install
+
+```
+$ npm install --save has-ansi
+```
+
+
+## Usage
+
+```js
+var hasAnsi = require('has-ansi');
+
+hasAnsi('\u001b[4mcake\u001b[0m');
+//=> true
+
+hasAnsi('cake');
+//=> false
+```
+
+
+## Related
+
+- [has-ansi-cli](https://github.com/sindresorhus/has-ansi-cli) - CLI for this module
+- [strip-ansi](https://github.com/sindresorhus/strip-ansi) - Strip ANSI escape codes
+- [ansi-regex](https://github.com/sindresorhus/ansi-regex) - Regular expression for matching ANSI escape codes
+- [chalk](https://github.com/sindresorhus/chalk) - Terminal string styling done right
+
+
+## License
+
+MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/index.js b/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/index.js
new file mode 100644
index 00000000..099480fb
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/index.js
@@ -0,0 +1,6 @@
+'use strict';
+var ansiRegex = require('ansi-regex')();
+
+module.exports = function (str) {
+ return typeof str === 'string' ? str.replace(ansiRegex, '') : str;
+};
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/license b/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/license
new file mode 100644
index 00000000..654d0bfe
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/index.js b/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/index.js
new file mode 100644
index 00000000..4906755b
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/index.js
@@ -0,0 +1,4 @@
+'use strict';
+module.exports = function () {
+ return /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;
+};
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/license b/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/license
new file mode 100644
index 00000000..654d0bfe
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/package.json b/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/package.json
new file mode 100644
index 00000000..f109fc0a
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/package.json
@@ -0,0 +1,86 @@
+{
+ "name": "ansi-regex",
+ "version": "2.0.0",
+ "description": "Regular expression for matching ANSI escape codes",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/sindresorhus/ansi-regex"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "maintainers": [
+ {
+ "name": "sindresorhus",
+ "email": "sindresorhus@gmail.com"
+ },
+ {
+ "name": "jbnicolai",
+ "email": "jappelman@xebia.com"
+ }
+ ],
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "scripts": {
+ "test": "mocha test/test.js",
+ "view-supported": "node test/viewCodes.js"
+ },
+ "files": [
+ "index.js"
+ ],
+ "keywords": [
+ "ansi",
+ "styles",
+ "color",
+ "colour",
+ "colors",
+ "terminal",
+ "console",
+ "cli",
+ "string",
+ "tty",
+ "escape",
+ "formatting",
+ "rgb",
+ "256",
+ "shell",
+ "xterm",
+ "command-line",
+ "text",
+ "regex",
+ "regexp",
+ "re",
+ "match",
+ "test",
+ "find",
+ "pattern"
+ ],
+ "devDependencies": {
+ "mocha": "*"
+ },
+ "gitHead": "57c3f2941a73079fa8b081e02a522e3d29913e2f",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/ansi-regex/issues"
+ },
+ "homepage": "https://github.com/sindresorhus/ansi-regex",
+ "_id": "ansi-regex@2.0.0",
+ "_shasum": "c5061b6e0ef8a81775e50f5d66151bf6bf371107",
+ "_from": "ansi-regex@>=2.0.0 <3.0.0",
+ "_npmVersion": "2.11.2",
+ "_nodeVersion": "0.12.5",
+ "_npmUser": {
+ "name": "sindresorhus",
+ "email": "sindresorhus@gmail.com"
+ },
+ "dist": {
+ "shasum": "c5061b6e0ef8a81775e50f5d66151bf6bf371107",
+ "tarball": "http://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz",
+ "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/readme.md b/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/readme.md
new file mode 100644
index 00000000..1a4894ec
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/readme.md
@@ -0,0 +1,31 @@
+# ansi-regex [![Build Status](https://travis-ci.org/sindresorhus/ansi-regex.svg?branch=master)](https://travis-ci.org/sindresorhus/ansi-regex)
+
+> Regular expression for matching [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)
+
+
+## Install
+
+```
+$ npm install --save ansi-regex
+```
+
+
+## Usage
+
+```js
+var ansiRegex = require('ansi-regex');
+
+ansiRegex().test('\u001b[4mcake\u001b[0m');
+//=> true
+
+ansiRegex().test('cake');
+//=> false
+
+'\u001b[4mcake\u001b[0m'.match(ansiRegex());
+//=> ['\u001b[4m', '\u001b[0m']
+```
+
+
+## License
+
+MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/package.json b/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/package.json
new file mode 100644
index 00000000..b2d95248
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/package.json
@@ -0,0 +1,85 @@
+{
+ "name": "strip-ansi",
+ "version": "3.0.0",
+ "description": "Strip ANSI escape codes",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/sindresorhus/strip-ansi"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "maintainers": [
+ {
+ "name": "sindresorhus",
+ "email": "sindresorhus@gmail.com"
+ },
+ {
+ "name": "jbnicolai",
+ "email": "jappelman@xebia.com"
+ }
+ ],
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "scripts": {
+ "test": "node test.js"
+ },
+ "files": [
+ "index.js"
+ ],
+ "keywords": [
+ "strip",
+ "trim",
+ "remove",
+ "ansi",
+ "styles",
+ "color",
+ "colour",
+ "colors",
+ "terminal",
+ "console",
+ "string",
+ "tty",
+ "escape",
+ "formatting",
+ "rgb",
+ "256",
+ "shell",
+ "xterm",
+ "log",
+ "logging",
+ "command-line",
+ "text"
+ ],
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "devDependencies": {
+ "ava": "0.0.4"
+ },
+ "gitHead": "3f05b9810e1438f946e2eb84ee854cc00b972e9e",
+ "bugs": {
+ "url": "https://github.com/sindresorhus/strip-ansi/issues"
+ },
+ "homepage": "https://github.com/sindresorhus/strip-ansi",
+ "_id": "strip-ansi@3.0.0",
+ "_shasum": "7510b665567ca914ccb5d7e072763ac968be3724",
+ "_from": "strip-ansi@>=3.0.0 <4.0.0",
+ "_npmVersion": "2.11.2",
+ "_nodeVersion": "0.12.5",
+ "_npmUser": {
+ "name": "sindresorhus",
+ "email": "sindresorhus@gmail.com"
+ },
+ "dist": {
+ "shasum": "7510b665567ca914ccb5d7e072763ac968be3724",
+ "tarball": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz",
+ "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/readme.md b/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/readme.md
new file mode 100644
index 00000000..76091512
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/strip-ansi/readme.md
@@ -0,0 +1,33 @@
+# strip-ansi [![Build Status](https://travis-ci.org/sindresorhus/strip-ansi.svg?branch=master)](https://travis-ci.org/sindresorhus/strip-ansi)
+
+> Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)
+
+
+## Install
+
+```
+$ npm install --save strip-ansi
+```
+
+
+## Usage
+
+```js
+var stripAnsi = require('strip-ansi');
+
+stripAnsi('\u001b[4mcake\u001b[0m');
+//=> 'cake'
+```
+
+
+## Related
+
+- [strip-ansi-cli](https://github.com/sindresorhus/strip-ansi-cli) - CLI for this module
+- [has-ansi](https://github.com/sindresorhus/has-ansi) - Check if a string has ANSI escape codes
+- [ansi-regex](https://github.com/sindresorhus/ansi-regex) - Regular expression for matching ANSI escape codes
+- [chalk](https://github.com/sindresorhus/chalk) - Terminal string styling done right
+
+
+## License
+
+MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/supports-color/index.js b/node_modules/gulp/node_modules/chalk/node_modules/supports-color/index.js
new file mode 100644
index 00000000..4346e272
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/supports-color/index.js
@@ -0,0 +1,50 @@
+'use strict';
+var argv = process.argv;
+
+var terminator = argv.indexOf('--');
+var hasFlag = function (flag) {
+ flag = '--' + flag;
+ var pos = argv.indexOf(flag);
+ return pos !== -1 && (terminator !== -1 ? pos < terminator : true);
+};
+
+module.exports = (function () {
+ if ('FORCE_COLOR' in process.env) {
+ return true;
+ }
+
+ if (hasFlag('no-color') ||
+ hasFlag('no-colors') ||
+ hasFlag('color=false')) {
+ return false;
+ }
+
+ if (hasFlag('color') ||
+ hasFlag('colors') ||
+ hasFlag('color=true') ||
+ hasFlag('color=always')) {
+ return true;
+ }
+
+ if (process.stdout && !process.stdout.isTTY) {
+ return false;
+ }
+
+ if (process.platform === 'win32') {
+ return true;
+ }
+
+ if ('COLORTERM' in process.env) {
+ return true;
+ }
+
+ if (process.env.TERM === 'dumb') {
+ return false;
+ }
+
+ if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(process.env.TERM)) {
+ return true;
+ }
+
+ return false;
+})();
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/supports-color/license b/node_modules/gulp/node_modules/chalk/node_modules/supports-color/license
new file mode 100644
index 00000000..654d0bfe
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/supports-color/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/supports-color/package.json b/node_modules/gulp/node_modules/chalk/node_modules/supports-color/package.json
new file mode 100644
index 00000000..36ef8614
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/supports-color/package.json
@@ -0,0 +1,79 @@
+{
+ "name": "supports-color",
+ "version": "2.0.0",
+ "description": "Detect whether a terminal supports color",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/chalk/supports-color"
+ },
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "maintainers": [
+ {
+ "name": "sindresorhus",
+ "email": "sindresorhus@gmail.com"
+ },
+ {
+ "name": "jbnicolai",
+ "email": "jappelman@xebia.com"
+ }
+ ],
+ "engines": {
+ "node": ">=0.8.0"
+ },
+ "scripts": {
+ "test": "mocha"
+ },
+ "files": [
+ "index.js"
+ ],
+ "keywords": [
+ "color",
+ "colour",
+ "colors",
+ "terminal",
+ "console",
+ "cli",
+ "ansi",
+ "styles",
+ "tty",
+ "rgb",
+ "256",
+ "shell",
+ "xterm",
+ "command-line",
+ "support",
+ "supports",
+ "capability",
+ "detect"
+ ],
+ "devDependencies": {
+ "mocha": "*",
+ "require-uncached": "^1.0.2"
+ },
+ "gitHead": "8400d98ade32b2adffd50902c06d9e725a5c6588",
+ "bugs": {
+ "url": "https://github.com/chalk/supports-color/issues"
+ },
+ "homepage": "https://github.com/chalk/supports-color",
+ "_id": "supports-color@2.0.0",
+ "_shasum": "535d045ce6b6363fa40117084629995e9df324c7",
+ "_from": "supports-color@>=2.0.0 <3.0.0",
+ "_npmVersion": "2.11.2",
+ "_nodeVersion": "0.12.5",
+ "_npmUser": {
+ "name": "sindresorhus",
+ "email": "sindresorhus@gmail.com"
+ },
+ "dist": {
+ "shasum": "535d045ce6b6363fa40117084629995e9df324c7",
+ "tarball": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/gulp/node_modules/chalk/node_modules/supports-color/readme.md b/node_modules/gulp/node_modules/chalk/node_modules/supports-color/readme.md
new file mode 100644
index 00000000..b4761f1e
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/node_modules/supports-color/readme.md
@@ -0,0 +1,36 @@
+# supports-color [![Build Status](https://travis-ci.org/chalk/supports-color.svg?branch=master)](https://travis-ci.org/chalk/supports-color)
+
+> Detect whether a terminal supports color
+
+
+## Install
+
+```
+$ npm install --save supports-color
+```
+
+
+## Usage
+
+```js
+var supportsColor = require('supports-color');
+
+if (supportsColor) {
+ console.log('Terminal supports color');
+}
+```
+
+It obeys the `--color` and `--no-color` CLI flags.
+
+For situations where using `--color` is not possible, add an environment variable `FORCE_COLOR` with any value to force color. Trumps `--no-color`.
+
+
+## Related
+
+- [supports-color-cli](https://github.com/chalk/supports-color-cli) - CLI for this module
+- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right
+
+
+## License
+
+MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/node_modules/gulp/node_modules/chalk/package.json b/node_modules/gulp/node_modules/chalk/package.json
new file mode 100644
index 00000000..a6120d20
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/package.json
@@ -0,0 +1,103 @@
+{
+ "name": "chalk",
+ "version": "1.1.1",
+ "description": "Terminal string styling done right. Much color.",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/chalk/chalk.git"
+ },
+ "maintainers": [
+ {
+ "name": "sindresorhus",
+ "email": "sindresorhus@gmail.com"
+ },
+ {
+ "name": "jbnicolai",
+ "email": "jappelman@xebia.com"
+ },
+ {
+ "name": "unicorn",
+ "email": "sindresorhus+unicorn@gmail.com"
+ }
+ ],
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "scripts": {
+ "test": "xo && mocha",
+ "bench": "matcha benchmark.js",
+ "coverage": "nyc npm test && nyc report",
+ "coveralls": "nyc npm test && nyc report --reporter=text-lcov | coveralls"
+ },
+ "files": [
+ "index.js"
+ ],
+ "keywords": [
+ "color",
+ "colour",
+ "colors",
+ "terminal",
+ "console",
+ "cli",
+ "string",
+ "str",
+ "ansi",
+ "style",
+ "styles",
+ "tty",
+ "formatting",
+ "rgb",
+ "256",
+ "shell",
+ "xterm",
+ "log",
+ "logging",
+ "command-line",
+ "text"
+ ],
+ "dependencies": {
+ "ansi-styles": "^2.1.0",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "devDependencies": {
+ "coveralls": "^2.11.2",
+ "matcha": "^0.6.0",
+ "mocha": "*",
+ "nyc": "^3.0.0",
+ "require-uncached": "^1.0.2",
+ "resolve-from": "^1.0.0",
+ "semver": "^4.3.3",
+ "xo": "*"
+ },
+ "xo": {
+ "envs": [
+ "node",
+ "mocha"
+ ]
+ },
+ "gitHead": "8b554e254e89c85c1fd04dcc444beeb15824e1a5",
+ "bugs": {
+ "url": "https://github.com/chalk/chalk/issues"
+ },
+ "homepage": "https://github.com/chalk/chalk#readme",
+ "_id": "chalk@1.1.1",
+ "_shasum": "509afb67066e7499f7eb3535c77445772ae2d019",
+ "_from": "chalk@>=1.0.0 <2.0.0",
+ "_npmVersion": "2.13.5",
+ "_nodeVersion": "0.12.7",
+ "_npmUser": {
+ "name": "sindresorhus",
+ "email": "sindresorhus@gmail.com"
+ },
+ "dist": {
+ "shasum": "509afb67066e7499f7eb3535c77445772ae2d019",
+ "tarball": "http://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz",
+ "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/gulp/node_modules/chalk/readme.md b/node_modules/gulp/node_modules/chalk/readme.md
new file mode 100644
index 00000000..5cf111e3
--- /dev/null
+++ b/node_modules/gulp/node_modules/chalk/readme.md
@@ -0,0 +1,213 @@
+
+
+
+
+
+
+
+
+
+> Terminal string styling done right
+
+[![Build Status](https://travis-ci.org/chalk/chalk.svg?branch=master)](https://travis-ci.org/chalk/chalk)
+[![Coverage Status](https://coveralls.io/repos/chalk/chalk/badge.svg?branch=master)](https://coveralls.io/r/chalk/chalk?branch=master)
+[![](http://img.shields.io/badge/unicorn-approved-ff69b4.svg)](https://www.youtube.com/watch?v=9auOCbH5Ns4)
+
+
+[colors.js](https://github.com/Marak/colors.js) used to be the most popular string styling module, but it has serious deficiencies like extending `String.prototype` which causes all kinds of [problems](https://github.com/yeoman/yo/issues/68). Although there are other ones, they either do too much or not enough.
+
+**Chalk is a clean and focused alternative.**
+
+![](https://github.com/chalk/ansi-styles/raw/master/screenshot.png)
+
+
+## Why
+
+- Highly performant
+- Doesn't extend `String.prototype`
+- Expressive API
+- Ability to nest styles
+- Clean and focused
+- Auto-detects color support
+- Actively maintained
+- [Used by ~4500 modules](https://www.npmjs.com/browse/depended/chalk) as of July 15, 2015
+
+
+## Install
+
+```
+$ npm install --save chalk
+```
+
+
+## Usage
+
+Chalk comes with an easy to use composable API where you just chain and nest the styles you want.
+
+```js
+var chalk = require('chalk');
+
+// style a string
+chalk.blue('Hello world!');
+
+// combine styled and normal strings
+chalk.blue('Hello') + 'World' + chalk.red('!');
+
+// compose multiple styles using the chainable API
+chalk.blue.bgRed.bold('Hello world!');
+
+// pass in multiple arguments
+chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz');
+
+// nest styles
+chalk.red('Hello', chalk.underline.bgBlue('world') + '!');
+
+// nest styles of the same type even (color, underline, background)
+chalk.green(
+ 'I am a green line ' +
+ chalk.blue.underline.bold('with a blue substring') +
+ ' that becomes green again!'
+);
+```
+
+Easily define your own themes.
+
+```js
+var chalk = require('chalk');
+var error = chalk.bold.red;
+console.log(error('Error!'));
+```
+
+Take advantage of console.log [string substitution](http://nodejs.org/docs/latest/api/console.html#console_console_log_data).
+
+```js
+var name = 'Sindre';
+console.log(chalk.green('Hello %s'), name);
+//=> Hello Sindre
+```
+
+
+## API
+
+### chalk.`
+
+
+ {{msg}}
+
+
+
+```
+
+You can also mix preprocessor languages in the component file:
+
+``` html
+// app.vue
+
+
+
+h1(class="red") {{msg}}
+
+
+
+```
+
+And you can import using the `src` attribute (note you'll have to save the vue file to trigger a rebuild since the imported file is not tracked by Browserify as a dependency):
+
+``` html
+
+```
+
+Under the hood, the transform will:
+
+- extract the styles, compile them and insert them with the `insert-css` module.
+- extract the template, compile it and add it to your exported options.
+
+You can `require()` other stuff in the `
+