webpack-validator
Version:
Validate your webpack config with joi
204 lines (142 loc) • 5.93 kB
JavaScript
'use strict';
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _joi = require('joi');
var _joi2 = _interopRequireDefault(_joi);
var _chalk = require('chalk');
var _chalk2 = _interopRequireDefault(_chalk);
var _module = require('./properties/module');
var _module2 = _interopRequireDefault(_module);
var _entry = require('./properties/entry');
var _entry2 = _interopRequireDefault(_entry);
var _context = require('./properties/context');
var _context2 = _interopRequireDefault(_context);
var _devtool = require('./properties/devtool');
var _devtool2 = _interopRequireDefault(_devtool);
var _externals = require('./properties/externals');
var _externals2 = _interopRequireDefault(_externals);
var _node = require('./properties/node');
var _node2 = _interopRequireDefault(_node);
var _plugins = require('./properties/plugins');
var _plugins2 = _interopRequireDefault(_plugins);
var _resolve = require('./properties/resolve');
var _resolve2 = _interopRequireDefault(_resolve);
var _output = require('./properties/output');
var _output2 = _interopRequireDefault(_output);
var _watchOptions = require('./properties/watchOptions');
var _watchOptions2 = _interopRequireDefault(_watchOptions);
var _devServer = require('./properties/devServer');
var _devServer2 = _interopRequireDefault(_devServer);
var _performance = require('./properties/performance');
var _performance2 = _interopRequireDefault(_performance);
var _types = require('./types');
var _merge2 = require('lodash/merge');
var _merge3 = _interopRequireDefault(_merge2);
var _shelljs = require('shelljs');
var _shelljs2 = _interopRequireDefault(_shelljs);
var _semver = require('semver');
var _semver2 = _interopRequireDefault(_semver);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
_shelljs2.default.config.silent = true;
var defaultSchemaOptions = {
rules: {
'no-root-files-node-modules-nameclash': true,
'loader-enforce-include-or-exclude': false,
'loader-prefer-include': false
}
};
function makeSchema(schemaOptions, schemaExtension) {
var resolveSchema = (0, _resolve2.default)(schemaOptions);
var moduleSchema = (0, _module2.default)(schemaOptions);
var schema = _joi2.default.object({
amd: _joi2.default.object(),
bail: _joi2.default.boolean(),
cache: _joi2.default.boolean(),
context: _context2.default,
debug: _joi2.default.boolean(),
devServer: _devServer2.default,
devtool: _devtool2.default,
entry: _entry2.default,
externals: _externals2.default,
loader: _joi2.default.any(), // ?
module: moduleSchema,
node: _node2.default,
output: _output2.default,
plugins: _plugins2.default,
profile: _joi2.default.boolean(),
progress: _joi2.default.boolean(),
recordsInputPath: _types.looksLikeAbsolutePath,
recordsOutputPath: _types.looksLikeAbsolutePath,
recordsPath: _types.looksLikeAbsolutePath,
resolve: resolveSchema,
resolveLoader: resolveSchema.concat(_joi2.default.object({
moduleTemplates: _joi2.default.array().items(_joi2.default.string())
})),
watch: _joi2.default.boolean(),
watchOptions: _watchOptions2.default,
performance: _performance2.default,
stats: _joi2.default.any(), // TODO
target: _joi2.default.any(), // TODO
// Plugins
postcss: _joi2.default.any(),
eslint: _joi2.default.any(),
tslint: _joi2.default.any(),
metadata: _joi2.default.any()
});
return schemaExtension ? schema.concat(schemaExtension) : schema;
}
function throwForWebpack2() {
var cwd = process.cwd();
var satisifies = true;
try {
var webpackPackagePath = _path2.default.join(cwd, 'node_modules', 'webpack', 'package.json');
var _require = require(webpackPackagePath),
version = _require.version;
satisifies = _semver2.default.satisfies(version, '^1.x');
} catch (error) {
// ignore...
}
if (!satisifies) {
throw new Error('It looks like you\'re using version 2 or greater of webpack. ' + 'The official release of 2 of webpack was released with built-in validation. ' + 'So webpack-validator does not support that version. ' + 'Please uninstall webpack-validator and remove it from your project!');
}
}
function validate(config) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var returnValidation = options.returnValidation,
overrideSchema = options.schema,
schemaExtension = options.schemaExtension,
rules = options.rules;
throwForWebpack2();
var schemaOptions = (0, _merge3.default)(defaultSchemaOptions, { rules: rules });
var schema = overrideSchema || makeSchema(schemaOptions, schemaExtension);
var validationResult = _joi2.default.validate(config, schema, { abortEarly: false });
validationResult.schemaOptions = schemaOptions; // Mainly for having sth to assert on right now
if (returnValidation) return validationResult;
if (validationResult.error) {
console.error(validationResult.error.annotate());
process.exit(1);
}
return config;
}
module.exports = validate;
// Easier consumability for require (default use case for non-transpiled webpack configs)
function validateRoot(config) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var quiet = options.quiet;
var validationResult = void 0,
multiValidationResults = void 0;
if (Array.isArray(config)) {
multiValidationResults = [];
config.forEach(function (cfg) {
multiValidationResults.push(validate(cfg, options));
});
} else {
validationResult = validate(config, options);
}
if (!quiet) {
console.info(_chalk2.default.green('[webpack-validator] Config is valid.'));
}
return validationResult || multiValidationResults;
}
module.exports.validateRoot = validateRoot;
module.exports.Joi = _joi2.default;