/* eslint no-prototype-builtins: 0 */ 'use strict' const chalk = require('chalk') const format = require('stringify-object') const debug = require('debug')('lint-staged:cfg') const TEST_DEPRECATED_KEYS = new Map([ ['concurrent', (key) => typeof key === 'boolean'], ['chunkSize', (key) => typeof key === 'number'], ['globOptions', (key) => typeof key === 'object'], ['linters', (key) => typeof key === 'object'], ['ignore', (key) => Array.isArray(key)], ['subTaskConcurrency', (key) => typeof key === 'number'], ['renderer', (key) => typeof key === 'string'], ['relative', (key) => typeof key === 'boolean'], ]) const formatError = (helpMsg) => `● Validation Error: ${helpMsg} Please refer to https://github.com/okonet/lint-staged#configuration for more information...` const createError = (opt, helpMsg, value) => formatError(`Invalid value for '${chalk.bold(opt)}'. ${helpMsg}. Configured value is: ${chalk.bold( format(value, { inlineCharacterLimit: Number.POSITIVE_INFINITY }) )}`) /** * Runs config validation. Throws error if the config is not valid. * @param config {Object} * @returns config {Object} */ module.exports = function validateConfig(config) { debug('Validating config') const errors = [] if (!config || typeof config !== 'object') { errors.push('Configuration should be an object!') } else { const entries = Object.entries(config) if (entries.length === 0) { errors.push('Configuration should not be empty!') } entries.forEach(([pattern, task]) => { if (TEST_DEPRECATED_KEYS.has(pattern)) { const testFn = TEST_DEPRECATED_KEYS.get(pattern) if (testFn(task)) { errors.push( createError( pattern, 'Advanced configuration has been deprecated. For more info, please visit: https://github.com/okonet/lint-staged', task ) ) } } if ( (!Array.isArray(task) || task.some((item) => typeof item !== 'string' && typeof item !== 'function')) && typeof task !== 'string' && typeof task !== 'function' ) { errors.push( createError( pattern, 'Should be a string, a function, or an array of strings and functions', task ) ) } }) } if (errors.length) { throw new Error(errors.join('\n')) } return config } module.exports.createError = createError