Giter Club home page Giter Club logo

angular2-seed-advanced's Introduction

Angular 2 Seed AdvancedAngular 2 Seed Advanced Integrations

Angular 2 Style Guide Build Status MIT license Dependency Status devDependency Status Stack Share Stories in Progress

Considering Angular 2 for a large project? Do you need potential i18n support? Enhanced testing support? Oh and building for multiple platforms too? Web, native Mobile (Android/iOS), and even Desktop (Mac, Windows and Linux)?

This is an advanced seed project for Angular 2 apps based on Minko Gechev's angular2-seed that expands on all of its great features to include core support for:

Integration with:

Multiple Platforms
The zen of multiple platforms. Chrome, Android and iPhone all running the same code.
Desktop
Programming Nirvana. Mac and Windows desktop both running the same code.

Table of Contents

Enhanced development workflow

  • Decorators for components which reduce boilerplate for common component setups
  • Shared code can be found in frameworks:
    • app: your shared application architecture code
    • core: foundation layer (decorators and low-level services)
    • analytics: analytics provided by Segment
      • Only reports data in production build
    • i18n: internationalization features
    • electron: Electron specific code
    • test: test specific code providing conveniences to make testing your code easier and faster

Enhanced testing support options

  • mocks for various services
  • configurable provider blocks for easy test setup of common application providers
    • tired of setting up similar providers over and over again for different tests?
    • configure a reusable test provider which can be configured on a case-by-base basis
    • see example here
  • helpers for end-to-end (e2e, integration) tests
  • convenient shorthand to reduce test setup boilerplate and enhance speed of writing tests
    • are your test cases buried by multiple import lines requiring you to scroll just to get to the substance of the test?
    • removes noise allowing you to better focus on the substance of the test
    • provides full intellisense support
    • allows your team to add unique shorthands for various testing scenarios specific to your application needs
    • plays nice with tslint options like "no-unused-variable": true as the api hangs off a plain Object instead of globals
      • what's the value of that you ask? have you ever isolated a test with iit or ddescribe but didn't import those or vice versa, used iit leaving an unused it now in your tests? yeah, tslint will be all over you :/
      • avoids unused variable warnings altogether in tests since you are always using a valid key from the shorthand Object
    • see example here

Advice: If your project is intended to target a single platform (i.e, web only), then angular2-seed is likely more than suitable for your needs. However if your project goals are to target multiple platforms (web, native mobile and native desktop), with powerful out of the box library support and highly configurable/flexible testing options, then you might want to keep reading.

Prerequisites

  • node v5.x.x or higher and npm 3 or higher.

  • To run the NativeScript app:

npm install -g nativescript
npm install -g typescript

Usage

git clone --depth 1 https://github.com/NathanWalker/angular2-seed-advanced.git
cd angular2-seed-advanced

# install the project's dependencies
npm install
# watches your files and uses livereload by default
npm start
# api document for the app
npm run serve.docs

# dev build
npm run build.dev
# prod build
npm run build.prod

NativeScript App

Setup

npm install -g nativescript 

Dev Workflow

You can make changes to files in src/client or nativescript folders. A symbolic link exists between the web src/client and the nativescript folder so changes in either location are mirrored because they are the same directory inside.

Create .tns.html and .tns.css NativeScript view files for every web component view file you have. You will see an example of the app.component.html as a NativeScript view file here.

Run

iOS:                      npm run start.ios
iOS (livesync emulator):  npm run start.livesync.ios
iOS (livesync device):    npm run start.livesync.ios.device

// or...

Android:                      npm run start.android
Android (livesync emulator):  npm run start.livesync.android
Android (livesync device):    npm run start.livesync.android.device

Electron App

Develop

Mac:      npm run start.desktop
Windows:  npm run start.desktop.windows

Develop with livesync

Mac:      npm run start.livesync.desktop
Windows:  npm run start.livesync.desktop.windows

Release: Package Electron App for Mac, Windows or Linux

Mac:      npm run build.desktop.mac
Windows:  npm run build.desktop.windows
Linux:    npm run build.desktop.linux

Testing

npm test

# Debug - In two different shell windows
npm run build.test.watch      # 1st window
npm run karma.start           # 2nd window

# code coverage (istanbul)
# auto-generated at the end of `npm test`
# view coverage report:
npm run serve.coverage

# e2e (aka. end-to-end, integration) - In three different shell windows
# Make sure you don't have a global instance of Protractor

# npm run webdriver-update <- You will need to run this the first time
npm run webdriver-start
npm run serve.e2e
npm run e2e

# e2e live mode - Protractor interactive mode
# Instead of last command above, you can use:
npm run e2e.live

You can learn more about Protractor Interactive Mode here

Framework How-Tos

i18n

  • how to add a language?
    • src/client/assets/i18n/
      • add [language code].json (copy existing one and adapt the translation strings)
    • src/client/app/frameworks/app/services/app-config.service.spec.ts
      • fix test
    • src/client/app/frameworks/app/services/app-config.service.ts
      • add language to SUPPORTED_LANGUAGES
    • src/client/app/frameworks/i18n/components/lang-switcher.component.spec.ts
      • fix test

Web Configuration Options

Default application server configuration

var PORT             = 5555;
var LIVE_RELOAD_PORT = 4002;
var DOCS_PORT        = 4003;
var APP_BASE         = '/';

Configure at runtime

npm start -- --port 8080 --reload-port 4000 --base /my-app/

