diff --git a/package-lock.json b/package-lock.json index b42655e4..89a7f455 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11525,6 +11525,15 @@ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, + "ngx-logger": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/ngx-logger/-/ngx-logger-4.1.9.tgz", + "integrity": "sha512-hEJDtWWi+1OSCM7Syz4J8GyFhkf+f0HBbvnMniAMRp9x9gRdtj+Q0cesXdxVV4JJmIhxJQM88NNVRR0cOtPeHQ==", + "requires": { + "tslib": "^1.9.0", + "vlq": "^1.0.0" + } + }, "ngx-markdown": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-9.1.1.tgz", @@ -17280,6 +17289,11 @@ "extsprintf": "^1.2.0" } }, + "vlq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==" + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", diff --git a/package.json b/package.json index 4e63ef50..1e1e6e44 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,6 @@ "@openstapps/api": "0.22.0", "@openstapps/configuration": "0.25.0", "@openstapps/core": "0.36.0", - "@openstapps/logger": "0.4.0", "cordova-android": "8.0.0", "cordova-browser": "6.0.0", "cordova-ios": "5.0.0", @@ -66,6 +65,7 @@ "deepmerge": "3.3.0", "form-data": "2.5.0", "moment": "2.24.0", + "ngx-logger": "4.1.9", "ngx-markdown": "9.1.1", "ngx-moment": "3.4.0", "rxjs": "6.6.3", diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 1e60aa86..4a048610 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -23,6 +23,7 @@ import {TranslateService} from '@ngx-translate/core'; import {AppComponent} from './app.component'; import {ConfigProvider} from './modules/config/config.provider'; import {SettingsProvider} from './modules/settings/settings.provider'; +import {NGXLogger} from "ngx-logger"; describe('AppComponent', () => { @@ -33,6 +34,7 @@ describe('AppComponent', () => { let translateServiceSpy: jasmine.SpyObj; let settingsProvider: jasmine.SpyObj; let configProvider: jasmine.SpyObj; + let ngxLogger: jasmine.SpyObj; beforeEach(async(() => { statusBarSpy = jasmine.createSpyObj('StatusBar', ['styleDefault']); @@ -44,6 +46,8 @@ describe('AppComponent', () => { ['getSettingValue', 'provideSetting', 'setCategoriesOrder']); configProvider = jasmine.createSpyObj('ConfigProvider', ['init']); + ngxLogger = jasmine.createSpyObj('NGXLogger', + ['log', 'error', 'warn']); TestBed.configureTestingModule({ declarations: [AppComponent], @@ -54,6 +58,7 @@ describe('AppComponent', () => { {provide: TranslateService, useValue: translateServiceSpy}, {provide: SettingsProvider, useValue: settingsProvider}, {provide: ConfigProvider, useValue: configProvider}, + {provide: NGXLogger, useValue: ngxLogger}, ], schemas: [CUSTOM_ELEMENTS_SCHEMA], }).compileComponents(); diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 992a6384..f15e212d 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018, 2019 StApps + * Copyright (C) 2018-2020 StApps * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, version 3. @@ -17,7 +17,7 @@ import {SplashScreen} from '@ionic-native/splash-screen/ngx'; import {StatusBar} from '@ionic-native/status-bar/ngx'; import {Platform} from '@ionic/angular'; import {TranslateService} from '@ngx-translate/core'; -import {Logger} from '@openstapps/logger'; +import {NGXLogger} from 'ngx-logger'; import {ConfigProvider} from './modules/config/config.provider'; import {SettingsProvider} from './modules/settings/settings.provider'; @@ -51,13 +51,15 @@ export class AppComponent { * @param translateService TODO * @param settingsProvider TODO * @param configProvider TODO + * @param logger An angular logger */ constructor(private readonly platform: Platform, private readonly statusBar: StatusBar, private readonly splashScreen: SplashScreen, private readonly translateService: TranslateService, private readonly settingsProvider: SettingsProvider, - private readonly configProvider: ConfigProvider) { + private readonly configProvider: ConfigProvider, + private readonly logger: NGXLogger) { this.initializeApp(); // this language will be used as a fallback when a translation isn't found in the current language @@ -84,7 +86,7 @@ export class AppComponent { // @TODO: Issue #43 handle initialisation error and inform user } } - await Logger.error(error); + this.logger.error(error); } // set order of categories in settings @@ -100,7 +102,7 @@ export class AppComponent { const languageCode = (await this.settingsProvider.getValue('profile', 'language')) as string; this.translateService.use(languageCode); } catch (error) { - Logger.warn(error); + this.logger.warn(error); } }); } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 45a68df1..24979cc4 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018, 2019 StApps + * Copyright (C) 2018-2020 StApps * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, version 3. @@ -23,7 +23,8 @@ import {StatusBar} from '@ionic-native/status-bar/ngx'; import {IonicModule, IonicRouteStrategy} from '@ionic/angular'; import {TranslateLoader, TranslateModule} from '@ngx-translate/core'; import {TranslateHttpLoader} from '@ngx-translate/http-loader'; -import {fakeBackendProvider} from './_helpers/fake-backend.interceptor'; +import {LoggerModule, NgxLoggerLevel} from 'ngx-logger'; +import {environment} from '../environments/environment'; import {AppRoutingModule} from './app-routing.module'; import {AppComponent} from './app.component'; import {ConfigModule} from './modules/config/config.module'; @@ -31,7 +32,7 @@ import {DataModule} from './modules/data/data.module'; import {MenuModule} from './modules/menu/menu.module'; import {SettingsModule} from './modules/settings/settings.module'; import {StorageModule} from './modules/storage/storage.module'; -import {environment} from './../environments/environment'; +import {fakeBackendProvider} from './_helpers/fake-backend.interceptor'; registerLocaleData(localeDe); @@ -80,6 +81,8 @@ const providers : Provider[] = [ useFactory: (createTranslateLoader), }, }), + // use maximal logging level when not in production, minimal (log only fatal errors) in production + LoggerModule.forRoot({level: environment.production ? NgxLoggerLevel.FATAL : NgxLoggerLevel.TRACE}), ], providers: environment.use_fake_backend ? [providers, fakeBackendProvider] : providers, diff --git a/src/app/modules/config/config.provider.spec.ts b/src/app/modules/config/config.provider.spec.ts index dc409070..5569c799 100644 --- a/src/app/modules/config/config.provider.spec.ts +++ b/src/app/modules/config/config.provider.spec.ts @@ -18,6 +18,7 @@ import {StAppsWebHttpClient} from '../data/stapps-web-http-client.provider'; import {StorageProvider} from '../storage/storage.provider'; import {ConfigProvider, STORAGE_KEY_CONFIG} from './config.provider'; import {ConfigFetchError, ConfigInitError, SavedConfigNotAvailable, WrongConfigVersionInStorage,} from './errors'; +import {NGXLogger} from "ngx-logger"; describe('ConfigProvider', () => { let configProvider: ConfigProvider; @@ -26,6 +27,7 @@ describe('ConfigProvider', () => { beforeEach(() => { const storageProviderMethodSpy = jasmine.createSpyObj('StorageProvider', ['init', 'get', 'has', 'put']); const webHttpClientMethodSpy = jasmine.createSpyObj('StAppsWebHttpClient', ['request']); + const ngxLogger: jasmine.SpyObj = jasmine.createSpyObj('NGXLogger', ['log', 'error', 'warn']); TestBed.configureTestingModule({ imports: [], @@ -37,6 +39,9 @@ describe('ConfigProvider', () => { { provide: StAppsWebHttpClient, useValue: webHttpClientMethodSpy, }, + { + provide: NGXLogger, useValue: ngxLogger, + }, ], }); diff --git a/src/app/modules/config/config.provider.ts b/src/app/modules/config/config.provider.ts index b8b7d206..fe32ecd3 100644 --- a/src/app/modules/config/config.provider.ts +++ b/src/app/modules/config/config.provider.ts @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 StApps + * Copyright (C) 2019, 2020 StApps * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, version 3. @@ -15,7 +15,7 @@ import {Injectable} from '@angular/core'; import {Client} from '@openstapps/api/lib/client'; import {SCAppConfiguration, SCIndexResponse} from '@openstapps/core'; -import {Logger} from '@openstapps/logger'; +import {NGXLogger} from 'ngx-logger'; import {environment} from '../../../environments/environment'; import {StAppsWebHttpClient} from '../data/stapps-web-http-client.provider'; import {StorageProvider} from '../storage/storage.provider'; @@ -55,10 +55,13 @@ export class ConfigProvider { /** * Constructor, initialise api client * - * @param storageProvider StorageProvider to load persistet configuration + * @param storageProvider StorageProvider to load persistent configuration * @param swHttpClient Api client + * @param logger An angular logger */ - constructor(private readonly storageProvider: StorageProvider, swHttpClient: StAppsWebHttpClient) { + constructor(private readonly storageProvider: StorageProvider, + swHttpClient: StAppsWebHttpClient, + private readonly logger: NGXLogger) { this.client = new Client(swHttpClient, environment.backend_url, environment.backend_version); } @@ -109,10 +112,10 @@ export class ConfigProvider { try { this.config = await this.loadLocal(); this.initialised = true; - Logger.log(`initialised configuration from storage`); + this.logger.log(`initialised configuration from storage`); if (this.config.backend.SCVersion !== environment.backend_version) { loadError = new WrongConfigVersionInStorage(environment.backend_version, this.config.backend.SCVersion); - Logger.warn(loadError); + this.logger.warn(loadError); } } catch (error) { loadError = error; @@ -122,7 +125,7 @@ export class ConfigProvider { const fetchedConfig: SCIndexResponse = await this.fetch(); await this.set(fetchedConfig); this.initialised = true; - Logger.log(`initialised configuration from remote`); + this.logger.log(`initialised configuration from remote`); } catch (error) { fetchError = error; } diff --git a/src/app/modules/data/list/data-list.component.ts b/src/app/modules/data/list/data-list.component.ts index ca539941..7d18da68 100644 --- a/src/app/modules/data/list/data-list.component.ts +++ b/src/app/modules/data/list/data-list.component.ts @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018, 2019, 2020 StApps + * Copyright (C) 2018-2020 StApps * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, version 3. @@ -21,7 +21,7 @@ import { SCSearchSort, SCThing, } from '@openstapps/core'; -import {Logger} from '@openstapps/logger'; +import {NGXLogger} from 'ngx-logger'; import {Subject} from 'rxjs'; import {debounceTime, distinctUntilChanged} from 'rxjs/operators'; import {MenuService} from '../../menu/menu.service'; @@ -82,12 +82,15 @@ export class DataListComponent implements OnInit { * @param alertController AlertController * @param dataProvider DataProvider * @param menuService MenuService + * @param settingsProvider SettingsProvider + * @param logger An angular logger */ constructor( private readonly alertController: AlertController, - private dataProvider: DataProvider, + private readonly dataProvider: DataProvider, private readonly menuService: MenuService, private readonly settingsProvider: SettingsProvider, + private readonly logger: NGXLogger, ) { this.queryTextChanged .pipe( @@ -116,7 +119,7 @@ export class DataListComponent implements OnInit { this.settingsProvider.settingsActionChanged$.subscribe(({type, payload}) => { if (type === 'stapps.settings.changed') { const {category, name, value} = payload!; - Logger.log(`received event "settings.changed" with category: + this.logger.log(`received event "settings.changed" with category: ${category}, name: ${name}, value: ${JSON.stringify(value)}`); } }, diff --git a/src/app/modules/menu/navigation/navigation.component.ts b/src/app/modules/menu/navigation/navigation.component.ts index 0a894873..bbf6386f 100644 --- a/src/app/modules/menu/navigation/navigation.component.ts +++ b/src/app/modules/menu/navigation/navigation.component.ts @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018, 2019 StApps + * Copyright (C) 2018-2020 StApps * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, version 3. @@ -15,7 +15,7 @@ import {Component} from '@angular/core'; import {LangChangeEvent, TranslateService} from '@ngx-translate/core'; import {SCAppConfigurationMenuCategory, SCLanguage, SCThingTranslator, SCTranslations} from '@openstapps/core'; -import {Logger} from '@openstapps/logger'; +import {NGXLogger} from 'ngx-logger'; import {ConfigProvider} from '../../config/config.provider'; /** @@ -46,8 +46,9 @@ export class NavigationComponent { */ translator: SCThingTranslator; - constructor(private configProvider: ConfigProvider, - public translateService: TranslateService) { + constructor(private readonly configProvider: ConfigProvider, + public translateService: TranslateService, + private readonly logger: NGXLogger) { this.loadMenuEntries(); translateService.onLangChange.subscribe((event: LangChangeEvent) => { this.language = event.lang as keyof SCTranslations; @@ -63,7 +64,7 @@ export class NavigationComponent { try { this.menu = await this.configProvider.getValue('menus') as SCAppConfigurationMenuCategory[]; } catch (error) { - Logger.error(`error from loading menu entries: ${error}`); + this.logger.error(`error from loading menu entries: ${error}`); } } diff --git a/src/main.ts b/src/main.ts index 94a790da..40fa73f7 100644 --- a/src/main.ts +++ b/src/main.ts @@ -14,7 +14,6 @@ */ import {enableProdMode} from '@angular/core'; import {platformBrowserDynamic} from '@angular/platform-browser-dynamic'; -import {Logger} from '@openstapps/logger'; import {AppModule} from './app/app.module'; import {environment} from './environments/environment'; @@ -24,4 +23,5 @@ if (environment.production) { platformBrowserDynamic() .bootstrapModule(AppModule) - .catch(async (err) => await Logger.error(err)); + // tslint:disable-next-line:no-console + .catch(async (err) => console.error(err));