diff --git a/.babelrc b/.babelrc
new file mode 100644
index 000000000..287b76b83
--- /dev/null
+++ b/.babelrc
@@ -0,0 +1,10 @@
+{
+ "plugins": ["@babel/plugin-proposal-class-properties"],
+ "presets": [
+ ["@babel/preset-env", {
+ "targets": {
+ "node": "12"
+ }
+ }]
+ ]
+}
diff --git a/.gitattributes b/.gitattributes
index 176a458f9..f49b99cfa 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1 +1,7 @@
-* text=auto
+* text eol=lf
+
+# Denote all files that are truly binary and should not be modified.
+*.png binary
+*.gif binary
+*.jpg binary
+*.jpeg binary
diff --git a/.gitbook/assets/angular-fullstack-logo.svg b/.gitbook/assets/angular-fullstack-logo.svg
new file mode 100644
index 000000000..bf40810ac
--- /dev/null
+++ b/.gitbook/assets/angular-fullstack-logo.svg
@@ -0,0 +1,9045 @@
+
+
+
+
diff --git a/.gitbook/assets/image (1).png b/.gitbook/assets/image (1).png
new file mode 100644
index 000000000..8079c8294
Binary files /dev/null and b/.gitbook/assets/image (1).png differ
diff --git a/.gitbook/assets/image (2).png b/.gitbook/assets/image (2).png
new file mode 100644
index 000000000..467d4479a
Binary files /dev/null and b/.gitbook/assets/image (2).png differ
diff --git a/.gitbook/assets/image (3).png b/.gitbook/assets/image (3).png
new file mode 100644
index 000000000..feed1d2cc
Binary files /dev/null and b/.gitbook/assets/image (3).png differ
diff --git a/.gitbook/assets/image (4).png b/.gitbook/assets/image (4).png
new file mode 100644
index 000000000..faab366dc
Binary files /dev/null and b/.gitbook/assets/image (4).png differ
diff --git a/.gitbook/assets/image (5).png b/.gitbook/assets/image (5).png
new file mode 100644
index 000000000..20a98b6b2
Binary files /dev/null and b/.gitbook/assets/image (5).png differ
diff --git a/.gitbook/assets/image (6).png b/.gitbook/assets/image (6).png
new file mode 100644
index 000000000..dfc1ea68c
Binary files /dev/null and b/.gitbook/assets/image (6).png differ
diff --git a/.gitbook/assets/image (7).png b/.gitbook/assets/image (7).png
new file mode 100644
index 000000000..a3f223f39
Binary files /dev/null and b/.gitbook/assets/image (7).png differ
diff --git a/.gitbook/assets/image.png b/.gitbook/assets/image.png
new file mode 100644
index 000000000..a3f223f39
Binary files /dev/null and b/.gitbook/assets/image.png differ
diff --git a/.gitignore b/.gitignore
index 9e436b36f..88c5c584e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,9 @@
node_modules
bower_components
-test/temp
+/generators/*
+/test/*
demo
.idea
.DS_Store
release.txt
-fixtures/bower.json
-fixtures/package.json
\ No newline at end of file
+static
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 000000000..ff287e31c
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "angular-fullstack-deps"]
+ path = angular-fullstack-deps
+ url = git@github.com:angular-fullstack/angular-fullstack-deps.git
diff --git a/.npmignore b/.npmignore
new file mode 100644
index 000000000..5106adfe8
--- /dev/null
+++ b/.npmignore
@@ -0,0 +1,18 @@
+angular-fullstack-deps
+test
+.idea
+src
+scripts
+ISSUE_TEMPLATE.md
+PULL_REQUEST_TEMPLATE.md
+/.travis.yml
+gulpfile.js
+Gruntfile.js
+.jshintrc
+/mocha.conf.js
+/media
+/docs
+/task-utils
+/.git*
+/circle.yml
+/.editorconfig
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 85fbe4a6b..000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-language: node_js
-node_js:
- - '0.10'
- - '0.11'
-before_install:
- - gem update --system
- - gem install sass --version "=3.3.7"
- - npm install -g bower grunt-cli
-services: mongodb
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4238f97ba..80fb3e1ae 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,163 +1,1120 @@
-
-### v2.0.13 (2014-08-29)
+
+# [5.0.0-rc.4](https://github.com/angular-fullstack/generator-angular-fullstack/compare/5.0.0-rc.1...v5.0.0-rc.4) (2018-08-11)
-#### Bug Fixes
+### Bug Fixes
-* **gen:**
- * use bool for bootstrap filters ([a5decbc3](http://github.com/DaftMonk/generator-angular-fullstack/commit/a5decbc36e933f94c69d9e9bb58bd8e07148c34d), closes [#496](http://github.com/DaftMonk/generator-angular-fullstack/issues/496))
- * fix build when not selecting socket.io ([fdf063c6](http://github.com/DaftMonk/generator-angular-fullstack/commit/fdf063c6cc2ec4eeef252f13b2e0d301931fa83c))
+* **auth:** fix change password form ([4b147a4](https://github.com/angular-fullstack/generator-angular-fullstack/commit/4b147a4)), closes [#2747](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2747)
+* **client:** hotfix for Babel bug ([73d1e29](https://github.com/angular-fullstack/generator-angular-fullstack/commit/73d1e29))
+* **css:** refactor CSS handling ([68c6e39](https://github.com/angular-fullstack/generator-angular-fullstack/commit/68c6e39))
+* **express:** use cors in dev ([cf3c5e5](https://github.com/angular-fullstack/generator-angular-fullstack/commit/cf3c5e5))
+* **gen:test:** refactor gen to fix tests w/ pug ([2080421](https://github.com/angular-fullstack/generator-angular-fullstack/commit/2080421))
+* **package:** pin uws ([ed3b775](https://github.com/angular-fullstack/generator-angular-fullstack/commit/ed3b775))
+* **server:**
+ * fix CSRF for Angular ([9c816ca](https://github.com/angular-fullstack/generator-angular-fullstack/commit/9c816ca))
+ * SequelizeStore requires object with db ([e3cae48](https://github.com/angular-fullstack/generator-angular-fullstack/commit/e3cae48)), closes [#2732](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2732)
+ * wsInitPromise should be passed into then in a function ([ce46519](https://github.com/angular-fullstack/generator-angular-fullstack/commit/ce46519)), closes [#2751](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2751)
+* **webpack:** remove old plugins ([f1d3a7c](https://github.com/angular-fullstack/generator-angular-fullstack/commit/f1d3a7c))
-
-### v2.0.12 (2014-08-25)
-#### Bug Fixes
+### Features
-* revert multiple strategies per account, which shouldn't go in a patch release
+* **app:**
+ * generate and serve pre-gzipped client files ([8f22699](https://github.com/angular-fullstack/generator-angular-fullstack/commit/8f22699))
+ * use mini-css plugin ([3ac870a](https://github.com/angular-fullstack/generator-angular-fullstack/commit/3ac870a))
+* **gen:** add new route subgenerator ([91a13ff](https://github.com/angular-fullstack/generator-angular-fullstack/commit/91a13ff))
+* **package:**
+ * add 'gulp build' as build script ([f572635](https://github.com/angular-fullstack/generator-angular-fullstack/commit/f572635))
+ * add build:server script ([b98d8a8](https://github.com/angular-fullstack/generator-angular-fullstack/commit/b98d8a8))
+ * reload server on changes ([6166123](https://github.com/angular-fullstack/generator-angular-fullstack/commit/6166123))
+* **server:** allow mongo uri env var in dev ([a46a002](https://github.com/angular-fullstack/generator-angular-fullstack/commit/a46a002))
-
-### v2.0.11 (2014-08-25)
+### Performance Improvements
-#### Bug Fixes
+* **client:** comment out core-js imports\n\nas most people won't need them ([11decfe](https://github.com/angular-fullstack/generator-angular-fullstack/commit/11decfe))
-* **app:** Use parentheses to fix string concat in config ([c6a50ce7](http://github.com/DaftMonk/generator-angular-fullstack/commit/c6a50ce791ab633a17654ce9b0090007d7152463), closes [#466](http://github.com/DaftMonk/generator-angular-fullstack/issues/466))
- * improve jshint usage ([35fcf490](http://github.com/DaftMonk/generator-angular-fullstack/commit/35fcf4902dbbdab2ca6b394ab87ef8e3cc3d052b), closes [#463](http://github.com/DaftMonk/generator-angular-fullstack/issues/463), [#486](http://github.com/DaftMonk/generator-angular-fullstack/issues/486))
-* **gen:** use more restrictive version range for ng-component ([19698973](http://github.com/DaftMonk/generator-angular-fullstack/commit/196989730c8922fa5e1dc9caa45eb85052535e30))
-#### Features
+
+# [5.0.0-rc.2](https://github.com/angular-fullstack/generator-angular-fullstack/compare/5.0.0-rc.1...v5.0.0-rc.2) (2018-06-02)
-* **socket.io:** build socket.io into vendor.js ([06f2e46e](http://github.com/DaftMonk/generator-angular-fullstack/commit/06f2e46ef382b5af1691f34b6cf504f1e5640b86))
-* **docs:** Inform users/developers of the `canary` branch ([74693623](http://github.com/DaftMonk/generator-angular-fullstack/commit/74693623eb23c9399495a3baff7e3479a1d9f3ba))
-* **gen:** make generator tests faster, and easier to run ([84acb744](http://github.com/DaftMonk/generator-angular-fullstack/commit/84acb7448ccc7c55b72bdd19bfae50c33d527296))
-* **app:** add additional node version to travis.yml ([e4f00b08](http://github.com/DaftMonk/generator-angular-fullstack/commit/e4f00b083a880713ca563e3447b9fb3f56a54ebc))
-* **uibootstrap:** add basic modal service and template when using uibootstrap ([7c14bed4](http://github.com/DaftMonk/generator-angular-fullstack/commit/7c14bed4873b92124bcbe422fed918836b8f5df5))
-
-### v2.0.10 (2014-08-16)
+### Bug Fixes
+* **css:** refactor CSS handling ([68c6e39](https://github.com/angular-fullstack/generator-angular-fullstack/commit/68c6e39))
+* **gen:test:** refactor gen to fix tests w/ pug ([2080421](https://github.com/angular-fullstack/generator-angular-fullstack/commit/2080421))
-#### Bug Fixes
-* **server:** undefined domain env variable causing issues ([cb683dde](http://github.com/DaftMonk/generator-angular-fullstack/commit/cb683dde6814959328a58267215ce477aa723e35))
+### Features
-
-### v2.0.9 (2014-08-15)
+* **gen:** add new route subgenerator ([91a13ff](https://github.com/angular-fullstack/generator-angular-fullstack/commit/91a13ff))
-#### Bug Fixes
-* **app:**
- * add .idea folder to gitignore ([2e1f1182](http://github.com/DaftMonk/generator-angular-fullstack/commit/2e1f1182684594300ac5ca85ffab175bfcafd3ec))
- * Missing user response code ([c1766604](http://github.com/DaftMonk/generator-angular-fullstack/commit/c1766604d7ae7ab1eb8713f37285d13341dc8ae1))
- * use `''` instead `null` as URL to open ioSocket ([0f0d0fdc](http://github.com/DaftMonk/generator-angular-fullstack/commit/0f0d0fdce38d42f04f71d9e1174400adfb699061))
- * save the version of the generator that was used ([2b76b17b](http://github.com/DaftMonk/generator-angular-fullstack/commit/2b76b17bb5fa1980b449498beec87ab58ceee012))
-* **gruntfile:** incorrect path to index.html for cdnify ([0ad646cb](http://github.com/DaftMonk/generator-angular-fullstack/commit/0ad646cbd48dbb2f65fc00b930a9f243174611be))
-* **openshift:** fix issues with openshift deployment ([ace07238](http://github.com/DaftMonk/generator-angular-fullstack/commit/ace07238e3299d6002337ba12f7862ce84beafd8))
+
+# [5.0.0-rc.1](https://github.com/angular-fullstack/generator-angular-fullstack/compare/5.0.0-beta.1...v5.0.0-rc.1) (2018-03-15)
-#### Features
+### Bug Fixes
-* **gen:** add automatic demo releases with grunt task ([44852233](http://github.com/DaftMonk/generator-angular-fullstack/commit/44852233fcf28d5ff8681fcabc3bfb4130778a22))
-* **gruntfile:** add grunt buildcontrol tasks to app, for easier deployment ([036478df](http://github.com/DaftMonk/generator-angular-fullstack/commit/036478dfd7067d38ab19ca86c0c5196678412799))
-* **heroku:** provide prompt to set the deployment region ([13cd5e7d](http://github.com/DaftMonk/generator-angular-fullstack/commit/13cd5e7d42f2845268f38ba19e0d253ae675c594))
-* **server:** add sample env config file that can be tracked by git ([c9f80bcd](http://github.com/DaftMonk/generator-angular-fullstack/commit/c9f80bcd67d6e3eef2c78ccbceff78f763ae88d1))
+* **gen:** fix .npmignore ([c3bf61f](https://github.com/angular-fullstack/generator-angular-fullstack/commit/c3bf61f))
-
-### v2.0.8 (2014-07-31)
-#### Bug Fixes
+
+# [5.0.0-rc.0](https://github.com/angular-fullstack/generator-angular-fullstack/compare/5.0.0-beta.1...v5.0.0-rc.0) (2018-03-08)
-* **coffee:** update socket service to match javascript version ([c27cefe2](http://github.com/DaftMonk/generator-angular-fullstack/commit/c27cefe24d8ec64d905f908c66a56bf602303dce))
-* **gen:** Fixed missing `oauth` property in `.yo-rc.json` after 2.0.5 update ([11d324b9](http://github.com/DaftMonk/generator-angular-fullstack/commit/11d324b95992b68bd19f402401e98f5936cdb343))
-* **travis:** install sass gem if sass is enabled ([ceeac27b](http://github.com/DaftMonk/generator-angular-fullstack/commit/ceeac27b8f912aa6dec2caf3bf20dd7551f2d754))
-* **twitter:** revert mongoose connection change ([8675a002](http://github.com/DaftMonk/generator-angular-fullstack/commit/8675a002e301957569374fdcad87aab0bff6b3b4))
+### Bug Fixes
-#### Features
+* **client:** fix some outstanding client bugs ([f4c5471](https://github.com/angular-fullstack/generator-angular-fullstack/commit/f4c5471))
+* **client:auth:guard:** declare `authService` on class ([afc725f](https://github.com/angular-fullstack/generator-angular-fullstack/commit/afc725f))
+* **gen:**
+ * canary cleanup ([96364a7](https://github.com/angular-fullstack/generator-angular-fullstack/commit/96364a7))
+ * don't convert main html file ([8d37569](https://github.com/angular-fullstack/generator-angular-fullstack/commit/8d37569))
+* **package:** add missing comma ([b2a745b](https://github.com/angular-fullstack/generator-angular-fullstack/commit/b2a745b))
+* **seed:** rename index.html to app.html to fix CRSF and token issues ([2e784bf](https://github.com/angular-fullstack/generator-angular-fullstack/commit/2e784bf))
+* **server:** fix express router usage ([542337e](https://github.com/angular-fullstack/generator-angular-fullstack/commit/542337e))
+* **server:auth:** specify digest for pbkdf2 ([689c3fc](https://github.com/angular-fullstack/generator-angular-fullstack/commit/689c3fc)), closes [#2628](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2628)
+* **server:test:** resolve primus in non-dev ([7bed185](https://github.com/angular-fullstack/generator-angular-fullstack/commit/7bed185))
+* **test:**
+ * only save new primus.js in dev ([483dda0](https://github.com/angular-fullstack/generator-angular-fullstack/commit/483dda0))
+ * use babel in `protractor.conf.js` ([ffb16cb](https://github.com/angular-fullstack/generator-angular-fullstack/commit/ffb16cb))
+* misc cleanup ([a1619e6](https://github.com/angular-fullstack/generator-angular-fullstack/commit/a1619e6))
-* **user-management:** use the User $resource to populate users for the admin page ([708f0729](http://github.com/DaftMonk/generator-angular-fullstack/commit/708f07290d98d6bd73723f9db49cce7758c3d12b))
-
-### v2.0.7 (2014-07-27)
+### Features
+* **client:** add auth-guard service ([a5cbada](https://github.com/angular-fullstack/generator-angular-fullstack/commit/a5cbada))
+* **package:**
+ * add separate client lint script for TS ([d426be7](https://github.com/angular-fullstack/generator-angular-fullstack/commit/d426be7))
+ * add test:server script ([24b6144](https://github.com/angular-fullstack/generator-angular-fullstack/commit/24b6144))
-#### Bug Fixes
+
+# [5.0.0-beta.3](https://github.com/angular-fullstack/generator-angular-fullstack/compare/5.0.0-beta.1...v5.0.0-beta.3) (2017-11-30)
-* **gruntfile:** grunt tasks should run if no local config exists ([422d6bca](http://github.com/DaftMonk/generator-angular-fullstack/commit/422d6bca07283057b0fa275dba0de447c9f4f167))
-* **server:** fix setting TTL index on collection : sessions error ([0581ed09](http://github.com/DaftMonk/generator-angular-fullstack/commit/0581ed094b2c6141ab9e0c016eda22aa49e1d075))
-
-### v2.0.6 (2014-07-27)
+### Bug Fixes
+
+* **client:auth:guard:** declare `authService` on class ([afc725f](https://github.com/angular-fullstack/generator-angular-fullstack/commit/afc725f))
+
+
+
+
+# [5.0.0-beta.2](https://github.com/angular-fullstack/generator-angular-fullstack/compare/5.0.0-beta.1...v5.0.0-beta.2) (2017-11-12)
+
+
+### Bug Fixes
+
+* **package:** add missing comma ([b2a745b](https://github.com/angular-fullstack/generator-angular-fullstack/commit/b2a745b))
+* **server:test:** resolve primus in non-dev ([7bed185](https://github.com/angular-fullstack/generator-angular-fullstack/commit/7bed185))
+* **test:**
+ * only save new primus.js in dev ([483dda0](https://github.com/angular-fullstack/generator-angular-fullstack/commit/483dda0))
+ * use babel in `protractor.conf.js` ([ffb16cb](https://github.com/angular-fullstack/generator-angular-fullstack/commit/ffb16cb))
+
+
+### Features
+
+* Upgraded to Angular 5.0.1
+* **client:** add auth-guard service ([a5cbada](https://github.com/angular-fullstack/generator-angular-fullstack/commit/a5cbada))
+
+
+
+
+# [5.0.0-beta.1](https://github.com/angular-fullstack/generator-angular-fullstack/compare/5.0.0-beta.0...v5.0.0-beta.1) (2017-10-17)
+
+
+### Bug Fixes
+
+* **client:** fix thing redirect ([6e1b254](https://github.com/angular-fullstack/generator-angular-fullstack/commit/6e1b254))
+* **client:auth:** fix session re-establish ([31a6ecf](https://github.com/angular-fullstack/generator-angular-fullstack/commit/31a6ecf)), closes [#2625](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2625)
+* **client:test:** fixes for TS ([47b9d3e](https://github.com/angular-fullstack/generator-angular-fullstack/commit/47b9d3e))
+* **gen:**
+ * fix gen issue with flow on ([4f9618a](https://github.com/angular-fullstack/generator-angular-fullstack/commit/4f9618a))
+ * remedy test failure ([f226df9](https://github.com/angular-fullstack/generator-angular-fullstack/commit/f226df9))
+* **server:** swap shrink-ray back out for compression ([e225a67](https://github.com/angular-fullstack/generator-angular-fullstack/commit/e225a67))
+* **test:** disable `main.component.spec.js` ([c5e6db9](https://github.com/angular-fullstack/generator-angular-fullstack/commit/c5e6db9))
+* **ts:** exclude typescript specs files from generating error on transpilling ([46f762e](https://github.com/angular-fullstack/generator-angular-fullstack/commit/46f762e))
+* **webpack:** use a mock for primus in test ([689d0b2](https://github.com/angular-fullstack/generator-angular-fullstack/commit/689d0b2))
+
+
+### Features
+
+* **client:auth:** don't submit forms if invalid ([d967554](https://github.com/angular-fullstack/generator-angular-fullstack/commit/d967554))
+* **gen:** default Flow on ([804a917](https://github.com/angular-fullstack/generator-angular-fullstack/commit/804a917))
+* **package:**
+ * add `start:mongo` convenience script ([101f567](https://github.com/angular-fullstack/generator-angular-fullstack/commit/101f567))
+ * add linting scripts ([8cfe32e](https://github.com/angular-fullstack/generator-angular-fullstack/commit/8cfe32e))
+ * add start scripts ([e2bfff8](https://github.com/angular-fullstack/generator-angular-fullstack/commit/e2bfff8))
+ * add test:client script ([9be904d](https://github.com/angular-fullstack/generator-angular-fullstack/commit/9be904d))
+
+
+
+
+# [5.0.0-alpha.5](https://github.com/angular-fullstack/generator-angular-fullstack/compare/4.1.0...v5.0.0-alpha.5) (2017-05-14)
+
+
+### Bug Fixes
+
+* **client:**
+ * fix a few client code errors ([5535fe3](https://github.com/angular-fullstack/generator-angular-fullstack/commit/5535fe3))
+ * fix loading css ([5d780fe](https://github.com/angular-fullstack/generator-angular-fullstack/commit/5d780fe))
+ * fix upgrade stuff ([01e1054](https://github.com/angular-fullstack/generator-angular-fullstack/commit/01e1054))
+* **client:footer:** fix hardcoded template & style extentions ([c638fb6](https://github.com/angular-fullstack/generator-angular-fullstack/commit/c638fb6)), closes [#2421](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2421)
+* **client:main:** fix add/delete things ([91b920b](https://github.com/angular-fullstack/generator-angular-fullstack/commit/91b920b))
+* **client:navbar:** fix hardcoded template ext ([5e999b2](https://github.com/angular-fullstack/generator-angular-fullstack/commit/5e999b2)), closes [#2469](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2469)
+* **client:userService:** use `id` or `_id` property ([4be3191](https://github.com/angular-fullstack/generator-angular-fullstack/commit/4be3191))
+* **events:** mongoose event registration ([79bdeed](https://github.com/angular-fullstack/generator-angular-fullstack/commit/79bdeed)), closes [#2479](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2479)
+* **gen:**
+ * comment out ngCompnent stuff ([ab1bf13](https://github.com/angular-fullstack/generator-angular-fullstack/commit/ab1bf13)), closes [#2403](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2403)
+ * fix another type stripping; also TS doesn't like default exports ([a55691a](https://github.com/angular-fullstack/generator-angular-fullstack/commit/a55691a))
+* **gen:factory:** fix factory subgen location ([b09cfe5](https://github.com/angular-fullstack/generator-angular-fullstack/commit/b09cfe5)), closes [#2381](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2381)
+* **mocha:** fix server not closing ([2ba3dd8](https://github.com/angular-fullstack/generator-angular-fullstack/commit/2ba3dd8))
+* **package:** move syntax plugins to deps ([c016979](https://github.com/angular-fullstack/generator-angular-fullstack/commit/c016979)), closes [#2405](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2405)
+* **server:**
+ * fix new shared default export ([d4e4a7a](https://github.com/angular-fullstack/generator-angular-fullstack/commit/d4e4a7a))
+ * fix some bluebird warnings ([a84ff90](https://github.com/angular-fullstack/generator-angular-fullstack/commit/a84ff90)), closes [#2412](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2412) [#2363](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2363)
+* **webpack:** fix CSS loader options ([3f7e2b4](https://github.com/angular-fullstack/generator-angular-fullstack/commit/3f7e2b4))
+
+
+### Features
+
+* **app:** convert to Angular 2 ([6c3b307](https://github.com/angular-fullstack/generator-angular-fullstack/commit/6c3b307))
+* **gen:**
+ * add functions for adding TS public/private keywords ([17fea6c](https://github.com/angular-fullstack/generator-angular-fullstack/commit/17fea6c))
+ * consolidate templates, convert html to pug during write ([f6deb25](https://github.com/angular-fullstack/generator-angular-fullstack/commit/f6deb25))
+ * generate js with jscodeshift instead of babel ([bf8f9fc](https://github.com/angular-fullstack/generator-angular-fullstack/commit/bf8f9fc))
+ * replace socket.io w/ primus + uws ([ccea1f3](https://github.com/angular-fullstack/generator-angular-fullstack/commit/ccea1f3))
+ * use new base classes ([3debe1c](https://github.com/angular-fullstack/generator-angular-fullstack/commit/3debe1c))
+
+
+
+
+## [4.2.3](https://github.com/angular-fullstack/generator-angular-fullstack/compare/4.2.2...v4.2.3) (2017-11-29)
+
+This version reverts using shrink-ray by default (for Brotli compression) b/c so many users have has issues installing it.
+
+
+### Bug Fixes
+
+* **seed:** rename index.html to app.html to fix CRSF and token issues ([2e784bf](https://github.com/angular-fullstack/generator-angular-fullstack/commit/2e784bf))
+* **server:auth:** specify digest for pbkdf2 ([689c3fc](https://github.com/angular-fullstack/generator-angular-fullstack/commit/689c3fc)), closes [#2628](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2628)
+
+
+
+
+## [4.2.2](https://github.com/angular-fullstack/generator-angular-fullstack/compare/4.2.0...v4.2.2) (2017-05-25)
+
+
+### Bug Fixes
+
+* **seed:** fix unexpected token ([65a2438](https://github.com/angular-fullstack/generator-angular-fullstack/commit/65a2438)), closes [#2580](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2580)
+
+
+
+
+## [4.2.1](https://github.com/angular-fullstack/generator-angular-fullstack/compare/4.2.0...v4.2.1) (2017-05-22)
+
+
+### Bug Fixes
+
+* **client:auth:** fix isAdmin call ([8ac8821](https://github.com/angular-fullstack/generator-angular-fullstack/commit/8ac8821)), closes [#2561](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2561)
+* **client:auth.service:** fix lodash import ([2dde95d](https://github.com/angular-fullstack/generator-angular-fullstack/commit/2dde95d)), closes [#2549](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2549)
+* **gen:** fix yarn check command ([9ea681c](https://github.com/angular-fullstack/generator-angular-fullstack/commit/9ea681c))
+
+
+
+
+# [4.2.0](https://github.com/angular-fullstack/generator-angular-fullstack/compare/4.1.4...v4.2.0) (2017-04-19)
+
+## Notable Changes
+
+* `node-inspector` has been taken out in favor of Node's integrated `--inspect` flag.
+* @benmarten has taken care of a lot of the lint issues we've seen polluting the console
+* @benmarten also enabled the use of [Yarn](https://yarnpkg.com) if you have it installed. Thanks Ben!
+* Various other fixes. See the [comparison](https://github.com/angular-fullstack/generator-angular-fullstack/compare/4.1.4...4.2.0) for the full list.
+
+### Bug Fixes
+
+* **angular-validation-match:** Integration with Babel & Typescript ([#2517](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2517)) ([9db9918](https://github.com/angular-fullstack/generator-angular-fullstack/commit/9db9918))
+
+
+
+
+## [4.1.4](https://github.com/angular-fullstack/generator-angular-fullstack/compare/4.1.2...v4.1.4) (2017-03-01)
+
+
+### Bug Fixes
+
+* **client:footer:**
+ * fix docs link (html) ([8d69c7a](https://github.com/angular-fullstack/generator-angular-fullstack/commit/8d69c7a)), closes [#2501](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2501)
+ * fix docs link (pug) ([190a121](https://github.com/angular-fullstack/generator-angular-fullstack/commit/190a121))
+* **events:** mongoose event registration ([e3ed67f](https://github.com/angular-fullstack/generator-angular-fullstack/commit/e3ed67f)), closes [#2479](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2479)
+* **webpack:**
+ * don't use html-plugin in test ([959c31c](https://github.com/angular-fullstack/generator-angular-fullstack/commit/959c31c)), closes [#2374](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2374)
+ * use raw-loader for pug files ([a212236](https://github.com/angular-fullstack/generator-angular-fullstack/commit/a212236))
+
+
+### Performance Improvements
+
+* **test:endpoint:**
+ * reduce number of eslint commands run ([6faa7f0](https://github.com/angular-fullstack/generator-angular-fullstack/commit/6faa7f0))
+ * remove unused imports ([95a5aab](https://github.com/angular-fullstack/generator-angular-fullstack/commit/95a5aab))
+* **test:main:** reduce number of app generations ([d42d0b6](https://github.com/angular-fullstack/generator-angular-fullstack/commit/d42d0b6))
+
+
+
+
+## [4.1.3](https://github.com/angular-fullstack/generator-angular-fullstack/compare/4.1.2...v4.1.3) (2017-02-11)
+
+
+### Bug Fixes
+
+* **events:** mongoose event registration ([e3ed67f](https://github.com/angular-fullstack/generator-angular-fullstack/commit/e3ed67f)), closes [#2479](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2479)
+* **webpack:** don't use html-plugin in test ([959c31c](https://github.com/angular-fullstack/generator-angular-fullstack/commit/959c31c)), closes [#2374](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2374)
+
+
+### Performance Improvements
+
+* **test:endpoint:**
+ * reduce number of eslint commands run ([6faa7f0](https://github.com/angular-fullstack/generator-angular-fullstack/commit/6faa7f0))
+ * remove unused imports ([95a5aab](https://github.com/angular-fullstack/generator-angular-fullstack/commit/95a5aab))
+* **test:main:** reduce number of app generations ([d42d0b6](https://github.com/angular-fullstack/generator-angular-fullstack/commit/d42d0b6))
+
+
+
+
+## [4.1.2](https://github.com/angular-fullstack/generator-angular-fullstack/compare/4.1.1...v4.1.2) (2017-01-09)
+
+
+### Bug Fixes
+
+* **css:** fix stylus-loader options ([641646c](https://github.com/angular-fullstack/generator-angular-fullstack/commit/641646c))
+* **eslint:** hides global variable warnings ([#2448](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2448)) ([6aae4f5](https://github.com/angular-fullstack/generator-angular-fullstack/commit/6aae4f5))
+* **sql:** Fix form field not displaying sequalize error ([d2cc15a](https://github.com/angular-fullstack/generator-angular-fullstack/commit/d2cc15a)), closes [#2400](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2400)
+* **webpack:css:** disable css-loader sourceMap option ([d48f0b0](https://github.com/angular-fullstack/generator-angular-fullstack/commit/d48f0b0)), closes [#2188](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2188)
+
+
+
+
+## [4.1.1](https://github.com/angular-fullstack/generator-angular-fullstack/compare/4.1.0...v4.1.1) (2016-12-08)
+
+
+## Notable Changes
+
+* Upgraded to Angular 1.6
+
+
+### Bug Fixes
+
+* **gen:factory:** fix factory subgen location ([b09cfe5](https://github.com/angular-fullstack/generator-angular-fullstack/commit/b09cfe5)), closes [#2381](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2381)
+
+
+
+
+# [4.1.0](https://github.com/angular-fullstack/generator-angular-fullstack/compare/4.0.5...v4.1.0) (2016-09-30)
+
+
+## Notable Changes
+
+* We've bumped some of the Babel deps to `^6.16.0`. This should fix the issues everyone's been seeing with class properties being stripped when using the default settings of Babel without Flow types.
+
+
+### Bug Fixes
+
+* **client:modal:** Fix unknown provider error ([68b7b69](https://github.com/angular-fullstack/generator-angular-fullstack/commit/68b7b69)), closes [#2247](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2247)
+
+
+### Features
+
+* **client:footer:**
+ * add documentation link ([ad44ee2](https://github.com/angular-fullstack/generator-angular-fullstack/commit/ad44ee2))
+ * modify footer ([3ca3cd5](https://github.com/angular-fullstack/generator-angular-fullstack/commit/3ca3cd5))
+* **gen:gulp:** port changelog code to gulp ([045abfb](https://github.com/angular-fullstack/generator-angular-fullstack/commit/045abfb))
+
+
+
+
+## [4.0.5](https://github.com/angular-fullstack/generator-angular-fullstack/compare/4.0.4...v4.0.5) (2016-09-15)
+
+
+### Bug Fixes
+
+* **client:auth:** fix hasOwnProperty instances, fix User usage ([#2232](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2232)) ([f41e420](https://github.com/angular-fullstack/generator-angular-fullstack/commit/f41e420)), closes [#2232](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2232) [#2212](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2212)
+* **client:oauthButtons:** add ngInject ([#2209](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2209)) ([9ce58e8](https://github.com/angular-fullstack/generator-angular-fullstack/commit/9ce58e8)), closes [#2206](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2206)
+* **endpoint:controller:** fix findOneAndUpdate syntax ([1c2a219](https://github.com/angular-fullstack/generator-angular-fullstack/commit/1c2a219)), closes [#2221](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2221)
+* **heroku:** Changed port variable to capital letters so heroku recognize it ([44dccba](https://github.com/angular-fullstack/generator-angular-fullstack/commit/44dccba)), closes [#2185](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2185)
+* **karma:** remove extra `require` ([c188229](https://github.com/angular-fullstack/generator-angular-fullstack/commit/c188229)), closes [#2219](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2219)
+* **server:twitter:** make sure IDs are strings ([5991a72](https://github.com/angular-fullstack/generator-angular-fullstack/commit/5991a72)), closes [#1997](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1997)
+* **socket:** add ngInject ([#2208](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2208)) ([b530695](https://github.com/angular-fullstack/generator-angular-fullstack/commit/b530695)), closes [#2203](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2203)
+
+
+
+
+## [4.0.4](https://github.com/angular-fullstack/generator-angular-fullstack/compare/4.0.3...v4.0.4) (2016-09-01)
+
+
+### Bug Fixes
+
+* **webpack:**
+ * conditionally exclude ui-bootstrap ([dd131d9](https://github.com/angular-fullstack/generator-angular-fullstack/commit/dd131d9))
+ * fix webpack vendor import ([#2177](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2177)) ([aa32054](https://github.com/angular-fullstack/generator-angular-fullstack/commit/aa32054)), closes [#2177](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2177)
+
+
+
+
+## [4.0.3](https://github.com/angular-fullstack/generator-angular-fullstack/compare/4.0.2...v4.0.3) (2016-09-01)
+
+
+### Bug Fixes
+
+* **gen:** fix doc img generation\n\nAdd gulp task to copy images to gh-pages ([5bb43be](https://github.com/angular-fullstack/generator-angular-fullstack/commit/5bb43be))
+* **gen:heroku:** fix module export, gen base ([8e50326](https://github.com/angular-fullstack/generator-angular-fullstack/commit/8e50326)), closes [#2148](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2148)
+* **webpack:** fix bootstrap-sass import path ([bae1c86](https://github.com/angular-fullstack/generator-angular-fullstack/commit/bae1c86))
+
+
+
+
+## [4.0.2](https://github.com/angular-fullstack/generator-angular-fullstack/compare/4.0.1...v4.0.2) (2016-09-01)
+
+
+### Bug Fixes
+
+* **client:socket.service:** import lodash named exports ([231e500](https://github.com/angular-fullstack/generator-angular-fullstack/commit/231e500))
+* **gulp:build:** remove protractor typings ([#2144](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2144)) ([b9abc58](https://github.com/angular-fullstack/generator-angular-fullstack/commit/b9abc58))
+
+
+### Features
+
+* **docs:** add daux.io docs ([f1e7a87](https://github.com/angular-fullstack/generator-angular-fullstack/commit/f1e7a87))
+* **gen:app:**
+ * add eslint to the yo write stream ([85921be](https://github.com/angular-fullstack/generator-angular-fullstack/commit/85921be)), closes [#2157](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2157)
+ * run eslint w/ fix on both client & server ([c5ab431](https://github.com/angular-fullstack/generator-angular-fullstack/commit/c5ab431))
+* **gen:gulp:** add TODO tasks in gulpfile. rm 2 old grunt tasks ([1e25de7](https://github.com/angular-fullstack/generator-angular-fullstack/commit/1e25de7))
+
+
+
+
+## [4.0.0](https://github.com/angular-fullstack/generator-angular-fullstack/compare/3.7.6...v4.0.0) (2016-08-08)
+
+
+## Notable Changes
+
+### [Webpack](http://webpack.github.io/)
+* No more Bower
+* Webpack is a Module Bundler for the front-end.
+* Everything starts in `client/app.js`. It imports (using CommonJS / ES2015 imports) everything else needed from there.
+* Whenever we create a new Angular 1 module, we export its name, and import that name in another module up the tree, all the way to `client/app.js`. This design pattern allows for easy lazy-loading.
+
+### Gulp v Grunt
+Grunt has been removed.
+* Gulp is significantly faster to run
+* Gulp focuses on programmatic configuration, which makes it a breeze to configure compared to Grunt's JSON-config-focused configuration.
+* Gulp development is much more active, with Gulp 4.0.0 hopefully being released soon.
+
+### ESLint
+JSHint + JSCS have been replaced with ESLint. ESLint provides a gigantic amount of rules, and is easily pluggable with many plugins. It uses Espree. Also, JSCS has merged with ESLint.
+
+### Types
+Flow support has been added. TypeScript type errors have been fixed.
+
+### Async/Sync Auth methods
+The following methods from the client Auth service have been split into two: `getCurrentUser`, `isLoggedIn`, `hasRole`, `isAdmin`. The reason that these methods could be both synchronous and asynchronous depending on how many arguments were passed is because they were called from Angular templates. Now, the Angular templates call the sync form of these methods (e.x. `getCurrentUserSync`), and the original functions are now only async.
+
+### Constants
+The task runner no longer takes care of creating an Angular module for config constants. It is taken care of by webpack now (the `shared.js` files is now just `require`d)
+
+### Endpoint PUT/PATCH
+PUT now defaults to an upsert. PATCH now actually does an HTTP PATCH.
+
+### -Livereload +Browsersync
+Livereload has been removed in favor of [Browsersync](https://www.browsersync.io/)
+
+
+
+
+# [3.8.0](https://github.com/angular-fullstack/generator-angular-fullstack/compare/3.7.6...v3.8.0) (2016-09-15)
+
+
+### Bug Fixes
+
+* **authorization:** header workaround for IE11 ([2362103](https://github.com/angular-fullstack/generator-angular-fullstack/commit/2362103)), closes [#2051](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2051)
+* **endpoint:controller:** wrap saveUpdates in an if(entity) statement ([31c0a79](https://github.com/angular-fullstack/generator-angular-fullstack/commit/31c0a79)), closes [#2052](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2052) [#2059](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2059)
+* **grunt:**
+ * add comma ([485c44b](https://github.com/angular-fullstack/generator-angular-fullstack/commit/485c44b))
+ * run express:prod on production port ([aac61b2](https://github.com/angular-fullstack/generator-angular-fullstack/commit/aac61b2)), closes [#1814](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1814)
+* **gulp:** fix plain css generation ([#2013](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2013)) ([54479fc](https://github.com/angular-fullstack/generator-angular-fullstack/commit/54479fc)), closes [#2013](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2013)
+* **gulpfile:** gulp-filter[@4](https://github.com/4).0.0 need "dot:true" option ([1fbf24b](https://github.com/angular-fullstack/generator-angular-fullstack/commit/1fbf24b)), closes [#2146](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2146) [#2151](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2151)
+* **server:** return express stuff ([81ea8fa](https://github.com/angular-fullstack/generator-angular-fullstack/commit/81ea8fa))
+
+
+### Features
+
+* **gen:** add configurable ports ([#2005](https://github.com/angular-fullstack/generator-angular-fullstack/issues/2005)) ([50e6d0c](https://github.com/angular-fullstack/generator-angular-fullstack/commit/50e6d0c))
+
+
+
+
+## [3.7.6](https://github.com/angular-fullstack/generator-angular-fullstack/compare/3.7.5...v3.7.6) (2016-06-21)
+
+
+### Notable Changes
+
+* Add deprecation warning about Grunt
+* Bumped a few generator dependencies
+
+
+
+## [3.7.5](https://github.com/angular-fullstack/generator-angular-fullstack/compare/3.7.4...v3.7.5) (2016-06-02)
+
+
+### Bug Fixes
+
+* **build:** fix templateCache generation on gulpfile ([#1936](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1936)) ([#1942](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1942)) ([0286817](https://github.com/angular-fullstack/generator-angular-fullstack/commit/0286817)), closes [#1936](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1936) [#1942](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1942) [#1936](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1936)
+
+
+### Features
+
+* **genBase:** show raw stdout for yo check ([#1944](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1944)) ([7ae3829](https://github.com/angular-fullstack/generator-angular-fullstack/commit/7ae3829))
+
+
+
+
+## [3.7.4](https://github.com/angular-fullstack/generator-angular-fullstack/compare/3.7.3...v3.7.4) (2016-05-25)
+
+
+### Bug Fixes
+
+* **build:** fix up PR 1896 ([3113a3e](https://github.com/angular-fullstack/generator-angular-fullstack/commit/3113a3e))
+* **ie:** IE11 log in works for ports 80 and 443 ([414b80a](https://github.com/angular-fullstack/generator-angular-fullstack/commit/414b80a)), closes [#1880](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1880) [#1896](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1896)
+
+
+
+
+## [3.7.2](https://github.com/angular-fullstack/generator-angular-fullstack/compare/3.7.1...v3.7.2) (2016-05-15)
+
+
+### Bug Fixes
+
+* **gen:app:** fix insight askPermission ([f6f1fb6](https://github.com/angular-fullstack/generator-angular-fullstack/commit/f6f1fb6)), closes [#1889](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1889)
+
+
+
+
+## [3.7.1](https://github.com/angular-fullstack/generator-angular-fullstack/compare/3.7.0...v3.7.1) (2016-05-15)
+
+
+### Bug Fixes
+
+* **gen:** move bluebird to dependencies ([7d87697](https://github.com/angular-fullstack/generator-angular-fullstack/commit/7d87697)), closes [#1888](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1888)
-#### Bug Fixes
+
+
+# [3.7.0](https://github.com/angular-fullstack/generator-angular-fullstack/compare/3.6.1...v3.7.0) (2016-05-15)
+
+
+### Notable Changes
+* The Angular component sub-generator from generator-ng-component was added
+* The generator no longer uses the babel require hook at runtime
+* The generator's template files are now passed through Babel at scaffold time. This allows for things like removing type annotations if the user so chooses.
+* TypeScript uses typings instead of tsd
+
+
+### Bug Fixes
+
+* **client:** remove no-empty from tslint.json ([eafc4e0](https://github.com/angular-fullstack/generator-angular-fullstack/commit/eafc4e0))
+* **client:navbar.controller:** refactor EJS, exclude constructor if empty ([a75b1d4](https://github.com/angular-fullstack/generator-angular-fullstack/commit/a75b1d4))
+* **e2e:main:** fix yeoman.png regex ([4b4db99](https://github.com/angular-fullstack/generator-angular-fullstack/commit/4b4db99))
+* **express:** import `connect-mongo/es5` if node < 4 ([63fb77f](https://github.com/angular-fullstack/generator-angular-fullstack/commit/63fb77f)), closes [#1844](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1844)
+* **gen:app:** only include `typings.json` with TS ([6f82220](https://github.com/angular-fullstack/generator-angular-fullstack/commit/6f82220))
+* **gen:endpoint:**
+ * return promise ([6b30ef7](https://github.com/angular-fullstack/generator-angular-fullstack/commit/6b30ef7))
+ * typo ([0787039](https://github.com/angular-fullstack/generator-angular-fullstack/commit/0787039))
+* **gen:grunt:** update paths ([104efc6](https://github.com/angular-fullstack/generator-angular-fullstack/commit/104efc6))
+* **gen:gulp:babel:** return the two merged streams ([3748953](https://github.com/angular-fullstack/generator-angular-fullstack/commit/3748953))
+* **gen:gulp:clean:** also clean test dir ([aedb37e](https://github.com/angular-fullstack/generator-angular-fullstack/commit/aedb37e))
+* **gen:gulp:updateFixtures:** fix saving as private/public ([a2cecab](https://github.com/angular-fullstack/generator-angular-fullstack/commit/a2cecab))
+* **gen:test:endpoint:** `jshint` function also checks that the file exists ([17d9985](https://github.com/angular-fullstack/generator-angular-fullstack/commit/17d9985))
+* **gen:test:main:** fix sql e2e ([a9d238c](https://github.com/angular-fullstack/generator-angular-fullstack/commit/a9d238c))
+* **grunt:** exclude jshint config if using TypeScript ([54d4ebd](https://github.com/angular-fullstack/generator-angular-fullstack/commit/54d4ebd))
+* **gulp:** fix racing condition for copy:constant ([f07b451](https://github.com/angular-fullstack/generator-angular-fullstack/commit/f07b451)), closes [#1830](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1830)
+* **package:**
+ * always make html2js a dependency ([bdf1e4a](https://github.com/angular-fullstack/generator-angular-fullstack/commit/bdf1e4a)), closes [#1722](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1722)
+ * grunt-injector 1.0.0 is broken ([3391299](https://github.com/angular-fullstack/generator-angular-fullstack/commit/3391299))
+ * include gulp devDependency ([c857b27](https://github.com/angular-fullstack/generator-angular-fullstack/commit/c857b27))
+* **server:**
+ * MONGOLAB_URI -> MONGODB_URI ([ae313df](https://github.com/angular-fullstack/generator-angular-fullstack/commit/ae313df)), closes [#1838](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1838)
+* **server:oauth:**
+ * fix mongoose validation when re-login using twitter oauth ([5f8805d](https://github.com/angular-fullstack/generator-angular-fullstack/commit/5f8805d))
+
+
+### Features
+
+* **client:auth:** add first type definition (`callback: Function`) ([7ed2585](https://github.com/angular-fullstack/generator-angular-fullstack/commit/7ed2585))
+* **gen:**
+ * add component generator ([bf649ab](https://github.com/angular-fullstack/generator-angular-fullstack/commit/bf649ab)), closes [#1711](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1711)
+ * also build test dir (just like generators dir) ([e09fb76](https://github.com/angular-fullstack/generator-angular-fullstack/commit/e09fb76))
+ * default to gulp, mocha ([4cc2da6](https://github.com/angular-fullstack/generator-angular-fullstack/commit/4cc2da6))
+* **gen:app:** run all client files through Babel & JS Beautifier ([1d4ce11](https://github.com/angular-fullstack/generator-angular-fullstack/commit/1d4ce11))
+* **gen:gulp:**
+ * add installFixtures task ([04a7878](https://github.com/angular-fullstack/generator-angular-fullstack/commit/04a7878))
+ * add mocha ([ead201a](https://github.com/angular-fullstack/generator-angular-fullstack/commit/ead201a))
+ * port updateFixtures to Gulp (hot damn is it faster :fire:) ([94d69da](https://github.com/angular-fullstack/generator-angular-fullstack/commit/94d69da))
+* **gen:test:**
+ * add endpoint path name test ([0b36375](https://github.com/angular-fullstack/generator-angular-fullstack/commit/0b36375))
+ * add endpoint-specific tests ([887476f](https://github.com/angular-fullstack/generator-angular-fullstack/commit/887476f))
+* **grunt:less:** add sourcemap options ([#1868](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1868)) ([55c9a18](https://github.com/angular-fullstack/generator-angular-fullstack/commit/55c9a18)), closes [#1765](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1765)
+* **gulp:ts:** inject client .ts test files automatically into config file. ([17cb4e4](https://github.com/angular-fullstack/generator-angular-fullstack/commit/17cb4e4)), closes [#1828](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1828)
+
+
+
+
+# [3.6.1](https://github.com/angular-fullstack/generator-angular-fullstack/compare/3.6.0...v3.6.1) (2016-04-23)
+
+
+### Bug Fixes
+
+* **package:** revert to Grunt 0.4.5 if user chooses Grunt ([1cc91a3](https://github.com/angular-fullstack/generator-angular-fullstack/commit/1cc91a3)), closes [#1815](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1815)
+
+
+
+
+# [3.6.0](https://github.com/angular-fullstack/generator-angular-fullstack/compare/3.5.0...v3.6.0) (2016-04-21)
+
+
+### Bug Fixes
+
+* **gen:heroku:** allow for grunt or gulp ([954baa4](https://github.com/angular-fullstack/generator-angular-fullstack/commit/954baa4))
+* **gen:openshift:** allow for grunt or gulp ([2f1a229](https://github.com/angular-fullstack/generator-angular-fullstack/commit/2f1a229))
+* **gulp:** build images before rev-replace ([4139694](https://github.com/angular-fullstack/generator-angular-fullstack/commit/4139694))
+* **gulp:copy:constant:** fix output dir ([a5e31cf](https://github.com/angular-fullstack/generator-angular-fullstack/commit/a5e31cf)), closes [#1748](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1748)
+* **gulp:inject:** prevent `'inject:css'` from showing up twice ([09b4f01](https://github.com/angular-fullstack/generator-angular-fullstack/commit/09b4f01))
+* **gulp:inject:css:** remove leading `/` ([6de6272](https://github.com/angular-fullstack/generator-angular-fullstack/commit/6de6272))
+* **gulp:jshint:** include jshint alongside gulp-jshint ([978f6ba](https://github.com/angular-fullstack/generator-angular-fullstack/commit/978f6ba))
+* **gulp:serve:**
+ * add `env:all` ([27531fb](https://github.com/angular-fullstack/generator-angular-fullstack/commit/27531fb)), closes [#1779](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1779)
+ * remove extra comma ([d9d9f62](https://github.com/angular-fullstack/generator-angular-fullstack/commit/d9d9f62))
+* **gulp:styles:** fix styles task for plain CSS ([dc72c33](https://github.com/angular-fullstack/generator-angular-fullstack/commit/dc72c33)), closes [#1747](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1747)
+* **gulp:test:client:** move around some `'tsd'` tasks ([86c7510](https://github.com/angular-fullstack/generator-angular-fullstack/commit/86c7510))
+* **gulp:wiredep:** copy `exclude` array code from Grunt ([2997e34](https://github.com/angular-fullstack/generator-angular-fullstack/commit/2997e34)), closes [#1739](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1739)
+* **livereload:** ignore api routes and specific non-html files ([c6a396b](https://github.com/angular-fullstack/generator-angular-fullstack/commit/c6a396b)), closes [#1636](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1636) [#1764](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1764)
+* **server:user:spec:** replace `context` with `describe` ([5716660](https://github.com/angular-fullstack/generator-angular-fullstack/commit/5716660))
+* **ts:**
+ * exclude ui-router.mock.ts from tsconfig.client.test.json if using ngroute ([3e40776](https://github.com/angular-fullstack/generator-angular-fullstack/commit/3e40776))
+ * fix typo of gulp's typescript test configuration file ([023b261](https://github.com/angular-fullstack/generator-angular-fullstack/commit/023b261))
+* **user:** fix email and password validation ([474a3a1](https://github.com/angular-fullstack/generator-angular-fullstack/commit/474a3a1))
+
+### Features
+
+* **GitHub:** add issue and PR templates ([79b1db7](https://github.com/angular-fullstack/generator-angular-fullstack/commit/79b1db7))
+* **gulp:**
+ * add serve:debug, add gulp-node-inspector ([f6eb26d](https://github.com/angular-fullstack/generator-angular-fullstack/commit/f6eb26d))
+ * port `grunt buildcontrol` tasks over to gulp ([3221678](https://github.com/angular-fullstack/generator-angular-fullstack/commit/3221678))
+
+
+
+
+## [3.5.0](https://github.com/angular-fullstack/generator-angular-fullstack/compare/3.4.2...v3.5.0) (2016-03-20)
+
+
+### Notable Changes
+
+A lot of various dependencies were updated
+
+
+### Bug Fixes
+
+* **gen:**
+ * import exec ([4f3f9dc](https://github.com/angular-fullstack/generator-angular-fullstack/commit/4f3f9dc))
+ * move some insight code ([7be23bd](https://github.com/angular-fullstack/generator-angular-fullstack/commit/7be23bd))
+ * shim determineAppname, use name argument if provided ([bdaeb5a](https://github.com/angular-fullstack/generator-angular-fullstack/commit/bdaeb5a)), closes [#1682](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1682)
+* **grunt:** update rev-ed images in css as well as js ([5a24b83](https://github.com/angular-fullstack/generator-angular-fullstack/commit/5a24b83)), closes [#977](https://github.com/angular-fullstack/generator-angular-fullstack/issues/977)
+* **grunt:filerev:** don't rev assets/fonts/ ([5228536](https://github.com/angular-fullstack/generator-angular-fullstack/commit/5228536))
+* **gulp:** add inject:tsconfig to inject task ([bb045c5](https://github.com/angular-fullstack/generator-angular-fullstack/commit/bb045c5))
+* **gulp:build:** exclude local.env.sample.js ([429d5f3](https://github.com/angular-fullstack/generator-angular-fullstack/commit/429d5f3)), closes [#1570](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1570)
+* **jshint:** capitalize MongoStore ([310cb22](https://github.com/angular-fullstack/generator-angular-fullstack/commit/310cb22))
+* **model:user:** add missing `return` statements ([f6ca289](https://github.com/angular-fullstack/generator-angular-fullstack/commit/f6ca289))
+
+
+## [3.4.2](https://github.com/angular-fullstack/generator-angular-fullstack/compare/3.4.1...v3.4.2) (2016-03-12)
+
+
+### Features
+
+* **gen:** add Insight stat tracker ([fdf35b3](https://github.com/angular-fullstack/generator-angular-fullstack/commit/fdf35b3))
+
+
+
+## [3.4.1](https://github.com/angular-fullstack/generator-angular-fullstack/compare/3.4.0...v3.4.1) (2016-03-11)
+
+
+### Bug Fixes
+
+* **gen:** shim determineAppname, use name argument if provided ([bdaeb5a](https://github.com/angular-fullstack/generator-angular-fullstack/commit/bdaeb5a)), closes [#1682](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1682)
+* **grunt:** update rev-ed images in css as well as js ([5a24b83](https://github.com/angular-fullstack/generator-angular-fullstack/commit/5a24b83)), closes [#977](https://github.com/angular-fullstack/generator-angular-fullstack/issues/977)
+* **grunt:filerev:** don't rev assets/fonts/ ([5228536](https://github.com/angular-fullstack/generator-angular-fullstack/commit/5228536))
+* **gulp:** add inject:tsconfig to inject task ([bb045c5](https://github.com/angular-fullstack/generator-angular-fullstack/commit/bb045c5))
+* **gulp:build:** exclude local.env.sample.js ([429d5f3](https://github.com/angular-fullstack/generator-angular-fullstack/commit/429d5f3)), closes [#1570](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1570)
+
+
+
+# [3.4.0](https://github.com/angular-fullstack/generator-angular-fullstack/compare/3.3.0...v3.4.0) (2016-03-09)
+
+
+### Notable Changes
+
+* Updated Angular to 1.5 (the main page now uses an Angular 1.5 component)
+* Updated generator-ng-component to ~0.2.1. Angular subgenerators will now generate ES6 code and TypeScript code.
+* Updated angular-bootstrap to ~1.1.2
+* Updated bluebird to ^3.3.3, and set mongoose to use bluebird instead of mpromise. This allows us to remove promisification of mongoose APIs.
+* Updated PhantomJS to ^2.1.4
+
+### Bug Fixes
+
+* **deps:**
+ * always include grunt-babel if grunt chosen ([7ba7d1f](https://github.com/angular-fullstack/generator-angular-fullstack/commit/7ba7d1f))
+ * include tslint ([543d784](https://github.com/angular-fullstack/generator-angular-fullstack/commit/543d784))
+* **gen:** fix Stylus & Sass extensions ([37d6c46](https://github.com/angular-fullstack/generator-angular-fullstack/commit/37d6c46)), closes [#1609](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1609)
+* **grunt:babel:** exclude local.env.sample.js ([3e0518b](https://github.com/angular-fullstack/generator-angular-fullstack/commit/3e0518b))
+* **grunt:injector:** sort js/ts modules ([fe6aba2](https://github.com/angular-fullstack/generator-angular-fullstack/commit/fe6aba2))
+* **gulp:** add inject:tsconfig, change script watcher ([978e07e](https://github.com/angular-fullstack/generator-angular-fullstack/commit/978e07e))
+* **gulp:build:**
+ * add copy:fonts task ([27f1cc8](https://github.com/angular-fullstack/generator-angular-fullstack/commit/27f1cc8))
+ * fix building when using Jade ([687cd09](https://github.com/angular-fullstack/generator-angular-fullstack/commit/687cd09))
+* **gulp:ts:** fix gulp not using latest typescript config after changed ([6a6afd9](https://github.com/angular-fullstack/generator-angular-fullstack/commit/6a6afd9))
+* **gulp:tslint:** exclude both typings and test_typings ([2e83bd1](https://github.com/angular-fullstack/generator-angular-fullstack/commit/2e83bd1))
+* **gulp:watch:** re-compile jade to .tmp ([18412a7](https://github.com/angular-fullstack/generator-angular-fullstack/commit/18412a7))
+* **server:oauth:** fix sequelize syntax ([221f7a4](https://github.com/angular-fullstack/generator-angular-fullstack/commit/221f7a4)), closes [#1654](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1654)
+* **tslint:** fix no-trailing-comma ([d7cd347](https://github.com/angular-fullstack/generator-angular-fullstack/commit/d7cd347))
+
+### Features
+
+* **gen:** add 'es6' to generator-ng-component filters ([65530b3](https://github.com/angular-fullstack/generator-angular-fullstack/commit/65530b3))
+
+
+
+# [3.3.0](https://github.com/angular-fullstack/generator-angular-fullstack/compare/3.2.0...v3.3.0) (2016-02-02)
+
+
+### Notable Changes
+
+* TypeScript support
+* Gulp support
+
+### Features
+
+* **client:** move navbar and footer directive usage to around the router view directive in index.html ([c429adb](https://github.com/angular-fullstack/generator-angular-fullstack/commit/c429adb))
+
+### Bug Fixes
+
+* **gulp:**
+ * make coverage tests work ([d3fd0c0](https://github.com/angular-fullstack/generator-angular-fullstack/commit/d3fd0c0))
+ * exclude constant file from lint:scripts:client ([103db11](https://github.com/angular-fullstack/generator-angular-fullstack/commit/103db11)), closes [#1587](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1587)
+* **grunt:**
+ * fix wrong tslint vs jshint ([15f60db](https://github.com/angular-fullstack/generator-angular-fullstack/commit/15f60db))
+ * exclude constant file from jshint:all ([f4e590f](https://github.com/angular-fullstack/generator-angular-fullstack/commit/f4e590f))
+ * **babel:** don't try to transpile JSON files ([885438f](https://github.com/angular-fullstack/generator-angular-fullstack/commit/885438f)), closes [#1561](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1561)
+ * **build:** don't copy local.env.sample ([be5a1f4](https://github.com/angular-fullstack/generator-angular-fullstack/commit/be5a1f4)), closes [#1570](https://github.com/angular-fullstack/generator-angular-fullstack/issues/1570)
+* **gen:test:** make sure we overwrite conflicts, add missing options from mock prompt options ([d6aeacf](https://github.com/angular-fullstack/generator-angular-fullstack/commit/d6aeacf))
+* **npm:** make sure to include mocha for server tests ([6c4e926](https://github.com/angular-fullstack/generator-angular-fullstack/commit/6c4e926))
+
+
+
+# [3.3.0-beta.0](https://github.com/DaftMonk/generator-angular-fullstack/compare/3.2.0...v3.3.0-beta.0) (2016-01-06)
+
+
+### Bug Fixes
+
+* **client:util.urlParse:** special treatment for IE ([869b45b](https://github.com/DaftMonk/generator-angular-fullstack/commit/869b45b))
+* **gulp:**
+ * **mocha:** have tests clean up once complete ([93dec12](https://github.com/DaftMonk/generator-angular-fullstack/commit/93dec12))
+ * **test:** fix gulp test dependencies ([7bc99fb](https://github.com/DaftMonk/generator-angular-fullstack/commit/7bc99fb))
+
+### Features
+
+* **client:** Add initial TypeScript support ([22d46d5](https://github.com/DaftMonk/generator-angular-fullstack/commit/22d46d5))
+
+
+
+# [3.2.0](https://github.com/DaftMonk/generator-angular-fullstack/compare/3.1.1...v3.2.0) (2016-01-03)
+
+
+### Features
+
+* **app**: fix .gitattributes ([6b17ef7](https://github.com/angular-fullstack/generator-angular-fullstack/commit/6b17ef719424cbe4025a7abb3bdc7466853f700c))
+* **gulp**
+ * add missing tasks ([4d0e2ba](https://github.com/angular-fullstack/generator-angular-fullstack/commit/4d0e2ba32ddaa8c0f4a9a78cbce362843b522894))
+ * update useref to latest version ([f21a388](https://github.com/angular-fullstack/generator-angular-fullstack/commit/f21a388f9e724b34cdd92f5a704782c2035e677d))
+ * add file revisioning for images ([3bf29b2](https://github.com/angular-fullstack/generator-angular-fullstack/commit/3bf29b27e4a3c61bc932af11dd3ea9a27c8fd48c))
+
+### Bug Fixes
+
+* **e2e**: force e2e tests to wait for angular ([842ab55](https://github.com/angular-fullstack/generator-angular-fullstack/commit/842ab558c721f114b27d9dae8d3b6e436db71af8))
+* **gen**: fix styleExt being `sass` instead of `scss` ([8f99a8f](https://github.com/angular-fullstack/generator-angular-fullstack/commit/8f99a8ffb89e2c98b06b025bcdeb2374c839e81f))
+* **gen**: set scriptExt, templateExt, & styleExt when re-using a .yo-rc.json ([6e59229](https://github.com/angular-fullstack/generator-angular-fullstack/commit/6e59229afde8c3590da9d8f83bdd96c556fadfd6))
+* **gulp:**
+ * inject angular modules before other scripts ([c0d5a14](https://github.com/angular-fullstack/generator-angular-fullstack/commit/c0d5a146fd18e9953ece8e180cfd4c33f8fac63f))
+ * clean .tmp folder in build task ([9596ba4](https://github.com/angular-fullstack/generator-angular-fullstack/commit/9596ba47a1e817605eb9ccdb600f4aa62d718e3f))
+ * add missing gulp-env package ([cf017de](https://github.com/angular-fullstack/generator-angular-fullstack/commit/cf017debb7f2715896bf93003b576a0242a270b5))
+ * get client tests working ([0cb4a4b](https://github.com/angular-fullstack/generator-angular-fullstack/commit/0cb4a4b9494a564508d6f2ec256374224465808b))
+ * use different transpile options for server and client ([bb67961](https://github.com/angular-fullstack/generator-angular-fullstack/commit/bb679618d6bca2d84b7bc8adf1886f0171a5d005))
+ * make sure tests and main app file are not injected ([0171112](https://github.com/angular-fullstack/generator-angular-fullstack/commit/017111297968f3fcfb604273fa37d162ad01a714))
+ * make sure `.htaccess` is copied on build ([3602406](https://github.com/angular-fullstack/generator-angular-fullstack/commit/3602406631d4f5e73d51bab6d11c1d975b25bd00))
+ * call `wiredep:test` before running tests ([103adb2](https://github.com/angular-fullstack/generator-angular-fullstack/commit/103adb2e19feda6bdb3487b3cde69afd12feb48d))
+ * **inject:css**: fix string that should be template string ([bb92502](https://github.com/angular-fullstack/generator-angular-fullstack/commit/bb92502593a27045a05d6d8789f54f05fa9125f5))
+
+
+## [3.1.1](https://github.com/DaftMonk/generator-angular-fullstack/compare/3.1.0...v3.1.1) (2015-12-15)
+
+
+### Bug Fixes
+
+* **client:auth.decorator**: fix Auth.isLoggedIn not having a noop arg ([0e9f302](https://github.com/angular-fullstack/generator-angular-fullstack/commit/0e9f3025fbe69c8613435e59d028cf6ce9b0e9e4))
+
+
+
+## [3.1.0](https://github.com/DaftMonk/generator-angular-fullstack/compare/3.0.2...v3.1.0) (2015-12-13)
+
+
+### Bug Fixes
+
+* **client:auth:** fix auth 'decorator' ([56d12fc](https://github.com/DaftMonk/generator-angular-fullstack/commit/56d12fc)), closes [#1492](https://github.com/DaftMonk/generator-angular-fullstack/issues/1492)
+* **gulp:**
+ * add babel runtime options ([0a9afa1](https://github.com/DaftMonk/generator-angular-fullstack/commit/0a9afa1))
+ * update gulp.src in build:client ([6f4d3b0](https://github.com/DaftMonk/generator-angular-fullstack/commit/6f4d3b0))
+* **navbar:** fix controller constructor with ng-route + auth ([4b59e1f](https://github.com/DaftMonk/generator-angular-fullstack/commit/4b59e1f)), closes [#1462](https://github.com/DaftMonk/generator-angular-fullstack/issues/1462)
+
+### Features
+
+* **admin:** spruce up the look of the user list ([38bb6b8](https://github.com/DaftMonk/generator-angular-fullstack/commit/38bb6b8))
+* **gulp:** add experimental Gulp support ([c70fd47](https://github.com/DaftMonk/generator-angular-fullstack/commit/c70fd47)) `yo angular-fullstack --gulp`
+
+
+
+## [3.0.2](https://github.com/DaftMonk/generator-angular-fullstack/compare/3.0.1...3.0.2) (2015-12-05)
+
+
+### Bug Fixes
+
+* **api:user:** remove `password` before sending user objects instead of `hashedPassword` ([c08bd95](https://github.com/DaftMonk/generator-angular-fullstack/commit/c08bd95)), closes [#1459](https://github.com/DaftMonk/generator-angular-fullstack/issues/1459)
+* **client:auth:** remove decorator logic ([3229acd](https://github.com/DaftMonk/generator-angular-fullstack/commit/3229acd)), closes [#1455](https://github.com/DaftMonk/generator-angular-fullstack/issues/1455)
+
+
+## [3.0.1](https://github.com/DaftMonk/generator-angular-fullstack/compare/3.0.0...3.0.1) (2015-12-04)
+
+
+This version just changes the recommended Node version to ^4.2.3, since it fixes some vulnerabilities. Also, the Travis-CI config has been changed to loosely test Node 5.1.1 instead of 5.0.0.
+
+
+
+# [3.0.0](https://github.com/DaftMonk/generator-angular-fullstack/compare/2.1.1...3.0.0) (2015-12-06)
+
+### New Features
+
+ * **Sequelize** - You can now choose between MongoDB + Mongoose or SQLite3 + Sequelize
+ * **Babel** - We now include Babel transpiler support, with plans to add TypeScript in the future
+ * **Lusca** - Lusca Security Middleware is included by default
+ * **Angular Modules** - A few components of the front-end have been broken out into their own Angular modules, such as `auth`, `admin`, and a new `util` module
+ * **Modern Angular Best-Practices** - We have moved a lot of the code to take advantage of the `controllerAs` syntax, as well as ES6/ES7 Classes
+ * Mongoose Bluebird Promises
+
+### Breaking Changes
+
+ * **Node >= 4.2.2** - We now support versions of Node 4.2.2 and up. Since this is a generator for scaffolding out a new project, it makes sense to move support to the 4.2.2 Long Term Support (LTS) version of Node, since it is the most supported release by Node. It is likely that the generator will work with earlier versions of Node, but it is not recommended.
+ * **~~CoffeeScript~~, ~~Vanilla JS~~** - Removed CoffeeScript and vanilla JS support. CoffeeScript has served its purpose and been replaced by much better transpilers. Vanilla JS doesn't provide a lot of the features that enable good, modern code. We now only support Babel 5.8.x, and plan to add TypeScript support in the future.
+ * Removed some backwards-compatibility support code
+
+To see the full list of changes, click the '3.0.0' title to view the GitHub compare between 3.0.0 and 2.1.1
+
+
+## [2.1.1](https://github.com/DaftMonk/generator-angular-fullstack/compare/2.1.0...2.1.1) (2015-07-29)
+
+
+### Bug Fixes
* **app:**
- * `things` made a little bit more responsive ([58aa7a48](http://github.com/DaftMonk/generator-angular-fullstack/commit/58aa7a489ae28c22be59b3a61db027ccf2f1ae46))
-* **dependencies:** change ngmin to ng-annotate ([dd023fa5](http://github.com/DaftMonk/generator-angular-fullstack/commit/dd023fa5fd90b8b541b8cc60c87186ee619e4844))
-* **bootstrap:** removed styles breaking responsiveness for high-res screens ([053fedb8](http://github.com/DaftMonk/generator-angular-fullstack/commit/053fedb89f64294a55538ad9b806b2d7de4d1c7f))
-* **socketio:** fallback for servers where `socket.handshake.address` is not provided ([f6a19348](http://github.com/DaftMonk/generator-angular-fullstack/commit/f6a19348ad404aa72c31eef8dc84aac8db0e904a))
-* **stylus:** remove bootstrap css import in stylus when bootstrap is not selected ([f7c3d0ad](http://github.com/DaftMonk/generator-angular-fullstack/commit/f7c3d0ad41da5f0072c2cf64ff5c9a894052d194), closes [#368](http://github.com/DaftMonk/generator-angular-fullstack/issues/368))
+ * correct grunt clean glob ([8e8ae96](https://github.com/DaftMonk/generator-angular-fullstack/commit/8e8ae96))
+ * ensure all files end with a newline ([8511260](https://github.com/DaftMonk/generator-angular-fullstack/commit/8511260))
+ * fix folder depth in rev and usemin globs ([18f8d31](https://github.com/DaftMonk/generator-angular-fullstack/commit/18f8d31))
+ * update sequelize syntax in seed.js ([a9372a1](https://github.com/DaftMonk/generator-angular-fullstack/commit/a9372a1))
+ * use 0.0.0.0 for default IP ([2cd1c24](https://github.com/DaftMonk/generator-angular-fullstack/commit/2cd1c24)), closes [DaftMonk/generator-angular-fullstack#1071](https://github.com/DaftMonk/generator-angular-fullstack/issues/1071)
+* **app:test:** include `client/components` in babel preprocessing ([6b575d1](https://github.com/DaftMonk/generator-angular-fullstack/commit/6b575d1)), closes [DaftMonk/generator-angular-fullstack#1081](https://github.com/DaftMonk/generator-angular-fullstack/issues/1081)
+* **build:** exclued `bower_components` from the grunt rev and usemin blocks ([7ae43ae](https://github.com/DaftMonk/generator-angular-fullstack/commit/7ae43ae)), closes [#522](https://github.com/DaftMonk/generator-angular-fullstack/issues/522)
+* **test:**
+ * update protractor test for angular 1.4 ([f5acad0](https://github.com/DaftMonk/generator-angular-fullstack/commit/f5acad0))
+ * use proper controlFlow in protractor tests ([8dce663](https://github.com/DaftMonk/generator-angular-fullstack/commit/8dce663))
+
+### Features
+* **app:**
+ * improve `Gruntfile.js` file globbing ([5874dfd](https://github.com/DaftMonk/generator-angular-fullstack/commit/5874dfd))
+ * merge H5BP updates to index.html ([4a88551](https://github.com/DaftMonk/generator-angular-fullstack/commit/4a88551))
+ * watch integration tests for changes ([a81aeb1](https://github.com/DaftMonk/generator-angular-fullstack/commit/a81aeb1))
+* **build:** switch to grunt-filerev ([cd28298](https://github.com/DaftMonk/generator-angular-fullstack/commit/cd28298))
+* **test:** add jasmine-spec-reporter ([f34e8f3](https://github.com/DaftMonk/generator-angular-fullstack/commit/f34e8f3))
-#### Features
-* **oauth:** remove code according to user prompts ([316bd9dd](http://github.com/DaftMonk/generator-angular-fullstack/commit/316bd9dd3632622b0fb434cacfc4150f01d18e4c))
-
-### v2.0.5 (2014-07-17)
+
+# [2.1.0](https://github.com/DaftMonk/generator-angular-fullstack/compare/v2.0.13...2.1.0) (2015-07-15)
-#### Bug Fixes
-* **account:** add authentication requirement for settings view ([9105c0fd](http://github.com/DaftMonk/generator-angular-fullstack/commit/9105c0fdbabdbde68fb6cf0fe0d6993ead6e7095), closes [#327](http://github.com/DaftMonk/generator-angular-fullstack/issues/327))
-* **app:**
- * use correct path for font awesome and glyphicons ([1917ba31](http://github.com/DaftMonk/generator-angular-fullstack/commit/1917ba31264fc90bea0fce36b8d144f897e8bf08))
- * wait for currentUser to resolve before checking if logged in on route changes ([6d6090d9](http://github.com/DaftMonk/generator-angular-fullstack/commit/6d6090d9c4dcd5d8a1f6ecb2cf5dc0bb4c8598fe))
- * bootstrap glyphicons not correctly linked on grunt build ([53d193d0](http://github.com/DaftMonk/generator-angular-fullstack/commit/53d193d011c7c1ea8c9477e8f17ad56cc4214362))
-* **dependencies:** include certain dependencies only when answering yes to their respective prompts ([040c57de](http://github.com/DaftMonk/generator-angular-fullstack/commit/040c57de8689f2e0fc35410d0b6935363aaa8458))
-* **server:**
- * fix seeding of db in test mode causing tests to randomly fail ([05f7f433](http://github.com/DaftMonk/generator-angular-fullstack/commit/05f7f43372bc3bd54bead811952b775adeec1f05))
- * make user tests run more consistently ([addb5061](http://github.com/DaftMonk/generator-angular-fullstack/commit/addb5061f62696c7a0078a8d2c7443d428e69376))
- * warnings that express was using deprecated features ([8dc2f1e4](http://github.com/DaftMonk/generator-angular-fullstack/commit/8dc2f1e48503c27cbd2aac3c455adac7781a6539))
- * missing `res` param for handleError ([eb7d50c8](http://github.com/DaftMonk/generator-angular-fullstack/commit/eb7d50c8d27820a6b26caf2a1aaa0e4fa8eee367))
+### Bug Fixes
-#### Features
+* **app:** missing event.preventDefault ([c90d762](https://github.com/DaftMonk/generator-angular-fullstack/commit/c90d762))
+* **app-logout:** add blank templates to logout route/state ([650d244](https://github.com/DaftMonk/generator-angular-fullstack/commit/650d244)), closes [#570](https://github.com/DaftMonk/generator-angular-fullstack/issues/570)
+* **app-signup:** switch button classes ([5898e0c](https://github.com/DaftMonk/generator-angular-fullstack/commit/5898e0c))
+* **demo:** include bootstrap in demo ([19e2133](https://github.com/DaftMonk/generator-angular-fullstack/commit/19e2133))
+* **deps:** use angular ~1.2 before migrated to 1.3 ([6a196e2](https://github.com/DaftMonk/generator-angular-fullstack/commit/6a196e2)), closes [#654](https://github.com/DaftMonk/generator-angular-fullstack/issues/654)
+* **endpoint:**
+ * fully support sequelize models ([df82d17](https://github.com/DaftMonk/generator-angular-fullstack/commit/df82d17))
+ * refactor handleError for promise use ([0af7c3e](https://github.com/DaftMonk/generator-angular-fullstack/commit/0af7c3e))
+* **endpoint:thing:** use Express 4 syntax ([c7b48a5](https://github.com/DaftMonk/generator-angular-fullstack/commit/c7b48a5))
+* **endpoint:user:** refactor validationError for promise use ([c98cb5d](https://github.com/DaftMonk/generator-angular-fullstack/commit/c98cb5d))
+* **express:** support new options of updated connect-mongo ([727d661](https://github.com/DaftMonk/generator-angular-fullstack/commit/727d661))
+* **gen:**
+ * camelCase endpoint name when used in variable name ([7362080](https://github.com/DaftMonk/generator-angular-fullstack/commit/7362080)), closes [#540](https://github.com/DaftMonk/generator-angular-fullstack/issues/540)
+ * Check that answers.odms exists ([342606c](https://github.com/DaftMonk/generator-angular-fullstack/commit/342606c))
+ * filter `client/components/socket` js files ([49d5bbd](https://github.com/DaftMonk/generator-angular-fullstack/commit/49d5bbd)), closes [#530](https://github.com/DaftMonk/generator-angular-fullstack/issues/530)
+* **gen:build:** Adds missing slash ([bb4d92e](https://github.com/DaftMonk/generator-angular-fullstack/commit/bb4d92e))
+* **gen:endpoint:** Fix JSCS stuff and use Express 4 syntax ([1bcffd6](https://github.com/DaftMonk/generator-angular-fullstack/commit/1bcffd6))
+* **git:** Remove old text=auto ([e0350cc](https://github.com/DaftMonk/generator-angular-fullstack/commit/e0350cc))
+* **jshint:** Removed 'regexp' from server and client jshintrc (I couldn't find it in the docs ([e02f094](https://github.com/DaftMonk/generator-angular-fullstack/commit/e02f094))
+* **model:** fix update bugs with mongoose and sequelize ([1805975](https://github.com/DaftMonk/generator-angular-fullstack/commit/1805975))
+* **npm:** Remove git diff comment ([349b6d3](https://github.com/DaftMonk/generator-angular-fullstack/commit/349b6d3))
+* **oauth:**
+ * Facebook API updated ([f6e7a12](https://github.com/DaftMonk/generator-angular-fullstack/commit/f6e7a12))
+ * Google scopes deprecated ([136f15e](https://github.com/DaftMonk/generator-angular-fullstack/commit/136f15e))
+* return a 404 when no user is found fixes #711 ([38c0d7c](https://github.com/DaftMonk/generator-angular-fullstack/commit/38c0d7c)), closes [#711](https://github.com/DaftMonk/generator-angular-fullstack/issues/711)
+* **openshift:** fix processing of rhc app show output ([dedf46c](https://github.com/DaftMonk/generator-angular-fullstack/commit/dedf46c))
+* **server:** server should launch in dev mode if production env var is not specified ([9cdcc90](https://github.com/DaftMonk/generator-angular-fullstack/commit/9cdcc90)), closes [#590](https://github.com/DaftMonk/generator-angular-fullstack/issues/590)
+* **server-tests:** `test:coverage` task ([5198685](https://github.com/DaftMonk/generator-angular-fullstack/commit/5198685))
+* **test:**
+ * change `protractor.getInstance` to `browser` ([c7f6c36](https://github.com/DaftMonk/generator-angular-fullstack/commit/c7f6c36))
+ * remove package.json and bower.json ([0ec2e18](https://github.com/DaftMonk/generator-angular-fullstack/commit/0ec2e18))
+ * update sequelize destroy usage ([8df9992](https://github.com/DaftMonk/generator-angular-fullstack/commit/8df9992))
+* **travis:**
+ * Add nodejs 12 to travis.yml ([acecde9](https://github.com/DaftMonk/generator-angular-fullstack/commit/acecde9))
+ * remove node v0.11 from testing ([dae69cf](https://github.com/DaftMonk/generator-angular-fullstack/commit/dae69cf))
+ * Remove unicode stuff from file creation test expectations, and add nodejs 0.12 t ([bf9a973](https://github.com/DaftMonk/generator-angular-fullstack/commit/bf9a973))
+
+### Features
* **app:**
- * added oath buttons to signup page ([a408f58e](http://github.com/DaftMonk/generator-angular-fullstack/commit/a408f58edb923cd14bf7c7b3411b874dce5f0724))
- * upgrade socket.io to use v1.0.6
-* **gen:**
- * add option for Stylus as a preprocessor ([1b90c448](http://github.com/DaftMonk/generator-angular-fullstack/commit/1b90c448fbf374287fe07f782f9788dfb9a23613))
- * make bootstrap and bootstrap ui optional ([f50d0942](http://github.com/DaftMonk/generator-angular-fullstack/commit/f50d094226fdbf6a7e65ba3783a26efc8544ba08))
+ * add grunt jscs task for maintaining consistent code style ([8a1a245](https://github.com/DaftMonk/generator-angular-fullstack/commit/8a1a245))
+ * add mongodb error handling to quit app if unable to connect with mongodb server ([31bee73](https://github.com/DaftMonk/generator-angular-fullstack/commit/31bee73))
+ * additional app generator option for ES6 preprocessing using babel ([bc03aba](https://github.com/DaftMonk/generator-angular-fullstack/commit/bc03aba))
+ * additional app generator option for ES6 preprocessing using babel ([cbb06a4](https://github.com/DaftMonk/generator-angular-fullstack/commit/cbb06a4))
+ * implement footer as directive ([cf298a7](https://github.com/DaftMonk/generator-angular-fullstack/commit/cf298a7))
+ * implement navbar as directive ([24171aa](https://github.com/DaftMonk/generator-angular-fullstack/commit/24171aa))
+* **app-auth:** Improve client-side Auth service ([65d03fc](https://github.com/DaftMonk/generator-angular-fullstack/commit/65d03fc)), closes [#456](https://github.com/DaftMonk/generator-angular-fullstack/issues/456)
+* **app-routing:** improve app routing ([6aadee6](https://github.com/DaftMonk/generator-angular-fullstack/commit/6aadee6)), closes [#331](https://github.com/DaftMonk/generator-angular-fullstack/issues/331)
+* **build:** add gitter webhook for travis ([6b88efd](https://github.com/DaftMonk/generator-angular-fullstack/commit/6b88efd))
+* **gen:**
+ * add README.md ([f07b09c](https://github.com/DaftMonk/generator-angular-fullstack/commit/f07b09c))
+ * Remove global jQuery dependency ([a9230ca](https://github.com/DaftMonk/generator-angular-fullstack/commit/a9230ca)), closes [#547](https://github.com/DaftMonk/generator-angular-fullstack/issues/547)
+ * unify testing framework ([654de87](https://github.com/DaftMonk/generator-angular-fullstack/commit/654de87))
+ * use common endpoint templates for thing route ([6dc8130](https://github.com/DaftMonk/generator-angular-fullstack/commit/6dc8130))
+* **generator:** use sauce labs for running e2e tests with travis CI ([50ca41d](https://github.com/DaftMonk/generator-angular-fullstack/commit/50ca41d)), closes [#572](https://github.com/DaftMonk/generator-angular-fullstack/issues/572)
+* **model:** abstract model events to a standard EventEmitter ([91657d7](https://github.com/DaftMonk/generator-angular-fullstack/commit/91657d7)), closes [#857](https://github.com/DaftMonk/generator-angular-fullstack/issues/857) [#490](https://github.com/DaftMonk/generator-angular-fullstack/issues/490)
+* **readme:** add david-dm badge & move badges to new line ([f8f32f4](https://github.com/DaftMonk/generator-angular-fullstack/commit/f8f32f4))
+* **server:**
+ * add support for sequelize ([943120e](https://github.com/DaftMonk/generator-angular-fullstack/commit/943120e)), closes [#414](https://github.com/DaftMonk/generator-angular-fullstack/issues/414)
+ * implement server-side ES6 via babel ([60334a8](https://github.com/DaftMonk/generator-angular-fullstack/commit/60334a8))
+* **server-tests:** code coverage and e2e ([dbbaa20](https://github.com/DaftMonk/generator-angular-fullstack/commit/dbbaa20))
+* **travis-ci:** enable container builds and caching ([00317a8](https://github.com/DaftMonk/generator-angular-fullstack/commit/00317a8))
-
-### v2.0.4 (2014-07-08)
-#### Bug Fixes
+
+## [2.0.13](https://github.com/DaftMonk/generator-angular-fullstack/compare/v2.0.12...v2.0.13) (2014-08-29)
-* **app:** fix dependency injection minsafe problem in auth service coffeescript. ([03742a80](http://github.com/DaftMonk/generator-angular-fullstack/commit/03742a8000f19efdf14791ff1aae52a90e86c149))
-* **gen:** heroku and openshift generators requiring .yo-rc file to work ([88ebfc8c](http://github.com/DaftMonk/generator-angular-fullstack/commit/88ebfc8c835ac6ec04b6d42fcf9357cfb0bcc47d))
-
-### v2.0.3 (2014-07-04)
+### Bug Fixes
+* **gen:**
+ * fix build when not selecting socket.io ([fdf063c](https://github.com/DaftMonk/generator-angular-fullstack/commit/fdf063c))
+ * use bool for bootstrap filters ([a5decbc](https://github.com/DaftMonk/generator-angular-fullstack/commit/a5decbc)), closes [#496](https://github.com/DaftMonk/generator-angular-fullstack/issues/496)
-#### Bug Fixes
+### Features
-* **server:** only enable sessions if twitter oauth was selected ([bcd00dc0](http://github.com/DaftMonk/generator-angular-fullstack/commit/bcd00dc02d270486adafe6dbf973a4ec25499a5e))
+* **auth:** make crypto async ([6aecdf7](https://github.com/DaftMonk/generator-angular-fullstack/commit/6aecdf7))
-
-### v2.0.2 (2014-07-02)
-#### Bug Fixes
-* **gen:endpoint**
- * fix endpoint spec not properly adjusting to users route url
- * fix some valid route urls causing failing tests
+
+## [2.0.11](https://github.com/DaftMonk/generator-angular-fullstack/compare/v2.0.10...v2.0.11) (2014-08-26)
+
+
+### Bug Fixes
+
+* **app-config:** Use parentheses to fix string concat in config ([c6a50ce](https://github.com/DaftMonk/generator-angular-fullstack/commit/c6a50ce)), closes [#466](https://github.com/DaftMonk/generator-angular-fullstack/issues/466)
+* **app-jshint:** improve jshint usage ([35fcf49](https://github.com/DaftMonk/generator-angular-fullstack/commit/35fcf49)), closes [#463](https://github.com/DaftMonk/generator-angular-fullstack/issues/463) [#486](https://github.com/DaftMonk/generator-angular-fullstack/issues/486)
+* **gen:** use more restrictive version range for ng-component ([1969897](https://github.com/DaftMonk/generator-angular-fullstack/commit/1969897))
+
+### Features
+
+* **app-socket.io:** build socket.io into vendor.js ([06f2e46](https://github.com/DaftMonk/generator-angular-fullstack/commit/06f2e46))
+* **docs:** Inform users/developers of the `canary` branch ([7469362](https://github.com/DaftMonk/generator-angular-fullstack/commit/7469362))
+* **gen:** make generator tests faster, and easier to run ([84acb74](https://github.com/DaftMonk/generator-angular-fullstack/commit/84acb74))
+* **gen-travis:** add additional node version to travis.yml ([e4f00b0](https://github.com/DaftMonk/generator-angular-fullstack/commit/e4f00b0))
+
+
+
+
+## [2.0.10](https://github.com/DaftMonk/generator-angular-fullstack/compare/v2.0.9...v2.0.10) (2014-08-16)
+
+
+### Bug Fixes
+
+* **server:** undefined domain env variable causing issues ([cb683dd](https://github.com/DaftMonk/generator-angular-fullstack/commit/cb683dd))
+
+
+
+
+## [2.0.9](https://github.com/DaftMonk/generator-angular-fullstack/compare/v2.0.8...v2.0.9) (2014-08-16)
+
+
+### Bug Fixes
+
+* **app:**
+ * add .idea folder to gitignore ([2e1f118](https://github.com/DaftMonk/generator-angular-fullstack/commit/2e1f118))
+ * save the version of the generator that was used ([2b76b17](https://github.com/DaftMonk/generator-angular-fullstack/commit/2b76b17))
+* **app:api:user:** Missing user response code ([c176660](https://github.com/DaftMonk/generator-angular-fullstack/commit/c176660)), closes [#438](https://github.com/DaftMonk/generator-angular-fullstack/issues/438)
+* **gen:app:socket:** use `''` instead `null` as URL to open ioSocket ([0f0d0fd](https://github.com/DaftMonk/generator-angular-fullstack/commit/0f0d0fd))
+* **gruntfile:** incorrect path to index.html for cdnify ([0ad646c](https://github.com/DaftMonk/generator-angular-fullstack/commit/0ad646c))
+* **openshift:** fix issues with openshift deployment ([ace0723](https://github.com/DaftMonk/generator-angular-fullstack/commit/ace0723))
+
+### Features
+
+* **gen:** add automatic demo releases with grunt task ([4485223](https://github.com/DaftMonk/generator-angular-fullstack/commit/4485223))
+* **server:** add sample env config file that can be tracked by git ([c9f80bc](https://github.com/DaftMonk/generator-angular-fullstack/commit/c9f80bc))
+* **uibootstrap-modal:** add basic modal service and template when using uibootstrap ([7c14bed](https://github.com/DaftMonk/generator-angular-fullstack/commit/7c14bed))
+
+
+
+
+## [2.0.8](https://github.com/DaftMonk/generator-angular-fullstack/compare/v2.0.7...v2.0.8) (2014-07-31)
+
+
+### Bug Fixes
+
+* **coffee:** update socket service to match javascript version ([c27cefe](https://github.com/DaftMonk/generator-angular-fullstack/commit/c27cefe))
+* **gen:** Fixed missing `oauth` property in `.yo-rc.json` after 2.0.5 update ([11d324b](https://github.com/DaftMonk/generator-angular-fullstack/commit/11d324b))
+* **travis:** install sass gem if sass is enabled ([ceeac27](https://github.com/DaftMonk/generator-angular-fullstack/commit/ceeac27))
+* **twitter:** revert mongoose connection change ([8675a00](https://github.com/DaftMonk/generator-angular-fullstack/commit/8675a00))
+
+### Features
+
+* **user-management:** use the User $resource to populate users for the admin page ([708f072](https://github.com/DaftMonk/generator-angular-fullstack/commit/708f072))
+
+
+
+
+## [2.0.7](https://github.com/DaftMonk/generator-angular-fullstack/compare/v2.0.6...v2.0.7) (2014-07-28)
+
+
+### Bug Fixes
+
+* **gruntfile:** grunt tasks should run if no local config exists ([422d6bc](https://github.com/DaftMonk/generator-angular-fullstack/commit/422d6bc))
+* **server:** fix setting TTL index on collection : sessions error ([0581ed0](https://github.com/DaftMonk/generator-angular-fullstack/commit/0581ed0))
+
+
+
+
+## [2.0.6](https://github.com/DaftMonk/generator-angular-fullstack/compare/v2.0.5...v2.0.6) (2014-07-27)
+
+
+### Bug Fixes
+
+* **app-dependency:** change ngmin to ng-annotate ([dd023fa](https://github.com/DaftMonk/generator-angular-fullstack/commit/dd023fa))
+* **bootstrap:** removed styles breaking responsiveness for high-res screens ([053fedb](https://github.com/DaftMonk/generator-angular-fullstack/commit/053fedb))
+* **responsive:** `things` made a little bit more responsive ([58aa7a4](https://github.com/DaftMonk/generator-angular-fullstack/commit/58aa7a4))
+* **socketio:** fallback for servers where `socket.handshake.address` is not provided ([f6a1934](https://github.com/DaftMonk/generator-angular-fullstack/commit/f6a1934))
+* **stylus:** remove bootstrap css import in stylus when bootstrap is not selected ([f7c3d0a](https://github.com/DaftMonk/generator-angular-fullstack/commit/f7c3d0a)), closes [#368](https://github.com/DaftMonk/generator-angular-fullstack/issues/368)
+
+### Features
+
+* **heroku:** provide prompt to set the deployment region ([13cd5e7](https://github.com/DaftMonk/generator-angular-fullstack/commit/13cd5e7))
+* **oauth:** multiple strategies per account; changeable email ([ef06272](https://github.com/DaftMonk/generator-angular-fullstack/commit/ef06272))
+
+
+
+
+## [2.0.5](https://github.com/DaftMonk/generator-angular-fullstack/compare/v2.0.4...v2.0.5) (2014-07-18)
+
+
+### Bug Fixes
+
+* **account:** add authentication requirement for settings view ([9105c0f](https://github.com/DaftMonk/generator-angular-fullstack/commit/9105c0f)), closes [#327](https://github.com/DaftMonk/generator-angular-fullstack/issues/327)
+* **app:**
+ * bootstrap glyphicons not correctly linked on grunt build ([53d193d](https://github.com/DaftMonk/generator-angular-fullstack/commit/53d193d)), closes [#333](https://github.com/DaftMonk/generator-angular-fullstack/issues/333)
+ * wait for currentUser to resolve before checking if logged in on route changes ([6d6090d](https://github.com/DaftMonk/generator-angular-fullstack/commit/6d6090d)), closes [#306](https://github.com/DaftMonk/generator-angular-fullstack/issues/306) [#294](https://github.com/DaftMonk/generator-angular-fullstack/issues/294)
+* **app:server:thing.controller:** missing `res` param for handleError added ([eb7d50c](https://github.com/DaftMonk/generator-angular-fullstack/commit/eb7d50c))
+* **app:styles:** use correct path for font awesome and glyphicons ([1917ba3](https://github.com/DaftMonk/generator-angular-fullstack/commit/1917ba3))
+* **dependencies:** include certain dependencies only when answering yes to their respective prompts ([040c57d](https://github.com/DaftMonk/generator-angular-fullstack/commit/040c57d))
+* **server:**
+ * fix seeding of db in test mode causing tests to randomly fail ([05f7f43](https://github.com/DaftMonk/generator-angular-fullstack/commit/05f7f43)), closes [#352](https://github.com/DaftMonk/generator-angular-fullstack/issues/352)
+ * make user tests run more consistently ([addb506](https://github.com/DaftMonk/generator-angular-fullstack/commit/addb506)), closes [#346](https://github.com/DaftMonk/generator-angular-fullstack/issues/346)
+
+### Features
+
+* **app:** added oath buttons to signup page ([a408f58](https://github.com/DaftMonk/generator-angular-fullstack/commit/a408f58))
+* **gen:**
+ * Generate CSS from Stylus ([1b90c44](https://github.com/DaftMonk/generator-angular-fullstack/commit/1b90c44))
+ * Generate CSS from Stylus ([9d87a2c](https://github.com/DaftMonk/generator-angular-fullstack/commit/9d87a2c))
+* **oauth:** remove code according to user prompts ([316bd9d](https://github.com/DaftMonk/generator-angular-fullstack/commit/316bd9d))
+
+
+
+
+## [2.0.4](https://github.com/DaftMonk/generator-angular-fullstack/compare/v2.0.3...v2.0.4) (2014-07-09)
+
+
+### Bug Fixes
+
+* **app:** fix dependency injection minsafe problem in auth service ([03742a8](https://github.com/DaftMonk/generator-angular-fullstack/commit/03742a8))
+* **gen:** heroku and openshift generators requiring .yo-rc file to work ([88ebfc8](https://github.com/DaftMonk/generator-angular-fullstack/commit/88ebfc8)), closes [#318](https://github.com/DaftMonk/generator-angular-fullstack/issues/318)
+
+
+
+
+## [2.0.3](https://github.com/DaftMonk/generator-angular-fullstack/compare/v2.0.2...v2.0.3) (2014-07-04)
+
+
+### Bug Fixes
+
+* **server:** only enable sessions if twitter oauth was selected ([bcd00dc](https://github.com/DaftMonk/generator-angular-fullstack/commit/bcd00dc))
+
+### Features
+
+* **gen:** make bootstrap and bootstrap ui optional ([f50d094](https://github.com/DaftMonk/generator-angular-fullstack/commit/f50d094))
+
+
+
+
+## [2.0.2](https://github.com/DaftMonk/generator-angular-fullstack/compare/v2.0.1...v2.0.2) (2014-07-03)
+
+
+### Bug Fixes
+
+* **gen:endpoint:**
+ * fix endpoint spec not adjusting from route url ([163cacf](https://github.com/DaftMonk/generator-angular-fullstack/commit/163cacf)), closes [#298](https://github.com/DaftMonk/generator-angular-fullstack/issues/298)
+ * fix some urls failing for api creation ([3fe80bd](https://github.com/DaftMonk/generator-angular-fullstack/commit/3fe80bd))
+
+
+
+
+## [2.0.1](https://github.com/DaftMonk/generator-angular-fullstack/compare/v2.0.0...v2.0.1) (2014-07-02)
+
+
+### Bug Fixes
+
+* **server:** local env not being copied ([f65b393](https://github.com/DaftMonk/generator-angular-fullstack/commit/f65b393))
+
+
## v2.0.0 (2014-07-02)
@@ -549,4 +1506,4 @@ Closes #18, #17
#### Features
-* **gen:** include MongoDB as an option When selected, sets up database with Mongoose. Repl ([280cc84d](http://github.com/DaftMonk/generator-angular-fullstack/commit/280cc84d735c60b1c261540dceda34dd7f91c93c), closes [#2](http://github.com/DaftMonk/generator-angular-fullstack/issues/2))
\ No newline at end of file
+* **gen:** include MongoDB as an option When selected, sets up database with Mongoose. Repl ([280cc84d](http://github.com/DaftMonk/generator-angular-fullstack/commit/280cc84d735c60b1c261540dceda34dd7f91c93c), closes [#2](http://github.com/DaftMonk/generator-angular-fullstack/issues/2))
diff --git a/Gruntfile.js b/Gruntfile.js
index 9819a4041..2dfe12118 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -1,39 +1,36 @@
-'use strict';
-var markdown = require('marked');
-var semver = require('semver');
-var _s = require('underscore.string');
var shell = require('shelljs');
-var process = require('child_process');
+var child_process = require('child_process');
var Q = require('q');
-var helpers = require('yeoman-generator').test;
-var fs = require('fs-extra');
+var helpers = require('yeoman-test');
+var fs = require('fs');
var path = require('path');
module.exports = function (grunt) {
- require('load-grunt-tasks')(grunt);
+ var gruntUtils = require('./task-utils/grunt')(grunt);
+ var gitCmd = gruntUtils.gitCmd;
+ var gitCmdAsync = gruntUtils.gitCmdAsync;
grunt.initConfig({
config: {
demo: 'demo'
},
pkg: grunt.file.readJSON('package.json'),
- changelog: {
- options: {
- dest: 'CHANGELOG.md',
- versionFile: 'package.json'
- }
- },
release: {
options: {
commitMessage: '<%= version %>',
- tagName: 'v<%= version %>',
- bump: false, // we have our own bump
- file: 'package.json'
+ tagName: '<%= version %>',
+ file: 'package.json',
+ beforeBump: ['updateSubmodules'],
+ afterBump: ['updateFixtures:deps', 'commitNgFullstackDeps'],
+ beforeRelease: ['stage'],
+ push: false,
+ pushTags: false,
+ npm: false
}
},
stage: {
options: {
- files: ['CHANGELOG.md']
+ files: ['CHANGELOG.md', 'angular-fullstack-deps']
}
},
buildcontrol: {
@@ -51,66 +48,37 @@ module.exports = function (grunt) {
}
}
},
- jshint: {
- options: {
- curly: false,
- node: true
+ david: {
+ gen: {
+ options: {}
},
- all: ['Gruntfile.js', '*/index.js']
- },
- mochaTest: {
- test: {
- src: [
- 'test/*.js'
- ],
+ app: {
options: {
- reporter: 'spec',
- timeout: 120000
+ package: 'test/fixtures/package.json'
}
}
- },
- clean: {
- demo: {
- files: [{
- dot: true,
- src: [
- '<%= config.demo %>/*',
- '!<%= config.demo %>/readme.md',
- '!<%= config.demo %>/node_modules',
- '!<%= config.demo %>/.git',
- '!<%= config.demo %>/dist'
- ]
- }]
- }
}
});
- grunt.registerTask('bump', 'bump manifest version', function (type) {
- var options = this.options({
- file: grunt.config('pkgFile') || 'package.json'
- });
-
- function setup(file, type) {
- var pkg = grunt.file.readJSON(file);
- var newVersion = pkg.version = semver.inc(pkg.version, type || 'patch');
- return {
- file: file,
- pkg: pkg,
- newVersion: newVersion
- };
- }
-
- var config = setup(options.file, type);
- grunt.file.write(config.file, JSON.stringify(config.pkg, null, ' ') + '\n');
- grunt.log.ok('Version bumped to ' + config.newVersion);
+ grunt.registerTask('stage', 'git add files before running the release task', function () {
+ var files = grunt.config('stage.options').files;
+ gitCmd(['add'].concat(files), {}, this.async());
});
- grunt.registerTask('stage', 'git add files before running the release task', function () {
- var files = this.options().files;
- grunt.util.spawn({
- cmd: process.platform === 'win32' ? 'git.cmd' : 'git',
- args: ['add'].concat(files)
- }, grunt.task.current.async());
+ grunt.registerTask('commitNgFullstackDeps', function() {
+ grunt.config.requires(
+ 'commitNgFullstackDeps.options.files',
+ 'commitNgFullstackDeps.options.cwd'
+ );
+ var ops = grunt.config.get('commitNgFullstackDeps').options;
+ var version = require('./package.json').version || 'NO VERSION SET';
+ if (Array.isArray(ops.files) && ops.files.length > 0) {
+ gitCmd(['commit', '-m', version].concat(ops.files), {
+ cwd: path.resolve(__dirname, ops.cwd)
+ }, this.async());
+ } else {
+ grunt.log.writeln('No files were commited');
+ }
});
grunt.registerTask('generateDemo', 'generate demo', function () {
@@ -139,9 +107,10 @@ module.exports = function (grunt) {
bootstrap: true,
uibootstrap: true,
mongoose: true,
+ testing: 'jasmine',
auth: true,
oauth: ['googleAuth', 'twitterAuth'],
- socketio: true
+ ws: true
};
var deps = [
@@ -201,48 +170,11 @@ module.exports = function (grunt) {
}
});
- grunt.registerTask('updateFixtures', 'updates package and bower fixtures', function() {
- var done = this.async();
- var packageJson = fs.readFileSync(path.resolve('app/templates/_package.json'), 'utf8');
- var bowerJson = fs.readFileSync(path.resolve('app/templates/_bower.json'), 'utf8');
-
- // replace package name
- packageJson = packageJson.replace(/"name": "<%(.*)%>"/g, '"name": "tempApp"');
- packageJson = packageJson.replace(/<%(.*)%>/g, '');
-
- // remove all ejs conditionals
- bowerJson = bowerJson.replace(/"name": "<%(.*)%>"/g, '"name": "tempApp"');
- bowerJson = bowerJson.replace(/<%(.*)%>/g, '');
-
- // save files
- fs.writeFile(path.resolve(__dirname + '/test/fixtures/package.json'), packageJson, function() {
- fs.writeFile(path.resolve(__dirname + '/test/fixtures/bower.json'), bowerJson, function() {
- done();
- });
- });
+ grunt.registerTask('deps', function(target) {
+ if (!target || target === 'app') grunt.task.run(['updateFixtures']);
+ grunt.task.run(['david:' + (target || '')]);
});
- grunt.registerTask('installFixtures', 'install package and bower fixtures', function() {
- var done = this.async();
-
- shell.cd('test/fixtures');
- grunt.log.ok('installing npm dependencies for generated app');
- process.exec('npm install --quiet', {cwd: '../fixtures'}, function (error, stdout, stderr) {
-
- grunt.log.ok('installing bower dependencies for generated app');
- process.exec('bower install', {cwd: '../fixtures'}, function (error, stdout, stderr) {
- shell.cd('../../');
- done();
- })
- });
- });
-
- grunt.registerTask('test', [
- 'updateFixtures',
- 'installFixtures',
- 'mochaTest'
- ]);
-
grunt.registerTask('demo', [
'clean:demo',
'generateDemo'
diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md
new file mode 100644
index 000000000..cf31e70c0
--- /dev/null
+++ b/ISSUE_TEMPLATE.md
@@ -0,0 +1,20 @@
+ - [ ] I understand that GitHub issues are not for tech support, but for questions specific to this generator, bug reports, and feature requests.
+
+Item | Version
+----- | -----
+generator-angular-fullstack | x.x.x
+Node | x.x.x
+npm | x.x.x
+Operating System | OS X 10 / Windows 10 / Ubuntu 15.10 / etc
+etc | etc
+
+Item | Answer
+----- | -----
+Transpiler | Babel / TypeScript
+Markup | HTML / Pug
+CSS | CSS / LESS / SCSS / Stylus
+Router | ngRoute / ui-router
+Client Tests | Jasmine / Mocha
+DB | MongoDB / SQL
+Auth | Y / N
+etc | etc
diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 000000000..c6b7b868e
--- /dev/null
+++ b/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,3 @@
+- [ ] I have read the [Contributing Documents](https://github.com/DaftMonk/generator-angular-fullstack/blob/master/contributing.md)
+- [ ] My commit(s) follow the [AngularJS commit message guidelines](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/)
+- [ ] The generator's tests pass (`generator-angular-fullstack$ npm test`)
diff --git a/README.md b/README.md
new file mode 100644
index 000000000..3d77289bc
--- /dev/null
+++ b/README.md
@@ -0,0 +1,120 @@
+# The Angular Full-Stack Generator
+
+
+
+ [](https://www.npmjs.com/package/generator-angular-fullstack) [](https://david-dm.org/angular-fullstack/generator-angular-fullstack) [](https://david-dm.org/angular-fullstack/generator-angular-fullstack#type=dev) [](https://gitter.im/angular-fullstack/generator-angular-fullstack)
+
+> Yeoman generator for creating MEAN/SEAN stack applications, using ES2017, MongoDB/SQL, Express, Angular, and Node - lets you quickly set up a project following best practices.
+
+### Generated project:
+
+[](https://david-dm.org/angular-fullstack/angular-fullstack-deps) [](https://david-dm.org/angular-fullstack/angular-fullstack-deps?type=dev) [](https://snyk.io/package/npm/angular-fullstack-deps)
+
+## Usage
+
+Install `yo`, `gulp-cli`, and `generator-angular-fullstack`:
+
+```text
+npm install -g yo gulp-cli generator-angular-fullstack
+```
+
+**Please note**: If you run into trouble compiling native add-ons during the installation, follow [`node-gyp`](https://github.com/nodejs/node-gyp)'s short guide on [required compilation tools](https://github.com/nodejs/node-gyp#installation).
+
+Then, to run your app \(make sure the MongoDB daemon is running if you selected Mongo\), run the following to start your server:
+
+```bash
+npm run start:server
+```
+
+and the following to start the Webpack dev server for the front-end:
+
+```bash
+npm run start:client
+```
+
+The Webpack server will tell you which port to access the app at \(usually [http://localhost:8080/](http://localhost:8080/)\).
+
+Run `yo angular-fullstack`
+
+```text
+yo angular-fullstack
+```
+
+**See the** [**Getting Started**](https://angular-fullstack.github.io/get-started/) **guide for more information.**
+
+## Prerequisites
+
+* MongoDB - Download and Install [MongoDB](https://www.mongodb.com/download-center#community) - If you plan on scaffolding your project with mongoose, you'll need mongoDB to be installed and have the `mongod` process running.
+ * If you have [Docker](https://www.docker.com/) installed, you can easily run a test database with `docker run -p 27017:27017 --name afs-mongo -d mongo`
+* The project's JavaScript is written in ECMAScript 2015. If you're unfamiliar with the latest changes to the specification for JavaScript, check out [http://es6-features.org/](http://es6-features.org/)
+
+## Supported Configurations
+
+**General**
+
+* Build Systems: `Gulp`
+* Testing:
+ * `Jasmine`
+ * `Mocha + Chai + Sinon`
+ * Chai assertions:
+ * `Expect`
+ * `Should`
+
+**Client**
+
+* Scripts: `JavaScript (Babel)`, `TypeScript`
+* Module Systems: `Webpack`
+* Markup: `HTML`, `Pug`
+* Stylesheets: `CSS`, `Stylus`, `Sass`, `Less`
+* CSS Frameworks: `Bootstrap`
+ * Option to include `UI Bootstrap`
+
+**Server**
+
+* Scripts: `JavaScript (Babel)`, `TypeScript` \(planned\)
+* Database:
+ * `None`,
+ * `MongoDB`, `SQL`
+ * Authentication boilerplate: `Yes`, `No`
+ * oAuth integrations: `Facebook`, `Twitter`, `Google`
+ * Socket.io integration: `Yes`, `No`
+
+## Generators
+
+Available generators:
+
+* App
+ * [angular-fullstack](https://angular-fullstack.github.io/generators/app/) \(aka [angular-fullstack:app](https://angular-fullstack.github.io/generators/app/)\)
+* Server Side
+ * [angular-fullstack:endpoint](https://angular-fullstack.github.io/generators/endpoint)
+* Client Side \(via [generator-angular-fullstack-component](https://github.com/angular-fullstack/generator-angular-fullstack-component)\)
+ * [angular-fullstack:route](https://angular-fullstack.github.io/generators/route)
+* To be re-updated:
+ * [angular-fullstack:component](https://angular-fullstack.github.io/generators/component)
+ * [angular-fullstack:controller](https://angular-fullstack.github.io/generators/controller)
+ * [angular-fullstack:filter](https://angular-fullstack.github.io/generators/filter)
+ * [angular-fullstack:directive](https://angular-fullstack.github.io/generators/directive)
+ * [angular-fullstack:service](https://angular-fullstack.github.io/generators/service)
+ * [angular-fullstack:provider](https://angular-fullstack.github.io/generators/service)
+ * [angular-fullstack:factory](https://angular-fullstack.github.io/generators/service)
+ * [angular-fullstack:decorator](https://angular-fullstack.github.io/generators/decorator)
+* Deployment
+ * [angular-fullstack:openshift](https://angular-fullstack.github.io/generators/openshift)
+ * [angular-fullstack:heroku](https://angular-fullstack.github.io/generators/heroku)
+
+## Documentation
+
+Check out our [documentation home page](https://awk34.gitbook.io/generator-angular-fullstack).
+
+## Contribute
+
+See the [contributing docs](https://github.com/angular-fullstack/generator-angular-fullstack/blob/master/contributing.md)
+
+When submitting an issue, please follow the [Yeoman issue guidelines](https://github.com/yeoman/yeoman/blob/master/contributing.md#issue-submission). Especially important is to make sure Yeoman is up-to-date, and providing the command or commands that cause the issue, as well as any stack traces.
+
+## License
+
+[BSD license](http://opensource.org/licenses/bsd-license.php)
+
+[](https://awk34.gitbook.io/generator-angular-fullstack)
+
diff --git a/SUMMARY.md b/SUMMARY.md
new file mode 100644
index 000000000..f7897f126
--- /dev/null
+++ b/SUMMARY.md
@@ -0,0 +1,32 @@
+# Table of contents
+
+* [The Angular Full-Stack Generator](README.md)
+
+## Getting Started
+
+* [Pre-Requisites](getting-started/pre-requisites.md)
+* [Installation](getting-started/installation.md)
+* [Running](getting-started/running.md)
+* [Project Overview](getting-started/project-overview.md)
+
+## Developing
+
+* [Overview](developing/overview.md)
+* [Adding a Route](developing/adding-a-route.md)
+
+## Deployment
+
+* [Manual Deployment](deployment/manual-deployment.md)
+* [Google Cloud Deployment](deployment/untitled-1.md)
+* [index](deployment/untitled.md)
+
+## Generators
+
+* [App](generators/app.md)
+* [Endpoint](generators/endpoint.md)
+
+## Contributing
+
+* [Releasing a New Version](contributing/releasing-a-new-version.md)
+* [Commit Style](contributing/untitled-1.md)
+
diff --git a/angular-fullstack-deps b/angular-fullstack-deps
new file mode 160000
index 000000000..d0b7c8633
--- /dev/null
+++ b/angular-fullstack-deps
@@ -0,0 +1 @@
+Subproject commit d0b7c86332f3ea3091332f307b10141ff90e4ad7
diff --git a/app/USAGE b/app/USAGE
deleted file mode 100644
index 721ce199b..000000000
--- a/app/USAGE
+++ /dev/null
@@ -1,5 +0,0 @@
-Description:
- Creates an full-stack AngularJS + Node app
-
-Example:
- yo angular-fullstack
diff --git a/app/index.js b/app/index.js
deleted file mode 100644
index 6e4724801..000000000
--- a/app/index.js
+++ /dev/null
@@ -1,267 +0,0 @@
-'use strict';
-var fs = require('fs');
-var path = require('path');
-var util = require('util');
-var genUtils = require('../util.js');
-var yeoman = require('yeoman-generator');
-var chalk = require('chalk');
-var wiredep = require('wiredep');
-
-var AngularFullstackGenerator = yeoman.generators.Base.extend({
-
- init: function () {
- this.argument('name', { type: String, required: false });
- this.appname = this.name || path.basename(process.cwd());
- this.appname = this._.camelize(this._.slugify(this._.humanize(this.appname)));
-
- this.option('app-suffix', {
- desc: 'Allow a custom suffix to be added to the module name',
- type: String,
- required: 'false'
- });
- this.scriptAppName = this.appname + genUtils.appName(this);
- this.appPath = this.env.options.appPath;
- this.pkg = require('../package.json');
-
- this.filters = {};
- },
-
- info: function () {
- this.log(this.yeoman);
- this.log('Out of the box I create an AngularJS app with an Express server.\n');
- },
-
- checkForConfig: function() {
- var cb = this.async();
-
- if(this.config.get('filters')) {
- this.prompt([{
- type: "confirm",
- name: "skipConfig",
- message: "Existing .yo-rc configuration found, would you like to use it?",
- default: true,
- }], function (answers) {
- this.skipConfig = answers.skipConfig;
-
- // NOTE: temp(?) fix for #403
- if(typeof this.oauth==='undefined') {
- var strategies = Object.keys(this.filters).filter(function(key) {
- return key.match(/Auth$/) && key;
- });
-
- if(strategies.length) this.config.set('oauth', true);
- }
-
- cb();
- }.bind(this));
- } else {
- cb();
- }
- },
-
- clientPrompts: function() {
- if(this.skipConfig) return;
- var cb = this.async();
-
- this.log('# Client\n');
-
- this.prompt([{
- type: "list",
- name: "script",
- message: "What would you like to write scripts with?",
- choices: [ "JavaScript", "CoffeeScript"],
- filter: function( val ) {
- var filterMap = {
- 'JavaScript': 'js',
- 'CoffeeScript': 'coffee'
- };
-
- return filterMap[val];
- }
- }, {
- type: "list",
- name: "markup",
- message: "What would you like to write markup with?",
- choices: [ "HTML", "Jade"],
- filter: function( val ) { return val.toLowerCase(); }
- }, {
- type: "list",
- name: "stylesheet",
- default: 1,
- message: "What would you like to write stylesheets with?",
- choices: [ "CSS", "Sass", "Stylus", "Less"],
- filter: function( val ) { return val.toLowerCase(); }
- }, {
- type: "list",
- name: "router",
- default: 1,
- message: "What Angular router would you like to use?",
- choices: [ "ngRoute", "uiRouter"],
- filter: function( val ) { return val.toLowerCase(); }
- }, {
- type: "confirm",
- name: "bootstrap",
- message: "Would you like to include Bootstrap?"
- }, {
- type: "confirm",
- name: "uibootstrap",
- message: "Would you like to include UI Bootstrap?",
- when: function (answers) {
- return answers.bootstrap;
- }
- }], function (answers) {
- this.filters[answers.script] = true;
- this.filters[answers.markup] = true;
- this.filters[answers.stylesheet] = true;
- this.filters[answers.router] = true;
- this.filters.bootstrap = !!answers.bootstrap;
- this.filters.uibootstrap = !!answers.uibootstrap;
- cb();
- }.bind(this));
- },
-
- serverPrompts: function() {
- if(this.skipConfig) return;
- var cb = this.async();
- var self = this;
-
- this.log('\n# Server\n');
-
- this.prompt([{
- type: "confirm",
- name: "mongoose",
- message: "Would you like to use mongoDB with Mongoose for data modeling?"
- }, {
- type: "confirm",
- name: "auth",
- message: "Would you scaffold out an authentication boilerplate?",
- when: function (answers) {
- return answers.mongoose;
- }
- }, {
- type: 'checkbox',
- name: 'oauth',
- message: 'Would you like to include additional oAuth strategies?',
- when: function (answers) {
- return answers.auth;
- },
- choices: [
- {
- value: 'googleAuth',
- name: 'Google',
- checked: false
- },
- {
- value: 'facebookAuth',
- name: 'Facebook',
- checked: false
- },
- {
- value: 'twitterAuth',
- name: 'Twitter',
- checked: false
- }
- ]
- }, {
- type: "confirm",
- name: "socketio",
- message: "Would you like to use socket.io?",
- // to-do: should not be dependent on mongoose
- when: function (answers) {
- return answers.mongoose;
- },
- default: true
- }], function (answers) {
- if(answers.socketio) this.filters.socketio = true;
- if(answers.mongoose) this.filters.mongoose = true;
- if(answers.auth) this.filters.auth = true;
- if(answers.oauth) {
- if(answers.oauth.length) this.filters.oauth = true;
- answers.oauth.forEach(function(oauthStrategy) {
- this.filters[oauthStrategy] = true;
- }.bind(this));
- }
-
- cb();
- }.bind(this));
- },
-
- saveSettings: function() {
- if(this.skipConfig) return;
- this.config.set('insertRoutes', true);
- this.config.set('registerRoutesFile', 'server/routes.js');
- this.config.set('routesNeedle', '// Insert routes below');
-
- this.config.set('routesBase', '/api/');
- this.config.set('pluralizeRoutes', true);
-
- this.config.set('insertSockets', true);
- this.config.set('registerSocketsFile', 'server/config/socketio.js');
- this.config.set('socketsNeedle', '// Insert sockets below');
-
- this.config.set('filters', this.filters);
- this.config.forceSave();
- },
-
- compose: function() {
- if(this.skipConfig) return;
- var appPath = 'client/app/';
- var extensions = [];
- var filters = [];
-
- if(this.filters.ngroute) filters.push('ngroute');
- if(this.filters.uirouter) filters.push('uirouter');
- if(this.filters.coffee) extensions.push('coffee');
- if(this.filters.js) extensions.push('js');
- if(this.filters.html) extensions.push('html');
- if(this.filters.jade) extensions.push('jade');
- if(this.filters.css) extensions.push('css');
- if(this.filters.stylus) extensions.push('styl');
- if(this.filters.sass) extensions.push('scss');
- if(this.filters.less) extensions.push('less');
-
- this.composeWith('ng-component', {
- options: {
- 'routeDirectory': appPath,
- 'directiveDirectory': appPath,
- 'filterDirectory': appPath,
- 'serviceDirectory': appPath,
- 'filters': filters,
- 'extensions': extensions,
- 'basePath': 'client'
- }
- }, { local: require.resolve('generator-ng-component/app/index.js') });
- },
-
- ngModules: function() {
- this.filters = this._.defaults(this.config.get('filters'), {
- bootstrap: true,
- uibootstrap: true
- });
-
- var angModules = [
- "'ngCookies'",
- "'ngResource'",
- "'ngSanitize'"
- ];
- if(this.filters.ngroute) angModules.push("'ngRoute'");
- if(this.filters.socketio) angModules.push("'btford.socket-io'");
- if(this.filters.uirouter) angModules.push("'ui.router'");
- if(this.filters.uibootstrap) angModules.push("'ui.bootstrap'");
-
- this.angularModules = "\n " + angModules.join(",\n ") +"\n";
- },
-
- generate: function() {
- this.sourceRoot(path.join(__dirname, './templates'));
- genUtils.processDirectory(this, '.', '.');
- },
-
- end: function() {
- this.installDependencies({
- skipInstall: this.options['skip-install']
- });
- }
-});
-
-module.exports = AngularFullstackGenerator;
diff --git a/app/templates/.bowerrc b/app/templates/.bowerrc
deleted file mode 100644
index 666f34745..000000000
--- a/app/templates/.bowerrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "directory": "client/bower_components"
-}
diff --git a/app/templates/.buildignore b/app/templates/.buildignore
deleted file mode 100644
index fc98b8eb5..000000000
--- a/app/templates/.buildignore
+++ /dev/null
@@ -1 +0,0 @@
-*.coffee
\ No newline at end of file
diff --git a/app/templates/.gitattributes b/app/templates/.gitattributes
deleted file mode 100644
index 212566614..000000000
--- a/app/templates/.gitattributes
+++ /dev/null
@@ -1 +0,0 @@
-* text=auto
\ No newline at end of file
diff --git a/app/templates/.travis.yml b/app/templates/.travis.yml
deleted file mode 100644
index 5112a8e88..000000000
--- a/app/templates/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-language: node_js
-node_js:
- - '0.10'
- - '0.11'
-before_script:
- - npm install -g bower grunt-cli<% if (filters.sass) { %>
- - gem install sass<% } %>
- - bower install
-services: mongodb
\ No newline at end of file
diff --git a/app/templates/Gruntfile.js b/app/templates/Gruntfile.js
deleted file mode 100644
index a0267aaa4..000000000
--- a/app/templates/Gruntfile.js
+++ /dev/null
@@ -1,838 +0,0 @@
-// Generated on <%= (new Date).toISOString().split('T')[0] %> using <%= pkg.name %> <%= pkg.version %>
-'use strict';
-
-module.exports = function (grunt) {
- var localConfig;
- try {
- localConfig = require('./server/config/local.env');
- } catch(e) {
- localConfig = {};
- }
-
- // Load grunt tasks automatically, when needed
- require('jit-grunt')(grunt, {
- express: 'grunt-express-server',
- useminPrepare: 'grunt-usemin',
- ngtemplates: 'grunt-angular-templates',
- cdnify: 'grunt-google-cdn',
- protractor: 'grunt-protractor-runner',
- buildcontrol: 'grunt-build-control'
- });
-
- // Time how long tasks take. Can help when optimizing build times
- require('time-grunt')(grunt);
-
- // Define the configuration for all the tasks
- grunt.initConfig({
-
- // Project settings
- pkg: grunt.file.readJSON('package.json'),
- yeoman: {
- // configurable paths
- client: require('./bower.json').appPath || 'client',
- dist: 'dist'
- },
- express: {
- options: {
- port: process.env.PORT || 9000
- },
- dev: {
- options: {
- script: 'server/app.js',
- debug: true
- }
- },
- prod: {
- options: {
- script: 'dist/server/app.js'
- }
- }
- },
- open: {
- server: {
- url: 'http://localhost:<%%= express.options.port %>'
- }
- },
- watch: {
- injectJS: {
- files: [
- '<%%= yeoman.client %>/{app,components}/**/*.js',
- '!<%%= yeoman.client %>/{app,components}/**/*.spec.js',
- '!<%%= yeoman.client %>/{app,components}/**/*.mock.js',
- '!<%%= yeoman.client %>/app/app.js'],
- tasks: ['injector:scripts']
- },
- injectCss: {
- files: [
- '<%%= yeoman.client %>/{app,components}/**/*.css'
- ],
- tasks: ['injector:css']
- },
- mochaTest: {
- files: ['server/**/*.spec.js'],
- tasks: ['env:test', 'mochaTest']
- },
- jsTest: {
- files: [
- '<%%= yeoman.client %>/{app,components}/**/*.spec.js',
- '<%%= yeoman.client %>/{app,components}/**/*.mock.js'
- ],
- tasks: ['newer:jshint:all', 'karma']
- },<% if(filters.stylus) { %>
- injectStylus: {
- files: [
- '<%%= yeoman.client %>/{app,components}/**/*.styl'],
- tasks: ['injector:stylus']
- },
- stylus: {
- files: [
- '<%%= yeoman.client %>/{app,components}/**/*.styl'],
- tasks: ['stylus', 'autoprefixer']
- },<% } %><% if(filters.sass) { %>
- injectSass: {
- files: [
- '<%%= yeoman.client %>/{app,components}/**/*.{scss,sass}'],
- tasks: ['injector:sass']
- },
- sass: {
- files: [
- '<%%= yeoman.client %>/{app,components}/**/*.{scss,sass}'],
- tasks: ['sass', 'autoprefixer']
- },<% } %><% if(filters.less) { %>
- injectLess: {
- files: [
- '<%%= yeoman.client %>/{app,components}/**/*.less'],
- tasks: ['injector:less']
- },
- less: {
- files: [
- '<%%= yeoman.client %>/{app,components}/**/*.less'],
- tasks: ['less', 'autoprefixer']
- },<% } %><% if(filters.jade) { %>
- jade: {
- files: [
- '<%%= yeoman.client %>/{app,components}/*',
- '<%%= yeoman.client %>/{app,components}/**/*.jade'],
- tasks: ['jade']
- },<% } %><% if(filters.coffee) { %>
- coffee: {
- files: [
- '<%%= yeoman.client %>/{app,components}/**/*.{coffee,litcoffee,coffee.md}',
- '!<%%= yeoman.client %>/{app,components}/**/*.spec.{coffee,litcoffee,coffee.md}'
- ],
- tasks: ['newer:coffee', 'injector:scripts']
- },
- coffeeTest: {
- files: [
- '<%%= yeoman.client %>/{app,components}/**/*.spec.{coffee,litcoffee,coffee.md}'
- ],
- tasks: ['karma']
- },<% } %>
- gruntfile: {
- files: ['Gruntfile.js']
- },
- livereload: {
- files: [
- '{.tmp,<%%= yeoman.client %>}/{app,components}/**/*.css',
- '{.tmp,<%%= yeoman.client %>}/{app,components}/**/*.html',
- '{.tmp,<%%= yeoman.client %>}/{app,components}/**/*.js',
- '!{.tmp,<%%= yeoman.client %>}{app,components}/**/*.spec.js',
- '!{.tmp,<%%= yeoman.client %>}/{app,components}/**/*.mock.js',
- '<%%= yeoman.client %>/assets/images/{,*//*}*.{png,jpg,jpeg,gif,webp,svg}'
- ],
- options: {
- livereload: true
- }
- },
- express: {
- files: [
- 'server/**/*.{js,json}'
- ],
- tasks: ['express:dev', 'wait'],
- options: {
- livereload: true,
- nospawn: true //Without this option specified express won't be reloaded
- }
- }
- },
-
- // Make sure code styles are up to par and there are no obvious mistakes
- jshint: {
- options: {
- jshintrc: '<%%= yeoman.client %>/.jshintrc',
- reporter: require('jshint-stylish')
- },
- server: {
- options: {
- jshintrc: 'server/.jshintrc'
- },
- src: [
- 'server/**/*.js',
- '!server/**/*.spec.js'
- ]
- },
- serverTest: {
- options: {
- jshintrc: 'server/.jshintrc-spec'
- },
- src: ['server/**/*.spec.js']
- },
- all: [
- '<%%= yeoman.client %>/{app,components}/**/*.js',
- '!<%%= yeoman.client %>/{app,components}/**/*.spec.js',
- '!<%%= yeoman.client %>/{app,components}/**/*.mock.js'
- ],
- test: {
- src: [
- '<%%= yeoman.client %>/{app,components}/**/*.spec.js',
- '<%%= yeoman.client %>/{app,components}/**/*.mock.js'
- ]
- }
- },
-
- // Empties folders to start fresh
- clean: {
- dist: {
- files: [{
- dot: true,
- src: [
- '.tmp',
- '<%%= yeoman.dist %>/*',
- '!<%%= yeoman.dist %>/.git*',
- '!<%%= yeoman.dist %>/.openshift',
- '!<%%= yeoman.dist %>/Procfile'
- ]
- }]
- },
- server: '.tmp'
- },
-
- // Add vendor prefixed styles
- autoprefixer: {
- options: {
- browsers: ['last 1 version']
- },
- dist: {
- files: [{
- expand: true,
- cwd: '.tmp/',
- src: '{,*/}*.css',
- dest: '.tmp/'
- }]
- }
- },
-
- // Debugging with node inspector
- 'node-inspector': {
- custom: {
- options: {
- 'web-host': 'localhost'
- }
- }
- },
-
- // Use nodemon to run server in debug mode with an initial breakpoint
- nodemon: {
- debug: {
- script: 'server/app.js',
- options: {
- nodeArgs: ['--debug-brk'],
- env: {
- PORT: process.env.PORT || 9000
- },
- callback: function (nodemon) {
- nodemon.on('log', function (event) {
- console.log(event.colour);
- });
-
- // opens browser on initial server start
- nodemon.on('config:update', function () {
- setTimeout(function () {
- require('open')('http://localhost:8080/debug?port=5858');
- }, 500);
- });
- }
- }
- }
- },
-
- // Automatically inject Bower components into the app
- wiredep: {
- target: {
- src: '<%%= yeoman.client %>/index.html',
- ignorePath: '<%%= yeoman.client %>/',
- exclude: [/bootstrap-sass-official/, /bootstrap.js/, '/json3/', '/es5-shim/'<% if(!filters.css) { %>, /bootstrap.css/, /font-awesome.css/ <% } %>]
- }
- },
-
- // Renames files for browser caching purposes
- rev: {
- dist: {
- files: {
- src: [
- '<%%= yeoman.dist %>/public/{,*/}*.js',
- '<%%= yeoman.dist %>/public/{,*/}*.css',
- '<%%= yeoman.dist %>/public/assets/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
- '<%%= yeoman.dist %>/public/assets/fonts/*'
- ]
- }
- }
- },
-
- // Reads HTML for usemin blocks to enable smart builds that automatically
- // concat, minify and revision files. Creates configurations in memory so
- // additional tasks can operate on them
- useminPrepare: {
- html: ['<%%= yeoman.client %>/index.html'],
- options: {
- dest: '<%%= yeoman.dist %>/public'
- }
- },
-
- // Performs rewrites based on rev and the useminPrepare configuration
- usemin: {
- html: ['<%%= yeoman.dist %>/public/{,*/}*.html'],
- css: ['<%%= yeoman.dist %>/public/{,*/}*.css'],
- js: ['<%%= yeoman.dist %>/public/{,*/}*.js'],
- options: {
- assetsDirs: [
- '<%%= yeoman.dist %>/public',
- '<%%= yeoman.dist %>/public/assets/images'
- ],
- // This is so we update image references in our ng-templates
- patterns: {
- js: [
- [/(assets\/images\/.*?\.(?:gif|jpeg|jpg|png|webp|svg))/gm, 'Update the JS to reference our revved images']
- ]
- }
- }
- },
-
- // The following *-min tasks produce minified files in the dist folder
- imagemin: {
- dist: {
- files: [{
- expand: true,
- cwd: '<%%= yeoman.client %>/assets/images',
- src: '{,*/}*.{png,jpg,jpeg,gif}',
- dest: '<%%= yeoman.dist %>/public/assets/images'
- }]
- }
- },
-
- svgmin: {
- dist: {
- files: [{
- expand: true,
- cwd: '<%%= yeoman.client %>/assets/images',
- src: '{,*/}*.svg',
- dest: '<%%= yeoman.dist %>/public/assets/images'
- }]
- }
- },
-
- // Allow the use of non-minsafe AngularJS files. Automatically makes it
- // minsafe compatible so Uglify does not destroy the ng references
- ngAnnotate: {
- dist: {
- files: [{
- expand: true,
- cwd: '.tmp/concat',
- src: '*/**.js',
- dest: '.tmp/concat'
- }]
- }
- },
-
- // Package all the html partials into a single javascript payload
- ngtemplates: {
- options: {
- // This should be the name of your apps angular module
- module: '<%= scriptAppName %>',
- htmlmin: {
- collapseBooleanAttributes: true,
- collapseWhitespace: true,
- removeAttributeQuotes: true,
- removeEmptyAttributes: true,
- removeRedundantAttributes: true,
- removeScriptTypeAttributes: true,
- removeStyleLinkTypeAttributes: true
- },
- usemin: 'app/app.js'
- },
- main: {
- cwd: '<%%= yeoman.client %>',
- src: ['{app,components}/**/*.html'],
- dest: '.tmp/templates.js'
- },
- tmp: {
- cwd: '.tmp',
- src: ['{app,components}/**/*.html'],
- dest: '.tmp/tmp-templates.js'
- }
- },
-
- // Replace Google CDN references
- cdnify: {
- dist: {
- html: ['<%%= yeoman.dist %>/public/*.html']
- }
- },
-
- // Copies remaining files to places other tasks can use
- copy: {
- dist: {
- files: [{
- expand: true,
- dot: true,
- cwd: '<%%= yeoman.client %>',
- dest: '<%%= yeoman.dist %>/public',
- src: [
- '*.{ico,png,txt}',
- '.htaccess',
- 'bower_components/**/*',
- 'assets/images/{,*/}*.{webp}',
- 'assets/fonts/**/*',
- 'index.html'
- ]
- }, {
- expand: true,
- cwd: '.tmp/images',
- dest: '<%%= yeoman.dist %>/public/assets/images',
- src: ['generated/*']
- }, {
- expand: true,
- dest: '<%%= yeoman.dist %>',
- src: [
- 'package.json',
- 'server/**/*'
- ]
- }]
- },
- styles: {
- expand: true,
- cwd: '<%%= yeoman.client %>',
- dest: '.tmp/',
- src: ['{app,components}/**/*.css']
- }
- },
-
- buildcontrol: {
- options: {
- dir: 'dist',
- commit: true,
- push: true,
- connectCommits: false,
- message: 'Built %sourceName% from commit %sourceCommit% on branch %sourceBranch%'
- },
- heroku: {
- options: {
- remote: 'heroku',
- branch: 'master'
- }
- },
- openshift: {
- options: {
- remote: 'openshift',
- branch: 'master'
- }
- }
- },
-
- // Run some tasks in parallel to speed up the build process
- concurrent: {
- server: [<% if(filters.coffee) { %>
- 'coffee',<% } %><% if(filters.jade) { %>
- 'jade',<% } %><% if(filters.stylus) { %>
- 'stylus',<% } %><% if(filters.sass) { %>
- 'sass',<% } %><% if(filters.less) { %>
- 'less',<% } %>
- ],
- test: [<% if(filters.coffee) { %>
- 'coffee',<% } %><% if(filters.jade) { %>
- 'jade',<% } %><% if(filters.stylus) { %>
- 'stylus',<% } %><% if(filters.sass) { %>
- 'sass',<% } %><% if(filters.less) { %>
- 'less',<% } %>
- ],
- debug: {
- tasks: [
- 'nodemon',
- 'node-inspector'
- ],
- options: {
- logConcurrentOutput: true
- }
- },
- dist: [<% if(filters.coffee) { %>
- 'coffee',<% } %><% if(filters.jade) { %>
- 'jade',<% } %><% if(filters.stylus) { %>
- 'stylus',<% } %><% if(filters.sass) { %>
- 'sass',<% } %><% if(filters.less) { %>
- 'less',<% } %>
- 'imagemin',
- 'svgmin'
- ]
- },
-
- // Test settings
- karma: {
- unit: {
- configFile: 'karma.conf.js',
- singleRun: true
- }
- },
-
- mochaTest: {
- options: {
- reporter: 'spec'
- },
- src: ['server/**/*.spec.js']
- },
-
- protractor: {
- options: {
- configFile: 'protractor.conf.js'
- },
- chrome: {
- options: {
- args: {
- browser: 'chrome'
- }
- }
- }
- },
-
- env: {
- test: {
- NODE_ENV: 'test'
- },
- prod: {
- NODE_ENV: 'production'
- },
- all: localConfig
- },<% if(filters.jade) { %>
-
- // Compiles Jade to html
- jade: {
- compile: {
- options: {
- data: {
- debug: false
- }
- },
- files: [{
- expand: true,
- cwd: '<%%= yeoman.client %>',
- src: [
- '{app,components}/**/*.jade'
- ],
- dest: '.tmp',
- ext: '.html'
- }]
- }
- },<% } %><% if(filters.coffee) { %>
-
- // Compiles CoffeeScript to JavaScript
- coffee: {
- options: {
- sourceMap: true,
- sourceRoot: ''
- },
- server: {
- files: [{
- expand: true,
- cwd: 'client',
- src: [
- '{app,components}/**/*.coffee',
- '!{app,components}/**/*.spec.coffee'
- ],
- dest: '.tmp',
- ext: '.js'
- }]
- }
- },<% } %><% if(filters.stylus) { %>
-
- // Compiles Stylus to CSS
- stylus: {
- server: {
- options: {
- paths: [
- '<%%= yeoman.client %>/bower_components',
- '<%%= yeoman.client %>/app',
- '<%%= yeoman.client %>/components'
- ],
- "include css": true
- },
- files: {
- '.tmp/app/app.css' : '<%%= yeoman.client %>/app/app.styl'
- }
- }
- },<% } %><% if(filters.sass) { %>
-
- // Compiles Sass to CSS
- sass: {
- server: {
- options: {
- loadPath: [
- '<%%= yeoman.client %>/bower_components',
- '<%%= yeoman.client %>/app',
- '<%%= yeoman.client %>/components'
- ],
- compass: false
- },
- files: {
- '.tmp/app/app.css' : '<%%= yeoman.client %>/app/app.scss'
- }
- }
- },<% } %><% if(filters.less) { %>
-
- // Compiles Less to CSS
- less: {
- options: {
- paths: [
- '<%%= yeoman.client %>/bower_components',
- '<%%= yeoman.client %>/app',
- '<%%= yeoman.client %>/components'
- ]
- },
- server: {
- files: {
- '.tmp/app/app.css' : '<%%= yeoman.client %>/app/app.less'
- }
- },
- },<% } %>
-
- injector: {
- options: {
-
- },
- // Inject application script files into index.html (doesn't include bower)
- scripts: {
- options: {
- transform: function(filePath) {
- filePath = filePath.replace('/client/', '');
- filePath = filePath.replace('/.tmp/', '');
- return '';
- },
- starttag: '',
- endtag: ''
- },
- files: {
- '<%%= yeoman.client %>/index.html': [
- ['{.tmp,<%%= yeoman.client %>}/{app,components}/**/*.js',
- '!{.tmp,<%%= yeoman.client %>}/app/app.js',
- '!{.tmp,<%%= yeoman.client %>}/{app,components}/**/*.spec.js',
- '!{.tmp,<%%= yeoman.client %>}/{app,components}/**/*.mock.js']
- ]
- }
- },<% if(filters.stylus) { %>
-
- // Inject component styl into app.styl
- stylus: {
- options: {
- transform: function(filePath) {
- filePath = filePath.replace('/client/app/', '');
- filePath = filePath.replace('/client/components/', '');
- return '@import \'' + filePath + '\';';
- },
- starttag: '// injector',
- endtag: '// endinjector'
- },
- files: {
- '<%%= yeoman.client %>/app/app.styl': [
- '<%%= yeoman.client %>/{app,components}/**/*.styl',
- '!<%%= yeoman.client %>/app/app.styl'
- ]
- }
- },<% } %><% if(filters.sass) { %>
-
- // Inject component scss into app.scss
- sass: {
- options: {
- transform: function(filePath) {
- filePath = filePath.replace('/client/app/', '');
- filePath = filePath.replace('/client/components/', '');
- return '@import \'' + filePath + '\';';
- },
- starttag: '// injector',
- endtag: '// endinjector'
- },
- files: {
- '<%%= yeoman.client %>/app/app.scss': [
- '<%%= yeoman.client %>/{app,components}/**/*.{scss,sass}',
- '!<%%= yeoman.client %>/app/app.{scss,sass}'
- ]
- }
- },<% } %><% if(filters.less) { %>
-
- // Inject component less into app.less
- less: {
- options: {
- transform: function(filePath) {
- filePath = filePath.replace('/client/app/', '');
- filePath = filePath.replace('/client/components/', '');
- return '@import \'' + filePath + '\';';
- },
- starttag: '// injector',
- endtag: '// endinjector'
- },
- files: {
- '<%%= yeoman.client %>/app/app.less': [
- '<%%= yeoman.client %>/{app,components}/**/*.less',
- '!<%%= yeoman.client %>/app/app.less'
- ]
- }
- },<% } %>
-
- // Inject component css into index.html
- css: {
- options: {
- transform: function(filePath) {
- filePath = filePath.replace('/client/', '');
- filePath = filePath.replace('/.tmp/', '');
- return '';
- },
- starttag: '',
- endtag: ''
- },
- files: {
- '<%%= yeoman.client %>/index.html': [
- '<%%= yeoman.client %>/{app,components}/**/*.css'
- ]
- }
- }
- },
- });
-
- // Used for delaying livereload until after server has restarted
- grunt.registerTask('wait', function () {
- grunt.log.ok('Waiting for server reload...');
-
- var done = this.async();
-
- setTimeout(function () {
- grunt.log.writeln('Done waiting!');
- done();
- }, 1500);
- });
-
- grunt.registerTask('express-keepalive', 'Keep grunt running', function() {
- this.async();
- });
-
- grunt.registerTask('serve', function (target) {
- if (target === 'dist') {
- return grunt.task.run(['build', 'env:all', 'env:prod', 'express:prod', 'wait', 'open', 'express-keepalive']);
- }
-
- if (target === 'debug') {
- return grunt.task.run([
- 'clean:server',
- 'env:all',<% if(filters.stylus) { %>
- 'injector:stylus', <% } %><% if(filters.less) { %>
- 'injector:less', <% } %><% if(filters.sass) { %>
- 'injector:sass', <% } %>
- 'concurrent:server',
- 'injector',
- 'wiredep',
- 'autoprefixer',
- 'concurrent:debug'
- ]);
- }
-
- grunt.task.run([
- 'clean:server',
- 'env:all',<% if(filters.stylus) { %>
- 'injector:stylus', <% } %><% if(filters.less) { %>
- 'injector:less', <% } %><% if(filters.sass) { %>
- 'injector:sass', <% } %>
- 'concurrent:server',
- 'injector',
- 'wiredep',
- 'autoprefixer',
- 'express:dev',
- 'wait',
- 'open',
- 'watch'
- ]);
- });
-
- grunt.registerTask('server', function () {
- grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.');
- grunt.task.run(['serve']);
- });
-
- grunt.registerTask('test', function(target) {
- if (target === 'server') {
- return grunt.task.run([
- 'env:all',
- 'env:test',
- 'mochaTest'
- ]);
- }
-
- else if (target === 'client') {
- return grunt.task.run([
- 'clean:server',
- 'env:all',<% if(filters.stylus) { %>
- 'injector:stylus', <% } %><% if(filters.less) { %>
- 'injector:less', <% } %><% if(filters.sass) { %>
- 'injector:sass', <% } %>
- 'concurrent:test',
- 'injector',
- 'autoprefixer',
- 'karma'
- ]);
- }
-
- else if (target === 'e2e') {
- return grunt.task.run([
- 'clean:server',
- 'env:all',
- 'env:test',<% if(filters.stylus) { %>
- 'injector:stylus', <% } %><% if(filters.less) { %>
- 'injector:less', <% } %><% if(filters.sass) { %>
- 'injector:sass', <% } %>
- 'concurrent:test',
- 'injector',
- 'wiredep',
- 'autoprefixer',
- 'express:dev',
- 'protractor'
- ]);
- }
-
- else grunt.task.run([
- 'test:server',
- 'test:client'
- ]);
- });
-
- grunt.registerTask('build', [
- 'clean:dist',<% if(filters.stylus) { %>
- 'injector:stylus', <% } %><% if(filters.less) { %>
- 'injector:less', <% } %><% if(filters.sass) { %>
- 'injector:sass', <% } %>
- 'concurrent:dist',
- 'injector',
- 'wiredep',
- 'useminPrepare',
- 'autoprefixer',
- 'ngtemplates',
- 'concat',
- 'ngAnnotate',
- 'copy:dist',
- 'cdnify',
- 'cssmin',
- 'uglify',
- 'rev',
- 'usemin'
- ]);
-
- grunt.registerTask('default', [
- 'newer:jshint',
- 'test',
- 'build'
- ]);
-};
diff --git a/app/templates/_.gitignore b/app/templates/_.gitignore
deleted file mode 100644
index 6b4afbb0f..000000000
--- a/app/templates/_.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-node_modules
-public
-.tmp<% if(filters.sass) { %>
-.sass-cache<% } %>
-.idea
-client/bower_components
-dist
-/server/config/local.env.js
\ No newline at end of file
diff --git a/app/templates/_bower.json b/app/templates/_bower.json
deleted file mode 100644
index ce22650fb..000000000
--- a/app/templates/_bower.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "name": "<%= _.slugify(_.humanize(appname)) %>",
- "version": "0.0.0",
- "dependencies": {
- "angular": ">=1.2.*",
- "json3": "~3.3.1",
- "es5-shim": "~3.0.1",<% if(filters.bootstrap) { %><% if (filters.sass) { %>
- "bootstrap-sass-official": "~3.1.1",<% } %>
- "bootstrap": "~3.1.1",<% } %>
- "angular-resource": ">=1.2.*",
- "angular-cookies": ">=1.2.*",
- "angular-sanitize": ">=1.2.*",<% if(filters.ngroute) { %>
- "angular-route": ">=1.2.*",<% } %><% if(filters.uibootstrap) { %>
- "angular-bootstrap": "~0.11.0",<% } %>
- "font-awesome": ">=4.1.0",
- "lodash": "~2.4.1"<% if(filters.socketio) { %>,
- "angular-socket-io": "~0.6.0"<% } %><% if(filters.uirouter) { %>,
- "angular-ui-router": "~0.2.10"<% } %>
- },
- "devDependencies": {
- "angular-mocks": ">=1.2.*",
- "angular-scenario": ">=1.2.*"
- }
-}
diff --git a/app/templates/_package.json b/app/templates/_package.json
deleted file mode 100644
index b19b58813..000000000
--- a/app/templates/_package.json
+++ /dev/null
@@ -1,100 +0,0 @@
-{
- "name": "<%= _.slugify(_.humanize(appname)) %>",
- "version": "0.0.0",
- "main": "server/app.js",
- "dependencies": {
- "express": "~4.9.0",
- "morgan": "~1.0.0",
- "body-parser": "~1.5.0",
- "method-override": "~1.0.0",
- "serve-favicon": "~2.0.1",
- "cookie-parser": "~1.0.1",
- "express-session": "~1.0.2",
- "errorhandler": "~1.0.0",
- "compression": "~1.0.1",
- "lodash": "~2.4.1",<% if(filters.jade) { %>
- "jade": "~1.2.0",<% } %><% if(filters.html) { %>
- "ejs": "~0.8.4",<% } %><% if(filters.mongoose) { %>
- "mongoose": "~3.8.8",<% } %><% if(filters.auth) { %>
- "jsonwebtoken": "^0.3.0",
- "express-jwt": "^0.1.3",
- "passport": "~0.2.0",
- "passport-local": "~0.1.6",<% } %><% if(filters.facebookAuth) { %>
- "passport-facebook": "latest",<% } %><% if(filters.twitterAuth) { %>
- "passport-twitter": "latest",<% } %><% if(filters.googleAuth) { %>
- "passport-google-oauth": "latest",<% } %>
- "composable-middleware": "^0.3.0",
- "connect-mongo": "^0.4.1"<% if(filters.socketio) { %>,
- "socket.io": "^1.0.6",
- "socket.io-client": "^1.0.6",
- "socketio-jwt": "^2.0.2"<% } %>
- },
- "devDependencies": {
- "grunt": "~0.4.4",
- "grunt-autoprefixer": "~0.7.2",
- "grunt-wiredep": "~1.8.0",
- "grunt-concurrent": "~0.5.0",
- "grunt-contrib-clean": "~0.5.0",
- "grunt-contrib-concat": "~0.4.0",
- "grunt-contrib-copy": "~0.5.0",
- "grunt-contrib-cssmin": "~0.9.0",
- "grunt-contrib-htmlmin": "~0.2.0",
- "grunt-contrib-imagemin": "~0.7.1",
- "grunt-contrib-jshint": "~0.10.0",
- "grunt-contrib-uglify": "~0.4.0",
- "grunt-contrib-watch": "~0.6.1",<% if(filters.coffee) { %>
- "grunt-contrib-coffee": "^0.10.1",<% } %><% if(filters.jade) { %>
- "grunt-contrib-jade": "^0.11.0",<% } %><% if(filters.less) { %>
- "grunt-contrib-less": "^0.11.0",<% } %>
- "grunt-google-cdn": "~0.4.0",
- "grunt-newer": "~0.7.0",
- "grunt-ng-annotate": "^0.2.3",
- "grunt-rev": "~0.1.0",
- "grunt-svgmin": "~0.4.0",
- "grunt-usemin": "~2.1.1",
- "grunt-env": "~0.4.1",
- "grunt-node-inspector": "~0.1.5",
- "grunt-nodemon": "~0.2.0",
- "grunt-angular-templates": "^0.5.4",
- "grunt-dom-munger": "^3.4.0",
- "grunt-protractor-runner": "^1.1.0",
- "grunt-injector": "~0.5.4",
- "grunt-karma": "~0.8.2",
- "grunt-build-control": "DaftMonk/grunt-build-control",
- "grunt-mocha-test": "~0.10.2",<% if(filters.sass) { %>
- "grunt-contrib-sass": "^0.7.3",<% } %><% if(filters.stylus) { %>
- "grunt-contrib-stylus": "latest",<% } %>
- "jit-grunt": "^0.5.0",
- "time-grunt": "~0.3.1",
- "grunt-express-server": "~0.4.17",
- "grunt-open": "~0.2.3",
- "open": "~0.0.4",
- "jshint-stylish": "~0.1.5",
- "connect-livereload": "~0.4.0",
- "karma-ng-scenario": "~0.1.0",
- "karma-firefox-launcher": "~0.1.3",
- "karma-script-launcher": "~0.1.0",
- "karma-html2js-preprocessor": "~0.1.0",
- "karma-ng-jade2js-preprocessor": "^0.1.2",
- "karma-jasmine": "~0.1.5",
- "karma-chrome-launcher": "~0.1.3",
- "requirejs": "~2.1.11",
- "karma-requirejs": "~0.2.1",
- "karma-coffee-preprocessor": "~0.2.1",
- "karma-jade-preprocessor": "0.0.11",
- "karma-phantomjs-launcher": "~0.1.4",
- "karma": "~0.12.9",
- "karma-ng-html2js-preprocessor": "~0.1.0",
- "supertest": "~0.11.0",
- "should": "~3.3.1"
- },
- "engines": {
- "node": ">=0.10.0"
- },
- "scripts": {
- "start": "node server/app.js",
- "test": "grunt test",
- "update-webdriver": "node node_modules/grunt-protractor-runner/node_modules/protractor/bin/webdriver-manager update"
- },
- "private": true
-}
diff --git a/app/templates/client/.htaccess b/app/templates/client/.htaccess
deleted file mode 100644
index cb84cb918..000000000
--- a/app/templates/client/.htaccess
+++ /dev/null
@@ -1,543 +0,0 @@
-# Apache Configuration File
-
-# (!) Using `.htaccess` files slows down Apache, therefore, if you have access
-# to the main server config file (usually called `httpd.conf`), you should add
-# this logic there: http://httpd.apache.org/docs/current/howto/htaccess.html.
-
-# ##############################################################################
-# # CROSS-ORIGIN RESOURCE SHARING (CORS) #
-# ##############################################################################
-
-# ------------------------------------------------------------------------------
-# | Cross-domain AJAX requests |
-# ------------------------------------------------------------------------------
-
-# Enable cross-origin AJAX requests.
-# http://code.google.com/p/html5security/wiki/CrossOriginRequestSecurity
-# http://enable-cors.org/
-
-#
-# Header set Access-Control-Allow-Origin "*"
-#
-
-# ------------------------------------------------------------------------------
-# | CORS-enabled images |
-# ------------------------------------------------------------------------------
-
-# Send the CORS header for images when browsers request it.
-# https://developer.mozilla.org/en/CORS_Enabled_Image
-# http://blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html
-# http://hacks.mozilla.org/2011/11/using-cors-to-load-webgl-textures-from-cross-domain-images/
-
-
-
-
- SetEnvIf Origin ":" IS_CORS
- Header set Access-Control-Allow-Origin "*" env=IS_CORS
-
-
-
-
-# ------------------------------------------------------------------------------
-# | Web fonts access |
-# ------------------------------------------------------------------------------
-
-# Allow access from all domains for web fonts
-
-
-
- Header set Access-Control-Allow-Origin "*"
-
-
-
-
-# ##############################################################################
-# # ERRORS #
-# ##############################################################################
-
-# ------------------------------------------------------------------------------
-# | 404 error prevention for non-existing redirected folders |
-# ------------------------------------------------------------------------------
-
-# Prevent Apache from returning a 404 error for a rewrite if a directory
-# with the same name does not exist.
-# http://httpd.apache.org/docs/current/content-negotiation.html#multiviews
-# http://www.webmasterworld.com/apache/3808792.htm
-
-Options -MultiViews
-
-# ------------------------------------------------------------------------------
-# | Custom error messages / pages |
-# ------------------------------------------------------------------------------
-
-# You can customize what Apache returns to the client in case of an error (see
-# http://httpd.apache.org/docs/current/mod/core.html#errordocument), e.g.:
-
-ErrorDocument 404 /404.html
-
-
-# ##############################################################################
-# # INTERNET EXPLORER #
-# ##############################################################################
-
-# ------------------------------------------------------------------------------
-# | Better website experience |
-# ------------------------------------------------------------------------------
-
-# Force IE to render pages in the highest available mode in the various
-# cases when it may not: http://hsivonen.iki.fi/doctype/ie-mode.pdf.
-
-
- Header set X-UA-Compatible "IE=edge"
- # `mod_headers` can't match based on the content-type, however, we only
- # want to send this header for HTML pages and not for the other resources
-
- Header unset X-UA-Compatible
-
-
-
-# ------------------------------------------------------------------------------
-# | Cookie setting from iframes |
-# ------------------------------------------------------------------------------
-
-# Allow cookies to be set from iframes in IE.
-
-#
-# Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""
-#
-
-# ------------------------------------------------------------------------------
-# | Screen flicker |
-# ------------------------------------------------------------------------------
-
-# Stop screen flicker in IE on CSS rollovers (this only works in
-# combination with the `ExpiresByType` directives for images from below).
-
-# BrowserMatch "MSIE" brokenvary=1
-# BrowserMatch "Mozilla/4.[0-9]{2}" brokenvary=1
-# BrowserMatch "Opera" !brokenvary
-# SetEnvIf brokenvary 1 force-no-vary
-
-
-# ##############################################################################
-# # MIME TYPES AND ENCODING #
-# ##############################################################################
-
-# ------------------------------------------------------------------------------
-# | Proper MIME types for all files |
-# ------------------------------------------------------------------------------
-
-
-
- # Audio
- AddType audio/mp4 m4a f4a f4b
- AddType audio/ogg oga ogg
-
- # JavaScript
- # Normalize to standard type (it's sniffed in IE anyways):
- # http://tools.ietf.org/html/rfc4329#section-7.2
- AddType application/javascript js jsonp
- AddType application/json json
-
- # Video
- AddType video/mp4 mp4 m4v f4v f4p
- AddType video/ogg ogv
- AddType video/webm webm
- AddType video/x-flv flv
-
- # Web fonts
- AddType application/font-woff woff
- AddType application/vnd.ms-fontobject eot
-
- # Browsers usually ignore the font MIME types and sniff the content,
- # however, Chrome shows a warning if other MIME types are used for the
- # following fonts.
- AddType application/x-font-ttf ttc ttf
- AddType font/opentype otf
-
- # Make SVGZ fonts work on iPad:
- # https://twitter.com/FontSquirrel/status/14855840545
- AddType image/svg+xml svg svgz
- AddEncoding gzip svgz
-
- # Other
- AddType application/octet-stream safariextz
- AddType application/x-chrome-extension crx
- AddType application/x-opera-extension oex
- AddType application/x-shockwave-flash swf
- AddType application/x-web-app-manifest+json webapp
- AddType application/x-xpinstall xpi
- AddType application/xml atom rdf rss xml
- AddType image/webp webp
- AddType image/x-icon ico
- AddType text/cache-manifest appcache manifest
- AddType text/vtt vtt
- AddType text/x-component htc
- AddType text/x-vcard vcf
-
-
-
-# ------------------------------------------------------------------------------
-# | UTF-8 encoding |
-# ------------------------------------------------------------------------------
-
-# Use UTF-8 encoding for anything served as `text/html` or `text/plain`.
-AddDefaultCharset utf-8
-
-# Force UTF-8 for certain file formats.
-
- AddCharset utf-8 .atom .css .js .json .rss .vtt .webapp .xml
-
-
-
-# ##############################################################################
-# # URL REWRITES #
-# ##############################################################################
-
-# ------------------------------------------------------------------------------
-# | Rewrite engine |
-# ------------------------------------------------------------------------------
-
-# Turning on the rewrite engine and enabling the `FollowSymLinks` option is
-# necessary for the following directives to work.
-
-# If your web host doesn't allow the `FollowSymlinks` option, you may need to
-# comment it out and use `Options +SymLinksIfOwnerMatch` but, be aware of the
-# performance impact: http://httpd.apache.org/docs/current/misc/perf-tuning.html#symlinks
-
-# Also, some cloud hosting services require `RewriteBase` to be set:
-# http://www.rackspace.com/knowledge_center/frequently-asked-question/why-is-mod-rewrite-not-working-on-my-site
-
-
- Options +FollowSymlinks
- # Options +SymLinksIfOwnerMatch
- RewriteEngine On
- # RewriteBase /
-
-
-# ------------------------------------------------------------------------------
-# | Suppressing / Forcing the "www." at the beginning of URLs |
-# ------------------------------------------------------------------------------
-
-# The same content should never be available under two different URLs especially
-# not with and without "www." at the beginning. This can cause SEO problems
-# (duplicate content), therefore, you should choose one of the alternatives and
-# redirect the other one.
-
-# By default option 1 (no "www.") is activated:
-# http://no-www.org/faq.php?q=class_b
-
-# If you'd prefer to use option 2, just comment out all the lines from option 1
-# and uncomment the ones from option 2.
-
-# IMPORTANT: NEVER USE BOTH RULES AT THE SAME TIME!
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-# Option 1: rewrite www.example.com → example.com
-
-
- RewriteCond %{HTTPS} !=on
- RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
- RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
-
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-# Option 2: rewrite example.com → www.example.com
-
-# Be aware that the following might not be a good idea if you use "real"
-# subdomains for certain parts of your website.
-
-#
-# RewriteCond %{HTTPS} !=on
-# RewriteCond %{HTTP_HOST} !^www\..+$ [NC]
-# RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
-#
-
-
-# ##############################################################################
-# # SECURITY #
-# ##############################################################################
-
-# ------------------------------------------------------------------------------
-# | Content Security Policy (CSP) |
-# ------------------------------------------------------------------------------
-
-# You can mitigate the risk of cross-site scripting and other content-injection
-# attacks by setting a Content Security Policy which whitelists trusted sources
-# of content for your site.
-
-# The example header below allows ONLY scripts that are loaded from the current
-# site's origin (no inline scripts, no CDN, etc). This almost certainly won't
-# work as-is for your site!
-
-# To get all the details you'll need to craft a reasonable policy for your site,
-# read: http://html5rocks.com/en/tutorials/security/content-security-policy (or
-# see the specification: http://w3.org/TR/CSP).
-
-#
-# Header set Content-Security-Policy "script-src 'self'; object-src 'self'"
-#
-# Header unset Content-Security-Policy
-#
-#
-
-# ------------------------------------------------------------------------------
-# | File access |
-# ------------------------------------------------------------------------------
-
-# Block access to directories without a default document.
-# Usually you should leave this uncommented because you shouldn't allow anyone
-# to surf through every directory on your server (which may includes rather
-# private places like the CMS's directories).
-
-
- Options -Indexes
-
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-# Block access to hidden files and directories.
-# This includes directories used by version control systems such as Git and SVN.
-
-
- RewriteCond %{SCRIPT_FILENAME} -d [OR]
- RewriteCond %{SCRIPT_FILENAME} -f
- RewriteRule "(^|/)\." - [F]
-
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-# Block access to backup and source files.
-# These files may be left by some text editors and can pose a great security
-# danger when anyone has access to them.
-
-
- Order allow,deny
- Deny from all
- Satisfy All
-
-
-# ------------------------------------------------------------------------------
-# | Secure Sockets Layer (SSL) |
-# ------------------------------------------------------------------------------
-
-# Rewrite secure requests properly to prevent SSL certificate warnings, e.g.:
-# prevent `https://www.example.com` when your certificate only allows
-# `https://secure.example.com`.
-
-#
-# RewriteCond %{SERVER_PORT} !^443
-# RewriteRule ^ https://example-domain-please-change-me.com%{REQUEST_URI} [R=301,L]
-#
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-# Force client-side SSL redirection.
-
-# If a user types "example.com" in his browser, the above rule will redirect him
-# to the secure version of the site. That still leaves a window of opportunity
-# (the initial HTTP connection) for an attacker to downgrade or redirect the
-# request. The following header ensures that browser will ONLY connect to your
-# server via HTTPS, regardless of what the users type in the address bar.
-# http://www.html5rocks.com/en/tutorials/security/transport-layer-security/
-
-#
-# Header set Strict-Transport-Security max-age=16070400;
-#
-
-# ------------------------------------------------------------------------------
-# | Server software information |
-# ------------------------------------------------------------------------------
-
-# Avoid displaying the exact Apache version number, the description of the
-# generic OS-type and the information about Apache's compiled-in modules.
-
-# ADD THIS DIRECTIVE IN THE `httpd.conf` AS IT WILL NOT WORK IN THE `.htaccess`!
-
-# ServerTokens Prod
-
-
-# ##############################################################################
-# # WEB PERFORMANCE #
-# ##############################################################################
-
-# ------------------------------------------------------------------------------
-# | Compression |
-# ------------------------------------------------------------------------------
-
-
-
- # Force compression for mangled headers.
- # http://developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping
-
-
- SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
- RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
-
-
-
- # Compress all output labeled with one of the following MIME-types
- # (for Apache versions below 2.3.7, you don't need to enable `mod_filter`
- # and can remove the `` and `` lines
- # as `AddOutputFilterByType` is still in the core directives).
-
- AddOutputFilterByType DEFLATE application/atom+xml \
- application/javascript \
- application/json \
- application/rss+xml \
- application/vnd.ms-fontobject \
- application/x-font-ttf \
- application/x-web-app-manifest+json \
- application/xhtml+xml \
- application/xml \
- font/opentype \
- image/svg+xml \
- image/x-icon \
- text/css \
- text/html \
- text/plain \
- text/x-component \
- text/xml
-
-
-
-
-# ------------------------------------------------------------------------------
-# | Content transformations |
-# ------------------------------------------------------------------------------
-
-# Prevent some of the mobile network providers from modifying the content of
-# your site: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.5.
-
-#
-# Header set Cache-Control "no-transform"
-#
-
-# ------------------------------------------------------------------------------
-# | ETag removal |
-# ------------------------------------------------------------------------------
-
-# Since we're sending far-future expires headers (see below), ETags can
-# be removed: http://developer.yahoo.com/performance/rules.html#etags.
-
-# `FileETag None` is not enough for every server.
-
- Header unset ETag
-
-
-FileETag None
-
-# ------------------------------------------------------------------------------
-# | Expires headers (for better cache control) |
-# ------------------------------------------------------------------------------
-
-# The following expires headers are set pretty far in the future. If you don't
-# control versioning with filename-based cache busting, consider lowering the
-# cache time for resources like CSS and JS to something like 1 week.
-
-
-
- ExpiresActive on
- ExpiresDefault "access plus 1 month"
-
- # CSS
- ExpiresByType text/css "access plus 1 year"
-
- # Data interchange
- ExpiresByType application/json "access plus 0 seconds"
- ExpiresByType application/xml "access plus 0 seconds"
- ExpiresByType text/xml "access plus 0 seconds"
-
- # Favicon (cannot be renamed!)
- ExpiresByType image/x-icon "access plus 1 week"
-
- # HTML components (HTCs)
- ExpiresByType text/x-component "access plus 1 month"
-
- # HTML
- ExpiresByType text/html "access plus 0 seconds"
-
- # JavaScript
- ExpiresByType application/javascript "access plus 1 year"
-
- # Manifest files
- ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds"
- ExpiresByType text/cache-manifest "access plus 0 seconds"
-
- # Media
- ExpiresByType audio/ogg "access plus 1 month"
- ExpiresByType image/gif "access plus 1 month"
- ExpiresByType image/jpeg "access plus 1 month"
- ExpiresByType image/png "access plus 1 month"
- ExpiresByType video/mp4 "access plus 1 month"
- ExpiresByType video/ogg "access plus 1 month"
- ExpiresByType video/webm "access plus 1 month"
-
- # Web feeds
- ExpiresByType application/atom+xml "access plus 1 hour"
- ExpiresByType application/rss+xml "access plus 1 hour"
-
- # Web fonts
- ExpiresByType application/font-woff "access plus 1 month"
- ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
- ExpiresByType application/x-font-ttf "access plus 1 month"
- ExpiresByType font/opentype "access plus 1 month"
- ExpiresByType image/svg+xml "access plus 1 month"
-
-
-
-# ------------------------------------------------------------------------------
-# | Filename-based cache busting |
-# ------------------------------------------------------------------------------
-
-# If you're not using a build process to manage your filename version revving,
-# you might want to consider enabling the following directives to route all
-# requests such as `/css/style.12345.css` to `/css/style.css`.
-
-# To understand why this is important and a better idea than `*.css?v231`, read:
-# http://stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring
-
-#
-# RewriteCond %{REQUEST_FILENAME} !-f
-# RewriteCond %{REQUEST_FILENAME} !-d
-# RewriteRule ^(.+)\.(\d+)\.(js|css|png|jpg|gif)$ $1.$3 [L]
-#
-
-# ------------------------------------------------------------------------------
-# | File concatenation |
-# ------------------------------------------------------------------------------
-
-# Allow concatenation from within specific CSS and JS files, e.g.:
-# Inside of `script.combined.js` you could have
-#
-#
-# and they would be included into this single file.
-
-#
-#
-# Options +Includes
-# AddOutputFilterByType INCLUDES application/javascript application/json
-# SetOutputFilter INCLUDES
-#
-#
-# Options +Includes
-# AddOutputFilterByType INCLUDES text/css
-# SetOutputFilter INCLUDES
-#
-#
-
-# ------------------------------------------------------------------------------
-# | Persistent connections |
-# ------------------------------------------------------------------------------
-
-# Allow multiple requests to be sent over the same TCP connection:
-# http://httpd.apache.org/docs/current/en/mod/core.html#keepalive.
-
-# Enable if you serve a lot of static content but, be aware of the
-# possible disadvantages!
-
-#
-# Header set Connection Keep-Alive
-#
diff --git a/app/templates/client/.jshintrc b/app/templates/client/.jshintrc
deleted file mode 100644
index 52c6a6d79..000000000
--- a/app/templates/client/.jshintrc
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "node": true,
- "browser": true,
- "esnext": true,
- "bitwise": true,
- "camelcase": true,
- "curly": true,
- "eqeqeq": true,
- "immed": true,
- "indent": 2,
- "latedef": true,
- "newcap": true,
- "noarg": true,
- "quotmark": "single",
- "regexp": true,
- "undef": true,
- "unused": true,
- "strict": true,
- "trailing": true,
- "smarttabs": true,
- "globals": {
- "jQuery": true,
- "angular": true,
- "console": true,
- "$": true,
- "_": true,
- "moment": true,
- "describe": true,
- "beforeEach": true,
- "module": true,
- "inject": true,
- "it": true,
- "expect": true,
- "browser": true,
- "element": true,
- "by": true
- }
-}
diff --git a/app/templates/client/app/account(auth)/account(coffee).coffee b/app/templates/client/app/account(auth)/account(coffee).coffee
deleted file mode 100644
index 2b7b8b23b..000000000
--- a/app/templates/client/app/account(auth)/account(coffee).coffee
+++ /dev/null
@@ -1,35 +0,0 @@
-'use strict'
-
-angular.module '<%= scriptAppName %>'
-<% if(filters.ngroute) { %>.config ($routeProvider) ->
- $routeProvider
- .when '/login',
- templateUrl: 'app/account/login/login.html'
- controller: 'LoginCtrl'
-
- .when '/signup',
- templateUrl: 'app/account/signup/signup.html'
- controller: 'SignupCtrl'
-
- .when '/settings',
- templateUrl: 'app/account/settings/settings.html'
- controller: 'SettingsCtrl'
- authenticate: true
-<% } %><% if(filters.uirouter) { %>.config ($stateProvider) ->
- $stateProvider
- .state 'login',
- url: '/login'
- templateUrl: 'app/account/login/login.html'
- controller: 'LoginCtrl'
-
- .state 'signup',
- url: '/signup'
- templateUrl: 'app/account/signup/signup.html'
- controller: 'SignupCtrl'
-
- .state 'settings',
- url: '/settings'
- templateUrl: 'app/account/settings/settings.html'
- controller: 'SettingsCtrl'
- authenticate: true
-<% } %>
\ No newline at end of file
diff --git a/app/templates/client/app/account(auth)/account(js).js b/app/templates/client/app/account(auth)/account(js).js
deleted file mode 100644
index 0e30543a5..000000000
--- a/app/templates/client/app/account(auth)/account(js).js
+++ /dev/null
@@ -1,37 +0,0 @@
-'use strict';
-
-angular.module('<%= scriptAppName %>')
- <% if(filters.ngroute) { %>.config(function ($routeProvider) {
- $routeProvider
- .when('/login', {
- templateUrl: 'app/account/login/login.html',
- controller: 'LoginCtrl'
- })
- .when('/signup', {
- templateUrl: 'app/account/signup/signup.html',
- controller: 'SignupCtrl'
- })
- .when('/settings', {
- templateUrl: 'app/account/settings/settings.html',
- controller: 'SettingsCtrl',
- authenticate: true
- });
- });<% } %><% if(filters.uirouter) { %>.config(function ($stateProvider) {
- $stateProvider
- .state('login', {
- url: '/login',
- templateUrl: 'app/account/login/login.html',
- controller: 'LoginCtrl'
- })
- .state('signup', {
- url: '/signup',
- templateUrl: 'app/account/signup/signup.html',
- controller: 'SignupCtrl'
- })
- .state('settings', {
- url: '/settings',
- templateUrl: 'app/account/settings/settings.html',
- controller: 'SettingsCtrl',
- authenticate: true
- });
- });<% } %>
\ No newline at end of file
diff --git a/app/templates/client/app/account(auth)/login/login(html).html b/app/templates/client/app/account(auth)/login/login(html).html
deleted file mode 100644
index 572f2e144..000000000
--- a/app/templates/client/app/account(auth)/login/login(html).html
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
-
-
Login
-
Accounts are reset on server restart from server/config/seed.js. Default account is test@test.com / test
-
Admin account is admin@admin.com / admin
-
-
-
-
-
diff --git a/app/templates/client/app/account(auth)/login/login(jade).jade b/app/templates/client/app/account(auth)/login/login(jade).jade
deleted file mode 100644
index 4b13c0b13..000000000
--- a/app/templates/client/app/account(auth)/login/login(jade).jade
+++ /dev/null
@@ -1,54 +0,0 @@
-div(ng-include='"components/navbar/navbar.html"')
-.container
- .row
- .col-sm-12
- h1 Login
- p
- | Accounts are reset on server restart from
- code server/config/seed.js
- | . Default account is
- code test@test.com
- | /
- code test
- p
- | Admin account is
- code admin@admin.com
- | /
- code admin
-
- .col-sm-12
- form.form(name='form', ng-submit='login(form)', novalidate='')
- .form-group
- label Email
- input.form-control(type='text', name='email', ng-model='user.email')
- .form-group
- label Password
- input.form-control(type='password', name='password', ng-model='user.password')
-
- .form-group.has-error
- p.help-block(ng-show='form.email.$error.required && form.password.$error.required && submitted')
- | Please enter your email and password.
- p.help-block {{ errors.other }}
-
- div
- button.btn.btn-inverse.btn-lg.btn-login(type='submit')
- | Login
- = ' '
- a.btn.btn-default.btn-lg.btn-register(href='http://github.com/signup')
- | Register
-<% if(filters.oauth) {%>
- hr
-
- div<% if(filters.facebookAuth) {%>
- a.btn.btn-facebook(href='', ng-click='loginOauth("facebook")')
- i.fa.fa-facebook
- | Connect with Facebook
- = ' '<% } %><% if(filters.googleAuth) {%>
- a.btn.btn-google-plus(href='', ng-click='loginOauth("google")')
- i.fa.fa-google-plus
- | Connect with Google+
- = ' '<% } %><% if(filters.twitterAuth) {%>
- a.btn.btn-twitter(href='', ng-click='loginOauth("twitter")')
- i.fa.fa-twitter
- | Connect with Twitter<% } %><% } %>
- hr
diff --git a/app/templates/client/app/account(auth)/login/login(less).less b/app/templates/client/app/account(auth)/login/login(less).less
deleted file mode 100644
index bd01a056e..000000000
--- a/app/templates/client/app/account(auth)/login/login(less).less
+++ /dev/null
@@ -1,30 +0,0 @@
-<% if(filters.bootstrap) { %>// Colors
-// --------------------------------------------------
-
-@btnText: #fff;
-@btnTextAlt: #000;<% if (filters.oauth) { %>
-<% if (filters.facebookAuth) { %>
-@btnFacebookBackground: #3B5998;
-@btnFacebookBackgroundHighlight: #133783;<% } if (filters.twitterAuth) { %>
-@btnTwitterBackground: #2daddc;
-@btnTwitterBackgroundHighlight: #0271bf;<% } if (filters.googleAuth) { %>
-@btnGooglePlusBackground: #dd4b39;
-@btnGooglePlusBackgroundHighlight: #c53727;<% } %>
-@btnGithubBackground: #fafafa;
-@btnGithubBackgroundHighlight: #ccc;
-
-// Social buttons
-// --------------------------------------------------
-<% if (filters.facebookAuth) { %>
-.btn-facebook {
- .button-variant(@btnText; @btnFacebookBackgroundHighlight; @btnFacebookBackgroundHighlight);
-}<% } if (filters.twitterAuth) { %>
-.btn-twitter {
- .button-variant(@btnText; @btnTwitterBackground; @btnTwitterBackgroundHighlight);
-}<% } if (filters.googleAuth) { %>
-.btn-google-plus {
- .button-variant(@btnText; @btnGooglePlusBackground; @btnGooglePlusBackgroundHighlight);
-}<% } %>
-.btn-github {
- .button-variant(@btnTextAlt; @btnGithubBackground; @btnGithubBackgroundHighlight);
-}<% } %><% } %>
diff --git a/app/templates/client/app/account(auth)/login/login(sass).scss b/app/templates/client/app/account(auth)/login/login(sass).scss
deleted file mode 100644
index eb214a8ca..000000000
--- a/app/templates/client/app/account(auth)/login/login(sass).scss
+++ /dev/null
@@ -1,30 +0,0 @@
-<% if(filters.bootstrap) { %>// Colors
-// --------------------------------------------------
-
-$btnText: #fff;
-$btnTextAlt: #000;<% if (filters.oauth) { %>
-<% if (filters.facebookAuth) { %>
-$btnFacebookBackground: #3B5998;
-$btnFacebookBackgroundHighlight: #133783;<% } if (filters.twitterAuth) { %>
-$btnTwitterBackground: #2daddc;
-$btnTwitterBackgroundHighlight: #0271bf;<% } if (filters.googleAuth) { %>
-$btnGooglePlusBackground: #dd4b39;
-$btnGooglePlusBackgroundHighlight: #c53727;<% } %>
-$btnGithubBackground: #fafafa;
-$btnGithubBackgroundHighlight: #ccc;
-
-// Social buttons
-// --------------------------------------------------
-<% if (filters.facebookAuth) { %>
-.btn-facebook {
- @include button-variant($btnText, $btnFacebookBackgroundHighlight, $btnFacebookBackgroundHighlight);
-}<% } if (filters.twitterAuth) { %>
-.btn-twitter {
- @include button-variant($btnText, $btnTwitterBackground, $btnTwitterBackgroundHighlight);
-}<% } if (filters.googleAuth) { %>
-.btn-google-plus {
- @include button-variant($btnText, $btnGooglePlusBackground, $btnGooglePlusBackgroundHighlight);
-}<% } %>
-.btn-github {
- @include button-variant($btnTextAlt, $btnGithubBackground, $btnGithubBackgroundHighlight);
-}<% } %><% } %>
diff --git a/app/templates/client/app/account(auth)/login/login(stylus).styl b/app/templates/client/app/account(auth)/login/login(stylus).styl
deleted file mode 100644
index 3dc78ee9d..000000000
--- a/app/templates/client/app/account(auth)/login/login(stylus).styl
+++ /dev/null
@@ -1,22 +0,0 @@
-<% if (filters.oauth) { %>// Social buttons
-// --------------------------------------------------
-<% if (filters.facebookAuth) { %>
-.btn-facebook
- color: #fff;
- background-color: #3B5998;
- border-color: #133783;
-<% } if (filters.twitterAuth) { %>
-.btn-twitter
- color: #fff;
- background-color: #2daddc;
- border-color: #0271bf;
-<% } if (filters.googleAuth) { %>
-.btn-google-plus
- color: #fff;
- background-color: #dd4b39;
- border-color: #c53727;
-<% } %>
-.btn-github
- color: #fff;
- background-color: #fafafa;
- border-color: #ccc;<% } %>
diff --git a/app/templates/client/app/account(auth)/login/login.controller(coffee).coffee b/app/templates/client/app/account(auth)/login/login.controller(coffee).coffee
deleted file mode 100644
index 3f90c25d7..000000000
--- a/app/templates/client/app/account(auth)/login/login.controller(coffee).coffee
+++ /dev/null
@@ -1,23 +0,0 @@
-'use strict'
-
-angular.module '<%= scriptAppName %>'
-.controller 'LoginCtrl', ($scope, Auth, $location<% if(filters.oauth) {%>, $window<% } %>) ->
- $scope.user = {}
- $scope.errors = {}
- $scope.login = (form) ->
- $scope.submitted = true
-
- if form.$valid
- # Logged in, redirect to home
- Auth.login
- email: $scope.user.email
- password: $scope.user.password
-
- .then ->
- $location.path '/'
-
- .catch (err) ->
- $scope.errors.other = err.message
-<% if(filters.oauth) {%>
- $scope.loginOauth = (provider) ->
- $window.location.href = '/auth/' + provider<% } %>
diff --git a/app/templates/client/app/account(auth)/login/login.controller(js).js b/app/templates/client/app/account(auth)/login/login.controller(js).js
deleted file mode 100644
index 7b13da384..000000000
--- a/app/templates/client/app/account(auth)/login/login.controller(js).js
+++ /dev/null
@@ -1,29 +0,0 @@
-'use strict';
-
-angular.module('<%= scriptAppName %>')
- .controller('LoginCtrl', function ($scope, Auth, $location<% if (filters.oauth) { %>, $window<% } %>) {
- $scope.user = {};
- $scope.errors = {};
-
- $scope.login = function(form) {
- $scope.submitted = true;
-
- if(form.$valid) {
- Auth.login({
- email: $scope.user.email,
- password: $scope.user.password
- })
- .then( function() {
- // Logged in, redirect to home
- $location.path('/');
- })
- .catch( function(err) {
- $scope.errors.other = err.message;
- });
- }
- };
-<% if(filters.oauth) {%>
- $scope.loginOauth = function(provider) {
- $window.location.href = '/auth/' + provider;
- };<% } %>
- });
diff --git a/app/templates/client/app/account(auth)/settings/settings(html).html b/app/templates/client/app/account(auth)/settings/settings(html).html
deleted file mode 100644
index bb5d8ded0..000000000
--- a/app/templates/client/app/account(auth)/settings/settings(html).html
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
-
Change Password
-
-
-
-
\ No newline at end of file
diff --git a/app/templates/client/app/account(auth)/settings/settings(jade).jade b/app/templates/client/app/account(auth)/settings/settings(jade).jade
deleted file mode 100644
index 2dc55d402..000000000
--- a/app/templates/client/app/account(auth)/settings/settings(jade).jade
+++ /dev/null
@@ -1,21 +0,0 @@
-div(ng-include='"components/navbar/navbar.html"')
-.container
- .row
- .col-sm-12
- h1 Change Password
- .col-sm-12
- form.form(name='form', ng-submit='changePassword(form)', novalidate='')
- .form-group
- label Current Password
- input.form-control(type='password', name='password', ng-model='user.oldPassword', mongoose-error='')
- p.help-block(ng-show='form.password.$error.mongoose')
- | {{ errors.other }}
- .form-group
- label New Password
- input.form-control(type='password', name='newPassword', ng-model='user.newPassword', ng-minlength='3', required='')
- p.help-block(ng-show='(form.newPassword.$error.minlength || form.newPassword.$error.required) && (form.newPassword.$dirty || submitted)')
- | Password must be at least 3 characters.
-
- p.help-block {{ message }}
-
- button.btn.btn-lg.btn-primary(type='submit') Save changes
diff --git a/app/templates/client/app/account(auth)/settings/settings.controller(coffee).coffee b/app/templates/client/app/account(auth)/settings/settings.controller(coffee).coffee
deleted file mode 100644
index e058f167e..000000000
--- a/app/templates/client/app/account(auth)/settings/settings.controller(coffee).coffee
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict'
-
-angular.module '<%= scriptAppName %>'
-.controller 'SettingsCtrl', ($scope, User, Auth) ->
- $scope.errors = {}
- $scope.changePassword = (form) ->
- $scope.submitted = true
-
- if form.$valid
- Auth.changePassword $scope.user.oldPassword, $scope.user.newPassword
- .then ->
- $scope.message = 'Password successfully changed.'
-
- .catch ->
- form.password.$setValidity 'mongoose', false
- $scope.errors.other = 'Incorrect password'
- $scope.message = ''
diff --git a/app/templates/client/app/account(auth)/settings/settings.controller(js).js b/app/templates/client/app/account(auth)/settings/settings.controller(js).js
deleted file mode 100644
index 829bd8248..000000000
--- a/app/templates/client/app/account(auth)/settings/settings.controller(js).js
+++ /dev/null
@@ -1,21 +0,0 @@
-'use strict';
-
-angular.module('<%= scriptAppName %>')
- .controller('SettingsCtrl', function ($scope, User, Auth) {
- $scope.errors = {};
-
- $scope.changePassword = function(form) {
- $scope.submitted = true;
- if(form.$valid) {
- Auth.changePassword( $scope.user.oldPassword, $scope.user.newPassword )
- .then( function() {
- $scope.message = 'Password successfully changed.';
- })
- .catch( function() {
- form.password.$setValidity('mongoose', false);
- $scope.errors.other = 'Incorrect password';
- $scope.message = '';
- });
- }
- };
- });
diff --git a/app/templates/client/app/account(auth)/signup/signup(html).html b/app/templates/client/app/account(auth)/signup/signup(html).html
deleted file mode 100644
index 59faed568..000000000
--- a/app/templates/client/app/account(auth)/signup/signup(html).html
+++ /dev/null
@@ -1,82 +0,0 @@
-
-
-
diff --git a/app/templates/client/app/account(auth)/signup/signup(jade).jade b/app/templates/client/app/account(auth)/signup/signup(jade).jade
deleted file mode 100644
index 43815a21c..000000000
--- a/app/templates/client/app/account(auth)/signup/signup(jade).jade
+++ /dev/null
@@ -1,57 +0,0 @@
-div(ng-include='"components/navbar/navbar.html"')
-.container
- .row
- .col-sm-12
- h1 Sign up
- .col-sm-12
- form.form(name='form', ng-submit='register(form)', novalidate='')
- .form-group(ng-class='{ "has-success": form.name.$valid && submitted,\
- "has-error": form.name.$invalid && submitted }')
- label Name
- input.form-control(type='text', name='name', ng-model='user.name', required='')
- p.help-block(ng-show='form.name.$error.required && submitted')
- | A name is required
-
- .form-group(ng-class='{ "has-success": form.email.$valid && submitted,\
- "has-error": form.email.$invalid && submitted }')
- label Email
- input.form-control(type='email', name='email', ng-model='user.email', required='', mongoose-error='')
- p.help-block(ng-show='form.email.$error.email && submitted')
- | Doesn't look like a valid email.
- p.help-block(ng-show='form.email.$error.required && submitted')
- | What's your email address?
- p.help-block(ng-show='form.email.$error.mongoose')
- | {{ errors.email }}
-
- .form-group(ng-class='{ "has-success": form.password.$valid && submitted,\
- "has-error": form.password.$invalid && submitted }')
- label Password
- input.form-control(type='password', name='password', ng-model='user.password', ng-minlength='3', required='', mongoose-error='')
- p.help-block(ng-show='(form.password.$error.minlength || form.password.$error.required) && submitted')
- | Password must be at least 3 characters.
- p.help-block(ng-show='form.password.$error.mongoose')
- | {{ errors.password }}
-
- div
- button.btn.btn-inverse.btn-lg.btn-login(type='submit')
- | Sign up
- = ' '
- a.btn.btn-default.btn-lg.btn-register(href='http://github.com/login')
- | Login
-
-<% if(filters.oauth) {%>
- hr
-
- div<% if(filters.facebookAuth) {%>
- a.btn.btn-facebook(href='', ng-click='loginOauth("facebook")')
- i.fa.fa-facebook
- | Connect with Facebook
- = ' '<% } %><% if(filters.googleAuth) {%>
- a.btn.btn-google-plus(href='', ng-click='loginOauth("google")')
- i.fa.fa-google-plus
- | Connect with Google+
- = ' '<% } %><% if(filters.twitterAuth) {%>
- a.btn.btn-twitter(href='', ng-click='loginOauth("twitter")')
- i.fa.fa-twitter
- | Connect with Twitter<% } %><% } %>
- hr
diff --git a/app/templates/client/app/account(auth)/signup/signup.controller(coffee).coffee b/app/templates/client/app/account(auth)/signup/signup.controller(coffee).coffee
deleted file mode 100644
index 1b9c9696f..000000000
--- a/app/templates/client/app/account(auth)/signup/signup.controller(coffee).coffee
+++ /dev/null
@@ -1,30 +0,0 @@
-'use strict'
-
-angular.module '<%= scriptAppName %>'
-.controller 'SignupCtrl', ($scope, Auth, $location<% if(filters.oauth) {%>, $window<% } %>) ->
- $scope.user = {}
- $scope.errors = {}
- $scope.register = (form) ->
- $scope.submitted = true
-
- if form.$valid
- # Account created, redirect to home
- Auth.createUser
- name: $scope.user.name
- email: $scope.user.email
- password: $scope.user.password
-
- .then ->
- $location.path '/'
-
- .catch (err) ->
- err = err.data
- $scope.errors = {}
-
- # Update validity of form fields that match the mongoose errors
- angular.forEach err.errors, (error, field) ->
- form[field].$setValidity 'mongoose', false
- $scope.errors[field] = error.message
-<% if(filters.oauth) {%>
- $scope.loginOauth = (provider) ->
- $window.location.href = '/auth/' + provider<% } %>
diff --git a/app/templates/client/app/account(auth)/signup/signup.controller(js).js b/app/templates/client/app/account(auth)/signup/signup.controller(js).js
deleted file mode 100644
index 7d6ba3d38..000000000
--- a/app/templates/client/app/account(auth)/signup/signup.controller(js).js
+++ /dev/null
@@ -1,37 +0,0 @@
-'use strict';
-
-angular.module('<%= scriptAppName %>')
- .controller('SignupCtrl', function ($scope, Auth, $location<% if (filters.oauth) { %>, $window<% } %>) {
- $scope.user = {};
- $scope.errors = {};
-
- $scope.register = function(form) {
- $scope.submitted = true;
-
- if(form.$valid) {
- Auth.createUser({
- name: $scope.user.name,
- email: $scope.user.email,
- password: $scope.user.password
- })
- .then( function() {
- // Account created, redirect to home
- $location.path('/');
- })
- .catch( function(err) {
- err = err.data;
- $scope.errors = {};
-
- // Update validity of form fields that match the mongoose errors
- angular.forEach(err.errors, function(error, field) {
- form[field].$setValidity('mongoose', false);
- $scope.errors[field] = error.message;
- });
- });
- }
- };
-<% if(filters.oauth) {%>
- $scope.loginOauth = function(provider) {
- $window.location.href = '/auth/' + provider;
- };<% } %>
- });
diff --git a/app/templates/client/app/admin(auth)/admin(coffee).coffee b/app/templates/client/app/admin(auth)/admin(coffee).coffee
deleted file mode 100644
index a0497445e..000000000
--- a/app/templates/client/app/admin(auth)/admin(coffee).coffee
+++ /dev/null
@@ -1,15 +0,0 @@
-'use strict'
-
-angular.module '<%= scriptAppName %>'
-<% if(filters.ngroute) { %>.config ($routeProvider) ->
- $routeProvider
- .when '/admin',
- templateUrl: 'app/admin/admin.html'
- controller: 'AdminCtrl'
-<% } %><% if(filters.uirouter) { %>.config ($stateProvider) ->
- $stateProvider
- .state 'admin',
- url: '/admin'
- templateUrl: 'app/admin/admin.html'
- controller: 'AdminCtrl'
-<% } %>
\ No newline at end of file
diff --git a/app/templates/client/app/admin(auth)/admin(css).css b/app/templates/client/app/admin(auth)/admin(css).css
deleted file mode 100644
index a6f536dc5..000000000
--- a/app/templates/client/app/admin(auth)/admin(css).css
+++ /dev/null
@@ -1 +0,0 @@
-.trash { color:rgb(209, 91, 71); }
diff --git a/app/templates/client/app/admin(auth)/admin(html).html b/app/templates/client/app/admin(auth)/admin(html).html
deleted file mode 100644
index 5c27c7af2..000000000
--- a/app/templates/client/app/admin(auth)/admin(html).html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
The delete user and user index api routes are restricted to users with the 'admin' role.
-
- -
- {{user.name}}
- {{user.email}}
-
-
-
-
\ No newline at end of file
diff --git a/app/templates/client/app/admin(auth)/admin(jade).jade b/app/templates/client/app/admin(auth)/admin(jade).jade
deleted file mode 100644
index fd80a0bb6..000000000
--- a/app/templates/client/app/admin(auth)/admin(jade).jade
+++ /dev/null
@@ -1,11 +0,0 @@
-div(ng-include='"components/navbar/navbar.html"')
-.container
- p
- | The delete user and user index api routes are restricted to users with the 'admin' role.
- ul.list-group
- li.list-group-item(ng-repeat='user in users')
- strong {{user.name}}
- br
- span.text-muted {{user.email}}
- a.trash(ng-click='delete(user)')
- span.glyphicon.glyphicon-trash.pull-right
\ No newline at end of file
diff --git a/app/templates/client/app/admin(auth)/admin(js).js b/app/templates/client/app/admin(auth)/admin(js).js
deleted file mode 100644
index 270e8a974..000000000
--- a/app/templates/client/app/admin(auth)/admin(js).js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-
-angular.module('<%= scriptAppName %>')
- <% if(filters.ngroute) { %>.config(function ($routeProvider) {
- $routeProvider
- .when('/admin', {
- templateUrl: 'app/admin/admin.html',
- controller: 'AdminCtrl'
- });
- });<% } %><% if(filters.uirouter) { %>.config(function ($stateProvider) {
- $stateProvider
- .state('admin', {
- url: '/admin',
- templateUrl: 'app/admin/admin.html',
- controller: 'AdminCtrl'
- });
- });<% } %>
\ No newline at end of file
diff --git a/app/templates/client/app/admin(auth)/admin(less).less b/app/templates/client/app/admin(auth)/admin(less).less
deleted file mode 100644
index ad8202750..000000000
--- a/app/templates/client/app/admin(auth)/admin(less).less
+++ /dev/null
@@ -1 +0,0 @@
-.trash { color:rgb(209, 91, 71); }
\ No newline at end of file
diff --git a/app/templates/client/app/admin(auth)/admin(sass).scss b/app/templates/client/app/admin(auth)/admin(sass).scss
deleted file mode 100644
index a6f536dc5..000000000
--- a/app/templates/client/app/admin(auth)/admin(sass).scss
+++ /dev/null
@@ -1 +0,0 @@
-.trash { color:rgb(209, 91, 71); }
diff --git a/app/templates/client/app/admin(auth)/admin(stylus).styl b/app/templates/client/app/admin(auth)/admin(stylus).styl
deleted file mode 100644
index d57e50db5..000000000
--- a/app/templates/client/app/admin(auth)/admin(stylus).styl
+++ /dev/null
@@ -1,2 +0,0 @@
-.trash
- color rgb(209, 91, 71)
\ No newline at end of file
diff --git a/app/templates/client/app/admin(auth)/admin.controller(coffee).coffee b/app/templates/client/app/admin(auth)/admin.controller(coffee).coffee
deleted file mode 100644
index 7a16032da..000000000
--- a/app/templates/client/app/admin(auth)/admin.controller(coffee).coffee
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict'
-
-angular.module '<%= scriptAppName %>'
-.controller 'AdminCtrl', ($scope, $http, Auth, User) ->
-
- $http.get '/api/users'
- .success (users) ->
- $scope.users = users
-
- $scope.delete = (user) ->
- User.remove id: user._id
- _.remove $scope.users, user
\ No newline at end of file
diff --git a/app/templates/client/app/admin(auth)/admin.controller(js).js b/app/templates/client/app/admin(auth)/admin.controller(js).js
deleted file mode 100644
index dd6b09405..000000000
--- a/app/templates/client/app/admin(auth)/admin.controller(js).js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-
-angular.module('<%= scriptAppName %>')
- .controller('AdminCtrl', function ($scope, $http, Auth, User) {
-
- // Use the User $resource to fetch all users
- $scope.users = User.query();
-
- $scope.delete = function(user) {
- User.remove({ id: user._id });
- angular.forEach($scope.users, function(u, i) {
- if (u === user) {
- $scope.users.splice(i, 1);
- }
- });
- };
- });
diff --git a/app/templates/client/app/app(coffee).coffee b/app/templates/client/app/app(coffee).coffee
deleted file mode 100644
index ea9ae3c95..000000000
--- a/app/templates/client/app/app(coffee).coffee
+++ /dev/null
@@ -1,39 +0,0 @@
-'use strict'
-
-angular.module '<%= scriptAppName %>', [<%= angularModules %>]
-<% if(filters.ngroute) { %>.config ($routeProvider, $locationProvider<% if(filters.auth) { %>, $httpProvider<% } %>) ->
- $routeProvider
- .otherwise
- redirectTo: '/'
-
- $locationProvider.html5Mode true<% if(filters.auth) { %>
- $httpProvider.interceptors.push 'authInterceptor'<% } %>
-<% } %><% if(filters.uirouter) { %>.config ($stateProvider, $urlRouterProvider, $locationProvider<% if(filters.auth) { %>, $httpProvider<% } %>) ->
- $urlRouterProvider
- .otherwise '/'
-
- $locationProvider.html5Mode true<% if(filters.auth) { %>
- $httpProvider.interceptors.push 'authInterceptor'<% } %>
-<% } %><% if(filters.auth) { %>
-.factory 'authInterceptor', ($rootScope, $q, $cookieStore, $location) ->
- # Add authorization token to headers
- request: (config) ->
- config.headers = config.headers or {}
- config.headers.Authorization = 'Bearer ' + $cookieStore.get 'token' if $cookieStore.get 'token'
- config
-
- # Intercept 401s and redirect you to login
- responseError: (response) ->
- if response.status is 401
- $location.path '/login'
- # remove any stale tokens
- $cookieStore.remove 'token'
-
- $q.reject response
-
-.run ($rootScope, $location, Auth) ->
- # Redirect to login if route requires auth and you're not logged in
- $rootScope.$on <% if(filters.ngroute) { %>'$routeChangeStart'<% } %><% if(filters.uirouter) { %>'$stateChangeStart'<% } %>, (event, next) ->
- Auth.isLoggedInAsync (loggedIn) ->
- $location.path "/login" if next.authenticate and not loggedIn
-<% } %>
\ No newline at end of file
diff --git a/app/templates/client/app/app(css).css b/app/templates/client/app/app(css).css
deleted file mode 100644
index f1a61a918..000000000
--- a/app/templates/client/app/app(css).css
+++ /dev/null
@@ -1,46 +0,0 @@
-<% if(filters.bootstrap) { %>
-/**
- * Bootstrap Fonts
- */
-
-@font-face {
- font-family: 'Glyphicons Halflings';
- src: url('http://github.com/bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot');
- src: url('http://github.com/bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),
- url('http://github.com/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff') format('woff'),
- url('http://github.com/bower_components/bootstrap/fonts/glyphicons-halflings-regular.ttf') format('truetype'),
- url('http://github.com/bower_components/bootstrap/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
-}<% } %>
-
-/**
- *Font Awesome Fonts
- */
-
-@font-face {
- font-family: 'FontAwesome';
- src: url('http://github.com/bower_components/font-awesome/fonts/fontawesome-webfont.eot?v=4.1.0');
- src: url('http://github.com/bower_components/font-awesome/fonts/fontawesome-webfont.eot?#iefix&v=4.1.0') format('embedded-opentype'),
- url('http://github.com/bower_components/font-awesome/fonts/fontawesome-webfont.woff?v=4.1.0') format('woff'),
- url('http://github.com/bower_components/font-awesome/fonts/fontawesome-webfont.ttf?v=4.1.0') format('truetype'),
- url('http://github.com/bower_components/font-awesome/fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular') format('svg');
- font-weight: normal;
- font-style: normal;
-}
-
-/**
- * App-wide Styles
- */
-
-.browsehappy {
- margin: 0.2em 0;
- background: #ccc;
- color: #000;
- padding: 0.2em 0;
-}
-<% if (!filters.bootstrap) { %>
-/* Responsive: Portrait tablets and up */
-@media screen and (min-width: 768px) {
- .container {
- max-width: 730px;
- }
-}<% } %>
\ No newline at end of file
diff --git a/app/templates/client/app/app(js).js b/app/templates/client/app/app(js).js
deleted file mode 100644
index eef485d7c..000000000
--- a/app/templates/client/app/app(js).js
+++ /dev/null
@@ -1,55 +0,0 @@
-'use strict';
-
-angular.module('<%= scriptAppName %>', [<%= angularModules %>])
- <% if(filters.ngroute) { %>.config(function ($routeProvider, $locationProvider<% if(filters.auth) { %>, $httpProvider<% } %>) {
- $routeProvider
- .otherwise({
- redirectTo: '/'
- });
-
- $locationProvider.html5Mode(true);<% if(filters.auth) { %>
- $httpProvider.interceptors.push('authInterceptor');<% } %>
- })<% } %><% if(filters.uirouter) { %>.config(function ($stateProvider, $urlRouterProvider, $locationProvider<% if(filters.auth) { %>, $httpProvider<% } %>) {
- $urlRouterProvider
- .otherwise('/');
-
- $locationProvider.html5Mode(true);<% if(filters.auth) { %>
- $httpProvider.interceptors.push('authInterceptor');<% } %>
- })<% } %><% if(filters.auth) { %>
-
- .factory('authInterceptor', function ($rootScope, $q, $cookieStore, $location) {
- return {
- // Add authorization token to headers
- request: function (config) {
- config.headers = config.headers || {};
- if ($cookieStore.get('token')) {
- config.headers.Authorization = 'Bearer ' + $cookieStore.get('token');
- }
- return config;
- },
-
- // Intercept 401s and redirect you to login
- responseError: function(response) {
- if(response.status === 401) {
- $location.path('/login');
- // remove any stale tokens
- $cookieStore.remove('token');
- return $q.reject(response);
- }
- else {
- return $q.reject(response);
- }
- }
- };
- })
-
- .run(function ($rootScope, $location, Auth) {
- // Redirect to login if route requires auth and you're not logged in
- $rootScope.$on(<% if(filters.ngroute) { %>'$routeChangeStart'<% } %><% if(filters.uirouter) { %>'$stateChangeStart'<% } %>, function (event, next) {
- Auth.isLoggedInAsync(function(loggedIn) {
- if (next.authenticate && !loggedIn) {
- $location.path('/login');
- }
- });
- });
- })<% } %>;
\ No newline at end of file
diff --git a/app/templates/client/app/app(less).less b/app/templates/client/app/app(less).less
deleted file mode 100644
index 30639f539..000000000
--- a/app/templates/client/app/app(less).less
+++ /dev/null
@@ -1,29 +0,0 @@
-<% if(filters.bootstrap) { %>@import 'http://github.com/bootstrap/less/bootstrap.less';<% } %>
-@import 'http://github.com/font-awesome/less/font-awesome.less';
-
-<% if(filters.bootstrap) { %>@icon-font-path: '/bower_components/bootstrap/fonts/';<% } %>
-@fa-font-path: '/bower_components/font-awesome/fonts';
-
-/**
- * App-wide Styles
- */
-
-.browsehappy {
- margin: 0.2em 0;
- background: #ccc;
- color: #000;
- padding: 0.2em 0;
-}
-<% if (!filters.bootstrap) { %>
-/* Responsive: Portrait tablets and up */
-@media screen and (min-width: 768px) {
- .container {
- max-width: 730px;
- }
-}
-<% } %>
-// injector
-@import 'http://github.com/account/login/login.less';
-@import 'http://github.com/admin/admin.less';
-@import 'http://github.com/main/main.less';
-// endinjector
\ No newline at end of file
diff --git a/app/templates/client/app/app(sass).scss b/app/templates/client/app/app(sass).scss
deleted file mode 100644
index 4b8ae7a04..000000000
--- a/app/templates/client/app/app(sass).scss
+++ /dev/null
@@ -1,30 +0,0 @@
-<% if(filters.bootstrap) { %>$icon-font-path: "/bower_components/bootstrap-sass-official/vendor/assets/fonts/bootstrap/";<% } %>
-$fa-font-path: "/bower_components/font-awesome/fonts";
-<% if(filters.bootstrap) { %>
-@import 'http://github.com/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap';<% } %>
-@import 'http://github.com/font-awesome/scss/font-awesome';
-
-/**
- * App-wide Styles
- */
-
-.browsehappy {
- margin: 0.2em 0;
- background: #ccc;
- color: #000;
- padding: 0.2em 0;
-}
-<% if (!filters.bootstrap) { %>
-/* Responsive: Portrait tablets and up */
-@media screen and (min-width: 768px) {
- .container {
- max-width: 730px;
- }
-}
-<% } %>
-// Component styles are injected through grunt
-// injector
-@import 'http://github.com/account/login/login.scss';
-@import 'http://github.com/admin/admin.scss';
-@import 'http://github.com/main/main.scss';
-// endinjector
\ No newline at end of file
diff --git a/app/templates/client/app/app(stylus).styl b/app/templates/client/app/app(stylus).styl
deleted file mode 100644
index b7e4bb9c1..000000000
--- a/app/templates/client/app/app(stylus).styl
+++ /dev/null
@@ -1,50 +0,0 @@
-@import "http://github.com/font-awesome/css/font-awesome.css"
-<% if(filters.bootstrap) { %>@import "http://github.com/bootstrap/dist/css/bootstrap.css"
-
-//
-// Bootstrap Fonts
-//
-
-@font-face
- font-family: 'Glyphicons Halflings'
- src: url('http://github.com/bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot')
- src: url('http://github.com/bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),
- url('http://github.com/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff') format('woff'),
- url('http://github.com/bower_components/bootstrap/fonts/glyphicons-halflings-regular.ttf') format('truetype'),
- url('http://github.com/bower_components/bootstrap/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
-<% } %>
-//
-// Font Awesome Fonts
-//
-
-@font-face
- font-family: 'FontAwesome'
- src: url('http://github.com/bower_components/font-awesome/fonts/fontawesome-webfont.eot?v=4.1.0')
- src: url('http://github.com/bower_components/font-awesome/fonts/fontawesome-webfont.eot?#iefix&v=4.1.0') format('embedded-opentype'),
- url('http://github.com/bower_components/font-awesome/fonts/fontawesome-webfont.woff?v=4.1.0') format('woff'),
- url('http://github.com/bower_components/font-awesome/fonts/fontawesome-webfont.ttf?v=4.1.0') format('truetype'),
- url('http://github.com/bower_components/font-awesome/fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular') format('svg');
- font-weight: normal
- font-style: normal
-
-//
-// App-wide Styles
-//
-
-.browsehappy
- background #ccc
- color #000
- margin 0.2em 0
- padding 0.2em 0
-<% if (!filters.bootstrap) { %>
-// Responsive: Portrait tablets and up
-@media screen and (min-width: 768px)
- .container
- max-width 730px
-<% } %>
-// Component styles are injected through grunt
-// injector
-@import "http://github.com/account/login/login"
-@import "http://github.com/admin/admin"
-@import "http://github.com/main/main"
-// endinjector
\ No newline at end of file
diff --git a/app/templates/client/app/main/main(coffee).coffee b/app/templates/client/app/main/main(coffee).coffee
deleted file mode 100644
index 6d84bdc1e..000000000
--- a/app/templates/client/app/main/main(coffee).coffee
+++ /dev/null
@@ -1,15 +0,0 @@
-'use strict'
-
-angular.module '<%= scriptAppName %>'
-<% if(filters.ngroute) { %>.config ($routeProvider) ->
- $routeProvider
- .when '/',
- templateUrl: 'app/main/main.html'
- controller: 'MainCtrl'
-<% } %><% if(filters.uirouter) { %>.config ($stateProvider) ->
- $stateProvider
- .state 'main',
- url: '/'
- templateUrl: 'app/main/main.html'
- controller: 'MainCtrl'
-<% } %>
\ No newline at end of file
diff --git a/app/templates/client/app/main/main(css).css b/app/templates/client/app/main/main(css).css
deleted file mode 100644
index ba3408a00..000000000
--- a/app/templates/client/app/main/main(css).css
+++ /dev/null
@@ -1,30 +0,0 @@
-.thing-form {
- margin: 20px 0;
-}
-
-#banner {
- border-bottom: none;
- margin-top: -20px;
-}
-
-#banner h1 {
- font-size: 60px;
- line-height: 1;
- letter-spacing: -1px;
-}
-
-.hero-unit {
- position: relative;
- padding: 30px 15px;
- color: #F5F5F5;
- text-align: center;
- text-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
- background: #4393B9;
-}
-
-.footer {
- text-align: center;
- padding: 30px 0;
- margin-top: 70px;
- border-top: 1px solid #E5E5E5;
-}
\ No newline at end of file
diff --git a/app/templates/client/app/main/main(html).html b/app/templates/client/app/main/main(html).html
deleted file mode 100644
index cd0f185b2..000000000
--- a/app/templates/client/app/main/main(html).html
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
<% if(filters.socketio) { %>
-
-
<% } %>
-
-
-
diff --git a/app/templates/client/app/main/main(jade).jade b/app/templates/client/app/main/main(jade).jade
deleted file mode 100644
index 76784c855..000000000
--- a/app/templates/client/app/main/main(jade).jade
+++ /dev/null
@@ -1,33 +0,0 @@
-div(ng-include='"components/navbar/navbar.html"')
-
-header#banner.hero-unit
- .container
- h1 'Allo, 'Allo!
- p.lead Kick-start your next web app with Angular Fullstack
- img(src='http://github.com/assets/images/yeoman.png', alt='I\'m Yeoman')
-
-.container
- .row
- .col-lg-12
- h1.page-header Features:
- ul.nav.nav-tabs.nav-stacked.col-md-4.col-lg-4.col-sm-6(ng-repeat='thing in awesomeThings')
- li
- a(href='#', tooltip='{{thing.info}}')
- | {{thing.name}}<% if(filters.socketio) { %>
- button.close(type='button', ng-click='deleteThing(thing)') ×<% } %><% if(filters.socketio) { %>
-
- form.thing-form
- label Syncs in realtime across clients
- p.input-group
- input.form-control(type='text', placeholder='Add a new thing here.', ng-model='newThing')
- span.input-group-btn
- button.btn.btn-primary(type='submit', ng-click='addThing()') Add New<% } %>
-
-footer.footer
- .container
- p
- | Angular Fullstack v<%= pkg.version %>
- = ' | '
- a(href='https://twitter.com/tyhenkel') @tyhenkel
- = ' | '
- a(href='https://github.com/DaftMonk/generator-angular-fullstack/issues?state=open') Issues
\ No newline at end of file
diff --git a/app/templates/client/app/main/main(js).js b/app/templates/client/app/main/main(js).js
deleted file mode 100644
index 1d3bc318a..000000000
--- a/app/templates/client/app/main/main(js).js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-
-angular.module('<%= scriptAppName %>')
- <% if(filters.ngroute) { %>.config(function ($routeProvider) {
- $routeProvider
- .when('/', {
- templateUrl: 'app/main/main.html',
- controller: 'MainCtrl'
- });
- });<% } %><% if(filters.uirouter) { %>.config(function ($stateProvider) {
- $stateProvider
- .state('main', {
- url: '/',
- templateUrl: 'app/main/main.html',
- controller: 'MainCtrl'
- });
- });<% } %>
\ No newline at end of file
diff --git a/app/templates/client/app/main/main(less).less b/app/templates/client/app/main/main(less).less
deleted file mode 100644
index a289bac64..000000000
--- a/app/templates/client/app/main/main(less).less
+++ /dev/null
@@ -1,30 +0,0 @@
-.thing-form {
- margin: 20px 0;
-}
-
-#banner {
- border-bottom: none;
- margin-top: -20px;
-}
-
-#banner h1 {
- font-size: 60px;
- line-height: 1;
- letter-spacing: -1px;
-}
-
-.hero-unit {
- position: relative;
- padding: 30px 15px;
- color: #F5F5F5;
- text-align: center;
- text-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
- background: #4393B9;
-}
-
-.footer {
- text-align: center;
- padding: 30px 0;
- margin-top: 70px;
- border-top: 1px solid #E5E5E5;
-}
\ No newline at end of file
diff --git a/app/templates/client/app/main/main(sass).scss b/app/templates/client/app/main/main(sass).scss
deleted file mode 100644
index ba3408a00..000000000
--- a/app/templates/client/app/main/main(sass).scss
+++ /dev/null
@@ -1,30 +0,0 @@
-.thing-form {
- margin: 20px 0;
-}
-
-#banner {
- border-bottom: none;
- margin-top: -20px;
-}
-
-#banner h1 {
- font-size: 60px;
- line-height: 1;
- letter-spacing: -1px;
-}
-
-.hero-unit {
- position: relative;
- padding: 30px 15px;
- color: #F5F5F5;
- text-align: center;
- text-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
- background: #4393B9;
-}
-
-.footer {
- text-align: center;
- padding: 30px 0;
- margin-top: 70px;
- border-top: 1px solid #E5E5E5;
-}
\ No newline at end of file
diff --git a/app/templates/client/app/main/main(stylus).styl b/app/templates/client/app/main/main(stylus).styl
deleted file mode 100644
index 5cd9e4761..000000000
--- a/app/templates/client/app/main/main(stylus).styl
+++ /dev/null
@@ -1,25 +0,0 @@
-.thing-form
- margin 20px 0
-
-#banner
- border-bottom none
- margin-top -20px
-
-#banner h1
- font-size 60px
- letter-spacing -1px
- line-height 1
-
-.hero-unit
- background #4393B9
- color #F5F5F5
- padding 30px 15px
- position relative
- text-align center
- text-shadow 0 1px 0 rgba(0, 0, 0, 0.1)
-
-.footer
- border-top 1px solid #E5E5E5
- margin-top 70px
- padding 30px 0
- text-align center
\ No newline at end of file
diff --git a/app/templates/client/app/main/main.controller(coffee).coffee b/app/templates/client/app/main/main.controller(coffee).coffee
deleted file mode 100644
index 143e7f387..000000000
--- a/app/templates/client/app/main/main.controller(coffee).coffee
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict'
-
-angular.module '<%= scriptAppName %>'
-.controller 'MainCtrl', ($scope, $http<% if(filters.socketio) { %>, socket<% } %>) ->
- $scope.awesomeThings = []
-
- $http.get('/api/things').success (awesomeThings) ->
- $scope.awesomeThings = awesomeThings
- <% if(filters.socketio) { %>socket.syncUpdates 'thing', $scope.awesomeThings<% } %>
-<% if(filters.mongoose) { %>
- $scope.addThing = ->
- return if $scope.newThing is ''
- $http.post '/api/things',
- name: $scope.newThing
-
- $scope.newThing = ''
-
- $scope.deleteThing = (thing) ->
- $http.delete '/api/things/' + thing._id<% } %><% if(filters.socketio) { %>
-
- $scope.$on '$destroy', ->
- socket.unsyncUpdates 'thing'<% } %>
diff --git a/app/templates/client/app/main/main.controller(js).js b/app/templates/client/app/main/main.controller(js).js
deleted file mode 100644
index 433a10fe4..000000000
--- a/app/templates/client/app/main/main.controller(js).js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-angular.module('<%= scriptAppName %>')
- .controller('MainCtrl', function ($scope, $http<% if(filters.socketio) { %>, socket<% } %>) {
- $scope.awesomeThings = [];
-
- $http.get('/api/things').success(function(awesomeThings) {
- $scope.awesomeThings = awesomeThings;<% if(filters.socketio) { %>
- socket.syncUpdates('thing', $scope.awesomeThings);<% } %>
- });
-<% if(filters.mongoose) { %>
- $scope.addThing = function() {
- if($scope.newThing === '') {
- return;
- }
- $http.post('/api/things', { name: $scope.newThing });
- $scope.newThing = '';
- };
-
- $scope.deleteThing = function(thing) {
- $http.delete('/api/things/' + thing._id);
- };<% } %><% if(filters.socketio) { %>
-
- $scope.$on('$destroy', function () {
- socket.unsyncUpdates('thing');
- });<% } %>
- });
diff --git a/app/templates/client/app/main/main.controller.spec(coffee).coffee b/app/templates/client/app/main/main.controller.spec(coffee).coffee
deleted file mode 100644
index efe9b39a6..000000000
--- a/app/templates/client/app/main/main.controller.spec(coffee).coffee
+++ /dev/null
@@ -1,28 +0,0 @@
-'use strict'
-
-describe 'Controller: MainCtrl', ->
-
- # load the controller's module
- beforeEach module '<%= scriptAppName %>' <% if(filters.socketio) {%>
- beforeEach module 'socketMock' <% } %>
-
- MainCtrl = undefined
- scope = undefined
- $httpBackend = undefined
-
- # Initialize the controller and a mock scope
- beforeEach inject (_$httpBackend_, $controller, $rootScope) ->
- $httpBackend = _$httpBackend_
- $httpBackend.expectGET('/api/things').respond [
- 'HTML5 Boilerplate'
- 'AngularJS'
- 'Karma'
- 'Express'
- ]
- scope = $rootScope.$new()
- MainCtrl = $controller 'MainCtrl',
- $scope: scope
-
- it 'should attach a list of things to the scope', ->
- $httpBackend.flush()
- expect(scope.awesomeThings.length).toBe 4
\ No newline at end of file
diff --git a/app/templates/client/app/main/main.controller.spec(js).js b/app/templates/client/app/main/main.controller.spec(js).js
deleted file mode 100644
index 373e9db08..000000000
--- a/app/templates/client/app/main/main.controller.spec(js).js
+++ /dev/null
@@ -1,29 +0,0 @@
-'use strict';
-
-describe('Controller: MainCtrl', function () {
-
- // load the controller's module
- beforeEach(module('<%= scriptAppName %>'));<% if(filters.socketio) {%>
- beforeEach(module('socketMock'));<% } %>
-
- var MainCtrl,
- scope,
- $httpBackend;
-
- // Initialize the controller and a mock scope
- beforeEach(inject(function (_$httpBackend_, $controller, $rootScope) {
- $httpBackend = _$httpBackend_;
- $httpBackend.expectGET('/api/things')
- .respond(['HTML5 Boilerplate', 'AngularJS', 'Karma', 'Express']);
-
- scope = $rootScope.$new();
- MainCtrl = $controller('MainCtrl', {
- $scope: scope
- });
- }));
-
- it('should attach a list of things to the scope', function () {
- $httpBackend.flush();
- expect(scope.awesomeThings.length).toBe(4);
- });
-});
diff --git a/app/templates/client/components/auth(auth)/auth.service(coffee).coffee b/app/templates/client/components/auth(auth)/auth.service(coffee).coffee
deleted file mode 100644
index ac503ed0b..000000000
--- a/app/templates/client/components/auth(auth)/auth.service(coffee).coffee
+++ /dev/null
@@ -1,136 +0,0 @@
-'use strict'
-
-angular.module '<%= scriptAppName %>'
-.factory 'Auth', ($location, $rootScope, $http, User, $cookieStore, $q) ->
- currentUser = if $cookieStore.get 'token' then User.get() else {}
-
- ###
- Authenticate user and save token
-
- @param {Object} user - login info
- @param {Function} callback - optional
- @return {Promise}
- ###
- login: (user, callback) ->
- deferred = $q.defer()
- $http.post '/auth/local',
- email: user.email
- password: user.password
-
- .success (data) ->
- $cookieStore.put 'token', data.token
- currentUser = User.get()
- deferred.resolve data
- callback?()
-
- .error (err) =>
- @logout()
- deferred.reject err
- callback? err
-
- deferred.promise
-
-
- ###
- Delete access token and user info
-
- @param {Function}
- ###
- logout: ->
- $cookieStore.remove 'token'
- currentUser = {}
- return
-
-
- ###
- Create a new user
-
- @param {Object} user - user info
- @param {Function} callback - optional
- @return {Promise}
- ###
- createUser: (user, callback) ->
- User.save user,
- (data) ->
- $cookieStore.put 'token', data.token
- currentUser = User.get()
- callback? user
-
- , (err) =>
- @logout()
- callback? err
-
- .$promise
-
-
- ###
- Change password
-
- @param {String} oldPassword
- @param {String} newPassword
- @param {Function} callback - optional
- @return {Promise}
- ###
- changePassword: (oldPassword, newPassword, callback) ->
- User.changePassword
- id: currentUser._id
- ,
- oldPassword: oldPassword
- newPassword: newPassword
-
- , (user) ->
- callback? user
-
- , (err) ->
- callback? err
-
- .$promise
-
-
- ###
- Gets all available info on authenticated user
-
- @return {Object} user
- ###
- getCurrentUser: ->
- currentUser
-
-
- ###
- Check if a user is logged in synchronously
-
- @return {Boolean}
- ###
- isLoggedIn: ->
- currentUser.hasOwnProperty 'role'
-
-
- ###
- Waits for currentUser to resolve before checking if user is logged in
- ###
- isLoggedInAsync: (callback) ->
- if currentUser.hasOwnProperty '$promise'
- currentUser.$promise.then ->
- callback? true
- return
- .catch ->
- callback? false
- return
-
- else
- callback? currentUser.hasOwnProperty 'role'
-
- ###
- Check if a user is an admin
-
- @return {Boolean}
- ###
- isAdmin: ->
- currentUser.role is 'admin'
-
-
- ###
- Get auth token
- ###
- getToken: ->
- $cookieStore.get 'token'
diff --git a/app/templates/client/components/auth(auth)/auth.service(js).js b/app/templates/client/components/auth(auth)/auth.service(js).js
deleted file mode 100644
index 9afb12da9..000000000
--- a/app/templates/client/components/auth(auth)/auth.service(js).js
+++ /dev/null
@@ -1,146 +0,0 @@
-'use strict';
-
-angular.module('<%= scriptAppName %>')
- .factory('Auth', function Auth($location, $rootScope, $http, User, $cookieStore, $q) {
- var currentUser = {};
- if($cookieStore.get('token')) {
- currentUser = User.get();
- }
-
- return {
-
- /**
- * Authenticate user and save token
- *
- * @param {Object} user - login info
- * @param {Function} callback - optional
- * @return {Promise}
- */
- login: function(user, callback) {
- var cb = callback || angular.noop;
- var deferred = $q.defer();
-
- $http.post('/auth/local', {
- email: user.email,
- password: user.password
- }).
- success(function(data) {
- $cookieStore.put('token', data.token);
- currentUser = User.get();
- deferred.resolve(data);
- return cb();
- }).
- error(function(err) {
- this.logout();
- deferred.reject(err);
- return cb(err);
- }.bind(this));
-
- return deferred.promise;
- },
-
- /**
- * Delete access token and user info
- *
- * @param {Function}
- */
- logout: function() {
- $cookieStore.remove('token');
- currentUser = {};
- },
-
- /**
- * Create a new user
- *
- * @param {Object} user - user info
- * @param {Function} callback - optional
- * @return {Promise}
- */
- createUser: function(user, callback) {
- var cb = callback || angular.noop;
-
- return User.save(user,
- function(data) {
- $cookieStore.put('token', data.token);
- currentUser = User.get();
- return cb(user);
- },
- function(err) {
- this.logout();
- return cb(err);
- }.bind(this)).$promise;
- },
-
- /**
- * Change password
- *
- * @param {String} oldPassword
- * @param {String} newPassword
- * @param {Function} callback - optional
- * @return {Promise}
- */
- changePassword: function(oldPassword, newPassword, callback) {
- var cb = callback || angular.noop;
-
- return User.changePassword({ id: currentUser._id }, {
- oldPassword: oldPassword,
- newPassword: newPassword
- }, function(user) {
- return cb(user);
- }, function(err) {
- return cb(err);
- }).$promise;
- },
-
- /**
- * Gets all available info on authenticated user
- *
- * @return {Object} user
- */
- getCurrentUser: function() {
- return currentUser;
- },
-
- /**
- * Check if a user is logged in
- *
- * @return {Boolean}
- */
- isLoggedIn: function() {
- return currentUser.hasOwnProperty('role');
- },
-
- /**
- * Waits for currentUser to resolve before checking if user is logged in
- */
- isLoggedInAsync: function(cb) {
- if(currentUser.hasOwnProperty('$promise')) {
- currentUser.$promise.then(function() {
- cb(true);
- }).catch(function() {
- cb(false);
- });
- } else if(currentUser.hasOwnProperty('role')) {
- cb(true);
- } else {
- cb(false);
- }
- },
-
- /**
- * Check if a user is an admin
- *
- * @return {Boolean}
- */
- isAdmin: function() {
- return currentUser.role === 'admin';
- },
-
- /**
- * Get auth token
- */
- getToken: function() {
- return $cookieStore.get('token');
- }
- };
- });
diff --git a/app/templates/client/components/auth(auth)/user.service(coffee).coffee b/app/templates/client/components/auth(auth)/user.service(coffee).coffee
deleted file mode 100644
index e0dc2e839..000000000
--- a/app/templates/client/components/auth(auth)/user.service(coffee).coffee
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict'
-
-angular.module '<%= scriptAppName %>'
-.factory 'User', ($resource) ->
- $resource '/api/users/:id/:controller',
- id: '@_id'
- ,
- changePassword:
- method: 'PUT'
- params:
- controller: 'password'
-
- get:
- method: 'GET'
- params:
- id: 'me'
-
diff --git a/app/templates/client/components/auth(auth)/user.service(js).js b/app/templates/client/components/auth(auth)/user.service(js).js
deleted file mode 100644
index c41fe8312..000000000
--- a/app/templates/client/components/auth(auth)/user.service(js).js
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict';
-
-angular.module('<%= scriptAppName %>')
- .factory('User', function ($resource) {
- return $resource('/api/users/:id/:controller', {
- id: '@_id'
- },
- {
- changePassword: {
- method: 'PUT',
- params: {
- controller:'password'
- }
- },
- get: {
- method: 'GET',
- params: {
- id:'me'
- }
- }
- });
- });
diff --git a/app/templates/client/components/modal(uibootstrap)/modal(css).css b/app/templates/client/components/modal(uibootstrap)/modal(css).css
deleted file mode 100644
index f5cc0d9e7..000000000
--- a/app/templates/client/components/modal(uibootstrap)/modal(css).css
+++ /dev/null
@@ -1,23 +0,0 @@
-.modal-primary .modal-header,
-.modal-info .modal-header,
-.modal-success .modal-header,
-.modal-warning .modal-header,
-.modal-danger .modal-header {
- color: #fff;
- border-radius: 5px 5px 0 0;
-}
-.modal-primary .modal-header {
- background: #428bca;
-}
-.modal-info .modal-header {
- background: #5bc0de;
-}
-.modal-success .modal-header {
- background: #5cb85c;
-}
-.modal-warning .modal-header {
- background: #f0ad4e;
-}
-.modal-danger .modal-header {
- background: #d9534f;
-}
\ No newline at end of file
diff --git a/app/templates/client/components/modal(uibootstrap)/modal(html).html b/app/templates/client/components/modal(uibootstrap)/modal(html).html
deleted file mode 100644
index 4580254ff..000000000
--- a/app/templates/client/components/modal(uibootstrap)/modal(html).html
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/app/templates/client/components/modal(uibootstrap)/modal(jade).jade b/app/templates/client/components/modal(uibootstrap)/modal(jade).jade
deleted file mode 100644
index 71b4321b3..000000000
--- a/app/templates/client/components/modal(uibootstrap)/modal(jade).jade
+++ /dev/null
@@ -1,8 +0,0 @@
-.modal-header
- button.close(ng-if='modal.dismissable', type='button', ng-click='$dismiss()') ×
- h4.modal-title(ng-if='modal.title', ng-bind='modal.title')
-.modal-body
- p(ng-if='modal.text', ng-bind='modal.text')
- div(ng-if='modal.html', ng-bind-html='modal.html')
-.modal-footer
- button.btn(ng-repeat='button in modal.buttons', ng-class='button.classes', ng-click='button.click($event)', ng-bind='button.text')
diff --git a/app/templates/client/components/modal(uibootstrap)/modal(less).less b/app/templates/client/components/modal(uibootstrap)/modal(less).less
deleted file mode 100644
index dd1357d2c..000000000
--- a/app/templates/client/components/modal(uibootstrap)/modal(less).less
+++ /dev/null
@@ -1,25 +0,0 @@
-.modal-primary,
-.modal-info,
-.modal-success,
-.modal-warning,
-.modal-danger {
- .modal-header {
- color: #fff;
- border-radius: 5px 5px 0 0;
- }
-}
-.modal-primary .modal-header {
- background: @brand-primary;
-}
-.modal-info .modal-header {
- background: @brand-info;
-}
-.modal-success .modal-header {
- background: @brand-success;
-}
-.modal-warning .modal-header {
- background: @brand-warning;
-}
-.modal-danger .modal-header {
- background: @brand-danger;
-}
diff --git a/app/templates/client/components/modal(uibootstrap)/modal(sass).scss b/app/templates/client/components/modal(uibootstrap)/modal(sass).scss
deleted file mode 100644
index 3b0b9d96a..000000000
--- a/app/templates/client/components/modal(uibootstrap)/modal(sass).scss
+++ /dev/null
@@ -1,25 +0,0 @@
-.modal-primary,
-.modal-info,
-.modal-success,
-.modal-warning,
-.modal-danger {
- .modal-header {
- color: #fff;
- border-radius: 5px 5px 0 0;
- }
-}
-.modal-primary .modal-header {
- background: $brand-primary;
-}
-.modal-info .modal-header {
- background: $brand-info;
-}
-.modal-success .modal-header {
- background: $brand-success;
-}
-.modal-warning .modal-header {
- background: $brand-warning;
-}
-.modal-danger .modal-header {
- background: $brand-danger;
-}
diff --git a/app/templates/client/components/modal(uibootstrap)/modal(stylus).styl b/app/templates/client/components/modal(uibootstrap)/modal(stylus).styl
deleted file mode 100644
index d394ee047..000000000
--- a/app/templates/client/components/modal(uibootstrap)/modal(stylus).styl
+++ /dev/null
@@ -1,23 +0,0 @@
-.modal-primary
-.modal-info
-.modal-success
-.modal-warning
-.modal-danger
- .modal-header
- color #fff
- border-radius 5px 5px 0 0
-
-.modal-primary .modal-header
- background #428bca
-
-.modal-info .modal-header
- background #5bc0de
-
-.modal-success .modal-header
- background #5cb85c
-
-.modal-warning .modal-header
- background #f0ad4e
-
-.modal-danger .modal-header
- background #d9534f
diff --git a/app/templates/client/components/modal(uibootstrap)/modal.service(coffee).coffee b/app/templates/client/components/modal(uibootstrap)/modal.service(coffee).coffee
deleted file mode 100644
index eae01f69f..000000000
--- a/app/templates/client/components/modal(uibootstrap)/modal.service(coffee).coffee
+++ /dev/null
@@ -1,71 +0,0 @@
-'use strict'
-
-angular.module '<%= scriptAppName %>'
-.factory 'Modal', ($rootScope, $modal) ->
-
- ###
- Opens a modal
- @param {Object} scope - an object to be merged with modal's scope
- @param {String} modalClass - (optional) class(es) to be applied to the modal
- @return {Object} - the instance $modal.open() returns
- ###
- openModal = (scope, modalClass) ->
- modalScope = $rootScope.$new()
- scope = scope or {}
- modalClass = modalClass or 'modal-default'
- angular.extend modalScope, scope
- $modal.open
- templateUrl: 'components/modal/modal.html'
- windowClass: modalClass
- scope: modalScope
-
-
- # Public API here
-
- # Confirmation modals
- confirm:
-
- ###
- Create a function to open a delete confirmation modal (ex. ng-click='myModalFn(name, arg1, arg2...)')
- @param {Function} del - callback, ran when delete is confirmed
- @return {Function} - the function to open the modal (ex. myModalFn)
- ###
- delete: (del) ->
- del = del or angular.noop
-
- ###
- Open a delete confirmation modal
- @param {String} name - name or info to show on modal
- @param {All} - any additional args are passed staight to del callback
- ###
- ->
- args = Array::slice.call arguments
- name = args.shift()
- deleteModal = undefined
- deleteModal = openModal(
- modal:
- dismissable: true
- title: 'Confirm Delete'
- html: 'Are you sure you want to delete ' + name + ' ?
'
- buttons: [
- {
- classes: 'btn-danger'
- text: 'Delete'
- click: (e) ->
- deleteModal.close e
- return
- }
- {
- classes: 'btn-default'
- text: 'Cancel'
- click: (e) ->
- deleteModal.dismiss e
- return
- }
- ]
- , 'modal-danger')
- deleteModal.result.then (event) ->
- del.apply event, args
- return
-
- return
diff --git a/app/templates/client/components/modal(uibootstrap)/modal.service(js).js b/app/templates/client/components/modal(uibootstrap)/modal.service(js).js
deleted file mode 100644
index f01200174..000000000
--- a/app/templates/client/components/modal(uibootstrap)/modal.service(js).js
+++ /dev/null
@@ -1,77 +0,0 @@
-'use strict';
-
-angular.module('<%= scriptAppName %>')
- .factory('Modal', function ($rootScope, $modal) {
- /**
- * Opens a modal
- * @param {Object} scope - an object to be merged with modal's scope
- * @param {String} modalClass - (optional) class(es) to be applied to the modal
- * @return {Object} - the instance $modal.open() returns
- */
- function openModal(scope, modalClass) {
- var modalScope = $rootScope.$new();
- scope = scope || {};
- modalClass = modalClass || 'modal-default';
-
- angular.extend(modalScope, scope);
-
- return $modal.open({
- templateUrl: 'components/modal/modal.html',
- windowClass: modalClass,
- scope: modalScope
- });
- }
-
- // Public API here
- return {
-
- /* Confirmation modals */
- confirm: {
-
- /**
- * Create a function to open a delete confirmation modal (ex. ng-click='myModalFn(name, arg1, arg2...)')
- * @param {Function} del - callback, ran when delete is confirmed
- * @return {Function} - the function to open the modal (ex. myModalFn)
- */
- delete: function(del) {
- del = del || angular.noop;
-
- /**
- * Open a delete confirmation modal
- * @param {String} name - name or info to show on modal
- * @param {All} - any additional args are passed staight to del callback
- */
- return function() {
- var args = Array.prototype.slice.call(arguments),
- name = args.shift(),
- deleteModal;
-
- deleteModal = openModal({
- modal: {
- dismissable: true,
- title: 'Confirm Delete',
- html: 'Are you sure you want to delete ' + name + ' ?
',
- buttons: [{
- classes: 'btn-danger',
- text: 'Delete',
- click: function(e) {
- deleteModal.close(e);
- }
- }, {
- classes: 'btn-default',
- text: 'Cancel',
- click: function(e) {
- deleteModal.dismiss(e);
- }
- }]
- }
- }, 'modal-danger');
-
- deleteModal.result.then(function(event) {
- del.apply(event, args);
- });
- };
- }
- }
- };
- });
diff --git a/app/templates/client/components/mongoose-error(auth)/mongoose-error.directive(coffee).coffee b/app/templates/client/components/mongoose-error(auth)/mongoose-error.directive(coffee).coffee
deleted file mode 100644
index d255f614d..000000000
--- a/app/templates/client/components/mongoose-error(auth)/mongoose-error.directive(coffee).coffee
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict'
-
-###
-Removes server error when user updates input
-###
-angular.module '<%= scriptAppName %>'
-.directive 'mongooseError', ->
- restrict: 'A'
- require: 'ngModel'
- link: (scope, element, attrs, ngModel) ->
- element.on 'keydown', ->
- ngModel.$setValidity 'mongoose', true
\ No newline at end of file
diff --git a/app/templates/client/components/mongoose-error(auth)/mongoose-error.directive(js).js b/app/templates/client/components/mongoose-error(auth)/mongoose-error.directive(js).js
deleted file mode 100644
index 8a331009b..000000000
--- a/app/templates/client/components/mongoose-error(auth)/mongoose-error.directive(js).js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-
-/**
- * Removes server error when user updates input
- */
-angular.module('<%= scriptAppName %>')
- .directive('mongooseError', function () {
- return {
- restrict: 'A',
- require: 'ngModel',
- link: function(scope, element, attrs, ngModel) {
- element.on('keydown', function() {
- return ngModel.$setValidity('mongoose', true);
- });
- }
- };
- });
\ No newline at end of file
diff --git a/app/templates/client/components/navbar/navbar(html).html b/app/templates/client/components/navbar/navbar(html).html
deleted file mode 100644
index 71f8606dd..000000000
--- a/app/templates/client/components/navbar/navbar(html).html
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
<% if(filters.auth) { %>
-
-
<% } %>
-
-
-
diff --git a/app/templates/client/components/navbar/navbar(jade).jade b/app/templates/client/components/navbar/navbar(jade).jade
deleted file mode 100644
index 2b17f29c3..000000000
--- a/app/templates/client/components/navbar/navbar(jade).jade
+++ /dev/null
@@ -1,34 +0,0 @@
-div.navbar.navbar-default.navbar-static-top(ng-controller='NavbarCtrl')
- div.container
- div.navbar-header
- button.navbar-toggle(type='button', ng-click='isCollapsed = !isCollapsed')
- span.sr-only Toggle navigation
- span.icon-bar
- span.icon-bar
- span.icon-bar
- a.navbar-brand(href='http://github.com/') <%= _.slugify(_.humanize(appname)) %>
-
- div#navbar-main.navbar-collapse.collapse(collapse='isCollapsed')
- ul.nav.navbar-nav
- li(ng-repeat='item in menu', ng-class='{active: isActive(item.link)}')
- a(ng-href='http://github.com/%7B%7Bitem.link%7D%7D') {{item.title}}<% if(filters.auth) { %>
-
- li(ng-show='isAdmin()', ng-class='{active: isActive("/admin")}')
- a(href='http://github.com/admin') Admin<% } %><% if(filters.auth) { %>
-
- ul.nav.navbar-nav.navbar-right
- li(ng-hide='isLoggedIn()', ng-class='{active: isActive("/signup")}')
- a(href='http://github.com/signup') Sign up
-
- li(ng-hide='isLoggedIn()', ng-class='{active: isActive("/login")}')
- a(href='http://github.com/login') Login
-
- li(ng-show='isLoggedIn()')
- p.navbar-text Hello {{ getCurrentUser().name }}
-
- li(ng-show='isLoggedIn()', ng-class='{active: isActive("/settings")}')
- a(href='http://github.com/settings')
- span.glyphicon.glyphicon-cog
-
- li(ng-show='isLoggedIn()', ng-class='{active: isActive("/logout")}')
- a(href='', ng-click='logout()') Logout<% } %>
\ No newline at end of file
diff --git a/app/templates/client/components/navbar/navbar.controller(coffee).coffee b/app/templates/client/components/navbar/navbar.controller(coffee).coffee
deleted file mode 100644
index d3804c5eb..000000000
--- a/app/templates/client/components/navbar/navbar.controller(coffee).coffee
+++ /dev/null
@@ -1,19 +0,0 @@
-'use strict'
-
-angular.module '<%= scriptAppName %>'
-.controller 'NavbarCtrl', ($scope, $location<% if(filters.auth) {%>, Auth<% } %>) ->
- $scope.menu = [
- title: 'Home'
- link: '/'
- ]
- $scope.isCollapsed = true<% if(filters.auth) {%>
- $scope.isLoggedIn = Auth.isLoggedIn
- $scope.isAdmin = Auth.isAdmin
- $scope.getCurrentUser = Auth.getCurrentUser
-
- $scope.logout = ->
- Auth.logout()
- $location.path '/login'<% } %>
-
- $scope.isActive = (route) ->
- route is $location.path()
\ No newline at end of file
diff --git a/app/templates/client/components/navbar/navbar.controller(js).js b/app/templates/client/components/navbar/navbar.controller(js).js
deleted file mode 100644
index 4ce9dbcb5..000000000
--- a/app/templates/client/components/navbar/navbar.controller(js).js
+++ /dev/null
@@ -1,23 +0,0 @@
-'use strict';
-
-angular.module('<%= scriptAppName %>')
- .controller('NavbarCtrl', function ($scope, $location<% if(filters.auth) {%>, Auth<% } %>) {
- $scope.menu = [{
- 'title': 'Home',
- 'link': '/'
- }];
-
- $scope.isCollapsed = true;<% if(filters.auth) {%>
- $scope.isLoggedIn = Auth.isLoggedIn;
- $scope.isAdmin = Auth.isAdmin;
- $scope.getCurrentUser = Auth.getCurrentUser;
-
- $scope.logout = function() {
- Auth.logout();
- $location.path('/login');
- };<% } %>
-
- $scope.isActive = function(route) {
- return route === $location.path();
- };
- });
\ No newline at end of file
diff --git a/app/templates/client/components/socket(socketio)/socket.mock(coffee).coffee b/app/templates/client/components/socket(socketio)/socket.mock(coffee).coffee
deleted file mode 100644
index 6f565bbc2..000000000
--- a/app/templates/client/components/socket(socketio)/socket.mock(coffee).coffee
+++ /dev/null
@@ -1,15 +0,0 @@
-'use strict'
-
-angular.module 'socketMock', []
-.factory 'socket', ->
- socket:
- connect: ->
-
- on: ->
-
- emit: ->
-
- receive: ->
-
- syncUpdates: ->
- unsyncUpdates: ->
diff --git a/app/templates/client/components/socket(socketio)/socket.mock.js b/app/templates/client/components/socket(socketio)/socket.mock.js
deleted file mode 100644
index 84a2e0c36..000000000
--- a/app/templates/client/components/socket(socketio)/socket.mock.js
+++ /dev/null
@@ -1,16 +0,0 @@
-'use strict';
-
-angular.module('socketMock', [])
- .factory('socket', function() {
- return {
- socket: {
- connect: function() {},
- on: function() {},
- emit: function() {},
- receive: function() {}
- },
-
- syncUpdates: function() {},
- unsyncUpdates: function() {}
- };
- });
\ No newline at end of file
diff --git a/app/templates/client/components/socket(socketio)/socket.service(coffee).coffee b/app/templates/client/components/socket(socketio)/socket.service(coffee).coffee
deleted file mode 100644
index 3fef1c00e..000000000
--- a/app/templates/client/components/socket(socketio)/socket.service(coffee).coffee
+++ /dev/null
@@ -1,67 +0,0 @@
-# global io
-
-'use strict'
-
-angular.module '<%= scriptAppName %>'
-.factory 'socket', (socketFactory) ->
-
- # socket.io now auto-configures its connection when we omit a connection url
- ioSocket = io '',
- # Send auth token on connection, you will need to DI the Auth service above
- # 'query': 'token=' + Auth.getToken()
- path: '/socket.io-client'
-
- socket = socketFactory ioSocket: ioSocket
-
- socket: socket
-
- ###
- Register listeners to sync an array with updates on a model
-
- Takes the array we want to sync, the model name that socket updates are sent from,
- and an optional callback function after new items are updated.
-
- @param {String} modelName
- @param {Array} array
- @param {Function} callback
- ###
- syncUpdates: (modelName, array, callback) ->
-
- ###
- Syncs item creation/updates on 'model:save'
- ###
- socket.on modelName + ':save', (item) ->
- oldItem = _.find array,
- _id: item._id
-
- index = array.indexOf oldItem
- event = 'created'
-
- # replace oldItem if it exists
- # otherwise just add item to the collection
- if oldItem
- array.splice index, 1, item
- event = 'updated'
- else
- array.push item
-
- callback? event, item, array
-
- ###
- Syncs removed items on 'model:remove'
- ###
- socket.on modelName + ':remove', (item) ->
- event = 'deleted'
- _.remove array,
- _id: item._id
-
- callback? event, item, array
-
- ###
- Removes listeners for a models updates on the socket
-
- @param modelName
- ###
- unsyncUpdates: (modelName) ->
- socket.removeAllListeners modelName + ':save'
- socket.removeAllListeners modelName + ':remove'
diff --git a/app/templates/client/components/socket(socketio)/socket.service.js b/app/templates/client/components/socket(socketio)/socket.service.js
deleted file mode 100644
index 549f2d764..000000000
--- a/app/templates/client/components/socket(socketio)/socket.service.js
+++ /dev/null
@@ -1,74 +0,0 @@
-/* global io */
-'use strict';
-
-angular.module('<%= scriptAppName %>')
- .factory('socket', function(socketFactory) {
-
- // socket.io now auto-configures its connection when we ommit a connection url
- var ioSocket = io('', {
- // Send auth token on connection, you will need to DI the Auth service above
- // 'query': 'token=' + Auth.getToken()
- path: '/socket.io-client'
- });
-
- var socket = socketFactory({
- ioSocket: ioSocket
- });
-
- return {
- socket: socket,
-
- /**
- * Register listeners to sync an array with updates on a model
- *
- * Takes the array we want to sync, the model name that socket updates are sent from,
- * and an optional callback function after new items are updated.
- *
- * @param {String} modelName
- * @param {Array} array
- * @param {Function} cb
- */
- syncUpdates: function (modelName, array, cb) {
- cb = cb || angular.noop;
-
- /**
- * Syncs item creation/updates on 'model:save'
- */
- socket.on(modelName + ':save', function (item) {
- var oldItem = _.find(array, {_id: item._id});
- var index = array.indexOf(oldItem);
- var event = 'created';
-
- // replace oldItem if it exists
- // otherwise just add item to the collection
- if (oldItem) {
- array.splice(index, 1, item);
- event = 'updated';
- } else {
- array.push(item);
- }
-
- cb(event, item, array);
- });
-
- /**
- * Syncs removed items on 'model:remove'
- */
- socket.on(modelName + ':remove', function (item) {
- var event = 'deleted';
- _.remove(array, {_id: item._id});
- cb(event, item, array);
- });
- },
-
- /**
- * Removes listeners for a models updates on the socket
- *
- * @param modelName
- */
- unsyncUpdates: function (modelName) {
- socket.removeAllListeners(modelName + ':save');
- socket.removeAllListeners(modelName + ':remove');
- }
- };
- });
diff --git a/app/templates/client/index.html b/app/templates/client/index.html
deleted file mode 100644
index e823e372d..000000000
--- a/app/templates/client/index.html
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <% if(filters.ngroute) { %><% } %><% if(filters.uirouter) { %><% } %>
-
-
-
-
-
-
-
- <% if(filters.socketio) { %>
- <% } %>
-
-
-
-
-
-
-
-
-
diff --git a/app/templates/e2e/main/main.po.js b/app/templates/e2e/main/main.po.js
deleted file mode 100644
index 6718608c7..000000000
--- a/app/templates/e2e/main/main.po.js
+++ /dev/null
@@ -1,15 +0,0 @@
-/**
- * This file uses the Page Object pattern to define the main page for tests
- * https://docs.google.com/presentation/d/1B6manhG0zEXkC-H-tPo2vwU06JhL8w9-XCF9oehXzAQ
- */
-
-'use strict';
-
-var MainPage = function() {
- this.heroEl = element(by.css('.hero-unit'));
- this.h1El = this.heroEl.element(by.css('h1'));
- this.imgEl = this.heroEl.element(by.css('img'));
-};
-
-module.exports = new MainPage();
-
diff --git a/app/templates/e2e/main/main.spec.js b/app/templates/e2e/main/main.spec.js
deleted file mode 100644
index 61745a8de..000000000
--- a/app/templates/e2e/main/main.spec.js
+++ /dev/null
@@ -1,16 +0,0 @@
-'use strict';
-
-describe('Main View', function() {
- var page;
-
- beforeEach(function() {
- browser.get('/');
- page = require('./main.po');
- });
-
- it('should include jumbotron with correct data', function() {
- expect(page.h1El.getText()).toBe('\'Allo, \'Allo!');
- expect(page.imgEl.getAttribute('src')).toMatch(/assets\/images\/yeoman.png$/);
- expect(page.imgEl.getAttribute('alt')).toBe('I\'m Yeoman');
- });
-});
diff --git a/app/templates/karma.conf.js b/app/templates/karma.conf.js
deleted file mode 100644
index 57b3fa6f2..000000000
--- a/app/templates/karma.conf.js
+++ /dev/null
@@ -1,81 +0,0 @@
-// Karma configuration
-// http://karma-runner.github.io/0.10/config/configuration-file.html
-
-module.exports = function(config) {
- config.set({
- // base path, that will be used to resolve files and exclude
- basePath: '',
-
- // testing framework to use (jasmine/mocha/qunit/...)
- frameworks: ['jasmine'],
-
- // list of files / patterns to load in the browser
- files: [
- 'client/bower_components/jquery/dist/jquery.js',
- 'client/bower_components/angular/angular.js',
- 'client/bower_components/angular-mocks/angular-mocks.js',
- 'client/bower_components/angular-resource/angular-resource.js',
- 'client/bower_components/angular-cookies/angular-cookies.js',
- 'client/bower_components/angular-sanitize/angular-sanitize.js',
- 'client/bower_components/angular-route/angular-route.js',<% if(filters.uibootstrap) { %>
- 'client/bower_components/angular-bootstrap/ui-bootstrap-tpls.js',<% } %>
- 'client/bower_components/lodash/dist/lodash.compat.js',<% if(filters.socketio) { %>
- 'client/bower_components/angular-socket-io/socket.js',<% } %><% if(filters.uirouter) { %>
- 'client/bower_components/angular-ui-router/release/angular-ui-router.js',<% } %>
- 'client/app/app.js',
- 'client/app/app.coffee',
- 'client/app/**/*.js',
- 'client/app/**/*.coffee',
- 'client/components/**/*.js',
- 'client/components/**/*.coffee',
- 'client/app/**/*.jade',
- 'client/components/**/*.jade',
- 'client/app/**/*.html',
- 'client/components/**/*.html'
- ],
-
- preprocessors: {
- '**/*.jade': 'ng-jade2js',
- '**/*.html': 'html2js',
- '**/*.coffee': 'coffee',
- },
-
- ngHtml2JsPreprocessor: {
- stripPrefix: 'client/'
- },
-
- ngJade2JsPreprocessor: {
- stripPrefix: 'client/'
- },
-
- // list of files / patterns to exclude
- exclude: [],
-
- // web server port
- port: 8080,
-
- // level of logging
- // possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
- logLevel: config.LOG_INFO,
-
-
- // enable / disable watching file and executing tests whenever any file changes
- autoWatch: false,
-
-
- // Start these browsers, currently available:
- // - Chrome
- // - ChromeCanary
- // - Firefox
- // - Opera
- // - Safari (only Mac)
- // - PhantomJS
- // - IE (only Windows)
- browsers: ['PhantomJS'],
-
-
- // Continuous Integration mode
- // if true, it capture browsers, run tests and exit
- singleRun: false
- });
-};
diff --git a/app/templates/protractor.conf.js b/app/templates/protractor.conf.js
deleted file mode 100644
index cb66c67c1..000000000
--- a/app/templates/protractor.conf.js
+++ /dev/null
@@ -1,50 +0,0 @@
-// Protractor configuration
-// https://github.com/angular/protractor/blob/master/referenceConf.js
-
-'use strict';
-
-exports.config = {
- // The timeout for each script run on the browser. This should be longer
- // than the maximum time your application needs to stabilize between tasks.
- allScriptsTimeout: 110000,
-
- // A base URL for your application under test. Calls to protractor.get()
- // with relative paths will be prepended with this.
- baseUrl: 'http://localhost/' + (process.env.PORT || '9000'),
-
- // If true, only chromedriver will be started, not a standalone selenium.
- // Tests for browsers other than chrome will not run.
- chromeOnly: true,
-
- // list of files / patterns to load in the browser
- specs: [
- 'e2e/**/*.spec.js'
- ],
-
- // Patterns to exclude.
- exclude: [],
-
- // ----- Capabilities to be passed to the webdriver instance ----
- //
- // For a full list of available capabilities, see
- // https://code.google.com/p/selenium/wiki/DesiredCapabilities
- // and
- // https://code.google.com/p/selenium/source/browse/javascript/webdriver/capabilities.js
- capabilities: {
- 'browserName': 'chrome'
- },
-
- // ----- The test framework -----
- //
- // Jasmine and Cucumber are fully supported as a test and assertion framework.
- // Mocha has limited beta support. You will need to include your own
- // assertion framework if working with mocha.
- framework: 'jasmine',
-
- // ----- Options to be passed to minijasminenode -----
- //
- // See the full list at https://github.com/juliemr/minijasminenode
- jasmineNodeOpts: {
- defaultTimeoutInterval: 30000
- }
-};
diff --git a/app/templates/server/.jshintrc b/app/templates/server/.jshintrc
deleted file mode 100644
index d7b958e7c..000000000
--- a/app/templates/server/.jshintrc
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "node": true,
- "esnext": true,
- "bitwise": true,
- "eqeqeq": true,
- "immed": true,
- "latedef": "nofunc",
- "newcap": true,
- "noarg": true,
- "regexp": true,
- "undef": true,
- "smarttabs": true,
- "asi": true,
- "debug": true
-}
diff --git a/app/templates/server/.jshintrc-spec b/app/templates/server/.jshintrc-spec
deleted file mode 100644
index b6b55cbf9..000000000
--- a/app/templates/server/.jshintrc-spec
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "extends": ".jshintrc",
- "globals": {
- "describe": true,
- "it": true,
- "before": true,
- "beforeEach": true,
- "after": true,
- "afterEach": true
- }
-}
diff --git a/app/templates/server/api/thing/index.js b/app/templates/server/api/thing/index.js
deleted file mode 100644
index 242ed5901..000000000
--- a/app/templates/server/api/thing/index.js
+++ /dev/null
@@ -1,15 +0,0 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./thing.controller');
-
-var router = express.Router();
-
-router.get('/', controller.index);<% if(filters.mongoose) { %>
-router.get('/:id', controller.show);
-router.post('/', controller.create);
-router.put('/:id', controller.update);
-router.patch('/:id', controller.update);
-router.delete('/:id', controller.destroy);<% } %>
-
-module.exports = router;
\ No newline at end of file
diff --git a/app/templates/server/api/thing/thing.controller.js b/app/templates/server/api/thing/thing.controller.js
deleted file mode 100644
index ba84d6fc9..000000000
--- a/app/templates/server/api/thing/thing.controller.js
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET /things -> index
- * POST /things -> create
- * GET /things/:id -> show
- * PUT /things/:id -> update
- * DELETE /things/:id -> destroy
- */
-
-'use strict';
-
-var _ = require('lodash');<% if (filters.mongoose) { %>
-var Thing = require('./thing.model');<% } %>
-
-// Get list of things
-exports.index = function(req, res) {<% if (!filters.mongoose) { %>
- res.json([
- {
- name : 'Development Tools',
- info : 'Integration with popular tools such as Bower, Grunt, Karma, Mocha, JSHint, Node Inspector, Livereload, Protractor, Jade, Stylus, Sass, CoffeeScript, and Less.'
- }, {
- name : 'Server and Client integration',
- info : 'Built with a powerful and fun stack: MongoDB, Express, AngularJS, and Node.'
- }, {
- name : 'Smart Build System',
- info : 'Build system ignores `spec` files, allowing you to keep tests alongside code. Automatic injection of scripts and styles into your index.html'
- }, {
- name : 'Modular Structure',
- info : 'Best practice client and server structures allow for more code reusability and maximum scalability'
- }, {
- name : 'Optimized Build',
- info : 'Build process packs up your templates as a single JavaScript payload, minifies your scripts/css/images, and rewrites asset names for caching.'
- },{
- name : 'Deployment Ready',
- info : 'Easily deploy your app to Heroku or Openshift with the heroku and openshift subgenerators'
- }
- ]);<% } %><% if (filters.mongoose) { %>
- Thing.find(function (err, things) {
- if(err) { return handleError(res, err); }
- return res.json(200, things);
- });<% } %>
-};<% if (filters.mongoose) { %>
-
-// Get a single thing
-exports.show = function(req, res) {
- Thing.findById(req.params.id, function (err, thing) {
- if(err) { return handleError(res, err); }
- if(!thing) { return res.send(404); }
- return res.json(thing);
- });
-};
-
-// Creates a new thing in the DB.
-exports.create = function(req, res) {
- Thing.create(req.body, function(err, thing) {
- if(err) { return handleError(res, err); }
- return res.json(201, thing);
- });
-};
-
-// Updates an existing thing in the DB.
-exports.update = function(req, res) {
- if(req.body._id) { delete req.body._id; }
- Thing.findById(req.params.id, function (err, thing) {
- if (err) { return handleError(res, err); }
- if(!thing) { return res.send(404); }
- var updated = _.merge(thing, req.body);
- updated.save(function (err) {
- if (err) { return handleError(res, err); }
- return res.json(200, thing);
- });
- });
-};
-
-// Deletes a thing from the DB.
-exports.destroy = function(req, res) {
- Thing.findById(req.params.id, function (err, thing) {
- if(err) { return handleError(res, err); }
- if(!thing) { return res.send(404); }
- thing.remove(function(err) {
- if(err) { return handleError(res, err); }
- return res.send(204);
- });
- });
-};
-
-function handleError(res, err) {
- return res.send(500, err);
-}<% } %>
\ No newline at end of file
diff --git a/app/templates/server/api/thing/thing.model(mongoose).js b/app/templates/server/api/thing/thing.model(mongoose).js
deleted file mode 100644
index ed857cd3b..000000000
--- a/app/templates/server/api/thing/thing.model(mongoose).js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-
-var mongoose = require('mongoose'),
- Schema = mongoose.Schema;
-
-var ThingSchema = new Schema({
- name: String,
- info: String,
- active: Boolean
-});
-
-module.exports = mongoose.model('Thing', ThingSchema);
\ No newline at end of file
diff --git a/app/templates/server/api/thing/thing.socket(socketio).js b/app/templates/server/api/thing/thing.socket(socketio).js
deleted file mode 100644
index 79d327695..000000000
--- a/app/templates/server/api/thing/thing.socket(socketio).js
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-var thing = require('./thing.model');
-
-exports.register = function(socket) {
- thing.schema.post('save', function (doc) {
- onSave(socket, doc);
- });
- thing.schema.post('remove', function (doc) {
- onRemove(socket, doc);
- });
-}
-
-function onSave(socket, doc, cb) {
- socket.emit('thing:save', doc);
-}
-
-function onRemove(socket, doc, cb) {
- socket.emit('thing:remove', doc);
-}
\ No newline at end of file
diff --git a/app/templates/server/api/thing/thing.spec.js b/app/templates/server/api/thing/thing.spec.js
deleted file mode 100644
index 17c8c6cd0..000000000
--- a/app/templates/server/api/thing/thing.spec.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-var should = require('should');
-var app = require('../../app');
-var request = require('supertest');
-
-describe('GET /api/things', function() {
-
- it('should respond with JSON array', function(done) {
- request(app)
- .get('/api/things')
- .expect(200)
- .expect('Content-Type', /json/)
- .end(function(err, res) {
- if (err) return done(err);
- res.body.should.be.instanceof(Array);
- done();
- });
- });
-});
diff --git a/app/templates/server/api/user(auth)/user.controller.js b/app/templates/server/api/user(auth)/user.controller.js
deleted file mode 100644
index f4cd10c29..000000000
--- a/app/templates/server/api/user(auth)/user.controller.js
+++ /dev/null
@@ -1,101 +0,0 @@
-'use strict';
-
-var User = require('./user.model');
-var passport = require('passport');
-var config = require('../../config/environment');
-var jwt = require('jsonwebtoken');
-
-var validationError = function(res, err) {
- return res.json(422, err);
-};
-
-/**
- * Get list of users
- * restriction: 'admin'
- */
-exports.index = function(req, res) {
- User.find({}, '-salt -hashedPassword', function (err, users) {
- if(err) return res.send(500, err);
- res.json(200, users);
- });
-};
-
-/**
- * Creates a new user
- */
-exports.create = function (req, res, next) {
- var newUser = new User(req.body);
- newUser.provider = 'local';
- newUser.role = 'user';
- newUser.save(function(err, user) {
- if (err) return validationError(res, err);
- var token = jwt.sign({_id: user._id }, config.secrets.session, { expiresInMinutes: 60*5 });
- res.json({ token: token });
- });
-};
-
-/**
- * Get a single user
- */
-exports.show = function (req, res, next) {
- var userId = req.params.id;
-
- User.findById(userId, function (err, user) {
- if (err) return next(err);
- if (!user) return res.send(401);
- res.json(user.profile);
- });
-};
-
-/**
- * Deletes a user
- * restriction: 'admin'
- */
-exports.destroy = function(req, res) {
- User.findByIdAndRemove(req.params.id, function(err, user) {
- if(err) return res.send(500, err);
- return res.send(204);
- });
-};
-
-/**
- * Change a users password
- */
-exports.changePassword = function(req, res, next) {
- var userId = req.user._id;
- var oldPass = String(req.body.oldPassword);
- var newPass = String(req.body.newPassword);
-
- User.findById(userId, function (err, user) {
- if(user.authenticate(oldPass)) {
- user.password = newPass;
- user.save(function(err) {
- if (err) return validationError(res, err);
- res.send(200);
- });
- } else {
- res.send(403);
- }
- });
-};
-
-/**
- * Get my info
- */
-exports.me = function(req, res, next) {
- var userId = req.user._id;
- User.findOne({
- _id: userId
- }, '-salt -hashedPassword', function(err, user) { // don't ever give out the password or salt
- if (err) return next(err);
- if (!user) return res.json(401);
- res.json(user);
- });
-};
-
-/**
- * Authentication callback
- */
-exports.authCallback = function(req, res, next) {
- res.redirect('/');
-};
diff --git a/app/templates/server/api/user(auth)/user.model.js b/app/templates/server/api/user(auth)/user.model.js
deleted file mode 100644
index cc8d59263..000000000
--- a/app/templates/server/api/user(auth)/user.model.js
+++ /dev/null
@@ -1,149 +0,0 @@
-'use strict';
-
-var mongoose = require('mongoose');
-var Schema = mongoose.Schema;
-var crypto = require('crypto');<% if(filters.oauth) { %>
-var authTypes = ['github', 'twitter', 'facebook', 'google'];<% } %>
-
-var UserSchema = new Schema({
- name: String,
- email: { type: String, lowercase: true },
- role: {
- type: String,
- default: 'user'
- },
- hashedPassword: String,
- provider: String,
- salt: String<% if (filters.oauth) { %>,<% if (filters.facebookAuth) { %>
- facebook: {},<% } %><% if (filters.twitterAuth) { %>
- twitter: {},<% } %><% if (filters.googleAuth) { %>
- google: {},<% } %>
- github: {}<% } %>
-});
-
-/**
- * Virtuals
- */
-UserSchema
- .virtual('password')
- .set(function(password) {
- this._password = password;
- this.salt = this.makeSalt();
- this.hashedPassword = this.encryptPassword(password);
- })
- .get(function() {
- return this._password;
- });
-
-// Public profile information
-UserSchema
- .virtual('profile')
- .get(function() {
- return {
- 'name': this.name,
- 'role': this.role
- };
- });
-
-// Non-sensitive info we'll be putting in the token
-UserSchema
- .virtual('token')
- .get(function() {
- return {
- '_id': this._id,
- 'role': this.role
- };
- });
-
-/**
- * Validations
- */
-
-// Validate empty email
-UserSchema
- .path('email')
- .validate(function(email) {<% if (filters.oauth) { %>
- if (authTypes.indexOf(this.provider) !== -1) return true;<% } %>
- return email.length;
- }, 'Email cannot be blank');
-
-// Validate empty password
-UserSchema
- .path('hashedPassword')
- .validate(function(hashedPassword) {<% if (filters.oauth) { %>
- if (authTypes.indexOf(this.provider) !== -1) return true;<% } %>
- return hashedPassword.length;
- }, 'Password cannot be blank');
-
-// Validate email is not taken
-UserSchema
- .path('email')
- .validate(function(value, respond) {
- var self = this;
- this.constructor.findOne({email: value}, function(err, user) {
- if(err) throw err;
- if(user) {
- if(self.id === user.id) return respond(true);
- return respond(false);
- }
- respond(true);
- });
-}, 'The specified email address is already in use.');
-
-var validatePresenceOf = function(value) {
- return value && value.length;
-};
-
-/**
- * Pre-save hook
- */
-UserSchema
- .pre('save', function(next) {
- if (!this.isNew) return next();
-
- if (!validatePresenceOf(this.hashedPassword)<% if (filters.oauth) { %> && authTypes.indexOf(this.provider) === -1<% } %>)
- next(new Error('Invalid password'));
- else
- next();
- });
-
-/**
- * Methods
- */
-UserSchema.methods = {
- /**
- * Authenticate - check if the passwords are the same
- *
- * @param {String} plainText
- * @return {Boolean}
- * @api public
- */
- authenticate: function(plainText) {
- return this.encryptPassword(plainText) === this.hashedPassword;
- },
-
- /**
- * Make salt
- *
- * @return {String}
- * @api public
- */
- makeSalt: function() {
- return crypto.randomBytes(16).toString('base64');
- },
-
- /**
- * Encrypt password
- *
- * @param {String} password
- * @return {String}
- * @api public
- */
- encryptPassword: function(password) {
- if (!password || !this.salt) return '';
- var salt = new Buffer(this.salt, 'base64');
- return crypto.pbkdf2Sync(password, salt, 10000, 64).toString('base64');
- }
-};
-
-module.exports = mongoose.model('User', UserSchema);
diff --git a/app/templates/server/api/user(auth)/user.model.spec.js b/app/templates/server/api/user(auth)/user.model.spec.js
deleted file mode 100644
index 257c95b7c..000000000
--- a/app/templates/server/api/user(auth)/user.model.spec.js
+++ /dev/null
@@ -1,60 +0,0 @@
-'use strict';
-
-var should = require('should');
-var app = require('../../app');
-var User = require('./user.model');
-
-var user = new User({
- provider: 'local',
- name: 'Fake User',
- email: 'test@test.com',
- password: 'password'
-});
-
-describe('User Model', function() {
- before(function(done) {
- // Clear users before testing
- User.remove().exec().then(function() {
- done();
- });
- });
-
- afterEach(function(done) {
- User.remove().exec().then(function() {
- done();
- });
- });
-
- it('should begin with no users', function(done) {
- User.find({}, function(err, users) {
- users.should.have.length(0);
- done();
- });
- });
-
- it('should fail when saving a duplicate user', function(done) {
- user.save(function() {
- var userDup = new User(user);
- userDup.save(function(err) {
- should.exist(err);
- done();
- });
- });
- });
-
- it('should fail when saving without an email', function(done) {
- user.email = '';
- user.save(function(err) {
- should.exist(err);
- done();
- });
- });
-
- it("should authenticate user if password is valid", function() {
- return user.authenticate('password').should.be.true;
- });
-
- it("should not authenticate user if password is invalid", function() {
- return user.authenticate('blah').should.not.be.true;
- });
-});
diff --git a/app/templates/server/app.js b/app/templates/server/app.js
deleted file mode 100644
index 08b942f43..000000000
--- a/app/templates/server/app.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * Main application file
- */
-
-'use strict';
-
-// Set default node environment to development
-process.env.NODE_ENV = process.env.NODE_ENV || 'development';
-
-var express = require('express');<% if (filters.mongoose) { %>
-var mongoose = require('mongoose');<% } %>
-var config = require('./config/environment');
-<% if (filters.mongoose) { %>
-// Connect to database
-mongoose.connect(config.mongo.uri, config.mongo.options);
-
-// Populate DB with sample data
-if(config.seedDB) { require('./config/seed'); }
-
-<% } %>// Setup server
-var app = express();
-var server = require('http').createServer(app);<% if (filters.socketio) { %>
-var socketio = require('socket.io')(server, {
- serveClient: (config.env === 'production') ? false : true,
- path: '/socket.io-client'
-});
-require('./config/socketio')(socketio);<% } %>
-require('./config/express')(app);
-require('./routes')(app);
-
-// Start server
-server.listen(config.port, config.ip, function () {
- console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
-});
-
-// Expose app
-exports = module.exports = app;
\ No newline at end of file
diff --git a/app/templates/server/auth(auth)/auth.service.js b/app/templates/server/auth(auth)/auth.service.js
deleted file mode 100644
index 38ec34302..000000000
--- a/app/templates/server/auth(auth)/auth.service.js
+++ /dev/null
@@ -1,76 +0,0 @@
-'use strict';
-
-var mongoose = require('mongoose');
-var passport = require('passport');
-var config = require('../config/environment');
-var jwt = require('jsonwebtoken');
-var expressJwt = require('express-jwt');
-var compose = require('composable-middleware');
-var User = require('../api/user/user.model');
-var validateJwt = expressJwt({ secret: config.secrets.session });
-
-/**
- * Attaches the user object to the request if authenticated
- * Otherwise returns 403
- */
-function isAuthenticated() {
- return compose()
- // Validate jwt
- .use(function(req, res, next) {
- // allow access_token to be passed through query parameter as well
- if(req.query && req.query.hasOwnProperty('access_token')) {
- req.headers.authorization = 'Bearer ' + req.query.access_token;
- }
- validateJwt(req, res, next);
- })
- // Attach user to request
- .use(function(req, res, next) {
- User.findById(req.user._id, function (err, user) {
- if (err) return next(err);
- if (!user) return res.send(401);
-
- req.user = user;
- next();
- });
- });
-}
-
-/**
- * Checks if the user role meets the minimum requirements of the route
- */
-function hasRole(roleRequired) {
- if (!roleRequired) throw new Error('Required role needs to be set');
-
- return compose()
- .use(isAuthenticated())
- .use(function meetsRequirements(req, res, next) {
- if (config.userRoles.indexOf(req.user.role) >= config.userRoles.indexOf(roleRequired)) {
- next();
- }
- else {
- res.send(403);
- }
- });
-}
-
-/**
- * Returns a jwt token signed by the app secret
- */
-function signToken(id) {
- return jwt.sign({ _id: id }, config.secrets.session, { expiresInMinutes: 60*5 });
-}
-
-/**
- * Set token cookie directly for oAuth strategies
- */
-function setTokenCookie(req, res) {
- if (!req.user) return res.json(404, { message: 'Something went wrong, please try again.'});
- var token = signToken(req.user._id, req.user.role);
- res.cookie('token', JSON.stringify(token));
- res.redirect('/');
-}
-
-exports.isAuthenticated = isAuthenticated;
-exports.hasRole = hasRole;
-exports.signToken = signToken;
-exports.setTokenCookie = setTokenCookie;
\ No newline at end of file
diff --git a/app/templates/server/auth(auth)/facebook(facebookAuth)/index.js b/app/templates/server/auth(auth)/facebook(facebookAuth)/index.js
deleted file mode 100644
index 4a6f87886..000000000
--- a/app/templates/server/auth(auth)/facebook(facebookAuth)/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-'use strict';
-
-var express = require('express');
-var passport = require('passport');
-var auth = require('../auth.service');
-
-var router = express.Router();
-
-router
- .get('/', passport.authenticate('facebook', {
- scope: ['email', 'user_about_me'],
- failureRedirect: '/signup',
- session: false
- }))
-
- .get('/callback', passport.authenticate('facebook', {
- failureRedirect: '/signup',
- session: false
- }), auth.setTokenCookie);
-
-module.exports = router;
\ No newline at end of file
diff --git a/app/templates/server/auth(auth)/facebook(facebookAuth)/passport.js b/app/templates/server/auth(auth)/facebook(facebookAuth)/passport.js
deleted file mode 100644
index 90ae48939..000000000
--- a/app/templates/server/auth(auth)/facebook(facebookAuth)/passport.js
+++ /dev/null
@@ -1,37 +0,0 @@
-var passport = require('passport');
-var FacebookStrategy = require('passport-facebook').Strategy;
-
-exports.setup = function (User, config) {
- passport.use(new FacebookStrategy({
- clientID: config.facebook.clientID,
- clientSecret: config.facebook.clientSecret,
- callbackURL: config.facebook.callbackURL
- },
- function(accessToken, refreshToken, profile, done) {
- User.findOne({
- 'facebook.id': profile.id
- },
- function(err, user) {
- if (err) {
- return done(err);
- }
- if (!user) {
- user = new User({
- name: profile.displayName,
- email: profile.emails[0].value,
- role: 'user',
- username: profile.username,
- provider: 'facebook',
- facebook: profile._json
- });
- user.save(function(err) {
- if (err) done(err);
- return done(err, user);
- });
- } else {
- return done(err, user);
- }
- })
- }
- ));
-};
\ No newline at end of file
diff --git a/app/templates/server/auth(auth)/google(googleAuth)/index.js b/app/templates/server/auth(auth)/google(googleAuth)/index.js
deleted file mode 100644
index 9b1ce39fe..000000000
--- a/app/templates/server/auth(auth)/google(googleAuth)/index.js
+++ /dev/null
@@ -1,24 +0,0 @@
-'use strict';
-
-var express = require('express');
-var passport = require('passport');
-var auth = require('../auth.service');
-
-var router = express.Router();
-
-router
- .get('/', passport.authenticate('google', {
- failureRedirect: '/signup',
- scope: [
- 'https://www.googleapis.com/auth/userinfo.profile',
- 'https://www.googleapis.com/auth/userinfo.email'
- ],
- session: false
- }))
-
- .get('/callback', passport.authenticate('google', {
- failureRedirect: '/signup',
- session: false
- }), auth.setTokenCookie);
-
-module.exports = router;
\ No newline at end of file
diff --git a/app/templates/server/auth(auth)/google(googleAuth)/passport.js b/app/templates/server/auth(auth)/google(googleAuth)/passport.js
deleted file mode 100644
index d304e8ac9..000000000
--- a/app/templates/server/auth(auth)/google(googleAuth)/passport.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var passport = require('passport');
-var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
-
-exports.setup = function (User, config) {
- passport.use(new GoogleStrategy({
- clientID: config.google.clientID,
- clientSecret: config.google.clientSecret,
- callbackURL: config.google.callbackURL
- },
- function(accessToken, refreshToken, profile, done) {
- User.findOne({
- 'google.id': profile.id
- }, function(err, user) {
- if (!user) {
- user = new User({
- name: profile.displayName,
- email: profile.emails[0].value,
- role: 'user',
- username: profile.username,
- provider: 'google',
- google: profile._json
- });
- user.save(function(err) {
- if (err) done(err);
- return done(err, user);
- });
- } else {
- return done(err, user);
- }
- });
- }
- ));
-};
diff --git a/app/templates/server/auth(auth)/index.js b/app/templates/server/auth(auth)/index.js
deleted file mode 100644
index e3e6c87ad..000000000
--- a/app/templates/server/auth(auth)/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-'use strict';
-
-var express = require('express');
-var passport = require('passport');
-var config = require('../config/environment');
-var User = require('../api/user/user.model');
-
-// Passport Configuration
-require('./local/passport').setup(User, config);<% if (filters.facebookAuth) { %>
-require('./facebook/passport').setup(User, config);<% } %><% if (filters.googleAuth) { %>
-require('./google/passport').setup(User, config);<% } %><% if (filters.twitterAuth) { %>
-require('./twitter/passport').setup(User, config);<% } %>
-
-var router = express.Router();
-
-router.use('/local', require('./local'));<% if (filters.facebookAuth) { %>
-router.use('/facebook', require('./facebook'));<% } %><% if (filters.twitterAuth) { %>
-router.use('/twitter', require('./twitter'));<% } %><% if (filters.googleAuth) { %>
-router.use('/google', require('./google'));<% } %>
-
-module.exports = router;
\ No newline at end of file
diff --git a/app/templates/server/auth(auth)/local/index.js b/app/templates/server/auth(auth)/local/index.js
deleted file mode 100644
index 8bf88a046..000000000
--- a/app/templates/server/auth(auth)/local/index.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-var express = require('express');
-var passport = require('passport');
-var auth = require('../auth.service');
-
-var router = express.Router();
-
-router.post('/', function(req, res, next) {
- passport.authenticate('local', function (err, user, info) {
- var error = err || info;
- if (error) return res.json(401, error);
- if (!user) return res.json(404, {message: 'Something went wrong, please try again.'});
-
- var token = auth.signToken(user._id, user.role);
- res.json({token: token});
- })(req, res, next)
-});
-
-module.exports = router;
\ No newline at end of file
diff --git a/app/templates/server/auth(auth)/local/passport.js b/app/templates/server/auth(auth)/local/passport.js
deleted file mode 100644
index ac82b42a2..000000000
--- a/app/templates/server/auth(auth)/local/passport.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var passport = require('passport');
-var LocalStrategy = require('passport-local').Strategy;
-
-exports.setup = function (User, config) {
- passport.use(new LocalStrategy({
- usernameField: 'email',
- passwordField: 'password' // this is the virtual field on the model
- },
- function(email, password, done) {
- User.findOne({
- email: email.toLowerCase()
- }, function(err, user) {
- if (err) return done(err);
-
- if (!user) {
- return done(null, false, { message: 'This email is not registered.' });
- }
- if (!user.authenticate(password)) {
- return done(null, false, { message: 'This password is not correct.' });
- }
- return done(null, user);
- });
- }
- ));
-};
\ No newline at end of file
diff --git a/app/templates/server/auth(auth)/twitter(twitterAuth)/index.js b/app/templates/server/auth(auth)/twitter(twitterAuth)/index.js
deleted file mode 100644
index 8360247b8..000000000
--- a/app/templates/server/auth(auth)/twitter(twitterAuth)/index.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-var express = require('express');
-var passport = require('passport');
-var auth = require('../auth.service');
-
-var router = express.Router();
-
-router
- .get('/', passport.authenticate('twitter', {
- failureRedirect: '/signup',
- session: false
- }))
-
- .get('/callback', passport.authenticate('twitter', {
- failureRedirect: '/signup',
- session: false
- }), auth.setTokenCookie);
-
-module.exports = router;
\ No newline at end of file
diff --git a/app/templates/server/auth(auth)/twitter(twitterAuth)/passport.js b/app/templates/server/auth(auth)/twitter(twitterAuth)/passport.js
deleted file mode 100644
index a2eb4a537..000000000
--- a/app/templates/server/auth(auth)/twitter(twitterAuth)/passport.js
+++ /dev/null
@@ -1,35 +0,0 @@
-exports.setup = function (User, config) {
- var passport = require('passport');
- var TwitterStrategy = require('passport-twitter').Strategy;
-
- passport.use(new TwitterStrategy({
- consumerKey: config.twitter.clientID,
- consumerSecret: config.twitter.clientSecret,
- callbackURL: config.twitter.callbackURL
- },
- function(token, tokenSecret, profile, done) {
- User.findOne({
- 'twitter.id_str': profile.id
- }, function(err, user) {
- if (err) {
- return done(err);
- }
- if (!user) {
- user = new User({
- name: profile.displayName,
- username: profile.username,
- role: 'user',
- provider: 'twitter',
- twitter: profile._json
- });
- user.save(function(err) {
- if (err) return done(err);
- return done(err, user);
- });
- } else {
- return done(err, user);
- }
- });
- }
- ));
-};
\ No newline at end of file
diff --git a/app/templates/server/components/errors/index.js b/app/templates/server/components/errors/index.js
deleted file mode 100644
index 4c5a57c99..000000000
--- a/app/templates/server/components/errors/index.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * Error responses
- */
-
-'use strict';
-
-module.exports[404] = function pageNotFound(req, res) {
- var viewFilePath = '404';
- var statusCode = 404;
- var result = {
- status: statusCode
- };
-
- res.status(result.status);
- res.render(viewFilePath, function (err) {
- if (err) { return res.json(result, result.status); }
-
- res.render(viewFilePath);
- });
-};
diff --git a/app/templates/server/config/_local.env.js b/app/templates/server/config/_local.env.js
deleted file mode 100644
index c24fffd3a..000000000
--- a/app/templates/server/config/_local.env.js
+++ /dev/null
@@ -1,23 +0,0 @@
-'use strict';
-
-// Use local.env.js for environment variables that grunt will set when the server starts locally.
-// Use for your api keys, secrets, etc. This file should not be tracked by git.
-//
-// You will need to set these on the server you deploy to.
-
-module.exports = {
- DOMAIN: 'http://localhost:9000/',
- SESSION_SECRET: "<%= _.slugify(appname) + '-secret' %>",<% if (filters.facebookAuth) { %>
-
- FACEBOOK_ID: 'app-id',
- FACEBOOK_SECRET: 'secret',<% } if (filters.twitterAuth) { %>
-
- TWITTER_ID: 'app-id',
- TWITTER_SECRET: 'secret',<% } if (filters.googleAuth) { %>
-
- GOOGLE_ID: 'app-id',
- GOOGLE_SECRET: 'secret',
-<% } %>
- // Control debug level for modules using visionmedia/debug
- DEBUG: ''
-};
diff --git a/app/templates/server/config/_local.env.sample.js b/app/templates/server/config/_local.env.sample.js
deleted file mode 100644
index ac5a52a2e..000000000
--- a/app/templates/server/config/_local.env.sample.js
+++ /dev/null
@@ -1,23 +0,0 @@
-'use strict';
-
-// Use local.env.js for environment variables that grunt will set when the server starts locally.
-// Use for your api keys, secrets, etc. This file should not be tracked by git.
-//
-// You will need to set these on the server you deploy to.
-
-module.exports = {
- DOMAIN: 'http://localhost:9000/',
- SESSION_SECRET: '<%= _.slugify(appname) + "-secret" %>',<% if (filters.facebookAuth) { %>
-
- FACEBOOK_ID: 'app-id',
- FACEBOOK_SECRET: 'secret',<% } if (filters.twitterAuth) { %>
-
- TWITTER_ID: 'app-id',
- TWITTER_SECRET: 'secret',<% } if (filters.googleAuth) { %>
-
- GOOGLE_ID: 'app-id',
- GOOGLE_SECRET: 'secret',<% } %>
-
- // Control debug level for modules using visionmedia/debug
- DEBUG: ''
-};
diff --git a/app/templates/server/config/environment/development.js b/app/templates/server/config/environment/development.js
deleted file mode 100644
index fb33d6eab..000000000
--- a/app/templates/server/config/environment/development.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-
-// Development specific configuration
-// ==================================
-module.exports = {
- // MongoDB connection options
- mongo: {
- uri: 'mongodb://localhost/<%= _.slugify(appname) %>-dev'
- },
-
- seedDB: true
-};
diff --git a/app/templates/server/config/environment/index.js b/app/templates/server/config/environment/index.js
deleted file mode 100644
index 11d85f4de..000000000
--- a/app/templates/server/config/environment/index.js
+++ /dev/null
@@ -1,67 +0,0 @@
-'use strict';
-
-var path = require('path');
-var _ = require('lodash');
-
-function requiredProcessEnv(name) {
- if(!process.env[name]) {
- throw new Error('You must set the ' + name + ' environment variable');
- }
- return process.env[name];
-}
-
-// All configurations will extend these options
-// ============================================
-var all = {
- env: process.env.NODE_ENV,
-
- // Root path of server
- root: path.normalize(__dirname + '/../../..'),
-
- // Server port
- port: process.env.PORT || 9000,
-
- // Should we populate the DB with sample data?
- seedDB: false,
-
- // Secret for session, you will want to change this and make it an environment variable
- secrets: {
- session: '<%= _.slugify(_.humanize(appname)) + '-secret' %>'
- },
-
- // List of user roles
- userRoles: ['guest', 'user', 'admin'],
-
- // MongoDB connection options
- mongo: {
- options: {
- db: {
- safe: true
- }
- }
- },
-<% if(filters.facebookAuth) { %>
- facebook: {
- clientID: process.env.FACEBOOK_ID || 'id',
- clientSecret: process.env.FACEBOOK_SECRET || 'secret',
- callbackURL: (process.env.DOMAIN || '') + '/auth/facebook/callback'
- },
-<% } %><% if(filters.twitterAuth) { %>
- twitter: {
- clientID: process.env.TWITTER_ID || 'id',
- clientSecret: process.env.TWITTER_SECRET || 'secret',
- callbackURL: (process.env.DOMAIN || '') + '/auth/twitter/callback'
- },
-<% } %><% if(filters.googleAuth) { %>
- google: {
- clientID: process.env.GOOGLE_ID || 'id',
- clientSecret: process.env.GOOGLE_SECRET || 'secret',
- callbackURL: (process.env.DOMAIN || '') + '/auth/google/callback'
- }<% } %>
-};
-
-// Export the config object based on the NODE_ENV
-// ==============================================
-module.exports = _.merge(
- all,
- require('./' + process.env.NODE_ENV + '.js') || {});
\ No newline at end of file
diff --git a/app/templates/server/config/environment/production.js b/app/templates/server/config/environment/production.js
deleted file mode 100644
index 1704df619..000000000
--- a/app/templates/server/config/environment/production.js
+++ /dev/null
@@ -1,23 +0,0 @@
-'use strict';
-
-// Production specific configuration
-// =================================
-module.exports = {
- // Server IP
- ip: process.env.OPENSHIFT_NODEJS_IP ||
- process.env.IP ||
- undefined,
-
- // Server port
- port: process.env.OPENSHIFT_NODEJS_PORT ||
- process.env.PORT ||
- 8080,
-
- // MongoDB connection options
- mongo: {
- uri: process.env.MONGOLAB_URI ||
- process.env.MONGOHQ_URL ||
- process.env.OPENSHIFT_MONGODB_DB_URL+process.env.OPENSHIFT_APP_NAME ||
- 'mongodb://localhost/<%= _.slugify(appname) %>'
- }
-};
\ No newline at end of file
diff --git a/app/templates/server/config/environment/test.js b/app/templates/server/config/environment/test.js
deleted file mode 100644
index 711c98660..000000000
--- a/app/templates/server/config/environment/test.js
+++ /dev/null
@@ -1,10 +0,0 @@
-'use strict';
-
-// Test specific configuration
-// ===========================
-module.exports = {
- // MongoDB connection options
- mongo: {
- uri: 'mongodb://localhost/<%= _.slugify(appname) %>-test'
- }
-};
\ No newline at end of file
diff --git a/app/templates/server/config/express.js b/app/templates/server/config/express.js
deleted file mode 100644
index 47601de59..000000000
--- a/app/templates/server/config/express.js
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * Express configuration
- */
-
-'use strict';
-
-var express = require('express');
-var favicon = require('serve-favicon');
-var morgan = require('morgan');
-var compression = require('compression');
-var bodyParser = require('body-parser');
-var methodOverride = require('method-override');
-var cookieParser = require('cookie-parser');
-var errorHandler = require('errorhandler');
-var path = require('path');
-var config = require('./environment');<% if (filters.auth) { %>
-var passport = require('passport');<% } %><% if (filters.twitterAuth) { %>
-var session = require('express-session');
-var mongoStore = require('connect-mongo')(session);
-var mongoose = require('mongoose');<% } %>
-
-module.exports = function(app) {
- var env = app.get('env');
-
- app.set('views', config.root + '/server/views');<% if (filters.html) { %>
- app.engine('html', require('ejs').renderFile);
- app.set('view engine', 'html');<% } %><% if (filters.jade) { %>
- app.set('view engine', 'jade');<% } %>
- app.use(compression());
- app.use(bodyParser.urlencoded({ extended: false }));
- app.use(bodyParser.json());
- app.use(methodOverride());
- app.use(cookieParser());
- <% if (filters.auth) { %>app.use(passport.initialize());<% } %><% if (filters.twitterAuth) { %>
-
- // Persist sessions with mongoStore
- // We need to enable sessions for passport twitter because its an oauth 1.0 strategy
- app.use(session({
- secret: config.secrets.session,
- resave: true,
- saveUninitialized: true,
- store: new mongoStore({ mongoose_connection: mongoose.connection })
- }));
- <% } %>
- if ('production' === env) {
- app.use(favicon(path.join(config.root, 'public', 'favicon.ico')));
- app.use(express.static(path.join(config.root, 'public')));
- app.set('appPath', path.join(config.root, 'public'));
- app.use(morgan('dev'));
- }
-
- if ('development' === env || 'test' === env) {
- app.use(require('connect-livereload')());
- app.use(express.static(path.join(config.root, '.tmp')));
- app.use(express.static(path.join(config.root, 'client')));
- app.set('appPath', path.join(config.root, 'client'));
- app.use(morgan('dev'));
- app.use(errorHandler()); // Error handler - has to be last
- }
-};
\ No newline at end of file
diff --git a/app/templates/server/config/seed(mongoose).js b/app/templates/server/config/seed(mongoose).js
deleted file mode 100644
index 27ab19417..000000000
--- a/app/templates/server/config/seed(mongoose).js
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * Populate DB with sample data on server start
- * to disable, edit config/environment/index.js, and set `seedDB: false`
- */
-
-'use strict';
-
-var Thing = require('../api/thing/thing.model');
-<% if (filters.auth) { %>var User = require('../api/user/user.model');<% } %>
-
-Thing.find({}).remove(function() {
- Thing.create({
- name : 'Development Tools',
- info : 'Integration with popular tools such as Bower, Grunt, Karma, Mocha, JSHint, Node Inspector, Livereload, Protractor, Jade, Stylus, Sass, CoffeeScript, and Less.'
- }, {
- name : 'Server and Client integration',
- info : 'Built with a powerful and fun stack: MongoDB, Express, AngularJS, and Node.'
- }, {
- name : 'Smart Build System',
- info : 'Build system ignores `spec` files, allowing you to keep tests alongside code. Automatic injection of scripts and styles into your index.html'
- }, {
- name : 'Modular Structure',
- info : 'Best practice client and server structures allow for more code reusability and maximum scalability'
- }, {
- name : 'Optimized Build',
- info : 'Build process packs up your templates as a single JavaScript payload, minifies your scripts/css/images, and rewrites asset names for caching.'
- },{
- name : 'Deployment Ready',
- info : 'Easily deploy your app to Heroku or Openshift with the heroku and openshift subgenerators'
- });
-});<% if (filters.auth) { %>
-
-User.find({}).remove(function() {
- User.create({
- provider: 'local',
- name: 'Test User',
- email: 'test@test.com',
- password: 'test'
- }, {
- provider: 'local',
- role: 'admin',
- name: 'Admin',
- email: 'admin@admin.com',
- password: 'admin'
- }, function() {
- console.log('finished populating users');
- }
- );
-});<% } %>
\ No newline at end of file
diff --git a/app/templates/server/config/socketio(socketio).js b/app/templates/server/config/socketio(socketio).js
deleted file mode 100644
index 2fbbc07d6..000000000
--- a/app/templates/server/config/socketio(socketio).js
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * Socket.io configuration
- */
-
-'use strict';
-
-var config = require('./environment');
-
-// When the user disconnects.. perform this
-function onDisconnect(socket) {
-}
-
-// When the user connects.. perform this
-function onConnect(socket) {
- // When the client emits 'info', this listens and executes
- socket.on('info', function (data) {
- console.info('[%s] %s', socket.address, JSON.stringify(data, null, 2));
- });
-
- // Insert sockets below
- require('../api/thing/thing.socket').register(socket);
-}
-
-module.exports = function (socketio) {
- // socket.io (v1.x.x) is powered by debug.
- // In order to see all the debug output, set DEBUG (in server/config/local.env.js) to including the desired scope.
- //
- // ex: DEBUG: "http*,socket.io:socket"
-
- // We can authenticate socket.io users and access their token through socket.handshake.decoded_token
- //
- // 1. You will need to send the token in `client/components/socket/socket.service.js`
- //
- // 2. Require authentication here:
- // socketio.use(require('socketio-jwt').authorize({
- // secret: config.secrets.session,
- // handshake: true
- // }));
-
- socketio.on('connection', function (socket) {
- socket.address = socket.handshake.address !== null ?
- socket.handshake.address.address + ':' + socket.handshake.address.port :
- process.env.DOMAIN;
-
- socket.connectedAt = new Date();
-
- // Call onDisconnect.
- socket.on('disconnect', function () {
- onDisconnect(socket);
- console.info('[%s] DISCONNECTED', socket.address);
- });
-
- // Call onConnect.
- onConnect(socket);
- console.info('[%s] CONNECTED', socket.address);
- });
-};
\ No newline at end of file
diff --git a/app/templates/server/routes.js b/app/templates/server/routes.js
deleted file mode 100644
index ebcd79dc6..000000000
--- a/app/templates/server/routes.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * Main application routes
- */
-
-'use strict';
-
-var errors = require('./components/errors');
-var path = require('path');
-
-module.exports = function(app) {
-
- // Insert routes below
- app.use('/api/things', require('./api/thing'));
- <% if (filters.auth) { %>app.use('/api/users', require('./api/user'));
-
- app.use('/auth', require('./auth'));
- <% } %>
- // All undefined asset or api routes should return a 404
- app.route('/:url(http://github.com/api|auth|components|app|bower_components|assets)/*')
- .get(errors[404]);
-
- // All other routes should redirect to the index.html
- app.route('/*')
- .get(function(req, res) {
- res.sendFile(path.resolve(app.get('appPath') + '/index.html'));
- });
-};
diff --git a/app/templates/server/views/404(jade).jade b/app/templates/server/views/404(jade).jade
deleted file mode 100644
index b5735b4f6..000000000
--- a/app/templates/server/views/404(jade).jade
+++ /dev/null
@@ -1,133 +0,0 @@
-doctype html
-html(lang='en')
-head
- meta(charset='utf-8')
- title Page Not Found :(
- style.
- ::-moz-selection {
- background: #b3d4fc;
- text-shadow: none;
- }
- ::selection {
- background: #b3d4fc;
- text-shadow: none;
- }
- html {
- padding: 30px 10px;
- font-size: 20px;
- line-height: 1.4;
- color: #737373;
- background: #f0f0f0;
- -webkit-text-size-adjust: 100%;
- -ms-text-size-adjust: 100%;
- }
- html,
- input {
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- }
- body {
- max-width: 500px;
- _width: 500px;
- padding: 30px 20px 50px;
- border: 1px solid #b3b3b3;
- border-radius: 4px;
- margin: 0 auto;
- box-shadow: 0 1px 10px #a7a7a7, inset 0 1px 0 #fff;
- background: #fcfcfc;
- }
- h1 {
- margin: 0 10px;
- font-size: 50px;
- text-align: center;
- }
- h1 span {
- color: #bbb;
- }
- h3 {
- margin: 1.5em 0 0.5em;
- }
- p {
- margin: 1em 0;
- }
- ul {
- padding: 0 0 0 40px;
- margin: 1em 0;
- }
- .container {
- max-width: 380px;
- _width: 380px;
- margin: 0 auto;
- }
- /* google search */
- #goog-fixurl ul {
- list-style: none;
- padding: 0;
- margin: 0;
- }
- #goog-fixurl form {
- margin: 0;
- }
- #goog-wm-qt,
- #goog-wm-sb {
- border: 1px solid #bbb;
- font-size: 16px;
- line-height: normal;
- vertical-align: top;
- color: #444;
- border-radius: 2px;
- }
- #goog-wm-qt {
- width: 220px;
- height: 20px;
- padding: 5px;
- margin: 5px 10px 0 0;
- box-shadow: inset 0 1px 1px #ccc;
- }
- #goog-wm-sb {
- display: inline-block;
- height: 32px;
- padding: 0 10px;
- margin: 5px 0 0;
- white-space: nowrap;
- cursor: pointer;
- background-color: #f5f5f5;
- background-image: -webkit-linear-gradient(rgba(255,255,255,0), #f1f1f1);
- background-image: -moz-linear-gradient(rgba(255,255,255,0), #f1f1f1);
- background-image: -ms-linear-gradient(rgba(255,255,255,0), #f1f1f1);
- background-image: -o-linear-gradient(rgba(255,255,255,0), #f1f1f1);
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
- *overflow: visible;
- *display: inline;
- *zoom: 1;
- }
- #goog-wm-sb:hover,
- #goog-wm-sb:focus {
- border-color: #aaa;
- box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
- background-color: #f8f8f8;
- }
- #goog-wm-qt:hover,
- #goog-wm-qt:focus {
- border-color: #105cb6;
- outline: 0;
- color: #222;
- }
- input::-moz-focus-inner {
- padding: 0;
- border: 0;
- }
- body
- .container
- h1
- | Not found
- span :(
- p Sorry, but the page you were trying to view does not exist.
- p It looks like this was the result of either:
- ul
- li a mistyped address
- li an out-of-date link
- script.
- var GOOG_FIXURL_LANG = (navigator.language || '').slice(0,2),GOOG_FIXURL_SITE = location.host;
- script(src='http://linkhelp.clients.google.com/tbproxy/lh/wm/fixurl.js')
diff --git a/circle.yml b/circle.yml
new file mode 100644
index 000000000..5feecc9a2
--- /dev/null
+++ b/circle.yml
@@ -0,0 +1,56 @@
+version: 2
+jobs:
+ build:
+ docker:
+ - image: circleci/node:12-browsers
+ - image: mongo
+ command: mongod
+
+ working_directory: ~/generator-angular-fullstack
+
+ environment:
+ NODE_ENV: test
+
+ branches:
+ ignore:
+ - gh-pages
+
+ steps:
+ - checkout
+ - run: git submodule sync && git submodule update --init
+
+ # Generator npm dependencies
+ - restore_cache:
+ keys:
+ - generator-angular-fullstack-npm-{{ .Branch }}-{{ checksum "package.json" }}
+ - generator-angular-fullstack-npm-{{ .Branch }}
+ - generator-angular-fullstack-npm-
+ - run: npm install --quiet
+ - save_cache:
+ key: generator-angular-fullstack-npm-{{ .Branch }}-{{ checksum "package.json" }}
+ paths:
+ - ~/generator-angular-fullstack/node_modules
+
+ # Test fixtures
+ - run: npx gulp updateFixtures:test
+ - restore_cache:
+ keys:
+ - generator-angular-fullstack-npm-fixtures-{{ .Branch }}-{{ checksum "templates/app/_package.json" }}
+ - generator-angular-fullstack-npm-fixtures-{{ .Branch }}
+ - generator-angular-fullstack-npm-fixtures-
+ - run: npx gulp installFixtures
+ - save_cache:
+ key: generator-angular-fullstack-npm-fixtures-{{ .Branch }}-{{ checksum "templates/app/_package.json" }}
+ paths:
+ - ~/generator-angular-fullstack/test/fixtures/node_modules
+
+ - run: npx gulp build
+ - run: npm test
+
+# - deploy:
+# command: |
+# if [ "${CIRCLE_BRANCH}" == "master" ]; then
+# git config --global user.email "circleci@circleci.com"
+# git config --global user.name "CircleCI"
+# cd docs && npm install && npm run build && npm run deploy
+# fi
diff --git a/contributing.md b/contributing.md
index 0c2eb25f8..78170f758 100644
--- a/contributing.md
+++ b/contributing.md
@@ -1,14 +1,32 @@
# Contributing
-See the [contributing docs](https://github.com/yeoman/yeoman/blob/master/contributing.md)
+See the [Yeoman contributing docs](https://github.com/yeoman/yeoman/blob/master/contributing.md)
Additionally for this generator:
-* Please submit PRs to the `canary` branch, it is the main development branch for this generator.
+* Please submit bug fix PRs to the `master` branch. Please submit large feature PRs to the `canary` branch; it is the main development branch for this generator.
* When submitting an issue, please follow the [guidelines](https://github.com/yeoman/yeoman/blob/master/contributing.md#issue-submission). Especially important is to make sure Yeoman is up-to-date, and providing the command or commands that cause the issue.
* When submitting a PR, make sure that the commit messages match the [AngularJS conventions][commit-message-format] (see below).
* When submitting a bugfix, write a test that exposes the bug and fails before applying your fix. Submit the test alongside the fix.
* When submitting a new feature, add tests that cover the feature.
+* Open Issues marked with the [EASY](https://github.com/angular-fullstack/generator-angular-fullstack/issues?q=is%3Aopen+is%3Aissue+label%3AEasy) label are believed to be easy changes, and would be good Issues to tackle for new contributors.
+
+This project has 2 main branches: `master` and `canary`. The `master` branch is where the current stable code lives and should be used for production setups. The `canary` branch is the main development branch, this is where PRs should be submitted to (backport fixes may be applied to `master`).
+
+By separating the current stable code from the cutting-edge development we hope to provide a stable and efficient workflow for users and developers alike.
+
+When submitting a PR, make sure that the commit messages match the [AngularJS conventions](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/).
+
+When submitting a bugfix, try to write a test that exposes the bug and fails before applying your fix. Submit the test alongside the fix.
+
+When submitting a new feature, add tests that cover the feature.
+
+To run the generator:
+
+1. Clone it and `cd` to its root
+2. `npm install`
+3. `npm link` (tells npm to look to your own version)
+4. `yo angular-fullstack` as normal. It should run from your cloned version rather than the one downloaded from npm.
## Git Commit Guidelines
@@ -64,3 +82,23 @@ reference GitHub issues that this commit **Closes**.
A detailed explanation can be found in this [document][commit-message-format].
[commit-message-format]: https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y
+
+# Releasing
+*(for contributors with push access)*
+
+The `grunt release` task will do most of the work for you, see [`grunt-release`](https://github.com/geddski/grunt-release#using-grunt-release) for valid release targets.
+
+* Run the release task `grunt release:RELEASE_TARGET`.
+
+* Push and publish the `angular-fullstack-deps` submodule.
+```bash
+$ cd angular-fullstack-deps
+$ git push && npm publish
+$ cd ..
+```
+
+* Push and publish `generator-angular-fullstack`.
+```bash
+$ git push && git push --tags
+$ npm publish
+```
diff --git a/contributing/releasing-a-new-version.md b/contributing/releasing-a-new-version.md
new file mode 100644
index 000000000..1c63f3966
--- /dev/null
+++ b/contributing/releasing-a-new-version.md
@@ -0,0 +1,26 @@
+# Releasing a New Version
+
+## Contributing
+
+## Releasing a new version
+
+* Bump `package.json` version
+* \[
+ * `grunt conventionalChangelog`
+ * `cd angular-fullstack-deps`
+ * `git checkout master`
+ * `git pull`
+ * `cd ..`
+ * `gulp updateFixtures:deps`
+ * `cd angular-fullstack-deps`
+ * `git add .`
+ * `git commit -m $VERSION`
+ * `git push`
+ * `# npm publish`
+
+ \]
+* `git add ./{CHANGELOG.md,angular-fullstack-deps,package.json}`
+* `git commit -m $VERSION`
+* `git push`
+* `# npm publish`
+
diff --git a/contributing/untitled-1.md b/contributing/untitled-1.md
new file mode 100644
index 000000000..543774ac4
--- /dev/null
+++ b/contributing/untitled-1.md
@@ -0,0 +1,55 @@
+# Commit Style
+
+## Commit Message Format
+
+Each commit message consists of a **header**, a **body** and a **footer**. The header has a special format that includes a **type**, a **scope** and a **subject**:
+
+```text
+():
+
+
+
+