@vueland/utils-jit 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["normalizePath","matchesPattern","path","fs"],"sources":["../src/core.ts","../src/validators.ts","../src/rules.ts","../src/plugin.ts"],"sourcesContent":["import type {\n CssBody,\n DeclarationMap,\n DeclarationValue,\n ParsedToken,\n Pattern,\n RuleMatch,\n RuleOptions,\n UtilityRule,\n VariantDefinition,\n VariantMap,\n} from './types'\n\nexport const DEFAULT_INCLUDE: Pattern[] = [\n /\\.(vue|js|ts|jsx|tsx|html)$/,\n]\n\nexport const DEFAULT_EXCLUDE: Pattern[] = [\n /(^|[/\\\\])node_modules([/\\\\]|$)/,\n /(^|[/\\\\])\\.git([/\\\\]|$)/,\n /(^|[/\\\\])dist([/\\\\]|$)/,\n /(^|[/\\\\])build([/\\\\]|$)/,\n /(^|[/\\\\])coverage([/\\\\]|$)/,\n /(^|[/\\\\])\\.output([/\\\\]|$)/,\n /(^|[/\\\\])\\.nuxt([/\\\\]|$)/,\n /(^|[/\\\\])\\.turbo([/\\\\]|$)/,\n /(^|[/\\\\])\\.generated([/\\\\]|$)/,\n /(^|[/\\\\])storybook-static([/\\\\]|$)/,\n /(^|[/\\\\])playwright-report([/\\\\]|$)/,\n]\n\nexport const DEFAULT_BREAKPOINTS: Record<string, number> = {\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n '2xl': 1536,\n}\n\nexport const DEFAULT_VARIANTS: VariantMap = {\n hover: { kind: 'pseudo', value: 'hover' },\n focus: { kind: 'pseudo', value: 'focus' },\n 'focus-visible': { kind: 'pseudo', value: 'focus-visible' },\n 'focus-within': { kind: 'pseudo', value: 'focus-within' },\n active: { kind: 'pseudo', value: 'active' },\n disabled: { kind: 'pseudo', value: 'disabled' },\n checked: { kind: 'pseudo', value: 'checked' },\n visited: { kind: 'pseudo', value: 'visited' },\n first: { kind: 'pseudo', value: 'first-child' },\n last: { kind: 'pseudo', value: 'last-child' },\n odd: { kind: 'pseudo', value: 'nth-child(odd)' },\n even: { kind: 'pseudo', value: 'nth-child(even)' }\n}\n\nconst MIN_TOKEN_LENGTH = 5\nconst MAX_TOKEN_LENGTH = 180\nconst MAX_VALUE_LENGTH = 160\n\nfunction normalizePath(value: string): string {\n return value.replace(/\\\\/g, '/')\n}\n\nfunction matchesPattern(value: string, pattern: Pattern): boolean {\n const normalized = normalizePath(value)\n\n if (typeof pattern === 'string') {\n return normalized.includes(normalizePath(pattern))\n }\n\n pattern.lastIndex = 0\n\n return pattern.test(normalized)\n}\n\nexport function shouldProcess(\n id: string,\n include: Pattern[] = DEFAULT_INCLUDE,\n exclude: Pattern[] = []\n): boolean {\n const cleanId = id.split('?')[0]\n\n if (!cleanId) {\n return false\n }\n\n if (exclude.some((pattern) => matchesPattern(cleanId, pattern))) {\n return false\n }\n\n return include.some((pattern) => matchesPattern(cleanId, pattern))\n}\n\nexport function escapeCssSelector(value: string): string {\n return value.replace(/[^a-zA-Z0-9_-]/g, (char) => `\\\\${char}`)\n}\n\nexport function normalizeValue(value: string): string {\n return value.trim().replace(/\\s+/g, ' ')\n}\n\nexport function isSafeCssValue(value: string): boolean {\n const normalized = normalizeValue(value)\n\n if (!normalized) {\n return false\n }\n\n if (normalized.length > MAX_VALUE_LENGTH) {\n return false\n }\n\n if (/[;{}<>]/.test(normalized)) {\n return false\n }\n\n if (/\\/\\*/.test(normalized) || /\\*\\//.test(normalized)) {\n return false\n }\n\n if (!/[a-zA-Z0-9]/.test(normalized)) {\n return false\n }\n\n return /^[-a-zA-Z0-9.%_(),+/*\\s[\\]#]+$/.test(normalized)\n}\n\nfunction stripEdgeGarbage(token: string): string {\n return token.replace(/^['\"`{(]+|['\"`})>,;]+$/g, '')\n}\n\nfunction looksLikeArbitraryUtility(token: string): boolean {\n if (!token) {\n return false\n }\n\n if (token.length < MIN_TOKEN_LENGTH || token.length > MAX_TOKEN_LENGTH) {\n return false\n }\n\n if (!token.includes('-[') || !token.endsWith(']')) {\n return false\n }\n\n if (token.startsWith('<') || token.startsWith('>')) {\n return false\n }\n\n const arbitraryIndex = token.indexOf('-[')\n\n return arbitraryIndex > 0\n}\n\nexport function stripComments(code: string): string {\n return code\n .replace(/<!--[\\s\\S]*?-->/g, ' ')\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, ' ')\n .replace(/(^|[^:])\\/\\/.*$/gm, '$1 ')\n}\n\nexport function extractClassCandidates(code: string): string[] {\n const candidates: string[] = []\n\n const patterns = [\n /(?:^|[\\s<]):class\\s*=\\s*\"([^\"]*)\"/g,\n /(?:^|[\\s<]):class\\s*=\\s*'([^']*)'/g,\n /(?:^|[\\s<])class\\s*=\\s*\"([^\"]*)\"/g,\n /(?:^|[\\s<])class\\s*=\\s*'([^']*)'/g,\n ]\n\n for (const pattern of patterns) {\n for (const match of code.matchAll(pattern)) {\n const value = match[1]\n\n if (value) {\n candidates.push(value)\n }\n }\n }\n\n return candidates\n}\n\nfunction tokenizeChunk(code: string): Set<string> {\n const result = new Set<string>()\n\n const pattern =\n /(?:[a-zA-Z0-9_-]+:)*[a-zA-Z][a-zA-Z0-9_-]*-\\[[^\\]\\s]+(?:\\s+[^\\]\\s]+)*\\]/g\n\n for (const match of code.matchAll(pattern)) {\n const raw = match[0]\n const token = stripEdgeGarbage(raw)\n\n if (looksLikeArbitraryUtility(token)) {\n result.add(token)\n }\n }\n\n return result\n}\n\nexport function tokenize(code: string): Set<string> {\n const cleanCode = stripComments(code)\n const classCandidates = extractClassCandidates(cleanCode)\n\n if (classCandidates.length > 0) {\n const result = new Set<string>()\n\n for (const candidate of classCandidates) {\n for (const token of tokenizeChunk(candidate)) {\n result.add(token)\n }\n }\n\n if (result.size > 0) {\n return result\n }\n }\n\n return tokenizeChunk(cleanCode)\n}\n\nexport function parseToken(token: string): ParsedToken | null {\n const parts = token.split(':').filter(Boolean)\n\n if (!parts.length) {\n return null\n }\n\n const utility = parts[parts.length - 1]\n const variants = parts.slice(0, -1)\n\n if (!utility.includes('-[') || !utility.endsWith(']')) {\n return null\n }\n\n return {\n raw: token,\n variants,\n utility,\n }\n}\n\nexport function camelToKebab(value: string): string {\n if (value.startsWith('--')) {\n return value\n }\n\n return value.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`)\n}\n\nfunction withImportant(value: DeclarationValue, important: boolean): string {\n const normalized = String(value)\n\n if (!important) {\n return normalized\n }\n\n if (/\\s!important\\s*$/i.test(normalized)) {\n return normalized\n }\n\n return `${normalized} !important`\n}\n\nfunction objectToDeclarations(\n declaration: DeclarationMap,\n important: boolean\n): string[] {\n return Object.entries(declaration).map(([prop, value]) => {\n return `${camelToKebab(prop)}: ${withImportant(value, important)};`\n })\n}\n\nfunction normalizeDeclarations(\n declaration: DeclarationMap | string[],\n important: boolean\n): string[] {\n if (Array.isArray(declaration)) {\n return declaration\n }\n\n return objectToDeclarations(declaration, important)\n}\n\nexport function defineRule(options: RuleOptions): UtilityRule {\n const important = options.important ?? true\n\n return {\n name: options.name,\n\n match(utility: string): RuleMatch | null {\n options.matcher.lastIndex = 0\n\n const match = utility.match(options.matcher)\n\n if (!match) {\n return null\n }\n\n const rawValue = match[1]\n\n if (!rawValue) {\n return null\n }\n\n const value = normalizeValue(rawValue)\n\n if (!value || !isSafeCssValue(value)) {\n return null\n }\n\n if (options.validate && !options.validate(value)) {\n return null\n }\n\n return {\n declarations: normalizeDeclarations(\n options.declaration(value),\n important\n ),\n }\n },\n }\n}\n\nexport const createArbitraryRule = defineRule\n\nexport function resolveRule(\n utility: string,\n rules: UtilityRule[]\n): CssBody | null {\n for (const rule of rules) {\n const match = rule.match(utility)\n\n if (match) {\n return {\n declarations: match.declarations,\n }\n }\n }\n\n return null\n}\n\nfunction formatMathFunctions(value: string): string {\n return value.replace(\n /\\b(calc|min|max|clamp)\\(([^()]+)\\)/g,\n (_match, fn: string, expr: string) => {\n const formatted = expr\n .replace(/\\s*([+\\-*/])\\s*/g, ' $1 ')\n .replace(/\\s+/g, ' ')\n .trim()\n\n return `${fn}(${formatted})`\n }\n )\n}\n\nfunction applySelectorVariant(\n selector: string,\n variant: VariantDefinition\n): string | null {\n if (variant.kind === 'pseudo') {\n return `${selector}:${variant.value}`\n }\n\n if (variant.kind === 'selector') {\n const template = String(variant.value)\n\n return template.includes('&')\n ? template.replace(/&/g, selector)\n : `${template} ${selector}`\n }\n\n if (variant.kind === 'attribute') {\n return `${selector}${variant.value}`\n }\n\n return null\n}\n\nexport function buildCssRule(\n parsed: ParsedToken,\n cssBody: CssBody,\n breakpoints: Record<string, number> = DEFAULT_BREAKPOINTS,\n variants: VariantMap = DEFAULT_VARIANTS\n): string | null {\n let selector = `.${escapeCssSelector(parsed.raw)}`\n const mediaVariants: string[] = []\n\n for (const variantName of parsed.variants) {\n if (variantName in breakpoints) {\n mediaVariants.push(variantName)\n continue\n }\n\n const variant = variants[variantName]\n\n if (!variant) {\n return null\n }\n\n if (variant.kind === 'media') {\n mediaVariants.push(variantName)\n continue\n }\n\n const nextSelector = applySelectorVariant(selector, variant)\n\n if (!nextSelector) {\n return null\n }\n\n selector = nextSelector\n }\n\n const body = cssBody.declarations\n .map((decl) => {\n return decl.replace(\n /:\\s*([^;]+)(;?)$/,\n (_match, value: string, semicolon: string) => {\n return `: ${formatMathFunctions(value.trim())}${semicolon}`\n }\n )\n })\n .join('')\n\n let result = `${selector}{${body}}`\n\n for (const variantName of mediaVariants.reverse()) {\n const customVariant = variants[variantName]\n const minWidth =\n typeof customVariant?.value === 'number'\n ? customVariant.value\n : breakpoints[variantName]\n\n if (typeof minWidth !== 'number') {\n return null\n }\n\n result = `@media (min-width: ${minWidth}px) { ${result} }`\n }\n\n return result\n}\n","const CSS_NUMBER_RE = /^-?(?:\\d+|\\d*\\.\\d+)$/\n\nconst CSS_LENGTH_UNIT_RE =\n /(?:px|r?em|%|vw|vh|svw|svh|lvw|lvh|dvw|dvh|vmin|vmax|ch|ex|cm|mm|in|pt|pc)/\n\nconst CSS_LENGTH_RE = new RegExp(\n `^-?(?:\\\\d+|\\\\d*\\\\.\\\\d+)${CSS_LENGTH_UNIT_RE.source}$`\n)\n\nconst CSS_COLOR_KEYWORDS = new Set([\n 'transparent',\n 'currentColor',\n 'inherit',\n 'initial',\n 'unset',\n 'revert',\n])\n\nconst CSS_GLOBAL_VALUES = new Set([\n 'inherit',\n 'initial',\n 'unset',\n 'revert',\n 'revert-layer',\n])\n\nexport function isNumberValue(value: string): boolean {\n return CSS_NUMBER_RE.test(value)\n}\n\nexport function isZeroValue(value: string): boolean {\n return value === '0' || value === '-0'\n}\n\nexport function isCssGlobalValue(value: string): boolean {\n return CSS_GLOBAL_VALUES.has(value)\n}\n\nexport function isFunctionalCssValue(value: string): boolean {\n return /^(?:calc|min|max|clamp|var)\\(.+\\)$/.test(value)\n}\n\nexport function isLengthLikeValue(value: string): boolean {\n return isZeroValue(value) || CSS_LENGTH_RE.test(value) || isFunctionalCssValue(value)\n}\n\nexport function isLengthListValue(value: string, maxItems = 4): boolean {\n const items = value.trim().split(/\\s+/)\n\n if (items.length === 0 || items.length > maxItems) {\n return false\n }\n\n return items.every((item) => isLengthLikeValue(item))\n}\n\nexport function isSizeValue(value: string): boolean {\n return isCssGlobalValue(value) || value === 'auto' || isLengthLikeValue(value)\n}\n\nexport function isPaddingValue(value: string): boolean {\n return isCssGlobalValue(value) || isLengthListValue(value, 4)\n}\n\nexport function isMarginValue(value: string): boolean {\n if (isCssGlobalValue(value)) {\n return true\n }\n\n const items = value.trim().split(/\\s+/)\n\n if (items.length === 0 || items.length > 4) {\n return false\n }\n\n return items.every((item) => item === 'auto' || isLengthLikeValue(item))\n}\n\nexport function isRadiusValue(value: string): boolean {\n return isCssGlobalValue(value) || isLengthListValue(value, 4)\n}\n\nexport function isPositionValue(value: string): boolean {\n return isCssGlobalValue(value) || value === 'auto' || isLengthLikeValue(value)\n}\n\nexport function isZIndexValue(value: string): boolean {\n return (\n isCssGlobalValue(value) ||\n value === 'auto' ||\n CSS_NUMBER_RE.test(value) ||\n /^var\\(.+\\)$/.test(value)\n )\n}\n\nexport function isOpacityValue(value: string): boolean {\n if (isCssGlobalValue(value)) {\n return true\n }\n\n if (!CSS_NUMBER_RE.test(value)) {\n return /^var\\(.+\\)$/.test(value)\n }\n\n const numeric = Number(value)\n\n return numeric >= 0 && numeric <= 1\n}\n\nexport function isColorValue(value: string): boolean {\n return (\n isCssGlobalValue(value) ||\n CSS_COLOR_KEYWORDS.has(value) ||\n /^#[0-9a-fA-F]{3,8}$/.test(value) ||\n /^(?:rgb|rgba|hsl|hsla|oklch|oklab|color)\\(.+\\)$/.test(value) ||\n /^var\\(.+\\)$/.test(value)\n )\n}\n","import { defineRule } from './core'\nimport {\n isColorValue,\n isMarginValue,\n isOpacityValue,\n isPaddingValue,\n isPositionValue,\n isRadiusValue,\n isSizeValue,\n isZIndexValue,\n} from './validators'\n\nexport const defaultRules = [\n defineRule({\n name: 'width',\n matcher: /^w-\\[(.+)\\]$/,\n validate: isSizeValue,\n declaration: (value) => ({\n width: value,\n }),\n }),\n\n defineRule({\n name: 'height',\n matcher: /^h-\\[(.+)\\]$/,\n validate: isSizeValue,\n declaration: (value) => ({\n height: value,\n }),\n }),\n\n defineRule({\n name: 'min-width',\n matcher: /^min-w-\\[(.+)\\]$/,\n validate: isSizeValue,\n declaration: (value) => ({\n minWidth: value,\n }),\n }),\n\n defineRule({\n name: 'max-width',\n matcher: /^max-w-\\[(.+)\\]$/,\n validate: isSizeValue,\n declaration: (value) => ({\n maxWidth: value,\n }),\n }),\n\n defineRule({\n name: 'min-height',\n matcher: /^min-h-\\[(.+)\\]$/,\n validate: isSizeValue,\n declaration: (value) => ({\n minHeight: value,\n }),\n }),\n\n defineRule({\n name: 'max-height',\n matcher: /^max-h-\\[(.+)\\]$/,\n validate: isSizeValue,\n declaration: (value) => ({\n maxHeight: value,\n }),\n }),\n\n defineRule({\n name: 'z-index',\n matcher: /^z-\\[(.+)\\]$/,\n validate: isZIndexValue,\n declaration: (value) => ({\n zIndex: value,\n }),\n }),\n\n defineRule({\n name: 'margin',\n matcher: /^ma-\\[(.+)\\]$/,\n validate: isMarginValue,\n declaration: (value) => ({\n margin: value,\n }),\n }),\n\n defineRule({\n name: 'margin-x',\n matcher: /^mx-\\[(.+)\\]$/,\n validate: isMarginValue,\n declaration: (value) => ({\n marginLeft: value,\n marginRight: value,\n }),\n }),\n\n defineRule({\n name: 'margin-y',\n matcher: /^my-\\[(.+)\\]$/,\n validate: isMarginValue,\n declaration: (value) => ({\n marginTop: value,\n marginBottom: value,\n }),\n }),\n\n defineRule({\n name: 'margin-bottom',\n matcher: /^mb-\\[(.+)\\]$/,\n validate: isMarginValue,\n declaration: (value) => ({\n marginBottom: value,\n }),\n }),\n\n defineRule({\n name: 'margin-top',\n matcher: /^mt-\\[(.+)\\]$/,\n validate: isMarginValue,\n declaration: (value) => ({\n marginTop: value,\n }),\n }),\n\n defineRule({\n name: 'margin-left',\n matcher: /^ml-\\[(.+)\\]$/,\n validate: isMarginValue,\n declaration: (value) => ({\n marginLeft: value,\n }),\n }),\n\n defineRule({\n name: 'margin-right',\n matcher: /^mr-\\[(.+)\\]$/,\n validate: isMarginValue,\n declaration: (value) => ({\n marginRight: value,\n }),\n }),\n\n defineRule({\n name: 'padding',\n matcher: /^pa-\\[(.+)\\]$/,\n validate: isPaddingValue,\n declaration: (value) => ({\n padding: value,\n }),\n }),\n\n defineRule({\n name: 'padding-x',\n matcher: /^px-\\[(.+)\\]$/,\n validate: isPaddingValue,\n declaration: (value) => ({\n paddingLeft: value,\n paddingRight: value,\n }),\n }),\n\n defineRule({\n name: 'padding-y',\n matcher: /^py-\\[(.+)\\]$/,\n validate: isPaddingValue,\n declaration: (value) => ({\n paddingTop: value,\n paddingBottom: value,\n }),\n }),\n\n defineRule({\n name: 'padding-bottom',\n matcher: /^pb-\\[(.+)\\]$/,\n validate: isPaddingValue,\n declaration: (value) => ({\n paddingBottom: value,\n }),\n }),\n\n defineRule({\n name: 'padding-top',\n matcher: /^pt-\\[(.+)\\]$/,\n validate: isPaddingValue,\n declaration: (value) => ({\n paddingTop: value,\n }),\n }),\n\n defineRule({\n name: 'padding-left',\n matcher: /^pl-\\[(.+)\\]$/,\n validate: isPaddingValue,\n declaration: (value) => ({\n paddingLeft: value,\n }),\n }),\n\n defineRule({\n name: 'padding-right',\n matcher: /^pr-\\[(.+)\\]$/,\n validate: isPaddingValue,\n declaration: (value) => ({\n paddingRight: value,\n }),\n }),\n\n defineRule({\n name: 'left',\n matcher: /^left-\\[(.+)\\]$/,\n validate: isPositionValue,\n declaration: (value) => ({\n left: value,\n }),\n }),\n\n defineRule({\n name: 'right',\n matcher: /^right-\\[(.+)\\]$/,\n validate: isPositionValue,\n declaration: (value) => ({\n right: value,\n }),\n }),\n\n defineRule({\n name: 'top',\n matcher: /^top-\\[(.+)\\]$/,\n validate: isPositionValue,\n declaration: (value) => ({\n top: value,\n }),\n }),\n\n defineRule({\n name: 'bottom',\n matcher: /^bottom-\\[(.+)\\]$/,\n validate: isPositionValue,\n declaration: (value) => ({\n bottom: value,\n }),\n }),\n\n defineRule({\n name: 'inset',\n matcher: /^inset-\\[(.+)\\]$/,\n validate: isPositionValue,\n declaration: (value) => ({\n inset: value,\n }),\n }),\n\n defineRule({\n name: 'radius',\n matcher: /^radius-\\[(.+)\\]$/,\n validate: isRadiusValue,\n declaration: (value) => ({\n borderRadius: value,\n }),\n }),\n\n defineRule({\n name: 'radius-top-left',\n matcher: /^radius-tl-\\[(.+)\\]$/,\n validate: isRadiusValue,\n declaration: (value) => ({\n borderTopLeftRadius: value,\n }),\n }),\n\n defineRule({\n name: 'radius-top-right',\n matcher: /^radius-tr-\\[(.+)\\]$/,\n validate: isRadiusValue,\n declaration: (value) => ({\n borderTopRightRadius: value,\n }),\n }),\n\n defineRule({\n name: 'radius-bottom-left',\n matcher: /^radius-bl-\\[(.+)\\]$/,\n validate: isRadiusValue,\n declaration: (value) => ({\n borderBottomLeftRadius: value,\n }),\n }),\n\n defineRule({\n name: 'radius-bottom-right',\n matcher: /^radius-br-\\[(.+)\\]$/,\n validate: isRadiusValue,\n declaration: (value) => ({\n borderBottomRightRadius: value,\n }),\n }),\n\n defineRule({\n name: 'opacity',\n matcher: /^opacity-\\[(.+)\\]$/,\n validate: isOpacityValue,\n declaration: (value) => ({\n opacity: value,\n }),\n }),\n\n defineRule({\n name: 'color',\n matcher: /^color-\\[(.+)\\]$/,\n validate: isColorValue,\n declaration: (value) => ({\n color: value,\n }),\n }),\n\n defineRule({\n name: 'background-color',\n matcher: /^bg-\\[(.+)\\]$/,\n validate: isColorValue,\n declaration: (value) => ({\n backgroundColor: value,\n }),\n }),\n]\n","import * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport type { Plugin, ViteDevServer } from 'vite'\nimport type { JitOptions, ParsedToken, Pattern, ResolvedJitOptions, UtilityRule } from './types'\nimport { defaultRules } from './rules'\nimport {\n buildCssRule,\n DEFAULT_BREAKPOINTS,\n DEFAULT_EXCLUDE,\n DEFAULT_INCLUDE,\n DEFAULT_VARIANTS,\n parseToken,\n resolveRule,\n shouldProcess,\n tokenize,\n} from './core'\n\nfunction resolveOptions(options: JitOptions = {}): ResolvedJitOptions {\n return {\n include: options.include ?? DEFAULT_INCLUDE,\n exclude: [\n ...DEFAULT_EXCLUDE,\n ...(options.exclude ?? []),\n ],\n outFile: options.outFile ?? 'src/.generated/utils-jit.css',\n breakpoints: {\n ...DEFAULT_BREAKPOINTS,\n ...(options.breakpoints ?? {}),\n },\n rules: options.rules ?? [],\n variants: {\n ...DEFAULT_VARIANTS,\n ...(options.variants ?? {}),\n },\n banner: options.banner ?? '/* @vueland/utils-jit: generated utilities */',\n emitEmptyFile: options.emitEmptyFile ?? true,\n debug: options.debug ?? false,\n }\n}\n\nfunction normalizePath(value: string): string {\n return value.replace(/\\\\/g, '/')\n}\n\nfunction isSameFile(a: string, b: string): boolean {\n return normalizePath(path.resolve(a)) === normalizePath(path.resolve(b))\n}\n\nfunction matchesPattern(value: string, pattern: Pattern): boolean {\n const normalized = normalizePath(value)\n\n if (typeof pattern === 'string') {\n return normalized.includes(normalizePath(pattern))\n }\n\n pattern.lastIndex = 0\n\n return pattern.test(normalized)\n}\n\nfunction isExcluded(file: string, exclude: Pattern[]): boolean {\n return exclude.some((pattern) => matchesPattern(file, pattern))\n}\n\nfunction collectProjectFiles(\n root: string,\n options: ResolvedJitOptions,\n outFile: string\n): string[] {\n const files: string[] = []\n\n function walk(dir: string): void {\n if (isExcluded(dir, options.exclude)) {\n return\n }\n\n let entries: fs.Dirent[]\n\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true })\n } catch {\n return\n }\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n\n if (entry.isDirectory()) {\n walk(fullPath)\n continue\n }\n\n if (!entry.isFile()) {\n continue\n }\n\n if (isSameFile(fullPath, outFile)) {\n continue\n }\n\n if (shouldProcess(fullPath, options.include, options.exclude)) {\n files.push(fullPath)\n }\n }\n }\n\n walk(root)\n\n return files\n}\n\nfunction readFileSafe(file: string): string | null {\n try {\n return fs.readFileSync(file, 'utf8')\n } catch {\n return null\n }\n}\n\nexport function utilsJIT(options?: JitOptions): Plugin {\n const resolvedOptions = resolveOptions(options)\n\n let root = process.cwd()\n let outFile = ''\n let devServer: ViteDevServer | null = null\n let currentCss = ''\n\n const allRules: UtilityRule[] = [\n ...defaultRules,\n ...resolvedOptions.rules,\n ]\n\n const fileToTokens = new Map<string, Set<string>>()\n const tokenRefCount = new Map<string, number>()\n const tokenParseCache = new Map<string, ParsedToken | null>()\n const tokenCssCache = new Map<string, string | null>()\n const activeCssRules = new Map<string, string>()\n\n function debug(message: string): void {\n if (resolvedOptions.debug) {\n console.info(`[utils-jit] ${message}`)\n }\n }\n\n function notifyCssChanged(): void {\n if (!devServer || !outFile) {\n return\n }\n\n devServer.watcher.emit('change', outFile)\n }\n\n function getParsedToken(token: string): ParsedToken | null {\n if (tokenParseCache.has(token)) {\n return tokenParseCache.get(token) ?? null\n }\n\n const parsed = parseToken(token)\n\n tokenParseCache.set(token, parsed)\n\n return parsed\n }\n\n function getCssRuleForToken(token: string): string | null {\n if (tokenCssCache.has(token)) {\n return tokenCssCache.get(token) ?? null\n }\n\n const parsed = getParsedToken(token)\n\n if (!parsed) {\n tokenCssCache.set(token, null)\n return null\n }\n\n const cssBody = resolveRule(parsed.utility, allRules)\n\n if (!cssBody) {\n tokenCssCache.set(token, null)\n return null\n }\n\n const cssRule = buildCssRule(\n parsed,\n cssBody,\n resolvedOptions.breakpoints,\n resolvedOptions.variants\n )\n\n tokenCssCache.set(token, cssRule)\n\n return cssRule\n }\n\n function buildFinalCss(): string {\n if (!activeCssRules.size) {\n return resolvedOptions.emitEmptyFile\n ? '/* @vueland/utils-jit: no utilities found */\\n'\n : ''\n }\n\n const sortedRules = Array.from(activeCssRules.entries())\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([, cssRule]) => cssRule)\n\n return [\n resolvedOptions.banner,\n ...sortedRules,\n '',\n ].join('\\n')\n }\n\n function writeCssFile(notify = false): void {\n if (!outFile) {\n return\n }\n\n const nextCss = buildFinalCss()\n\n if (nextCss === currentCss) {\n return\n }\n\n currentCss = nextCss\n\n fs.mkdirSync(path.dirname(outFile), { recursive: true })\n fs.writeFileSync(outFile, currentCss, 'utf8')\n\n if (devServer) {\n devServer.watcher.add(outFile)\n }\n\n if (notify) {\n notifyCssChanged()\n }\n\n debug(`wrote ${normalizePath(path.relative(root, outFile))}`)\n }\n\n function activateToken(token: string): void {\n const prevCount = tokenRefCount.get(token) ?? 0\n const nextCount = prevCount + 1\n\n tokenRefCount.set(token, nextCount)\n\n if (prevCount === 0) {\n const cssRule = getCssRuleForToken(token)\n\n if (cssRule) {\n activeCssRules.set(token, cssRule)\n }\n }\n }\n\n function deactivateToken(token: string): void {\n const prevCount = tokenRefCount.get(token) ?? 0\n\n if (prevCount <= 0) {\n return\n }\n\n const nextCount = prevCount - 1\n\n if (nextCount === 0) {\n tokenRefCount.delete(token)\n activeCssRules.delete(token)\n return\n }\n\n tokenRefCount.set(token, nextCount)\n }\n\n function applyFileTokens(file: string, nextTokens: Set<string>): void {\n const normalizedFile = normalizePath(file)\n const prevTokens = fileToTokens.get(normalizedFile) ?? new Set<string>()\n\n for (const token of prevTokens) {\n if (!nextTokens.has(token)) {\n deactivateToken(token)\n }\n }\n\n for (const token of nextTokens) {\n if (!prevTokens.has(token)) {\n activateToken(token)\n }\n }\n\n if (nextTokens.size > 0) {\n fileToTokens.set(normalizedFile, nextTokens)\n } else {\n fileToTokens.delete(normalizedFile)\n }\n }\n\n function rebuildAll(notify = false): void {\n fileToTokens.clear()\n tokenRefCount.clear()\n activeCssRules.clear()\n\n const files = collectProjectFiles(root, resolvedOptions, outFile)\n\n for (const file of files) {\n const code = readFileSafe(file)\n\n if (code === null) {\n continue\n }\n\n const tokens = tokenize(code)\n\n if (tokens.size > 0) {\n fileToTokens.set(normalizePath(file), tokens)\n\n for (const token of tokens) {\n const count = tokenRefCount.get(token) ?? 0\n\n tokenRefCount.set(token, count + 1)\n }\n }\n }\n\n for (const [token, count] of tokenRefCount) {\n if (count <= 0) {\n continue\n }\n\n const cssRule = getCssRuleForToken(token)\n\n if (cssRule) {\n activeCssRules.set(token, cssRule)\n }\n }\n\n writeCssFile(notify)\n\n debug(`scanned ${files.length} files, found ${activeCssRules.size} utilities`)\n }\n\n function rebuildOne(file: string, code: string, notify = false): void {\n if (isSameFile(file, outFile)) {\n return\n }\n\n if (!shouldProcess(file, resolvedOptions.include, resolvedOptions.exclude)) {\n return\n }\n\n const nextTokens = tokenize(code)\n\n applyFileTokens(file, nextTokens)\n writeCssFile(notify)\n }\n\n function removeOne(file: string, notify = false): void {\n if (isSameFile(file, outFile)) {\n return\n }\n\n const normalizedFile = normalizePath(file)\n const prevTokens = fileToTokens.get(normalizedFile)\n\n if (!prevTokens) {\n return\n }\n\n for (const token of prevTokens) {\n deactivateToken(token)\n }\n\n fileToTokens.delete(normalizedFile)\n writeCssFile(notify)\n }\n\n return {\n name: 'utils-jit',\n enforce: 'pre',\n\n configResolved(config) {\n root = config.root\n outFile = path.resolve(root, resolvedOptions.outFile)\n rebuildAll(false)\n },\n\n configureServer(server) {\n devServer = server\n\n if (outFile) {\n server.watcher.add(outFile)\n }\n },\n\n buildStart() {\n rebuildAll(false)\n },\n\n transform(code, id) {\n const file = id.split('?')[0]\n\n if (!file || isSameFile(file, outFile)) {\n return null\n }\n\n rebuildOne(file, code, false)\n\n return null\n },\n\n async handleHotUpdate(ctx) {\n const { file } = ctx\n\n if (isSameFile(file, outFile)) {\n return\n }\n\n if (!shouldProcess(file, resolvedOptions.include, resolvedOptions.exclude)) {\n return\n }\n\n const code = await ctx.read()\n\n rebuildOne(file, code, true)\n },\n\n watchChange(id, change) {\n const file = id.split('?')[0]\n\n if (!file || isSameFile(file, outFile)) {\n return\n }\n\n if (change.event === 'delete') {\n removeOne(file, true)\n return\n }\n\n if (!shouldProcess(file, resolvedOptions.include, resolvedOptions.exclude)) {\n return\n }\n\n const code = readFileSafe(file)\n\n if (code !== null) {\n rebuildOne(file, code, true)\n }\n },\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,172 @@
1
+ import { Plugin } from "vite";
2
+
3
+ //#region src/types.d.ts
4
+ type Pattern = string | RegExp;
5
+ type MaybeArray<T> = T | T[];
6
+ type VariantKind = 'pseudo' | 'media' | 'selector' | 'attribute';
7
+ type VariantDefinition = {
8
+ kind: VariantKind;
9
+ value: string | number;
10
+ };
11
+ type VariantMap = Record<string, VariantDefinition>;
12
+ type JitOptions = {
13
+ /**
14
+ * Файлы, которые нужно анализировать.
15
+ *
16
+ * По умолчанию:
17
+ * - .vue
18
+ * - .js
19
+ * - .ts
20
+ * - .jsx
21
+ * - .tsx
22
+ * - .html
23
+ */
24
+ include?: Pattern[];
25
+ /**
26
+ * Файлы и директории, которые нужно исключить.
27
+ */
28
+ exclude?: Pattern[];
29
+ /**
30
+ * Путь к генерируемому CSS файлу относительно Vite root.
31
+ *
32
+ * По умолчанию: src/.generated/utils-jit.css
33
+ */
34
+ outFile?: string;
35
+ /**
36
+ * Breakpoints в px.
37
+ */
38
+ breakpoints?: Record<string, number>;
39
+ /**
40
+ * Пользовательские utility rules.
41
+ */
42
+ rules?: UtilityRule[];
43
+ /**
44
+ * Пользовательские variants.
45
+ */
46
+ variants?: VariantMap;
47
+ /**
48
+ * Баннер в начале генерируемого CSS файла.
49
+ */
50
+ banner?: string;
51
+ /**
52
+ * Писать файл даже если utilities не найдены.
53
+ *
54
+ * По умолчанию: true.
55
+ */
56
+ emitEmptyFile?: boolean;
57
+ /**
58
+ * Выводить диагностические сообщения.
59
+ *
60
+ * По умолчанию: false.
61
+ */
62
+ debug?: boolean;
63
+ };
64
+ type ResolvedJitOptions = Required<Pick<JitOptions, 'include' | 'exclude' | 'outFile' | 'breakpoints' | 'rules' | 'variants' | 'banner' | 'emitEmptyFile' | 'debug'>>;
65
+ type ParsedToken = {
66
+ raw: string;
67
+ variants: string[];
68
+ utility: string;
69
+ };
70
+ type CssBody = {
71
+ declarations: string[];
72
+ };
73
+ type RuleMatch = {
74
+ declarations: string[];
75
+ };
76
+ type UtilityRule = {
77
+ name: string;
78
+ match: (utility: string) => RuleMatch | null;
79
+ };
80
+ type DeclarationValue = string | number;
81
+ type DeclarationMap = Record<string, DeclarationValue>;
82
+ type RuleOptions = {
83
+ /**
84
+ * Название rule для отладки и читаемости.
85
+ */
86
+ name: string;
87
+ /**
88
+ * Matcher utility-части без variants.
89
+ *
90
+ * Пример:
91
+ * class: hover:bg-[#fff]
92
+ * matcher получает: bg-[#fff]
93
+ */
94
+ matcher: RegExp;
95
+ /**
96
+ * Проверка значения внутри [].
97
+ */
98
+ validate?: (value: string) => boolean;
99
+ /**
100
+ * Генерация CSS declarations.
101
+ *
102
+ * Можно возвращать JS-style object:
103
+ * {
104
+ * backgroundColor: value,
105
+ * zIndex: 10,
106
+ * }
107
+ *
108
+ * Можно использовать CSS variables:
109
+ * {
110
+ * '--vl-color': value,
111
+ * }
112
+ *
113
+ * Можно вернуть готовые строки:
114
+ * [
115
+ * `background-color: ${value};`
116
+ * ]
117
+ */
118
+ declaration: (value: string) => DeclarationMap | string[];
119
+ /**
120
+ * Добавлять ли !important к object-based declarations.
121
+ *
122
+ * По умолчанию: true.
123
+ *
124
+ * Важно: если declaration возвращает string[], строки считаются уже готовым CSS
125
+ * и important автоматически не добавляется.
126
+ */
127
+ important?: boolean;
128
+ };
129
+ //#endregion
130
+ //#region src/plugin.d.ts
131
+ declare function utilsJIT(options?: JitOptions): Plugin;
132
+ //#endregion
133
+ //#region src/core.d.ts
134
+ declare const DEFAULT_INCLUDE: Pattern[];
135
+ declare const DEFAULT_EXCLUDE: Pattern[];
136
+ declare const DEFAULT_BREAKPOINTS: Record<string, number>;
137
+ declare const DEFAULT_VARIANTS: VariantMap;
138
+ declare function shouldProcess(id: string, include?: Pattern[], exclude?: Pattern[]): boolean;
139
+ declare function escapeCssSelector(value: string): string;
140
+ declare function normalizeValue(value: string): string;
141
+ declare function isSafeCssValue(value: string): boolean;
142
+ declare function stripComments(code: string): string;
143
+ declare function extractClassCandidates(code: string): string[];
144
+ declare function tokenize(code: string): Set<string>;
145
+ declare function parseToken(token: string): ParsedToken | null;
146
+ declare function camelToKebab(value: string): string;
147
+ declare function defineRule(options: RuleOptions): UtilityRule;
148
+ declare const createArbitraryRule: typeof defineRule;
149
+ declare function resolveRule(utility: string, rules: UtilityRule[]): CssBody | null;
150
+ declare function buildCssRule(parsed: ParsedToken, cssBody: CssBody, breakpoints?: Record<string, number>, variants?: VariantMap): string | null;
151
+ //#endregion
152
+ //#region src/rules.d.ts
153
+ declare const defaultRules: UtilityRule[];
154
+ //#endregion
155
+ //#region src/validators.d.ts
156
+ declare function isNumberValue(value: string): boolean;
157
+ declare function isZeroValue(value: string): boolean;
158
+ declare function isCssGlobalValue(value: string): boolean;
159
+ declare function isFunctionalCssValue(value: string): boolean;
160
+ declare function isLengthLikeValue(value: string): boolean;
161
+ declare function isLengthListValue(value: string, maxItems?: number): boolean;
162
+ declare function isSizeValue(value: string): boolean;
163
+ declare function isPaddingValue(value: string): boolean;
164
+ declare function isMarginValue(value: string): boolean;
165
+ declare function isRadiusValue(value: string): boolean;
166
+ declare function isPositionValue(value: string): boolean;
167
+ declare function isZIndexValue(value: string): boolean;
168
+ declare function isOpacityValue(value: string): boolean;
169
+ declare function isColorValue(value: string): boolean;
170
+ //#endregion
171
+ export { CssBody, DEFAULT_BREAKPOINTS, DEFAULT_EXCLUDE, DEFAULT_INCLUDE, DEFAULT_VARIANTS, DeclarationMap, DeclarationValue, JitOptions, MaybeArray, ParsedToken, Pattern, ResolvedJitOptions, RuleMatch, RuleOptions, UtilityRule, VariantDefinition, VariantKind, VariantMap, buildCssRule, camelToKebab, createArbitraryRule, defaultRules, defineRule, escapeCssSelector, extractClassCandidates, isColorValue, isCssGlobalValue, isFunctionalCssValue, isLengthLikeValue, isLengthListValue, isMarginValue, isNumberValue, isOpacityValue, isPaddingValue, isPositionValue, isRadiusValue, isSafeCssValue, isSizeValue, isZIndexValue, isZeroValue, normalizeValue, parseToken, resolveRule, shouldProcess, stripComments, tokenize, utilsJIT };
172
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1,172 @@
1
+ import { Plugin } from "vite";
2
+
3
+ //#region src/types.d.ts
4
+ type Pattern = string | RegExp;
5
+ type MaybeArray<T> = T | T[];
6
+ type VariantKind = 'pseudo' | 'media' | 'selector' | 'attribute';
7
+ type VariantDefinition = {
8
+ kind: VariantKind;
9
+ value: string | number;
10
+ };
11
+ type VariantMap = Record<string, VariantDefinition>;
12
+ type JitOptions = {
13
+ /**
14
+ * Файлы, которые нужно анализировать.
15
+ *
16
+ * По умолчанию:
17
+ * - .vue
18
+ * - .js
19
+ * - .ts
20
+ * - .jsx
21
+ * - .tsx
22
+ * - .html
23
+ */
24
+ include?: Pattern[];
25
+ /**
26
+ * Файлы и директории, которые нужно исключить.
27
+ */
28
+ exclude?: Pattern[];
29
+ /**
30
+ * Путь к генерируемому CSS файлу относительно Vite root.
31
+ *
32
+ * По умолчанию: src/.generated/utils-jit.css
33
+ */
34
+ outFile?: string;
35
+ /**
36
+ * Breakpoints в px.
37
+ */
38
+ breakpoints?: Record<string, number>;
39
+ /**
40
+ * Пользовательские utility rules.
41
+ */
42
+ rules?: UtilityRule[];
43
+ /**
44
+ * Пользовательские variants.
45
+ */
46
+ variants?: VariantMap;
47
+ /**
48
+ * Баннер в начале генерируемого CSS файла.
49
+ */
50
+ banner?: string;
51
+ /**
52
+ * Писать файл даже если utilities не найдены.
53
+ *
54
+ * По умолчанию: true.
55
+ */
56
+ emitEmptyFile?: boolean;
57
+ /**
58
+ * Выводить диагностические сообщения.
59
+ *
60
+ * По умолчанию: false.
61
+ */
62
+ debug?: boolean;
63
+ };
64
+ type ResolvedJitOptions = Required<Pick<JitOptions, 'include' | 'exclude' | 'outFile' | 'breakpoints' | 'rules' | 'variants' | 'banner' | 'emitEmptyFile' | 'debug'>>;
65
+ type ParsedToken = {
66
+ raw: string;
67
+ variants: string[];
68
+ utility: string;
69
+ };
70
+ type CssBody = {
71
+ declarations: string[];
72
+ };
73
+ type RuleMatch = {
74
+ declarations: string[];
75
+ };
76
+ type UtilityRule = {
77
+ name: string;
78
+ match: (utility: string) => RuleMatch | null;
79
+ };
80
+ type DeclarationValue = string | number;
81
+ type DeclarationMap = Record<string, DeclarationValue>;
82
+ type RuleOptions = {
83
+ /**
84
+ * Название rule для отладки и читаемости.
85
+ */
86
+ name: string;
87
+ /**
88
+ * Matcher utility-части без variants.
89
+ *
90
+ * Пример:
91
+ * class: hover:bg-[#fff]
92
+ * matcher получает: bg-[#fff]
93
+ */
94
+ matcher: RegExp;
95
+ /**
96
+ * Проверка значения внутри [].
97
+ */
98
+ validate?: (value: string) => boolean;
99
+ /**
100
+ * Генерация CSS declarations.
101
+ *
102
+ * Можно возвращать JS-style object:
103
+ * {
104
+ * backgroundColor: value,
105
+ * zIndex: 10,
106
+ * }
107
+ *
108
+ * Можно использовать CSS variables:
109
+ * {
110
+ * '--vl-color': value,
111
+ * }
112
+ *
113
+ * Можно вернуть готовые строки:
114
+ * [
115
+ * `background-color: ${value};`
116
+ * ]
117
+ */
118
+ declaration: (value: string) => DeclarationMap | string[];
119
+ /**
120
+ * Добавлять ли !important к object-based declarations.
121
+ *
122
+ * По умолчанию: true.
123
+ *
124
+ * Важно: если declaration возвращает string[], строки считаются уже готовым CSS
125
+ * и important автоматически не добавляется.
126
+ */
127
+ important?: boolean;
128
+ };
129
+ //#endregion
130
+ //#region src/plugin.d.ts
131
+ declare function utilsJIT(options?: JitOptions): Plugin;
132
+ //#endregion
133
+ //#region src/core.d.ts
134
+ declare const DEFAULT_INCLUDE: Pattern[];
135
+ declare const DEFAULT_EXCLUDE: Pattern[];
136
+ declare const DEFAULT_BREAKPOINTS: Record<string, number>;
137
+ declare const DEFAULT_VARIANTS: VariantMap;
138
+ declare function shouldProcess(id: string, include?: Pattern[], exclude?: Pattern[]): boolean;
139
+ declare function escapeCssSelector(value: string): string;
140
+ declare function normalizeValue(value: string): string;
141
+ declare function isSafeCssValue(value: string): boolean;
142
+ declare function stripComments(code: string): string;
143
+ declare function extractClassCandidates(code: string): string[];
144
+ declare function tokenize(code: string): Set<string>;
145
+ declare function parseToken(token: string): ParsedToken | null;
146
+ declare function camelToKebab(value: string): string;
147
+ declare function defineRule(options: RuleOptions): UtilityRule;
148
+ declare const createArbitraryRule: typeof defineRule;
149
+ declare function resolveRule(utility: string, rules: UtilityRule[]): CssBody | null;
150
+ declare function buildCssRule(parsed: ParsedToken, cssBody: CssBody, breakpoints?: Record<string, number>, variants?: VariantMap): string | null;
151
+ //#endregion
152
+ //#region src/rules.d.ts
153
+ declare const defaultRules: UtilityRule[];
154
+ //#endregion
155
+ //#region src/validators.d.ts
156
+ declare function isNumberValue(value: string): boolean;
157
+ declare function isZeroValue(value: string): boolean;
158
+ declare function isCssGlobalValue(value: string): boolean;
159
+ declare function isFunctionalCssValue(value: string): boolean;
160
+ declare function isLengthLikeValue(value: string): boolean;
161
+ declare function isLengthListValue(value: string, maxItems?: number): boolean;
162
+ declare function isSizeValue(value: string): boolean;
163
+ declare function isPaddingValue(value: string): boolean;
164
+ declare function isMarginValue(value: string): boolean;
165
+ declare function isRadiusValue(value: string): boolean;
166
+ declare function isPositionValue(value: string): boolean;
167
+ declare function isZIndexValue(value: string): boolean;
168
+ declare function isOpacityValue(value: string): boolean;
169
+ declare function isColorValue(value: string): boolean;
170
+ //#endregion
171
+ export { CssBody, DEFAULT_BREAKPOINTS, DEFAULT_EXCLUDE, DEFAULT_INCLUDE, DEFAULT_VARIANTS, DeclarationMap, DeclarationValue, JitOptions, MaybeArray, ParsedToken, Pattern, ResolvedJitOptions, RuleMatch, RuleOptions, UtilityRule, VariantDefinition, VariantKind, VariantMap, buildCssRule, camelToKebab, createArbitraryRule, defaultRules, defineRule, escapeCssSelector, extractClassCandidates, isColorValue, isCssGlobalValue, isFunctionalCssValue, isLengthLikeValue, isLengthListValue, isMarginValue, isNumberValue, isOpacityValue, isPaddingValue, isPositionValue, isRadiusValue, isSafeCssValue, isSizeValue, isZIndexValue, isZeroValue, normalizeValue, parseToken, resolveRule, shouldProcess, stripComments, tokenize, utilsJIT };
172
+ //# sourceMappingURL=index.d.mts.map