UNPKG

vike

Version:

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

96 lines (95 loc) 4.11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.extractExportNamesRE = void 0; exports.pluginExtractExportNames = pluginExtractExportNames; exports.isUsingClientRouter = isUsingClientRouter; const utils_js_1 = require("../utils.js"); const parseEsModule_js_1 = require("../shared/parseEsModule.js"); const normalizeId_js_1 = require("../shared/normalizeId.js"); const isViteServerBuild_js_1 = require("../shared/isViteServerBuild.js"); const extractExportNamesRE = /(\?|&)extractExportNames(?:&|$)/; exports.extractExportNamesRE = extractExportNamesRE; const debug = (0, utils_js_1.createDebugger)('vike:pluginExtractExportNames'); const globalObject = (0, utils_js_1.getGlobalObject)('plugins/pluginExtractExportNames.ts', {}); function pluginExtractExportNames() { let isDev = false; return { name: 'vike:pluginExtractExportNames', enforce: 'post', async transform(src, id, options) { id = (0, normalizeId_js_1.normalizeId)(id); const isClientSide = !(0, isViteServerBuild_js_1.isViteServerBuild_options)(options); if (extractExportNamesRE.test(id)) { const code = await getExtractExportNamesCode(src, isClientSide, !isDev, id); debug('id ' + id, ['result:\n' + code.code.trim(), 'src:\n' + src.trim()]); return code; } }, configureServer() { isDev = true; }, config() { if (debug.isActivated) { return { logLevel: 'silent' }; } }, }; } async function getExtractExportNamesCode(src, isClientSide, isProduction, id) { const { exportNames, wildcardReExports } = await (0, parseEsModule_js_1.getExportNames)(src); if (isClientSide && exportNames.includes('clientRouting')) { globalObject.usesClientRouter = true; } const code = getCode(exportNames, wildcardReExports, isClientSide, isProduction, id); return (0, utils_js_1.rollupSourceMapRemove)(code); } function getCode(exportNames, wildcardReExports, isClientSide, isProduction, id) { let code = ''; const reExportVarNames = wildcardReExports.map((reExportedModuleName, i) => { const varName = `m${i}`; code += `import { exportNames as ${varName} } from '${addQuery(reExportedModuleName, id)}'`; code += '\n'; return varName; }); code += '\n'; code += `export const exportNames = [${[ ...exportNames.map((n) => JSON.stringify(n)), ...reExportVarNames.map((varName) => `...${varName}`), ].join(', ')}];`; code = injectHmr(code, isClientSide, isProduction); return code; } function addQuery(moduleName, id) { if (moduleName.includes('?')) { (0, utils_js_1.assert)(moduleName.split('?').length === 2); moduleName = moduleName.replace('?', '?extractExportNames&'); } else { const fileExtension = (0, utils_js_1.getFileExtension)(moduleName); if (!fileExtension) { (0, utils_js_1.assert)(extractExportNamesRE.test(id)); const idReal = id.split('?')[0]; (0, utils_js_1.assertUsage)(false, `Modify the re-export of ${idReal}, see https://github.com/vikejs/vike/issues/864#issuecomment-1537202290`); } moduleName = `${moduleName}?extractExportNames&lang.${fileExtension}`; } return moduleName; } function injectHmr(code, isClientSide, isProduction) { if (isProduction) { return code; } if (isClientSide) { code += '\n'; code += `if (import.meta.hot) import.meta.hot.accept((mod) => { exportNames.length=0; exportNames.push(...mod.exportNames); });`; } else { // Ensure Vite considers the module as `isSelfAccepting`. (Needed because Vite's module graph erroneously conflates the Vite server-side modules with their client-side counterparts.) code += '\n'; code += 'if(false){import.meta.hot.accept(()=>{})};'; } return code; } function isUsingClientRouter() { return globalObject.usesClientRouter === true; }