flowbite-react
Version:
Official React components built for Flowbite and Tailwind CSS
124 lines (121 loc) • 4.5 kB
JavaScript
import fs__default from 'fs/promises';
import path__default from 'path';
import { excludeDirs, pluginPath, classListFilePath, pluginName } from '../consts.js';
import { addImport } from '../utils/add-import.js';
import { addToConfig } from '../utils/add-to-config.js';
import { findFiles } from '../utils/find-files.js';
import { joinNormalizedPath } from '../utils/normalize-path.js';
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({
patterns: ["**/*.css", "**/*.less", "**/*.sass", "**/*.scss"],
excludeDirs
});
let found = false;
for (const file of cssFiles) {
const content = await fs__default.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 = joinNormalizedPath(pluginPath, "tailwindcss");
const sourceDirectivePath = path__default.join(path__default.relative(path__default.dirname(file), process.cwd()), 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__default.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({
patterns: [
"tailwind.config.cjs",
"tailwind.config.js",
"tailwind.config.mjs",
"tailwind.config.mts",
"tailwind.config.ts"
],
excludeDirs
});
for (const configFile of configFiles) {
const content = await fs__default.readFile(configFile, "utf-8");
let updatedContent = addImport({
content,
importName: pluginName,
importPath: joinNormalizedPath(pluginPath, "tailwindcss")
});
updatedContent = addToConfig({
content: updatedContent,
targetPath: "content",
valueGenerator: (b) => b.stringLiteral(classListFilePath)
});
updatedContent = addToConfig({
content: updatedContent,
targetPath: "plugins",
valueGenerator: (b) => b.identifier(pluginName)
});
if (updatedContent !== content) {
console.log(`Updating ${configFile} with flowbite-react configuration...`);
await fs__default.writeFile(configFile, updatedContent, "utf-8");
}
break;
}
return !!configFiles.length;
} catch (error) {
console.error("Failed to setup Tailwind CSS v3:", error);
return false;
}
}
export { setupTailwind };
//# sourceMappingURL=setup-tailwind.js.map