@devup-ui/webpack-plugin
Version:
Zero Config, Zero FOUC, Zero Runtime, CSS in JS Preprocessor
2 lines (1 loc) • 3.17 kB
JavaScript
import{existsSync as t,mkdirSync as u,readFileSync as n,writeFileSync as r}from"node:fs";import{stat as b,writeFile as M}from"node:fs/promises";import{createRequire as h}from"node:module";import{join as o,resolve as c}from"node:path";import{getCss as f,getDefaultTheme as x,getThemeInterface as P,importClassMap as d,importFileMap as g,importSheet as m,registerTheme as a,setDebug as y,setPrefix as U}from"@devup-ui/wasm";class D{options;sheetFile;classMapFile;fileMapFile;constructor({package:i="@devup-ui/react",devupFile:s="devup.json",distDir:e="df",cssDir:l=c(e,"devup-ui"),watch:p=!1,debug:v=!1,include:F=[],singleCss:k=!1,prefix:w}={}){this.options={package:i,cssDir:l,devupFile:s,distDir:e,watch:p,debug:v,include:F,singleCss:k,prefix:w},this.sheetFile=o(this.options.distDir,"sheet.json"),this.classMapFile=o(this.options.distDir,"classMap.json"),this.fileMapFile=o(this.options.distDir,"fileMap.json")}writeDataFiles(){try{let i=t(this.options.devupFile)?n(this.options.devupFile,"utf-8"):void 0;if(i){a(JSON.parse(i)?.theme??{});let s=P(this.options.package,"CustomColors","DevupThemeTypography","DevupTheme");if(s)r(o(this.options.distDir,"theme.d.ts"),s,{encoding:"utf-8"})}else a({})}catch(i){console.error(i),a({})}if(!t(this.options.cssDir))u(this.options.cssDir,{recursive:!0});if(this.options.watch)r(o(this.options.cssDir,"devup-ui.css"),f(null,!1))}apply(i){if(y(this.options.debug),this.options.prefix)U(this.options.prefix);let s=t(this.options.devupFile);if(!t(this.options.distDir))u(this.options.distDir,{recursive:!0});if(r(o(this.options.distDir,".gitignore"),"*","utf-8"),this.options.watch)try{if(t(this.sheetFile))m(JSON.parse(n(this.sheetFile,"utf-8")));if(t(this.classMapFile))d(JSON.parse(n(this.classMapFile,"utf-8")));if(t(this.fileMapFile))g(JSON.parse(n(this.fileMapFile,"utf-8")))}catch(e){console.error(e),m({}),d({}),g({})}if(this.writeDataFiles(),this.options.watch){let e=null;i.hooks.watchRun.tapPromise("DevupUIWebpackPlugin",async()=>{if(s){let p=(await b(this.options.devupFile)).mtimeMs;if(e&&e!==p)this.writeDataFiles();e=p}})}if(s)i.hooks.afterCompile.tap("DevupUIWebpackPlugin",(e)=>{e.fileDependencies.add(c(this.options.devupFile))});if(i.options.plugins.push(new i.webpack.DefinePlugin({"process.env.DEVUP_UI_DEFAULT_THEME":JSON.stringify(x())})),!this.options.watch)i.hooks.done.tapPromise("DevupUIWebpackPlugin",async(e)=>{if(!e.hasErrors())await M(o(this.options.cssDir,"devup-ui.css"),f(null,!1),"utf-8")});i.options.module.rules.push({test:/\.(tsx|ts|js|mjs|jsx)$/,exclude:new RegExp(`(node_modules(?!.*(${["@devup-ui",...this.options.include].join("|").replaceAll("/","[\\/\\\\_]")})([\\/\\\\.]|$)))|(.mdx.[tj]sx?$)`),enforce:"pre",use:[{loader:h(import.meta.url).resolve("@devup-ui/webpack-plugin/loader"),options:{package:this.options.package,cssDir:this.options.cssDir,sheetFile:this.sheetFile,classMapFile:this.classMapFile,fileMapFile:this.fileMapFile,watch:this.options.watch,singleCss:this.options.singleCss}}]},{test:this.options.cssDir,enforce:"pre",use:[{loader:h(import.meta.url).resolve("@devup-ui/webpack-plugin/css-loader"),options:{watch:this.options.watch}}]})}}export{D as DevupUIWebpackPlugin};