diff --git a/api/models/Module.js b/api/models/Module.js
index 859c689..13c4a22 100644
--- a/api/models/Module.js
+++ b/api/models/Module.js
@@ -1,20 +1,20 @@
/**
-Copyright 2016, Cloud Compass Computing, Inc.
+ Copyright 2016, Cloud Compass Computing, Inc.
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
-*/
+ */
/**
* Module.js
*
@@ -47,12 +47,12 @@ module.exports = {
},
//todo icon is a client-side concern and should be refactored.
- getIcon: function() {
+ getIcon: function () {
console.log("Looking up icon for", this);
//face
var iconMap = {
'repo': 'archive',
- 'issues':'bug report' ,
+ 'issues': 'bug report',
'wiki': 'description'
};
@@ -60,7 +60,7 @@ module.exports = {
},
// Override the default toJSON method so the derived icon is included
- toJSON: function() {
+ toJSON: function () {
var obj = this.toObject();
obj.icon = this.getIcon();
return obj;
@@ -68,19 +68,30 @@ module.exports = {
},
beforeCreate: function (module, next) {
- var admin = module.config.permissions.admin;
- module.config = _.pick(module.config, ['full_name']);
- sails.log.info('Project.beforeCreate.createWebhook', module);
+
var serviceId = _.has(module.service, 'id') ? module.service.id : module.service;
+
Service.findOne({id: serviceId})
.exec(function (err, service) {
if (service.platform == 'github') {
- if (admin) {
- GithubService.createWebhook(module, next);
- } else {
- next();
- }
+ var moduleConfig = _.isArray(module.config) ? module.config : module.config != undefined && module.config != null ? [module.config] : [];
+
+ _.each(moduleConfig, function (config) {
+ var admin = config.permissions.admin;
+
+ sails.log.info('Project.beforeCreate.createWebhook', config);
+
+ //todo this is probably broken if the module has some repos with admin and some with not. prob will end up with webhook for some, but missing for others, depending on ordering.
+ if (admin) {
+ GithubService.createWebhook(config, function () {
+ sails.log.debug("created webhook");
+ });
+ }
+ });
+ // fallthrough and/or default
+ next();
}
+
});
},
diff --git a/api/services/GithubService.js b/api/services/GithubService.js
index f542a91..3fdcc4c 100644
--- a/api/services/GithubService.js
+++ b/api/services/GithubService.js
@@ -127,6 +127,15 @@ module.exports = {
var issues = [];
var client = github.client();
+ var getDataPage = function (client, nextPage, pager) {
+ sails.log.debug("Retrieving repo page ", nextPage);
+ var ghme = client.me();
+ ghme.repos({
+ page: nextPage,
+ per_page: 100
+ }, pager);
+ };
+
var pager = function (err, data, headers) {
// TODO: If the github access token is revoked, this crashes due to a undefined header (I believe)
// Info is captured through err as "invalid credentials", handle this appropriately
@@ -144,7 +153,12 @@ module.exports = {
// Parse the next page from the link header and retrieve the next repo page
// Format is like: https://api.github.com/user/repos?page=50&per_page=100
var nextPageNumber = querystring.parse(url.parse(linkHeaders.next).query).page;
+ getDataPage(client, nextPageNumber, pager)
+ } else {
+ sails.log.debug("Returning repos to caller...");
+ cb(err, issues, headers);
getRepoPage(client, nextPageNumber, pager)
+
}
}
@@ -152,20 +166,28 @@ module.exports = {
cb(err, issues, headers);
};
- function getRepoPage(client, page, pager) {
- sails.log.debug("Retrieving repo page ", page);
- var ghme = client.me();
- ghme.repos({
- page: page,
- per_page: 100
- }, pager);
- }
+ //attempt at currying
+ var aggregate = function(howMany, cb) {
+ var callCount = 0;
+ var issues = [];
+ return function (err, data, headers) {
+ callCount++;
+ if (!err) {
+ if (data) {
+ issues = issues.concat(data);
+ }
+ }
+ if (callCount == howMany) {
+ cb(err,issues, headers);
+ }
+ }
+ };
Service.findOne({id: serviceID})
.exec(function (err, service) {
if (service) {
client = github.client(service.token);
- getRepoPage(client, 1, pager);
+ getDataPage(client, 1, pager);
} else {
sails.log.error('could not retrieve repos', err);
}
@@ -180,10 +202,39 @@ module.exports = {
// sails.log.debug('finding first module:', widget.modules[0].id);
Module.findOne({id: widget.module.id}).populate('service')
.exec(function (err, module) {
+ //todo handle multi-repo modules, and implement paging
if (module) {
+
+ //coerce config into array for preliminary support of multi-repo modules
+ var moduleConfig = _.isArray(module.config) ? module.config : module.config != undefined && module.config != null ? [module.config] : [];
+
var client = github.client(module.service.token);
- var ghrepo = client.repo(module.config.full_name);
- ghrepo.commits(cb);
+
+ var commits = [];
+
+ //eww
+ var callCount = 0;
+
+ var aggregate = function (err, data, headers) {
+ callCount++;
+ if (!err) {
+ if (data) {
+ commits = commits.concat(data);
+ }
+ }
+ if (callCount == moduleConfig.length) {
+ cb(err,commits, headers);
+ }
+ };
+
+ //initial multi-repo module support
+ _.each(moduleConfig, function (config) {
+ var ghrepo = client.repo(config.full_name);
+ //todo implement paging using same pattern as with getRepos or mapreduce, or determine a new promise style
+ // currently, this is just getting the first page for each repo
+ ghrepo.commits(aggregate);
+ }
+ );
} else {
sails.log.error('could not retrieve module', err);
}
@@ -203,9 +254,37 @@ module.exports = {
Module.findOne({id: widget.module.id}).populate('service')
.exec(function (err, module) {
if (module) {
+
+ //coerce config into array for preliminary support of multi-repo modules
+ var moduleConfig = _.isArray(module.config) ? module.config : module.config != undefined && module.config != null ? [module.config] : [];
+
var client = github.client(module.service.token);
- var ghrepo = client.repo(module.config.full_name);
- ghrepo.issues(cb);
+
+ var issues = [];
+
+ //eww
+ var callCount = 0;
+
+ var aggregate = function (err, data, headers) {
+ callCount++;
+ if (!err) {
+ if (data) {
+ issues = issues.concat(data);
+ }
+ }
+ if (callCount == moduleConfig.length) {
+ cb(err,issues, headers);
+ }
+ };
+
+ //initial multi-repo module support
+ _.each(moduleConfig, function (config) {
+ var ghrepo = client.repo(config.full_name);
+ //todo implement paging using same pattern as with getRepos or mapreduce, or determine a new promise style
+ // currently, this is just getting the first page for each repo
+ ghrepo.issues(aggregate);
+ }
+ );
} else {
sails.log.error('could not retrieve module', err);
}
diff --git a/assets/app/controllers/ModuleAddController.js b/assets/app/controllers/ModuleAddController.js
index 5279e8f..7c93087 100644
--- a/assets/app/controllers/ModuleAddController.js
+++ b/assets/app/controllers/ModuleAddController.js
@@ -128,8 +128,15 @@ function ModuleAddController($scope, $state, $stateParams, ToolService, ProjectS
// data = object to pull properties from
// properties = optional array of property names to extract (default: *)
function configureModule(data) {
- vm.module.config = data;
- console.log(vm.module);
+ if (!vm.module.config || vm.module.config == undefined || vm.module.config == null) {
+ vm.module.config = [];
+
+ }
+
+ console.log("adding ", data, vm.module);
+ vm.module.config = vm.module.config.concat(data);
+
+ console.log("...to module ", vm.module);
}
function addModule(newModule) {
diff --git a/assets/app/controllers/ToolController.js b/assets/app/controllers/ToolController.js
index dd18df9..aac7b13 100644
--- a/assets/app/controllers/ToolController.js
+++ b/assets/app/controllers/ToolController.js
@@ -84,6 +84,7 @@ function ToolController($scope, ToolService, ProjectService) {
// data = object to pull properties from
// properties = optional array of property names to extract (default: *)
function configureModule(data, properties) {
+ console.log("configModule:",data,properties);
if (typeof properties == 'undefined') {
vm.currentModule.config = data;
} else {
diff --git a/assets/app/views/module-add.html b/assets/app/views/module-add.html
index 80ef03d..9da1430 100644
--- a/assets/app/views/module-add.html
+++ b/assets/app/views/module-add.html
@@ -113,6 +113,14 @@
Configuration :
You do not have administrator rights to this repository. This module will not post to the activity feed.
+
+
+
+ {{repo.full_name}}
+
+
+
+
diff --git a/assets/app/views/widget/commits.html b/assets/app/views/widget/commits.html
index 35bed47..ebff44e 100644
--- a/assets/app/views/widget/commits.html
+++ b/assets/app/views/widget/commits.html
@@ -45,6 +45,9 @@
+
+ Commit {{commit.sha | limitTo : 8}}
+ By:
{{commit.author ? commit.author.login : commit.commit.committer.name}}
diff --git a/config/connections.js b/config/connections.js
index 4db6da1..da00881 100644
--- a/config/connections.js
+++ b/config/connections.js
@@ -46,11 +46,15 @@ module.exports.connections = {
* *
***************************************************************************/
localDiskDb: {
- adapter: 'sails-disk'
- },
+ adapter: 'sails-disk'},
stackbuttonMongo: {
- adapter: 'sails-mongo'
+ adapter: 'sails-mongo',
+ host: process.env.MONGODB_SERVICE_HOST || 'localhost',
+ port: process.env.MONGODB_SERVICE_PORT || 27017 ,
+ user: process.env.MONGODB_USER || '',
+ password: process.env.MONGODB_PASSWORD || '',
+ database: process.env.MONGODB_DATABASE || 'stackbutton'
}
/***************************************************************************
diff --git a/config/env/production.js b/config/env/production.js
index fd3e4ca..f387538 100644
--- a/config/env/production.js
+++ b/config/env/production.js
@@ -1,20 +1,20 @@
/**
-Copyright 2016, Cloud Compass Computing, Inc.
+ Copyright 2016, Cloud Compass Computing, Inc.
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
-*/
+ */
/**
* Production environment settings
*
@@ -33,15 +33,21 @@ module.exports = {
models: {
migrate: 'safe'
- }
+ },
/***************************************************************************
* Set the default database connection for models in the production *
* environment (see config/connections.js and config/models.js ) *
***************************************************************************/
- // models: {
- // connection: 'someMysqlServer'
- // },
+ models: {
+ connection: 'stackbuttonMongo'
+ },
+
+ url: {
+ hooks: process.env.WEBHOOK_URL
+ }
+
+
/***************************************************************************
* Set the port in the production environment to 80 *
diff --git a/ng2/.angular-cli.json b/ng2/.angular-cli.json
new file mode 100644
index 0000000..acb341e
--- /dev/null
+++ b/ng2/.angular-cli.json
@@ -0,0 +1,78 @@
+{
+ "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+ "project": {
+ "name": "ng2"
+ },
+ "apps": [
+ {
+ "root": "src",
+ "outDir": "dist",
+ "assets": [
+ "assets",
+ "favicon.ico"
+ ],
+ "index": "index.html",
+ "main": "main.ts",
+ "polyfills": "polyfills.ts",
+ "test": "test.ts",
+ "tsconfig": "tsconfig.app.json",
+ "testTsconfig": "tsconfig.spec.json",
+ "prefix": "app",
+ "styles": [
+ "../node_modules/patternfly/dist/css/patternfly.min.css",
+ "../node_modules/patternfly/dist/css/patternfly-additions.min.css",
+ "styles.css"
+ ],
+ "scripts": [
+ "../node_modules/patternfly/node_modules/jquery/dist/jquery.min.js",
+ "../node_modules/patternfly/node_modules/bootstrap/dist/js/bootstrap.min.js",
+ "../node_modules/patternfly/node_modules/c3/c3.min.js",
+ "../node_modules/patternfly/node_modules/d3/d3.min.js",
+ "../node_modules/patternfly/node_modules/datatables/media/js/jquery.dataTables.min.js",
+ "../node_modules/patternfly/node_modules/drmonty-datatables-colvis/js/dataTables.colVis.js",
+ "../node_modules/patternfly/node_modules/datatables.net-colreorder/js/dataTables.colReorder.js",
+ "../node_modules/patternfly/dist/js/patternfly.min.js",
+ "../node_modules/patternfly/node_modules/patternfly-bootstrap-combobox/js/bootstrap-combobox.js",
+ "../node_modules/patternfly/node_modules/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js",
+ "../node_modules/patternfly/node_modules/moment/min/moment.min.js",
+ "../node_modules/patternfly/node_modules/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min.js",
+ "../node_modules/patternfly/node_modules/bootstrap-select/dist/js/bootstrap-select.min.js",
+ "../node_modules/patternfly/node_modules/bootstrap-switch/dist/js/bootstrap-switch.min.js",
+ "../node_modules/patternfly/node_modules/bootstrap-touchspin/dist/jquery.bootstrap-touchspin.min.js",
+ "../node_modules/patternfly/node_modules/patternfly-bootstrap-treeview/dist/bootstrap-treeview.min.js",
+ "../node_modules/patternfly/node_modules/google-code-prettify/bin/prettify.min.js",
+ "../node_modules/patternfly/node_modules/jquery-match-height/jquery.matchHeight-min.js"
+ ],
+ "environmentSource": "environments/environment.ts",
+ "environments": {
+ "dev": "environments/environment.ts",
+ "prod": "environments/environment.prod.ts"
+ }
+ }
+ ],
+ "e2e": {
+ "protractor": {
+ "config": "./protractor.conf.js"
+ }
+ },
+ "lint": [
+ {
+ "project": "src/tsconfig.app.json"
+ },
+ {
+ "project": "src/tsconfig.spec.json"
+ },
+ {
+ "project": "e2e/tsconfig.e2e.json"
+ }
+ ],
+ "test": {
+ "karma": {
+ "config": "./karma.conf.js"
+ }
+ },
+ "defaults": {
+ "styleExt": "css",
+ "component": {}
+ }
+}
diff --git a/ng2/.editorconfig b/ng2/.editorconfig
new file mode 100644
index 0000000..6e87a00
--- /dev/null
+++ b/ng2/.editorconfig
@@ -0,0 +1,13 @@
+# Editor configuration, see http://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+max_line_length = off
+trim_trailing_whitespace = false
diff --git a/ng2/.gitignore b/ng2/.gitignore
new file mode 100644
index 0000000..54bfd20
--- /dev/null
+++ b/ng2/.gitignore
@@ -0,0 +1,42 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+
+# compiled output
+/dist
+/tmp
+/out-tsc
+
+# dependencies
+/node_modules
+
+# IDEs and editors
+/.idea
+.project
+.classpath
+.c9/
+*.launch
+.settings/
+*.sublime-workspace
+
+# IDE - VSCode
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+
+# 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/ng2/README.md b/ng2/README.md
new file mode 100644
index 0000000..e30bd07
--- /dev/null
+++ b/ng2/README.md
@@ -0,0 +1,28 @@
+# Ng2
+
+This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.0.0.
+
+## Development server
+
+Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
+
+## Code scaffolding
+
+Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive/pipe/service/class/module`.
+
+## Build
+
+Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build.
+
+## Running unit tests
+
+Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
+
+## Running end-to-end tests
+
+Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/).
+Before running the tests make sure you are serving the app via `ng serve`.
+
+## Further help
+
+To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).
diff --git a/ng2/e2e/app.e2e-spec.ts b/ng2/e2e/app.e2e-spec.ts
new file mode 100644
index 0000000..631978d
--- /dev/null
+++ b/ng2/e2e/app.e2e-spec.ts
@@ -0,0 +1,14 @@
+import { Ng2Page } from './app.po';
+
+describe('ng2 App', () => {
+ let page: Ng2Page;
+
+ beforeEach(() => {
+ page = new Ng2Page();
+ });
+
+ it('should display message saying app works', () => {
+ page.navigateTo();
+ expect(page.getParagraphText()).toEqual('app works!');
+ });
+});
diff --git a/ng2/e2e/app.po.ts b/ng2/e2e/app.po.ts
new file mode 100644
index 0000000..6da4195
--- /dev/null
+++ b/ng2/e2e/app.po.ts
@@ -0,0 +1,11 @@
+import { browser, element, by } from 'protractor';
+
+export class Ng2Page {
+ navigateTo() {
+ return browser.get('/');
+ }
+
+ getParagraphText() {
+ return element(by.css('app-root h1')).getText();
+ }
+}
diff --git a/ng2/e2e/tsconfig.e2e.json b/ng2/e2e/tsconfig.e2e.json
new file mode 100644
index 0000000..ac7a373
--- /dev/null
+++ b/ng2/e2e/tsconfig.e2e.json
@@ -0,0 +1,12 @@
+{
+ "extends": "../tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../out-tsc/e2e",
+ "module": "commonjs",
+ "target": "es5",
+ "types":[
+ "jasmine",
+ "node"
+ ]
+ }
+}
diff --git a/ng2/karma.conf.js b/ng2/karma.conf.js
new file mode 100644
index 0000000..84b4cd5
--- /dev/null
+++ b/ng2/karma.conf.js
@@ -0,0 +1,44 @@
+// Karma configuration file, see link for more information
+// https://karma-runner.github.io/0.13/config/configuration-file.html
+
+module.exports = function (config) {
+ config.set({
+ basePath: '',
+ frameworks: ['jasmine', '@angular/cli'],
+ plugins: [
+ require('karma-jasmine'),
+ require('karma-chrome-launcher'),
+ require('karma-jasmine-html-reporter'),
+ require('karma-coverage-istanbul-reporter'),
+ require('@angular/cli/plugins/karma')
+ ],
+ client:{
+ clearContext: false // leave Jasmine Spec Runner output visible in browser
+ },
+ files: [
+ { pattern: './src/test.ts', watched: false }
+ ],
+ preprocessors: {
+ './src/test.ts': ['@angular/cli']
+ },
+ mime: {
+ 'text/x-typescript': ['ts','tsx']
+ },
+ coverageIstanbulReporter: {
+ reports: [ 'html', 'lcovonly' ],
+ fixWebpackSourcePaths: true
+ },
+ angularCli: {
+ environment: 'dev'
+ },
+ reporters: config.angularCli && config.angularCli.codeCoverage
+ ? ['progress', 'coverage-istanbul']
+ : ['progress', 'kjhtml'],
+ port: 9876,
+ colors: true,
+ logLevel: config.LOG_INFO,
+ autoWatch: true,
+ browsers: ['Chrome'],
+ singleRun: false
+ });
+};
diff --git a/ng2/package.json b/ng2/package.json
new file mode 100644
index 0000000..d49ca10
--- /dev/null
+++ b/ng2/package.json
@@ -0,0 +1,47 @@
+{
+ "name": "ng2",
+ "version": "0.0.0",
+ "license": "MIT",
+ "scripts": {
+ "ng": "ng",
+ "start": "ng serve",
+ "build": "ng build",
+ "test": "ng test",
+ "lint": "ng lint",
+ "e2e": "ng e2e"
+ },
+ "private": true,
+ "dependencies": {
+ "@angular/common": "^4.0.0",
+ "@angular/compiler": "^4.0.0",
+ "@angular/core": "^4.0.0",
+ "@angular/forms": "^4.0.0",
+ "@angular/http": "^4.0.0",
+ "@angular/platform-browser": "^4.0.0",
+ "@angular/platform-browser-dynamic": "^4.0.0",
+ "@angular/router": "^4.0.0",
+ "core-js": "^2.4.1",
+ "patternfly": "^3.23.2",
+ "rxjs": "^5.1.0",
+ "zone.js": "^0.8.4"
+ },
+ "devDependencies": {
+ "@angular/cli": "1.0.0",
+ "@angular/compiler-cli": "^4.0.0",
+ "@types/jasmine": "2.5.38",
+ "@types/node": "~6.0.60",
+ "codelyzer": "~2.0.0",
+ "jasmine-core": "~2.5.2",
+ "jasmine-spec-reporter": "~3.2.0",
+ "karma": "~1.4.1",
+ "karma-chrome-launcher": "~2.0.0",
+ "karma-cli": "~1.0.1",
+ "karma-jasmine": "~1.1.0",
+ "karma-jasmine-html-reporter": "^0.2.2",
+ "karma-coverage-istanbul-reporter": "^0.2.0",
+ "protractor": "~5.1.0",
+ "ts-node": "~2.0.0",
+ "tslint": "~4.5.0",
+ "typescript": "~2.2.0"
+ }
+}
diff --git a/ng2/protractor.conf.js b/ng2/protractor.conf.js
new file mode 100644
index 0000000..1c5e1e5
--- /dev/null
+++ b/ng2/protractor.conf.js
@@ -0,0 +1,30 @@
+// Protractor configuration file, see link for more information
+// https://github.com/angular/protractor/blob/master/lib/config.ts
+
+const { SpecReporter } = require('jasmine-spec-reporter');
+
+exports.config = {
+ allScriptsTimeout: 11000,
+ specs: [
+ './e2e/**/*.e2e-spec.ts'
+ ],
+ capabilities: {
+ 'browserName': 'chrome'
+ },
+ directConnect: true,
+ baseUrl: 'http://localhost:4200/',
+ framework: 'jasmine',
+ jasmineNodeOpts: {
+ showColors: true,
+ defaultTimeoutInterval: 30000,
+ print: function() {}
+ },
+ beforeLaunch: function() {
+ require('ts-node').register({
+ project: 'e2e/tsconfig.e2e.json'
+ });
+ },
+ onPrepare() {
+ jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
+ }
+};
diff --git a/ng2/src/app/app.component.css b/ng2/src/app/app.component.css
new file mode 100644
index 0000000..e69de29
diff --git a/ng2/src/app/app.component.html b/ng2/src/app/app.component.html
new file mode 100644
index 0000000..40e1706
--- /dev/null
+++ b/ng2/src/app/app.component.html
@@ -0,0 +1,801 @@
+