UNPKG

vite-plugin-react-server

Version:
110 lines (107 loc) 15.8 kB
/** * vite-plugin-react-server * Copyright (c) Nico Brinkkemper * MIT License */ import { collectManifestCss } from '../helpers/collectManifestCss.js'; import { createUnifiedCssProcessor } from '../helpers/createUnifiedCssProcessor.js'; import { join } from 'node:path'; function processCssFilesForPages({ userOptions, autoDiscoveredFiles, staticManifest, serverManifest, bundle, logger }) { const cssFilesByPage = /* @__PURE__ */ new Map(); const indexHtmlCssInputs = collectManifestCss( staticManifest ?? {}, "index.html" ); const clientEntryCssInputs = userOptions.clientEntry ? collectManifestCss( staticManifest ?? {}, userOptions.clientEntry ) : null; const globalCssInputs = { ...indexHtmlCssInputs, ...clientEntryCssInputs }; const transformedServerManifest = Object.fromEntries( Object.entries(serverManifest ?? {}).map(([key, value]) => { const manifestEntry = value; if (manifestEntry.isEntry && manifestEntry.file) { for (const [, staticValue] of Object.entries(staticManifest ?? {})) { if (staticValue && typeof staticValue === "object" && "file" in staticValue) { if (staticValue.file === manifestEntry.file && staticValue.css?.length) { return [ key, { ...manifestEntry, css: staticValue.css } ]; } } } } return [key, value]; }) ); const globalCss = /* @__PURE__ */ new Map(); const { urlMap = /* @__PURE__ */ new Map() } = autoDiscoveredFiles ?? {}; const cssProcessor = createUnifiedCssProcessor({ userOptions, logger, verbose: userOptions.verbose, staticOutDir: staticManifest ? join(userOptions.projectRoot || "", userOptions.build.outDir, userOptions.build.client) : void 0, staticManifest}); for (const [url, { page, props }] of urlMap) { if (userOptions.verbose) { logger.info( `[plugin.server] Processing route: ${url}, page: ${page}, props: ${props}` ); } if (userOptions.verbose) { logger.info(`[plugin.server] transformedServerManifest keys: ${Object.keys(transformedServerManifest).join(", ")}`); logger.info(`[plugin.server] Looking for CSS starting from: ${page} and ${props || "none"}`); if (transformedServerManifest[page]) { logger.info(`[plugin.server] Page entry: ${JSON.stringify(transformedServerManifest[page], null, 2)}`); } if (props && transformedServerManifest[props]) { logger.info(`[plugin.server] Props entry: ${JSON.stringify(transformedServerManifest[props], null, 2)}`); } for (const [key, value] of Object.entries(transformedServerManifest)) { if (value && typeof value === "object" && "css" in value && Array.isArray(value.css) && value.css.length > 0) { logger.info(`[plugin.server] Found CSS entry: ${key} -> ${JSON.stringify(value.css)}`); } } } const cssInputs = collectManifestCss( transformedServerManifest, props ? [page, props] : page ); if (userOptions.verbose) { logger.info( `[plugin.server] CSS inputs for ${url}: ${Object.keys(cssInputs).length} files` ); for (const [key, value] of Object.entries(cssInputs)) { logger.info(`[plugin.server] CSS input: ${key} -> ${value}`); } } const pageCssMap = cssProcessor.processCssFromStaticBuild(cssInputs); if (Object.keys(globalCssInputs).length > 0) { const globalCssMap = cssProcessor.processCssFromStaticBuild(globalCssInputs); for (const [key, value] of globalCssMap.entries()) { globalCss.set(key, value); } } cssFilesByPage.set(url, pageCssMap); } return { cssFilesByPage, globalCss }; } export { processCssFilesForPages }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzc0Nzc0ZpbGVzRm9yUGFnZXMuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BsdWdpbi9yZWFjdC1zdGF0aWMvcHJvY2Vzc0Nzc0ZpbGVzRm9yUGFnZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICBBdXRvRGlzY292ZXJlZEZpbGVzLFxuICBDc3NDb250ZW50LFxuICBSZXNvbHZlZFVzZXJPcHRpb25zLFxufSBmcm9tIFwiLi4vdHlwZXMuanNcIjtcbmltcG9ydCB0eXBlIHsgTG9nZ2VyLCBNYW5pZmVzdCB9IGZyb20gXCJ2aXRlXCI7XG5pbXBvcnQgeyBjb2xsZWN0TWFuaWZlc3RDc3MgfSBmcm9tIFwiLi4vaGVscGVycy9jb2xsZWN0TWFuaWZlc3RDc3MuanNcIjtcbmltcG9ydCB7IGNyZWF0ZVVuaWZpZWRDc3NQcm9jZXNzb3IgfSBmcm9tIFwiLi4vaGVscGVycy9jcmVhdGVVbmlmaWVkQ3NzUHJvY2Vzc29yLmpzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbnRlcmZhY2UgUHJvY2Vzc0Nzc0ZpbGVzRm9yUGFnZXNPcHRpb25zIHtcbiAgdXNlck9wdGlvbnM6IFJlc29sdmVkVXNlck9wdGlvbnM7XG4gIGF1dG9EaXNjb3ZlcmVkRmlsZXM6IEF1dG9EaXNjb3ZlcmVkRmlsZXMgfCBudWxsO1xuICBzdGF0aWNNYW5pZmVzdDogTWFuaWZlc3QgfCB1bmRlZmluZWQ7XG4gIHNlcnZlck1hbmlmZXN0OiBNYW5pZmVzdCB8IHVuZGVmaW5lZDtcbiAgYnVuZGxlOiBhbnk7XG4gIGxvZ2dlcjogTG9nZ2VyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0Nzc0ZpbGVzRm9yUGFnZXMoe1xuICB1c2VyT3B0aW9ucyxcbiAgYXV0b0Rpc2NvdmVyZWRGaWxlcyxcbiAgc3RhdGljTWFuaWZlc3QsXG4gIHNlcnZlck1hbmlmZXN0LFxuICBidW5kbGUsXG4gIGxvZ2dlcixcbn06IFByb2Nlc3NDc3NGaWxlc0ZvclBhZ2VzT3B0aW9ucyk6IHtcbiAgY3NzRmlsZXNCeVBhZ2U6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIENzc0NvbnRlbnQ+PjtcbiAgZ2xvYmFsQ3NzOiBNYXA8c3RyaW5nLCBDc3NDb250ZW50Pjtcbn0ge1xuICBjb25zdCBjc3NGaWxlc0J5UGFnZSA9IG5ldyBNYXAoKTtcblxuICAvLyBGaXJzdCBjb2xsZWN0IGdsb2JhbCBzdHlsZXMgZnJvbSBpbmRleC5odG1sXG4gIGNvbnN0IGluZGV4SHRtbENzc0lucHV0cyA9IGNvbGxlY3RNYW5pZmVzdENzcyhcbiAgICBzdGF0aWNNYW5pZmVzdCA/PyB7fSxcbiAgICBcImluZGV4Lmh0bWxcIlxuICApO1xuICBjb25zdCBjbGllbnRFbnRyeUNzc0lucHV0cyA9IHVzZXJPcHRpb25zLmNsaWVudEVudHJ5XG4gICAgPyBjb2xsZWN0TWFuaWZlc3RDc3MoXG4gICAgICAgIHN0YXRpY01hbmlmZXN0ID8/IHt9LFxuICAgICAgICB1c2VyT3B0aW9ucy5jbGllbnRFbnRyeVxuICAgICAgKVxuICAgIDogbnVsbDtcbiAgY29uc3QgZ2xvYmFsQ3NzSW5wdXRzID0ge1xuICAgIC4uLmluZGV4SHRtbENzc0lucHV0cyxcbiAgICAuLi5jbGllbnRFbnRyeUNzc0lucHV0cyxcbiAgfTtcblxuICAvLyB0cmFuc2Zvcm0gdGhlIHNlcnZlciBtYW5pZmVzdCB0byBpbmNsdWRlIHRoZSBjc3MgZmlsZXMgZnJvbSB0aGUgc3RhdGljIG1hbmlmZXN0XG4gIC8vIFRoZSBzZXJ2ZXIgbWFuaWZlc3QgbmVlZHMgQ1NTIGluZm8gZm9yIGlubGluaW5nIG9yIHJlcXVlc3RpbmcgLmpzIG1vZHVsZXMgZm9yIGNsYXNzbmFtZXNcbiAgY29uc3QgdHJhbnNmb3JtZWRTZXJ2ZXJNYW5pZmVzdCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhzZXJ2ZXJNYW5pZmVzdCA/PyB7fSkubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGNvbnN0IG1hbmlmZXN0RW50cnkgPSB2YWx1ZSBhcyBhbnk7XG4gICAgICBcbiAgICAgIC8vIElmIGl0J3MgYSBidW5kbGUgZW50cnksIGp1c3QgdXNlIHRoZSBmaWxlIHByb3BlcnR5IGRpcmVjdGx5XG4gICAgICBpZiAobWFuaWZlc3RFbnRyeS5pc0VudHJ5ICYmIG1hbmlmZXN0RW50cnkuZmlsZSkge1xuICAgICAgICAvLyBGaW5kIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRpYyBtYW5pZmVzdCBlbnRyeSBieSBtYXRjaGluZyB0aGUgZmlsZSBwYXRoXG4gICAgICAgIGZvciAoY29uc3QgWywgc3RhdGljVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHN0YXRpY01hbmlmZXN0ID8/IHt9KSkge1xuICAgICAgICAgIGlmIChzdGF0aWNWYWx1ZSAmJiB0eXBlb2Ygc3RhdGljVmFsdWUgPT09ICdvYmplY3QnICYmICdmaWxlJyBpbiBzdGF0aWNWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKHN0YXRpY1ZhbHVlLmZpbGUgPT09IG1hbmlmZXN0RW50cnkuZmlsZSAmJiBzdGF0aWNWYWx1ZS5jc3M/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAuLi5tYW5pZmVzdEVudHJ5LFxuICAgICAgICAgICAgICAgICAgY3NzOiBzdGF0aWNWYWx1ZS5jc3MsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIFtrZXksIHZhbHVlXTtcbiAgICB9KVxuICApO1xuICBjb25zdCBnbG9iYWxDc3MgPSBuZXcgTWFwKCk7XG4gIGNvbnN0IHsgdXJsTWFwID0gbmV3IE1hcCgpIH0gPSBhdXRvRGlzY292ZXJlZEZpbGVzID8/IHt9O1xuXG4gIC8vIENyZWF0ZSB1bmlmaWVkIENTUyBwcm9jZXNzb3JcbiAgY29uc3QgY3NzUHJvY2Vzc29yID0gY3JlYXRlVW5pZmllZENzc1Byb2Nlc3Nvcih7XG4gICAgdXNlck9wdGlvbnMsXG4gICAgbG9nZ2VyLFxuICAgIHZlcmJvc2U6IHVzZXJPcHRpb25zLnZlcmJvc2UsXG4gICAgc3RhdGljT3V0RGlyOiBzdGF0aWNNYW5pZmVzdCA/IGpvaW4odXNlck9wdGlvbnMucHJvamVjdFJvb3QgfHwgJycsIHVzZXJPcHRpb25zLmJ1aWxkLm91dERpciwgdXNlck9wdGlvbnMuYnVpbGQuY2xpZW50KSA6IHVuZGVmaW5lZCxcbiAgICBzdGF0aWNNYW5pZmVzdCxcbiAgICBidW5kbGUsXG4gIH0pO1xuXG4gIC8vIENvbGxlY3QgQ1NTIGZpbGVzIGZvciBlYWNoIHBhZ2UgYW5kIGl0cyBwcm9wc1xuICBmb3IgKGNvbnN0IFt1cmwsIHsgcGFnZSwgcHJvcHMgfV0gb2YgdXJsTWFwKSB7XG4gICAgaWYgKHVzZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgW3BsdWdpbi5zZXJ2ZXJdIFByb2Nlc3Npbmcgcm91dGU6ICR7dXJsfSwgcGFnZTogJHtwYWdlfSwgcHJvcHM6ICR7cHJvcHN9YFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gVXNlIHRoZSB0cmFuc2Zvcm1lZCBzZXJ2ZXIgbWFuaWZlc3Qgd2hpY2ggbm93IGluY2x1ZGVzIENTUyBpbmZvIGZyb20gdGhlIHN0YXRpYyBtYW5pZmVzdFxuICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBzZXJ2ZXIgdG8gaW5saW5lIENTUyBvciByZXF1ZXN0IC5qcyBtb2R1bGVzIGZvciBjbGFzc25hbWVzXG4gICAgaWYgKHVzZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBbcGx1Z2luLnNlcnZlcl0gdHJhbnNmb3JtZWRTZXJ2ZXJNYW5pZmVzdCBrZXlzOiAke09iamVjdC5rZXlzKHRyYW5zZm9ybWVkU2VydmVyTWFuaWZlc3QpLmpvaW4oJywgJyl9YCk7XG4gICAgICBsb2dnZXIuaW5mbyhgW3BsdWdpbi5zZXJ2ZXJdIExvb2tpbmcgZm9yIENTUyBzdGFydGluZyBmcm9tOiAke3BhZ2V9IGFuZCAke3Byb3BzIHx8ICdub25lJ31gKTtcbiAgICAgIGlmICh0cmFuc2Zvcm1lZFNlcnZlck1hbmlmZXN0W3BhZ2VdKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbcGx1Z2luLnNlcnZlcl0gUGFnZSBlbnRyeTogJHtKU09OLnN0cmluZ2lmeSh0cmFuc2Zvcm1lZFNlcnZlck1hbmlmZXN0W3BhZ2VdLCBudWxsLCAyKX1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcyAmJiB0cmFuc2Zvcm1lZFNlcnZlck1hbmlmZXN0W3Byb3BzXSkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgW3BsdWdpbi5zZXJ2ZXJdIFByb3BzIGVudHJ5OiAke0pTT04uc3RyaW5naWZ5KHRyYW5zZm9ybWVkU2VydmVyTWFuaWZlc3RbcHJvcHNdLCBudWxsLCAyKX1gKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRGVidWc6IENoZWNrIHdoYXQgQ1NTIGVudHJpZXMgZXhpc3QgaW4gdGhlIHRyYW5zZm9ybWVkIG1hbmlmZXN0XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0cmFuc2Zvcm1lZFNlcnZlck1hbmlmZXN0KSkge1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAnY3NzJyBpbiB2YWx1ZSAmJiBBcnJheS5pc0FycmF5KHZhbHVlLmNzcykgJiYgdmFsdWUuY3NzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgW3BsdWdpbi5zZXJ2ZXJdIEZvdW5kIENTUyBlbnRyeTogJHtrZXl9IC0+ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUuY3NzKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBjb25zdCBjc3NJbnB1dHMgPSBjb2xsZWN0TWFuaWZlc3RDc3MoXG4gICAgICB0cmFuc2Zvcm1lZFNlcnZlck1hbmlmZXN0LFxuICAgICAgcHJvcHMgPyBbcGFnZSwgcHJvcHNdIDogcGFnZVxuICAgICk7XG4gICAgaWYgKHVzZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgW3BsdWdpbi5zZXJ2ZXJdIENTUyBpbnB1dHMgZm9yICR7dXJsfTogJHtcbiAgICAgICAgICBPYmplY3Qua2V5cyhjc3NJbnB1dHMpLmxlbmd0aFxuICAgICAgICB9IGZpbGVzYFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNzc0lucHV0cykpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtwbHVnaW4uc2VydmVyXSBDU1MgaW5wdXQ6ICR7a2V5fSAtPiAke3ZhbHVlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgQ1NTIGZpbGVzIHVzaW5nIHVuaWZpZWQgQ1NTIHByb2Nlc3NvclxuICAgIGNvbnN0IHBhZ2VDc3NNYXAgPSBjc3NQcm9jZXNzb3IucHJvY2Vzc0Nzc0Zyb21TdGF0aWNCdWlsZChjc3NJbnB1dHMpO1xuXG4gICAgLy8gQWRkIGdsb2JhbCBzdHlsZXMgaWYgdGhleSBleGlzdFxuICAgIGlmIChPYmplY3Qua2V5cyhnbG9iYWxDc3NJbnB1dHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGdsb2JhbENzc01hcCA9IGNzc1Byb2Nlc3Nvci5wcm9jZXNzQ3NzRnJvbVN0YXRpY0J1aWxkKGdsb2JhbENzc0lucHV0cyk7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBnbG9iYWxDc3NNYXAuZW50cmllcygpKSB7XG4gICAgICAgIGdsb2JhbENzcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNzc0ZpbGVzQnlQYWdlLnNldCh1cmwsIHBhZ2VDc3NNYXApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBj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