From 6610053510db33a7f595fa2de2940e28cfa12892 Mon Sep 17 00:00:00 2001 From: "Howard.Zuo" Date: Sat, 7 May 2016 21:24:44 +0800 Subject: [PATCH] refactor without gulp involved --- README.md | 46 ++-- docs/api.md | 48 +++++ generators/app/index.js | 40 ++-- generators/app/templates/css/main.css | 177 ++++++++++++++++ generators/app/templates/eslintrc | 196 ++++++++++++++++++ generators/app/templates/etc/config.js | 7 +- generators/app/templates/font/fontello.eot | Bin 9168 -> 0 bytes generators/app/templates/font/fontello.svg | 29 --- generators/app/templates/font/fontello.ttf | Bin 9000 -> 0 bytes generators/app/templates/font/fontello.woff | Bin 5796 -> 0 bytes generators/app/templates/gulpfile.js | 50 ----- .../app/templates/img/AngularJS-large.png | Bin 0 -> 29450 bytes generators/app/templates/img/avatar.png | Bin 31033 -> 0 bytes generators/app/templates/index.html_vm | 14 +- .../app/templates/js/features/about/Routes.js | 21 ++ .../about/controller/AboutController.js | 26 +++ .../js/features/{list => about}/main.js | 8 +- .../js/features/about/partials/about.html | 15 ++ .../js/features/common/logical/Header.html | 8 + .../js/features/common/logical/Header.js | 45 ++++ .../js/features/common/logical/Sidebar.html | 12 -- .../js/features/common/logical/Sidebar.js | 38 ---- .../js/features/common/logical/Toolbar.html | 18 -- .../js/features/common/logical/Toolbar.js | 42 ---- .../js/features/common/logical/main.js | 6 +- .../app/templates/js/features/common/main.js | 2 +- .../js/features/common/ui/Autofocus.js | 5 +- .../js/features/common/ui/RouteIndicator.js | 7 +- .../templates/js/features/common/ui/main.js | 1 - .../app/templates/js/features/home/Routes.js | 1 - .../home/controller/HomeController.js | 51 ++--- .../app/templates/js/features/home/main.js | 2 +- .../js/features/home/partials/home.html | 131 ++++-------- .../js/features/home/service/HomeService.js | 19 +- .../app/templates/js/features/list/Routes.js | 21 -- .../list/controller/ListController.js | 33 --- .../js/features/list/partials/list.html | 15 -- .../js/features/list/service/ListService.js | 23 -- generators/app/templates/js/features/main.js | 6 +- .../templates/js/fw/config/MaterialConfig.js | 30 --- .../templates/js/fw/config/RouterConfig.js | 51 +++-- .../app/templates/js/fw/config/SSOConfig.js | 5 +- generators/app/templates/js/fw/config/main.js | 4 +- generators/app/templates/js/fw/ext/main.js | 15 +- generators/app/templates/js/fw/init/Header.js | 4 +- .../app/templates/js/fw/init/Validator.js | 5 +- generators/app/templates/js/fw/init/main.js | 2 +- .../templates/js/fw/lib/ConfiguratorBase.js | 5 +- .../app/templates/js/fw/lib/FeatureBase.js | 12 +- .../app/templates/js/fw/lib/InitBase.js | 5 +- generators/app/templates/js/fw/lib/Omit.js | 3 +- generators/app/templates/js/fw/lib/Pluck.js | 3 +- .../app/templates/js/fw/lib/ServiceBase.js | 5 +- .../app/templates/js/fw/service/Utils.js | 16 +- .../app/templates/js/fw/service/main.js | 2 +- generators/app/templates/js/index.js | 5 +- generators/app/templates/js/main.js | 1 - generators/app/templates/less/fontello.less | 74 ------- generators/app/templates/less/main.less | 35 ---- generators/app/templates/mock/demolist | 62 ------ generators/app/templates/mock/states | 52 ----- generators/app/templates/package.json_vm | 44 ++-- .../app/templates/webpack.config.dev.js | 24 ++- .../app/templates/webpack.config.prod.js | 24 ++- package.json | 6 +- 65 files changed, 774 insertions(+), 883 deletions(-) create mode 100644 docs/api.md create mode 100644 generators/app/templates/css/main.css create mode 100644 generators/app/templates/eslintrc delete mode 100644 generators/app/templates/font/fontello.eot delete mode 100644 generators/app/templates/font/fontello.svg delete mode 100644 generators/app/templates/font/fontello.ttf delete mode 100644 generators/app/templates/font/fontello.woff delete mode 100644 generators/app/templates/gulpfile.js create mode 100644 generators/app/templates/img/AngularJS-large.png delete mode 100644 generators/app/templates/img/avatar.png create mode 100644 generators/app/templates/js/features/about/Routes.js create mode 100644 generators/app/templates/js/features/about/controller/AboutController.js rename generators/app/templates/js/features/{list => about}/main.js (71%) create mode 100644 generators/app/templates/js/features/about/partials/about.html create mode 100644 generators/app/templates/js/features/common/logical/Header.html create mode 100644 generators/app/templates/js/features/common/logical/Header.js delete mode 100644 generators/app/templates/js/features/common/logical/Sidebar.html delete mode 100644 generators/app/templates/js/features/common/logical/Sidebar.js delete mode 100644 generators/app/templates/js/features/common/logical/Toolbar.html delete mode 100644 generators/app/templates/js/features/common/logical/Toolbar.js delete mode 100644 generators/app/templates/js/features/list/Routes.js delete mode 100644 generators/app/templates/js/features/list/controller/ListController.js delete mode 100644 generators/app/templates/js/features/list/partials/list.html delete mode 100644 generators/app/templates/js/features/list/service/ListService.js delete mode 100644 generators/app/templates/js/fw/config/MaterialConfig.js delete mode 100644 generators/app/templates/less/fontello.less delete mode 100644 generators/app/templates/less/main.less delete mode 100644 generators/app/templates/mock/demolist delete mode 100644 generators/app/templates/mock/states diff --git a/README.md b/README.md index 10db7c9..1db36d6 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ -# generator-es6-angular -================== +generator-es6-angular +====================== [![NPM version][npm-image]][npm-url] ![][david-url] ![][dt-url] ![][license-url] -Yeoman generator for es6 based angular skeleton with webpack +Yeoman generator for es6 based angular skeleton > You can view the online demo at: [http://leftstick.github.io/generator-es6-angular](http://leftstick.github.io/generator-es6-angular) @@ -14,8 +14,7 @@ Yeoman generator for es6 based angular skeleton with webpack ## Prerequisites ## 1. Install [yeoman](http://yeoman.io/): `npm install -g yo` -2. Install [gulp](http://gulpjs.com/): `npm install -g gulp` -3. Install __this__: `npm install -g generator-es6-angular` +2. Install __this__: `npm install -g generator-es6-angular` > prepend with `sudo` if you are running on `*nix` OS. @@ -29,55 +28,42 @@ Yeoman generator for es6 based angular skeleton with webpack And then, the [es6](https://github.com/lukehoban/es6features) based project generated. -## Debug your app ## +## Quick start ## -The full featured `gulp` and `webpack` are embedded, it's easy to start debugging your app. +### Debug your app ### + +The full featured `dev/dist` tools are provided, it's easy to start debugging your app. Just move into the created directory with the given `project name`. -Run `gulp dev` to start a debug web server for current working directory. +Run `npm start` to start a debug web server for the project. -Open [http://localhost:8080/webpack-dev-server/index.html](http://localhost:8080/webpack-dev-server/index.html), and have fun. +Open [http://localhost:8080/](http://localhost:8080/) to see the playable skeleton, and have fun. -## Release your app ## +### Release your app ### Move the root of the created project. -Run `gulp release` to compile all the source code into webpack bundles. And all required resources are generated into `{root}/build/`. +Run `npm run release` to compile all the source code into webpack bundles. And all required resources are generated into `{root}/build/`. You can copy the `build` folder to anywhere you like, it's the released app. -### Like have a try with the released app? ### +#### Like have a try with the released app? #### Install [sero-cli](https://github.com/leftstick/Sero-cli): `npm install -g sero-cli` Move into `{root}/build/` -Run `sero server -r . -p 8080`, a static web server launched at port 8080. +Run `sero server -p 8080 -h`, a static web server launched at port 8080. Open [http://localhost:8080](http://localhost:8080) to watch the released version. -## note ## - -If you'd like to add [jquery](http://jquery.com/) as replacement of `jqLite`, you have to modify the `webpack.config.dev.js` and `webpack.config.prod.js` with following plugin added: - -```javascript -new webpack.ProvidePlugin({ - $: 'jquery', - 'window.jQuery': 'jquery' -}), -``` +## More read ## -## References ## +Looking for detail? Check it [here](https://github.com/leftstick/generator-es6-angular/blob/master/docs/api.md) -1. [yeoman](http://yeoman.io/) -2. [gulp](http://gulpjs.com/) -3. [webpack](http://webpack.github.io/) -4. [es6-features](https://github.com/lukehoban/es6features) -5. [angular](https://angularjs.org/) -6. [angular-material](https://material.angularjs.org/latest/) ## LICENSE ## diff --git a/docs/api.md b/docs/api.md new file mode 100644 index 0000000..949da26 --- /dev/null +++ b/docs/api.md @@ -0,0 +1,48 @@ +## How to involve external library ## + +```bash +npm install --save +``` + +Open `js/fw/ext/main.js`, `import` it, and append the module name to `export` array if provided. + +## Why Dependency Injection looks so weird in this skeleton ## + +This is because [ng-annotate](https://github.com/olov/ng-annotate) is chosen for for providing quick DI. + +## How to add new route ## + +You will find a `Routes.js` in each "feature" folder, it's an `Array` to be exported, and each `object` in it is used to describe a `Route`. + +You can easily append more to an exist `feature`, or add a new `feature` with route. + +## Why `main.js` exist in each folder ## + +The `main.js` in each folder takes the responsibility for managing all modules in that folder, according to such concept, it's more robust to extend functionality without modifying other features. + +## How to use jquery ## + +```bash +npm install --save jquery +``` + +If you'd like to add [jquery](http://jquery.com/) as replacement of `jqLite`, you have to modify the `webpack.config.dev.js` and `webpack.config.prod.js` with following plugin added: + +```javascript +new webpack.ProvidePlugin({ + $: 'jquery', + 'window.jQuery': 'jquery' +}), +``` + +>This is because `AngularJS` internally check if `window.jQuery` provided + + +## References ## + +1. [yeoman](http://yeoman.io/) +2. [gulp](http://gulpjs.com/) +3. [webpack](http://webpack.github.io/) +4. [es6-features](https://github.com/lukehoban/es6features) +5. [angular](https://angularjs.org/) +6. [angular-material](https://material.angularjs.org/latest/) diff --git a/generators/app/index.js b/generators/app/index.js index 54d8304..fb61287 100644 --- a/generators/app/index.js +++ b/generators/app/index.js @@ -71,15 +71,16 @@ var gen = generators.Base.extend({ 'https://registry.npmjs.org' ] } - ], function(answers) { - require('date-util'); - this.answers = answers; - this.answers.date = new Date().format('mmm d, yyyy'); - this.obj = {answers: this.answers}; - done(); - }.bind(this)); + ]) + .then(function(answers) { + require('date-util'); + self.answers = answers; + self.answers.date = new Date().format('mmm d, yyyy'); + self.obj = {answers: self.answers}; + done(); + }); }, - configuring: function() { + configuring: function(answers) { var path = require('path'); var fs = require('fs'); var self = this; @@ -104,20 +105,21 @@ var gen = generators.Base.extend({ interpolate: /<%=([\s\S]+?)%>/g })(self.obj); }); - self.directory(self.templatePath('less'), self.destinationPath('less')); - self.directory(self.templatePath('font'), self.destinationPath('font')); - self.directory(self.templatePath('mock'), self.destinationPath('mock')); - self.copy(self.templatePath('gitignore'), self.destinationPath('.gitignore')); - self.copy(self.templatePath('gulpfile.js'), self.destinationPath('gulpfile.js')); - self.fs.copyTpl(self.templatePath('index.html_vm'), self.destinationPath('index.html'), self.obj); + self.directory(self.templatePath('css'), self.destinationPath('css')); + self.fs.copy(self.templatePath('eslintrc'), self.destinationPath('.eslintrc')); + self.fs.copy(self.templatePath('gitignore'), self.destinationPath('.gitignore')); + self.fs.copy(self.templatePath('index.html_vm'), self.destinationPath('index.html_vm')); + self.fs.copyTpl(self.templatePath('package.json_vm'), self.destinationPath('package.json'), self.obj); - self.copy(self.templatePath('webpack.config.dev.js'), self.destinationPath('webpack.config.dev.js')); - self.copy(self.templatePath('webpack.config.prod.js'), self.destinationPath('webpack.config.prod.js')); + + self.fs.copyTpl(self.templatePath('webpack.config.dev.js'), + self.destinationPath('webpack.config.dev.js'), self.obj); + + self.fs.copyTpl(self.templatePath('webpack.config.prod.js'), + self.destinationPath('webpack.config.prod.js'), self.obj); }, install: function() { - this.npmInstall(undefined, { - registry: this.answers.registry - }); + this.npmInstall(null, {registry: this.answers.registry}); }, end: function() { this.log.ok('Project ' + this.answers.name + ' generated!!!'); diff --git a/generators/app/templates/css/main.css b/generators/app/templates/css/main.css new file mode 100644 index 0000000..d6de91b --- /dev/null +++ b/generators/app/templates/css/main.css @@ -0,0 +1,177 @@ +/* body */ +*{ + box-sizing: border-box; +} + +html, body{ + margin: 0; + padding: 0; +} + +body{ + font-family: 'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif; +} + +a[disabled]{ + pointer-events: none; + color: #7f8c8d; +} + +a{ + text-decoration: none; + color: #2E64FE; +} + +[ng-view]{ + text-align: center; +} + +/* nav */ +#nav { + list-style-type: none; + text-align: center; + padding: 0; + margin: 0; +} + +#nav li { + display: inline-block; + line-height: 40px; +} + +.nav-link { + color: #7f8c8d; + cursor: pointer; + text-decoration: none; + padding-bottom: 3px; + margin: 0 25px; +} + +.nav-link.active { + color: #424242; +} + +.nav-link:first-child { + margin-left: 0; +} + +.nav-link:hover { + border-bottom: 3px solid #dd1b16; +} + +/* logo */ +#logo-wrap { + margin: 55px 0 20px 0; +} + +#logo-wrap img{ + margin-bottom: 15px; +} + +#logo-wrap h1 { + font-family: 'Dosis', 'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif; + font-weight: 400; + font-size: 27px; +} + +#desc { + max-width: 800px; + padding: 0 20px; + text-align: center; + margin: 10px auto; + color: #7f8c8d; +} + +#github{ + margin: 30px 0 30px 0; +} + +#todo-app{ + width: 250px; + margin: 0 auto; +} + +#todo-app input[type="text"]{ + width: 250px; + height: 35px; + font-size: 16px; + padding: 6px 12px; + border: 1px solid #ccc; + border-radius: 4px; + margin-bottom: 10px; +} + +#todo-app .todos{ + width: 100%; + list-style-type: none; + margin: 10px 0 10px 0 ; + padding: 0; + text-align: left; +} + +#todo-app .todos li{ + padding-top: 4px; +} + +#todo-app .todos li span{ + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + width: 225px; + display: inline-block; + line-height: 24px; + vertical-align: middle; +} + +#todo-app .archive{ + text-decoration: none; +} + +#why{ + width: 600px; + margin: 55px auto 15px auto; + padding: 5px; + text-align: left; + border: 1px solid #D8D8D8; + border-radius: 2px; + background-color: #f7f7f9; +} + +#why h4{ + margin-top: 0; +} + +#why ul li { + padding-top: 5px; +} + +#more{ + width: 600px; + margin: 30px auto 15px auto; + padding: 5px; +} + +#more .button{ + display: inline-block; + width: 150px; + height: 35px; + line-height: 35px; + color: #fff; + border-radius: 2px; + border-width: 0; + background-color: #FE2E2E; + box-shadow: 2px 2px 1px #a6120d; + transition: all 0.3s ease 0s; +} + +#more .button:hover{ + box-shadow: 4px 4px 2px #a6120d; +} + +/* footer */ +#footer{ + margin-top: 20px; + text-align: center; + padding: 20px 0; + background-color: #D8D8D8; +} diff --git a/generators/app/templates/eslintrc b/generators/app/templates/eslintrc new file mode 100644 index 0000000..be86970 --- /dev/null +++ b/generators/app/templates/eslintrc @@ -0,0 +1,196 @@ +{ + "parserOptions":{ + "ecmaVersion": 6, + "sourceType": "module", + "ecmaFeatures": { + "globalReturn": true, + "impliedStrict": false, + "jsx": false, + "experimentalObjectRestSpread": true + } + }, + "env": { + "shared-node-browser": true, + "browser": true, + "commonjs": true, + "node": true, + "es6": true, + "mocha": true, + "jquery": true + }, + "rules": { + "comma-dangle": [2, "never"], + "no-cond-assign": [2, "except-parens"], + "no-console": 0, + "no-constant-condition": 1, + "no-control-regex": 2, + "no-debugger": 2, + "no-dupe-args": 2, + "no-dupe-keys": 2, + "no-duplicate-case": 2, + "no-empty-character-class": 1, + "no-empty": 1, + "no-ex-assign": 2, + "no-extra-boolean-cast": 1, + "no-extra-parens": [1, "functions"], + "no-extra-semi": 2, + "no-func-assign": 2, + "no-inner-declarations": [1, "functions"], + "no-invalid-regexp": 2, + "no-irregular-whitespace": 1, + "no-negated-in-lhs": 2, + "no-obj-calls": 2, + "no-regex-spaces": 1, + "no-sparse-arrays": 2, + "no-unexpected-multiline": 2, + "no-unreachable": 2, + "use-isnan": 2, + "valid-jsdoc": 0, + "valid-typeof": 2, + "accessor-pairs": [1, { "getWithoutSet": true, "setWithoutGet": true }], + "array-callback-return": 1, + "block-scoped-var": 0, + "complexity": [1, 7], + "consistent-return": 0, + "curly": 1, + "default-case": 2, + "dot-location": [1, "property"], + "dot-notation": [1, { "allowKeywords": true}], + "eqeqeq": 2, + "guard-for-in": 0, + "no-alert": 2, + "no-caller": 2, + "no-case-declarations": 2, + "no-div-regex": 1, + "no-else-return": 1, + "no-empty-function": 0, + "no-empty-pattern": 2, + "no-eq-null": 2, + "no-eval": 2, + "no-extend-native": 1, + "no-extra-bind": 1, + "no-extra-label": 1, + "no-fallthrough": 2, + "no-floating-decimal": 2, + "no-implicit-coercion": 0, + "no-implicit-globals": 0, + "no-implied-eval": 2, + "no-invalid-this": 0, + "no-iterator": 1, + "no-labels": [2, {"allowLoop": false, "allowSwitch": false}], + "no-lone-blocks": 2, + "no-loop-func": 2, + "no-magic-numbers": 0, + "no-multi-spaces": 1, + "no-multi-str": 2, + "no-native-reassign": 2, + "no-new-func": 2, + "no-new-wrappers": 2, + "no-new": 1, + "no-octal-escape": 1, + "no-octal": 1, + "no-param-reassign": [2, {"props": false}], + "no-process-env": 0, + "no-proto": 2, + "no-redeclare": [2, { "builtinGlobals": true }], + "no-return-assign": [2, "except-parens"], + "no-script-url": 2, + "no-self-assign": 2, + "no-self-compare": 2, + "no-sequences": 2, + "no-throw-literal": 2, + "no-unmodified-loop-condition": 1, + "no-unused-expressions": [2, { "allowShortCircuit": true, "allowTernary": false }], + "no-unused-labels": 1, + "no-useless-call": 1, + "no-useless-concat": 1, + "no-void": 2, + "no-warning-comments": [1, { "terms": ["todo", "fix"], "location": "anywhere" }], + "no-with": 2, + "radix": [2, "as-needed"], + "vars-on-top": 0, + "wrap-iife": [2, "outside"], + "yoda": [1, "never", { "onlyEquality": true }], + "strict": [1, "safe"], + "init-declarations": 0, + "no-catch-shadow": 2, + "no-delete-var": 2, + "no-label-var": 2, + "no-shadow-restricted-names": 2, + "no-shadow": [2, {"builtinGlobals": false, "hoist": "functions"}], + "no-undef-init": 1, + "no-undef": [2, { "typeof": false }], + "no-undefined": 1, + "no-unused-vars": [1, { "vars": "all", "args": "none" }], + "no-use-before-define": [1, {"functions": true, "classes": true}], + "array-bracket-spacing": [1, "never"], + "block-spacing": [1, "always"], + "brace-style": [1, "1tbs", { "allowSingleLine": true }], + "camelcase": [1, {"properties": "never"}], + "comma-spacing": [2, {"before": false, "after": true}], + "comma-style": [1, "last"], + "computed-property-spacing": [1, "never"], + "consistent-this": [1, "_this", "self", "ctx"], + "eol-last": [1, "unix"], + "func-names": 0, + "func-style": [1, "expression", { "allowArrowFunctions": true }], + "id-length": [2, {"min": 1, "max": 35, "properties": "never"}], + "id-match": 0, + "id-blacklist": 0, + "indent": [1, 4, {"VariableDeclarator": 1, "SwitchCase": 1}], + "jsx-quotes": 0, + "key-spacing": [1, {"beforeColon": false, "afterColon": true}], + "keyword-spacing": [1, {"before": true, "after": true}], + "linebreak-style": [1, "unix"], + "lines-around-comment": [1, { "beforeBlockComment": true, "afterBlockComment": false, "beforeLineComment": true, "afterLineComment": false, "allowBlockStart": true, "allowBlockEnd": true, "allowObjectStart": true, "allowArrayStart": false, "allowArrayEnd": false }], + "max-depth": [1, 5], + "max-len": [1, {"code": 120, "comments": 120, "tabWidth": 4, "ignoreUrls": true}], + "max-nested-callbacks": [1, 5], + "max-params": [1, 10], + "max-statements": [1, 12, {"ignoreTopLevelFunctions": true}], + "new-cap": [1, {"newIsCap": true, "capIsNew": true, "properties": false}], + "new-parens": 1, + "newline-after-var": 0, + "newline-per-chained-call": 0, + "no-array-constructor": 1, + "no-bitwise": 0, + "no-continue": 0, + "no-inline-comments": 0, + "no-lonely-if": 1, + "no-mixed-spaces-and-tabs": 1, + "no-multiple-empty-lines": [1, {"max": 2}], + "no-negated-condition": 0, + "no-nested-ternary": 1, + "no-new-object": 1, + "no-plusplus": 0, + "no-restricted-syntax": [1, "WithStatement"], + "no-whitespace-before-property": 1, + "no-spaced-func": 1, + "no-ternary": 0, + "no-trailing-spaces": [1, { "skipBlankLines": true }], + "no-underscore-dangle": 0, + "no-unneeded-ternary": 1, + "object-curly-spacing": [1, "never"], + "one-var": 0, + "one-var-declaration-per-line": 0, + "operator-assignment": 0, + "operator-linebreak": 0, + "padded-blocks": 0, + "quote-props": [1, "as-needed"], + "quotes": [1, "single"], + "require-jsdoc": 0, + "semi-spacing": [2, { "before": false, "after": true }], + "semi": [1, "always"], + "sort-vars": 0, + "sort-imports": 0, + "space-before-blocks": [1, { "functions": "always", "keywords": "always", "classes": "always" }], + "space-before-function-paren": [1, {"anonymous": "never", "named": "never"}], + "space-in-parens": [1, "never"], + "space-infix-ops": 1, + "space-unary-ops": [1, { "words": true, "nonwords": false }], + "spaced-comment": 0, + "wrap-regex": 0 + }, + "globals": { + } +} diff --git a/generators/app/templates/etc/config.js b/generators/app/templates/etc/config.js index 194a808..f01a7b3 100644 --- a/generators/app/templates/etc/config.js +++ b/generators/app/templates/etc/config.js @@ -6,10 +6,5 @@ * @date <%= answers.date %> * **/ -'use strict'; -export default { - 'appname': '<%= answers.name %>', - 'version': '1.0.0', - 'api': 'mock' -}; +export default {appname: '<%= answers.name %>', version: '1.0.0'}; diff --git a/generators/app/templates/font/fontello.eot b/generators/app/templates/font/fontello.eot deleted file mode 100644 index 4301e3c15b097fe59e4c9ba002fe8aa3d73b8919..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9168 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 CM*g<| diff --git a/generators/app/templates/font/fontello.svg b/generators/app/templates/font/fontello.svg deleted file mode 100644 index 91684a2..0000000 --- a/generators/app/templates/font/fontello.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - -Copyright (C) 2016 by original authors @ fontello.com - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/generators/app/templates/font/fontello.ttf b/generators/app/templates/font/fontello.ttf deleted file mode 100644 index b388a46a2f35be0c44ac708f01353f3d118244a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9000 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 literal 0 HcmV?d00001 diff --git a/generators/app/templates/img/avatar.png b/generators/app/templates/img/avatar.png deleted file mode 100644 index 3d4eafab2f8f391baad87490cfead84e28e1c2ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31033 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 diff --git a/generators/app/templates/index.html_vm b/generators/app/templates/index.html_vm index 1da315f..c2106d8 100644 --- a/generators/app/templates/index.html_vm +++ b/generators/app/templates/index.html_vm @@ -1,13 +1,11 @@ -<% if (answers.pushState) { %><% } %> - + + <% if (htmlWebpackPlugin.options.pushState) { %><% } %> + + -
-
-
+
- - - + diff --git a/generators/app/templates/js/features/about/Routes.js b/generators/app/templates/js/features/about/Routes.js new file mode 100644 index 0000000..8563c99 --- /dev/null +++ b/generators/app/templates/js/features/about/Routes.js @@ -0,0 +1,21 @@ +/** + * + * Routes module expose route information used in about feature + * + * @author <%= answers.username %> + * @date <%= answers.date %> + * + */ + +import tpl from './partials/about.html'; + +export default [ + { + id: 'about', + isDefault: false, + when: '/about', + controller: 'AboutController', + controllerAs: 'about', + template: tpl + } +]; diff --git a/generators/app/templates/js/features/about/controller/AboutController.js b/generators/app/templates/js/features/about/controller/AboutController.js new file mode 100644 index 0000000..5f9c042 --- /dev/null +++ b/generators/app/templates/js/features/about/controller/AboutController.js @@ -0,0 +1,26 @@ +/** + * Defines the AboutController controller + * + * @author <%= answers.username %> + * @date <%= answers.date %> + * + */ + +class AboutController { + + /*@ngInject*/ + constructor($scope) { + this.$scope = $scope; + + this._init_(); + this._destroy_(); + } + + _init_() {} + + _destroy_() { + this.$scope.$on('$destroy', function() {}); + } +} + +export default AboutController; diff --git a/generators/app/templates/js/features/list/main.js b/generators/app/templates/js/features/about/main.js similarity index 71% rename from generators/app/templates/js/features/list/main.js rename to generators/app/templates/js/features/about/main.js index fc0aeac..56493be 100644 --- a/generators/app/templates/js/features/list/main.js +++ b/generators/app/templates/js/features/about/main.js @@ -8,11 +8,10 @@ * * ****************************************************************************************************** */ -'use strict'; + import FeatureBase from 'lib/FeatureBase'; import Routes from './Routes'; -import ListController from './controller/ListController'; -import ListService from './service/ListService'; +import AboutController from './controller/AboutController'; class Feature extends FeatureBase { @@ -22,8 +21,7 @@ class Feature extends FeatureBase { } execute() { - this.controller('ListController', ListController); - this.service('ListService', ListService); + this.controller('AboutController', AboutController); } } diff --git a/generators/app/templates/js/features/about/partials/about.html b/generators/app/templates/js/features/about/partials/about.html new file mode 100644 index 0000000..1c6523b --- /dev/null +++ b/generators/app/templates/js/features/about/partials/about.html @@ -0,0 +1,15 @@ +
+

