flowbite-react
Version:
Official React components built for Flowbite and Tailwind CSS
126 lines (122 loc) • 4.56 kB
JavaScript
var fs = require('fs/promises');
var path = require('path');
var consts = require('../consts.cjs');
var addImport = require('../utils/add-import.cjs');
var addToConfig = require('../utils/add-to-config.cjs');
var findFiles = require('../utils/find-files.cjs');
var normalizePath = require('../utils/normalize-path.cjs');
async function setupTailwind() {
try {
const found = !!(await setupTailwindV4() || await setupTailwindV3());
if (!found) {
console.warn("Missing Tailwind CSS configuration file.");
}
} catch (error) {
console.error("Failed to setup Tailwind:", error);
}
}
async function setupTailwindV4() {
try {
const cssFiles = await findFiles.findFiles({
patterns: ["**/*.css", "**/*.less", "**/*.sass", "**/*.scss"],
excludeDirs: consts.excludeDirs
});
let found = false;
for (const file of cssFiles) {
const content = await fs.readFile(file, "utf-8");
const lines = content.split("\n");
let tailwindImportIndex = -1;
let quoteType = '"';
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
const singleQuoteMatch = line.match(/@import\s+'tailwindcss'/);
const doubleQuoteMatch = line.match(/@import\s+"tailwindcss"/);
if (singleQuoteMatch || doubleQuoteMatch) {
tailwindImportIndex = i;
quoteType = singleQuoteMatch ? "'" : '"';
if (!line.trim().endsWith(";")) {
lines[i] = line + ";";
}
break;
}
}
if (tailwindImportIndex === -1) {
continue;
}
found = true;
const pluginDirectivePath = normalizePath.joinNormalizedPath(consts.pluginPath, "tailwindcss");
const sourceDirectivePath = path.join(path.relative(path.dirname(file), process.cwd()), consts.classListFilePath).replace(/\\/g, "/");
const pluginRegex = new RegExp(
`@plugin\\s+['"](${pluginDirectivePath.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")})['"](;|\\s|$)`
);
const sourceRegex = new RegExp(
`@source\\s+['"](${sourceDirectivePath.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")})['"](;|\\s|$)`
);
const hasPluginDirective = pluginRegex.test(content);
const hasSourceDirective = sourceRegex.test(content);
if (hasPluginDirective && hasSourceDirective) {
continue;
}
const directivesToAdd = [];
if (!hasPluginDirective) {
const pluginDirective = `@plugin ${quoteType}${pluginDirectivePath}${quoteType};`;
directivesToAdd.push(pluginDirective);
}
if (!hasSourceDirective) {
const sourceDirective = `@source ${quoteType}${sourceDirectivePath}${quoteType};`;
directivesToAdd.push(sourceDirective);
}
lines.splice(tailwindImportIndex + 1, 0, ...directivesToAdd);
const updatedContent = lines.join("\n");
console.log(`Updating ${file} with flowbite-react configuration...`);
await fs.writeFile(file, updatedContent, "utf-8");
}
return found;
} catch (error) {
console.error("Failed to setup Tailwind CSS v4:", error);
}
}
async function setupTailwindV3() {
try {
const configFiles = await findFiles.findFiles({
patterns: [
"tailwind.config.cjs",
"tailwind.config.js",
"tailwind.config.mjs",
"tailwind.config.mts",
"tailwind.config.ts"
],
excludeDirs: consts.excludeDirs
});
for (const configFile of configFiles) {
const content = await fs.readFile(configFile, "utf-8");
let updatedContent = addImport.addImport({
content,
importName: consts.pluginName,
importPath: normalizePath.joinNormalizedPath(consts.pluginPath, "tailwindcss")
});
updatedContent = addToConfig.addToConfig({
content: updatedContent,
targetPath: "content",
valueGenerator: (b) => b.stringLiteral(consts.classListFilePath)
});
updatedContent = addToConfig.addToConfig({
content: updatedContent,
targetPath: "plugins",
valueGenerator: (b) => b.identifier(consts.pluginName)
});
if (updatedContent !== content) {
console.log(`Updating ${configFile} with flowbite-react configuration...`);
await fs.writeFile(configFile, updatedContent, "utf-8");
}
break;
}
return !!configFiles.length;
} catch (error) {
console.error("Failed to setup Tailwind CSS v3:", error);
return false;
}
}
exports.setupTailwind = setupTailwind;
//# sourceMappingURL=setup-tailwind.cjs.map
;