From e33e1d255ae830b3574c818f81c52c4ab2f5be19 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Mon, 2 May 2016 05:18:11 +0100 Subject: [PATCH 1/2] docs(cli-quickstart): add cli-quickstart chapter --- gulpfile.js | 16 +- .../docs/_examples/cli-quickstart/e2e-spec.js | 11 + .../_examples/cli-quickstart/ts/.clang-format | 3 + .../_examples/cli-quickstart/ts/.gitignore | 29 ++ .../cli-quickstart/ts/angular-cli-build.js | 17 ++ .../cli-quickstart/ts/angular-cli.json | 30 ++ .../ts/config/environment.dev.ts | 3 + .../cli-quickstart/ts/config/environment.js | 10 + .../ts/config/environment.prod.ts | 3 + .../ts/config/protractor.conf.js | 29 ++ .../cli-quickstart/ts/e2e/app.e2e.ts | 16 ++ .../_examples/cli-quickstart/ts/e2e/app.po.ts | 9 + .../cli-quickstart/ts/e2e/typings.d.ts | 1 + .../cli-quickstart/ts/example-config.json | 0 .../cli-quickstart/ts/package.1.json | 45 +++ .../cli-quickstart/ts/public/.gitignore | 0 .../cli-quickstart/ts/public/.npmignore | 0 .../app/angular2-cli-quickstart.component.css | 6 + .../angular2-cli-quickstart.component.html | 3 + .../angular2-cli-quickstart.component.spec.ts | 24 ++ .../app/angular2-cli-quickstart.component.ts | 13 + .../cli-quickstart/ts/src/app/environment.ts | 7 + .../cli-quickstart/ts/src/app/index.ts | 2 + .../cli-quickstart/ts/src/app/shared/index.ts | 0 .../cli-quickstart/ts/src/favicon.ico | Bin 0 -> 5430 bytes .../_examples/cli-quickstart/ts/src/icon.png | Bin 0 -> 5603 bytes .../cli-quickstart/ts/src/index.html | 31 +++ .../_examples/cli-quickstart/ts/src/main.ts | 10 + .../cli-quickstart/ts/src/manifest.webapp | 13 + .../cli-quickstart/ts/src/system-config.ts | 54 ++++ .../cli-quickstart/ts/src/typings.d.ts | 1 + public/docs/_examples/package.json | 5 +- public/docs/ts/latest/cli-quickstart.jade | 261 ++++++++++++++++++ .../devguide/cli-quickstart/app-works.png | Bin 0 -> 4029 bytes .../devguide/cli-quickstart/gh-token-1.png | Bin 0 -> 6345 bytes .../devguide/cli-quickstart/gh-token-2.png | Bin 0 -> 25592 bytes .../devguide/cli-quickstart/gh-token-3.png | Bin 0 -> 14541 bytes .../devguide/cli-quickstart/my-first-app.png | Bin 0 -> 12797 bytes 38 files changed, 647 insertions(+), 5 deletions(-) create mode 100644 public/docs/_examples/cli-quickstart/e2e-spec.js create mode 100644 public/docs/_examples/cli-quickstart/ts/.clang-format create mode 100644 public/docs/_examples/cli-quickstart/ts/.gitignore create mode 100644 public/docs/_examples/cli-quickstart/ts/angular-cli-build.js create mode 100644 public/docs/_examples/cli-quickstart/ts/angular-cli.json create mode 100644 public/docs/_examples/cli-quickstart/ts/config/environment.dev.ts create mode 100644 public/docs/_examples/cli-quickstart/ts/config/environment.js create mode 100644 public/docs/_examples/cli-quickstart/ts/config/environment.prod.ts create mode 100644 public/docs/_examples/cli-quickstart/ts/config/protractor.conf.js create mode 100644 public/docs/_examples/cli-quickstart/ts/e2e/app.e2e.ts create mode 100644 public/docs/_examples/cli-quickstart/ts/e2e/app.po.ts create mode 100644 public/docs/_examples/cli-quickstart/ts/e2e/typings.d.ts create mode 100644 public/docs/_examples/cli-quickstart/ts/example-config.json create mode 100644 public/docs/_examples/cli-quickstart/ts/package.1.json create mode 100644 public/docs/_examples/cli-quickstart/ts/public/.gitignore create mode 100644 public/docs/_examples/cli-quickstart/ts/public/.npmignore create mode 100644 public/docs/_examples/cli-quickstart/ts/src/app/angular2-cli-quickstart.component.css create mode 100644 public/docs/_examples/cli-quickstart/ts/src/app/angular2-cli-quickstart.component.html create mode 100644 public/docs/_examples/cli-quickstart/ts/src/app/angular2-cli-quickstart.component.spec.ts create mode 100644 public/docs/_examples/cli-quickstart/ts/src/app/angular2-cli-quickstart.component.ts create mode 100644 public/docs/_examples/cli-quickstart/ts/src/app/environment.ts create mode 100644 public/docs/_examples/cli-quickstart/ts/src/app/index.ts create mode 100644 public/docs/_examples/cli-quickstart/ts/src/app/shared/index.ts create mode 100644 public/docs/_examples/cli-quickstart/ts/src/favicon.ico create mode 100644 public/docs/_examples/cli-quickstart/ts/src/icon.png create mode 100644 public/docs/_examples/cli-quickstart/ts/src/index.html create mode 100644 public/docs/_examples/cli-quickstart/ts/src/main.ts create mode 100644 public/docs/_examples/cli-quickstart/ts/src/manifest.webapp create mode 100644 public/docs/_examples/cli-quickstart/ts/src/system-config.ts create mode 100644 public/docs/_examples/cli-quickstart/ts/src/typings.d.ts create mode 100644 public/docs/ts/latest/cli-quickstart.jade create mode 100644 public/resources/images/devguide/cli-quickstart/app-works.png create mode 100644 public/resources/images/devguide/cli-quickstart/gh-token-1.png create mode 100644 public/resources/images/devguide/cli-quickstart/gh-token-2.png create mode 100644 public/resources/images/devguide/cli-quickstart/gh-token-3.png create mode 100644 public/resources/images/devguide/cli-quickstart/my-first-app.png diff --git a/gulpfile.js b/gulpfile.js index 73778bb19e..8541e06096 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -195,11 +195,19 @@ function findAndRunE2eTests(filter) { // fileName; then shut down the example. All protractor output is appended // to the outputFile. function runE2eTsTests(appDir, protractorConfigFilename, outputFile) { - // start the app - var appRunSpawnInfo = spawnExt('npm',['run','http-server:e2e', '--', '-s' ], { cwd: appDir }); - var tscRunSpawnInfo = spawnExt('npm',['run','tsc'], { cwd: appDir }); + // spawn tasks to start the app + var appBuildSpawnInfo; + var appRunSpawnInfo; + + if (fs.existsSync(path.join(appDir, 'angular-cli.json'))) { + appBuildSpawnInfo = spawnExt('npm',['run','build:cli'], { cwd: appDir }); + appRunSpawnInfo = spawnExt('npm',['run','http-server:cli', '--', '-s' ], { cwd: appDir }); + } else { + appBuildSpawnInfo = spawnExt('npm',['run','tsc'], { cwd: appDir }); + appRunSpawnInfo = spawnExt('npm',['run','http-server:e2e', '--', '-s' ], { cwd: appDir }); + } - return runProtractor(tscRunSpawnInfo.promise, appDir, appRunSpawnInfo, protractorConfigFilename, outputFile); + return runProtractor(appBuildSpawnInfo.promise, appDir, appRunSpawnInfo, protractorConfigFilename, outputFile); } function runProtractor(prepPromise, appDir, appRunSpawnInfo, protractorConfigFilename, outputFile) { diff --git a/public/docs/_examples/cli-quickstart/e2e-spec.js b/public/docs/_examples/cli-quickstart/e2e-spec.js new file mode 100644 index 0000000000..36c1aa0844 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/e2e-spec.js @@ -0,0 +1,11 @@ +// gulp run-e2e-tests --filter=cli-quickstart +describe('angular2-cli-quickstart App', () => { + beforeEach(() => { + return browser.get('/'); + }) + + it('should display message saying app works', () => { + var pageTitle = element(by.css('angular2-cli-quickstart-app h1')).getText() + expect(pageTitle).toEqual('My First Angular 2 App'); + }); +}); diff --git a/public/docs/_examples/cli-quickstart/ts/.clang-format b/public/docs/_examples/cli-quickstart/ts/.clang-format new file mode 100644 index 0000000000..8d1c3c3102 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/.clang-format @@ -0,0 +1,3 @@ +Language: JavaScript +BasedOnStyle: Google +ColumnLimit: 100 diff --git a/public/docs/_examples/cli-quickstart/ts/.gitignore b/public/docs/_examples/cli-quickstart/ts/.gitignore new file mode 100644 index 0000000000..3422917e0a --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/.gitignore @@ -0,0 +1,29 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp + +# dependencies +/node_modules +/bower_components + +# IDEs and editors +/.idea + +# misc +/.sass-cache +/connect.lock +/coverage/* +/libpeerconnection.log +npm-debug.log +testem.log +/typings + +# e2e +/e2e/*.js +/e2e/*.map + +#System Files +.DS_Store +Thumbs.db diff --git a/public/docs/_examples/cli-quickstart/ts/angular-cli-build.js b/public/docs/_examples/cli-quickstart/ts/angular-cli-build.js new file mode 100644 index 0000000000..d5446de689 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/angular-cli-build.js @@ -0,0 +1,17 @@ +/* global require, module */ + +var Angular2App = require('angular-cli/lib/broccoli/angular2-app'); + +module.exports = function(defaults) { + return new Angular2App(defaults, { + vendorNpmFiles: [ + 'systemjs/dist/system-polyfills.js', + 'systemjs/dist/system.src.js', + 'zone.js/dist/*.js', + 'es6-shim/es6-shim.js', + 'reflect-metadata/*.js', + 'rxjs/**/*.js', + '@angular/**/*.js' + ] + }); +}; diff --git a/public/docs/_examples/cli-quickstart/ts/angular-cli.json b/public/docs/_examples/cli-quickstart/ts/angular-cli.json new file mode 100644 index 0000000000..29c394f32b --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/angular-cli.json @@ -0,0 +1,30 @@ +{ + "project": { + "version": "1.0.0-beta.4", + "name": "angular2-cli-quickstart" + }, + "apps": [ + { + "main": "src/main.ts", + "tsconfig": "src/tsconfig.json", + "mobile": false + } + ], + "addons": [], + "packages": [], + "e2e": { + "protractor": { + "config": "config/protractor.conf.js" + } + }, + "test": { + "karma": { + "config": "config/karma.conf.js" + } + }, + "defaults": { + "prefix": "app", + "sourceDir": "src", + "styleExt": "css" + } +} diff --git a/public/docs/_examples/cli-quickstart/ts/config/environment.dev.ts b/public/docs/_examples/cli-quickstart/ts/config/environment.dev.ts new file mode 100644 index 0000000000..ffe8aed766 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/config/environment.dev.ts @@ -0,0 +1,3 @@ +export const environment = { + production: false +}; diff --git a/public/docs/_examples/cli-quickstart/ts/config/environment.js b/public/docs/_examples/cli-quickstart/ts/config/environment.js new file mode 100644 index 0000000000..4fa28880da --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/config/environment.js @@ -0,0 +1,10 @@ +/* jshint node: true */ + +module.exports = function(environment) { + return { + environment: environment, + baseURL: '/', + locationType: 'auto' + }; +}; + diff --git a/public/docs/_examples/cli-quickstart/ts/config/environment.prod.ts b/public/docs/_examples/cli-quickstart/ts/config/environment.prod.ts new file mode 100644 index 0000000000..3612073bc3 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/config/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/public/docs/_examples/cli-quickstart/ts/config/protractor.conf.js b/public/docs/_examples/cli-quickstart/ts/config/protractor.conf.js new file mode 100644 index 0000000000..57f4f87dd7 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/config/protractor.conf.js @@ -0,0 +1,29 @@ +/*global jasmine */ +var SpecReporter = require('jasmine-spec-reporter'); + +exports.config = { + allScriptsTimeout: 11000, + specs: [ + '../e2e/**/*.e2e.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + useAllAngular2AppRoots: true, + beforeLaunch: function() { + require('ts-node').register({ + project: 'e2e' + }); + }, + onPrepare: function() { + jasmine.getEnv().addReporter(new SpecReporter()); + } +}; diff --git a/public/docs/_examples/cli-quickstart/ts/e2e/app.e2e.ts b/public/docs/_examples/cli-quickstart/ts/e2e/app.e2e.ts new file mode 100644 index 0000000000..1e533aafd3 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/e2e/app.e2e.ts @@ -0,0 +1,16 @@ +import { Angular2CliQuickstartPage } from './app.po'; + +describe('angular2-cli-quickstart App', function() { + let page: Angular2CliQuickstartPage; + + beforeEach(() => { + page = new Angular2CliQuickstartPage(); + }); + + // #docregion title + it('should display message saying app works', () => { + page.navigateTo(); + expect(page.getParagraphText()).toEqual('My First Angular 2 App'); + }); + // #enddocregion title +}); diff --git a/public/docs/_examples/cli-quickstart/ts/e2e/app.po.ts b/public/docs/_examples/cli-quickstart/ts/e2e/app.po.ts new file mode 100644 index 0000000000..ff28153afe --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/e2e/app.po.ts @@ -0,0 +1,9 @@ +export class Angular2CliQuickstartPage { + navigateTo() { + return browser.get('/'); + } + + getParagraphText() { + return element(by.css('angular2-cli-quickstart-app h1')).getText(); + } +} diff --git a/public/docs/_examples/cli-quickstart/ts/e2e/typings.d.ts b/public/docs/_examples/cli-quickstart/ts/e2e/typings.d.ts new file mode 100644 index 0000000000..9c2f2d0252 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/e2e/typings.d.ts @@ -0,0 +1 @@ +/// diff --git a/public/docs/_examples/cli-quickstart/ts/example-config.json b/public/docs/_examples/cli-quickstart/ts/example-config.json new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/cli-quickstart/ts/package.1.json b/public/docs/_examples/cli-quickstart/ts/package.1.json new file mode 100644 index 0000000000..cedeed62cd --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/package.1.json @@ -0,0 +1,45 @@ +{ + "name": "angular2-cli-quickstart", + "version": "0.0.0", + "license": "MIT", + "angular-cli": {}, + "scripts": { + "start": "ng server", + "postinstall": "typings install", + "lint": "tslint \"src/**/*.ts\"", + "test": "ng test", + "pree2e": "webdriver-manager update", + "e2e": "protractor" + }, + "private": true, + "dependencies": { + "@angular/common": "2.0.0-rc.1", + "@angular/compiler": "2.0.0-rc.1", + "@angular/core": "2.0.0-rc.1", + "@angular/http": "2.0.0-rc.1", + "@angular/platform-browser": "2.0.0-rc.1", + "@angular/platform-browser-dynamic": "2.0.0-rc.1", + "@angular/router": "2.0.0-rc.1", + + "core-js": "^2.4.0", + "reflect-metadata": "0.1.3", + "rxjs": "5.0.0-beta.6", + "systemjs": "0.19.26", + "zone.js": "^0.6.12" + }, + "devDependencies": { + "angular-cli": "^1.0.0-beta.4", + "codelyzer": "0.0.14", + "ember-cli-inject-live-reload": "^1.4.0", + "jasmine-core": "^2.4.1", + "jasmine-spec-reporter": "^2.4.0", + "karma": "^0.13.15", + "karma-chrome-launcher": "^0.2.3", + "karma-jasmine": "^0.3.8", + "protractor": "^3.3.0", + "ts-node": "^0.5.5", + "tslint": "^3.6.0", + "typescript": "^1.8.10", + "typings": "^0.8.1" + } +} diff --git a/public/docs/_examples/cli-quickstart/ts/public/.gitignore b/public/docs/_examples/cli-quickstart/ts/public/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/cli-quickstart/ts/public/.npmignore b/public/docs/_examples/cli-quickstart/ts/public/.npmignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/cli-quickstart/ts/src/app/angular2-cli-quickstart.component.css b/public/docs/_examples/cli-quickstart/ts/src/app/angular2-cli-quickstart.component.css new file mode 100644 index 0000000000..a914142012 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/src/app/angular2-cli-quickstart.component.css @@ -0,0 +1,6 @@ +/* #docregion */ +h1 { + color: #369; + font-family: Arial, Helvetica, sans-serif; + font-size: 250%; +} \ No newline at end of file diff --git a/public/docs/_examples/cli-quickstart/ts/src/app/angular2-cli-quickstart.component.html b/public/docs/_examples/cli-quickstart/ts/src/app/angular2-cli-quickstart.component.html new file mode 100644 index 0000000000..b6931b538a --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/src/app/angular2-cli-quickstart.component.html @@ -0,0 +1,3 @@ +

+ {{title}} +

diff --git a/public/docs/_examples/cli-quickstart/ts/src/app/angular2-cli-quickstart.component.spec.ts b/public/docs/_examples/cli-quickstart/ts/src/app/angular2-cli-quickstart.component.spec.ts new file mode 100644 index 0000000000..133dc445e8 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/src/app/angular2-cli-quickstart.component.spec.ts @@ -0,0 +1,24 @@ +import { + beforeEachProviders, + describe, + expect, + it, + inject +} from '@angular/core/testing'; +import { Angular2CliQuickstartAppComponent } from '../app/angular2-cli-quickstart.component'; + +beforeEachProviders(() => [Angular2CliQuickstartAppComponent]); + +describe('App: Angular2CliQuickstart', () => { + it('should create the app', + inject([Angular2CliQuickstartAppComponent], (app: Angular2CliQuickstartAppComponent) => { + expect(app).toBeTruthy(); + })); + + // #docregion title + it('should have as title \'My First Angular 2 App\'', + inject([Angular2CliQuickstartAppComponent], (app: Angular2CliQuickstartAppComponent) => { + expect(app.title).toEqual('My First Angular 2 App'); + })); + // #enddocregion title +}); diff --git a/public/docs/_examples/cli-quickstart/ts/src/app/angular2-cli-quickstart.component.ts b/public/docs/_examples/cli-quickstart/ts/src/app/angular2-cli-quickstart.component.ts new file mode 100644 index 0000000000..1a2bac4736 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/src/app/angular2-cli-quickstart.component.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core'; + +@Component({ + moduleId: module.id, + selector: 'angular2-cli-quickstart-app', + templateUrl: 'angular2-cli-quickstart.component.html', + styleUrls: ['angular2-cli-quickstart.component.css'] +}) +// #docregion title +export class Angular2CliQuickstartAppComponent { + title = 'My First Angular 2 App'; +} +// #enddocregion title diff --git a/public/docs/_examples/cli-quickstart/ts/src/app/environment.ts b/public/docs/_examples/cli-quickstart/ts/src/app/environment.ts new file mode 100644 index 0000000000..79ee96fdfd --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/src/app/environment.ts @@ -0,0 +1,7 @@ +// The file for the current environment will overwrite this one during build +// Different environments can be found in config/environment.{dev|prod}.ts +// The build system defaults to the dev environment + +export const environment = { + production: false +}; diff --git a/public/docs/_examples/cli-quickstart/ts/src/app/index.ts b/public/docs/_examples/cli-quickstart/ts/src/app/index.ts new file mode 100644 index 0000000000..61617c7cbe --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/src/app/index.ts @@ -0,0 +1,2 @@ +export {environment} from './environment'; +export {Angular2CliQuickstartAppComponent} from './angular2-cli-quickstart.component'; diff --git a/public/docs/_examples/cli-quickstart/ts/src/app/shared/index.ts b/public/docs/_examples/cli-quickstart/ts/src/app/shared/index.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/docs/_examples/cli-quickstart/ts/src/favicon.ico b/public/docs/_examples/cli-quickstart/ts/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8081c7ceaf2be08bf59010158c586170d9d2d517 GIT binary patch literal 5430 zcmc(je{54#6vvCoAI3i*G5%$U7!sA3wtMZ$fH6V9C`=eXGJb@R1%(I_{vnZtpD{6n z5Pl{DmxzBDbrB>}`90e12m8T*36WoeDLA&SD_hw{H^wM!cl_RWcVA!I+x87ee975; z@4kD^=bYPn&pmG@(+JZ`rqQEKxW<}RzhW}I!|ulN=fmjVi@x{p$cC`)5$a!)X&U+blKNvN5tg=uLvuLnuqRM;Yc*swiexsoh#XPNu{9F#c`G zQLe{yWA(Y6(;>y|-efAy11k<09(@Oo1B2@0`PtZSkqK&${ zgEY}`W@t{%?9u5rF?}Y7OL{338l*JY#P!%MVQY@oqnItpZ}?s z!r?*kwuR{A@jg2Chlf0^{q*>8n5Ir~YWf*wmsh7B5&EpHfd5@xVaj&gqsdui^spyL zB|kUoblGoO7G(MuKTfa9?pGH0@QP^b#!lM1yHWLh*2iq#`C1TdrnO-d#?Oh@XV2HK zKA{`eo{--^K&MW66Lgsktfvn#cCAc*(}qsfhrvOjMGLE?`dHVipu1J3Kgr%g?cNa8 z)pkmC8DGH~fG+dlrp(5^-QBeEvkOvv#q7MBVLtm2oD^$lJZx--_=K&Ttd=-krx(Bb zcEoKJda@S!%%@`P-##$>*u%T*mh+QjV@)Qa=Mk1?#zLk+M4tIt%}wagT{5J%!tXAE;r{@=bb%nNVxvI+C+$t?!VJ@0d@HIyMJTI{vEw0Ul ze(ha!e&qANbTL1ZneNl45t=#Ot??C0MHjjgY8%*mGisN|S6%g3;Hlx#fMNcL<87MW zZ>6moo1YD?P!fJ#Jb(4)_cc50X5n0KoDYfdPoL^iV`k&o{LPyaoqMqk92wVM#_O0l z09$(A-D+gVIlq4TA&{1T@BsUH`Bm=r#l$Z51J-U&F32+hfUP-iLo=jg7Xmy+WLq6_tWv&`wDlz#`&)Jp~iQf zZP)tu>}pIIJKuw+$&t}GQuqMd%Z>0?t%&BM&Wo^4P^Y z)c6h^f2R>X8*}q|bblAF?@;%?2>$y+cMQbN{X$)^R>vtNq_5AB|0N5U*d^T?X9{xQnJYeU{ zoZL#obI;~Pp95f1`%X3D$Mh*4^?O?IT~7HqlWguezmg?Ybq|7>qQ(@pPHbE9V?f|( z+0xo!#m@Np9PljsyxBY-UA*{U*la#8Wz2sO|48_-5t8%_!n?S$zlGe+NA%?vmxjS- zHE5O3ZarU=X}$7>;Okp(UWXJxI%G_J-@IH;%5#Rt$(WUX?6*Ux!IRd$dLP6+SmPn= z8zjm4jGjN772R{FGkXwcNv8GBcZI#@Y2m{RNF_w8(Z%^A*!bS*!}s6sh*NnURytky humW;*g7R+&|Ledvc-GA-{j{kKUstfuD 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 literal 0 HcmV?d00001 diff --git a/public/docs/_examples/cli-quickstart/ts/src/index.html b/public/docs/_examples/cli-quickstart/ts/src/index.html new file mode 100644 index 0000000000..544d96499c --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/src/index.html @@ -0,0 +1,31 @@ + + + + + Angular2CliQuickstart + + + {{#unless environment.production}} + + {{/unless}} + + + + + Loading... + + + + {{#each scripts.polyfills}}{{/each}} + + + + + + + + diff --git a/public/docs/_examples/cli-quickstart/ts/src/main.ts b/public/docs/_examples/cli-quickstart/ts/src/main.ts new file mode 100644 index 0000000000..124fd62260 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/src/main.ts @@ -0,0 +1,10 @@ +import { bootstrap } from '@angular/platform-browser-dynamic'; +import { enableProdMode } from '@angular/core'; +import { Angular2CliQuickstartAppComponent, environment } from './app/'; + +if (environment.production) { + enableProdMode(); +} + +bootstrap(Angular2CliQuickstartAppComponent); + diff --git a/public/docs/_examples/cli-quickstart/ts/src/manifest.webapp b/public/docs/_examples/cli-quickstart/ts/src/manifest.webapp new file mode 100644 index 0000000000..cd4afd6247 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/src/manifest.webapp @@ -0,0 +1,13 @@ +{ + "name": "Angular2 Cli Quickstart", + "icons": [ + { + "src": "icon.png", + "sizes": "96x96", + "type": "image/png" + } + ], + "start_url": "/index.html", + "display": "standalone", + "orientation": "portrait" +} diff --git a/public/docs/_examples/cli-quickstart/ts/src/system-config.ts b/public/docs/_examples/cli-quickstart/ts/src/system-config.ts new file mode 100644 index 0000000000..d2af1aac0c --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/src/system-config.ts @@ -0,0 +1,54 @@ +/*********************************************************************************************** + * User Configuration. + **********************************************************************************************/ +/** Map relative paths to URLs. */ +const map: any = { +}; + +/** User packages configuration. */ +const packages: any = { +}; + +//////////////////////////////////////////////////////////////////////////////////////////////// +/*********************************************************************************************** + * Everything underneath this line is managed by the CLI. + **********************************************************************************************/ +const barrels: string[] = [ + // Angular specific barrels. + '@angular/core', + '@angular/common', + '@angular/compiler', + '@angular/http', + '@angular/router', + '@angular/platform-browser', + '@angular/platform-browser-dynamic', + + // Thirdparty barrels. + 'rxjs', + + // App specific barrels. + 'app', + 'app/shared', + /** @cli-barrel */ +]; + +const cliSystemConfigPackages: any = {}; +barrels.forEach((barrelName: string) => { + cliSystemConfigPackages[barrelName] = { main: 'index' }; +}); + +/** Type declaration for ambient System. */ +declare var System: any; + +// Apply the CLI SystemJS configuration. +System.config({ + map: { + '@angular': 'vendor/@angular', + 'rxjs': 'vendor/rxjs', + 'main': 'main.js' + }, + packages: cliSystemConfigPackages +}); + +// Apply the user's configuration. +System.config({ map, packages }); diff --git a/public/docs/_examples/cli-quickstart/ts/src/typings.d.ts b/public/docs/_examples/cli-quickstart/ts/src/typings.d.ts new file mode 100644 index 0000000000..beb6cefcec --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/src/typings.d.ts @@ -0,0 +1 @@ +/// diff --git a/public/docs/_examples/package.json b/public/docs/_examples/package.json index 3a83c2bdf3..8c70d0dabc 100644 --- a/public/docs/_examples/package.json +++ b/public/docs/_examples/package.json @@ -7,6 +7,7 @@ "e2e": "tsc && concurrently \"http-server\" \"protractor protractor.config.js\"", "http-server": "tsc && http-server", "http-server:e2e": "http-server", + "http-server:cli": "http-server dist/", "lite": "lite-server", "postinstall": "typings install", "test": "tsc && concurrently \"tsc -w\" \"karma start karma.conf.js\"", @@ -16,7 +17,8 @@ "webdriver:update": "webdriver-manager update", "start:webpack": "webpack-dev-server --inline --progress --port 8080", "test:webpack": "karma start karma.webpack.conf.js", - "build:webpack": "rimraf dist && webpack --config config/webpack.prod.js --progress --profile --bail" + "build:webpack": "rimraf dist && webpack --config config/webpack.prod.js --progress --profile --bail", + "build:cli": "ng build" }, "keywords": [], "author": "", @@ -42,6 +44,7 @@ "bootstrap": "^3.3.6" }, "devDependencies": { + "angular-cli": "^1.0.0-beta.4", "canonical-path": "0.0.2", "concurrently": "^2.0.0", "css-loader": "^0.23.1", diff --git a/public/docs/ts/latest/cli-quickstart.jade b/public/docs/ts/latest/cli-quickstart.jade new file mode 100644 index 0000000000..b8ac31c1e0 --- /dev/null +++ b/public/docs/ts/latest/cli-quickstart.jade @@ -0,0 +1,261 @@ +include _util-fns + +:marked + Our CLI QuickStart goal is to build and run a super-simple Angular 2 + application in TypeScript, using the [official Angular-CLI](https://cli.angular.io/) + and closely following the [Style Guide](./guide/style-guide.html). + +figure.image-display + img(src='/resources/images/devguide/cli-quickstart/my-first-app.png' alt="Output of QuickStart app") + +:marked + # Learn + The following steps establish a development environment for the documentation samples + that also can be the foundation for our real world applications. At a high level, we will + + - set up the [development environment](#devenv) + - [serve and test](#serve-and-test) our app + - [edit](#edit) our app + - push our app live to [GitHub Pages](#github-pages) + +a(id="devenv") +.l-main-section +:marked + ## Development Environment + + Before we can start working, we need to set up our development environment: + + **Install [node and npm](https://nodejs.org/en/download/)** if not already on your machine. + + Then **install [Angular-CLI](https://github.com/angular/angular-cli)** and generate a new project by running the following commands: + +code-example(format=""). + npm install -g angular-cli + ng new angular2-cli-quickstart + cd angular2-cli-quickstart + +:marked + The CLI has also initialized a git repo for the project. + + **Let's serve our app.** + +a(id="serve-and-test") +.l-main-section +:marked + ## Serve & test + + Run `ng serve` to launch the server, watch our files, and rebuild the app whenever we make changes. + + Open a browser on `http://localhost:4200/`; the app greets us with a message: + +figure.image-display + img(src='/resources/images/devguide/cli-quickstart/app-works.png' alt="Our app works!") + +.alert.is-important + :marked + _Windows Developers_: perform these commands in a console window opened as an administrator. + The Angular-CLI build steps create symlinks which require administrator rights under Windows. + +:marked + Now we're ready to write some code... or are we? We certainly could start writing code right now, but our tests would break. + +:marked + ### Tests? + + What tests? The Angular-CLI created tests for our initial project! + They are configured to run on [Google Chrome](https://www.google.com/chrome/) so make sure it is installed before running them. + + Open a new terminal (or console) window and run the *end-to-end (e2e)* tests with the command: `ng e2e`. + Look for the following output after a few console messages: +code-example(format=""). + Spec started + + angular2-cli-quickstart App + ✓ should display message saying app works + + Executed 1 of 1 spec SUCCESS in 2 secs. + +:marked + Looks all green and good. Always a good sign. + + Keep the server running in the original window and run the *unit tests* with the command: `ng test --build=false --watch=false`. + After more console output, we should see a message like this: + +code-example(format=""). + Chrome 49.0.2623 (Windows 10 0.0.0): Executed 2 of 2 SUCCESS (0.016 secs / 0.009 secs) + +:marked + It's a good idea to run tests before and after making changes to confirm that our app behaves as we expect it to. + + *At last* we are ready to write some code. + +a(id="edit") +.l-main-section +:marked + ## Edit the app + + We open the `angular2-cli-quickstart` projecd folder in our favourite editor. + + The root component is named after the project. We created the project with the name `angular2-cli-quickstart`, + so our root component is `Angular2CliQuickstartApp` and can be found in `src/app/angular2-cli-quickstart.component.ts` + + Open it and update the title: + ++makeExample('cli-quickstart/ts/src/app/angular2-cli-quickstart.component.ts', 'title', 'src/app/angular2-cli-quickstart.component.ts')(format=".") + +:marked + The browser reloads automatically and we see the revised title. That's nice, but we can make look better. + + Open `src/app/angular2-cli-quickstart.component.css` and give the app some style + ++makeExample('cli-quickstart/ts/src/app/angular2-cli-quickstart.component.css', null, 'src/app/angular2-cli-quickstart.component.css')(format=".") + +:marked + Looking good! + +figure.image-display + img(src='/resources/images/devguide/cli-quickstart/my-first-app.png' alt="Output of QuickStart app") + +:marked + ### Re-test and fix + + We've made a few changes that we should commit to source control. + + Before we do, let's run our tests again. + While `ng serve` continues to run in the original window, + enter `ng e2e` again. This time the *e2e* test fails. + +code-example(format=""). + 1) angular2-cli-quickstart App should display message saying app works + - Expected 'My First Angular 2 App' to equal 'angular2-cli-quickstart works!'. + + Executed 1 of 1 spec (1 FAILED) in 1 sec. + +:marked + Run the unit tests again: `ng test --build=false --watch=false`. They fail too. +code-example(format=""). + Chrome 49.0.2623 (Windows 10 0.0.0) App: Angular2CliQuickstart should have as title 'angular2-cli-quickstart works!' FAILED + Expected 'My First Angular 2 App' to equal 'angular2-cli-quickstart works!'. + ... + Chrome 49.0.2623 (Windows 10 0.0.0): Executed 2 of 2 (1 FAILED) (0.038 secs / 0.022 secs) + +:marked + Our tests broke - as they should. We changed the title of our app, and our tests are looking for the original title. + + Fix the expected *title* text in both tests: + ++makeTabs( + 'cli-quickstart/ts/e2e/app.e2e.ts, cli-quickstart/ts/src/app/angular2-cli-quickstart.component.spec.ts', + 'title, title', + 'e2e/app.e2e.ts, src/app/angular2-cli-quickstart.component.spec.ts')(format=".") + +:marked + Run our tests again and... all green! We are back in business. + + Our repo is again in a stable state, so we can commit our changes. + +code-example(format=""). + git commit -a -m "Change root component title" + +a(id="github-pages") +.l-main-section +:marked + ## Push to production (Optional) + + Next stop: the production environment. + + Angular-CLI has a nifty command that helps us push our app onto [GitHub Pages](https://pages.github.com/) hosting. + +.l-sub-section + :marked + [Create a free GitHub Account](https://github.com/join) if you don't have one. + [Setup SSH keys](https://help.github.com/articles/generating-an-ssh-key/) + if you haven't done that yet. +:marked + Close all windows/processes (like `ng serve`!) that are using the app files and folders. + + Run `ng github-pages:deploy`. + +.alert.is-important + :marked + The `ng github-pages:deploy` command performs a series of git operations that add and remove files. + It can fail if those files are held by another process. + + If the command fails, we might be left in the `gh-pages` branch instead of the `master` branch. + + Run `git branch` and look for the _starred_ branch name. + If it isn't `master`, run `git checkout master`, + close open windows that might be using these files, and try `ng github-pages:deploy` again. + +:marked + This command creates a new github repository the first time we run it. + Subsequent calls use this existing repo. + + The command prompts us for a github token that will allow the CLI to create a repo for us. + Don't worry, the token is used only once and we can safely delete it after the repo is created. + Deleting the token invalidates it. + + ### Get a token + Go to [https://github.com/settings/tokens](https://github.com/settings/tokens), and click *Generate new token*. + +figure.image-display + img(src='/resources/images/devguide/cli-quickstart/gh-token-1.png' alt="Generate new token") + +:marked + We must login again and then choose a description and scope for the token. + + Name the token `angular-cli`, chose as scope *public_repo*, and then click *Generate token* at the bottom. +figure.image-display + img(src='/resources/images/devguide/cli-quickstart/gh-token-2.png' alt="Description and scope") + +:marked + On the next screen, copy the token, paste it in the console window that asked us for the token, and press enter. + + Keep this page open so we can delete the token when we're done. +figure.image-display + img(src='/resources/images/devguide/cli-quickstart/gh-token-3.png' alt="Copy and delete") + +:marked + The command prompts for our github username. Then it creates the repository, builds the app, and deploys it as a Github Page. + The entire process we just described looks like this: + +code-example(format="." language=""). + $ ng github-pages:deploy + Built project successfully. Stored in "dist/". + + In order to deploy this project via GitHub Pages, we must first create a repository for it. + It's safer to use a token than to use a password, so you will need to create one. + + Go to the following page and click 'Generate new token'. + https://github.com/settings/tokens + + Choose 'public_repo' as scope and then click 'Generate token'. + + ? Please enter GitHub token you just created (used only once to create the repo): YOUR_TOKEN_HERE + ? and your GitHub user name: YOUR_USERNAME_HERE + Deployed! Visit https://YOUR_USERNAME_HERE.github.io/angular2-cli-quickstart/ + Github pages might take a few minutes to show the deployed site. + +:marked + We can now delete the github token under the name of `angular-cli`, as it won't be needed anymore. + + Now all we have to do is visit [https://YOUR_USERNAME_HERE.github.io/angular2-cli-quickstart/](https://YOUR_USERNAME_HERE.github.io/angular2-cli-quickstart/) and check out our new web app! + + We can continue to develop it locally and deploy it whenever we want. The repo creation step only happens on the first time, so next times there is no need to get a token. + +.l-main-section +:marked + ## Wrap Up + Our first application doesn't do much. It's basically "Hello, World" for Angular 2. + + We kept it simple in our first pass: we generated a project, edited a page, + fixed some tests and finally pushed it live. That's about all we'd expect to + do for a "Hello, World" app. + + **We have greater ambitions.** + + The good news is that the overhead of setup is (mostly) behind us. + We'll probably only touch the `package.json` to update libraries. + We'll likely open `system-config.ts` only if we need to add a library. + + Angular-CLI will help us do the rest, and we can push it online at any time. diff --git a/public/resources/images/devguide/cli-quickstart/app-works.png b/public/resources/images/devguide/cli-quickstart/app-works.png new file mode 100644 index 0000000000000000000000000000000000000000..ade2555d4736c95d7830e9278f811295426fbd80 GIT binary patch literal 4029 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 literal 0 HcmV?d00001 diff --git a/public/resources/images/devguide/cli-quickstart/gh-token-1.png b/public/resources/images/devguide/cli-quickstart/gh-token-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d9fc74ddaff203cc9c62bc53d7ae9b59012e4896 GIT binary patch literal 6345 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 KhBcSm?)?`SSpsnY literal 0 HcmV?d00001 diff --git a/public/resources/images/devguide/cli-quickstart/gh-token-3.png b/public/resources/images/devguide/cli-quickstart/gh-token-3.png new file mode 100644 index 0000000000000000000000000000000000000000..d9348ab2115e203e0a91509d22a23d261e642444 GIT binary patch literal 14541 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 JOJBST_#f(P6x#p* literal 0 HcmV?d00001 diff --git a/public/resources/images/devguide/cli-quickstart/my-first-app.png b/public/resources/images/devguide/cli-quickstart/my-first-app.png new file mode 100644 index 0000000000000000000000000000000000000000..77a660ad775d9d793c03d06e41b272109d1e19e1 GIT binary patch literal 12797 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 literal 0 HcmV?d00001 From 2bbd4e62352e53c09dfccc46d2a85b4ecb9b5af1 Mon Sep 17 00:00:00 2001 From: Ward Bell Date: Mon, 23 May 2016 23:46:02 -0700 Subject: [PATCH 2/2] docs(cli-quickstart): new chapter - ward's adjustments --- .../cli-quickstart/ts/package.1.json | 2 +- public/docs/_examples/package.json | 2 +- public/docs/_includes/_side-nav.jade | 9 +- public/docs/dart/latest/_data.json | 7 ++ public/docs/dart/latest/cli-quickstart.jade | 1 + public/docs/js/latest/_data.json | 7 ++ public/docs/js/latest/cli-quickstart.jade | 1 + public/docs/ts/latest/_data.json | 6 ++ public/docs/ts/latest/cli-quickstart.jade | 99 +++++++++++++------ 9 files changed, 99 insertions(+), 35 deletions(-) create mode 100644 public/docs/dart/latest/cli-quickstart.jade create mode 100644 public/docs/js/latest/cli-quickstart.jade diff --git a/public/docs/_examples/cli-quickstart/ts/package.1.json b/public/docs/_examples/cli-quickstart/ts/package.1.json index cedeed62cd..f399cc5fdb 100644 --- a/public/docs/_examples/cli-quickstart/ts/package.1.json +++ b/public/docs/_examples/cli-quickstart/ts/package.1.json @@ -28,7 +28,7 @@ "zone.js": "^0.6.12" }, "devDependencies": { - "angular-cli": "^1.0.0-beta.4", + "angular-cli": "^1.0.0-beta.5", "codelyzer": "0.0.14", "ember-cli-inject-live-reload": "^1.4.0", "jasmine-core": "^2.4.1", diff --git a/public/docs/_examples/package.json b/public/docs/_examples/package.json index 8c70d0dabc..59a7e50a52 100644 --- a/public/docs/_examples/package.json +++ b/public/docs/_examples/package.json @@ -44,7 +44,7 @@ "bootstrap": "^3.3.6" }, "devDependencies": { - "angular-cli": "^1.0.0-beta.4", + "angular-cli": "^1.0.0-beta.5", "canonical-path": "0.0.2", "concurrently": "^2.0.0", "css-loader": "^0.23.1", diff --git a/public/docs/_includes/_side-nav.jade b/public/docs/_includes/_side-nav.jade index d1b8bbb5f7..cef158b6e7 100644 --- a/public/docs/_includes/_side-nav.jade +++ b/public/docs/_includes/_side-nav.jade @@ -36,12 +36,18 @@ - var cookbook = sections('cookbook'); - var basics = sections('guide', function(item) { return item.basics; }); - var guide = sections('guide', function(item) { return !item.basics; }); +- var cliQs = sections('', function(item) { return item.slug === 'cli-quickstart'; })[0] || {}; - var qs = sections('', function(item) { return item.slug === 'quickstart'; })[0] || {}; - var reference = sections('', function(item) { return item.reference; }); - var anyItemSelected = function(items) { - var selectedCount = items.filter(function(item) { return !!item.class; }).length; - return selectedCount > 0 ? 'is-nav-title-selected' : ''; - } +- var isCliQuickstartSelected = function() { +- var splitted = cur.split('/'); +- var bit = splitted[splitted.length - 1].replace('.html', ''); +- return bit === 'cli-quickstart' ? 'is-nav-title-selected' : ''; +-} - var isQuickstartSelected = function() { - var splitted = cur.split('/'); - var bit = splitted[splitted.length - 1].replace('.html', ''); @@ -66,6 +72,7 @@ nav.side-nav.l-pinned-left.l-layer-4.l-offset-nav div(class="side-nav-secondary" ng-class="appCtrl.showDocsNav ? 'is-visible' : ''") .nav-blocks + a(class="nav-title #{isCliQuickstartSelected(cur)}" href="#{cliQs.href}" title="#{cliQs.tooltip}") CLI Quickstart a(class="nav-title #{isQuickstartSelected(cur)}" href="#{qs.href}" title="#{qs.tooltip}") Quickstart .nav-blocks @@ -115,4 +122,4 @@ script. sideNav.scrollTop = link.offsetTop - (window.innerHeight/2); //alert("offsetTop: " + link.offsetTop + " side-nav top is " + sideNav.scrollTop); } - })() \ No newline at end of file + })() diff --git a/public/docs/dart/latest/_data.json b/public/docs/dart/latest/_data.json index 861e707ff1..8c713e113d 100644 --- a/public/docs/dart/latest/_data.json +++ b/public/docs/dart/latest/_data.json @@ -6,6 +6,13 @@ "banner": "Welcome to angular.io/dart! The current Angular 2 release is beta.17. Consult the Change Log about recent enhancements, fixes, and breaking changes." }, + "cli-quickstart": { + "icon": "query-builder", + "title": "CLI Quickstart", + "description": "Use the CLI tool to build apps quickly in Angular 2", + "hide": true + }, + "quickstart": { "icon": "query-builder", "title": "5 Min Quickstart", diff --git a/public/docs/dart/latest/cli-quickstart.jade b/public/docs/dart/latest/cli-quickstart.jade new file mode 100644 index 0000000000..29caa74a86 --- /dev/null +++ b/public/docs/dart/latest/cli-quickstart.jade @@ -0,0 +1 @@ +!= partial("../../_includes/styleguide/_styleguide") diff --git a/public/docs/js/latest/_data.json b/public/docs/js/latest/_data.json index 44be71ef79..921c0f2b8b 100644 --- a/public/docs/js/latest/_data.json +++ b/public/docs/js/latest/_data.json @@ -6,6 +6,13 @@ "banner": "Welcome to Angular in JavaScript! The current Angular 2 release is rc.1. Please consult the Change Log about recent enhancements, fixes, and breaking changes." }, + "cli-quickstart": { + "icon": "query-builder", + "title": "CLI Quickstart", + "description": "Use the CLI tool to build apps quickly in Angular 2", + "hide": true + }, + "quickstart": { "icon": "query-builder", "title": "5 Min Quickstart", diff --git a/public/docs/js/latest/cli-quickstart.jade b/public/docs/js/latest/cli-quickstart.jade new file mode 100644 index 0000000000..29caa74a86 --- /dev/null +++ b/public/docs/js/latest/cli-quickstart.jade @@ -0,0 +1 @@ +!= partial("../../_includes/styleguide/_styleguide") diff --git a/public/docs/ts/latest/_data.json b/public/docs/ts/latest/_data.json index 4c5dd3550f..24201c4c8d 100644 --- a/public/docs/ts/latest/_data.json +++ b/public/docs/ts/latest/_data.json @@ -6,6 +6,12 @@ "banner": "Welcome to Angular in TypeScript! The current Angular 2 release is rc.1. Please consult the Change Log about recent enhancements, fixes, and breaking changes." }, + "cli-quickstart": { + "icon": "query-builder", + "title": "CLI Quickstart", + "description": "Use the CLI tool to build apps quickly in Angular 2" + }, + "quickstart": { "icon": "query-builder", "title": "5 Min Quickstart", diff --git a/public/docs/ts/latest/cli-quickstart.jade b/public/docs/ts/latest/cli-quickstart.jade index b8ac31c1e0..a4ca326ad9 100644 --- a/public/docs/ts/latest/cli-quickstart.jade +++ b/public/docs/ts/latest/cli-quickstart.jade @@ -1,61 +1,91 @@ include _util-fns :marked - Our CLI QuickStart goal is to build and run a super-simple Angular 2 - application in TypeScript, using the [official Angular-CLI](https://cli.angular.io/) - and closely following the [Style Guide](./guide/style-guide.html). + Good tools make application development quicker and easier to maintain than + if we did everything by hand. + + The [**Angular-CLI**](https://cli.angular.io/) is a **_command line interface_** tool + that can create a project, add files, and perform a variety of on-going development tasks such + as testing, bundling, and deployment. + + Our goal in this CLI QuickStart chapter is to build and run a super-simple Angular 2 + application in TypeScript, using Angular-CLI + while adhering to the [Style Guide](./guide/style-guide.html) recommendations that + benefit _every_ Angular 2 project. + + By the end of the chapter, we'll have a basic understanding of development with the CLI + and a foundation for both these documentation samples and our real world applications. -figure.image-display - img(src='/resources/images/devguide/cli-quickstart/my-first-app.png' alt="Output of QuickStart app") + We'll pursue these ends in the following high-level steps: + + - [Set up](#devenv) the development environment + - [Create](#create-proj) a new project + - [Serve and test](#serve-and-test) the app + - [Edit](#edit) the app + - [Push](#github-pages) this demo app live to GitHub Pages -:marked - # Learn - The following steps establish a development environment for the documentation samples - that also can be the foundation for our real world applications. At a high level, we will - - - set up the [development environment](#devenv) - - [serve and test](#serve-and-test) our app - - [edit](#edit) our app - - push our app live to [GitHub Pages](#github-pages) -a(id="devenv") .l-main-section +h2#devenv Development Environment :marked - ## Development Environment + We need to set up our development environment before we can do anything. + + Install **[Node.js® and npm](https://nodejs.org/en/download/)** + if they are not already on your machine. +.l-sub-section + :marked + **Verify that you are running node `v5.x.x` and npm `3.x.x`** + by running `node -v` and `npm -v` in a terminal/console window. + Older and newer versions produce errors. +:marked + Then **install the [Angular-CLI](https://github.com/angular/angular-cli)** - Before we can start working, we need to set up our development environment: +code-example(format=""). + npm install -g angular-cli - **Install [node and npm](https://nodejs.org/en/download/)** if not already on your machine. +.l-main-section +h2#create-project Create a new project +:marked + Open a terminal window. - Then **install [Angular-CLI](https://github.com/angular/angular-cli)** and generate a new project by running the following commands: +.alert.is-important + :marked + _Windows Developers_: open a console window opened _as an **administrator**_. + The Angular-CLI build steps later in this tutorial + create symbolic links + to various directories. These so-called _symlinks_ save time and space. + But it takes administrator rights under Windows to create them. + +:marked + Generate a new project by running the following commands: code-example(format=""). - npm install -g angular-cli ng new angular2-cli-quickstart - cd angular2-cli-quickstart +.l-sub-section + :marked + Patience please. + It takes time to set up a new project, most of it spent installing npm packages. :marked - The CLI has also initialized a git repo for the project. - **Let's serve our app.** a(id="serve-and-test") .l-main-section :marked ## Serve & test - - Run `ng serve` to launch the server, watch our files, and rebuild the app whenever we make changes. + + Go to the project directory and launch the server. +code-example(format=""). + cd angular2-cli-quickstart + ng serve +:marked + The `ng serve` command launches the server, watches our files, + and rebuilds the app as we make changes to the files. Open a browser on `http://localhost:4200/`; the app greets us with a message: figure.image-display img(src='/resources/images/devguide/cli-quickstart/app-works.png' alt="Our app works!") - -.alert.is-important - :marked - _Windows Developers_: perform these commands in a console window opened as an administrator. - The Angular-CLI build steps create symlinks which require administrator rights under Windows. - :marked Now we're ready to write some code... or are we? We certainly could start writing code right now, but our tests would break. @@ -152,7 +182,12 @@ code-example(format=""). :marked Run our tests again and... all green! We are back in business. - Our repo is again in a stable state, so we can commit our changes. + Our project is again in a stable state. + +h2#git Commit with git +.l-main-section + The CLI created our project as a local **git** repository. + This is a good moment to commit our changes. code-example(format=""). git commit -a -m "Change root component title"