UNPKG

vike

Version:

(Replaces Next.js/Nuxt) 🔨 Composable framework to build advanced applications with flexibility and stability.

42 lines (41 loc) • 2.01 kB
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, }); }); } }