From fb49cbe33f9d63d9f5bd258eebf7588e9cd42f62 Mon Sep 17 00:00:00 2001 From: Foxandxss Date: Sun, 5 Jun 2016 20:25:16 +0200 Subject: [PATCH] docs(cli-quickstart): add cli 5 min quickstart closes #1606 --- gulpfile.js | 16 +- .../docs/_examples/cli-quickstart/e2e-spec.ts | 11 + .../_examples/cli-quickstart/ts/.gitignore | 38 +++ .../cli-quickstart/ts/angular-cli-build.js | 17 ++ .../cli-quickstart/ts/angular-cli.json | 31 ++ .../ts/config/environment.dev.ts | 3 + .../cli-quickstart/ts/config/environment.js | 10 + .../ts/config/environment.prod.ts | 3 + .../cli-quickstart/ts/config/karma.conf.js | 42 +++ .../ts/config/protractor.conf.js | 29 ++ .../cli-quickstart/ts/e2e/app.e2e.ts | 14 + .../_examples/cli-quickstart/ts/e2e/app.po.ts | 9 + .../cli-quickstart/ts/example-config.json | 0 .../cli-quickstart/ts/public/.npmignore | 0 .../ts/src/app/cli-quickstart.component.css | 6 + .../ts/src/app/cli-quickstart.component.html | 2 + .../src/app/cli-quickstart.component.spec.ts | 22 ++ .../ts/src/app/cli-quickstart.component.ts | 17 ++ .../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 .../cli-quickstart/ts/src/index.html | 35 +++ .../_examples/cli-quickstart/ts/src/main.ts | 18 ++ .../cli-quickstart/ts/src/system-config.ts | 54 ++++ .../cli-quickstart/ts/src/typings.d.ts | 1 + public/docs/_examples/package.json | 7 +- public/docs/ts/latest/_data.json | 7 + public/docs/ts/latest/cli-quickstart.jade | 278 ++++++++++++++++++ .../devguide/cli-quickstart/app-works.png | Bin 0 -> 15107 bytes .../devguide/cli-quickstart/my-first-app.png | Bin 0 -> 12797 bytes 31 files changed, 672 insertions(+), 7 deletions(-) create mode 100644 public/docs/_examples/cli-quickstart/e2e-spec.ts 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/karma.conf.js 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/example-config.json create mode 100644 public/docs/_examples/cli-quickstart/ts/public/.npmignore create mode 100644 public/docs/_examples/cli-quickstart/ts/src/app/cli-quickstart.component.css create mode 100644 public/docs/_examples/cli-quickstart/ts/src/app/cli-quickstart.component.html create mode 100644 public/docs/_examples/cli-quickstart/ts/src/app/cli-quickstart.component.spec.ts create mode 100644 public/docs/_examples/cli-quickstart/ts/src/app/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/index.html create mode 100644 public/docs/_examples/cli-quickstart/ts/src/main.ts 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/my-first-app.png diff --git a/gulpfile.js b/gulpfile.js index a8e7e67e04..dd0eebb235 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -221,11 +221,19 @@ function findAndRunE2eTests(filter, outputFile) { // fileName; then shut down the example. All protractor output is appended // to the outputFile. function runE2eTsTests(appDir, 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; - return runProtractor(tscRunSpawnInfo.promise, appDir, appRunSpawnInfo, outputFile); + 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(appBuildSpawnInfo.promise, appDir, appRunSpawnInfo, outputFile); } function runProtractor(prepPromise, appDir, appRunSpawnInfo, outputFile) { diff --git a/public/docs/_examples/cli-quickstart/e2e-spec.ts b/public/docs/_examples/cli-quickstart/e2e-spec.ts new file mode 100644 index 0000000000..4134ed74a1 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/e2e-spec.ts @@ -0,0 +1,11 @@ +/// +describe('cli-quickstart App', () => { + beforeEach(() => { + return browser.get('/'); + }) + + it('should display message saying app works', () => { + var pageTitle = element(by.css('cli-quickstart-app h1')).getText() + expect(pageTitle).toEqual('My First Angular 2 App'); + }); +}); diff --git a/public/docs/_examples/cli-quickstart/ts/.gitignore b/public/docs/_examples/cli-quickstart/ts/.gitignore new file mode 100644 index 0000000000..766f37285b --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/.gitignore @@ -0,0 +1,38 @@ +# 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 + +# angular.io overrides +!angular-cli.json +!angular-cli-build.js +!config/environment.js +!config/karma-test.js +!config/karma.conf.js +!config/protractor.conf.js +!src/typings.d.ts 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..dad887ff3d --- /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|js.map)', + 'es6-shim/es6-shim.js', + 'reflect-metadata/**/*.+(js|js.map)', + 'rxjs/**/*.+(js|js.map)', + '@angular/**/*.+(js|js.map)' + ] + }); +}; 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..16964f2477 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/angular-cli.json @@ -0,0 +1,31 @@ +{ + "project": { + "version": "1.0.0-beta.5", + "name": "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", + "prefixInterfaces": false + } +} 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/karma.conf.js b/public/docs/_examples/cli-quickstart/ts/config/karma.conf.js new file mode 100644 index 0000000000..d39036fa52 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/config/karma.conf.js @@ -0,0 +1,42 @@ +module.exports = function (config) { + config.set({ + basePath: '..', + frameworks: ['jasmine'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher') + ], + customLaunchers: { + // chrome setup for travis CI using chromium + Chrome_travis_ci: { + base: 'Chrome', + flags: ['--no-sandbox'] + } + }, + files: [ + { pattern: 'dist/vendor/es6-shim/es6-shim.js', included: true, watched: false }, + { pattern: 'dist/vendor/zone.js/dist/zone.js', included: true, watched: false }, + { pattern: 'dist/vendor/reflect-metadata/Reflect.js', included: true, watched: false }, + { pattern: 'dist/vendor/systemjs/dist/system-polyfills.js', included: true, watched: false }, + { pattern: 'dist/vendor/systemjs/dist/system.src.js', included: true, watched: false }, + { pattern: 'dist/vendor/zone.js/dist/async-test.js', included: true, watched: false }, + + { pattern: 'config/karma-test-shim.js', included: true, watched: true }, + + // Distribution folder. + { pattern: 'dist/**/*', included: false, watched: true } + ], + exclude: [ + // Vendor packages might include spec files. We don't want to use those. + 'dist/vendor/**/*.spec.js' + ], + preprocessors: {}, + reporters: ['progress'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; 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..130d236c1c --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/e2e/app.e2e.ts @@ -0,0 +1,14 @@ +import { CliQuickstartPage } from './app.po'; + +describe('cli-quickstart App', function() { + let page: CliQuickstartPage; + + beforeEach(() => { + page = new CliQuickstartPage(); + }); + + it('should display message saying app works', () => { + page.navigateTo(); + expect(page.getParagraphText()).toEqual('cli-quickstart works!'); + }); +}); 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..645e0e83a8 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/e2e/app.po.ts @@ -0,0 +1,9 @@ +export class CliQuickstartPage { + navigateTo() { + return browser.get('/'); + } + + getParagraphText() { + return element(by.css('cli-quickstart-app h1')).getText(); + } +} 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/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/cli-quickstart.component.css b/public/docs/_examples/cli-quickstart/ts/src/app/cli-quickstart.component.css new file mode 100644 index 0000000000..a2b21fae82 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/src/app/cli-quickstart.component.css @@ -0,0 +1,6 @@ +/* #docregion */ +h1 { + color: #369; + font-family: Arial, Helvetica, sans-serif; + font-size: 250%; +} diff --git a/public/docs/_examples/cli-quickstart/ts/src/app/cli-quickstart.component.html b/public/docs/_examples/cli-quickstart/ts/src/app/cli-quickstart.component.html new file mode 100644 index 0000000000..009d49dfa6 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/src/app/cli-quickstart.component.html @@ -0,0 +1,2 @@ + +

