rantail
Version:
The ultimate companion for Tailwind CSS. Write clean and secure code effortlessly. Protect your work from theft with Rantail. Encode your Tailwind classes with unique and customizable cuid's. Enjoy smooth, encoded, and theft-proof coding.
1 lines • 11.1 kB
Source Map (JSON)
{"version":3,"sources":["../src/logger.ts","../src/utils/merge.ts","../src/utils/defaults.ts","../src/utils/path.ts","../src/parsers/config-parser.ts","../src/cli.ts","../src/utils/cuid.ts"],"sourcesContent":["export class Logger {\r\n\r\n /**\r\n * Generic error logger\r\n * @param text\r\n * @returns\r\n */\r\n static error(...text: string[]) {\r\n return console.error(`❌`, `[rantail]`, ...text);\r\n }\r\n\r\n /**\r\n * Generic log\r\n * @param emoji\r\n * @param text\r\n */\r\n static log(emoji: string, ...text: string[]): any {\r\n return console.log(emoji, `[rantail]:`, ...text);\r\n }\r\n\r\n /**\r\n * Generic success logger\r\n * @param\r\n * @returns\r\n */\r\n\r\n static generationCompleted() {\r\n Logger.log(`✅`, 'Generation completed')\r\n }\r\n\r\n /**\r\n * Generic file process logger\r\n * @param\r\n * @returns\r\n */\r\n\r\n static logFile(fileName: string) {\r\n Logger.log(`❗`, `Processing File`, fileName)\r\n }\r\n\r\n /**\r\n * Generic config loader logger\r\n * @param\r\n * @returns\r\n */\r\n\r\n static loadingConfig(path: string) {\r\n Logger.log(`✨`, `Loading Rantail config from `, path)\r\n }\r\n\r\n static loadingCSS(path:string){\r\n Logger.log(`✨`, `Loading main CSS file from `, path)\r\n }\r\n}\r\n","import _ from 'lodash';\r\n\r\nexport const overwriteMerge = <T>(...configs: Array<Partial<T>>): T => {\r\n return _.merge({}, ...configs) as T;\r\n}\r\n\r\nexport const combineMerge = <T>(...configs: Array<Partial<T>>): T => {\r\n return _.merge({}, ...configs) as T;\r\n}","import { overwriteMerge } from \"./merge\";\r\nimport { IConfig } from \"../interface\";\r\n\r\nexport const defaultConfig: Partial<IConfig> = {\r\n content: [\r\n './pages/**/*.{js,jsx,ts,tsx}',\r\n './components/**/*.{js,jsx,ts,tsx}',\r\n './app/**/*.{js,jsx,ts,tsx}',\r\n './src/**/*.{js,jsx,ts,tsx}',\r\n ],\r\n cuidLength: 12\r\n}\r\n\r\nexport const withDefaultConfig = (config: Partial<IConfig>): IConfig => {\r\n return overwriteMerge(defaultConfig, config)\r\n}\r\n","import path from 'node:path';\r\nconst minimist = require(\"minimist\");\r\nimport fs from 'node:fs/promises'\r\nimport { pathToFileURL } from 'url'\r\nimport { Logger } from '../logger';\r\n\r\n/**\r\n * Returns absolute path from path segments\r\n * @param pathSegment\r\n * @returns\r\n */\r\n\r\nexport const getPath = (...pathSegment: string[]): string => {\r\n return path.resolve(process.cwd(), ...pathSegment);\r\n};\r\n\r\n/**\r\n * Returns path of config file\r\n * @param\r\n * @returns\r\n */\r\n\r\nexport const getConfigFilePath = async () => {\r\n\r\n const args = minimist(process.argv.slice(2))\r\n const configPath = getPath(args.config || 'rantail.config.js')\r\n\r\n return fs\r\n .stat(configPath)\r\n .then(() => pathToFileURL(configPath).toString())\r\n}\r\n\r\n/**\r\n * Returns path of main css file (to be integrated with config file)\r\n * @param\r\n * @returns\r\n */\r\n\r\nexport const getCSSFilePath = async (cssFilePath: string) => {\r\n \r\n if (!cssFilePath) {\r\n throw new Error('CSS File Path is not declared in the config File, continuing with unencoded code build.');\r\n }\r\n\r\n const fullCssFilePath = getPath(cssFilePath);\r\n\r\n Logger.loadingCSS(fullCssFilePath)\r\n\r\n // Check file stat\r\n return fullCssFilePath;\r\n};","import { IConfig } from \"../interface\"\r\nimport { Logger } from \"../logger\"\r\nimport { withDefaultConfig } from \"../utils/defaults\"\r\nimport { getConfigFilePath } from \"../utils/path\"\r\n\r\nexport class ConfigParser {\r\n /**\r\n * Load rantail.config.js as module\r\n * @returns\r\n */\r\n\r\n private async loadBaseConfig(): Promise<IConfig> {\r\n // Get config file path\r\n const path = await getConfigFilePath()\r\n\r\n // Config loading message\r\n Logger.loadingConfig(path)\r\n\r\n // Load base config\r\n const baseConfig = await import(path)\r\n\r\n if (!baseConfig?.default) {\r\n throw new Error('Unable to import rantail config file')\r\n }\r\n\r\n return withDefaultConfig(baseConfig.default)\r\n }\r\n\r\n async loadConfig() {\r\n // Load base config\r\n const config = await this.loadBaseConfig()\r\n\r\n // Return full result\r\n return {\r\n config,\r\n }\r\n }\r\n}","import { TailwindClasses } from \"./interface\";\r\nimport { Logger } from \"./logger\";\r\nimport { ConfigParser } from \"./parsers/config-parser\";\r\nimport { getCSSFilePath } from \"./utils/path\";\r\nimport fs from 'node:fs'\r\nimport * as fg from 'fast-glob'\r\nimport { generateCUID } from \"./utils/cuid\";\r\n\r\n\r\n\r\nexport class CLI {\r\n\r\n async main() {\r\n\r\n const configParser = new ConfigParser()\r\n const { config } = await configParser.loadConfig()\r\n\r\n let cssFilePath = await getCSSFilePath(config.cssFilePath);\r\n\r\n fs.appendFileSync(cssFilePath, '\\n');\r\n\r\n const classNameRegex: RegExp = /className=(['\"])(.*?)\\1|className={`([^`]*?)`}/g;\r\n\r\n let match: RegExpExecArray | null;\r\n let replacements: TailwindClasses = {};\r\n\r\n for (const pattern of config.content) {\r\n // Use fast-glob to match the file pattern\r\n const files: string[] = fg.globSync(pattern);\r\n // Loop through each matched file\r\n for (const file of files) {\r\n // Read the JSX file\r\n Logger.logFile(file);\r\n let jsxFileContent: string = fs.readFileSync(file, 'utf8');\r\n\r\n while ((match = classNameRegex.exec(jsxFileContent)) !== null) {\r\n const originalClassNames = (match[2] || match[3])?.replace(/`|'|\"|{|}/g, '').split(' ');\r\n if (Array.isArray(originalClassNames)) {\r\n for (const originalClassName of originalClassNames) {\r\n if (!/^[a-z0-9-:\\\\[\\]\\\\]+$/.test(originalClassName) || originalClassName.length < 3 || (config.ignore && originalClassName.startsWith(config.ignore))) {\r\n continue;\r\n }\r\n if (!replacements[originalClassName]) {\r\n const randomClassName: string = generateCUID(config.cuidLength, config.prefix, config.suffix);\r\n replacements[originalClassName] = randomClassName;\r\n\r\n // Add the styles to the CSS file\r\n let cssContent: string = `.${randomClassName} { @apply ${originalClassName}; }\\n`;\r\n fs.appendFileSync(cssFilePath, cssContent);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Replace the class names in the JSX file\r\n for (let key in replacements) {\r\n let value = replacements[key];\r\n // Escape special characters in the key\r\n let escapedKey = key.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\r\n let regex = new RegExp(`(?<![a-z0-9-_])${escapedKey}(?![a-z0-9-_])`, 'g');\r\n jsxFileContent = jsxFileContent.replace(regex, value);\r\n }\r\n\r\n // Write the modified JSX file\r\n fs.writeFileSync(file, jsxFileContent);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Execute and log result\r\n * @returns\r\n */\r\n\r\n async execute() {\r\n return this.main().then(Logger.generationCompleted).catch(Logger.error)\r\n }\r\n}","import { init } from '@paralleldrive/cuid2'\r\n\r\n// Generate a cuid2\r\nexport const generateCUID = (cuidLength: number, prefix?: string, suffix?: string): string => {\r\n const cuid = init({ length: cuidLength });\r\n let generatedCuid = cuid();\r\n\r\n if (prefix) {\r\n generatedCuid = prefix + generatedCuid;\r\n }\r\n\r\n if (suffix) {\r\n generatedCuid = generatedCuid + suffix;\r\n }\r\n\r\n return generatedCuid;\r\n}"],"mappings":"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","names":["path","path","fs","fs"]}