Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

angular2-seed-advanced

Package Overview
Dependencies
Maintainers
1
Versions
6
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

angular2-seed-advanced

High-quality, modular starter (advanced seed) project for Angular 2 apps with statically typed build and AoT + NativeScript + Electron

  • 1.0.1
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
9
increased by800%
Maintainers
1
Weekly downloads
 
Created
Source

Angular Seed AdvancedAngular 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 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 angular-seed that expands on all of its great features to include core support for:

Integration with:
  • ngrx/store RxJS powered state management, inspired by Redux
  • ngrx/effects Side effect model for @ngrx/store
  • ng2-translate for i18n
    • Usage is optional but on by default
    • Up to you and your team how you want to utilize it. It can be easily removed if not needed.
  • angulartics2 Vendor-agnostic analytics for Angular2 applications.
    • Out of box support for Segment
      • When using the seed, be sure to change your write_key here
    • Can be changed to any vendor, learn more here
  • lodash Helps reduce blocks of code down to single lines and enhances readability
  • NativeScript cross platform mobile (w/ native UI) apps. Setup instructions here.
  • Electron cross platform desktop apps (Mac, Windows and Linux). Setup instructions here.
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:
    • 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
    • sample: Just a sample module providing some components and services
    • 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 angular-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.

Additionally, this seed is intended to push a couple boundaries so if you see dependencies that are bleeding edge, this is intentional.

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

How to start

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

# install the project's dependencies
$ npm install
# fast install (via Yarn, https://yarnpkg.com)
$ yarn install  # or yarn

# watches your files and uses livereload by default
$ npm start
# api document for the app
# npm run build.docs

# to start deving with livereload site and coverage as well as continuous testing
$ npm run start.deving

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

How to start with AoT compilation

Note that AoT compilation requires node v6.5.0 or higher and npm 3.10.3 or higher.

In order to start the seed with AoT use:

# prod build with AoT compilation
$ npm run build.prod.exp

When using AoT compilation, please consider the following:

Currently you cannot use custom component decorators with AoT compilation. This may change in the future but for now you can use this pattern for when you need to create AoT builds for the web:

import { Component } from '@angular/core';
import { BaseComponent } from '../frameworks/core/index';

