Commit c94d3285 authored by nano's avatar nano

split web project

parent 7d487b3b
.example-full-width {
width: 100%;
}
md-select {
margin: 16px 0;
}
md-dialog-actions {
text-align: right;
}
\ No newline at end of file
<h1 md-dialog-title>创建应用</h1>
<form class="example-form">
<md-dialog-content>
<md-input-container class="example-full-width">
<input md-input placeholder="应用 ID (创建应用后无法修改)" [(ngModel)]="id" name="id">
</md-input-container>
<md-select placeholder="主要语言" [(ngModel)]="locale" name="locale" class="example-full-width">
<md-option *ngFor="let l of locales" [value]="l">{{l}}</md-option>
</md-select>
<md-input-container class="example-full-width">
<input md-input placeholder="名称" [(ngModel)]="name" name="name">
</md-input-container>
</md-dialog-content>
</form>
<md-dialog-actions>
<button md-button md-dialog-close>取消</button>
<button md-button (click)="submit(id, locale, name)">确定</button>
</md-dialog-actions>
\ No newline at end of file
/**
* Created by weijian on 2016/12/30.
*/
import {Component} from '@angular/core';
import {MdDialogRef} from '@angular/material';
import App from '../models/browserapp';
@Component({
moduleId: module.id,
templateUrl: 'app-create.component.html',
styleUrls: ['app-create.component.css'],
})
export class AppCreateComponent {
locales = ['zh-CN', 'zh-TW', 'en-US', 'ja-JP'];
locale = 'zh-CN';
id: string;
name: string;
app = {name: {}};
constructor(public dialogRef: MdDialogRef<AppCreateComponent>) {
}
submit(id: string, locale: string, name: string) {
this.dialogRef.close(new App({id: id, name: {[locale]: name}}));
}
}
.example-full-width {
width: 100%;
}
md-select {
margin: 16px 0;
}
\ No newline at end of file
<div *ngIf="app">
<!--<h3 md-subheader>基本信息</h3>-->
<form class="example-form" (submit)="submit()">
<md-select placeholder="类别" [(ngModel)]="app.category" name="category" class="example-full-width">
<md-option *ngFor="let l of ['game','runtime','emulator','module']" [value]="l">{{l}}</md-option>
</md-select>
<md-input-container class="example-full-width">
<input md-input name="tags" placeholder="标签" [(ngModel)]="tags">
<md-hint align="end">JSON string[],不会写请联系 zh99998@gmail.com</md-hint>
</md-input-container>
<md-input-container class="example-full-width">
<input md-input name="author" placeholder="开发者" [(ngModel)]="app.author">
</md-input-container>
<md-input-container class="example-full-width">
<input md-input name="homepage" placeholder="网站" [(ngModel)]="app.homepage">
<md-hint align="end">以 http:// 或 https:// 开头,没有可留空</md-hint>
</md-input-container>
<md-input-container class="example-full-width">
<input md-input name="conference" placeholder="聊天室" [(ngModel)]="app.conference">
<md-hint align="end">游戏类应用通常与 ID 相同,其他类型的应用留空</md-hint>
</md-input-container>
<md-input-container class="example-full-width">
<input md-input name="locales" placeholder="应用支持的语言" [(ngModel)]="locales">
<md-hint align="end">JSON string[],不会写请联系 zh99998@gmail.com</md-hint>
</md-input-container>
<button md-raised-button color="primary">提交</button>
</form>
</div>
\ No newline at end of file
import {Component, OnInit} from '@angular/core';
import App from '../models/browserapp';
import {AppService} from './app.service';
import {ActivatedRoute} from '@angular/router';
import 'rxjs/Rx';
import {MdSnackBar} from '@angular/material';
@Component({
moduleId: module.id,
templateUrl: 'app-detail.component.html',
styleUrls: ['app-detail.component.css']
})
export class AppDetailComponent implements OnInit {
app: App;
constructor(private appService: AppService, private route: ActivatedRoute,
private snackBar: MdSnackBar) {
}
async submit() {
// TODO: 处理上传的数据
try {
await this.appService.update(this.app);
this.snackBar.open('编辑成功', undefined, {duration: 2000});
} catch (e) {
this.snackBar.open(e.toString(), undefined, {duration: 2000});
}
}
async ngOnInit() {
let id = this.route.parent.snapshot.params['id'];
this.app = await this.appService.find(id);
}
}
.example-full-width {
width: 100%;
}
.example-form {
margin-top: 16px;
}
md-select {
margin: 16px 0;
}
\ No newline at end of file
<md-tab-group *ngIf="app">
<md-tab *ngFor="let locale of locales" [label]="locale">
<form class="example-form" (submit)="submit()">
<md-input-container class="example-full-width">
<input md-input name="name" placeholder="应用名称" [(ngModel)]="app.name[locale]">
</md-input-container>
<md-input-container class="example-full-width">
<textarea md-input name="description" placeholder="应用介绍"
[(ngModel)]="app.description[locale]"></textarea>
<md-hint align="end">支持 Markdown 语法</md-hint>
</md-input-container>
<md-input-container class="example-full-width">
<textarea md-input name="news" placeholder="新闻" [(ngModel)]="news[locale]"></textarea>
<md-hint align="end">JSON &#123;title: string, url: string, image: string&#125;[],不会写请联系
zh99998@gmail.com
</md-hint>
</md-input-container>
<button md-raised-button color="primary">提交</button>
</form>
</md-tab>
<md-tab #translate label="添加翻译">
<form class="example-form" (submit)="addTranslate(locale)">
<md-select placeholder="语言" [(ngModel)]="locale" name="locale" class="example-full-width" >
<md-option *ngFor="let l of untranslated_locales()" [value]="l">{{l}}</md-option>
</md-select>
<button md-raised-button color="primary">提交</button>
</form>
</md-tab>
</md-tab-group>
\ No newline at end of file
import {Component, OnInit, ViewChild} from '@angular/core';
import App, {I18n} from '../models/browserapp';
import {AppService} from './app.service';
import {ActivatedRoute, Params} from '@angular/router';
import 'rxjs/Rx';
import {MdTab, MdSnackBar} from '@angular/material';
@Component({
moduleId: module.id,
templateUrl: 'app-locales.component.html',
styleUrls: ['app-locales.component.css']
})
export class AppLocalesComponent implements OnInit {
app: App;
locales: string[];
news: I18n<string> = {};
@ViewChild('translate')
translate: MdTab;
locale: string;
constructor(private appService: AppService, private route: ActivatedRoute,
private snackBar: MdSnackBar) {
}
async addTranslate(locale: string) {
this.locales.push(locale);
this.locale = this.untranslated_locales()[0];
}
async submit() {
// TODO: 处理上传的数据
try {
await this.appService.update(this.app);
this.snackBar.open('编辑成功', undefined, {duration: 2000});
} catch (e) {
this.snackBar.open(e.toString(), undefined, {duration: 2000});
}
}
async ngOnInit() {
this.route.parent.params
.switchMap((params: Params) => this.appService.find(params['id']))
.subscribe(app => {
this.app = app;
this.locales = Object.keys(app.name);
this.locale = this.untranslated_locales()[0];
for (let [locale, news] of Object.entries(app.news)) {
this.news[locale] = JSON.stringify(news);
}
});
}
untranslated_locales() {
return ['zh-CN', 'zh-TW', 'en-US', 'ja-JP'].filter(locale => !this.locales.includes(locale));
}
}
.example-full-width {
width: 100%;
}
<md-tab-group *ngIf="app">
<md-tab *ngFor="let package of packages" [label]="package_description(package)">
<form class="example-form" style="margin-top:16px;">
<!--<md-input-container class="example-full-width">-->
<!--<input md-input name="name" placeholder="应用名称" [(ngModel)]="app.name[locale]">-->
<!--</md-input-container>-->
<!--<md-input-container class="example-full-width">-->
<!--<textarea md-input name="description" placeholder="应用介绍"-->
<!--[(ngModel)]="app.description[locale]"></textarea>-->
<!--<md-hint align="end">支持 Markdown 语法</md-hint>-->
<!--</md-input-container>-->
<!--<md-input-container class="example-full-width">-->
<!--<textarea md-input name="news" placeholder="新闻" [(ngModel)]="news[locale]"></textarea>-->
<!--<md-hint align="end">JSON &#123;title: string, url: string, image: string&#125;[],不会写请联系-->
<!--zh99998@gmail.com-->
<!--</md-hint>-->
<!--</md-input-container>-->
<button md-raised-button color="primary">提交</button>
</form>
</md-tab>
</md-tab-group>
<md-tab-group>
<md-tab *ngFor="let locale of locales" [label]="locale">
<form class="example-form" style="margin-top:16px;">
<md-input-container class="example-full-width">
<input md-input name="name" placeholder="应用名称" [(ngModel)]="app.name[locale]">
</md-input-container>
<md-input-container class="example-full-width">
<textarea md-input name="description" placeholder="应用介绍" [(ngModel)]="app.description">1600 Amphitheatre Pkwy</textarea>
</md-input-container>
<button md-raised-button color="primary">提交</button>
</form>
</md-tab>
</md-tab-group>
\ No newline at end of file
import {Component, OnInit} from '@angular/core';
import App from '../models/browserapp';
import {AppService} from './app.service';
import {ActivatedRoute, Params} from '@angular/router';
import 'rxjs/Rx';
import {Package} from '../models/package';
@Component({
moduleId: module.id,
templateUrl: 'app-packages.component.html',
styleUrls: ['app-packages.component.css']
})
export class AppPackagesComponent implements OnInit {
app: App;
packages: Package[];
constructor(private appService: AppService, private route: ActivatedRoute) {
}
async ngOnInit() {
this.route.parent.params
.switchMap((params: Params) => this.appService.find(params['id']))
.subscribe(async(app) => {
this.app = app;
this.packages = await this.appService.allPackages(app.id);
});
}
package_description(_package: any) {
// _package.platform
}
}
.wrapper {
min-height: 1000px;
padding: 20px 20px 0 20px;
}
md-sidenav {
width: 240px;
}
md-sidenav h3 {
background: rgba(0, 0, 0, .32);
color: #fff;
border: none;
font-size: 10px;
letter-spacing: 1px;
line-height: 24px;
text-transform: uppercase;
font-weight: 400;
margin: 0;
padding: 0 16px;
}
md-sidenav li {
border-bottom: 1px solid;
margin: 0;
padding: 0;
border-color: rgba(0, 0, 0, .06);
color: rgba(0, 0, 0, .54);
}
md-sidenav li > a {
box-sizing: border-box;
display: block;
font-size: 14px;
font-weight: 400;
line-height: 47px;
text-decoration: none;
transition: all .3s;
padding: 0 16px;
position: relative;
color: rgba(0, 0, 0, .54);
}
md-sidenav li > a:hover {
background: #fafafa;
color: #00bcd4;
}
md-sidenav ul {
list-style-type: none;
margin: 0;
padding: 0;
}
#info {
display: flex;
}
h1 {
margin: 0;
font-size: 32px;
}
#info-contents {
margin-left: 12px;
}
#info-contents a, #info-contents span {
line-height: 20px;
padding: 0 4px;
min-width: inherit;
}
md-toolbar {
padding-bottom: 12px;
font-size: 14px;
}
md-toolbar /deep/ md-toolbar-row {
height: auto;
}
#icon img {
width: 80px;
height: 80px;
}
#icon input {
display: none;
}
\ No newline at end of file
<md-sidenav-container>
<md-sidenav mode="side" opened="true">
<h3>信息中心</h3>
<ul>
<li><a md-list-item href="#" disabled>概览</a></li>
</ul>
<h3>编辑应用</h3>
<ul>
<li><a md-list-item routerLink="detail">基本信息</a></li>
<li><a md-list-item routerLink="locales">语言</a></li>
<li><a md-list-item routerLink="packages">文件包</a></li>
</ul>
</md-sidenav>
<md-toolbar *ngIf="app" id="info" color="primary">
<div>
<label id="icon">
<img [src]="app.icon">
<input type="file" (change)="change_icon(app, $event.target.files[0])"/>
</label>
</div>
<div id="info-contents">
<h1>{{app.name['zh-CN']}}</h1>
<div>
<span>{{app.id}}</span>
<a md-button target="_blank" href="https://mycard.moe">在商店中查看</a>
</div>
<div>
<span style="color:#84a000;">已发布</span>
<span lang="zh-CN">{{app.created_at | date}}</span>
<a md-button (click)="unpublish(app)">取消发布应用</a>
<a md-button (click)="remove(app)">删除应用</a>
</div>
</div>
</md-toolbar>
<div class="wrapper">
<router-outlet></router-outlet>
</div>
</md-sidenav-container>
\ No newline at end of file
import {Component, OnInit} from '@angular/core';
import {ActivatedRoute, Params, Router} from '@angular/router';
import {AppService} from './app.service';
import App from '../models/browserapp';
import {MdSnackBar} from '@angular/material';
@Component({
moduleId: module.id,
templateUrl: 'app.component.html',
styleUrls: ['app.component.css']
})
export class AppComponent implements OnInit {
app: App;
constructor(private route: ActivatedRoute, private appService: AppService,
private snackBar: MdSnackBar, private router: Router) {
}
ngOnInit() {
this.route.params
.switchMap((params: Params) => this.appService.find(params['id']))
.subscribe(app => {
this.app = app;
});
}
change_icon(app: App, file: File) {
if (!file) {
return;
}
console.log(app, file);
}
async remove() {
if (confirm('确认删除')) {
try {
await this.appService.remove(this.app);
await this.router.navigate(['/apps']);
this.snackBar.open('删除成功', undefined, {duration: 2000});
} catch (e) {
this.snackBar.open(e.toString(), undefined, {duration: 2000});
}
}
}
unpublish() {
}
}
import {Injectable} from '@angular/core';
import App from '../models/browserapp';
import {Http, RequestOptions, Headers, Response} from '@angular/http';
import 'rxjs/add/operator/toPromise';
import {Observable} from 'rxjs/Rx';
import {Package} from '../models/package';
/**
* Created by weijian on 2016/12/30.
*/
function addJsonOptions(options?: RequestOptions): RequestOptions {
if (options) {
options.headers.append('Content-Type', 'application/json');
} else {
let headers = new Headers({'Content-Type': 'application/json'})
options = new RequestOptions({headers: headers});
}
return options;
}
@Injectable()
export class AppService {
constructor(private http: Http) {
}
async allPackages(appId: string): Promise<Package[]> {
return [new Package({
version: '1.06',
platforms: ['win32', 'darwin'],
locales: ['zh-CN', 'en-US'],
files: {'1.txt': 'hashA', '2.txt': 'hashB', '3.txt': 'hashC'},
})];
}
all(): Promise<App[]> {
return this.http.get('http://localhost:8000/apps')
.map((response) => {
return response.json().map((app: any) => new App(app));
}).catch(this.handleError)
.toPromise();
}
handleError(error: Response | any) {
// In a real world app, we might use a remote logging infrastructure
let err: Error;
if (error instanceof Response) {
err = error.json() || {};
} else {
err = new Error('Unknown Error');
}
return Observable.throw(err);
}
save(app: App): Promise<any> {
let options = addJsonOptions();
return this.http.post(`http://localhost:8000/apps/${app.id}`, app, options)
.map((response) => response.json())
.catch(this.handleError)
.toPromise();
}
update(app: App) {
let options = addJsonOptions();
return this.http.patch(`http://localhost:8000/apps/${app.id}`, app, options)
.map((response) => new App(response.json()))
.catch(this.handleError)
.toPromise();
}
remove(app: App) {
return this.http.delete(`http://localhost:8000/apps/${app.id}`)
.map((response) => response.json())
.catch(this.handleError)
.toPromise();
}
find(id: string): Promise<App> {
return this.http.get(`http://localhost:8000/apps/${id}`)
.map((response) => new App(response.json()))
.catch(this.handleError)
.toPromise();
}
}
.example-fab {
position: absolute;
right: 20px;
bottom: 20px;
}
\ No newline at end of file
<md-nav-list>
<h3 md-subheader>所有应用</h3>
<md-list-item *ngFor="let app of apps" [routerLink]="app.id">
<img md-list-avatar [src]="app.icon">
<h3 md-line> {{app.name['zh-CN']}} </h3>
<p md-line>
<span> {{app.id}} </span>
<span> -- {{app.status}} </span>
</p>
</md-list-item>
</md-nav-list>
<button md-fab class="example-fab" (click)="create_app()">
<md-icon>add</md-icon>
</button>
\ No newline at end of file
import {Component, OnInit} from '@angular/core';
import App from '../models/browserapp';
import {AppService} from './app.service';
import {MdDialog, MdSnackBar} from '@angular/material';
import {AppCreateComponent} from './app-create.component';
import {Router} from '@angular/router';
@Component({
selector: 'apps',
moduleId: module.id,
templateUrl: 'apps.component.html',
styleUrls: ['apps.component.css']
})
export class AppsComponent implements OnInit {
apps: App[];
constructor(private appService: AppService, private dialog: MdDialog, private snackBar: MdSnackBar, private router: Router) {
}
async ngOnInit() {
await this.getApps();
}
async getApps() {
this.apps = await this.appService.all();
}
async create_app() {
let dialogRef = this.dialog.open(AppCreateComponent);
let app: App | undefined = await dialogRef.afterClosed().toPromise();
if (!app) {
return;
}
try {
await this.appService.save(app);
await this.router.navigate(['/apps', app.id]);
} catch (error) {
this.snackBar.open(error.toString());
}
}
test(event: any) {
console.log(event);
}
}
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './mycard.module';
platformBrowserDynamic().bootstrapModule(AppModule);
:host {
padding-top: 64px;
}
\ No newline at end of file
<md-toolbar color="primary">
<a md-button routerLink="/">MyCard 开发者控制台</a>
<a md-button routerLink="/apps">应用</a>
<a md-button routerLink="/bundles">捆绑包</a>
</md-toolbar>
<router-outlet></router-outlet>
\ No newline at end of file
/**
* Created by weijian on 2016/12/30.
*/
import {Component} from '@angular/core';
@Component({
moduleId: module.id,
templateUrl: 'mycard.component.html',
styleUrls: ['mycard.component.css'],
selector: 'mycard',
})
export class MyCardComponent {
constructor() {
}
}
import {NgModule} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';
import 'hammerjs';
import {AppsComponent} from './apps.component';
import {MaterialModule, MdIconRegistry} from '@angular/material';
import {MyCardComponent} from './mycard.component';
import {RoutingModule} from './routing.module';
import {FormsModule} from '@angular/forms';
import {AppService} from './app.service';
import {HttpModule} from '@angular/http';
import 'rxjs/add/observable/of';
import 'rxjs/add/observable/throw';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/debounceTime';
import 'rxjs/add/operator/distinctUntilChanged';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/filter';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/switchMap';
import {AppDetailComponent} from './app-detail.component';
import {AppComponent} from './app.component';
import {AppLocalesComponent} from './app-locales.component';
import {AppPackagesComponent} from './app-packages.component';
import {AppCreateComponent} from './app-create.component';
@NgModule({
imports: [
BrowserModule, MaterialModule.forRoot(), FormsModule, RoutingModule, HttpModule,
],
declarations: [AppsComponent, MyCardComponent, AppComponent, AppDetailComponent, AppLocalesComponent, AppPackagesComponent,
AppCreateComponent],
bootstrap: [MyCardComponent],
entryComponents: [AppCreateComponent],
providers: [AppService, MdIconRegistry],
})
export class AppModule {
constructor(mdIconRegistry: MdIconRegistry) {
mdIconRegistry.registerFontClassAlias('fa', 'fontawesome');
mdIconRegistry.registerFontClassAlias('fontawesome', 'fa');
}
}
/**
* Created by weijian on 2016/12/30.
*/
import {NgModule} from '@angular/core';
import {RouterModule, Routes} from '@angular/router';
import {AppsComponent} from './apps.component';
import {AppDetailComponent} from './app-detail.component';
import {AppComponent} from './app.component';
import {AppLocalesComponent} from './app-locales.component';
import {AppPackagesComponent} from './app-packages.component';
const routes: Routes = [
{path: '', redirectTo: '/apps', pathMatch: 'full'},
{path: 'apps', component: AppsComponent},
{
path: 'apps/:id',
component: AppComponent,
children: [
{path: '', redirectTo: 'detail', pathMatch: 'full'},
{path: 'detail', component: AppDetailComponent},
{path: 'locales', component: AppLocalesComponent},
{path: 'packages', component: AppPackagesComponent}
]
}
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class RoutingModule {
}
/*
Copyright 2016 Google Inc. All Rights Reserved.
Use of this source code is governed by an MIT-style license that
can be found in the LICENSE file at http://angular.io/license
*/
<!DOCTYPE html>
<html>
<head>
<title>MyCard 开发者控制台</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<base href="/">
<link rel="stylesheet" href="public/stylesheets/style.css">
<link href="node_modules/@angular/material/core/theming/prebuilt/indigo-pink.css" rel="stylesheet">
<link href="node_modules/material-design-icons/iconfont/material-icons.css" rel="stylesheet">
<link href="node_modules/font-awesome/css/font-awesome.min.css">
<!-- Polyfill(s) for older browsers -->
<script src="node_modules/core-js/client/shim.min.js"></script>
<script src="node_modules/zone.js/dist/zone.js"></script>
<script src="node_modules/reflect-metadata/Reflect.js"></script>
<script src="node_modules/systemjs/dist/system.src.js"></script>
<script src="systemjs.config.js"></script>
<script>
System.import('app').catch(function (err) {
console.error(err);
});
</script>
</head>
<body>
<mycard>Loading ...</mycard>
</body>
</html>
......@@ -4,38 +4,27 @@
"private": true,
"scripts": {
"prestart": "tsc",
"start": "concurrently \"node server.js\" \"lite-server\"",
"start": "node server.js",
"server": "node server.js",
"tsc": "tsc",
"lint": "tslint -e ./node_modules/** ./**/*.ts -t verbose",
"migrate": "tsc && mongo-migrate --runMongoMigrate --config mongodb_config.json --dbPropName dbSettings"
},
"dependencies": {
"@angular/common": "~2.4.0",
"@angular/compiler": "~2.4.0",
"@angular/core": "~2.4.0",
"@angular/forms": "~2.4.0",
"@angular/http": "~2.4.0",
"@angular/material": "^2.0.0-beta.1",
"@angular/platform-browser": "~2.4.0",
"@angular/platform-browser-dynamic": "~2.4.0",
"@angular/router": "~3.4.0",
"clone": "^2.1.0",
"core-js": "^2.4.1",
"font-awesome": "^4.7.0",
"hammerjs": "^2.0.8",
"is-zip": "^1.0.0",
"koa": "^2.0.0",
"koa-bodyparser": "^3.2.0",
"koa-log4": "^2.1.0",
"koa-router": "^7.0.1",
"material-design-icons": "^3.0.1",
"mongodb": "^2.2.16",
"mongodb-migrate": "^2.0.1",
"mongorito": "^2.2.0",
"react": "^15.4.2",
"react-intl": "^2.2.3",
"reflect-metadata": "^0.1.9",
"rxjs": "5.0.1",
"systemjs": "0.19.40",
"tmp": "0.0.31",
"zone.js": "^0.7.4"
},
......
body {
margin: 0;
}
\ No newline at end of file
......@@ -21,6 +21,7 @@ router.get('/apps/:id', async(ctx, next) => {
});
router.post('/apps/:id', async(ctx, next) => {
console.log(ctx.request.body)
if (!ctx.request.body.id || ctx.params.id !== ctx.request.body.id) {
throw new ModelInvalidError('App id not same');
}
......
......@@ -61,7 +61,9 @@ app.use(users.routes());
app.use(apps.routes());
app.use(packages.routes());
Mongorito.connect(url).then(() => {
app.listen(8000);
app.listen(8001, () => {
console.log("app listening port 8001")
});
});
// function getKoaLogger (logger4js, options) {
......
/**
* Created by weijian on 2016/12/30.
*/
/**
* System configuration for Angular samples
* Adjust as necessary for your application needs.
*/
(function (global) {
System.config({
paths: {
// paths serve as alias
'npm:': 'node_modules/'
},
// map tells the System loader where to look for things
map: {
// our app is within the app folder
app: 'app',
// angular bundles
'@angular/core': 'npm:@angular/core/bundles/core.umd.js',
'@angular/common': 'npm:@angular/common/bundles/common.umd.js',
'@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
'@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
'@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
'@angular/http': 'npm:@angular/http/bundles/http.umd.min.js',
'@angular/router': 'npm:@angular/router/bundles/router.umd.js',
'@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',
'@angular/material': 'npm:@angular/material/bundles/material.umd.js',
'hammerjs': 'npm:hammerjs/hammer.min.js',
// other libraries
'rxjs': 'npm:rxjs',
},
// packages tells the System loader how to load when no filename and/or no extension
packages: {
app: {
main: './main.js',
defaultExtension: 'js'
},
rxjs: {
defaultExtension: 'js'
},
models: {
defaultExtension: 'js'
},
db: {
defaultExtension: 'js'
}
}
});
})(this);
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment