vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
124 lines (123 loc) • 6.6 kB
JavaScript
import './assertEnvVite.js';
export default plugin;
export { plugin };
// TO-DO/next-major-release: remove
export { plugin as ssr };
export { getVikeConfig } from './shared/resolveVikeConfigInternal.js';
export { PROJECT_VERSION as version } from '../../utils/PROJECT_VERSION.js';
import { getClientEntrySrcDev } from './shared/getClientEntrySrcDev.js';
import { setGetClientEntrySrcDev } from '../../server/runtime/renderPageServer/getPageAssets/retrievePageAssetsDev.js';
import { assertIsNotProductionRuntime } from '../../utils/assertSetup.js';
import { assertUsage } from '../../utils/assert.js';
import { isVitest } from '../../utils/isVitest.js';
import pc from '@brillout/picocolors';
import { pluginPreview } from './plugins/pluginPreview.js';
import { pluginDev } from './plugins/pluginDev.js';
import { pluginVirtualFiles } from './plugins/pluginVirtualFiles.js';
import { pluginExtractAssets } from './plugins/pluginExtractAssets.js';
import { pluginExtractExportNames } from './plugins/pluginExtractExportNames.js';
import { pluginSetGlobalContext } from './plugins/pluginSetGlobalContext.js';
import { pluginCommon } from './plugins/pluginCommon.js';
import { pluginBaseUrls } from './plugins/pluginBaseUrls.js';
import { pluginReplaceConstantsEnvVars } from './plugins/pluginReplaceConstantsEnvVars.js';
import { pluginAssertFileEnv } from './plugins/pluginAssertFileEnv.js';
import { pluginWorkaroundCssModuleHmr } from './plugins/pluginWorkaroundCssModuleHmr.js';
import { pluginWorkaroundVite6HmrRegression } from './plugins/pluginWorkaroundVite6HmrRegression.js';
import { pluginReplaceConstantsPageContext } from './plugins/pluginReplaceConstantsPageContext.js';
import { pluginReplaceConstantsGlobalThis } from './plugins/pluginReplaceConstantsGlobalThis.js';
import { pluginStaticReplace } from './plugins/pluginStaticReplace.js';
import { pluginViteRPC } from './plugins/non-runnable-dev/pluginViteRPC.js';
import { pluginBuildApp } from './plugins/build/pluginBuildApp.js';
import { pluginDistPackageJsonFile } from './plugins/build/pluginDistPackageJsonFile.js';
import { pluginSuppressRollupWarning } from './plugins/build/pluginSuppressRollupWarning.js';
import { pluginDistFileNames } from './plugins/build/pluginDistFileNames.js';
import { pluginProdBuildEntry } from './plugins/build/pluginProdBuildEntry.js';
import { pluginBuildConfig } from './plugins/build/pluginBuildConfig.js';
import { pluginModuleBanner } from './plugins/build/pluginModuleBanner.js';
import { pluginReplaceConstantsNonRunnableDev } from './plugins/non-runnable-dev/pluginReplaceConstantsNonRunnableDev.js';
import { isVikeCliOrApi } from '../../shared-server-node/api-context.js';
import { pluginViteConfigVikeExtensions } from './plugins/pluginViteConfigVikeExtensions.js';
import { getVikeConfigInternalEarly, isOnlyResolvingUserConfig } from '../api/resolveViteConfigFromUser.js';
// We don't call this in ./onLoad.ts to avoid a cyclic dependency with utils.ts
setGetClientEntrySrcDev(getClientEntrySrcDev);
assertIsNotProductionRuntime();
// Return `PluginInterop` instead of `Plugin` to avoid type mismatch upon different Vite versions
function plugin(vikeVitePluginOptions = {}) {
const promise = (async () => {
if (skip())
return [];
const vikeConfig = await getVikeConfigInternalEarly();
const plugins = [
...pluginCommon(vikeVitePluginOptions),
...pluginVirtualFiles(),
...pluginDev(),
...pluginBuild(),
...pluginPreview(),
...pluginExtractAssets(),
...pluginExtractExportNames(),
...pluginSetGlobalContext(),
...pluginBaseUrls(),
...pluginReplaceConstantsEnvVars(),
...pluginAssertFileEnv(),
...pluginWorkaroundCssModuleHmr(),
...pluginWorkaroundVite6HmrRegression(),
...pluginReplaceConstantsPageContext(),
...pluginReplaceConstantsGlobalThis(),
...pluginStaticReplace(vikeConfig),
...pluginNonRunnabeDev(),
...(await pluginViteConfigVikeExtensions(vikeConfig)),
];
return plugins;
})();
Object.assign(promise, { _vikeVitePluginOptions: vikeVitePluginOptions });
return promise;
}
function pluginBuild() {
return [
...pluginBuildConfig(),
...pluginBuildApp(),
...pluginProdBuildEntry(),
...pluginDistPackageJsonFile(),
...pluginSuppressRollupWarning(),
...pluginDistFileNames(),
...pluginModuleBanner(),
];
}
function pluginNonRunnabeDev() {
return [...pluginViteRPC(), ...pluginReplaceConstantsNonRunnableDev()];
}
function skip() {
// Early resolving of user Vite configs
if (isOnlyResolvingUserConfig()) {
return true;
}
// For Vitest, we only add Vike's Vite plugin if Vike's JavaScript API is used.
// - In the context of running unit tests with Vitest, Vike's Vite plugin doesn't add any value AFAICT.
// - If the user calls Vike's JavaScript API inside Vitest (e.g. `build()` inside `beforeAll()`) => vite.config.js is loaded twice: once by Vitest and once by Vike => problematic because Vitest's environment is `development` whereas Vike's `build()` environment is `production` => the globalContext.ts isProd() function throws an assertion fail (I don't know why the two globalContext.ts instances aren't independent from each other) => that's why we skip Vike's Vite plugin when it's Vitest that loads vite.config.js
// - When calling `$ vitest` Vitest loads vite.config.js if it lives at process.cwd()
// - The user is supposed to use Vike's API instead of Vite's API. Vike supports Vite's API only for third parties (e.g. Vitest or Storybook).
// - https://vike.dev/vitest
if (
/* Maybe also all third party tools such as Storybook?
!isViteCli() &&
/*/
isVitest() &&
///*/
!isVikeCliOrApi()) {
return true;
}
return false;
}
// Error upon wrong usage
Object.defineProperty(plugin, 'apply', {
enumerable: true,
get: () => {
assertUsage(false, `Add ${pc.cyan('vike()')} instead of ${pc.cyan('vike')} to vite.config.js#plugins (i.e. call the function and add the return value instead of adding the function itself)`, { showStackTrace: true });
},
});
// CJS default export `const vike = require('vike/plugin')`
// - It needs to live at the end of this file, in order to ensure we do it after all assignments to `exports`.
try {
module.exports = Object.assign(exports.default, exports);
}
catch { }