UNPKG

vike

Version:

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

38 lines (37 loc) 1.79 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 const SIDE_EXPORTS_DO_NOT_CHECK = ['.md', '.mdx']; 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 exportNamesInvalid = exportNames .filter((e) => !isValid(e)) .filter((exportName) => !SIDE_EXPORTS_TOLERATE.includes(exportName)); if (!SIDE_EXPORTS_DO_NOT_CHECK.some((ext) => filePathToShowToUser.endsWith(ext))) { exportNamesInvalid.forEach((exportInvalid) => { assertWarning(false, `${filePathToShowToUser} unexpected ${pc.cyan(`export { ${exportInvalid} }`)}, see https://vike.dev/no-side-exports`, { onlyOnce: true, }); }); } }