You may choose it if you are looking for skeleton with:

+
    +
  • full featured dev/dist tools
  • +
  • flexible structure, external libraries can be easily injected
  • +
  • robust functionality, no black magic behind, just AngularJS usage
  • +
  • ES2015 implementation
  • +
+
+ + diff --git a/generators/app/templates/js/features/common/logical/Header.html b/generators/app/templates/js/features/common/logical/Header.html new file mode 100644 index 0000000..3ca51c9 --- /dev/null +++ b/generators/app/templates/js/features/common/logical/Header.html @@ -0,0 +1,8 @@ + diff --git a/generators/app/templates/js/features/common/logical/Header.js b/generators/app/templates/js/features/common/logical/Header.js new file mode 100644 index 0000000..dfa7e2d --- /dev/null +++ b/generators/app/templates/js/features/common/logical/Header.js @@ -0,0 +1,45 @@ +/** + * Defines the Toolbar of whole application. + * + * @author <%= answers.username %> + * @date <%= answers.date %> + * + */ + +import FeatureBase from 'lib/FeatureBase'; +import HeaderTpl from './Header.html'; +import {element} from 'angular'; + +class Feature extends FeatureBase { + + constructor() { + super('HeaderModule'); + this.$body = element(document.body); + } + + beforeStart() { + this.$body.prepend(HeaderTpl); + } + + _HeaderController($scope, $rootScope) { + 'ngInject'; + + $scope.route = 'home'; + + $scope.activeRoute = function(name) { + $scope.route = name; + }; + + $rootScope.$on('$routeChangeSuccess', function(e, next) { + if (next.$$route && next.$$route.id) { + $scope.route = next.$$route.id; + } + }); + } + + execute() { + this.controller('HeaderController', this._HeaderController); + } +} + +export default Feature; diff --git a/generators/app/templates/js/features/common/logical/Sidebar.html b/generators/app/templates/js/features/common/logical/Sidebar.html deleted file mode 100644 index 69b3b03..0000000 --- a/generators/app/templates/js/features/common/logical/Sidebar.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - -

