/node_modules/
/dist/
/npm-debug.log
.idea/
# Angular 2 Minimal

Instructional purposes only. No production build included.

<!DOCTYPE html>
<html>
  <head>
    <meta charset=UTF-8>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Angular 2 Lessons</title>
    <base href="/">
    <link rel="stylesheet"
          href="styles.css">
  </head>
  <body>

    <app>
      Loading...
    </app>

    <script src="/polyfills.bundle.js"></script>
    <script src="/rxjs.bundle.js"></script>
    <script src="/@angular.bundle.js"></script>
    <script src="/main.bundle.js"></script>
  </body>
</html>
{
  "name": "angular2-minimal",
  "version": "1.0.0",
  "description": "Minimal Angular 2 Setup",
  "scripts": {
    "build": "webpack --inline --colors --progress --display-error-details --display-cached",
    "watch": "npm run build -- --watch",
    "server": "webpack-dev-server --inline --colors --progress --display-error-details --display-cached --port 3000  --content-base ./",
    "start": "npm run server"
  },
  "devDependencies": {
    "@types/core-js": "^0.9.34",
    "@types/node": "^6.0.38",
    "awesome-typescript-loader": "^1.1.1",
    "typescript": "^2.0.2",
    "webpack": "^1.12.9",
    "webpack-dev-server": "^1.14.0",
    "webpack-merge": "^0.8.4"
  },
  "dependencies": {
    "@angular/common": "2.0.0",
    "@angular/compiler": "2.0.0",
    "@angular/core": "2.0.0",
    "@angular/forms": "2.0.0",
    "@angular/http": "2.0.0",
    "@angular/platform-browser": "2.0.0",
    "@angular/platform-browser-dynamic": "2.0.0",
    "@angular/platform-server": "2.0.0",
    "@angular/router": "3.0.0",
    "core-js": "^2.4.1",
    "ie-shim": "^0.1.0",
    "reflect-metadata": "^0.1.3",
    "rxjs": "5.0.0-beta.12",
    "zone.js": "~0.6.23"
  }
}
<!DOCTYPE html>
<html>
<head>
    <title>Angular 2 Lessons</title>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, initial-scale=1">

    <script>
        var path = document.location.href.includes('plnkr')
                ? './'
                : '/';
        document.write('<base href="' + path + '"/>');
    </script>


    <link rel="stylesheet"
          href="styles.css">
    <script src="https://unpkg.com/core-js/client/shim.min.js"></script>
    <script src="https://unpkg.com/zone.js@0.6.23?main=browser"></script>
    <script src="https://unpkg.com/reflect-metadata@0.1.3"></script>
    <script src="https://unpkg.com/systemjs@0.19.38/dist/system.src.js"></script>
    <script>
        const app = {'app': 'src'};
        const npm = 'https://unpkg.com';
        const transpiler = 'ts';
        const typescriptOptions = {tsconfig: true};
        const meta = {'typescript': {"exports": "ts"}};
        const packages = {
            app: {
                main: './main.browser.ts',
                defaultExtension: 'ts'
            },
            rxjs: {
                defaultExtension: 'js'
            }
        };

        const browserCompiler = {
            'ts': `${npm}/plugin-typescript@5.1.2/lib/plugin.js`,
            'typescript': `${npm}/typescript@2.0.2/lib/typescript.js`,
        };

        const dependencies = fetch('./package.json')
                .then(pkg => pkg.json())
                .then(body => body.dependencies);

        dependencies.then(deps => {
            const depInfo = Object.keys(deps)
                    .map(key => ({pkg: key, org: key.split('/')[0], repo: key.split('/')[1], version: deps[key]}));

            const ngInfo = depInfo.filter(info => info.org === '@angular')
                    .reduce((acc, {pkg, org, repo, version}) => Object.assign(acc, {
                        [`${pkg}`]: `${npm}/${pkg}@${version}/bundles/${repo}.umd.js`
                    }), {});

            const libInfo = depInfo.filter(info => info.org !== '@angular')
                    .reduce((acc, {pkg, org, repo, version}) => Object.assign(acc, {
                        [`${pkg}`]: `${npm}/${pkg}@${version}`
                    }), {});

               return {
                transpiler,
                typescriptOptions,
                meta,
                packages,
                map: Object.assign(app, browserCompiler, libInfo, ngInfo)
            };
        })
                .then(config => System.config(config))
                .then(()=> System.import('app'))
                .catch(function (err) {
                    console.error(err);
                });
    </script>