{{title}}

diff --git a/public/docs/_examples/cli-quickstart/ts/src/app/cli-quickstart.component.spec.ts b/public/docs/_examples/cli-quickstart/ts/src/app/cli-quickstart.component.spec.ts new file mode 100644 index 0000000000..90abbf1298 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/src/app/cli-quickstart.component.spec.ts @@ -0,0 +1,22 @@ +import { + beforeEachProviders, + describe, + expect, + it, + inject +} from '@angular/core/testing'; +import { CliQuickstartAppComponent } from '../app/cli-quickstart.component'; + +beforeEachProviders(() => [CliQuickstartAppComponent]); + +describe('App: CliQuickstart', () => { + it('should create the app', + inject([CliQuickstartAppComponent], (app: CliQuickstartAppComponent) => { + expect(app).toBeTruthy(); + })); + + it('should have as title \'cli-quickstart works!\'', + inject([CliQuickstartAppComponent], (app: CliQuickstartAppComponent) => { + expect(app.title).toEqual('cli-quickstart works!'); + })); +}); diff --git a/public/docs/_examples/cli-quickstart/ts/src/app/cli-quickstart.component.ts b/public/docs/_examples/cli-quickstart/ts/src/app/cli-quickstart.component.ts new file mode 100644 index 0000000000..5510df7476 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/src/app/cli-quickstart.component.ts @@ -0,0 +1,17 @@ +// #docregion import +import { Component } from '@angular/core'; +// #enddocregion import + +// #docregion metadata +@Component({ + moduleId: module.id, + selector: 'cli-quickstart-app', + templateUrl: 'cli-quickstart.component.html', + styleUrls: ['cli-quickstart.component.css'] +}) +// #enddocregion metadata +// #docregion title, class +export class CliQuickstartAppComponent { + title = 'My First Angular 2 App'; +} +// #enddocregion title, class 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..e4a0d09c55 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/src/app/index.ts @@ -0,0 +1,2 @@ +export * from './environment'; +export * from './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- + + + + + CliQuickstart + + + {{#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..c3561a2c57 --- /dev/null +++ b/public/docs/_examples/cli-quickstart/ts/src/main.ts @@ -0,0 +1,18 @@ +// #docplaster +// #docregion important +import { bootstrap } from '@angular/platform-browser-dynamic'; + +// #enddocregion important +import { enableProdMode } from '@angular/core'; +import { environment } from './app/'; +// #docregion important +import { CliQuickstartAppComponent } from './app/'; +// #enddocregion important +if (environment.production) { + enableProdMode(); +} + +// #docregion important + +bootstrap(CliQuickstartAppComponent); +// #enddocregion important 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..eebc2728b8 --- /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 e783edfb73..f72f1f53e8 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\"", @@ -17,7 +18,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": "", @@ -32,17 +34,16 @@ "@angular/router": "2.0.0-rc.1", "@angular/router-deprecated": "2.0.0-rc.1", "@angular/upgrade": "2.0.0-rc.1", - "systemjs": "0.19.27", "core-js": "^2.4.0", "reflect-metadata": "^0.1.3", "rxjs": "5.0.0-beta.6", "zone.js": "^0.6.12", - "angular2-in-memory-web-api": "0.0.11", "bootstrap": "^3.3.6" }, "devDependencies": { + "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/ts/latest/_data.json b/public/docs/ts/latest/_data.json index 4c5dd3550f..6df7846a08 100644 --- a/public/docs/ts/latest/_data.json +++ b/public/docs/ts/latest/_data.json @@ -6,6 +6,13 @@ "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", + "hide": true + }, + "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 new file mode 100644 index 0000000000..0a9a2d8636 --- /dev/null +++ b/public/docs/ts/latest/cli-quickstart.jade @@ -0,0 +1,278 @@ +include _util-fns + +:marked + 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. + + We'll pursue these ends in the following high-level steps: + + 1. [Set up](#devenv) the development environment + 2. [Create](#create-proj) a new project and skeleton application + 3. [Serve](#serve) the application + 4. [Edit](#first-component) the application + + +.l-main-section +h2#devenv Step 1. Set up the Development Environment +:marked + 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 versions produce errors. +:marked + Then **install the [Angular-CLI](https://github.com/angular/angular-cli)** globally. + +code-example(format=""). + npm install -g angular-cli + +.l-main-section +h2#create-project Step 2. Create a new project +:marked + Open a terminal window. + +.alert.is-important + :marked + _Windows Developers_: open a console window _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 and skeleton application by running the following commands: + +code-example(format=""). + ng new cli-quickstart + +.l-sub-section + :marked + Patience please. + It takes time to set up a new project, most of it spent installing npm packages. + +.l-main-section +h2#serve Step 3: Serve the application +:marked + Go to the project directory and launch the server. +code-example(format=""). + cd 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!") + +.l-main-section +h2#first-component Step 4: Edit our first Angular component +:marked + The CLI created our first Angular component for us. + This is the _root component_ and it is named after the project. We created the project + with the name `cli-quickstart` so our component is `CliQuickstartAppComponent` and + it's in the file `/src/app/cli-quickstart.component.ts` +.l-sub-section + :marked + _CliQuickstartAppComponent_ is a _horrible name_. Almost everyone renames it to _AppComponent_ ... + and renames all of the associated files to _app.component.??_ as we do throughout the documentation. + We'll leave that step as an exercise. + +:marked + Open the component file and change the `title` property from _cli-quickstart works!_ to _My First Angular 2 App_: + ++makeExample('cli-quickstart/ts/src/app/cli-quickstart.component.ts', 'title', 'src/app/cli-quickstart.component.ts')(format=".") + +:marked + The browser reloads automatically and we see the revised title. That's nice, but we can make it look better. + + Open `src/app/cli-quickstart.component.css` and give our component some style + ++makeExample('cli-quickstart/ts/src/app/cli-quickstart.component.css', null, 'src/app/cli-quickstart.component.css')(format=".") + +figure.image-display + img(src='/resources/images/devguide/cli-quickstart/my-first-app.png' alt="Output of QuickStart app") + +:marked + Looking good! + +.l-main-section +:marked + ## What's next? + Our first application doesn't do much. It's basically "Hello, World" for Angular 2. + + We kept it simple in our first pass: we wrote our first Angular 2 application using the angular CLI + and modified our first component. That's about all we'd expect to do for a "Hello, World" app. + + **We have greater ambitions!** +:marked + We're about to take the next step and build a small application that + demonstrates the great things we can build with Angular 2. + + Join us on the [Tour of Heroes Tutorial](./tutorial)! + + Or stick around a bit longer to learn a few things about what we just did. +

