vike
Version:
(Replaces Next.js/Nuxt) 🔨 Composable framework to build advanced applications with flexibility and stability.
42 lines (41 loc) • 2.01 kB
JavaScript
export { assertPlusFileExport };
import { assert, assertUsage, assertWarning } from '../../utils/assert.js';
import pc from '@brillout/picocolors';
const SIDE_EXPORTS_TOLERATE = [
// vite-plugin-solid adds `export { $$registrations }`
'$$registrations',
// @vitejs/plugin-vue adds `export { _rerender_only }`
'_rerender_only',
];
// Tolerate `export { frontmatter }` in .mdx files
// Tolerate any exports from `+server.ts` for Cloudflare Durable Object
const SIDE_EXPORTS_DO_NOT_CHECK = ['.md', '.mdx'];
const SIDE_EXPORTS_DO_NOT_CHECK_CONFIG = ['server'];
function assertPlusFileExport(fileExports, filePathToShowToUser, configName) {
const exportNames = Object.keys(fileExports);
const isValid = (exportName) => exportName === 'default' || exportName === configName;
// Error upon missing/ambiguous export
const exportNamesValid = exportNames.filter(isValid);
const exportDefault = pc.code('export default');
const exportNamed = pc.code(`export { ${configName} }`);
if (exportNamesValid.length === 0) {
assertUsage(false, `${filePathToShowToUser} should define ${exportNamed} or ${exportDefault}`);
}
if (exportNamesValid.length === 2) {
assertUsage(false, `${filePathToShowToUser} is ambiguous: remove ${exportDefault} or ${exportNamed}`);
}
assert(exportNamesValid.length === 1);
// Warn upon side exports
const skip = SIDE_EXPORTS_DO_NOT_CHECK_CONFIG.includes(configName) ||
SIDE_EXPORTS_DO_NOT_CHECK.some((ext) => filePathToShowToUser.endsWith(ext));
if (!skip) {
const exportNamesInvalid = exportNames
.filter((e) => !isValid(e))
.filter((exportName) => !SIDE_EXPORTS_TOLERATE.includes(exportName));
exportNamesInvalid.forEach((exportInvalid) => {
assertWarning(false, `${filePathToShowToUser} unexpected ${pc.cyan(`export { ${exportInvalid} }`)}, see https://vike.dev/no-side-exports`, {
onlyOnce: true,
});
});
}
}