cli-testing-library
Version:
Simple and complete CLI testing utilities that encourage good testing practices.
1 lines • 3.91 kB
Source Map (JSON)
{"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;;"}