+.l-main-section +h1#behind-the-code Behind the code +:marked + ### CliQuickstartAppComponent is the root of the application + + Every Angular app has at least one **root component**, that hosts the client user experience. + Components are the basic building blocks of Angular applications. + A component controls a portion of the screen — a *view* — through its associated template. + + This QuickStart has only one, extremely simple component. + But it has the essential structure of every component we'll ever write: + + * one or more [import](#component-import) + statements to reference the things we need. + * a [@Component decorator](#component-decorator) + that tells Angular what template to use and how to create the component. + * a [component class](#component-class) + that controls the appearance and behavior of a view through its template. + +a#component-import +:marked + ### Import + + Angular apps are modular. They consist of many files, each dedicated to a purpose. + + Angular itself is modular. It is a collection of library modules + consisting of several, related features that we'll use to build our application. + + When we need something from a module or library, we import it. + Here we import the `Component` decorator from the Angular 2 **_core_** library + that we'll use as a decorator (`@Component`) to attach metadata to our component class. + . + ++makeExcerpt('src/app/cli-quickstart.component.ts', 'import') + +h3#component-decorator @Component decorator +:marked + `Component` is a *decorator* function that associates Angular *metadata* with a + component class. + The metadata tell Angular how to create and display instances of this component. + + We apply this function to the component class by prefixing the function name with the + **@** symbol and invoking it with a metadata object, just above the class. + ++makeExcerpt('src/app/cli-quickstart.component.ts', 'metadata') + +:marked + This particular metadata object has four fields, a `moduleId`, a `selector` a `templateUrl` and an array of `styleUrls`. + + The **moduleId** specifies the location of _this_ component definition file + so that Angular can find the corresponding _template_ and _style_ files with URLs that + are relative to this component file. + The module loader sets the value of `module.id` at runtime; + we're using that value to set the metadata `moduleId` property. + + The **selector** is a [CSS selector](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_Started/Selectors) + identifying the HTML element that represents this component. + + The element tag name for this component is `cli-quickstart-app`. + Angular creates and displays an instance of our `CliQuickstartAppComponent` + wherever it encounters a `` element in the host HTML. + + The **templateUrl** locates the component's companion template HTML file. + The template tells Angular how to render this component's view. + + Our template is a single `

