UNPKG

@twstyled/babel-preset

Version:

Babel plugin for twstyled -- the full-featured Tailwind CSS + CSS in JS Compiler

80 lines (79 loc) 3.11 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const path = __importStar(require("path")); const fs = __importStar(require("fs")); const mkdirp_1 = __importDefault(require("mkdirp")); const class_utilities_1 = require("@xwind/class-utilities"); const util_1 = require("@twstyled/util"); const util_2 = require("./util"); let $hash = ''; let doneMkdir = false; let $cssFileName; const cache = new Map(); let $generate; function getVisitorsWriteTwCss(babel, options) { return { visitor: { Program: { enter(nodePath, state) { cache.delete(state.file.opts.filename); state.twcache = cache; }, exit(nodePath, state) { if (state.file.metadata.twclasses && state.file.metadata.twclasses.length > 0) { cache.set(state.file.opts.filename, state.file.metadata.twclasses); writeCss(state, options); } } } } }; } exports.default = getVisitorsWriteTwCss; /** * Get Css for tailwind classes and write to twstyled cache (usually in node_modules to allow global * import using Next.js */ function writeCss(state, options) { const twConfigPath = util_1.getTwConfigPath(options.configPath); const { twConfig, isNewTwConfig } = util_1.getTwConfigCache(twConfigPath); if (!$generate || isNewTwConfig) { $generate = util_2.getTailwindCssGenerator(options, twConfig); } const classes = class_utilities_1.composer(Array.from(state.twcache.values()), twConfig.separator).sort((a, b) => (a > b ? 0 : -1)); const newHash = util_2.getHash(classes.join()); if (newHash === $hash) { return; } $hash = newHash; $cssFileName = $cssFileName || path.resolve(process.cwd(), options.outputPath); const cssText = $generate(classes); if (!doneMkdir) { mkdirp_1.default.sync(path.dirname($cssFileName)); doneMkdir = true; } fs.writeFileSync($cssFileName, cssText); }