// @BaseComponent({   // just comment this out and use Component from 'angular/core'
@Component({
  // etc.

After doing the above, running AoT build via npm run build.prod.exp will succeed. :)

BaseComponent custom component decorator does the auto templateUrl switching to use {N} views when running in the {N} app therefore you don't need it when creating AoT builds for the web. However just note that when going back to run your {N} app, you should comment back in the BaseComponent. Again this temporary inconvenience may be unnecessary in the future.

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

OR...

Building with Webpack for release builds

You can greatly reduce the final size of your NativeScript app by the following:

cd nativescript
npm i nativescript-dev-webpack --save-dev

Then you will need to modify your components to not use moduleId: module.id and change templateUrl to true relative app, for example:

before:

@BaseComponent({
  moduleId: module.id,
  selector: 'sd-home',
  templateUrl: 'home.component.html',
  styleUrls: ['home.component.css']
})

after:

@BaseComponent({
  // moduleId: module.id,
  selector: 'sd-home',
  templateUrl: './app/components/home/home.component.html',
  styleUrls: ['./app/components/home/home.component.css']
})

Then to build:

Ensure you are in the nativescript directory when running these commands.

  • iOS: WEBPACK_OPTS="--display-error-details" tns build ios --bundle
  • Android: WEBPACK_OPTS="--display-error-details" tns build android --bundle

Notice your final build will be drastically smaller. In some cases 120 MB -> ~28 MB. 👍

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

Running tests

$ npm test

# Development. Your app will be watched by karma
# on each change all your specs will be executed.
$ npm run test.watch
# NB: The command above might fail with a "EMFILE: too many open files" error.
# Some OS have a small limit of opened file descriptors (256) by default
# and will result in the EMFILE error.
# You can raise the maximum of file descriptors by running the command below:
$ ulimit -n 10480


# 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 install webdriver-manager <- Install this first for e2e testing
# 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

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/

Environment configuration

If you have different environments and you need to configure them to use different end points, settings, etc. you can use the files dev.ts or prod.ts in./tools/env/. The name of the file is environment you want to use.

The environment can be specified by using:

$ npm start -- --env-config ENV_NAME

Currently the ENV_NAMEs are dev, prod, staging, but you can simply add a different file "ENV_NAME.ts". file in order to alter extra such environments.

Tools documentation

A documentation of the provided tools can be found in tools/README.md.

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/sample/services/app-config.spec.ts
      • fix test
    • src/client/app/frameworks/sample/services/app-config.ts
      • add language to SUPPORTED_LANGUAGES
    • src/client/app/frameworks/i18n/components/lang-switcher.component.spec.ts
      • fix test

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.

General Best Practice Guide to Sharing Code

There’s actually only a few things to keep in mind when sharing code between web/mobile. The seed does take care of quite a few of those things but here’s a brief list:

  • Don’t import {N} modules into your components/services. {N} modules can only be used inside the {N} app therefore cannot be shared. To get around this, use OpaqueTokens which is a fancy name for something quite simple. Learn more here. A great example of how to integrate 2 different plugins (1 for web, 1 for {N}) and share all the code exists in this wiki article: How to integrate Firebase across all platforms written by the awesome Scott Lowe.
  • Use the conditional hooks provided by the seed in shared methods where you may need to handle something differently in {N} than you do on the web. For example, see here.
  • Don’t use window global. Inject the WindowService provided by the seed instead. This includes usage of alert, confirm, etc. For example:

If you were thinking about doing: alert('Something happened!');, Don't. Instead inject WindowService:

constructor(private win: WindowService) {}

public userAction() {
  if (success) {
    // do stuff
  } else {
    this.win.alert('Something happened!');
  }
}

This ensures that when the same code is run in the {N} app, the native dialogs module will be used.

The advice I like to give is:

Code with web mentality first. Then provide the native capability using Angular’s {provide: SomeWebService, useClass: SomeNativeService } during bootstrap.

There are some cases where you may want to use useValue vs. useClass, and other times may need to use useFactory. Read the Angular docs here to learn more about which you may need for your use case.

Feature Branches

Several branches exist with certain features integrated:

How best to use for your project

Setup

NOTE: This should be done first before you start making any changes and building out your project. Not doing so will likely result in dificulty when trying to merge in upstream changes later.

  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.
  • IMPORTANT: If you see unknown option --allow-unrelated-histories either upgrade git to 2.9+ or use npm run git.merge.legacy
  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.
Merging latest upstream changes
  1. npm run git.merge.preview - This will fetch upstream and show you how the merge would look
  • If you see unknown option --allow-unrelated-histories either upgrade git to 2.9+ or use npm run git.merge.legacy.preview
  1. npm run git.merge - This will actually do the merge
  • If you see unknown option --allow-unrelated-histories either upgrade git to 2.9+ or use npm run git.merge.legacy
  1. Handle any conflicts to get latest upstream into your application.
  2. 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

mgechevludoheninNathanWalkerd3viant0neShyam-Chentarlepp
mgechevludoheninNathanWalkerd3viant0neShyam-Chentarlepp
NightapesTheDonDopenareshbhatiakiukahank-ehlydaniru
NightapesTheDonDopenareshbhatiakiukahank-ehlydaniru
jesperronnnjs50vyakymenkorobstollsasikumardraboeglin
jesperronnnjs50vyakymenkorobstollsasikumardraboeglin
sfabrieceJakePartuschryzymarkwhitfeldm-abseppsilon
sfabrieceJakePartuschryzymarkwhitfeldm-abseppsilon
jvitor83gkalpakivannugopgrzeszczaknatarajanmca11natarajanmca11
jvitor83gkalpakivannugopgrzeszczaknatarajanmca11natarajanmca11
jerryorta-devdomfarolinolarsthorupouq77LuxDieadmosity
jerryorta-devdomfarolinolarsthorupouq77LuxDieadmosity
irsickamedinavalenciatroyanskiytsm91juristrJohnCashmore
irsickamedinavalenciatroyanskiytsm91juristrJohnCashmore
JayKandevanp92evanplaicehAWKdvKaffiendJunaidZA
JayKandevanp92evanplaicehAWKdvKaffiendJunaidZA
c-icemarkhardingojacquemarttiagomapmarquesTuiKikengotenxds
c-icemarkhardingojacquemarttiagomapmarquesTuiKikengotenxds
edud69turbohappykarlhaaskbrandwijkrobbattBigous
edud69turbohappykarlhaaskbrandwijkrobbattBigous
ip512Green-CatYonetdivramoddaixtrosetaguan
ip512Green-CatYonetdivramoddaixtrosetaguan
bbarryyassirhsonicparkebrendanbensonbrian428briantopping
bbarryyassirhsonicparkebrendanbensonbrian428briantopping
ckapillacadrieldszymczukdmuratpeah90dstockhammer
ckapillacadrieldszymczukdmuratpeah90dstockhammer
dwidodcswtotevnosachamosericli1018koodikindral
dwidodcswtotevnosachamosericli1018koodikindral
amaltsevFalinorhpinsleyNN77isidroamvjeffbcross
amaltsevFalinorhpinsleyNN77isidroamvjeffbcross
isidroamvjeffbcrossJimmyshDranejohnjelinekfourctv
isidroamvjeffbcrossJimmyshDranejohnjelinekfourctv
JunusErginjustindujardinlihaibhBrooooooklyntanduinkidotcom
JunusErginjustindujardinlihaibhBrooooooklyntanduinkidotcom
daixtrosemjwwitoferzeocombegdi2290typekpb
daixtrosemjwwitoferzeocombegdi2290typekpb
philipooopidupuisredianrobertpennerSjiepRoxKilly
philipooopidupuisredianrobertpennerSjiepRoxKilly
sclausenheavymerytjvantolltapas4javagitter-badgervalera-rozuvan
sclausenheavymerytjvantolltapas4javagitter-badgervalera-rozuvan
vincentpalitaYalrafiharnaudvallebillsworldblackheart01butterfieldcons
vincentpalitaYalrafiharnaudvallebillsworldblackheart01butterfieldcons
danielcrispjgollaomerfarukyilmazpbazurin-softhemerossedfortsavcha
danielcrispjgollaomerfarukyilmazpbazurin-softhemerossedfortsavcha
sebfagultrasonicsofturmaul
sebfagultrasonicsofturmaul

License

MIT

FAQs

Package last updated on 17 Nov 2016

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc