UNPKG

dvan

Version:

Check out https://dvan.js.org

121 lines (111 loc) 3.13 kB
const { struct } = require('superstruct') const getFileNames = require('./getFileNames') module.exports = (api, config) => { api.logger.debug('Validating config', config) const entry = struct.optional( struct.union(['string', 'array', 'object']), 'index' ) const srcDir = struct('string', 'src') const html = struct.optional( struct.union(['boolean', 'object']), struct.interface( { title: struct.optional('string'), meta: struct.optional(struct.union(['array', 'object'])) }, {} ) ) const output = struct( { dir: 'string', sourceMap: 'boolean', minimize: 'boolean', publicUrl: 'string', clean: 'boolean', format: struct.enum(['iife', 'umd', 'cjs']), moduleName: struct.optional('string'), fileNames: struct.optional( struct.object({ js: struct.optional('string'), css: struct.optional('string'), font: struct.optional('string'), image: struct.optional('string'), video: struct.optional('string') }) ), html }, { dir: 'dist', sourceMap: !api.isProd, minimize: api.isProd, publicUrl: '/', clean: true, format: 'iife' } ) const publicFolder = struct('string', 'public') const plugins = struct('array', []) const constants = struct('object', {}) const devServer = struct.interface( { hot: 'boolean', host: 'string', port: struct.union(['number', 'string']), hotEntries: struct(['string']), https: struct.optional(struct.union(['boolean', 'object'])), before: struct.optional('function'), after: struct.optional('function'), open: 'boolean', historyApiFallback: struct.optional(struct.union(['boolean', 'object'])) }, { hot: true, // Cloud IDEs use envs host: process.env.HOST || '0.0.0.0', port: process.env.PORT || 4000, hotEntries: ['index'], open: false } ) const extractCss = struct('boolean', api.isProd) const jsx = struct.optional(struct.union(['boolean', 'string']), false) const loaderOptions = struct('object', {}) const evergreen = struct('boolean', false) // Build pipeline const configureWebpack = struct.optional(struct.union(['object', 'function'])) const chainWebpack = struct.optional('function') const Struct = struct({ entry, srcDir, output, publicFolder, plugins, constants, devServer, extractCss, jsx, loaderOptions, evergreen, configureWebpack, chainWebpack, // Config file path configPath: struct.optional('string') }) const [err, res] = Struct.validate(config) if (err) throw err res.output.fileNames = Object.assign( getFileNames({ useHash: api.isProd, format: res.output.format }), res.output.fileNames ) // Ensure publicUrl res.output.publicUrl = res.output.publicUrl // Must end with slash .replace(/\/?$/, '/') // Remove leading ./ .replace(/^\.\//, '') api.logger.debug('Validated config', res) return res }