From 1617c30cc3421333ca5fae4d071bcf8d4d629ebe Mon Sep 17 00:00:00 2001 From: Noel De Martin Date: Wed, 7 Oct 2020 10:11:20 +0200 Subject: [PATCH] MOBILE-3303 lint: Fix linting errors in first implementation --- .eslintrc.js | 37 ++++-- src/app/classes/singletons-factory.ts | 12 +- src/app/core/constants.ts | 126 +++++++++++---------- src/app/core/emulator/emulator.module.ts | 2 +- src/app/core/login/pages/init/init.page.ts | 3 +- src/app/core/login/pages/site/site.page.ts | 3 +- src/app/services/app.ts | 23 ++-- src/app/services/init.ts | 32 ++---- src/app/services/utils/utils.ts | 27 +++-- src/app/singletons/logger.ts | 26 +++-- tsconfig.app.json | 3 +- tsconfig.json | 4 + 12 files changed, 165 insertions(+), 133 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 01d2e61d7..194b0de11 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -71,9 +71,26 @@ module.exports = { }, ], '@typescript-eslint/member-ordering': 'error', - '@typescript-eslint/naming-convention': 'error', + '@typescript-eslint/naming-convention': [ + 'error', + { + selector: 'property', + modifiers: ['readonly'], + format: ['UPPER_CASE'], + }, + { + selector: 'property', + format: ['camelCase'], + }, + ], '@typescript-eslint/no-empty-function': 'error', - '@typescript-eslint/no-empty-interface': 'error', + '@typescript-eslint/no-empty-interface': 'off', + '@typescript-eslint/no-explicit-any': [ + 'warn', + { + fixToUnknown: true, + }, + ], '@typescript-eslint/no-inferrable-types': [ 'error', { @@ -113,15 +130,8 @@ module.exports = { ], 1, ], - 'one-var': ['error', 'never'], + 'arrow-body-style': ['error', 'as-needed'], 'comma-dangle': ['error', 'always-multiline'], - 'capitalized-comments': [ - 'error', - 'always', - { - ignoreConsecutiveComments: true, - }, - ], 'constructor-super': 'error', 'curly': 'error', 'default-case': 'error', @@ -171,6 +181,7 @@ module.exports = { 'no-underscore-dangle': 'error', 'no-unused-labels': 'error', 'no-var': 'error', + 'one-var': ['error', 'never'], 'padding-line-between-statements': [ 'error', { @@ -181,9 +192,13 @@ module.exports = { ], 'prefer-arrow/prefer-arrow-functions': [ 'error', - { allowStandaloneDeclarations: true }, + { + singleReturnOnly: true, + allowStandaloneDeclarations: true, + }, ], 'prefer-const': 'error', + 'prefer-spread': 'off', 'quote-props': [ 'error', 'consistent-as-needed', diff --git a/src/app/classes/singletons-factory.ts b/src/app/classes/singletons-factory.ts index 791b192f0..68a7d87dc 100644 --- a/src/app/classes/singletons-factory.ts +++ b/src/app/classes/singletons-factory.ts @@ -22,7 +22,7 @@ class CoreSingleton {} /** * Token that can be used to resolve instances from the injector. */ -export type CoreInjectionToken = Type | Type | string; +export type CoreInjectionToken = Type | Type | string; /** * Singleton class created using the factory. @@ -55,20 +55,20 @@ export class CoreSingletonsFactory { * provider was defined using a class or the string used in the `provide` key if it was defined using an object. */ makeSingleton(injectionToken: CoreInjectionToken): CoreSingletonClass { - // tslint:disable: no-this-assignment + // eslint-disable-next-line @typescript-eslint/no-this-alias const factory = this; return class { - private static _instance: Service; + private static serviceInstance: Service; static get instance(): Service { // Initialize instances lazily. - if (!this._instance) { - this._instance = factory.injector.get(injectionToken); + if (!this.serviceInstance) { + this.serviceInstance = factory.injector.get(injectionToken); } - return this._instance; + return this.serviceInstance; } }; diff --git a/src/app/core/constants.ts b/src/app/core/constants.ts index c9784ccc3..def5471dd 100644 --- a/src/app/core/constants.ts +++ b/src/app/core/constants.ts @@ -28,79 +28,81 @@ export const enum ContextLevel { * Static class to contain all the core constants. */ export class CoreConstants { - static SECONDS_YEAR = 31536000; - static SECONDS_WEEK = 604800; - static SECONDS_DAY = 86400; - static SECONDS_HOUR = 3600; - static SECONDS_MINUTE = 60; - static WIFI_DOWNLOAD_THRESHOLD = 104857600; // 100MB. - static DOWNLOAD_THRESHOLD = 10485760; // 10MB. - static MINIMUM_FREE_SPACE = 10485760; // 10MB. - static IOS_FREE_SPACE_THRESHOLD = 524288000; // 500MB. - static DONT_SHOW_ERROR = 'CoreDontShowError'; - static NO_SITE_ID = 'NoSite'; + /* eslint-disable max-len */ + + static readonly SECONDS_YEAR = 31536000; + static readonly SECONDS_WEEK = 604800; + static readonly SECONDS_DAY = 86400; + static readonly SECONDS_HOUR = 3600; + static readonly SECONDS_MINUTE = 60; + static readonly WIFI_DOWNLOAD_THRESHOLD = 104857600; // 100MB. + static readonly DOWNLOAD_THRESHOLD = 10485760; // 10MB. + static readonly MINIMUM_FREE_SPACE = 10485760; // 10MB. + static readonly IOS_FREE_SPACE_THRESHOLD = 524288000; // 500MB. + static readonly DONT_SHOW_ERROR = 'CoreDontShowError'; + static readonly NO_SITE_ID = 'NoSite'; // Settings constants. - static SETTINGS_RICH_TEXT_EDITOR = 'CoreSettingsRichTextEditor'; - static SETTINGS_NOTIFICATION_SOUND = 'CoreSettingsNotificationSound'; - static SETTINGS_SYNC_ONLY_ON_WIFI = 'CoreSettingsSyncOnlyOnWifi'; - static SETTINGS_DEBUG_DISPLAY = 'CoreSettingsDebugDisplay'; - static SETTINGS_REPORT_IN_BACKGROUND = 'CoreSettingsReportInBackground'; // @deprecated since 3.5.0 - static SETTINGS_SEND_ON_ENTER = 'CoreSettingsSendOnEnter'; - static SETTINGS_FONT_SIZE = 'CoreSettingsFontSize'; - static SETTINGS_COLOR_SCHEME = 'CoreSettingsColorScheme'; - static SETTINGS_ANALYTICS_ENABLED = 'CoreSettingsAnalyticsEnabled'; + static readonly SETTINGS_RICH_TEXT_EDITOR = 'CoreSettingsRichTextEditor'; + static readonly SETTINGS_NOTIFICATION_SOUND = 'CoreSettingsNotificationSound'; + static readonly SETTINGS_SYNC_ONLY_ON_WIFI = 'CoreSettingsSyncOnlyOnWifi'; + static readonly SETTINGS_DEBUG_DISPLAY = 'CoreSettingsDebugDisplay'; + static readonly SETTINGS_REPORT_IN_BACKGROUND = 'CoreSettingsReportInBackground'; // @deprecated since 3.5.0 + static readonly SETTINGS_SEND_ON_ENTER = 'CoreSettingsSendOnEnter'; + static readonly SETTINGS_FONT_SIZE = 'CoreSettingsFontSize'; + static readonly SETTINGS_COLOR_SCHEME = 'CoreSettingsColorScheme'; + static readonly SETTINGS_ANALYTICS_ENABLED = 'CoreSettingsAnalyticsEnabled'; // WS constants. - static WS_TIMEOUT = 30000; // Timeout when not in WiFi. - static WS_TIMEOUT_WIFI = 30000; // Timeout when in WiFi. - static WS_PREFIX = 'local_mobile_'; + static readonly WS_TIMEOUT = 30000; // Timeout when not in WiFi. + static readonly WS_TIMEOUT_WIFI = 30000; // Timeout when in WiFi. + static readonly WS_PREFIX = 'local_mobile_'; // Login constants. - static LOGIN_SSO_CODE = 2; // SSO in browser window is required. - static LOGIN_SSO_INAPP_CODE = 3; // SSO in embedded browser is required. - static LOGIN_LAUNCH_DATA = 'CoreLoginLaunchData'; + static readonly LOGIN_SSO_CODE = 2; // SSO in browser window is required. + static readonly LOGIN_SSO_INAPP_CODE = 3; // SSO in embedded browser is required. + static readonly LOGIN_LAUNCH_DATA = 'CoreLoginLaunchData'; // Download status constants. - static DOWNLOADED = 'downloaded'; - static DOWNLOADING = 'downloading'; - static NOT_DOWNLOADED = 'notdownloaded'; - static OUTDATED = 'outdated'; - static NOT_DOWNLOADABLE = 'notdownloadable'; + static readonly DOWNLOADED = 'downloaded'; + static readonly DOWNLOADING = 'downloading'; + static readonly NOT_DOWNLOADED = 'notdownloaded'; + static readonly OUTDATED = 'outdated'; + static readonly NOT_DOWNLOADABLE = 'notdownloadable'; // Constants from Moodle's resourcelib. - static RESOURCELIB_DISPLAY_AUTO = 0; // Try the best way. - static RESOURCELIB_DISPLAY_EMBED = 1; // Display using object tag. - static RESOURCELIB_DISPLAY_FRAME = 2; // Display inside frame. - static RESOURCELIB_DISPLAY_NEW = 3; // Display normal link in new window. - static RESOURCELIB_DISPLAY_DOWNLOAD = 4; // Force download of file instead of display. - static RESOURCELIB_DISPLAY_OPEN = 5; // Open directly. - static RESOURCELIB_DISPLAY_POPUP = 6; // Open in "emulated" pop-up without navigation. + static readonly RESOURCELIB_DISPLAY_AUTO = 0; // Try the best way. + static readonly RESOURCELIB_DISPLAY_EMBED = 1; // Display using object tag. + static readonly RESOURCELIB_DISPLAY_FRAME = 2; // Display inside frame. + static readonly RESOURCELIB_DISPLAY_NEW = 3; // Display normal link in new window. + static readonly RESOURCELIB_DISPLAY_DOWNLOAD = 4; // Force download of file instead of display. + static readonly RESOURCELIB_DISPLAY_OPEN = 5; // Open directly. + static readonly RESOURCELIB_DISPLAY_POPUP = 6; // Open in "emulated" pop-up without navigation. // Feature constants. Used to report features that are, or are not, supported by a module. - static FEATURE_GRADE_HAS_GRADE = 'grade_has_grade'; // True if module can provide a grade. - static FEATURE_GRADE_OUTCOMES = 'outcomes'; // True if module supports outcomes. - static FEATURE_ADVANCED_GRADING = 'grade_advanced_grading'; // True if module supports advanced grading methods. - static FEATURE_CONTROLS_GRADE_VISIBILITY = 'controlsgradevisbility'; // True if module controls grade visibility over gradebook. - static FEATURE_PLAGIARISM = 'plagiarism'; // True if module supports plagiarism plugins. - static FEATURE_COMPLETION_TRACKS_VIEWS = 'completion_tracks_views'; // True if module tracks whether somebody viewed it. - static FEATURE_COMPLETION_HAS_RULES = 'completion_has_rules'; // True if module has custom completion rules. - static FEATURE_NO_VIEW_LINK = 'viewlink'; // True if module has no 'view' page (like label). - static FEATURE_IDNUMBER = 'idnumber'; // True if module wants support for setting the ID number for grade calculation purposes. - static FEATURE_GROUPS = 'groups'; // True if module supports groups. - static FEATURE_GROUPINGS = 'groupings'; // True if module supports groupings. - static FEATURE_MOD_ARCHETYPE = 'mod_archetype'; // Type of module. - static FEATURE_MOD_INTRO = 'mod_intro'; // True if module supports intro editor. - static FEATURE_MODEDIT_DEFAULT_COMPLETION = 'modedit_default_completion'; // True if module has default completion. - static FEATURE_COMMENT = 'comment'; - static FEATURE_RATE = 'rate'; - static FEATURE_BACKUP_MOODLE2 = 'backup_moodle2'; // True if module supports backup/restore of moodle2 format. - static FEATURE_SHOW_DESCRIPTION = 'showdescription'; // True if module can show description on course main page. - static FEATURE_USES_QUESTIONS = 'usesquestions'; // True if module uses the question bank. + static readonly FEATURE_GRADE_HAS_GRADE = 'grade_has_grade'; // True if module can provide a grade. + static readonly FEATURE_GRADE_OUTCOMES = 'outcomes'; // True if module supports outcomes. + static readonly FEATURE_ADVANCED_GRADING = 'grade_advanced_grading'; // True if module supports advanced grading methods. + static readonly FEATURE_CONTROLS_GRADE_VISIBILITY = 'controlsgradevisbility'; // True if module controls grade visibility over gradebook. + static readonly FEATURE_PLAGIARISM = 'plagiarism'; // True if module supports plagiarism plugins. + static readonly FEATURE_COMPLETION_TRACKS_VIEWS = 'completion_tracks_views'; // True if module tracks whether somebody viewed it. + static readonly FEATURE_COMPLETION_HAS_RULES = 'completion_has_rules'; // True if module has custom completion rules. + static readonly FEATURE_NO_VIEW_LINK = 'viewlink'; // True if module has no 'view' page (like label). + static readonly FEATURE_IDNUMBER = 'idnumber'; // True if module wants support for setting the ID number for grade calculation purposes. + static readonly FEATURE_GROUPS = 'groups'; // True if module supports groups. + static readonly FEATURE_GROUPINGS = 'groupings'; // True if module supports groupings. + static readonly FEATURE_MOD_ARCHETYPE = 'mod_archetype'; // Type of module. + static readonly FEATURE_MOD_INTRO = 'mod_intro'; // True if module supports intro editor. + static readonly FEATURE_MODEDIT_DEFAULT_COMPLETION = 'modedit_default_completion'; // True if module has default completion. + static readonly FEATURE_COMMENT = 'comment'; + static readonly FEATURE_RATE = 'rate'; + static readonly FEATURE_BACKUP_MOODLE2 = 'backup_moodle2'; // True if module supports backup/restore of moodle2 format. + static readonly FEATURE_SHOW_DESCRIPTION = 'showdescription'; // True if module can show description on course main page. + static readonly FEATURE_USES_QUESTIONS = 'usesquestions'; // True if module uses the question bank. - // Pssobile archetypes for modules. - static MOD_ARCHETYPE_OTHER = 0; // Unspecified module archetype. - static MOD_ARCHETYPE_RESOURCE = 1; // Resource-like type module. - static MOD_ARCHETYPE_ASSIGNMENT = 2; // Assignment module archetype. - static MOD_ARCHETYPE_SYSTEM = 3; // System (not user-addable) module archetype. + // Possbile archetypes for modules. + static readonly MOD_ARCHETYPE_OTHER = 0; // Unspecified module archetype. + static readonly MOD_ARCHETYPE_RESOURCE = 1; // Resource-like type module. + static readonly MOD_ARCHETYPE_ASSIGNMENT = 2; // Assignment module archetype. + static readonly MOD_ARCHETYPE_SYSTEM = 3; // System (not user-addable) module archetype. } diff --git a/src/app/core/emulator/emulator.module.ts b/src/app/core/emulator/emulator.module.ts index 822eb2b77..14a401ab9 100644 --- a/src/app/core/emulator/emulator.module.ts +++ b/src/app/core/emulator/emulator.module.ts @@ -69,6 +69,6 @@ import { Zip } from '@ionic-native/zip/ngx'; StatusBar, WebIntent, Zip, - ] + ], }) export class CoreEmulatorModule { } diff --git a/src/app/core/login/pages/init/init.page.ts b/src/app/core/login/pages/init/init.page.ts index f48917648..38e3cbab3 100644 --- a/src/app/core/login/pages/init/init.page.ts +++ b/src/app/core/login/pages/init/init.page.ts @@ -17,7 +17,6 @@ import { Router } from '@angular/router'; import { CoreApp } from '@services/app'; import { CoreInit } from '@services/init'; -import { CoreConstants } from '@core/constants'; import { SplashScreen } from '@singletons/core.singletons'; /** @@ -42,7 +41,7 @@ export class CoreLoginInitPage implements OnInit { const redirectData = CoreApp.instance.getRedirect(); if (redirectData.siteId) { // Unset redirect data. - CoreApp.instance.storeRedirect('', '', ''); + CoreApp.instance.storeRedirect('', '', {}); // Only accept the redirect if it was stored less than 20 seconds ago. if (Date.now() - redirectData.timemodified < 20000) { diff --git a/src/app/core/login/pages/site/site.page.ts b/src/app/core/login/pages/site/site.page.ts index 34c863eaa..12e0398ae 100644 --- a/src/app/core/login/pages/site/site.page.ts +++ b/src/app/core/login/pages/site/site.page.ts @@ -28,6 +28,7 @@ export class CoreLoginSitePage implements OnInit { * Initialize the component. */ ngOnInit(): void { - + // } + } diff --git a/src/app/services/app.ts b/src/app/services/app.ts index 7da59749b..9b3858bc0 100644 --- a/src/app/services/app.ts +++ b/src/app/services/app.ts @@ -25,19 +25,22 @@ import { CoreLogger } from '@singletons/logger'; /** * Factory to provide some global functionalities, like access to the global app database. + * * @description * Each service or component should be responsible of creating their own database tables. Example: * + * ```ts * constructor(appProvider: CoreAppProvider) { * this.appDB = appProvider.getDB(); * this.appDB.createTableFromSchema(this.tableSchema); * } + * ``` */ @Injectable() export class CoreAppProvider { protected DBNAME = 'MoodleMobile'; protected db: SQLiteDB; - protected logger; + protected logger: CoreLogger; protected ssoAuthenticationPromise: Promise; protected isKeyboardShown = false; protected _isKeyboardOpening = false; @@ -567,18 +570,18 @@ export class CoreAppProvider { * * @return Object with siteid, state, params and timemodified. */ - getRedirect(): CoreRedirectData { + getRedirect = Record>(): CoreRedirectData { if (localStorage && localStorage.getItem) { try { - const data: CoreRedirectData = { + const paramsJson = localStorage.getItem('CoreRedirectParams'); + const data: CoreRedirectData = { siteId: localStorage.getItem('CoreRedirectSiteId'), page: localStorage.getItem('CoreRedirectState'), - params: localStorage.getItem('CoreRedirectParams'), - timemodified: parseInt(localStorage.getItem('CoreRedirectTime'), 10) + timemodified: parseInt(localStorage.getItem('CoreRedirectTime'), 10), }; - if (data.params) { - data.params = JSON.parse(data.params); + if (paramsJson) { + data.params = JSON.parse(paramsJson); } return data; @@ -597,7 +600,7 @@ export class CoreAppProvider { * @param page Page to go. * @param params Page params. */ - storeRedirect(siteId: string, page: string, params: any): void { + storeRedirect(siteId: string, page: string, params: Record): void { if (localStorage && localStorage.setItem) { try { localStorage.setItem('CoreRedirectSiteId', siteId); @@ -704,7 +707,7 @@ export class CoreApp extends makeSingleton(CoreAppProvider) {} /** * Data stored for a redirect to another page/site. */ -export type CoreRedirectData = { +export type CoreRedirectData> = { /** * ID of the site to load. */ @@ -718,7 +721,7 @@ export type CoreRedirectData = { /** * Params to pass to the page. */ - params?: any; + params?: Params; /** * Timestamp when this redirect was last modified. diff --git a/src/app/services/init.ts b/src/app/services/init.ts index 1126c935b..5575b8b33 100644 --- a/src/app/services/init.ts +++ b/src/app/services/init.ts @@ -50,8 +50,8 @@ export type CoreInitHandler = { */ @Injectable() export class CoreInitDelegate { - static DEFAULT_PRIORITY = 100; // Default priority for init processes. - static MAX_RECOMMENDED_PRIORITY = 600; + static readonly DEFAULT_PRIORITY = 100; // Default priority for init processes. + static readonly MAX_RECOMMENDED_PRIORITY = 600; protected initProcesses = {}; protected logger: CoreLogger; @@ -77,16 +77,12 @@ export class CoreInitDelegate { for (const name in this.initProcesses) { ordered.push(this.initProcesses[name]); } - ordered.sort((a, b) => { - return b.priority - a.priority; - }); + ordered.sort((a, b) => b.priority - a.priority); - ordered = ordered.map((data: CoreInitHandler) => { - return { - func: this.prepareProcess.bind(this, data), - blocking: !!data.blocking, - }; - }); + ordered = ordered.map((data: CoreInitHandler) => ({ + func: this.prepareProcess.bind(this, data), + blocking: !!data.blocking, + })); // Execute all the processes in order to solve dependencies. CoreUtils.instance.executeOrderedPromises(ordered).finally(this.readiness.resolve); @@ -115,20 +111,14 @@ export class CoreInitDelegate { * @param data The data of the process. * @return Promise of the process. */ - protected prepareProcess(data: CoreInitHandler): Promise { - let promise; - + protected async prepareProcess(data: CoreInitHandler): Promise { this.logger.debug(`Executing init process '${data.name}'`); try { - promise = data.load(); + await data.load(); } catch (e) { this.logger.error('Error while calling the init process \'' + data.name + '\'. ' + e); - - return; } - - return promise; } /** @@ -136,13 +126,13 @@ export class CoreInitDelegate { * * @return Resolved when the app is initialised. Never rejected. */ - ready(): Promise { + async ready(): Promise { if (typeof this.readiness == 'undefined') { // Prevent race conditions if this is called before executeInitProcesses. this.initReadiness(); } - return this.readiness.promise; + await this.readiness.promise; } /** diff --git a/src/app/services/utils/utils.ts b/src/app/services/utils/utils.ts index fa72b3e48..b59b8d3b1 100644 --- a/src/app/services/utils/utils.ts +++ b/src/app/services/utils/utils.ts @@ -85,7 +85,7 @@ export class CoreUtilsProvider { * @param promises Promises. * @return Promise resolved if all promises are resolved and rejected if at least 1 promise fails. */ - allPromises(promises: Promise[]): Promise { + allPromises(promises: Promise[]): Promise { if (!promises || !promises.length) { return Promise.resolve(); } @@ -366,7 +366,7 @@ export class CoreUtilsProvider { * - blocking: Boolean. If promise should block the following. * @return Promise resolved when all promises are resolved. */ - executeOrderedPromises(orderedPromisesData: any[]): Promise { + executeOrderedPromises(orderedPromisesData: OrderedPromiseData[]): Promise { const promises = []; let dependency = Promise.resolve(); @@ -377,17 +377,13 @@ export class CoreUtilsProvider { // Add the process to the dependency stack. promise = dependency.finally(() => { - let prom; - try { - prom = data.func.apply(data.context, data.params || []); + return data.function(); } catch (e) { this.logger.error(e.message); return; } - - return prom; }); promises.push(promise); @@ -1582,5 +1578,20 @@ export type PromiseDefer = { * * @param reason The reject param. */ - reject?: (reason?: any) => void; + reject?: (reason?: unknown) => void; +}; + +/** + * Data for each entry of executeOrderedPromises. + */ +export type OrderedPromiseData = { + /** + * Function to execute. + */ + function: () => Promise; + + /** + * Whether the promise should block the following one. + */ + blocking?: boolean; }; diff --git a/src/app/singletons/logger.ts b/src/app/singletons/logger.ts index 6ed914d17..c189192da 100644 --- a/src/app/singletons/logger.ts +++ b/src/app/singletons/logger.ts @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -import * as moment from 'moment'; +import moment from 'moment'; import { environment } from '@/environments/environment'; /** @@ -42,27 +42,33 @@ export class CoreLogger { static getInstance(className: string): CoreLogger { // Disable log on production. if (environment.production) { - /* tslint:next-line no-console */ + // eslint-disable-next-line no-console console.warn('Log is disabled in production app'); + // eslint-disable-next-line @typescript-eslint/no-empty-function + const muted = () => {}; + return { - log: () => {}, - info: () => {}, - warn: () => {}, - debug: () => {}, - error: () => {}, + log: muted, + info: muted, + warn: muted, + debug: muted, + error: muted, }; } className = className || ''; - /* tslint:disable no-console */ - return { + // eslint-disable-next-line no-console log: CoreLogger.prepareLogFn(console.log.bind(console), className), + // eslint-disable-next-line no-console info: CoreLogger.prepareLogFn(console.info.bind(console), className), + // eslint-disable-next-line no-console warn: CoreLogger.prepareLogFn(console.warn.bind(console), className), + // eslint-disable-next-line no-console debug: CoreLogger.prepareLogFn(console.debug.bind(console), className), + // eslint-disable-next-line no-console error: CoreLogger.prepareLogFn(console.error.bind(console), className), }; } @@ -87,4 +93,4 @@ export class CoreLogger { /** * Log function type. */ -type LogFunction = (...data: any[]) => void; +type LogFunction = (...data: unknown[]) => void; diff --git a/tsconfig.app.json b/tsconfig.app.json index fbd55f0be..f1fa53ec4 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -29,6 +29,7 @@ "src/**/*.d.ts" ], "exclude": [ - "src/**/*.test.ts" + "src/**/*.test.ts", + "src/tests/**" ] } diff --git a/tsconfig.json b/tsconfig.json index 8c35fe279..5e452a9cf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,6 +17,10 @@ "es2018", "dom" ], + "types": [ + "jest", + "node" + ], "paths": { "@/*": ["*"], "@addon/*": ["app/addon/*"],