vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
91 lines (90 loc) • 3.18 kB
JavaScript
import '../assertEnvVite.js';
export { pluginStaticReplace };
import { createDebug } from '../../../utils/debug.js';
import { assert, assertUsage } from '../../../utils/assert.js';
import { isViteServerSide_extraSafe } from '../shared/isViteServerSide.js';
import { applyStaticReplace } from './pluginStaticReplace/applyStaticReplace.js';
const debug = createDebug('vike:staticReplace');
function pluginStaticReplace(vikeConfig) {
let config;
// staticReplaceList
const staticReplaceList = getStaticReplaceList(vikeConfig);
if (staticReplaceList.length === 0)
return [];
// === Rolldown filter
const skipNodeModules = '/node_modules/';
const include = getFilterRolldown(staticReplaceList);
assert(include);
const filterRolldown = {
id: {
exclude: `**${skipNodeModules}**`,
},
code: {
include,
},
};
const filterFunction = (id, code) => {
if (id.includes(skipNodeModules))
return false;
if (!include.some((s) => code.includes(s)))
return false;
return true;
};
// ===
return [
{
name: 'vike:pluginStaticReplace',
enforce: 'post',
configResolved: {
async handler(config_) {
config = config_;
},
},
transform: {
filter: filterRolldown,
async handler(code, id, options) {
assert(filterFunction(id, code));
debug('id', id);
const env = isViteServerSide_extraSafe(config, this.environment, options) ? 'server' : 'client';
debug('env', env);
const result = await applyStaticReplace(code, staticReplaceList, id, env);
if (debug.isActivated) {
if (result === undefined) {
debug('Skipped');
}
if (result === null) {
debug('AST parsed, but no modifications');
}
if (result) {
debug('Before:', code);
debug('After:', result.code);
}
}
return result;
},
},
},
];
}
/**
* Extract all staticReplaceList from vikeConfig
*/
function getStaticReplaceList(vikeConfig) {
const staticReplaceConfigs = vikeConfig._from.configsCumulative.staticReplace;
if (!staticReplaceConfigs)
return [];
const staticReplaceList = [];
for (const configValue of staticReplaceConfigs.values) {
const entries = configValue.value;
assert(Array.isArray(entries));
staticReplaceList.push(...entries);
}
return staticReplaceList;
}
function getFilterRolldown(staticReplaceList) {
return staticReplaceList.map((staticReplace) => {
const { filter } = staticReplace;
assertUsage(filter, '+staticReplace entry is missing rolldown filter');
return filter;
});
}