{"version":3,"file":"query-helpers.cjs","sources":["../../src/query-helpers.ts"],"sourcesContent":["import { getSuggestedQuery } from \"./suggestions\";\nimport { waitFor } from \"./wait-for\";\nimport { getConfig } from \"./config\";\nimport type { waitForOptions as WaitForOptions } from \"./wait-for\";\nimport type { Variant } from \"./suggestions\";\nimport type { TestInstance } from \"./types\";\nimport type { Matcher, MatcherOptions } from \"./matches\";\n\nexport type WithSuggest = { suggest?: boolean };\n\nexport type GetErrorFunction<TArguments extends Array<any> = [string]> = (\n  c: TestInstance | null,\n  ...args: TArguments\n) => string;\n\nexport interface SelectorMatcherOptions extends MatcherOptions {\n  selector?: string;\n  ignore?: boolean | string;\n}\n\nexport type QueryMethod<TArguments extends Array<any>, TReturn> = (\n  container: TestInstance,\n  ...args: TArguments\n) => TReturn;\n\nfunction getInstanceError(message: string | null, instance: TestInstance) {\n  return getConfig().getInstanceError(message, instance);\n}\n\nfunction getSuggestionError(\n  suggestion: { toString: () => string },\n  container: TestInstance,\n) {\n  return getConfig().getInstanceError(\n    `A better query is available, try this:\n${suggestion.toString()}\n`,\n    container,\n  );\n}\n\n// this accepts a query function and returns a function which throws an error\n// if an empty list of elements is returned\nfunction makeGetQuery<TArguments extends Array<unknown>>(\n  queryBy: (instance: TestInstance, ...args: TArguments) => TestInstance | null,\n  getMissingError: GetErrorFunction<TArguments>,\n) {\n  return <T extends TestInstance = TestInstance>(\n    instance: TestInstance,\n    ...args: TArguments\n  ): T => {\n    const el = queryBy(instance, ...args);\n    if (!el) {\n      throw getConfig().getInstanceError(\n        getMissingError(instance, ...args),\n        instance,\n      );\n    }\n\n    return el as T;\n  };\n}\n\n// this accepts a getter query function and returns a function which calls\n// waitFor and passing a function which invokes the getter.\nfunction makeFindQuery<TQueryFor>(\n  getter: (\n    container: TestInstance,\n    text: Matcher,\n    options?: MatcherOptions,\n  ) => TQueryFor,\n) {\n  return <T extends TestInstance = TestInstance>(\n    instance: TestInstance,\n    text: Matcher,\n    options?: MatcherOptions,\n    waitForOptions?: WaitForOptions,\n  ): Promise<T> => {\n    return waitFor(\n      () => {\n        return getter(instance, text, options) as unknown as T;\n      },\n      { instance, ...waitForOptions },\n    );\n  };\n}\n\nconst wrapSingleQueryWithSuggestion =\n  <TArguments extends Array<unknown>>(\n    query: (\n      container: TestInstance,\n      ...args: TArguments\n    ) => TestInstance | null,\n    queryByName: string,\n    variant: Variant,\n  ) =>\n  <T extends TestInstance = TestInstance>(\n    container: TestInstance,\n    ...args: TArguments\n  ): T => {\n    const instance = query(container, ...args);\n    const [{ suggest = getConfig().throwSuggestions } = {}] = args.slice(\n      -1,\n    ) as [WithSuggest];\n    if (instance && suggest) {\n      const suggestion = getSuggestedQuery(instance, variant);\n      if (suggestion && !queryByName.endsWith(suggestion.queryName)) {\n        throw getSuggestionError(suggestion.toString(), container);\n      }\n    }\n\n    return instance as T;\n  };\n\nfunction buildQueries(\n  queryBy: QueryMethod<\n    [matcher: Matcher, options?: MatcherOptions],\n    TestInstance | null\n  >,\n  getMissingError: GetErrorFunction<\n    [matcher: Matcher, options?: MatcherOptions]\n  >,\n) {\n  const getBy = makeGetQuery(queryBy, getMissingError);\n\n  const queryByWithSuggestions = wrapSingleQueryWithSuggestion(\n    queryBy,\n    queryBy.name,\n    \"get\",\n  );\n\n  const getByWithSuggestions = wrapSingleQueryWithSuggestion(\n    getBy,\n    queryBy.name,\n    \"get\",\n  );\n\n  const findBy = makeFindQuery(\n    wrapSingleQueryWithSuggestion(getBy, queryBy.name, \"find\"),\n  );\n\n  return [queryByWithSuggestions, getByWithSuggestions, findBy] as const;\n}\n\nexport {\n  getInstanceError,\n  wrapSingleQueryWithSuggestion,\n  makeFindQuery,\n  buildQueries,\n};\n"],"names":["getConfig","waitFor","getSuggestedQuery"],"mappings":";;;;;AAyBA,SAAS,iBAAiB,SAAwB,UAAwB;AACxE,SAAOA,iBAAU,EAAE,iBAAiB,SAAS,QAAQ;AACvD;AAEA,SAAS,mBACP,YACA,WACA;AACA,SAAOA,OAAAA,UAAY,EAAA;AAAA,IACjB;AAAA,EACF,WAAW,SAAU,CAAA;AAAA;AAAA,IAEnB;AAAA,EACF;AACF;AAIA,SAAS,aACP,SACA,iBACA;AACO,SAAA,CACL,aACG,SACG;AACN,UAAM,KAAK,QAAQ,UAAU,GAAG,IAAI;AACpC,QAAI,CAAC,IAAI;AACP,YAAMA,OAAAA,UAAY,EAAA;AAAA,QAChB,gBAAgB,UAAU,GAAG,IAAI;AAAA,QACjC;AAAA,MACF;AAAA,IAAA;AAGK,WAAA;AAAA,EACT;AACF;AAIA,SAAS,cACP,QAKA;AACA,SAAO,CACL,UACA,MACA,SACA,mBACe;AACR,WAAAC,QAAA;AAAA,MACL,MAAM;AACG,eAAA,OAAO,UAAU,MAAM,OAAO;AAAA,MACvC;AAAA,MACA,EAAE,UAAU,GAAG,eAAe;AAAA,IAChC;AAAA,EACF;AACF;AAEA,MAAM,gCACJ,CACE,OAIA,aACA,YAEF,CACE,cACG,SACG;AACN,QAAM,WAAW,MAAM,WAAW,GAAG,IAAI;AACnC,QAAA,CAAC,EAAE,UAAUD,iBAAU,EAAE,qBAAqB,CAAE,CAAA,IAAI,KAAK;AAAA,IAC7D;AAAA,EACF;AACA,MAAI,YAAY,SAAS;AACjB,UAAA,aAAaE,YAAAA,kBAAkB,UAAU,OAAO;AACtD,QAAI,cAAc,CAAC,YAAY,SAAS,WAAW,SAAS,GAAG;AAC7D,YAAM,mBAAmB,WAAW,SAAS,GAAG,SAAS;AAAA,IAAA;AAAA,EAC3D;AAGK,SAAA;AACT;AAEF,SAAS,aACP,SAIA,iBAGA;AACM,QAAA,QAAQ,aAAa,SAAS,eAAe;AAEnD,QAAM,yBAAyB;AAAA,IAC7B;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACF;AAEA,QAAM,uBAAuB;AAAA,IAC3B;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACF;AAEA,QAAM,SAAS;AAAA,IACb,8BAA8B,OAAO,QAAQ,MAAM,MAAM;AAAA,EAC3D;AAEO,SAAA,CAAC,wBAAwB,sBAAsB,MAAM;AAC9D;;;;;"}