@twstyled/babel-preset
Version:
Babel plugin for twstyled -- the full-featured Tailwind CSS + CSS in JS Compiler
80 lines (79 loc) • 3.11 kB
JavaScript
;
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);
}