` element surrounding some peculiar Angular data binding syntax. ++makeExample('src/app/cli-quickstart.component.html', null, 'src/app/cli-quickstart.component.html')(format='.') +:marked + The `{{title}}` is an _interpolation_ binding that causes Angular to display the component's + `title` property. After out edit, Angular displays _My First Angular 2 App_. + We'll learn more about data binding as we read through the documentation. + + The **styleUrls** array specifies the location(s) of the component's private CSS style file(s). + The CLI generated an empty file for us and we added styles to it. + +:marked + ### Component class + At the bottom of the component definition file is the component class named `CliQuickstartAppComponent`. ++makeExcerpt('cli-quickstart/ts/src/app/cli-quickstart.component.ts', 'class') +:marked + This class contains the `title` property that we're displaying in our template. + We can expand this class with more properties and application logic. + + We **export** `CliQuickstartAppComponent` so that we can **import** it elsewhere in our application ... as we're about to do. + +:marked + ### The *main.ts* file + + How does Angular know what to do with our component? We have to tell it. + We _bootstrap_ our application in the file `main.ts`. + ++makeExcerpt('src/main.ts', 'important') + +:marked + We import the two things we need to launch the application: + + 1. Angular's browser `bootstrap` function + 1. The application root component, `CliQuickstartAppComponent`. + + Then we call `bootstrap` with `CliQuickstartAppComponent`. + + ### Bootstrapping is platform-specific + Notice that we import the `bootstrap` function from `@angular/platform-browser-dynamic`, + not `@angular/core`. + Bootstrapping isn't core because there isn't a single way to bootstrap the app. + True, most applications that run in a browser call the bootstrap function from + this library. + + But it is possible to load a component in a different environment. + We might load it on a mobile device with [Apache Cordova](https://cordova.apache.org/) or [NativeScript](https://www.nativescript.org/). + We might wish to render the first page of our application on the server + to improve launch performance or facilitate + [SEO](http://www.google.com/webmasters/docs/search-engine-optimization-starter-guide.pdf). + These targets require a different kind of bootstrap function that we'd import from a different library. + + ### Why create a *main.ts* file? + + Both `main.ts` and the application component files are tiny. + This is just a QuickStart. + We could have merged these two files into one + and spared ourselves some complexity. + + We'd rather demonstrate the proper way to structure an Angular application. + App bootstrapping is a separate concern from presenting a view. + Mixing concerns creates difficulties down the road. + We might launch the `CliQuickstartAppComponent` in multiple environments with different bootstrappers. + Testing the component is much easier if it doesn't also try to run the entire application. + Let's make the small extra effort to do it *the right way*. + + ### Loading the application with SystemJS + + The CLI uses `System.js` to load the application. We just need to call `System.import` and pass it our `main.ts` + file to boot our application. + ++makeExcerpt('src/index.html', 'import') + +:marked + ### Displaying the root component + + When Angular calls the `bootstrap` function in `main.ts`, it reads the `CliQuickstartAppComponent` + metadata, finds the `cli-quickstart-app` selector, locates an element tag named `cli-quickstart-app` + in the `` tag of the `index.html`, and renders our application's view between those tags. ++makeExcerpt('src/index.html', 'body') +:marked + This is just a taste of Angular 2 develoment. There's much more to learn. Now really is the time to + head over to the [Tour of Heroes Tutorial](./tutorial)! 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..e0b9fb73f56df97b38de9109e8ae8f7960f47a7c GIT binary patch literal 15107 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 literal 0 HcmV?d00001