Change Detection OnPush Note

Please Note: The seed uses Angular's ChangeDetectionStrategy.OnPush by default which requires some understanding of immutability and one-way data flows. Please check out the following resources to learn more:

If you experience issues with changes not occuring in your views, you can disable this by commenting out these lines. The seed uses OnPush by default because it provides optimal performance and if you decide to turn it off while developing your application, you can always turn it back on when you're ready to refactor your data services to utilize OnPush properly.

Feature Branches

Several branches exist with certain features integrated:

How best to use for your project

Setup

  1. Download a zip of the seed. (Do not fork)
  2. npm run git.setup - This will initialize git as well as setup upstream properly.
  3. git remote add origin ...your private repo...
  4. npm run git.prepare - This will prepare git to handle the merge
  5. npm run git.merge - This will fetch upstream and run the first merge (*Important)
  • IMPORTANT: You will see a wall of Conflicts after doing above (a Conflict for every single file). This is normal. There actually will not be any problematic conflicts as it's just reporting every single file which both sides (upstream and your first commit) added.
  1. git add .; git commit -m'ready'. Yes, you will be committing all those conflicts, which actually are not a problem in this 1 time case.
  2. Now you have git setup and ready to develop your application as well as merge in upstream changes in the future.
  3. npm install (and all other usage docs in this README apply)
  4. Create a new framework for your application in src/client/app/frameworks to build your codebase out. Say your app is called AwesomeApp, then create awesomeapp and start building out all your components and services in there. Create other frameworks as you see fit to organize.
  5. If you don't want an integration that comes out of box with this seed; for example. let's say you don't want to use i18n. Then just delete the i18n, remove ng2-translate as dependency root package.json and nativescript/package.json. Then remove any references to i18n throughout.

You can read more about configuring a remote for a fork here

Merging latest upstream changes

  1. npm run git.merge.preview - This will fetch upstream and show you how the merge would look
  2. npm run git.merge - This will actually do the merge
  3. Handle any conflicts to get latest upstream into your application.
  4. Continue building your app.

You can read more about syncing a fork here.

If you have any suggestions to this workflow, please post here.

Contributing

Please see the CONTRIBUTING file for guidelines.

Awesome Contributors

mgechev ludohenin NathanWalker d3viant0ne tarlepp Shyam-Chen
mgechev ludohenin NathanWalker d3viant0ne tarlepp Shyam-Chen
TheDonDope nareshbhatia hank-ehly kiuka jesperronn the-ult
TheDonDope nareshbhatia hank-ehly kiuka jesperronn the-ult
aboeglin gkalpak ryzy JakePartusch njs50 pgrzeszczak
aboeglin gkalpak ryzy JakePartusch njs50 pgrzeszczak
natarajanmca11 JohnCashmore jerryorta-dev domfarolino LuxDie larsthorup
natarajanmca11 JohnCashmore jerryorta-dev domfarolino LuxDie larsthorup
juristr e-oz ouq77 tsm91 devanp92 hAWKdv
juristr e-oz ouq77 tsm91 devanp92 hAWKdv
ivannugo c-ice markharding gotenxds ojacquemart Nightapes
ivannugo c-ice markharding gotenxds ojacquemart Nightapes
evanplaice vyakymenko divramod turbohappy troyanskiy ip512
evanplaice vyakymenko divramod turbohappy troyanskiy ip512
Green-Cat Yonet TuiKiken tandu amaltsev yassirh
Green-Cat Yonet TuiKiken tandu amaltsev yassirh
sonicparke brendanbenson eppsilon brian428 briantopping cadriel
sonicparke brendanbenson eppsilon brian428 briantopping cadriel
dszymczuk dstockhammer dwido totev sfabriece koodikindral
dszymczuk dstockhammer dwido totev sfabriece koodikindral
allenhwkim alexweber hpinsley jeffbcross Jimmysh johnjelinek
allenhwkim alexweber hpinsley jeffbcross Jimmysh johnjelinek
fourctv justindujardin lihaibh Brooooooklyn nulldev07 inkidotcom
fourctv justindujardin lihaibh Brooooooklyn nulldev07 inkidotcom
mjwwit ocombe gdi2290 typekpb philipooo pidupuis
mjwwit ocombe gdi2290 typekpb philipooo pidupuis
redian Bigous robbatt robertpenner sclausen heavymery
redian Bigous robbatt robertpenner sclausen heavymery
tjvantoll tapas4java gitter-badger vincentpalita Yalrafih blackheart01
tjvantoll tapas4java gitter-badger vincentpalita Yalrafih blackheart01
butterfieldcons jgolla sebfag ultrasonicsoft taguan
butterfieldcons jgolla sebfag ultrasonicsoft taguan

License

MIT

angular2-seed-advanced's People

Contributors

aboeglin avatar aegyed91 avatar domfarolino avatar e-oz avatar eppsilon avatar gkalpak avatar green-cat avatar hankehly avatar henetiriki avatar ip512 avatar jakepartusch avatar jerryorta-dev avatar jesperronn avatar johncashmore avatar joshwiens avatar juristr avatar kiuka avatar larsthorup avatar ludohenin avatar luxdie avatar mgechev avatar nareshbhatia avatar natarajanmca11 avatar nathanwalker avatar pgrzeszczak avatar ryzy avatar shyam-chen avatar tarlepp avatar thedondope avatar vyakymenko avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.