UNPKG

vike

Version:

The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.

188 lines (187 loc) 8.6 kB
export { pluginCommon }; import { assert, assertUsage, assertWarning, findPackageJson, hasProp, isDevCheck, isDocker, isObject, isVitest, } from '../utils.js'; import { assertRollupInput } from './pluginBuild/pluginBuildConfig.js'; import { installRequireShim_setUserRootDir } from '@brillout/require-shim'; import pc from '@brillout/picocolors'; import path from 'node:path'; import { assertResolveAlias } from './pluginCommon/assertResolveAlias.js'; import { isViteCliCall } from '../shared/isViteCliCall.js'; import { isVikeCliOrApi } from '../../api/context.js'; import { getVikeConfigInternal, setVikeConfigContext } from '../shared/resolveVikeConfigInternal.js'; import { assertViteRoot, getViteRoot, normalizeViteRoot } from '../../api/prepareViteApiCall.js'; import { temp_disablePrerenderAutoRun } from '../../prerender/context.js'; const pluginName = 'vike:pluginCommon'; function pluginCommon(vikeVitePluginOptions) { return [ { name: `${pluginName}:pre`, enforce: 'pre', config: { order: 'pre', async handler(configFromUser, env) { const isDev = isDevCheck(env); const operation = env.command === 'build' ? 'build' : env.isPreview ? 'preview' : 'dev'; const rootResolvedEarly = configFromUser.root ? normalizeViteRoot(configFromUser.root) : await getViteRoot(operation); assert(rootResolvedEarly); // TODO/v1-release: we can remove setVikeConfigContext() call here since with Vike's CLI it's already called at vike/node/api/prepareViteApiCall.ts setVikeConfigContext({ userRootDir: rootResolvedEarly, isDev, vikeVitePluginOptions }); const vikeConfig = await getVikeConfigInternal(); return { _isDev: isDev, _rootResolvedEarly: rootResolvedEarly, // TODO/v1-release: remove https://github.com/vikejs/vike/issues/2122 configVikePromise: Promise.resolve({ prerender: vikeConfig.prerenderContext.isPrerenderingEnabled, }), }; }, }, }, { name: pluginName, configResolved(config) { assertViteRoot(config._rootResolvedEarly, config); assertSingleInstance(config); installRequireShim_setUserRootDir(config.root); }, }, { name: `${pluginName}:post`, enforce: 'post', configResolved: { order: 'post', async handler(config) { /* TODO: do this after implementing vike.config.js and new setting transformLinkedDependencies (or probably a better name like transpileLinkedDependencies/bundleLinkedDependencies or something else) overrideViteDefaultSsrExternal(config) //*/ workaroundCI(config); assertRollupInput(config); assertResolveAlias(config); assertEsm(config.root); assertVikeCliOrApi(config); temp_supportOldInterface(config); await emitServerEntryOnlyIfNeeded(config); }, }, config: { order: 'post', async handler(configFromUser) { let configFromVike = { server: {}, preview: {} }; const vikeConfig = await getVikeConfigInternal(); if (vikeConfig.config.port !== undefined) { // https://vike.dev/port setDefault('port', vikeConfig.config.port, configFromUser, configFromVike); } else { // Change Vite's default port setDefault('port', 3000, configFromUser, configFromVike); } if (vikeConfig.config.host) { // https://vike.dev/host setDefault('host', vikeConfig.config.host, configFromUser, configFromVike); } else if (isDocker()) { // Set `--host` for Docker/Podman setDefault('host', true, configFromUser, configFromVike); } return configFromVike; }, }, }, ]; } // Override Vite's default value without overriding user settings function setDefault(setting, value, configFromUser, configFromVike) { if (configFromUser.server?.[setting] === undefined) configFromVike.server[setting] = value; if (configFromUser.preview?.[setting] === undefined) configFromVike.preview[setting] = value; } /* import { version } from 'vite' function overrideViteDefaultSsrExternal(config: ResolvedConfig) { if (!isVersionOrAbove(version, '5.0.12')) return // @ts-ignore Not released yet: https://github.com/vitejs/vite/pull/10939/files#diff-5a3d42620df2c6b17e25f440ffdb67683dee7ef57317674d19f41d5f30502310L5 config.ssr.external ??= true } //*/ // Workaround GitHub Action failing to access the server function workaroundCI(config) { var _a, _b; if (process.env.CI) { (_a = config.server).host ?? (_a.host = true); (_b = config.preview).host ?? (_b.host = true); } } function assertEsm(userViteRoot) { const found = findPackageJson(userViteRoot); if (!found) return; const { packageJson, packageJsonPath } = found; let dir = path.posix.dirname(packageJsonPath); if (dir !== '/') { assert(!dir.endsWith('/')); dir = dir + '/'; } assert(dir.endsWith('/')); dir = pc.dim(dir); assertWarning(packageJson.type === 'module', `We recommend setting ${dir}package.json#type to "module", see https://vike.dev/CJS`, { onlyOnce: true }); } function assertSingleInstance(config) { const numberOfInstances = config.plugins.filter((o) => o.name === pluginName).length; assertUsage(numberOfInstances === 1, `Vike's Vite plugin (${pc.cyan("import vike from 'vike/plugin'")}) is being added ${numberOfInstances} times to the list of Vite plugins. Make sure to add it only once instead.`); } function assertVikeCliOrApi(config) { if (isVikeCliOrApi()) return; if (isViteCliCall()) { assert(!isVitest()); assertWarning(false, `Vite's CLI is deprecated ${pc.underline('https://vike.dev/migration/cli')}`, { onlyOnce: true, }); return; } if (isVitest()) { assertWarning(false, `Unexpected Vitest setup: you seem to be using Vitest together with Vike's Vite plugin but without using Vike's JavaScript API which is unexpected, see ${pc.underline('https://vike.dev/vitest')}`, { onlyOnce: true }); return; } if (config.server.middlewareMode) { assertWarning(false, `${pc.cyan('vite.createServer()')} is deprecated ${pc.underline('https://vike.dev/migration/cli#api')}`, { onlyOnce: true, }); return; } assertWarning(false, `Vite's JavaScript API is deprecated ${pc.underline('https://vike.dev/migration/cli#api')}`, { onlyOnce: true, }); } // TODO/v1-release: remove https://github.com/vikejs/vike/issues/2122 function temp_supportOldInterface(config) { if (!('vitePluginSsr' in config)) return; assert(isObject(config.vitePluginSsr)); if (hasProp(config.vitePluginSsr, 'prerender', 'object')) { assert(hasProp(config.vitePluginSsr.prerender, 'disableAutoRun', 'boolean')); if (config.vitePluginSsr.prerender.disableAutoRun) { temp_disablePrerenderAutoRun(); } return; } if (hasProp(config.vitePluginSsr, 'disableAutoFullBuild')) { if (config.vitePluginSsr.disableAutoFullBuild) { assert(config.vitePluginSsr.disableAutoFullBuild === 'prerender'); temp_disablePrerenderAutoRun(); } return; } assert(false); } // Only emit dist/server/entry.mjs if necessary async function emitServerEntryOnlyIfNeeded(config) { const vikeConfig = await getVikeConfigInternal(); if (config.vitePluginServerEntry?.inject && !vikeConfig.prerenderContext.isPrerenderingEnabled) { config.vitePluginServerEntry.disableServerEntryEmit = true; } }