tw-merge
Version:
Merge CSS utility classes without style conflicts - small and zero config
1 lines • 5.49 kB
Source Map (JSON)
{"version":3,"file":"create-merge.mjs","sources":["../../src/lib/create-merge.ts"],"sourcesContent":["import { Handler, RuleSet } from \"../rules\";\n\nimport { createLruCache } from \"./create-lru-cache\";\nimport { normalizeContext } from \"./utils\";\n\ntype ParsedRule = [RegExp, Handler];\n\nexport type CreateMergeConfig = {\n cacheSize?: number;\n separator?: string;\n prefix?: string;\n};\n\nexport function createMerge(\n ruleSet: RuleSet,\n { cacheSize = 500, separator = \":\", prefix }: CreateMergeConfig = {}\n) {\n const cache = createLruCache<string, string>(cacheSize);\n\n const parsedRuleSet = ruleSet.map(\n ([regExp, handler]) =>\n [\n new RegExp(\n `^(?<c>.*${separator}!?|!?)?-?${prefix ? `${prefix}-` : \"\"}${regExp}`\n ),\n handler,\n ] as ParsedRule\n );\n\n function merge(className: string) {\n const cached = cache.get(className);\n if (cached !== undefined) return cached;\n\n const memoryStore: Partial<Record<string, unknown>>[] = [];\n\n const classes = className.split(\" \");\n\n const outputClasses: string[] = [];\n\n // - for each class from right to left\n for (let classI = classes.length - 1; classI >= 0; classI--) {\n const currentClass = classes[classI]!;\n let didNotMatchOrWasContinued = true;\n // - for each rule\n for (let ruleI = 0; ruleI < parsedRuleSet.length; ruleI++) {\n const rule = parsedRuleSet[ruleI]!;\n const regexp = rule[0];\n const match = currentClass.match(regexp);\n\n // - if class matches rule, execute it\n if (match) {\n didNotMatchOrWasContinued = false;\n const groups = match.groups!;\n const context = normalizeContext(groups?.c ?? \"\", separator);\n const handler = rule[1];\n\n const memory = ((memoryStore[ruleI] ??= {})[context] ??= {});\n\n const result = handler(memory, groups!);\n const keepClass = result === true;\n const continueToNextRule = result === \"c\";\n\n if (keepClass) outputClasses.unshift(currentClass);\n\n // - finish with the class unless the rule says so\n if (!continueToNextRule) break;\n\n didNotMatchOrWasContinued = true;\n }\n }\n\n if (didNotMatchOrWasContinued) outputClasses.unshift(currentClass);\n }\n\n return cache.set(className, outputClasses.join(\" \"));\n }\n\n return merge;\n}\n"],"names":["createMerge","ruleSet","cacheSize","separator","prefix","cache","createLruCache","parsedRuleSet","map","regExp","handler","RegExp","merge","className","cached","get","undefined","memoryStore","classes","split","outputClasses","classI","length","currentClass","didNotMatchOrWasContinued","ruleI","rule","regexp","match","groups","context","normalizeContext","c","memory","result","keepClass","continueToNextRule","unshift","set","join"],"mappings":"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"}