HOME

-
- - -

LIST

-
-
-
diff --git a/generators/app/templates/js/features/common/logical/Sidebar.js b/generators/app/templates/js/features/common/logical/Sidebar.js deleted file mode 100644 index dab4046..0000000 --- a/generators/app/templates/js/features/common/logical/Sidebar.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Defines the Sidebar of whole application. - * - * @author <%= answers.username %> - * @date <%= answers.date %> - * - */ -'use strict'; - -import FeatureBase from 'lib/FeatureBase'; -import SidebarTpl from './Sidebar.html'; -import { element } from 'angular'; - -class Feature extends FeatureBase { - - constructor() { - super('SidebarModule'); - } - - beforeStart() { - element(document.querySelector('#main')).prepend(SidebarTpl); - } - - /*@ngInject*/ - _SidebarController($scope, $mdSidenav, utils, $location) { - $scope.go = function($event, target) { - utils.stopEvent($event); - $location.path(target); - $mdSidenav('left-side').toggle(); - }; - } - - execute() { - this.controller('SidebarController', this._SidebarController); - } -} - -export default Feature; diff --git a/generators/app/templates/js/features/common/logical/Toolbar.html b/generators/app/templates/js/features/common/logical/Toolbar.html deleted file mode 100644 index adef72f..0000000 --- a/generators/app/templates/js/features/common/logical/Toolbar.html +++ /dev/null @@ -1,18 +0,0 @@ - -
- - - - - - - - - - - - - - -
-
diff --git a/generators/app/templates/js/features/common/logical/Toolbar.js b/generators/app/templates/js/features/common/logical/Toolbar.js deleted file mode 100644 index d2fec8a..0000000 --- a/generators/app/templates/js/features/common/logical/Toolbar.js +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Defines the Toolbar of whole application. - * - * @author <%= answers.username %> - * @date <%= answers.date %> - * - */ -'use strict'; - -import FeatureBase from 'lib/FeatureBase'; -import ToolbarTpl from './Toolbar.html'; -import { element } from 'angular'; - -class Feature extends FeatureBase { - - constructor() { - super('ToolbarModule'); - this.$body = element(document.body); - } - - beforeStart() { - this.$body.prepend(ToolbarTpl); - } - - /*@ngInject*/ - _ToolbarController($scope, $mdSidenav, utils, $location) { - $scope.toggleSidebar = function(componentId) { - $mdSidenav(componentId).toggle(); - }; - - $scope.go = function($event, target) { - utils.stopEvent($event); - $location.path(target); - }; - } - - execute() { - this.controller('ToolbarController', this._ToolbarController); - } -} - -export default Feature; diff --git a/generators/app/templates/js/features/common/logical/main.js b/generators/app/templates/js/features/common/logical/main.js index b9ed946..3390e1c 100644 --- a/generators/app/templates/js/features/common/logical/main.js +++ b/generators/app/templates/js/features/common/logical/main.js @@ -5,9 +5,7 @@ * @date <%= answers.date %> * */ -'use strict'; -import toolbar from './Toolbar'; -import sidebar from './Sidebar'; +import header from './Header'; -export default [sidebar, toolbar]; +export default [header]; diff --git a/generators/app/templates/js/features/common/main.js b/generators/app/templates/js/features/common/main.js index 461c84d..7893cf2 100644 --- a/generators/app/templates/js/features/common/main.js +++ b/generators/app/templates/js/features/common/main.js @@ -6,7 +6,7 @@ * @date <%= answers.date %> * */ -'use strict'; + import logical from './logical/main'; import ui from './ui/main'; diff --git a/generators/app/templates/js/features/common/ui/Autofocus.js b/generators/app/templates/js/features/common/ui/Autofocus.js index 283f59b..2422eb3 100644 --- a/generators/app/templates/js/features/common/ui/Autofocus.js +++ b/generators/app/templates/js/features/common/ui/Autofocus.js @@ -6,7 +6,6 @@ * @date <%= answers.date %> * */ -'use strict'; import FeatureBase from 'lib/FeatureBase'; @@ -16,7 +15,7 @@ class Feature extends FeatureBase { super('AutofocusModule'); } - autoFocus() { + _autoFocus() { return { restrict: 'A', link: function($scope, element) { @@ -26,7 +25,7 @@ class Feature extends FeatureBase { } execute() { - this.directive('autofocus', this.autoFocus); + this.directive('autofocus', this._autoFocus); } } diff --git a/generators/app/templates/js/features/common/ui/RouteIndicator.js b/generators/app/templates/js/features/common/ui/RouteIndicator.js index b0b5faa..43c22ca 100644 --- a/generators/app/templates/js/features/common/ui/RouteIndicator.js +++ b/generators/app/templates/js/features/common/ui/RouteIndicator.js @@ -6,9 +6,8 @@ * @date <%= answers.date %> * */ -'use strict'; -import { element } from 'angular'; +import {element} from 'angular'; import pluck from 'lib/Pluck'; import FeatureBase from 'lib/FeatureBase'; @@ -18,7 +17,7 @@ class Feature extends FeatureBase { super('RouteIndicator'); } - indicator($rootScope, Routes) { + _indicator($rootScope, Routes) { 'ngInject'; var $body = element(document.body); @@ -33,7 +32,7 @@ class Feature extends FeatureBase { } execute() { - this.run(this.indicator); + this.run(this._indicator); } } diff --git a/generators/app/templates/js/features/common/ui/main.js b/generators/app/templates/js/features/common/ui/main.js index 48cb39b..e4aadbf 100644 --- a/generators/app/templates/js/features/common/ui/main.js +++ b/generators/app/templates/js/features/common/ui/main.js @@ -5,7 +5,6 @@ * @date <%= answers.date %> * */ -'use strict'; import autofocus from './Autofocus'; import routeIndicator from './RouteIndicator'; diff --git a/generators/app/templates/js/features/home/Routes.js b/generators/app/templates/js/features/home/Routes.js index 68b4e1b..cdbd2aa 100644 --- a/generators/app/templates/js/features/home/Routes.js +++ b/generators/app/templates/js/features/home/Routes.js @@ -6,7 +6,6 @@ * @date <%= answers.date %> * */ -'use strict'; import tpl from './partials/home.html'; diff --git a/generators/app/templates/js/features/home/controller/HomeController.js b/generators/app/templates/js/features/home/controller/HomeController.js index ea2a9ff..afabe90 100644 --- a/generators/app/templates/js/features/home/controller/HomeController.js +++ b/generators/app/templates/js/features/home/controller/HomeController.js @@ -5,47 +5,48 @@ * @date <%= answers.date %> * */ -'use strict'; + +import logoUrl from 'img/AngularJS-large.png'; class HomeController { /*@ngInject*/ - constructor($scope, utils, HomeService, $mdToast, $mdDialog) { + constructor($scope, HomeService) { this.$scope = $scope; - this.utils = utils; this.HomeService = HomeService; - this.$mdToast = $mdToast; - this.$mdDialog = $mdDialog; this._init_(); this._destroy_(); } _init_() { - this.state = {}; - this.HomeService.getStates() - .success(data => this.states = data); + this.logoUrl = logoUrl; + this.todos = []; + this.HomeService + .getInitTodos() + .then(todos => { + this.todos = todos; + }); + } + + addTodo(e) { + if (e.keyCode !== 13) { + return; + } + this.todos.push({txt: e.target.value}); + e.target.value = ''; + } + + toggleTodo(todo) { + todo.finished = !todo.finished; } - toast() { - this.$mdToast.show( - this.$mdToast.simple() - .textContent('Simple Toast!') - .position('top') - .hideDelay(3000) - ); + remaining() { + return this.todos.reduce((n, todo) => n + Number(!todo.finished), 0); } - dialog($event) { - this.$mdDialog.show( - this.$mdDialog.alert() - .clickOutsideToClose(true) - .title('This is an alert title') - .textContent('You can specify some description text in here.') - .ariaLabel('Alert Dialog Demo') - .ok('Got it!') - .targetEvent($event) - ); + archive() { + this.todos = this.todos.filter(todo => !todo.finished); } _destroy_() { diff --git a/generators/app/templates/js/features/home/main.js b/generators/app/templates/js/features/home/main.js index d99a598..eaf238a 100644 --- a/generators/app/templates/js/features/home/main.js +++ b/generators/app/templates/js/features/home/main.js @@ -8,7 +8,7 @@ * * ****************************************************************************************************** */ -'use strict'; + import FeatureBase from 'lib/FeatureBase'; import Routes from './Routes'; import HomeController from './controller/HomeController'; diff --git a/generators/app/templates/js/features/home/partials/home.html b/generators/app/templates/js/features/home/partials/home.html index da042e0..09ab19a 100644 --- a/generators/app/templates/js/features/home/partials/home.html +++ b/generators/app/templates/js/features/home/partials/home.html @@ -1,93 +1,38 @@ - - - - - ES2015 AngularJS Skeleton - - - -

- This page demonstrate you the basis of this skeleton. And some common components were implemented for use. Feel free to register issue while encountering problems -

-
- - - - -
- - - - - - - {{ item }} - - - - - flat - raised button - - - - - - - toast - - - - dialog - - - - - - - - - Switch 1: {{ data.cb1 }} - - - - - - Checkbox 2 (md-warn)
- - You would never know what is this! But you can click it - -
- {{ state.checkbox }} -
-
- - - - - - - - - - - - - - - -
-
- - -
+
+ +

generator-es6-angular

+
+ +

+ Flexible, robust skeleton for AngularJS, including full featured dev/release process

+ Very welcome to give me feedbacks!

+ Stars would be the best^^!! +

+ +
+ + +
+ +
+

Simple TODO app

+ + + {{ home.remaining() }} of {{ home.todos.length }} remaining + +
    +
  • + + + {{ todo.txt }} + +
  • +
+ + archive +
+ + diff --git a/generators/app/templates/js/features/home/service/HomeService.js b/generators/app/templates/js/features/home/service/HomeService.js index 8ea52c0..af7e3c9 100644 --- a/generators/app/templates/js/features/home/service/HomeService.js +++ b/generators/app/templates/js/features/home/service/HomeService.js @@ -5,7 +5,6 @@ * @date <%= answers.date %> * */ -'use strict'; class HomeService { @@ -15,8 +14,22 @@ class HomeService { this.utils = utils; } - getStates() { - return this.$http.get(this.utils.getApi('/states')); + getInitTodos() { + return Promise.resolve([ + { + finished: true, + txt: 'Learn JavaScript' + }, + { + txt: 'Learn AngularJS' + }, + { + txt: 'Learn webpack' + }, + { + txt: 'Learn node' + } + ]); } } diff --git a/generators/app/templates/js/features/list/Routes.js b/generators/app/templates/js/features/list/Routes.js deleted file mode 100644 index 4610928..0000000 --- a/generators/app/templates/js/features/list/Routes.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * - * Routes module expose route information used in list feature - * - * @author <%= answers.username %> - * @date <%= answers.date %> - * - */ -'use strict'; -import tpl from './partials/list.html'; - -export default [ - { - id: 'list', - isDefault: false, - when: '/list', - controller: 'ListController', - controllerAs: 'list', - template: tpl - } -]; diff --git a/generators/app/templates/js/features/list/controller/ListController.js b/generators/app/templates/js/features/list/controller/ListController.js deleted file mode 100644 index f33aec1..0000000 --- a/generators/app/templates/js/features/list/controller/ListController.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Defines the ListController controller - * - * @author <%= answers.username %> - * @date <%= answers.date %> - * - */ -'use strict'; - -class ListController { - - /*@ngInject*/ - constructor($scope, ListService) { - this.$scope = $scope; - this.ListService = ListService; - - this._init_(); - this._destroy_(); - } - - _init_() { - this.ListService - .getDemoList() - .success(data => this.demolist = data) - .error(err => console.log(err)); - } - - _destroy_() { - this.$scope.$on('$destroy', function() {}); - } -} - -export default ListController; diff --git a/generators/app/templates/js/features/list/partials/list.html b/generators/app/templates/js/features/list/partials/list.html deleted file mode 100644 index a5df596..0000000 --- a/generators/app/templates/js/features/list/partials/list.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - Listing here - - avatar -
-

{{ item.subjectId }}

-

{{ item.subjectName }}

-

{{ item.indexDelta }}

-
-
-
-
-
diff --git a/generators/app/templates/js/features/list/service/ListService.js b/generators/app/templates/js/features/list/service/ListService.js deleted file mode 100644 index ab463ab..0000000 --- a/generators/app/templates/js/features/list/service/ListService.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Defines the ListService - * - * @author <%= answers.username %> - * @date <%= answers.date %> - * - */ -'use strict'; -class ListService { - - /*@ngInject*/ - constructor($http, utils) { - this.$http = $http; - this.utils = utils; - } - - getDemoList() { - return this.$http.get(this.utils.getApi('/demolist')); - } - -} - -export default ListService; diff --git a/generators/app/templates/js/features/main.js b/generators/app/templates/js/features/main.js index 559beb3..b688f9d 100644 --- a/generators/app/templates/js/features/main.js +++ b/generators/app/templates/js/features/main.js @@ -5,9 +5,9 @@ * @date <%= answers.date %> * */ -'use strict'; + import common from './common/main'; import home from './home/main'; -import list from './list/main'; +import about from './about/main'; -export default [list, ...common, home]; +export default [about, ...common, home]; diff --git a/generators/app/templates/js/fw/config/MaterialConfig.js b/generators/app/templates/js/fw/config/MaterialConfig.js deleted file mode 100644 index fb97733..0000000 --- a/generators/app/templates/js/fw/config/MaterialConfig.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * - * MaterialConfig set angular-material needed configurations - * - * @author <%= answers.username %> - * @date <%= answers.date %> - * - */ -'use strict'; -import ConfiguratorBase from 'lib/ConfiguratorBase'; - -class Configurator extends ConfiguratorBase { - constructor(features, app) { - super(features, app); - } - - execute() { - this.config(function($mdThemingProvider) { - 'ngInject'; - - $mdThemingProvider - .theme('default') - .primaryPalette('indigo') - .accentPalette('green') - .warnPalette('red'); - }); - } -} - -export default Configurator; diff --git a/generators/app/templates/js/fw/config/RouterConfig.js b/generators/app/templates/js/fw/config/RouterConfig.js index f033b2f..83d584d 100644 --- a/generators/app/templates/js/fw/config/RouterConfig.js +++ b/generators/app/templates/js/fw/config/RouterConfig.js @@ -7,7 +7,6 @@ * @date <%= answers.date %> * */ -'use strict'; import ConfiguratorBase from 'lib/ConfiguratorBase'; import pluck from 'lib/Pluck'; import omit from 'lib/Omit'; @@ -17,7 +16,7 @@ class Configurator extends ConfiguratorBase { super(features, app); } - routeConfig($locationProvider, $routeProvider){ + _routeConfig($locationProvider, $routeProvider){ //config each router this.routes.forEach(function(ro) { $routeProvider @@ -25,9 +24,7 @@ class Configurator extends ConfiguratorBase { }); //config default page - var defaultRouter = this.routes.filter(function(route) { - return route.isDefault; - })[0]; + var defaultRouter = this.routes.filter(route => route.isDefault)[0]; if (defaultRouter) { $routeProvider.otherwise({ redirectTo: defaultRouter.when @@ -41,27 +38,14 @@ class Configurator extends ConfiguratorBase { $locationProvider.html5Mode(false); <% } %> } - execute() { - if (!this.features || this.features.length === 0) { - console.warn('No features loaded'); - return; - } - - this.routes = this.features - .filter(function(feature) { - return feature.routes && feature.routes.length > 0; - }) - .map(function(feature) { - return feature.routes; - }) - .reduce(function(previous, current) { - return previous.concat(current); - }, []); - - var defaultRoutes = this.routes.filter(function(route) { - return route.isDefault; - }); + _filterRoutes(){ + return this.features + .filter(feature => feature.routes && feature.routes.length > 0) + .map(feature => feature.routes) + .reduce((previous, current) => previous.concat(current), []); + } + _startupWarning(routes, defaultRoutes){ if (defaultRoutes.length === 0) { console.warn('There is no any default route set. Try setting isDefault to the route you preferred'); } else if (defaultRoutes.length > 1) { @@ -69,17 +53,30 @@ class Configurator extends ConfiguratorBase { console.warn('You have set [' + defaultRoutes.length + '] default routes, they are [' + defaultWhens.join(', ') + ']. Try to correct it'); } - var routeWhens = pluck(this.routes, 'when').sort(); + var routeWhens = pluck(routes, 'when').sort(); for (var i = 0; i < routeWhens.length - 1; i++) { if (routeWhens[i] === routeWhens[i + 1]) { throw new Error('Duplicated Route: [ ' + routeWhens[i] + ' ]'); } } + } + + execute() { + if (!this.features || this.features.length === 0) { + console.warn('No features loaded'); + return; + } + + this.routes = this._filterRoutes(); + + var defaultRoutes = this.routes.filter(route => route.isDefault); + + this._startupWarning(this.routes, defaultRoutes); this.constant('Routes', this.routes); - var routeConfig = this.routeConfig.bind(this); + var routeConfig = this._routeConfig.bind(this); routeConfig.$inject = ['$locationProvider', '$routeProvider']; this.config(routeConfig); diff --git a/generators/app/templates/js/fw/config/SSOConfig.js b/generators/app/templates/js/fw/config/SSOConfig.js index 28e6606..f29a626 100644 --- a/generators/app/templates/js/fw/config/SSOConfig.js +++ b/generators/app/templates/js/fw/config/SSOConfig.js @@ -5,7 +5,6 @@ * @date <%= answers.date %> * */ -'use strict'; import ConfiguratorBase from 'lib/ConfiguratorBase'; class Configurator extends ConfiguratorBase { @@ -13,7 +12,7 @@ class Configurator extends ConfiguratorBase { super(features, app); } - httpConfig($httpProvider) { + _httpConfig($httpProvider) { 'ngInject'; $httpProvider.defaults.headers.common.Accept = 'application/json;charset=utf-8'; @@ -21,7 +20,7 @@ class Configurator extends ConfiguratorBase { } execute() { - this.config(this.httpConfig); + this.config(this._httpConfig); } } diff --git a/generators/app/templates/js/fw/config/main.js b/generators/app/templates/js/fw/config/main.js index 5d7a15c..7a805c6 100644 --- a/generators/app/templates/js/fw/config/main.js +++ b/generators/app/templates/js/fw/config/main.js @@ -6,10 +6,8 @@ * @date <%= answers.date %> * */ -'use strict'; -import material from './MaterialConfig'; import router from './RouterConfig'; import sso from './SSOConfig'; -export default [material, router, sso]; +export default [router, sso]; diff --git a/generators/app/templates/js/fw/ext/main.js b/generators/app/templates/js/fw/ext/main.js index 0953f30..f4d92b0 100644 --- a/generators/app/templates/js/fw/ext/main.js +++ b/generators/app/templates/js/fw/ext/main.js @@ -5,20 +5,7 @@ * @date <%= answers.date %> * */ -'use strict'; -import 'angular-animate'; import 'angular-route'; -import 'angular-sanitize'; -import 'angular-aria'; -import 'angular-messages'; -import 'angular-material'; -export default [ - 'ngAnimate', - 'ngRoute', - 'ngSanitize', - 'ngAria', - 'ngMessages', - 'ngMaterial' -]; +export default ['ngRoute']; diff --git a/generators/app/templates/js/fw/init/Header.js b/generators/app/templates/js/fw/init/Header.js index 0e746ad..449d34e 100644 --- a/generators/app/templates/js/fw/init/Header.js +++ b/generators/app/templates/js/fw/init/Header.js @@ -6,9 +6,9 @@ * @date <%= answers.date %> * */ -'use strict'; + import InitBase from 'lib/InitBase'; -import { element } from 'angular'; +import {element} from 'angular'; import __config from 'etc/config'; class Initializer extends InitBase { diff --git a/generators/app/templates/js/fw/init/Validator.js b/generators/app/templates/js/fw/init/Validator.js index c1a2ca2..5d98ca0 100644 --- a/generators/app/templates/js/fw/init/Validator.js +++ b/generators/app/templates/js/fw/init/Validator.js @@ -6,7 +6,7 @@ * @date <%= answers.date %> * */ -'use strict'; + import InitBase from 'lib/InitBase'; import pluck from 'lib/Pluck'; @@ -17,8 +17,7 @@ class Initializer extends InitBase { execute() { if (!this.features || this.features.length === 0) { - console.warn('No features loaded'); - return; + return console.warn('No features loaded'); } var modNames = pluck(this.features, 'export').sort(); diff --git a/generators/app/templates/js/fw/init/main.js b/generators/app/templates/js/fw/init/main.js index 70e61ab..b0a6ffd 100644 --- a/generators/app/templates/js/fw/init/main.js +++ b/generators/app/templates/js/fw/init/main.js @@ -9,7 +9,7 @@ * @date <%= answers.date %> * */ -'use strict'; + import header from './Header'; import validator from './Validator'; diff --git a/generators/app/templates/js/fw/lib/ConfiguratorBase.js b/generators/app/templates/js/fw/lib/ConfiguratorBase.js index fc8c311..2e2d92f 100644 --- a/generators/app/templates/js/fw/lib/ConfiguratorBase.js +++ b/generators/app/templates/js/fw/lib/ConfiguratorBase.js @@ -6,7 +6,7 @@ * @date <%= answers.date %> * */ -'use strict'; + class ConfiguratorBase { constructor(features, app) { @@ -18,8 +18,7 @@ class ConfiguratorBase { this.value = app.value; } - execute() { - } + execute() {} } export default ConfiguratorBase; diff --git a/generators/app/templates/js/fw/lib/FeatureBase.js b/generators/app/templates/js/fw/lib/FeatureBase.js index 074f13b..4003a3d 100644 --- a/generators/app/templates/js/fw/lib/FeatureBase.js +++ b/generators/app/templates/js/fw/lib/FeatureBase.js @@ -6,14 +6,14 @@ * @date <%= answers.date %> * */ -'use strict'; -import angular from 'angular'; + +import {module} from 'angular'; class FeatureBase { constructor(name) { this.export = name; - this.mod = angular.module(this.export, []); + this.mod = module(this.export, []); this.controller = this.mod.controller; this.factory = this.mod.factory; @@ -24,11 +24,9 @@ class FeatureBase { this.run = this.mod.run; } - beforeStart() { - } + beforeStart() {} - execute() { - } + execute() {} } export default FeatureBase; diff --git a/generators/app/templates/js/fw/lib/InitBase.js b/generators/app/templates/js/fw/lib/InitBase.js index 6a990da..8aaa6d6 100644 --- a/generators/app/templates/js/fw/lib/InitBase.js +++ b/generators/app/templates/js/fw/lib/InitBase.js @@ -6,15 +6,14 @@ * @date <%= answers.date %> * */ -'use strict'; + class InitBase { constructor(features) { this.features = features; } - execute() { - } + execute() {} } export default InitBase; diff --git a/generators/app/templates/js/fw/lib/Omit.js b/generators/app/templates/js/fw/lib/Omit.js index 5a734a2..37aa77b 100644 --- a/generators/app/templates/js/fw/lib/Omit.js +++ b/generators/app/templates/js/fw/lib/Omit.js @@ -6,9 +6,8 @@ * @date <%= answers.date %> * */ -'use strict'; -import { isObject, isArray, isString } from 'angular'; +import {isObject, isArray, isString} from 'angular'; var clone = function(obj) { if (typeof obj !== 'object' || !obj) { diff --git a/generators/app/templates/js/fw/lib/Pluck.js b/generators/app/templates/js/fw/lib/Pluck.js index 010614d..7fd7d79 100644 --- a/generators/app/templates/js/fw/lib/Pluck.js +++ b/generators/app/templates/js/fw/lib/Pluck.js @@ -5,9 +5,8 @@ * @date <%= answers.date %> * */ -'use strict'; -import { isArray } from 'angular'; +import {isArray} from 'angular'; var pluck = function(arr, key) { if (!isArray(arr) || arr.length === 0) { diff --git a/generators/app/templates/js/fw/lib/ServiceBase.js b/generators/app/templates/js/fw/lib/ServiceBase.js index 9bc5a27..3b5c2ce 100644 --- a/generators/app/templates/js/fw/lib/ServiceBase.js +++ b/generators/app/templates/js/fw/lib/ServiceBase.js @@ -6,7 +6,7 @@ * @date <%= answers.date %> * */ -'use strict'; + class ServiceBase { constructor(features, app) { @@ -17,8 +17,7 @@ class ServiceBase { this.service = app.service; } - execute() { - } + execute() {} } export default ServiceBase; diff --git a/generators/app/templates/js/fw/service/Utils.js b/generators/app/templates/js/fw/service/Utils.js index bc6b088..f0a655c 100644 --- a/generators/app/templates/js/fw/service/Utils.js +++ b/generators/app/templates/js/fw/service/Utils.js @@ -7,7 +7,7 @@ * @date <%= answers.date %> * */ -'use strict'; + import ServiceBase from 'lib/ServiceBase'; import config from 'etc/config'; @@ -39,20 +39,6 @@ class Service extends ServiceBase { e.preventDefault(); } }; - - this.getApi = function(path) { - if (!path) { - return config.api; - } - var newPath = path; - if (path.indexOf('/') === 0) { - newPath = path.substring(1); - } - if (config.api.lastIndexOf('/') === (config.api.length - 1)) { - return config.api + newPath; - } - return config.api + '/' + newPath; - }; } execute() { diff --git a/generators/app/templates/js/fw/service/main.js b/generators/app/templates/js/fw/service/main.js index 3999c02..43d3059 100644 --- a/generators/app/templates/js/fw/service/main.js +++ b/generators/app/templates/js/fw/service/main.js @@ -5,7 +5,7 @@ * @date <%= answers.date %> * */ -'use strict'; + import utils from './Utils'; export default [utils]; diff --git a/generators/app/templates/js/index.js b/generators/app/templates/js/index.js index c22ea44..ad7dddf 100644 --- a/generators/app/templates/js/index.js +++ b/generators/app/templates/js/index.js @@ -5,16 +5,15 @@ * @date <%= answers.date %> * */ -'use strict'; require.ensure(['splash-screen/splash.min.css', 'splash-screen'], function(require) { require('splash-screen/splash.min.css').use(); require('splash-screen').enable('circular'); }); -require.ensure(['less/main.less', 'splash-screen', './main'], function(require) { +require.ensure(['css/main.css', 'splash-screen', './main'], function(require) { - require('less/main.less'); + require('css/main.css').use(); var App = require('./main').default; (new App()).run(); diff --git a/generators/app/templates/js/main.js b/generators/app/templates/js/main.js index 860dcb2..1edc9f5 100644 --- a/generators/app/templates/js/main.js +++ b/generators/app/templates/js/main.js @@ -5,7 +5,6 @@ * @date <%= answers.date %> * */ -'use strict'; import angular from 'angular'; import Initializers from 'init/main'; import Extensions from 'ext/main'; diff --git a/generators/app/templates/less/fontello.less b/generators/app/templates/less/fontello.less deleted file mode 100644 index c4a69e4..0000000 --- a/generators/app/templates/less/fontello.less +++ /dev/null @@ -1,74 +0,0 @@ -@font-face { - font-family: 'fontello'; - src: url('../font/fontello.eot?25657972'); - src: url('../font/fontello.eot?25657972#iefix') format('embedded-opentype'), - url('../font/fontello.woff?25657972') format('woff'), - url('../font/fontello.ttf?25657972') format('truetype'), - url('../font/fontello.svg?25657972#fontello') format('svg'); - font-weight: normal; - font-style: normal; -} -/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ -/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ -/* -@media screen and (-webkit-min-device-pixel-ratio:0) { - @font-face { - font-family: 'fontello'; - src: url('../font/fontello.svg?25657972#fontello') format('svg'); - } -} -*/ - - [class^="icon-"]:before, [class*=" icon-"]:before { - font-family: "fontello"; - font-style: normal; - font-weight: normal; - speak: none; - - display: inline-block; - text-decoration: inherit; - width: 1em; - margin-right: .2em; - text-align: center; - /* opacity: .8; */ - - /* For safety - reset parent styles, that can break glyph codes*/ - font-variant: normal; - text-transform: none; - - /* fix buttons height, for twitter bootstrap */ - line-height: 1em; - - /* Animation center compensation - margins should be symmetric */ - /* remove if not needed */ - margin-left: .2em; - - /* you can be more comfortable with increased icons size */ - /* font-size: 120%; */ - - /* Font smoothing. That was taken from TWBS */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - - /* Uncomment for 3D effect */ - /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ -} - -.icon-menu:before { content: '\e800'; } /* '' */ -.icon-bell:before { content: '\e801'; } /* '' */ -.icon-attention-alt:before { content: '\e802'; } /* '' */ -.icon-paper-plane-empty:before { content: '\e803'; } /* '' */ -.icon-chart-bar:before { content: '\e804'; } /* '' */ -.icon-bicycle:before { content: '\e805'; } /* '' */ -.icon-wheelchair:before { content: '\e806'; } /* '' */ -.icon-skyatlas:before { content: '\e807'; } /* '' */ -.icon-reddit:before { content: '\e808'; } /* '' */ -.icon-ok:before { content: '\e809'; } /* '' */ -.icon-smile:before { content: '\e80a'; } /* '' */ -.icon-logout-1:before { content: '\e80b'; } /* '' */ -.icon-users:before { content: '\e80c'; } /* '' */ -.icon-user-add-outline:before { content: '\e80d'; } /* '' */ -.icon-home-outline:before { content: '\e80e'; } /* '' */ -.icon-th-outline:before { content: '\e80f'; } /* '' */ -.icon-user-outline:before { content: '\e810'; } /* '' */ -.icon-github:before { content: '\e811'; } /* '' */ \ No newline at end of file diff --git a/generators/app/templates/less/main.less b/generators/app/templates/less/main.less deleted file mode 100644 index 65655b8..0000000 --- a/generators/app/templates/less/main.less +++ /dev/null @@ -1,35 +0,0 @@ -@import "../node_modules/angular-material/angular-material.css"; -@import "./fontello"; - -html, body { - font-family: 'Roboto', sans-serif; - font-size:14px; - height:100%; - margin: 0px; - padding: 0px; -} - -md-toolbar{ - .logo{ - height: 64px; - } - - @media screen and (max-width: 1200px) { - .logo { - height: 48px; - } - } - - @media screen and (max-width: 450px) { - .logo { - display: none; - } - } - - .toolbar-icon{ - padding: 0 !important; - md-icon{ - font-size: 20px; - } - } -} diff --git a/generators/app/templates/mock/demolist b/generators/app/templates/mock/demolist deleted file mode 100644 index 6bfb658..0000000 --- a/generators/app/templates/mock/demolist +++ /dev/null @@ -1,62 +0,0 @@ -[ - { - "subjectId": 418, - "subjectName": "基因芯片", - "indexDelta": -0.0453254 - }, - { - "subjectId": 417, - "subjectName": "大师芯片", - "indexDelta": -0.0453254 - }, - { - "subjectId": 416, - "subjectName": "令过芯片", - "indexDelta": -0.0453254 - }, - { - "subjectId": 415, - "subjectName": "更话芯片", - "indexDelta": 0.0453254 - }, - { - "subjectId": 414, - "subjectName": "动画芯片", - "indexDelta": -0.0453254 - }, - { - "subjectId": 413, - "subjectName": "麻辣起片", - "indexDelta": -0.0453254 - }, - { - "subjectId": 412, - "subjectName": "就花片", - "indexDelta": 0.0453254 - }, - { - "subjectId": 411, - "subjectName": "令过芯片", - "indexDelta": -0.0453254 - }, - { - "subjectId": 410, - "subjectName": "更话芯片", - "indexDelta": 0.0453254 - }, - { - "subjectId": 409, - "subjectName": "动画芯片", - "indexDelta": -0.0453254 - }, - { - "subjectId": 408, - "subjectName": "麻辣起片", - "indexDelta": -0.0453254 - }, - { - "subjectId": 407, - "subjectName": "就花片", - "indexDelta": 0.0453254 - } - ] diff --git a/generators/app/templates/mock/states b/generators/app/templates/mock/states deleted file mode 100644 index 3d74967..0000000 --- a/generators/app/templates/mock/states +++ /dev/null @@ -1,52 +0,0 @@ -[ - "Alabama", - "Alaska", - "Arizona", - "Arkansas", - "California", - "Colorado", - "Connecticut", - "Delaware", - "Florida", - "Georgia", - "Hawaii", - "Idaho", - "Illinois", - "Indiana", - "Iowa", - "Kansas", - "Kentucky", - "Louisiana", - "Maine", - "Maryland", - "Massachusetts", - "Michigan", - "Minnesota", - "Mississippi", - "Missouri", - "Montana", - "Nebraska", - "Nevada", - "New Hampshire", - "New Jersey", - "New Mexico", - "New York", - "North Dakota", - "North Carolina", - "Ohio", - "Oklahoma", - "Oregon", - "Pennsylvania", - "Rhode Island", - "South Carolina", - "South Dakota", - "Tennessee", - "Texas", - "Utah", - "Vermont", - "Virginia", - "Washington", - "West Virginia", - "Wisconsin", - "Wyoming" -] \ No newline at end of file diff --git a/generators/app/templates/package.json_vm b/generators/app/templates/package.json_vm index 38f82b2..5792d3f 100644 --- a/generators/app/templates/package.json_vm +++ b/generators/app/templates/package.json_vm @@ -2,14 +2,16 @@ "name": "<%= answers.name %>", "version": "1.0.0", "description": "<%= answers.description %>", + "scripts": { + "dev": "rm -rf build; webpack --config webpack.config.dev.js", + "release": "rm -rf build; webpack --config webpack.config.prod.js", + "start": "webpack-dev-server --content-base build/ --config webpack.config.dev.js --history-api-fallback --open http://localhost:8080/ --hot --inline" + }, "files": [ "etc", "img", "js", - "less", - "mock", - "test", - "gulpfile.js", + "css", "index.html", "webpack.config.dev.js", "webpack.config.prod.js" @@ -20,33 +22,23 @@ "author": "<%= answers.username %> <% if(answers.email){ %><<%= answers.email %>><% } %>", "license": "MIT", "dependencies":{ - "angular": "^1.4.9", - "angular-animate": "^1.4.9", - "angular-route": "^1.4.9", - "angular-sanitize": "^1.4.9", - "angular-aria": "^1.4.9", - "angular-messages": "^1.4.9", - "angular-material": "^1.0.4", - "splash-screen": "^2.2.2" + "angular": "^1.5.5", + "angular-route": "^1.5.5", + "splash-screen": "^2.3.3" }, "devDependencies": { - "autoprefixer": "^6.3.1", - "ng-annotate-loader": "^0.1.0", - "babel-core": "^6.4.5", - "babel-loader": "^6.2.1", - "babel-preset-es2015": "^6.3.13", + "autoprefixer": "^6.3.6", + "babel-core": "^6.7.7", + "babel-loader": "^6.2.4", + "babel-preset-es2015": "^6.6.0", "css-loader": "^0.23.1", - "del": "^2.2.0", "file-loader": "^0.8.5", - "gulp": "^3.9.0", - "gulp-replace": "^0.5.4", - "gulp-util": "^3.0.7", - "less": "^2.6.0", - "less-loader": "^2.2.2", - "postcss-loader": "^0.8.0", + "html-webpack-plugin": "^2.16.1", + "ng-annotate-loader": "^0.1.0", + "postcss-loader": "^0.9.1", "raw-loader": "^0.5.1", - "style-loader": "^0.13.0", - "webpack": "^1.12.12", + "style-loader": "^0.13.1", + "webpack": "^1.13.0", "webpack-dev-server": "^1.14.1" } } diff --git a/generators/app/templates/webpack.config.dev.js b/generators/app/templates/webpack.config.dev.js index d14275c..5337a82 100644 --- a/generators/app/templates/webpack.config.dev.js +++ b/generators/app/templates/webpack.config.dev.js @@ -1,17 +1,17 @@ -'use strict'; var path = require('path'); var webpack = require('webpack'); var autoprefixer = require('autoprefixer'); +var HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: { index: './js/index.js' }, output: { - path: path.resolve(__dirname, 'build', 'js'), + path: path.resolve(__dirname, 'build'), filename: '[name].bundle.js', chunkFilename: '[id].bundle.js', - publicPath: 'js/' + publicPath: '/' }, debug: true, devtool: 'source-map', @@ -21,17 +21,13 @@ module.exports = { test: /\.css$/, loader: 'style/useable!css!postcss!' }, - { - test: /\.less$/, - loader: 'style!css!postcss!less!' - }, { test: /\.js$/, loader: 'ng-annotate!babel?{"presets":["es2015"]}', - exclude: /(node_modules|bower_components)/ + exclude: /(node_modules)/ }, { - test: /\.(eot|svg|ttf|woff|woff2)\w*/, + test: /\.(eot|svg|ttf|woff|woff2|png)\w*/, loader: 'file' }, { @@ -53,6 +49,14 @@ module.exports = { ] }, plugins: [ - new webpack.optimize.CommonsChunkPlugin('common.bundle.js') + new webpack.optimize.CommonsChunkPlugin('common.bundle.js'), + new HtmlWebpackPlugin({ + pushState: <%= answers.pushState %>, + filename: 'index.html', + inject: 'body', + template: 'index.html_vm', + favicon: 'img/favicon.ico', + hash: false + }) ] }; diff --git a/generators/app/templates/webpack.config.prod.js b/generators/app/templates/webpack.config.prod.js index 1acec3a..24fb68b 100644 --- a/generators/app/templates/webpack.config.prod.js +++ b/generators/app/templates/webpack.config.prod.js @@ -1,17 +1,17 @@ -'use strict'; var path = require('path'); var webpack = require('webpack'); var autoprefixer = require('autoprefixer'); +var HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: { index: './js/index.js' }, output: { - path: path.resolve(__dirname, 'build', 'js'), + path: path.resolve(__dirname, 'build'), filename: '[hash].[name].bundle.js', chunkFilename: '[hash].[id].bundle.js', - publicPath: 'js/' + publicPath: '/' }, module: { loaders: [ @@ -19,17 +19,13 @@ module.exports = { test: /\.css$/, loader: 'style/useable!css!postcss!' }, - { - test: /\.less$/, - loader: 'style!css!postcss!less!' - }, { test: /\.js$/, loader: 'ng-annotate!babel?{"presets":["es2015"]}', - exclude: /(node_modules|bower_components)/ + exclude: /(node_modules)/ }, { - test: /\.(eot|svg|ttf|woff|woff2)\w*/, + test: /\.(eot|svg|ttf|woff|woff2|png)\w*/, loader: 'file' }, { @@ -56,6 +52,14 @@ module.exports = { warnings: false } }), - new webpack.optimize.CommonsChunkPlugin('[hash].common.bundle.js') + new webpack.optimize.CommonsChunkPlugin('[hash].common.bundle.js'), + new HtmlWebpackPlugin({ + pushState: <%= answers.pushState %>, + filename: 'index.html', + inject: 'body', + template: 'index.html_vm', + favicon: 'img/favicon.ico', + hash: false + }) ] }; diff --git a/package.json b/package.json index e50d9ea..19cd2c4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "generator-es6-angular", - "version": "4.0.2", + "version": "4.1.0", "description": "generator-es6-angular", "repository": { "type": "git", @@ -22,7 +22,7 @@ "license": "MIT", "dependencies": { "date-util": "^1.2.1", - "lodash": "^4.1.0", - "yeoman-generator": "^0.22.5" + "lodash": "^4.11.2", + "yeoman-generator": "^0.23.3" } }