</head>
<body>
<app>Loading...</app>
</body>
</html>
import {BrowserModule} from "@angular/platform-browser";
import {NgModule} from "@angular/core";
import {AppComponent} from "./app";
import {FormsModule} from '@angular/forms';
@NgModule({
    imports: [BrowserModule, FormsModule],
    declarations: [AppComponent],
    bootstrap: [AppComponent]
})
export class AppModule {
}
import {Component} from '@angular/core';

@Component({
    selector: 'app',
    styles:[`
.completed{
    text-decoration: line-through;
}
`],
    template: `<div>

<input type="text" [(ngModel)]="message" (keyup.ENTER)="onEnter()">
{{message}}
<hr>

<ul>
    <li 
        *ngFor="let m of messages"
        [ngClass]="{'completed':m.completed}"
        (click)="m.completed = !m.completed"
        >{{m.message}}</li>
</ul>

</div>`
})
export class AppComponent {
    message = 'Amazing!';
    messages = [ ];

    onEnter(){
        this.messages.push(
            {
                message: this.message,
                completed: false
            }
        );
        this.message = "";
    }
}
import {AppModule} from './app/app.module';
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';

platformBrowserDynamic().bootstrapModule(AppModule)
    .catch(err => console.error(err));
:root{
    font-family: Arial, serif;
}
{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "suppressImplicitAnyIndexErrors": true,
    "types": [
      "core-js",
      "node"
    ]
  },
  "exclude": [
    "node_modules"
  ],
  "awesomeTypescriptLoaderOptions": {
    "useWebpackText": true
  },
  "compileOnSave": false,
  "buildOnSave": false,
  "atom": { "rewriteTsconfig": false }
}
var webpack = require('webpack');
var path = require('path');
var pkg = require('./package.json');

function findPackages(selector) {
    return Object.keys(pkg.dependencies).filter(selector);
}

var entry = {
    'main': './src/main.browser.ts',
    '@angular': findPackages(pkg => pkg.startsWith('@angular')),
    'rxjs': findPackages(pkg => pkg.startsWith('rxjs')),
    'polyfills': findPackages(pkg => pkg.startsWith('reflect') || pkg.startsWith('core') || pkg.startsWith('zone')),
};

var webpackConfig = {
    entry,

    output: {
        path: './',
    },
    plugins: [
        new webpack.optimize.OccurenceOrderPlugin(true),
        new webpack.optimize.CommonsChunkPlugin({name: Object.keys(entry), minChunks: Infinity})
    ],
    module: {
        loaders: [
            {test: /\.ts$/, loaders: ['awesome-typescript-loader']}
        ]
    }

};

var defaultConfig = {
    devtool: 'cheap-module-source-map',
    cache: true,
    debug: true,
    output: {
        filename: '[name].bundle.js',
        sourceMapFilename: '[name].map',
        chunkFilename: '[id].chunk.js'
    },

    resolve: {
        root: [path.join(__dirname, 'src')],
        extensions: ['', '.ts', '.js']
    },

    devServer: {
        historyApiFallback: true,
        watchOptions: {aggregateTimeout: 300, poll: 1000}
    },

    node: {
        global: 1,
        crypto: 'empty',
        module: 0,
        Buffer: 0,
        clearImmediate: 0,
        setImmediate: 0
    }
};

var webpackMerge = require('webpack-merge');
module.exports = webpackMerge(defaultConfig, webpackConfig);