@devup-ui/next-plugin
Version:
Zero Config, Zero FOUC, Zero Runtime, CSS in JS Preprocessor
4 lines (3 loc) • 9.02 kB
JavaScript
import{existsSync as re,mkdirSync as he,readFileSync as _,unlinkSync as Ke,writeFileSync as H}from"node:fs";import{dirname as Xe,join as w,relative as we,resolve as I}from"node:path";import{buildCanonicalMap as Qe,buildStaticImportGraph as Ye,computeCompiledFiles as Ze,computeFileRoutes as qe,createNodeModulesExcludeRegex as et,createThemeInterfaceArgs as tt,loadDevupConfigSync as rt,mergeImportAliases as st,planAtomHoist as nt}from"@devup-ui/plugin-utils";import{codeExtract as it,exportClassMap as ot,exportFileMap as at,exportSheet as ct,getCss as lt,getDefaultTheme as ut,getThemeInterface as pt,importCanonicalMap as dt,importClassMap as ft,importFileMap as mt,importFileRoutes as gt,importSheet as ht,registerShorthands as wt,registerTheme as vt,setAtomHoist as xt,setPrefix as Ft}from"@devup-ui/wasm";import{DevupUIWebpackPlugin as St}from"@devup-ui/webpack-plugin";import{unlinkSync as Pe,writeFile as Me,writeFileSync as be}from"node:fs";import{createServer as ye}from"node:http";import{basename as Ce,dirname as ke,join as X,relative as Te}from"node:path";import{getFileNumByFilename as De}from"@devup-ui/plugin-utils";import{codeExtract as Ne,exportClassMap as Oe,exportFileMap as Ee,exportSheet as je,getCss as B}from"@devup-ui/wasm";var Y=new Map,Q=new Map;function T(e,t){Q.set(e,t);let r=(Y.get(e)??Promise.resolve()).catch(()=>{}).then(()=>new Promise((s,n)=>{let a=Q.get(e);if(a===void 0){s();return}Q.delete(e),Me(e,a,"utf-8",(l)=>l?n(l):s())}));return Y.set(e,r),r}function Ie(){return Promise.allSettled([...Y.values()]).then(()=>{return})}function Ae(e){return new Promise((t,o)=>{let r=[];e.on("data",(s)=>r.push(s)),e.on("end",()=>t(Buffer.concat(r).toString("utf-8"))),e.on("error",o)})}var D=null,U=0,Z=0,q=0,E=0,le=2500,ue=1e4,W=60000;function pe(e){return Z>0&&U===0&&E===0&&e-q>=ue}function Be(){if(j.size===0)return!1;for(let e of j)if(!P.has(e))return!1;return!0}function $e(){let e=Date.now();return new Promise((t)=>{let o=()=>{let r=Date.now();if(r-e>W){t();return}if(Be()){t();return}if(j.size>0&&pe(r)){t();return}if(j.size===0&&Z>0&&U===0&&E===0&&r-q>=le){t();return}setTimeout(o,25)};o()})}var P=new Set,R=new Map,de=new Map,ce={},j=new Set;function Re(e){let t=new Map;for(let[o,r]of Object.entries(e)){if(r==="@global")continue;let s=t.get(r);if(!s)s=new Set([r]),t.set(r,s);s.add(o)}return t}function Ue(e){let t=de.get(e)??new Set([e]),o=Date.now();return new Promise((r)=>{let s=()=>{let n=!0;for(let l of t)if(!P.has(l)){n=!1;break}if(n){r();return}let a=Date.now();if(pe(a)){let l=[...t].filter((d)=>!P.has(d));console.info(`[devup-ui] coordinator: serving bucket "${e}" through the legacy quiet fallback; treating unreported member(s) as erased imports: ${l.join(", ")}`),r();return}if(a-o>W){let l=[...t].filter((d)=>!P.has(d));console.warn(`[devup-ui] coordinator: bucket "${e}" not complete after ${W}ms; serving partial CSS (missing: ${l.join(", ")})`),r();return}setTimeout(s,25)};s()})}function fe(e){let{package:t,cssDir:o,singleCss:r,sheetFile:s,classMapFile:n,fileMapFile:a,importAliases:l,coordinatorPortFile:d}=e;le=e.idleThresholdMs??2500,ue=e.quietMs??1e4,W=e.maxWaitMs??60000,ce=e.canonicalMap,de=Re(e.canonicalMap),j=new Set(e.expectedBaseFiles??[]),P.clear();for(let i of e.prewarmedFiles??[])P.add(i);return R.clear(),D=ye(async(i,c)=>{let f=new URL(i.url??"/",`http://${i.headers.host}`);if(i.method==="GET"&&f.pathname==="/health"){c.writeHead(200,{"Content-Type":"text/plain"}),c.end("ok");return}if(i.method==="GET"&&f.pathname==="/css"){let g=f.searchParams.get("fileNum"),v=f.searchParams.get("importMainCss")==="true",m=f.searchParams.get("waitForIdle")==="true",u=g!=null?parseInt(g):void 0;if(m)if(u!=null&&R.has(u))await Ue(R.get(u));else await $e();c.writeHead(200,{"Content-Type":"text/css"}),c.end(B(u??null,v));return}if(i.method==="POST"&&f.pathname==="/extract"){E++;let g=!1,v;try{let m=JSON.parse(await Ae(i));U++,E--,g=!0;let{filename:u,code:M,resourcePath:b}=m;v=u;let y=Te(ke(b),o).replaceAll("\\","/");if(!y.startsWith("./"))y=`./${y}`;let p=Ne(u,M,t,y,r,!1,!0,l),N=p.code;if(!r&&N)N=N.replace(/devup-ui-(\d+)\.css/g,"devup-ui.css?fileNum=$1");let h=[];if(p.updatedBaseStyle)h.push(T(X(o,"devup-ui.css"),`${B(null,!1)}
/* ${Date.now()} */`));if(p.cssFile){let C=De(p.cssFile);if(C!=null)R.set(C,ce[u]??u);if(h.push(T(X(o,Ce(p.cssFile)),B(C,!0)),T(s,je()),T(n,Oe()),T(a,Ee())),!r&&!p.updatedBaseStyle&&p.css!=null)h.push(T(X(o,"devup-ui.css"),`${B(null,!1)}
/* ${Date.now()} */`))}await Promise.all(h),c.writeHead(200,{"Content-Type":"application/json"}),c.end(JSON.stringify({code:N,map:p.map,cssFile:p.cssFile,updatedBaseStyle:p.updatedBaseStyle}))}catch(m){c.writeHead(500,{"Content-Type":"application/json"}),c.end(JSON.stringify({error:m instanceof Error?m.message:String(m)}))}finally{if(g)U--;else E--;if(v!=null)P.add(v);Z++,q=Date.now()}return}c.writeHead(404,{"Content-Type":"text/plain"}),c.end("Not Found")}),D.listen(0,"127.0.0.1",()=>{let i=D.address();if(i&&typeof i!=="string")be(d,String(i.port),"utf-8")}),{close:()=>{if(Ie(),D){D.close(),D=null;try{Pe(d)}catch{}}}}}import{existsSync as We}from"node:fs";import{createRequire as _e}from"node:module";import{extname as He,join as Je,relative as Ge,resolve as me}from"node:path";var Ve=/\.(?:tsx?|jsx?|mjs)$/;function te(e){if(e.startsWith("#")||e.startsWith("node:"))return;let[t,o]=e.split("/");if(!t)return;if(!t.startsWith("@"))return t;return o?`${t}/${o}`:void 0}function Le(e,t,o){let r=te(t);return e.startsWith("@devup-ui/")||e.startsWith("@devup-editor/")||e===r||o.some((s)=>e===te(s))}function ze(e){if(He(e)!==".cjs")return e;let t=`${e.slice(0,-4)}.mjs`;return We(t)?t:e}function ee(e,t){return Ge(e,me(e,t)).replaceAll("\\","/")}function ge({cwd:e,graph:t,expectedBaseFiles:o,libPackage:r,include:s}){let n=me(e),a=new Set(o.map((i)=>ee(n,i)));for(let i of t.files)a.add(ee(n,i));let l=new Set;for(let i of t.externalImports?.values()??[])for(let c of i)l.add(c);let d=_e(Je(n,"package.json"));for(let i of[...l].sort()){let c=te(i);if(!c||!Le(c,r,s))continue;try{let f=ze(d.resolve(i));if(!Ve.test(f))continue;a.add(ee(n,f))}catch{}}return[...a].sort()}function Pt(e,t={}){if(process.env.TURBOPACK==="1"||process.env.TURBOPACK==="auto"){e??={},e.turbopack??={},e.turbopack.rules??={};let{package:s="@devup-ui/react",distDir:n="df",cssDir:a=I(n,"devup-ui"),singleCss:l=!1,devupFile:d="devup.json",include:i=[],prefix:c,shorthands:f,atomHoist:g,importAliases:v}=t;if(wt(f??{}),c)Ft(c);let m=st(v),u=w(n,"sheet.json"),M=w(n,"classMap.json"),b=w(n,"fileMap.json"),y=w(n,"canonicalMap.json"),p=w(n,".gitignore");if(!re(n))he(n,{recursive:!0});if(!re(a))he(a,{recursive:!0});if(!re(p))H(p,"*");try{ht(JSON.parse(_(u,"utf-8"))),ft(JSON.parse(_(M,"utf-8"))),mt(JSON.parse(_(b,"utf-8")))}catch{}let h=rt(d).theme??{};vt(h);let C=pt(...tt(s));if(C)H(w(n,"theme.d.ts"),C);let ve=et(i,".mdx.[tj]sx?$"),A=w(n,"coordinator.port"),se=g!==void 0&&Number.isFinite(g)&&g>0,J=process.env.NODE_ENV==="development",O={},G=[],V;try{let x=I(process.cwd(),"src"),k=I(process.cwd(),"tsconfig.json"),F=process.cwd(),S=Ye(x,k);V=S;let z=se?void 0:process.env.DEVUP_HOIST_V?Number(process.env.DEVUP_HOIST_V):void 0;if(O=Qe({srcDir:x,tsconfigPath:k,cwd:F,hoistV:z,graph:S}),dt(O),H(y,JSON.stringify(O)),G=Ze({srcDir:x,tsconfigPath:k,cwd:F,graph:S}),se){let Se=qe({srcDir:x,tsconfigPath:k,cwd:F,graph:S}),K=nt(O,Se,g);if(K)gt(K.reachByBucket),xt(K.threshold);else console.info("[devup-ui] atomHoist is set but fewer than 2 routes were detected; atom hoisting is a no-op.")}}catch{}let ne=[];if(!J&&V){let x=process.cwd(),k=ge({cwd:x,graph:V,expectedBaseFiles:G,libPackage:s,include:i});for(let F of k){let S=I(x,F),z=`./${we(Xe(S),a).replaceAll("\\","/")}`;it(F,_(S,"utf-8"),s,z,l,!1,!0,m),ne.push(F)}}H(w(a,"devup-ui.css"),lt(null,!1));try{Ke(A)}catch{}let xe=fe({package:s,cssDir:a,singleCss:l,sheetFile:u,classMapFile:M,fileMapFile:b,importAliases:m,coordinatorPortFile:A,canonicalMap:O,expectedBaseFiles:G,prewarmedFiles:ne});process.on("exit",()=>{xe.close()});let ie=JSON.parse(ct()),oe=JSON.parse(ot()),ae=JSON.parse(at()),L=ut();if(L)process.env.DEVUP_UI_DEFAULT_THEME=L,e.env??={},Object.assign(e.env,{DEVUP_UI_DEFAULT_THEME:L});let Fe={[`./${we(process.cwd(),a).replaceAll("\\","/")}/*.css`]:[{loader:"@devup-ui/next-plugin/css-loader",options:{watch:J,coordinatorPortFile:A,sheetFile:u,classMapFile:M,fileMapFile:b,themeFile:d,defaultSheet:ie,defaultClassMap:oe,defaultFileMap:ae,theme:h}}],"*.{tsx,ts,jsx,js,mjs}":{loaders:[{loader:"@devup-ui/next-plugin/loader",options:{package:s,cssDir:a,coordinatorPortFile:A,sheetFile:u,classMapFile:M,fileMapFile:b,themeFile:d,defaultSheet:ie,defaultClassMap:oe,defaultFileMap:ae,watch:J,singleCss:l,theme:h,importAliases:m}}],condition:{not:{path:ve}}}};return Object.assign(e.turbopack.rules,Fe),e}let{webpack:r}=e;return e.webpack=(s,n)=>{if(t.cssDir??=I(n.dev?t.distDir??"df":".next/cache",`devup-ui_${n.buildId}`),s.plugins.push(new St({...t,watch:n.dev})),typeof r==="function")return r(s,n);return s},e}export{Pt as DevupUI};