vite#mergeConfig JavaScript Examples

The following examples show how to use vite#mergeConfig. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: index.js    From vitedge with MIT License 4 votes vote down vote up
export default async function ({
  mode = 'production',
  ssr,
  watch,
  entry,
  worker,
  ...workerFlags
} = {}) {
  const { config: viteConfig, rootDir } = await getProjectInfo(mode)
  const {
    getFramework,
    pluginOptions: {
      fnsOptions = {},
      workerOptions = {},
      clientOptions = {},
      ssrOptions = {},
    },
  } = viteConfig.plugins.find((plugin) => plugin.name === 'vitedge') || {}

  const { getPropsHandlerNames } = await buildFunctions({
    mode,
    watch,
    root: rootDir,
    fnsInputPath: path.resolve(rootDir, fnsInDir),
    fnsOutputPath: path.resolve(rootDir, outDir),
    fileName: fnsOutFile,
    options: fnsOptions,
  })

  const sep = '|'
  const plugins = [
    {
      name: 'vitedge-props-replacer',
      transform(code, id) {
        // Use `transform` hook for replacing variables because `config`
        // hook is not retriggered on watcher events.
        if (id.endsWith('/vitedge/utils/props.js')) {
          watch && this.addWatchFile(path.resolve(rootDir, outDir, fnsOutFile))
          return code.replace(
            'globalThis.__AVAILABLE_PROPS_ENDPOINTS__',
            JSON.stringify(sep + getPropsHandlerNames().join(sep) + sep)
          )
        }
      },
    },
  ]

  await buildSSR({
    clientOptions: mergeConfig(
      {
        mode,
        plugins,
        build: {
          watch,
          outDir: path.resolve(rootDir, outDir, clientOutDir),
        },
      },
      clientOptions
    ),
    serverOptions: mergeConfig(
      {
        mode,
        ssr: { target: 'webworker' },
        plugins,
        build: {
          ssr,
          outDir: path.resolve(rootDir, outDir, ssrOutDir),
          target: 'es2019', // Support Node 12
          rollupOptions: {
            output: {
              format: 'es',
            },
          },
        },
        packageJson: {
          type: 'module',
          vitedge: {
            commitHash: getCommitHash(),
          },
        },
      },
      ssrOptions
    ),
  })

  if (getFramework() === 'react') {
    // FIXME This is a workaround related to @vite/plugin-react and type:module
    const ssrDistDirectory = path.resolve(rootDir, outDir, ssrOutDir)
    const require = createRequire(import.meta.url)
    const packageJson = require(path.join(ssrDistDirectory, 'package.json'))
    const serverBundlePath = path.join(ssrDistDirectory, packageJson.main)

    const serverBundle = await fs.readFile(serverBundlePath, 'utf-8')
    await fs.writeFile(
      serverBundlePath,
      serverBundle
        .replace('"react/jsx-runtime"', '"react/jsx-runtime.js"')
        .replace('"react-router-dom/server"', '"react-router-dom/server.js"'),
      'utf-8'
    )
  }

  if (entry === undefined || entry === true) {
    const defaultEntry = lookupFile({
      dir: path.resolve(rootDir, fnsInDir),
      formats: ['js', 'ts', 'mjs'].map((ext) => 'index.' + ext),
      pathOnly: true,
      bubble: false,
    })

    entry = defaultEntry || false
  }

  if (entry) {
    const wranglerConfig = await getWranglerConfig(viteConfig)
    const isWorker = !!(worker || wranglerConfig)

    if (isWorker && wranglerConfig.type !== 'javascript') {
      // Do not build script when using Webpack
      return
    }

    await buildWorker({
      ...workerFlags,
      watch,
      esbuildOptions: workerOptions.build,
      inputPath: entry,
      viteConfig,
      platform: isWorker ? 'worker' : 'node',
      fileName: isWorker ? workerOutFile : nodeOutFile,
      outputPath: isWorker ? path.join(outDir, workerOutDir) : outDir,
    })
  }
}