{
  "version": 3,
  "sources": ["../../../../src/packages/matcher/index.ts"],
  "sourcesContent": ["import escapeStringRegexp from 'escape-string-regexp';\n\ntype Matcher = (input: string) => boolean;\n\ntype MatcherWithIndex = (input: string) => number;\n\nexport function createMatcher(patterns: string[] | string): Matcher {\n  const m = createMatcherWithIndex(\n    Array.isArray(patterns) ? patterns : [patterns]\n  );\n\n  return (input: string): boolean => {\n    return m(input) !== -1;\n  };\n}\n\ntype MatcherFunction = {\n  match: Matcher;\n  ignore: boolean;\n};\n\nexport function createMatcherWithIndex(patterns: string[]): MatcherWithIndex {\n  switch (patterns.length) {\n    case 0:\n      return () => -1;\n    case 1:\n      return matcherWhenOnlyOnePatternWithIndex(patterns[0] ?? '');\n  }\n\n  const matchArr: MatcherFunction[] = [];\n\n  let hasIgnore = false;\n  let hasInclude = false;\n\n  for (const pattern of patterns) {\n    if (isIgnorePattern(pattern)) {\n      hasIgnore = true;\n      matchArr.push({\n        ignore: true,\n        match: matcherFromPattern(pattern.substring(1)),\n      });\n    } else {\n      hasInclude = true;\n      matchArr.push({ ignore: false, match: matcherFromPattern(pattern) });\n    }\n  }\n\n  if (!hasIgnore) {\n    return matchInputWithNonIgnoreMatchers.bind(null, matchArr);\n  }\n\n  if (!hasInclude) {\n    return matchInputWithoutIgnoreMatchers.bind(null, matchArr);\n  }\n\n  return matchInputWithMatchersArray.bind(null, matchArr);\n}\n\nfunction matchInputWithNonIgnoreMatchers(\n  matchArr: MatcherFunction[],\n  input: string\n): number {\n  for (let i = 0; i < matchArr.length; i++) {\n    if (matchArr[i]?.match(input) === true) {\n      return i;\n    }\n  }\n\n  return -1;\n}\n\nfunction matchInputWithoutIgnoreMatchers(\n  matchArr: MatcherFunction[],\n  input: string\n): number {\n  return matchArr.some(({ match }) => match(input)) ? -1 : 0;\n}\n\nfunction matchInputWithMatchersArray(\n  matchArr: MatcherFunction[],\n  input: string\n): number {\n  let matchedPatternIndex = -1;\n\n  for (let i = 0; i < matchArr.length; i++) {\n    const matcher = matchArr[i];\n\n    if (typeof matcher === 'undefined') {\n      continue;\n    }\n\n    if (matcher.ignore) {\n      if (matcher.match(input)) {\n        matchedPatternIndex = -1;\n      }\n    } else if (matchedPatternIndex === -1 && matcher.match(input)) {\n      matchedPatternIndex = i;\n    }\n  }\n\n  return matchedPatternIndex;\n}\n\nfunction matcherFromPattern(pattern: string): Matcher {\n  if (pattern === '*') {\n    return () => true;\n  }\n\n  const escapedPattern = escapeStringRegexp(pattern).replace(/\\\\\\*/g, '.*');\n\n  if (escapedPattern === pattern) {\n    return (input: string) => input === pattern;\n  }\n\n  const regexp = new RegExp(`^${escapedPattern}$`);\n\n  return (input: string) => regexp.test(input);\n}\n\nfunction isIgnorePattern(pattern: string): boolean {\n  return pattern.startsWith('!');\n}\n\nfunction matcherWhenOnlyOnePatternWithIndex(pattern: string): MatcherWithIndex {\n  const m = matcherWhenOnlyOnePattern(pattern);\n\n  return (input) => (m(input) ? 0 : -1);\n}\n\nfunction matcherWhenOnlyOnePattern(pattern: string): Matcher {\n  if (!isIgnorePattern(pattern)) {\n    return matcherFromPattern(pattern);\n  }\n\n  const ignorePattern = pattern.substring(1);\n\n  const m = matcherFromPattern(ignorePattern);\n\n  return (input) => !m(input);\n}\n"],
  "mappings": "AAAA,OAAO,wBAAwB;AAMxB,SAAS,cAAc,UAAsC;AAClE,QAAM,IAAI;AAAA,IACR,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAQ;AAAA,EAChD;AAEA,SAAO,CAAC,UAA2B;AACjC,WAAO,EAAE,KAAK,MAAM;AAAA,EACtB;AACF;AAOO,SAAS,uBAAuB,UAAsC;AAC3E,UAAQ,SAAS,QAAQ;AAAA,IACvB,KAAK;AACH,aAAO,MAAM;AAAA,IACf,KAAK;AACH,aAAO,mCAAmC,SAAS,CAAC,KAAK,EAAE;AAAA,EAC/D;AAEA,QAAM,WAA8B,CAAC;AAErC,MAAI,YAAY;AAChB,MAAI,aAAa;AAEjB,aAAW,WAAW,UAAU;AAC9B,QAAI,gBAAgB,OAAO,GAAG;AAC5B,kBAAY;AACZ,eAAS,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,OAAO,mBAAmB,QAAQ,UAAU,CAAC,CAAC;AAAA,MAChD,CAAC;AAAA,IACH,OAAO;AACL,mBAAa;AACb,eAAS,KAAK,EAAE,QAAQ,OAAO,OAAO,mBAAmB,OAAO,EAAE,CAAC;AAAA,IACrE;AAAA,EACF;AAEA,MAAI,CAAC,WAAW;AACd,WAAO,gCAAgC,KAAK,MAAM,QAAQ;AAAA,EAC5D;AAEA,MAAI,CAAC,YAAY;AACf,WAAO,gCAAgC,KAAK,MAAM,QAAQ;AAAA,EAC5D;AAEA,SAAO,4BAA4B,KAAK,MAAM,QAAQ;AACxD;AAEA,SAAS,gCACP,UACA,OACQ;AACR,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,QAAI,SAAS,CAAC,GAAG,MAAM,KAAK,MAAM,MAAM;AACtC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gCACP,UACA,OACQ;AACR,SAAO,SAAS,KAAK,CAAC,EAAE,MAAM,MAAM,MAAM,KAAK,CAAC,IAAI,KAAK;AAC3D;AAEA,SAAS,4BACP,UACA,OACQ;AACR,MAAI,sBAAsB;AAE1B,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,UAAU,SAAS,CAAC;AAE1B,QAAI,OAAO,YAAY,aAAa;AAClC;AAAA,IACF;AAEA,QAAI,QAAQ,QAAQ;AAClB,UAAI,QAAQ,MAAM,KAAK,GAAG;AACxB,8BAAsB;AAAA,MACxB;AAAA,IACF,WAAW,wBAAwB,MAAM,QAAQ,MAAM,KAAK,GAAG;AAC7D,4BAAsB;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,SAA0B;AACpD,MAAI,YAAY,KAAK;AACnB,WAAO,MAAM;AAAA,EACf;AAEA,QAAM,iBAAiB,mBAAmB,OAAO,EAAE,QAAQ,SAAS,IAAI;AAExE,MAAI,mBAAmB,SAAS;AAC9B,WAAO,CAAC,UAAkB,UAAU;AAAA,EACtC;AAEA,QAAM,SAAS,IAAI,OAAO,IAAI,cAAc,GAAG;AAE/C,SAAO,CAAC,UAAkB,OAAO,KAAK,KAAK;AAC7C;AAEA,SAAS,gBAAgB,SAA0B;AACjD,SAAO,QAAQ,WAAW,GAAG;AAC/B;AAEA,SAAS,mCAAmC,SAAmC;AAC7E,QAAM,IAAI,0BAA0B,OAAO;AAE3C,SAAO,CAAC,UAAW,EAAE,KAAK,IAAI,IAAI;AACpC;AAEA,SAAS,0BAA0B,SAA0B;AAC3D,MAAI,CAAC,gBAAgB,OAAO,GAAG;AAC7B,WAAO,mBAAmB,OAAO;AAAA,EACnC;AAEA,QAAM,gBAAgB,QAAQ,UAAU,CAAC;AAEzC,QAAM,IAAI,mBAAmB,aAAa;AAE1C,SAAO,CAAC,UAAU,CAAC,EAAE,KAAK;AAC5B;",
  "names": []
}
