Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@skava/bs / src / scripts / bundle / webpackConfigFactory.ts
Size: Mime:
/* eslint complexity: "OFF" */
/* eslint max-statements: "OFF" */
import { config } from '@skava/di'
import { plugins } from '../.plugins'
import {
  Configuration,
  BuildOptions,
  ConfigFactoryOptions,
} from '../../typings'
import { PROPERTIES as buildPreferences } from '../../config/oneConfig'
import { fromBuildOptionsToParams } from './fromBuildOptionsToParams'
import { fromBuildOptionsToPaths } from './fromBuildOptionsToPaths'

/** mutates... */
function decorateConfig(buildOptions: ConfigFactoryOptions): void {
  const options = buildOptions as BuildOptions
  options.client = options.bundles.client
  options.server = options.bundles.server

  // log.quick(options)
  // This is either our "server" or "client" bundle.
  // Otherwise it must be an additional node bundle.
  options.bundleConfig = options.isServer
    ? options.bundles.server
    : options.isClient
      ? options.bundles.client
      : undefined

  fromBuildOptionsToPaths(options)
}

// https://github.com/tessin/tessin-mini/blob/master/webpack/ManifestPlugin.js#L1
// https://github.com/tessin/tessin-mini/blob/master/webpack/webpack.config.js
function webpackConfigFactory(
  someBuildOptions: ConfigFactoryOptions
): Configuration {
  const buildOptions = {
    ...buildPreferences,
    ...fromBuildOptionsToParams(someBuildOptions),
  }

  console.log('buildOptions: ', buildOptions)
  decorateConfig(buildOptions)

  const { target, isClient, isDev } = buildOptions

  const webpackConfig: Configuration = {
    watch: undefined,
    mode: undefined,

    // Define our entry chunks for our bundle.
    entry: {},

    // Bundle output configuration.
    output: {},

    target: isClient ? 'web' : 'node',

    node: {},

    devtool: false,

    performance: {},

    resolve: {},

    externals: [],

    plugins: [],
    module: {
      rules: [],
    },
  }

  /**
   * @todo add a `before` & `after` instead?
   */
  if (config.has('buildSystemConfig') === true) {
    const tap = config.get('buildSystemConfig')
    tap(webpackConfig, buildOptions)
  }

  plugins.forEach((plugin, key) => {
    plugin(webpackConfig, buildOptions)
  })

  if (config.has('buildSystemConfig') === true) {
    const tap = config.get('buildSystemConfig')
    tap(webpackConfig, buildOptions)
  }

  // Apply the configuration middleware.
  return webpackConfig
}

export { webpackConfigFactory }