From 64d0013690a83a6f949606cb4b626ca3fdc81104 Mon Sep 17 00:00:00 2001 From: Brendan Kenny Date: Tue, 19 Jun 2018 17:38:47 -0700 Subject: [PATCH] core(tsc): use Config class to define Config type --- lighthouse-core/config/config.js | 41 ++++++++++++++++++-------------- lighthouse-core/runner.js | 7 +++--- tsconfig.json | 1 + typings/config.d.ts | 11 --------- 4 files changed, 28 insertions(+), 32 deletions(-) diff --git a/lighthouse-core/config/config.js b/lighthouse-core/config/config.js index 73b18cf85fcd..05e476164ae4 100644 --- a/lighthouse-core/config/config.js +++ b/lighthouse-core/config/config.js @@ -20,8 +20,8 @@ const Runner = require('../runner'); /** @typedef {InstanceType} Gatherer */ /** - * @param {LH.Config['passes']} passes - * @param {LH.Config['audits']} audits + * @param {Config['passes']} passes + * @param {Config['audits']} audits */ function validatePasses(passes, audits) { if (!Array.isArray(passes)) { @@ -54,9 +54,9 @@ function validatePasses(passes, audits) { } /** - * @param {LH.Config['categories']} categories - * @param {LH.Config['audits']} audits - * @param {LH.Config['groups']} groups + * @param {Config['categories']} categories + * @param {Config['audits']} audits + * @param {Config['groups']} groups */ function validateCategories(categories, audits, groups) { if (!categories) { @@ -303,6 +303,7 @@ const mergeOptionsOfItems = (function(items) { class Config { /** * @constructor + * @implements {LH.Config.Json} * @param {LH.Config.Json=} configJSON * @param {LH.Flags=} flags */ @@ -340,21 +341,25 @@ class Config { Config.adjustDefaultPassForThrottling(settings, passesWithDefaults); const passes = Config.requireGatherers(passesWithDefaults, configDir); - /** @type {LH.Config['settings']} */ + /** @type {LH.Config.Settings} */ this.settings = settings; - /** @type {LH.Config['passes']} */ + /** @type {?Array} */ this.passes = passes; - /** @type {LH.Config['audits']} */ + /** @type {?Array} */ this.audits = Config.requireAudits(configJSON.audits, configDir); - /** @type {LH.Config['categories']} */ + /** @type {?Record} */ this.categories = configJSON.categories || null; - /** @type {LH.Config['groups']} */ + /** @type {?Record} */ this.groups = configJSON.groups || null; Config.filterConfigIfNeeded(this); validatePasses(this.passes, this.audits); validateCategories(this.categories, this.audits, this.groups); + + // TODO(bckenny): until tsc adds @implements support, assert that Config is a ConfigJson. + /** @type {LH.Config.Json} */ + const configJson = this; // eslint-disable-line no-unused-vars } /** @@ -535,9 +540,9 @@ class Config { /** * Filter out any unrequested categories or audits from the categories object. - * @param {LH.Config['categories']} oldCategories + * @param {Config['categories']} oldCategories * @param {LH.Config.Settings} settings - * @return {{categories: LH.Config['categories'], requestedAuditNames: Set}} + * @return {{categories: Config['categories'], requestedAuditNames: Set}} */ static filterCategoriesAndAudits(oldCategories, settings) { if (!oldCategories) { @@ -548,7 +553,7 @@ class Config { throw new Error('Cannot set both skipAudits and onlyAudits'); } - /** @type {NonNullable} */ + /** @type {NonNullable} */ const categories = {}; const filterByIncludedCategory = !!settings.onlyCategories; const filterByIncludedAudit = !!settings.onlyAudits; @@ -630,7 +635,7 @@ class Config { /** * From some requested audits, return names of all required artifacts - * @param {LH.Config['audits']} audits + * @param {Config['audits']} audits * @return {Set} */ static getGatherersNeededByAudits(audits) { @@ -648,9 +653,9 @@ class Config { /** * Filters to only required passes and gatherers, returning a new passes array. - * @param {LH.Config['passes']} passes + * @param {Config['passes']} passes * @param {Set} requiredGatherers - * @return {LH.Config['passes']} + * @return {Config['passes']} */ static generatePassesNeededByGatherers(passes, requiredGatherers) { if (!passes) { @@ -689,7 +694,7 @@ class Config { * leaving only an array of AuditDefns. * @param {LH.Config.Json['audits']} audits * @param {string=} configPath - * @return {LH.Config['audits']} + * @return {Config['audits']} */ static requireAudits(audits, configPath) { const expandedAudits = Config.expandAuditShorthand(audits); @@ -758,7 +763,7 @@ class Config { * provided) using `Runner.resolvePlugin`, returning an array of full Passes. * @param {?Array>} passes * @param {string=} configPath - * @return {LH.Config['passes']} + * @return {Config['passes']} */ static requireGatherers(passes, configPath) { if (!passes) { diff --git a/lighthouse-core/runner.js b/lighthouse-core/runner.js index f71a81c4a333..8c6addaabcdd 100644 --- a/lighthouse-core/runner.js +++ b/lighthouse-core/runner.js @@ -18,12 +18,13 @@ const URL = require('./lib/url-shim'); const Sentry = require('./lib/sentry'); const generateReport = require('./report/report-generator').generateReport; -const Connection = require('./gather/connections/connection.js'); // eslint-disable-line no-unused-vars +/** @typedef {import('./gather/connections/connection.js')} Connection */ +/** @typedef {import('./config/config.js')} Config */ class Runner { /** * @param {Connection} connection - * @param {{config: LH.Config, url?: string, driverMock?: Driver}} opts + * @param {{config: Config, url?: string, driverMock?: Driver}} opts * @return {Promise} */ static async run(connection, opts) { @@ -145,7 +146,7 @@ class Runner { /** * Establish connection, load page and collect all required artifacts * @param {string} requestedUrl - * @param {{config: LH.Config, driverMock?: Driver}} runnerOpts + * @param {{config: Config, driverMock?: Driver}} runnerOpts * @param {Connection} connection * @return {Promise} */ diff --git a/tsconfig.json b/tsconfig.json index 1a9dfd707c90..b9554356d120 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,6 +7,7 @@ "checkJs": true, "strict": true, // "listFiles": true, + // "noErrorTruncation": true, "typeRoots": [ "@types", "./typings" diff --git a/typings/config.d.ts b/typings/config.d.ts index 60be463abfe4..9cb6b692d179 100644 --- a/typings/config.d.ts +++ b/typings/config.d.ts @@ -9,17 +9,6 @@ import Audit = require('../lighthouse-core/audits/audit.js'); declare global { module LH { - /** - * The full, normalized Lighthouse Config. - */ - export interface Config extends Config.Json { - settings: Config.Settings; - passes: Config.Pass[] | null; - audits: Config.AuditDefn[] | null; - categories: Record | null; - groups: Record | null; - } - module Config { /** * The pre-normalization Lighthouse Config format.