{"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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"}