{"version":3,"file":"index.mjs","names":["escapeRegExp"],"sources":["../src/validators.ts","../src/core.ts","../src/css-output.ts","../src/content-cache.ts","../src/project-scan.ts","../src/rules.ts","../src/scss-injection.ts","../src/token-registry.ts","../src/plugin.ts"],"sourcesContent":["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(`^-?(?:\\\\d+|\\\\d*\\\\.\\\\d+)${CSS_LENGTH_UNIT_RE.source}$`)\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(['inherit', 'initial', 'unset', 'revert', 'revert-layer'])\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 type {\n    AttrOptions,\n    AttrRule,\n    CssBody,\n    DeclarationMap,\n    DeclarationValue,\n    ParsedToken,\n    Pattern,\n    RuleMatch,\n    RuleOptions,\n    UtilityRule,\n    VariantDefinition,\n    VariantMap,\n} from './types'\nimport { isColorValue } from './validators'\n\nexport const DEFAULT_INCLUDE: Pattern[] = [/\\.(vue|js|ts|jsx|tsx|html|svelte|astro)$/]\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    /(^|[/\\\\])vite\\.config\\.[cm]?[jt]s$/,\n]\n\n// Совпадают с $grid-breakpoints (maps/grids.scss) и use-display, чтобы без явного\n// конфига arbitrary-утилиты были на тех же порогах, что статические утилиты и JS.\nexport const DEFAULT_BREAKPOINTS: Record<string, number> = {\n    xs: 0,\n    sm: 600,\n    md: 960,\n    lg: 1280,\n    xl: 1920,\n    xxl: 2560,\n}\n\nexport const DEFAULT_VARIANTS: VariantMap = {\n    hover: {\n        kind: 'pseudo',\n        value: 'hover',\n    },\n    focus: {\n        kind: 'pseudo',\n        value: 'focus',\n    },\n    'focus-visible': {\n        kind: 'pseudo',\n        value: 'focus-visible',\n    },\n    'focus-within': {\n        kind: 'pseudo',\n        value: 'focus-within',\n    },\n    active: {\n        kind: 'pseudo',\n        value: 'active',\n    },\n    disabled: {\n        kind: 'pseudo',\n        value: 'disabled',\n    },\n    checked: {\n        kind: 'pseudo',\n        value: 'checked',\n    },\n    visited: {\n        kind: 'pseudo',\n        value: 'visited',\n    },\n    first: {\n        kind: 'pseudo',\n        value: 'first-child',\n    },\n    last: {\n        kind: 'pseudo',\n        value: 'last-child',\n    },\n    odd: {\n        kind: 'pseudo',\n        value: 'nth-child(odd)',\n    },\n    even: {\n        kind: 'pseudo',\n        value: 'nth-child(even)',\n    },\n}\n\nconst MIN_TOKEN_LENGTH = 5\nconst MAX_TOKEN_LENGTH = 180\nconst MAX_VALUE_LENGTH = 160\nconst STATIC_TOKEN_MIN_LENGTH = 2\n\nexport function normalizePath(value: string): string {\n    return value.replace(/\\\\/g, '/')\n}\n\nexport function 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 && token.slice(arbitraryIndex + 2, -1).trim().length > 0\n}\n\nfunction looksLikeStaticUtility(token: string): boolean {\n    if (!token) {\n        return false\n    }\n\n    if (token.length < STATIC_TOKEN_MIN_LENGTH || token.length > MAX_TOKEN_LENGTH) {\n        return false\n    }\n\n    if (token.includes('[') || token.includes(']')) {\n        return false\n    }\n\n    if (token.startsWith('<') || token.startsWith('>') || token.endsWith('-') || token.endsWith(':')) {\n        return false\n    }\n\n    return /^!?-?(?:[a-zA-Z0-9_-]+:)*[a-zA-Z_][a-zA-Z0-9_/-]*$/.test(token)\n}\n\nfunction looksLikeUtilityToken(token: string): boolean {\n    return looksLikeArbitraryUtility(token) || looksLikeStaticUtility(token)\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 extractStringCandidates(code: string): string[] {\n    const candidates: string[] = []\n    const pattern = /(['\"`])((?:\\\\.|(?!\\1)[\\s\\S])*?)\\1/g\n\n    for (const match of code.matchAll(pattern)) {\n        const value = match[2]\n\n        if (value) {\n            candidates.push(value)\n        }\n    }\n\n    return candidates\n}\n\nconst ATTR_NAME_RE = /^[a-zA-Z_][a-zA-Z0-9_.:-]*$/\nconst ATTR_PREFIX_RE = /^(?:[a-zA-Z0-9_-]+:)*[a-zA-Z][a-zA-Z0-9_-]*$/\n\nfunction escapeRegExp(value: string): string {\n    return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nfunction compactAttrValue(value: string): string {\n    return value.trim().replace(/\\s+/g, '')\n}\n\nfunction unwrapStringLiteral(value: string): string {\n    const normalized = value.trim()\n    const quote = normalized[0]\n\n    if (\n        (quote === '\"' || quote === '\\'' || quote === '`') &&\n        normalized.endsWith(quote)\n    ) {\n        return normalized.slice(1, -1)\n    }\n\n    return normalized\n}\n\nexport function defineAttr(options: AttrOptions): AttrRule {\n    const attr = options.attr.trim()\n    const prefixes = [...new Set(options.prefixes.map((prefix) => prefix.trim()))]\n\n    if (!ATTR_NAME_RE.test(attr)) {\n        throw new Error(`[utils-jit] defineAttr: invalid attr \"${options.attr}\"`)\n    }\n\n    if (prefixes.length === 0 || prefixes.some((prefix) => !ATTR_PREFIX_RE.test(prefix))) {\n        throw new Error('[utils-jit] defineAttr: prefixes must be non-empty utility prefixes')\n    }\n\n    return {\n        attr,\n        validator: options.validator,\n        prefixes,\n        normalize: options.normalize ?? compactAttrValue,\n    }\n}\n\nexport function defineColorAttr(attribute: string): AttrRule {\n    return defineAttr({\n        attr: attribute,\n        validator: isColorValue,\n        prefixes: ['bg', 'text'],\n    })\n}\n\nfunction extractAttrValues(code: string, attr: string): string[] {\n    const values: string[] = []\n    const escapedAttr = escapeRegExp(attr)\n    const vueOrHtmlPattern = new RegExp(\n        `(?:^|[\\\\s<])(?:v-bind:|:)?${escapedAttr}\\\\s*=\\\\s*([\"'])((?:\\\\\\\\.|(?!\\\\1)[\\\\s\\\\S])*?)\\\\1`,\n        'g',\n    )\n    const jsxExpressionPattern = new RegExp(\n        `(?:^|[\\\\s<])${escapedAttr}\\\\s*=\\\\s*\\\\{\\\\s*(['\"\\`])((?:\\\\\\\\.|(?!\\\\1)[\\\\s\\\\S])*?)\\\\1\\\\s*\\\\}`,\n        'g',\n    )\n\n    for (const pattern of [vueOrHtmlPattern, jsxExpressionPattern]) {\n        for (const match of code.matchAll(pattern)) {\n            const value = match[2]\n\n            if (value) {\n                values.push(value)\n            }\n        }\n    }\n\n    return values\n}\n\nfunction extractAttrCandidates(code: string, attrs: AttrRule[]): string[] {\n    const candidates: string[] = []\n\n    for (const attr of attrs) {\n        // color=\"#fa5a5a\", :color=\"'#fa5a5a'\" и JSX color={'#fa5a5a'}.\n        // Динамические выражения вроде :color=\"someVar\" статическому скану\n        // недоступны, как и динамически собранные class-строки.\n        for (const rawValue of extractAttrValues(code, attr.attr)) {\n            const value = attr.normalize(unwrapStringLiteral(rawValue))\n\n            if (!value || !attr.validator(value)) {\n                continue\n            }\n\n            for (const prefix of attr.prefixes) {\n                candidates.push(`${prefix}-[${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 arbitraryPattern = /(?:[a-zA-Z0-9_-]+:)*[a-zA-Z][a-zA-Z0-9_-]*-\\[[^\\]\\s]+(?:\\s+[^\\]\\s]+)*\\]/g\n\n    for (const match of code.matchAll(arbitraryPattern)) {\n        const raw = match[0]\n        const token = stripEdgeGarbage(raw)\n\n        if (looksLikeArbitraryUtility(token)) {\n            result.add(token)\n        }\n    }\n\n    const staticSource = code.replace(arbitraryPattern, ' ')\n    const staticPattern = /!?-?(?:[a-zA-Z0-9_-]+:)*[a-zA-Z_][a-zA-Z0-9_/-]*/g\n\n    for (const match of staticSource.matchAll(staticPattern)) {\n        const raw = match[0]\n        const token = stripEdgeGarbage(raw)\n\n        if (looksLikeStaticUtility(token)) {\n            result.add(token)\n        }\n    }\n\n    return result\n}\n\nexport function tokenize(code: string, attrs: AttrRule[] = []): Set<string> {\n    const cleanCode = stripComments(code)\n    const classCandidates = extractClassCandidates(cleanCode)\n    const result = new Set<string>()\n\n    for (const candidate of extractAttrCandidates(cleanCode, attrs)) {\n        result.add(candidate)\n    }\n\n    if (classCandidates.length > 0) {\n        for (const candidate of classCandidates) {\n            for (const token of tokenizeChunk(candidate)) {\n                result.add(token)\n            }\n        }\n    }\n\n    const stringCandidates = extractStringCandidates(cleanCode)\n\n    for (const candidate of stringCandidates) {\n        for (const token of tokenizeChunk(candidate)) {\n            result.add(token)\n        }\n    }\n\n    for (const token of tokenizeChunk(cleanCode)) {\n        if (looksLikeArbitraryUtility(token)) {\n            result.add(token)\n        }\n    }\n\n    return result\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 (!looksLikeUtilityToken(token) || !looksLikeUtilityToken(utility)) {\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(declaration: DeclarationMap, important: boolean): 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] ?? utility\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, match)) {\n                return null\n            }\n\n            return { declarations: normalizeDeclarations(options.declaration(value, match), important) }\n        },\n    }\n}\n\nexport const createArbitraryRule = defineRule\n\nexport function resolveRule(utility: string, rules: UtilityRule[]): CssBody | null {\n    for (const rule of rules) {\n        const match = rule.match(utility)\n\n        if (match) {\n            return { declarations: match.declarations }\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(selector: string, variant: VariantDefinition): 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('&') ? template.replace(/&/g, selector) : `${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(/:\\s*([^;]+)(;?)$/, (_match, value: string, semicolon: string) => {\n                return `: ${formatMathFunctions(value.trim())}${semicolon}`\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        // Брейкпоинт 0 (xs) — базовый, без медиа-обёртки (как `@if != 0` в SCSS).\n        if (minWidth === 0) {\n            continue\n        }\n\n        result = `@media (min-width: ${minWidth}px) { ${result} }`\n    }\n\n    return result\n}\n","import * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport type { ViteDevServer } from 'vite'\n\n// Виртуальный модуль, который импортирует потребитель: `import 'virtual:utils-jit.css'`.\n// Резолвится в `\\0`-префиксный id (rollup-конвенция «виртуального» модуля), но\n// оканчивается на `.css`, чтобы Vite прогнал его через свой CSS-пайплайн.\nexport const VIRTUAL_CSS_ID = 'virtual:utils-jit.css'\nexport const RESOLVED_VIRTUAL_CSS_ID = '\\0virtual:utils-jit.css'\n\nexport type CssOutputOptions = {\n    // Дополнительно писать CSS в файл (для дебага). Доставку это не меняет —\n    // потребитель всё равно импортирует виртуальный модуль.\n    emitFile: boolean\n}\n\n// Единая точка доставки CSS: держит текущий результат (его отдаёт `load`\n// виртуального модуля), опционально пишет дебаг-файл и дёргает HMR.\nexport class CssOutput {\n    private currentCss = ''\n    private outFile = ''\n    private server: ViteDevServer | null = null\n\n    constructor(private readonly options: CssOutputOptions) {}\n\n    get css(): string {\n        return this.currentCss\n    }\n\n    // Абсолютный путь дебаг-файла известен только после configResolved (нужен root).\n    setOutFile(absPath: string): void {\n        this.outFile = absPath\n    }\n\n    setServer(server: ViteDevServer): void {\n        this.server = server\n    }\n\n    // Обновляет CSS. Возвращает true, если контент реально изменился (иначе —\n    // ни записи, ни HMR). notify=true → инвалидирует виртуальный модуль.\n    update(nextCss: string, notify: boolean): boolean {\n        if (nextCss === this.currentCss) {\n            return false\n        }\n\n        this.currentCss = nextCss\n\n        if (this.options.emitFile && this.outFile) {\n            fs.mkdirSync(path.dirname(this.outFile), { recursive: true })\n            fs.writeFileSync(this.outFile, this.currentCss, 'utf8')\n        }\n\n        if (notify) {\n            this.invalidate()\n        }\n\n        return true\n    }\n\n    // HMR без fs-хаков: инвалидируем виртуальный модуль и просим Vite его\n    // перезагрузить — для CSS-модуля это самопринимающийся css-update, без\n    // полной перезагрузки страницы. До импорта модуля в графе его нет — тогда\n    // нечего инвалидировать (load отдаст свежий CSS при первом импорте).\n    private invalidate(): void {\n        if (!this.server) {\n            return\n        }\n\n        const mod = this.server.moduleGraph.getModuleById(RESOLVED_VIRTUAL_CSS_ID)\n\n        if (mod) {\n            void this.server.reloadModule(mod)\n        }\n    }\n}\n","import { createHash } from 'node:crypto'\n\nimport { normalizePath } from './core'\n\n// Кеш контента файлов по хэшу. Позволяет пропустить повторную токенизацию,\n// когда transform приходит с тем же содержимым: на старте каждый файл обходится\n// дважды (полный скан в configResolved + transform при импорте), а в Vite 6+\n// transform ещё и дублируется по окружениям (client/ssr). Храним хэш, а не сам\n// контент, — десятки байт на файл вместо мегабайтов исходников в памяти.\nexport class ContentCache {\n    private readonly hashes = new Map<string, string>()\n\n    // Запоминает хэш контента и возвращает true, если он отличается от ранее\n    // виденного (или файл новый). false → контент тот же, работу можно пропустить.\n    changed(file: string, code: string): boolean {\n        const key = normalizePath(file)\n        const hash = createHash('sha1').update(code).digest('base64')\n\n        if (this.hashes.get(key) === hash) {\n            return false\n        }\n\n        this.hashes.set(key, hash)\n\n        return true\n    }\n\n    delete(file: string): void {\n        this.hashes.delete(normalizePath(file))\n    }\n\n    clear(): void {\n        this.hashes.clear()\n    }\n}\n","import * as fs from 'node:fs'\nimport * as fsPromises from 'node:fs/promises'\nimport * as path from 'node:path'\n\nimport {\n    matchesPattern,\n    normalizePath,\n    shouldProcess,\n} from './core'\nimport type { Pattern, ResolvedJitOptions } from './types'\n\nfunction isExcluded(file: string, exclude: Pattern[]): boolean {\n    return exclude.some((pattern) => matchesPattern(file, pattern))\n}\n\nexport function isSameFile(a: string, b: string): boolean {\n    return normalizePath(path.resolve(a)) === normalizePath(path.resolve(b))\n}\n\nexport function readFileSafe(file: string): string | null {\n    try {\n        return fs.readFileSync(file, 'utf8')\n    } catch {\n        return null\n    }\n}\n\nexport async function readFileSafeAsync(file: string): Promise<string | null> {\n    try {\n        return await fsPromises.readFile(file, 'utf8')\n    } catch {\n        return null\n    }\n}\n\nexport function collectProjectFiles(\n    root: string,\n    include: ResolvedJitOptions['include'],\n    exclude: ResolvedJitOptions['exclude'],\n    outFile: string,\n): string[] {\n    const files: string[] = []\n\n    function walk(dir: string): void {\n        if (isExcluded(dir, 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, include, exclude)) {\n                files.push(fullPath)\n            }\n        }\n    }\n\n    walk(root)\n\n    return files\n}\n\nexport async function collectProjectFilesAsync(\n    root: string,\n    include: ResolvedJitOptions['include'],\n    exclude: ResolvedJitOptions['exclude'],\n    outFile: string,\n): Promise<string[]> {\n    const files: string[] = []\n    const dirs = [root]\n\n    for (let index = 0; index < dirs.length; index++) {\n        const dir = dirs[index]\n\n        if (isExcluded(dir, exclude)) {\n            continue\n        }\n\n        let entries: fs.Dirent[]\n\n        try {\n            entries = await fsPromises.readdir(dir, { withFileTypes: true })\n        } catch {\n            continue\n        }\n\n        for (const entry of entries) {\n            const fullPath = path.join(dir, entry.name)\n\n            if (entry.isDirectory()) {\n                dirs.push(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, include, exclude)) {\n                files.push(fullPath)\n            }\n        }\n    }\n\n    return files\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) => ({ width: value }),\n    }),\n\n    defineRule({\n        name: 'height',\n        matcher: /^h-\\[(.+)\\]$/,\n        validate: isSizeValue,\n        declaration: (value) => ({ height: value }),\n    }),\n\n    defineRule({\n        name: 'min-width',\n        matcher: /^min-w-\\[(.+)\\]$/,\n        validate: isSizeValue,\n        declaration: (value) => ({ minWidth: value }),\n    }),\n\n    defineRule({\n        name: 'max-width',\n        matcher: /^max-w-\\[(.+)\\]$/,\n        validate: isSizeValue,\n        declaration: (value) => ({ maxWidth: value }),\n    }),\n\n    defineRule({\n        name: 'min-height',\n        matcher: /^min-h-\\[(.+)\\]$/,\n        validate: isSizeValue,\n        declaration: (value) => ({ minHeight: value }),\n    }),\n\n    defineRule({\n        name: 'max-height',\n        matcher: /^max-h-\\[(.+)\\]$/,\n        validate: isSizeValue,\n        declaration: (value) => ({ maxHeight: value }),\n    }),\n\n    defineRule({\n        name: 'z-index',\n        matcher: /^z-\\[(.+)\\]$/,\n        validate: isZIndexValue,\n        declaration: (value) => ({ zIndex: value }),\n    }),\n\n    defineRule({\n        name: 'margin',\n        matcher: /^ma-\\[(.+)\\]$/,\n        validate: isMarginValue,\n        declaration: (value) => ({ margin: value }),\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) => ({ marginBottom: value }),\n    }),\n\n    defineRule({\n        name: 'margin-top',\n        matcher: /^mt-\\[(.+)\\]$/,\n        validate: isMarginValue,\n        declaration: (value) => ({ marginTop: value }),\n    }),\n\n    defineRule({\n        name: 'margin-left',\n        matcher: /^ml-\\[(.+)\\]$/,\n        validate: isMarginValue,\n        declaration: (value) => ({ marginLeft: value }),\n    }),\n\n    defineRule({\n        name: 'margin-right',\n        matcher: /^mr-\\[(.+)\\]$/,\n        validate: isMarginValue,\n        declaration: (value) => ({ marginRight: value }),\n    }),\n\n    defineRule({\n        name: 'padding',\n        matcher: /^pa-\\[(.+)\\]$/,\n        validate: isPaddingValue,\n        declaration: (value) => ({ padding: value }),\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) => ({ paddingBottom: value }),\n    }),\n\n    defineRule({\n        name: 'padding-top',\n        matcher: /^pt-\\[(.+)\\]$/,\n        validate: isPaddingValue,\n        declaration: (value) => ({ paddingTop: value }),\n    }),\n\n    defineRule({\n        name: 'padding-left',\n        matcher: /^pl-\\[(.+)\\]$/,\n        validate: isPaddingValue,\n        declaration: (value) => ({ paddingLeft: value }),\n    }),\n\n    defineRule({\n        name: 'padding-right',\n        matcher: /^pr-\\[(.+)\\]$/,\n        validate: isPaddingValue,\n        declaration: (value) => ({ paddingRight: value }),\n    }),\n\n    defineRule({\n        name: 'left',\n        matcher: /^left-\\[(.+)\\]$/,\n        validate: isPositionValue,\n        declaration: (value) => ({ left: value }),\n    }),\n\n    defineRule({\n        name: 'right',\n        matcher: /^right-\\[(.+)\\]$/,\n        validate: isPositionValue,\n        declaration: (value) => ({ right: value }),\n    }),\n\n    defineRule({\n        name: 'top',\n        matcher: /^top-\\[(.+)\\]$/,\n        validate: isPositionValue,\n        declaration: (value) => ({ top: value }),\n    }),\n\n    defineRule({\n        name: 'bottom',\n        matcher: /^bottom-\\[(.+)\\]$/,\n        validate: isPositionValue,\n        declaration: (value) => ({ bottom: value }),\n    }),\n\n    defineRule({\n        name: 'inset',\n        matcher: /^inset-\\[(.+)\\]$/,\n        validate: isPositionValue,\n        declaration: (value) => ({ inset: value }),\n    }),\n\n    defineRule({\n        name: 'radius',\n        matcher: /^radius-\\[(.+)\\]$/,\n        validate: isRadiusValue,\n        declaration: (value) => ({ borderRadius: value }),\n    }),\n\n    defineRule({\n        name: 'radius-top-left',\n        matcher: /^radius-tl-\\[(.+)\\]$/,\n        validate: isRadiusValue,\n        declaration: (value) => ({ borderTopLeftRadius: value }),\n    }),\n\n    defineRule({\n        name: 'radius-top-right',\n        matcher: /^radius-tr-\\[(.+)\\]$/,\n        validate: isRadiusValue,\n        declaration: (value) => ({ borderTopRightRadius: value }),\n    }),\n\n    defineRule({\n        name: 'radius-bottom-left',\n        matcher: /^radius-bl-\\[(.+)\\]$/,\n        validate: isRadiusValue,\n        declaration: (value) => ({ borderBottomLeftRadius: value }),\n    }),\n\n    defineRule({\n        name: 'radius-bottom-right',\n        matcher: /^radius-br-\\[(.+)\\]$/,\n        validate: isRadiusValue,\n        declaration: (value) => ({ borderBottomRightRadius: value }),\n    }),\n\n    defineRule({\n        name: 'opacity',\n        matcher: /^opacity-\\[(.+)\\]$/,\n        validate: isOpacityValue,\n        declaration: (value) => ({ opacity: value }),\n    }),\n\n    defineRule({\n        name: 'text-color',\n        matcher: /^text-\\[(.+)\\]$/,\n        validate: isColorValue,\n        declaration: (value) => ({ color: value }),\n    }),\n\n    defineRule({\n        name: 'background-color',\n        matcher: /^bg-\\[(.+)\\]$/,\n        validate: isColorValue,\n        // border-color вместе с фоном — как у статических .bg-* утилит\n        declaration: (value) => ({\n            backgroundColor: value,\n            borderColor: value,\n        }),\n    }),\n]\n","// Контракт с SCSS-исходниками @vueland/ui: между этими маркерами плагин\n// подставляет `@use 'maps/grids' with (...)` с брейкпоинтами из конфига и тем\n// самым конфигурирует грид-модуль ДО загрузки партиалов с адаптивными стилями.\n// Контракт строковый (одинаковый литерал в SCSS и здесь) — не зависит ни от\n// кавычек, ни от текста импортов. Без плагина блок остаётся инертным\n// комментарием, и SCSS берёт дефолтные брейкпоинты из maps/grids.\nconst BREAKPOINTS_MARKER_START = '// ##vueland:breakpoints:start'\nconst BREAKPOINTS_MARKER_END = '// ##vueland:breakpoints:end'\n\nfunction escapeRegExp(value: string): string {\n    return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\n// Regex строится из тех же констант — маркер задан ровно в одном месте.\nconst BREAKPOINTS_REGION_RE = new RegExp(\n    `${escapeRegExp(BREAKPOINTS_MARKER_START)}[\\\\s\\\\S]*?${escapeRegExp(BREAKPOINTS_MARKER_END)}`,\n)\n\n// Идемпотентно: каждый прогон целиком переписывает содержимое блока. Дешёвая\n// проверка `includes` отсекает все файлы без маркера (additionalData зовётся\n// для каждого scss).\nfunction injectGridBreakpoints(source: string, bpMap: string): string {\n    if (!source.includes(BREAKPOINTS_MARKER_START)) {\n        return source\n    }\n\n    return source.replace(\n        BREAKPOINTS_REGION_RE,\n        () =>\n            `${BREAKPOINTS_MARKER_START}\\n`\n            + `@use 'maps/grids' with ($grid-breakpoints: ${bpMap});\\n`\n            + BREAKPOINTS_MARKER_END,\n    )\n}\n\nfunction buildScssBreakpointsMap(bps: Record<string, number>): string {\n    const entries = Object.entries(bps)\n        .map(([key, value]) => `'${key}': ${value === 0 ? '0' : `${value}px`}`)\n        .join(', ')\n\n    return `(${entries})`\n}\n\nexport function createScssBreakpointInjector(\n    breakpoints: Record<string, number>,\n): (source: string) => string {\n    const scssMap = buildScssBreakpointsMap(breakpoints)\n\n    return (source) => injectGridBreakpoints(source, scssMap)\n}\n","import {\n    buildCssRule,\n    normalizePath,\n    parseToken,\n    resolveRule,\n} from './core'\nimport type { ResolvedJitOptions, UtilityRule } from './types'\n\nexport class TokenRegistry {\n    private readonly fileToTokens = new Map<string, Set<string>>()\n    private readonly tokenRefCount = new Map<string, number>()\n    private readonly tokenCssCache = new Map<string, string | null>()\n    private readonly activeCssRules = new Map<string, string>()\n\n    // Набор активных CSS-правил изменился с последнего consumeDirty().\n    // Позволяет пропустить сериализацию и запись файла, когда ничего не менялось.\n    private _dirty = false\n\n    constructor(\n        private readonly options: ResolvedJitOptions,\n        private readonly rules: UtilityRule[],\n    ) {}\n\n    // Возвращает true и сбрасывает флаг, если набор правил менялся. Атомарно —\n    // вызывающему не нужно отдельно читать и затем сбрасывать состояние.\n    consumeDirty(): boolean {\n        if (!this._dirty) {\n            return false\n        }\n\n        this._dirty = false\n\n        return true\n    }\n\n    // Один и тот же utility token может встретиться в нескольких файлах.\n    // CSS-правило удаляем только когда последний файл перестал его использовать.\n    private addTokenUsage(token: string): void {\n        const prev = this.tokenRefCount.get(token) ?? 0\n\n        this.tokenRefCount.set(token, prev + 1)\n\n        if (prev === 0) {\n            const cssRule = this.resolveCssRule(token)\n\n            if (cssRule) {\n                this.activeCssRules.set(token, cssRule)\n                this._dirty = true\n            }\n        }\n    }\n\n    private removeTokenUsage(token: string): void {\n        const prev = this.tokenRefCount.get(token) ?? 0\n\n        if (prev <= 0) return\n\n        const next = prev - 1\n\n        if (next === 0) {\n            this.tokenRefCount.delete(token)\n\n            if (this.activeCssRules.delete(token)) {\n                this._dirty = true\n            }\n\n            return\n        }\n\n        this.tokenRefCount.set(token, next)\n    }\n\n    private resolveCssRule(token: string): string | null {\n        // Закешированный результат — в т.ч. null (токен заведомо без правила):\n        // Map.get вернёт undefined только если ключа нет вовсе.\n        const cached = this.tokenCssCache.get(token)\n\n        if (cached !== undefined) {\n            return cached\n        }\n\n        const parsed = parseToken(token)\n        const cssBody = parsed && resolveRule(parsed.utility, this.rules)\n\n        const cssRule = parsed && cssBody\n            ? buildCssRule(parsed, cssBody, this.options.breakpoints, this.options.variants)\n            : null\n\n        this.tokenCssCache.set(token, cssRule)\n\n        return cssRule\n    }\n\n    syncFile(file: string, nextTokens: Set<string>): void {\n        const key = normalizePath(file)\n        const prevTokens = this.fileToTokens.get(key) ?? new Set<string>()\n\n        for (const token of prevTokens) {\n            if (!nextTokens.has(token)) {\n                this.removeTokenUsage(token)\n            }\n        }\n\n        for (const token of nextTokens) {\n            if (!prevTokens.has(token)) {\n                this.addTokenUsage(token)\n            }\n        }\n\n        if (nextTokens.size > 0) {\n            this.fileToTokens.set(key, nextTokens)\n        } else {\n            this.fileToTokens.delete(key)\n        }\n    }\n\n    removeFile(file: string): void {\n        this.syncFile(file, new Set())\n    }\n\n    rebuildAll(files: { path: string; tokens: Set<string> }[]): void {\n        this.reset()\n\n        for (const { path, tokens } of files) {\n            this.syncFile(path, tokens)\n        }\n    }\n\n    buildCss(): string {\n        if (!this.activeCssRules.size) {\n            return this.options.emitEmptyFile\n                ? '/* @vueland/utils-jit: no utilities found */\\n'\n                : ''\n        }\n\n        const sortedRules = Array.from(this.activeCssRules.entries())\n            .sort(([a], [b]) => a.localeCompare(b))\n            .map(([, cssRule]) => cssRule)\n\n        return [this.options.banner, ...sortedRules, ''].join('\\n')\n    }\n\n    get activeCount(): number {\n        return this.activeCssRules.size\n    }\n\n    private reset(): void {\n        this.fileToTokens.clear()\n        this.tokenRefCount.clear()\n        this.activeCssRules.clear()\n\n        // Полный ребилд всегда должен привести к попытке записи (хотя бы пустого\n        // плейсхолдера при первом запуске), поэтому помечаем грязным безусловно.\n        this._dirty = true\n    }\n}\n","import * as fs from 'node:fs'\nimport { createRequire } from 'node:module'\nimport * as path from 'node:path'\nimport type { Plugin, ViteDevServer } from 'vite'\n\nimport { ContentCache } from './content-cache'\nimport {\n    DEFAULT_BREAKPOINTS,\n    DEFAULT_EXCLUDE,\n    DEFAULT_INCLUDE,\n    DEFAULT_VARIANTS,\n    defineColorAttr,\n    shouldProcess,\n    tokenize,\n} from './core'\nimport {\n    CssOutput,\n    RESOLVED_VIRTUAL_CSS_ID,\n    VIRTUAL_CSS_ID,\n} from './css-output'\nimport {\n    collectProjectFilesAsync,\n    isSameFile,\n    readFileSafe,\n    readFileSafeAsync,\n} from './project-scan'\nimport { defaultRules } from './rules'\nimport { createScssBreakpointInjector } from './scss-injection'\nimport { TokenRegistry } from './token-registry'\nimport type {\n    AttrRule,\n    JitOptions,\n    ResolvedJitOptions,\n    UtilityRule,\n} from './types'\n\nconst INITIAL_READ_CONCURRENCY = 32\n\nasync function mapConcurrent<T, R>(\n    items: T[],\n    limit: number,\n    mapper: (item: T) => Promise<R>,\n): Promise<R[]> {\n    const results: R[] = new Array(items.length)\n    let nextIndex = 0\n\n    async function worker(): Promise<void> {\n        while (nextIndex < items.length) {\n            const index = nextIndex++\n\n            results[index] = await mapper(items[index])\n        }\n    }\n\n    await Promise.all(\n        Array.from(\n            { length: Math.min(limit, items.length) },\n            () => worker(),\n        ),\n    )\n\n    return results\n}\n\n// В монорепе @vueland/ui может быть workspace-линком без собранного dist,\n// поэтому сначала deps из package.json и только потом require.resolve\nfunction hasVuelandUi(root: string): boolean {\n    try {\n        const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'))\n\n        if (pkg.dependencies?.['@vueland/ui'] || pkg.devDependencies?.['@vueland/ui']) {\n            return true\n        }\n    } catch {\n        // package.json может отсутствовать или быть невалидным — идём к resolve\n    }\n\n    try {\n        createRequire(path.join(root, 'package.json')).resolve('@vueland/ui')\n\n        return true\n    } catch {\n        return false\n    }\n}\n\nfunction resolveOptions(options: JitOptions = {}): ResolvedJitOptions {\n    return {\n        include: options.include ?? DEFAULT_INCLUDE,\n        exclude: [...DEFAULT_EXCLUDE, ...(options.exclude ?? [])],\n        emitFile: options.emitFile ?? false,\n        outFile: options.outFile ?? 'src/.generated/utils-jit.css',\n        // Мерж, а НЕ replace — намеренно и обязательно. Имена брейкпоинтов\n        // (xs/sm/md/lg/xl/xxl) — контракт: @vueland/ui генерит `.{name}\\:*`\n        // утилиты через `@each ... in $grid-breakpoints` в 6 модулях (+CGrid,\n        // use-display, JIT). Эта карта инжектится в $grid-breakpoints. Replace\n        // при переопределении одного значения (напр. {sm: 680}) уронил бы все\n        // .md\\:* / .lg\\:* / ... по всей либе. Override значений и добавление\n        // имён — ок; убрать дефолтные имена нельзя (и не нужно).\n        breakpoints: {\n            ...DEFAULT_BREAKPOINTS,\n            ...(options.breakpoints ?? {}),\n        },\n        attrs: options.attrs ?? [],\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\nexport function utilsJIT(options?: JitOptions): Plugin {\n    const resolvedOptions = resolveOptions(options)\n    const allRules: UtilityRule[] = [...defaultRules, ...resolvedOptions.rules]\n    const registry = new TokenRegistry(resolvedOptions, allRules)\n    const contentCache = new ContentCache()\n    const cssOutput = new CssOutput({ emitFile: resolvedOptions.emitFile })\n\n    // Гейт по СЫРОМУ флагу: брейкпоинты инжектим в SCSS/JS только если их явно\n    // задали. А значение берём из resolvedOptions (мерж с дефолтами) — Sass\n    // `@use with (...)` полностью замещает карту, поэтому partial сломал бы\n    // стандартные брейкпоинты. SCSS, JS и JIT должны видеть одну и ту же карту.\n    const shouldInjectBreakpoints = options?.breakpoints !== undefined\n\n    let root = process.cwd()\n    let outFileAbs = ''\n    let vuelandUiAttrs: AttrRule[] = []\n\n    function debug(message: string): void {\n        if (resolvedOptions.debug) {\n            console.info(`[utils-jit] ${message}`)\n        }\n    }\n\n    function getAttrRules(): AttrRule[] {\n        return [\n            ...resolvedOptions.attrs,\n            ...vuelandUiAttrs,\n        ]\n    }\n\n    // Отдаёт обновлённый CSS в virtual-модуль (и опц. дебаг-файл). Гейт по\n    // consumeDirty: сериализация и доставка только когда набор правил менялся.\n    function flushCss(notify: boolean): void {\n        if (!registry.consumeDirty()) {\n            return\n        }\n\n        cssOutput.update(registry.buildCss(), notify)\n    }\n\n    async function rebuildAll(notify: boolean): Promise<void> {\n        contentCache.clear()\n\n        const filePaths = await collectProjectFilesAsync(\n            root,\n            resolvedOptions.include,\n            resolvedOptions.exclude,\n            outFileAbs,\n        )\n\n        const files = (await mapConcurrent(\n            filePaths,\n            INITIAL_READ_CONCURRENCY,\n            async (filePath) => {\n                const code = await readFileSafeAsync(filePath)\n\n                if (code === null) {\n                    return null\n                }\n\n                // Запоминаем хэш, чтобы последующий transform по этому файлу не\n                // токенизировал повторно тот же контент (двойной обход на старте).\n                contentCache.changed(filePath, code)\n\n                return {\n                    path: filePath,\n                    tokens: tokenize(code, getAttrRules()),\n                }\n            },\n        )).filter((file): file is { path: string; tokens: Set<string> } => file !== null)\n\n        registry.rebuildAll(files)\n        flushCss(notify)\n\n        debug(`scanned ${filePaths.length} files, found ${registry.activeCount} utilities`)\n    }\n\n    function rebuildOne(file: string, code: string, notify: boolean): void {\n        // На случай emitFile с кастомным outFile «нашего» расширения — не\n        // обрабатываем собственный дебаг-вывод.\n        if (isSameFile(file, outFileAbs)) {\n            return\n        }\n\n        if (!shouldProcess(file, resolvedOptions.include, resolvedOptions.exclude)) {\n            return\n        }\n\n        // Контент не менялся с прошлого раза → токены те же, работу пропускаем.\n        if (!contentCache.changed(file, code)) {\n            return\n        }\n\n        registry.syncFile(\n            file,\n            tokenize(code, getAttrRules()),\n        )\n        flushCss(notify)\n    }\n\n    function removeOne(file: string, notify: boolean): void {\n        if (isSameFile(file, outFileAbs)) {\n            return\n        }\n\n        contentCache.delete(file)\n        registry.removeFile(file)\n        flushCss(notify)\n    }\n\n    return {\n        name: 'utils-jit',\n        enforce: 'pre',\n\n        config() {\n            // Брейкпоинты не заданы → ничего не инжектим и не определяем:\n            // SCSS возьмёт дефолты из maps/grids, JS — дефолты use-display.\n            if (!shouldInjectBreakpoints) return\n\n            return {\n                define: {\n                    __VUELAND_BREAKPOINTS__: JSON.stringify(resolvedOptions.breakpoints),\n                },\n                css: {\n                    preprocessorOptions: {\n                        scss: {\n                            additionalData: createScssBreakpointInjector(resolvedOptions.breakpoints),\n                        },\n                    },\n                },\n            }\n        },\n\n        configResolved(config: any) {\n            root = config.root\n            outFileAbs = path.resolve(root, resolvedOptions.outFile)\n            cssOutput.setOutFile(outFileAbs)\n\n            // Компоненты @vueland/ui строят классы из color-пропов в рантайме.\n            // Это внутренний контракт Vueland UI: пользовательские attrs\n            // добавляются сверху, но не отключают скан color-пропа.\n            vuelandUiAttrs = hasVuelandUi(root) ? [defineColorAttr('color')] : []\n        },\n\n        async buildStart() {\n            // Полный обход проекта — ровно один раз. buildStart срабатывает до\n            // transform/импортов и в dev, и в build, поэтому Vite/Rollup дождутся\n            // async FS, а CSS будет готов заранее (его отдаст load).\n            // Инкрементальные изменения дальше идут через transform,\n            // handleHotUpdate и watchChange.\n            await rebuildAll(false)\n        },\n\n        configureServer(server: ViteDevServer) {\n            cssOutput.setServer(server)\n        },\n\n        resolveId(id: string) {\n            return id === VIRTUAL_CSS_ID ? RESOLVED_VIRTUAL_CSS_ID : null\n        },\n\n        load(id: string) {\n            return id === RESOLVED_VIRTUAL_CSS_ID ? cssOutput.css : null\n        },\n\n        transform(code: string, id: string) {\n            // Под-запросы (?vue&type=..., ?raw, ?worker) несут лишь ФРАГМЕНТ\n            // модуля — токенизировать их нельзя, иначе они затрут токены полного\n            // файла. Полный файл приходит по каноническому id (без query) и при\n            // изменениях через handleHotUpdate/watchChange.\n            if (id.includes('?')) {\n                return null\n            }\n\n            rebuildOne(id, code, false)\n\n            return null\n        },\n\n        async handleHotUpdate(ctx) {\n            const { file } = ctx\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: string, change) {\n            const file = id.split('?')[0]\n\n            if (!file) {\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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"}