Commit 7783b271 authored by Konstantin Schulz's avatar Konstantin Schulz

added GitLab CI configuration

parent 1a9692da
Pipeline #10740 failed with stage
in 1 minute and 26 seconds
#before_script: before_script:
# - which node - which node
# - node --version - node --version
# - which npm - which npm
# - npm --version - npm --version
# - npm install - npm install
# - which coverage stages:
#stages: - test
# - test - deploy
# - deploy coverage:
#coverage: stage: test
# stage: test script:
# script: - npm run test
# - coverage run --rcfile=.coveragerc tests.py coverage: '/Statements.*?(\d+(?:\.\d+)?)%/'
# - coverage combine tags:
# - coverage report -m - node
# coverage: '/^TOTAL.+?(\d+\%)$/' - npm
# tags: - angular
# - python
# - pip
# - flask
[![pipeline status](https://scm.cms.hu-berlin.de/callidus/mc_frontend/badges/master/pipeline.svg)](https://scm.cms.hu-berlin.de/callidus/mc_frontend/-/commits/master) [![pipeline status](https://scm.cms.hu-berlin.de/callidus/mc_frontend/badges/master/pipeline.svg)](https://scm.cms.hu-berlin.de/callidus/mc_frontend/-/commits/master)
[![coverage report](https://scm.cms.hu-berlin.de/callidus/mc_frontend/badges/master/coverage.svg)](https://scm.cms.hu-berlin.de/callidus/mc_frontend/-/commits/master) [![coverage report](https://scm.cms.hu-berlin.de/callidus/mc_frontend/badges/master/coverage.svg)](https://scm.cms.hu-berlin.de/callidus/mc_frontend/-/commits/master)
# Installation # Installation
## via Docker: ## via Docker:
1. Install Docker (https://docs.docker.com/v17.12/install/) and Docker-Compose (https://docs.docker.com/compose/install/) 1. Install Docker (https://docs.docker.com/v17.12/install/) and Docker-Compose (https://docs.docker.com/compose/install/)
...@@ -11,7 +10,6 @@ ...@@ -11,7 +10,6 @@
4. Make sure to assign at least 4GB RAM (Memory) to the Docker engine, otherwise the build will fail. 4. Make sure to assign at least 4GB RAM (Memory) to the Docker engine, otherwise the build will fail.
5. Run `docker-compose build`. 5. Run `docker-compose build`.
6. Run `docker-compose up -d` and enjoy! 6. Run `docker-compose up -d` and enjoy!
## via Command Line: ## via Command Line:
1. Clone the repo: `git clone https://scm.cms.hu-berlin.de/callidus/mc_frontend.git` 1. Clone the repo: `git clone https://scm.cms.hu-berlin.de/callidus/mc_frontend.git`
2. Move to the newly created folder: `cd mc_frontend` 2. Move to the newly created folder: `cd mc_frontend`
...@@ -21,21 +19,14 @@ ...@@ -21,21 +19,14 @@
6. Run `npm start`. 6. Run `npm start`.
If you already ran `npm install` and the CLI still complains about missing dependencies, install them one by one using `npm install DEPENDENCY_NAME`. If you already ran `npm install` and the CLI still complains about missing dependencies, install them one by one using `npm install DEPENDENCY_NAME`.
7. Open http://localhost:8100 in your browser. 7. Open http://localhost:8100 in your browser.
----------------------------------------------------------------
## Production Build ## Production Build
To build the application for production environments, use: `ionic cordova build browser --prod --release --max-old-space-size=4096` and serve the content of the `platforms/browser/www` folder, e.g. with Nginx. To build the application for production environments, use: `ionic cordova build browser --prod --release --max-old-space-size=4096` and serve the content of the `platforms/browser/www` folder, e.g. with Nginx.
----------------------------------------------------------------
# Development # Development
To add new pages to the application, use: `ionic generate page PAGE_NAME`. To add new pages to the application, use: `ionic generate page PAGE_NAME`.
----------------------------------------------------------------
# Access to the Docker container # Access to the Docker container
Use `docker-compose down` to stop and remove the currently running containers. Use `docker-compose down` to stop and remove the currently running containers.
To access a running container directly, get the container ID via `docker ps` and connect via `docker exec -it CONTAINER_ID bash`. Or, for root access, use: `docker exec -u 0 -it CONTAINER_ID bash` To access a running container directly, get the container ID via `docker ps` and connect via `docker exec -it CONTAINER_ID bash`. Or, for root access, use: `docker exec -u 0 -it CONTAINER_ID bash`
To snapshot a running container, use `docker commit CONTAINER_ID`. It returns a snapshot ID, which you can access via `docker run -it SNAPSHOT_ID`. To snapshot a running container, use `docker commit CONTAINER_ID`. It returns a snapshot ID, which you can access via `docker run -it SNAPSHOT_ID`.
----------------------------------------------------------------
# Configuration # Configuration
## Backend URL ## Backend URL
To change the URL for the backend, use the `ionic.config.json` file (proxies > proxyUrl). By default, the system assumes that backend and frontend are installed on the same machine. To change the URL for the backend, use the `ionic.config.json` file (proxies > proxyUrl). By default, the system assumes that backend and frontend are installed on the same machine.
...@@ -43,7 +34,6 @@ To change the URL for the backend, use the `ionic.config.json` file (proxies > p ...@@ -43,7 +34,6 @@ To change the URL for the backend, use the `ionic.config.json` file (proxies > p
Use the `--host 0.0.0.0 --disable-host-check` flag for `ng serve` if you want to use it in a production environment with an Nginx server using proxy_pass. Use the `--host 0.0.0.0 --disable-host-check` flag for `ng serve` if you want to use it in a production environment with an Nginx server using proxy_pass.
## Other ## Other
For all other kinds of configuration, use `src/configMC.ts`. For all other kinds of configuration, use `src/configMC.ts`.
----------------------------------------------------------------
# Testing # Testing
To test the application and check the code coverage, run `npm run test`. To test the application and check the code coverage, run `npm run test`.
To write new tests or debug existing ones, use `npm run test-debug`.
This diff is collapsed.
{ {
"name": "mc_frontend", "name": "mc_frontend",
"version": "1.5.6", "version": "1.5.7",
"author": "Ionic Framework", "author": "Ionic Framework",
"homepage": "https://ionicframework.com/", "homepage": "https://ionicframework.com/",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
"start": "ng serve --port 8100", "start": "ng serve --port 8100",
"build": "ng build", "build": "ng build",
"test": "ng test --code-coverage --watch=false", "test": "ng test --code-coverage --watch=false --browsers=ChromeHeadless",
"test-debug": "ng test --watch=true --browsers=Chrome",
"lint": "ng lint", "lint": "ng lint",
"e2e": "ng e2e" "e2e": "ng e2e"
}, },
...@@ -24,7 +25,7 @@ ...@@ -24,7 +25,7 @@
"@ionic-native/splash-screen": "^5.21.6", "@ionic-native/splash-screen": "^5.21.6",
"@ionic-native/status-bar": "^5.21.6", "@ionic-native/status-bar": "^5.21.6",
"@ionic/angular": "^5.0.4", "@ionic/angular": "^5.0.4",
"@ionic/core": "^4.11.10", "@ionic/core": "^5.0.4",
"@ionic/storage": "^2.2.0", "@ionic/storage": "^2.2.0",
"@ngtools/webpack": "^9.0.4", "@ngtools/webpack": "^9.0.4",
"@ngx-translate/core": "^11.0.1", "@ngx-translate/core": "^11.0.1",
...@@ -43,15 +44,15 @@ ...@@ -43,15 +44,15 @@
"zone.js": "^0.10.2" "zone.js": "^0.10.2"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/architect": "~0.13.8", "@angular-devkit/architect": "^0.900.4",
"@angular-devkit/build-angular": "^0.900.4", "@angular-devkit/build-angular": "^0.900.4",
"@angular-devkit/core": "~7.3.8", "@angular-devkit/core": "^9.0.4",
"@angular-devkit/schematics": "~7.3.8", "@angular-devkit/schematics": "^9.0.4",
"@angular/cli": "^9.0.4", "@angular/cli": "^9.0.4",
"@angular/compiler": "^9.0.4", "@angular/compiler": "^9.0.4",
"@angular/compiler-cli": "^9.0.4", "@angular/compiler-cli": "^9.0.4",
"@angular/language-service": "^7.2.16", "@angular/language-service": "^7.2.16",
"@ionic/angular-toolkit": "~1.5.1", "@ionic/angular-toolkit": "^2.2.0",
"@types/jasmine": "~2.8.8", "@types/jasmine": "~2.8.8",
"@types/jasminewd2": "^2.0.8", "@types/jasminewd2": "^2.0.8",
"@types/node": "^12.0.12", "@types/node": "^12.0.12",
...@@ -59,7 +60,7 @@ ...@@ -59,7 +60,7 @@
"jasmine-core": "~2.99.1", "jasmine-core": "~2.99.1",
"jasmine-spec-reporter": "~4.2.1", "jasmine-spec-reporter": "~4.2.1",
"karma": "~4.1.0", "karma": "~4.1.0",
"karma-chrome-launcher": "~2.2.0", "karma-chrome-launcher": "^3.1.0",
"karma-coverage-istanbul-reporter": "^2.0.6", "karma-coverage-istanbul-reporter": "^2.0.6",
"karma-jasmine": "~1.1.2", "karma-jasmine": "~1.1.2",
"karma-jasmine-html-reporter": "^0.2.2", "karma-jasmine-html-reporter": "^0.2.2",
......
...@@ -12,6 +12,8 @@ import {AppRoutingModule} from './app-routing.module'; ...@@ -12,6 +12,8 @@ import {AppRoutingModule} from './app-routing.module';
import {TranslateTestingModule} from './translate-testing/translate-testing.module'; import {TranslateTestingModule} from './translate-testing/translate-testing.module';
import {APP_BASE_HREF} from '@angular/common'; import {APP_BASE_HREF} from '@angular/common';
import {Subscription} from 'rxjs'; import {Subscription} from 'rxjs';
import {HelperService} from './helper.service';
import MockMC from './models/mock';
describe('AppComponent', () => { describe('AppComponent', () => {
class PlatformStub { class PlatformStub {
...@@ -28,12 +30,11 @@ describe('AppComponent', () => { ...@@ -28,12 +30,11 @@ describe('AppComponent', () => {
} }
} }
let statusBarSpy, splashScreenSpy, platformReadySpy; let statusBarSpy, splashScreenSpy, platformReadySpy, fixture;
beforeEach(async(() => { beforeEach(async(() => {
platformReadySpy = Promise.resolve(); platformReadySpy = Promise.resolve();
statusBarSpy = jasmine.createSpyObj('StatusBar', ['styleDefault']); statusBarSpy = jasmine.createSpyObj('StatusBar', ['styleDefault']);
splashScreenSpy = jasmine.createSpyObj('SplashScreen', ['hide']); splashScreenSpy = jasmine.createSpyObj('SplashScreen', ['hide']);
TestBed.configureTestingModule({ TestBed.configureTestingModule({
declarations: [AppComponent], declarations: [AppComponent],
imports: [ imports: [
...@@ -51,16 +52,16 @@ describe('AppComponent', () => { ...@@ -51,16 +52,16 @@ describe('AppComponent', () => {
{provide: MenuController} {provide: MenuController}
], ],
}).compileComponents(); }).compileComponents();
spyOn(HelperService, 'makeGetRequest').and.returnValue(Promise.resolve(MockMC.apiResponseCorporaGet));
fixture = TestBed.createComponent(AppComponent);
})); }));
it('should create the app', () => { it('should create the app', () => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.debugElement.componentInstance; const app = fixture.debugElement.componentInstance;
expect(app).toBeTruthy(); expect(app).toBeTruthy();
}); });
it('should initialize the app', async () => { it('should initialize the app', async () => {
TestBed.createComponent(AppComponent);
const platformStub: PlatformStub = TestBed.get(Platform); const platformStub: PlatformStub = TestBed.get(Platform);
expect(platformStub.wasReadyCalled).toBeTruthy(); expect(platformStub.wasReadyCalled).toBeTruthy();
await platformReadySpy; await platformReadySpy;
......
...@@ -5,6 +5,7 @@ import {SplashScreen} from '@ionic-native/splash-screen/ngx'; ...@@ -5,6 +5,7 @@ import {SplashScreen} from '@ionic-native/splash-screen/ngx';
import {TranslateService} from '@ngx-translate/core'; import {TranslateService} from '@ngx-translate/core';
import {HelperService} from 'src/app/helper.service'; import {HelperService} from 'src/app/helper.service';
import configMC from '../configMC'; import configMC from '../configMC';
import {CorpusService} from './corpus.service';
@Component({ @Component({
selector: 'app-root', selector: 'app-root',
...@@ -21,9 +22,11 @@ export class AppComponent { ...@@ -21,9 +22,11 @@ export class AppComponent {
private splashScreen: SplashScreen, private splashScreen: SplashScreen,
public helperService: HelperService, public helperService: HelperService,
public navCtrl: NavController, public navCtrl: NavController,
public menuCtrl: MenuController public menuCtrl: MenuController,
public corpusService: CorpusService,
) { ) {
platform.ready().then(() => { platform.ready().then(() => {
this.corpusService.initCorpusService().then();
// Okay, so the platform is ready and our plugins are available. // Okay, so the platform is ready and our plugins are available.
// Here you can do any higher level native things you might need. // Here you can do any higher level native things you might need.
this.statusBar.styleDefault(); this.statusBar.styleDefault();
......
import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
import {async, ComponentFixture, TestBed} from '@angular/core/testing'; import {async, ComponentFixture, inject, TestBed} from '@angular/core/testing';
import {AuthorDetailPage} from './author-detail.page'; import {AuthorDetailPage} from './author-detail.page';
import {RouterModule} from '@angular/router'; import {RouterModule} from '@angular/router';
import {HttpClientModule} from '@angular/common/http';
import {IonicStorageModule} from '@ionic/storage'; import {IonicStorageModule} from '@ionic/storage';
import {TranslateTestingModule} from '../translate-testing/translate-testing.module'; import {TranslateTestingModule} from '../translate-testing/translate-testing.module';
import {APP_BASE_HREF} from '@angular/common'; import {APP_BASE_HREF} from '@angular/common';
import {HttpClientTestingModule} from '@angular/common/http/testing';
describe('AuthorDetailPage', () => { describe('AuthorDetailPage', () => {
let component: AuthorDetailPage; let component: AuthorDetailPage;
...@@ -16,7 +16,7 @@ describe('AuthorDetailPage', () => { ...@@ -16,7 +16,7 @@ describe('AuthorDetailPage', () => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
declarations: [AuthorDetailPage], declarations: [AuthorDetailPage],
imports: [ imports: [
HttpClientModule, HttpClientTestingModule,
IonicStorageModule.forRoot(), IonicStorageModule.forRoot(),
RouterModule.forRoot([]), RouterModule.forRoot([]),
TranslateTestingModule TranslateTestingModule
......
...@@ -14,7 +14,7 @@ describe('CorpusService', () => { ...@@ -14,7 +14,7 @@ describe('CorpusService', () => {
let httpClient: HttpClient; let httpClient: HttpClient;
let httpTestingController: HttpTestingController; let httpTestingController: HttpTestingController;
let corpusService: CorpusService; let corpusService: CorpusService;
beforeEach(() => { beforeEach(async () => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [ imports: [
HttpClientTestingModule, HttpClientTestingModule,
...@@ -35,14 +35,14 @@ describe('CorpusService', () => { ...@@ -35,14 +35,14 @@ describe('CorpusService', () => {
}); });
it('should be created', () => { it('should be created', () => {
const service: CorpusService = TestBed.get(CorpusService); expect(corpusService).toBeTruthy();
expect(service).toBeTruthy();
}); });
it('should load corpora', async () => { it('should load corpora', (done) => {
spyOn(HelperService, 'makeGetRequest').and.returnValue(Promise.resolve(MockMC.apiResponseCorporaGet)); spyOn(HelperService, 'makeGetRequest').and.returnValue(Promise.resolve(MockMC.apiResponseCorporaGet));
// await corpusService.ngOnInit(); corpusService.initCorpusService().then(() => {
// TODO: FIX THIS expect(HelperService.makeGetRequest).toHaveBeenCalled();
expect(HelperService.makeGetRequest).toHaveBeenCalled(); done();
});
}); });
}); });
...@@ -79,7 +79,6 @@ export class CorpusService { ...@@ -79,7 +79,6 @@ export class CorpusService {
public helperService: HelperService, public helperService: HelperService,
public storage: Storage public storage: Storage
) { ) {
this.initCorpusService().then();
} }
adjustQueryValue(query: QueryMC, queryIndex: number) { adjustQueryValue(query: QueryMC, queryIndex: number) {
......
import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
import {async, ComponentFixture, TestBed} from '@angular/core/testing'; import {async, ComponentFixture, inject, TestBed, TestBedStatic} from '@angular/core/testing';
import {TestPage} from './test.page'; import {TestPage} from './test.page';
import {HttpClientModule} from '@angular/common/http';
import {IonicStorageModule} from '@ionic/storage'; import {IonicStorageModule} from '@ionic/storage';
import {RouterModule} from '@angular/router'; import {RouterModule} from '@angular/router';
import {TranslateTestingModule} from '../translate-testing/translate-testing.module'; import {TranslateTestingModule} from '../translate-testing/translate-testing.module';
import {PopoverController} from '@ionic/angular'; import {PopoverController, ToastController} from '@ionic/angular';
import {APP_BASE_HREF} from '@angular/common'; import {APP_BASE_HREF} from '@angular/common';
import {HttpClientTestingModule} from '@angular/common/http/testing';
describe('TestPage', () => { describe('TestPage', () => {
let component: TestPage; let component: TestPage;
let fixture: ComponentFixture<TestPage>; let fixture: ComponentFixture<TestPage>;
let tbs: TestBedStatic;
beforeEach(async(() => { beforeEach(async(() => {
TestBed.configureTestingModule({ tbs = TestBed.configureTestingModule({
declarations: [TestPage], declarations: [TestPage],
imports: [ imports: [
HttpClientModule, HttpClientTestingModule,
IonicStorageModule.forRoot(), IonicStorageModule.forRoot(),
RouterModule.forRoot([]), RouterModule.forRoot([]),
TranslateTestingModule, TranslateTestingModule,
], ],
providers: [ providers: [
{provide: APP_BASE_HREF, useValue: '/'}, {provide: APP_BASE_HREF, useValue: '/'},
{provide: PopoverController}, {provide: ToastController},
{provide: PopoverController, useValue: {}},
], ],
schemas: [CUSTOM_ELEMENTS_SCHEMA], schemas: [CUSTOM_ELEMENTS_SCHEMA],
}) });
.compileComponents();
})); }));
beforeEach(() => { beforeEach(() => {
......
...@@ -476,7 +476,7 @@ export class TestPage implements OnDestroy, OnInit { ...@@ -476,7 +476,7 @@ export class TestPage implements OnDestroy, OnInit {
checkButton.click(); checkButton.click();
} }
} }
}); }, {passive: true});
}); });
} }
} }
......
import {EventEmitter, Injectable, NgModule, Pipe, PipeTransform} from '@angular/core'; import {EventEmitter, Injectable, NgModule, Pipe, PipeTransform} from '@angular/core';
import {TranslateLoader, TranslateModule, TranslatePipe, TranslateService} from '@ngx-translate/core'; import {TranslateLoader, TranslateModule, TranslatePipe, TranslateService} from '@ngx-translate/core';
import {Observable, of} from 'rxjs'; import {Observable, of} from 'rxjs';
import {LangChangeEvent} from '@ngx-translate/core/lib/translate.service'; import {
DefaultLangChangeEvent,
LangChangeEvent,
TranslationChangeEvent
} from '@ngx-translate/core/lib/translate.service';
const translations: any = {}; const translations: any = {};
...@@ -26,7 +30,9 @@ export class TranslatePipeMock implements PipeTransform { ...@@ -26,7 +30,9 @@ export class TranslatePipeMock implements PipeTransform {
@Injectable() @Injectable()
export class TranslateServiceStub { export class TranslateServiceStub {
currentLang = 'en'; currentLang = 'en';
onDefaultLangChange: EventEmitter<DefaultLangChangeEvent> = new EventEmitter<DefaultLangChangeEvent>();
readonly onLangChange: EventEmitter<LangChangeEvent> = new EventEmitter<LangChangeEvent>(); readonly onLangChange: EventEmitter<LangChangeEvent> = new EventEmitter<LangChangeEvent>();
onTranslationChange: EventEmitter<TranslationChangeEvent> = new EventEmitter<TranslationChangeEvent>();
public get<T>(key: T): Observable<T> { public get<T>(key: T): Observable<T> {
return of(key); return of(key);
......
...@@ -2,33 +2,33 @@ ...@@ -2,33 +2,33 @@
// https://karma-runner.github.io/1.0/config/configuration-file.html // https://karma-runner.github.io/1.0/config/configuration-file.html
module.exports = function (config) { module.exports = function (config) {
config.set({ config.set({
basePath: '', basePath: '',
frameworks: ['jasmine', '@angular-devkit/build-angular'], frameworks: ['jasmine', '@angular-devkit/build-angular'],
plugins: [ plugins: [
require('karma-jasmine'), require('karma-jasmine'),
require('karma-chrome-launcher'), require('karma-chrome-launcher'),
require('karma-jasmine-html-reporter'), require('karma-jasmine-html-reporter'),
require('karma-coverage-istanbul-reporter'), require('karma-coverage-istanbul-reporter'),
require('@angular-devkit/build-angular/plugins/karma') require('@angular-devkit/build-angular/plugins/karma')
], ],
client: { client: {
clearContext: false // leave Jasmine Spec Runner output visible in browser clearContext: false // leave Jasmine Spec Runner output visible in browser
}, },
coverageIstanbulReporter: { coverageIstanbulReporter: {
dir: require('path').join(__dirname, '../coverage'), dir: require('path').join(__dirname, '../coverage'),
reports: ['html', 'lcovonly', 'text-summary'], reports: ['html', 'lcovonly', 'text-summary'],
fixWebpackSourcePaths: true fixWebpackSourcePaths: true
}, },
files: [ files: [
"./assets/dist/js/h5p-standalone-main.min.js" "./assets/dist/js/h5p-standalone-main.min.js"
], ],
reporters: ['progress', 'kjhtml'], reporters: ['progress', 'kjhtml'],
port: 9876, port: 9876,
colors: true, colors: true,
logLevel: config.LOG_INFO, logLevel: config.LOG_INFO,
autoWatch: true, autoWatch: true,
browsers: ['ChromeHeadless'], // Chrome browsers: ['Chrome', 'ChromeHeadless'],
singleRun: false singleRun: false
}); });
}; };
...@@ -7,6 +7,40 @@ ...@@ -7,6 +7,40 @@
}, },
"exclude": [ "exclude": [
"test.ts", "test.ts",
"**/*.spec.ts" "**/*.spec.ts",
"app/translate-testing/translate-testing.module.ts",
"app/models/mock.ts",
"environments/environment.prod.ts",
"app/models/xAPI/IdFormattedSubStatement.ts",
"app/models/xAPI/ClientModel.ts",
"app/models/xAPI/FilterAgent.ts",
"app/models/xAPI/FormattedContextActivities.ts",
"app/models/xAPI/FullActivityModel.ts",
"app/models/xAPI/IdFormattedActivity.ts",
"app/models/xAPI/IdFormattedActor.ts",
"app/models/xAPI//IdFormattedContext.ts",
"app/models/xAPI/IdFormattedVerb.ts",
"app/models/xAPI/IdFormattedSubStatementObject.ts",
"app/models/xAPI/AttachmentModel.ts",
"app/models/xAPI/IdFormattedStatementObject.ts",
"app/models/xAPI/IdFormattedStatementBase.ts",
"app/models/xAPI/IdFormattedStatement.ts",
"app/models/xAPI/Part.ts",
"app/models/xAPI/Statement.ts",
"app/models/xAPI/StatementHash.ts",
"app/models/xAPI/StatementsResult.ts",
"app/models/xAPI/UnstoredStatementModel.ts",
"app/models/xAPI/StoredStatementModel.ts",
"app/models/xAPI/UpRef.ts",
"app/models/xAPI/UnstoredStatementModel.ts"
] ]
// "files": [
// "main.ts",
// "zone-flags.ts",
// "polyfills.ts"
// ],
// "include": [
// "app/models/**/*.ts",
// "app/**/*.module.ts"
// ]
} }