{"version":3,"file":"suggestions.cjs","sources":["../../src/suggestions.ts"],"sourcesContent":["import { getDefaultNormalizer } from \"./matches\";\nimport type { TestInstance } from \"./types\";\n\nexport interface QueryOptions {\n  [key: string]: RegExp | boolean;\n}\n\nexport type QueryArgs = [string, QueryOptions?];\n\nexport interface Suggestion {\n  queryName: string;\n  queryMethod: string;\n  queryArgs: QueryArgs;\n  variant: string;\n  warning?: string;\n  toString: () => string;\n}\n\nexport type Variant = \"find\" | \"get\" | \"query\";\n\nexport type Method = \"Text\" | \"text\";\n\nconst normalize = getDefaultNormalizer();\n\nfunction escapeRegExp(string: string) {\n  return string.replace(/[.*+\\-?^${}()|[\\]\\\\]/g, \"\\\\$&\"); // $& means the whole matched string\n}\n\nfunction getRegExpMatcher(string: string) {\n  return new RegExp(escapeRegExp(string.toLowerCase()), \"i\");\n}\n\nfunction makeSuggestion(\n  queryName: string,\n  _instance: TestInstance,\n  content: string,\n  {\n    variant,\n    name,\n  }: {\n    variant: Variant;\n    name?: string;\n  },\n): Suggestion | undefined {\n  const warning = \"\" as string;\n  const queryOptions = {} as QueryOptions;\n  const queryArgs = [\n    [].includes(queryName as never) ? content : getRegExpMatcher(content),\n  ] as QueryArgs;\n\n  if (name) {\n    queryOptions.name = getRegExpMatcher(name);\n  }\n\n  if (Object.keys(queryOptions).length > 0) {\n    queryArgs.push(queryOptions);\n  }\n\n  const queryMethod = `${variant}By${queryName}`;\n\n  return {\n    queryName,\n    queryMethod,\n    queryArgs,\n    variant,\n    warning,\n    toString() {\n      if (warning) {\n        console.warn(warning);\n      }\n      const [text, options] = queryArgs;\n\n      const newText = typeof text === \"string\" ? `'${text}'` : text;\n\n      const newOptions = options\n        ? `, { ${Object.entries(options)\n            .map(([k, v]) => `${k}: ${v}`)\n            .join(\", \")} }`\n        : \"\";\n\n      return `${queryMethod}(${newText}${newOptions})`;\n    },\n  };\n}\n\nfunction canSuggest(\n  currentMethod: Method,\n  requestedMethod: Method | undefined,\n  data: unknown,\n) {\n  return (\n    data &&\n    (!requestedMethod ||\n      requestedMethod.toLowerCase() === currentMethod.toLowerCase())\n  );\n}\n\nexport function getSuggestedQuery(\n  instance: TestInstance,\n  variant: Variant = \"get\",\n  method?: Method,\n): Suggestion | undefined {\n  const textContent = normalize(\n    instance.stdoutArr.map((obj) => obj.contents).join(\"\\n\"),\n  );\n  if (canSuggest(\"Text\", method, textContent)) {\n    return makeSuggestion(\"Text\", instance, textContent, { variant });\n  }\n\n  return undefined;\n}\n"],"names":["getDefaultNormalizer"],"mappings":";;;AAsBA,MAAM,YAAYA,QAAAA,qBAAqB;AAEvC,SAAS,aAAa,QAAgB;AAC7B,SAAA,OAAO,QAAQ,yBAAyB,MAAM;AACvD;AAEA,SAAS,iBAAiB,QAAgB;AACxC,SAAO,IAAI,OAAO,aAAa,OAAO,YAAY,CAAC,GAAG,GAAG;AAC3D;AAEA,SAAS,eACP,WACA,WACA,SACA;AAAA,EACE;AAAA,EACA;AACF,GAIwB;AACxB,QAAM,UAAU;AAChB,QAAM,eAAe,CAAC;AACtB,QAAM,YAAY;AAAA,IAChB,CAAA,EAAG,SAAS,SAAkB,IAAI,UAAU,iBAAiB,OAAO;AAAA,EACtE;AAEA,MAAI,MAAM;AACK,iBAAA,OAAO,iBAAiB,IAAI;AAAA,EAAA;AAG3C,MAAI,OAAO,KAAK,YAAY,EAAE,SAAS,GAAG;AACxC,cAAU,KAAK,YAAY;AAAA,EAAA;AAG7B,QAAM,cAAc,GAAG,OAAO,KAAK,SAAS;AAErC,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAIH,YAAA,CAAC,MAAM,OAAO,IAAI;AAExB,YAAM,UAAU,OAAO,SAAS,WAAW,IAAI,IAAI,MAAM;AAEnD,YAAA,aAAa,UACf,OAAO,OAAO,QAAQ,OAAO,EAC1B,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,EAC5B,KAAK,IAAI,CAAC,OACb;AAEJ,aAAO,GAAG,WAAW,IAAI,OAAO,GAAG,UAAU;AAAA,IAAA;AAAA,EAEjD;AACF;AAEA,SAAS,WACP,eACA,iBACA,MACA;AACA,SACE,QACC;AAGL;AAEO,SAAS,kBACd,UACA,UAAmB,OACnB,QACwB;AACxB,QAAM,cAAc;AAAA,IAClB,SAAS,UAAU,IAAI,CAAC,QAAQ,IAAI,QAAQ,EAAE,KAAK,IAAI;AAAA,EACzD;AACA,MAAI,WAAW,QAAQ,QAAQ,WAAW,GAAG;AAC3C,WAAO,eAAe,QAAQ,UAAU,aAAa,EAAE,SAAS;AAAA,EAAA;AAG3D,SAAA;AACT;;"}