Index: imaps-frontend/node_modules/@humanwhocodes/config-array/api.js
===================================================================
--- imaps-frontend/node_modules/@humanwhocodes/config-array/api.js	(revision d56544918790c0c3bc50f2f0a98c99f3d2988ccf)
+++ imaps-frontend/node_modules/@humanwhocodes/config-array/api.js	(revision 79a03170cdde4e801d12257ee86723774970427b)
@@ -155,5 +155,79 @@
 const CONFIG_TYPES = new Set(['array', 'function']);
 
+/**
+ * Fields that are considered metadata and not part of the config object.
+ */
+const META_FIELDS = new Set(['name']);
+
 const FILES_AND_IGNORES_SCHEMA = new objectSchema.ObjectSchema(filesAndIgnoresSchema);
+
+/**
+ * Wrapper error for config validation errors that adds a name to the front of the
+ * error message.
+ */
+class ConfigError extends Error {
+
+	/**
+	 * Creates a new instance.
+	 * @param {string} name The config object name causing the error.
+	 * @param {number} index The index of the config object in the array.
+	 * @param {Error} source The source error. 
+	 */
+	constructor(name, index, { cause, message }) {
+
+
+		const finalMessage = message || cause.message;
+
+		super(`Config ${name}: ${finalMessage}`, { cause });
+
+		// copy over custom properties that aren't represented
+		if (cause) {
+			for (const key of Object.keys(cause)) {
+				if (!(key in this)) {
+					this[key] = cause[key];
+				}
+			}
+		}
+
+		/**
+		 * The name of the error.
+		 * @type {string}
+		 * @readonly
+		 */
+		this.name = 'ConfigError';
+
+		/**
+		 * The index of the config object in the array.
+		 * @type {number}
+		 * @readonly
+		 */
+		this.index = index;
+	}
+}
+
+/**
+ * Gets the name of a config object.
+ * @param {object} config The config object to get the name of.
+ * @returns {string} The name of the config object.
+ */ 
+function getConfigName(config) {
+	if (config && typeof config.name === 'string' && config.name) {
+		return `"${config.name}"`;
+	}
+
+	return '(unnamed)';
+}
+
+/**
+ * Rethrows a config error with additional information about the config object.
+ * @param {object} config The config object to get the name of. 
+ * @param {number} index The index of the config object in the array.
+ * @param {Error} error The error to rethrow.
+ * @throws {ConfigError} When the error is rethrown for a config.
+ */
+function rethrowConfigError(config, index, error) {
+	const configName = getConfigName(config);
+	throw new ConfigError(configName, index, error);
+}
 
 /**
@@ -167,21 +241,41 @@
 
 /**
- * Asserts that the files and ignores keys of a config object are valid as per base schema.
- * @param {object} config The config object to check.
+ * Creates a function that asserts that the config is valid
+ * during normalization. This checks that the config is not nullish
+ * and that files and ignores keys  of a config object are valid as per base schema.
+ * @param {Object} config The config object to check.
+ * @param {number} index The index of the config object in the array.
  * @returns {void}
- * @throws {TypeError} If the files and ignores keys of a config object are not valid.
- */
-function assertValidFilesAndIgnores(config) {
-	if (!config || typeof config !== 'object') {
-		return;
-	}
+ * @throws {ConfigError} If the files and ignores keys of a config object are not valid.
+ */
+function assertValidBaseConfig(config, index) {
+
+	if (config === null) {
+		throw new ConfigError(getConfigName(config), index, { message: 'Unexpected null config.' });
+	}
+
+	if (config === undefined) {
+		throw new ConfigError(getConfigName(config), index, { message: 'Unexpected undefined config.' });
+	}
+
+	if (typeof config !== 'object') {
+		throw new ConfigError(getConfigName(config), index, { message: 'Unexpected non-object config.' });
+	}
+
 	const validateConfig = { };
+	
 	if ('files' in config) {
 		validateConfig.files = config.files;
 	}
+	
 	if ('ignores' in config) {
 		validateConfig.ignores = config.ignores;
 	}
-	FILES_AND_IGNORES_SCHEMA.validate(validateConfig);
+
+	try {
+		FILES_AND_IGNORES_SCHEMA.validate(validateConfig);
+	} catch (validationError) {
+		rethrowConfigError(config, index, { cause: validationError });
+	}
 }
 
@@ -378,5 +472,5 @@
 	const relativeFilePath = path.relative(basePath, filePath);
 
-	return Object.keys(config).length > 1 &&
+	return Object.keys(config).filter(key => !META_FIELDS.has(key)).length > 1 &&
 		!shouldIgnorePath(config.ignores, filePath, relativeFilePath);
 }
@@ -512,5 +606,5 @@
 		 * Tracks if the array has been normalized.
 		 * @property isNormalized
-		 * @type boolean
+		 * @type {boolean}
 		 * @private
 		 */
@@ -531,5 +625,5 @@
 		 * This is used to calculate filename matches.
 		 * @property basePath
-		 * @type string
+		 * @type {string}
 		 */
 		this.basePath = basePath;
@@ -540,5 +634,5 @@
 		 * The supported config types.
 		 * @property configTypes
-		 * @type Array<string>
+		 * @type {Array<string>}
 		 */
 		this.extraConfigTypes = Object.freeze([...extraConfigTypes]);
@@ -547,5 +641,5 @@
 		 * A cache to store calculated configs for faster repeat lookup.
 		 * @property configCache
-		 * @type Map
+		 * @type {Map<string, Object>}
 		 * @private
 		 */
@@ -646,5 +740,5 @@
 			 * are additional keys, then ignores act like exclusions.
 			 */
-			if (config.ignores && Object.keys(config).length === 1) {
+			if (config.ignores && Object.keys(config).filter(key => !META_FIELDS.has(key)).length === 1) {
 				result.push(...config.ignores);
 			}
@@ -678,5 +772,5 @@
 			this.length = 0;
 			this.push(...normalizedConfigs.map(this[ConfigArraySymbol.preprocessConfig].bind(this)));
-			this.forEach(assertValidFilesAndIgnores);
+			this.forEach(assertValidBaseConfig);
 			this[ConfigArraySymbol.isNormalized] = true;
 
@@ -700,5 +794,5 @@
 			this.length = 0;
 			this.push(...normalizedConfigs.map(this[ConfigArraySymbol.preprocessConfig].bind(this)));
-			this.forEach(assertValidFilesAndIgnores);
+			this.forEach(assertValidBaseConfig);
 			this[ConfigArraySymbol.isNormalized] = true;
 
@@ -933,5 +1027,9 @@
 
 		finalConfig = matchingConfigIndices.reduce((result, index) => {
-			return this[ConfigArraySymbol.schema].merge(result, this[index]);
+			try {
+				return this[ConfigArraySymbol.schema].merge(result, this[index]);
+			} catch (validationError) {
+				rethrowConfigError(this[index], index, { cause: validationError});
+			}
 		}, {}, this);
 
