crawlee-one 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/README.md +81 -0
  2. package/dist/cjs/cli/cli.d.ts +1 -0
  3. package/dist/cjs/cli/cli.js +61 -0
  4. package/dist/cjs/cli/cli.js.map +1 -0
  5. package/dist/cjs/cli/index.d.ts +2 -0
  6. package/dist/cjs/cli/index.js +6 -0
  7. package/dist/cjs/cli/index.js.map +1 -0
  8. package/dist/cjs/index.d.ts +24 -0
  9. package/dist/cjs/index.js +43 -0
  10. package/dist/cjs/index.js.map +1 -0
  11. package/dist/cjs/lib/actions/dom.d.ts +102 -0
  12. package/dist/cjs/lib/actions/dom.js +743 -0
  13. package/dist/cjs/lib/actions/dom.js.map +1 -0
  14. package/dist/cjs/lib/actions/domUtils.d.ts +42 -0
  15. package/dist/cjs/lib/actions/domUtils.js +126 -0
  16. package/dist/cjs/lib/actions/domUtils.js.map +1 -0
  17. package/dist/cjs/lib/actions/page.d.ts +69 -0
  18. package/dist/cjs/lib/actions/page.js +205 -0
  19. package/dist/cjs/lib/actions/page.js.map +1 -0
  20. package/dist/cjs/lib/actions/scrapeListing.d.ts +78 -0
  21. package/dist/cjs/lib/actions/scrapeListing.js +242 -0
  22. package/dist/cjs/lib/actions/scrapeListing.js.map +1 -0
  23. package/dist/cjs/lib/actor/actor.d.ts +90 -0
  24. package/dist/cjs/lib/actor/actor.js +306 -0
  25. package/dist/cjs/lib/actor/actor.js.map +1 -0
  26. package/dist/cjs/lib/actor/types.d.ts +162 -0
  27. package/dist/cjs/lib/actor/types.js +3 -0
  28. package/dist/cjs/lib/actor/types.js.map +1 -0
  29. package/dist/cjs/lib/actor.d.ts +189 -0
  30. package/dist/cjs/lib/actor.js +225 -0
  31. package/dist/cjs/lib/actor.js.map +1 -0
  32. package/dist/cjs/lib/actorSpec.d.ts +20 -0
  33. package/dist/cjs/lib/actorSpec.js +3 -0
  34. package/dist/cjs/lib/actorSpec.js.map +1 -0
  35. package/dist/cjs/lib/config.d.ts +561 -0
  36. package/dist/cjs/lib/config.js +707 -0
  37. package/dist/cjs/lib/config.js.map +1 -0
  38. package/dist/cjs/lib/dataset/maxCount.d.ts +30 -0
  39. package/dist/cjs/lib/dataset/maxCount.js +55 -0
  40. package/dist/cjs/lib/dataset/maxCount.js.map +1 -0
  41. package/dist/cjs/lib/dataset/pushData.d.ts +123 -0
  42. package/dist/cjs/lib/dataset/pushData.js +182 -0
  43. package/dist/cjs/lib/dataset/pushData.js.map +1 -0
  44. package/dist/cjs/lib/dataset.d.ts +98 -0
  45. package/dist/cjs/lib/dataset.js +122 -0
  46. package/dist/cjs/lib/dataset.js.map +1 -0
  47. package/dist/cjs/lib/dom.d.ts +78 -0
  48. package/dist/cjs/lib/dom.js +243 -0
  49. package/dist/cjs/lib/dom.js.map +1 -0
  50. package/dist/cjs/lib/error/errorHandler.d.ts +112 -0
  51. package/dist/cjs/lib/error/errorHandler.js +164 -0
  52. package/dist/cjs/lib/error/errorHandler.js.map +1 -0
  53. package/dist/cjs/lib/error/sentry.d.ts +11 -0
  54. package/dist/cjs/lib/error/sentry.js +60 -0
  55. package/dist/cjs/lib/error/sentry.js.map +1 -0
  56. package/dist/cjs/lib/integrations/apify.d.ts +67 -0
  57. package/dist/cjs/lib/integrations/apify.js +106 -0
  58. package/dist/cjs/lib/integrations/apify.js.map +1 -0
  59. package/dist/cjs/lib/integrations/types.d.ts +274 -0
  60. package/dist/cjs/lib/integrations/types.js +3 -0
  61. package/dist/cjs/lib/integrations/types.js.map +1 -0
  62. package/dist/cjs/lib/io/dataset.d.ts +67 -0
  63. package/dist/cjs/lib/io/dataset.js +86 -0
  64. package/dist/cjs/lib/io/dataset.js.map +1 -0
  65. package/dist/cjs/lib/io/maxCount.d.ts +30 -0
  66. package/dist/cjs/lib/io/maxCount.js +55 -0
  67. package/dist/cjs/lib/io/maxCount.js.map +1 -0
  68. package/dist/cjs/lib/io/pushData.d.ts +124 -0
  69. package/dist/cjs/lib/io/pushData.js +193 -0
  70. package/dist/cjs/lib/io/pushData.js.map +1 -0
  71. package/dist/cjs/lib/io/pushRequests.d.ts +38 -0
  72. package/dist/cjs/lib/io/pushRequests.js +63 -0
  73. package/dist/cjs/lib/io/pushRequests.js.map +1 -0
  74. package/dist/cjs/lib/io/requestQueue.d.ts +28 -0
  75. package/dist/cjs/lib/io/requestQueue.js +40 -0
  76. package/dist/cjs/lib/io/requestQueue.js.map +1 -0
  77. package/dist/cjs/lib/log.d.ts +38 -0
  78. package/dist/cjs/lib/log.js +54 -0
  79. package/dist/cjs/lib/log.js.map +1 -0
  80. package/dist/cjs/lib/migrate/localMigrator.d.ts +10 -0
  81. package/dist/cjs/lib/migrate/localMigrator.js +57 -0
  82. package/dist/cjs/lib/migrate/localMigrator.js.map +1 -0
  83. package/dist/cjs/lib/migrate/localState.d.ts +7 -0
  84. package/dist/cjs/lib/migrate/localState.js +43 -0
  85. package/dist/cjs/lib/migrate/localState.js.map +1 -0
  86. package/dist/cjs/lib/migrate/types.d.ts +6 -0
  87. package/dist/cjs/lib/migrate/types.js +3 -0
  88. package/dist/cjs/lib/migrate/types.js.map +1 -0
  89. package/dist/cjs/lib/readme/readme.d.ts +65 -0
  90. package/dist/cjs/lib/readme/readme.js +534 -0
  91. package/dist/cjs/lib/readme/readme.js.map +1 -0
  92. package/dist/cjs/lib/readme/types.d.ts +260 -0
  93. package/dist/cjs/lib/readme/types.js +54 -0
  94. package/dist/cjs/lib/readme/types.js.map +1 -0
  95. package/dist/cjs/lib/router.d.ts +132 -0
  96. package/dist/cjs/lib/router.js +165 -0
  97. package/dist/cjs/lib/router.js.map +1 -0
  98. package/dist/cjs/lib/scraper/scrapeListing.d.ts +78 -0
  99. package/dist/cjs/lib/scraper/scrapeListing.js +242 -0
  100. package/dist/cjs/lib/scraper/scrapeListing.js.map +1 -0
  101. package/dist/cjs/lib/test/actor.d.ts +21 -0
  102. package/dist/cjs/lib/test/actor.js +56 -0
  103. package/dist/cjs/lib/test/actor.js.map +1 -0
  104. package/dist/cjs/lib/test/mockApifyClient.d.ts +32 -0
  105. package/dist/cjs/lib/test/mockApifyClient.js +176 -0
  106. package/dist/cjs/lib/test/mockApifyClient.js.map +1 -0
  107. package/dist/cjs/types.d.ts +31 -0
  108. package/dist/cjs/types.js +3 -0
  109. package/dist/cjs/types.js.map +1 -0
  110. package/dist/cjs/utils/async.d.ts +19 -0
  111. package/dist/cjs/utils/async.js +74 -0
  112. package/dist/cjs/utils/async.js.map +1 -0
  113. package/dist/cjs/utils/error.d.ts +1 -0
  114. package/dist/cjs/utils/error.js +10 -0
  115. package/dist/cjs/utils/error.js.map +1 -0
  116. package/dist/cjs/utils/format.d.ts +9 -0
  117. package/dist/cjs/utils/format.js +19 -0
  118. package/dist/cjs/utils/format.js.map +1 -0
  119. package/dist/cjs/utils/package.d.ts +15 -0
  120. package/dist/cjs/utils/package.js +25 -0
  121. package/dist/cjs/utils/package.js.map +1 -0
  122. package/dist/cjs/utils/types.d.ts +6 -0
  123. package/dist/cjs/utils/types.js +9 -0
  124. package/dist/cjs/utils/types.js.map +1 -0
  125. package/dist/cjs/utils/url.d.ts +9 -0
  126. package/dist/cjs/utils/url.js +32 -0
  127. package/dist/cjs/utils/url.js.map +1 -0
  128. package/dist/cjs/utils/valueMonitor.d.ts +31 -0
  129. package/dist/cjs/utils/valueMonitor.js +91 -0
  130. package/dist/cjs/utils/valueMonitor.js.map +1 -0
  131. package/package.json +85 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.js","sourceRoot":"","sources":["../../../../src/lib/actions/dom.ts"],"names":[],"mappings":"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","sourcesContent":["import { AnyNode, Cheerio } from 'cheerio';\nimport type { ElementHandle, JSHandle, Locator, Page } from 'playwright';\nimport get from 'lodash/get';\n\nimport { StrAsNumOptions, strAsNumber, strOrNull } from '../../utils/format';\nimport { FormatUrlOptions, formatUrl } from '../../utils/url';\nimport type { MaybeArray, MaybePromise } from '../../utils/types';\nimport { mergeHandles, splitCheerioSelection, splitPlaywrightSelection } from './domUtils';\nimport { logAndRethrow } from '../../utils/error';\n\n/**\n * Common interface for working with DOM despite different environments.\n *\n * Consider these environments:\n * 1) Browser (via Playwright & Chromium) - uses Browser API to work with DOM\n * 2) Cheerio - uses own API to work with DOM\n *\n * This common interfaces makes the scraping code more portable between the two.\n */\nexport interface DOMLib<El extends BaseEl, BaseEl> {\n node: El | null;\n\n ///////////////////////\n // SCALAR OPERATIONS\n ///////////////////////\n\n /** Get element's text (trimmed) */\n text: (options?: { allowEmpty?: boolean }) => MaybePromise<string | null>;\n /** Get element's text as uppercase (trimmed) */\n textAsUpper: (options?: { allowEmpty?: boolean }) => MaybePromise<string | null>;\n /** Get element's text as lowercase (trimmed) */\n textAsLower: (options?: { allowEmpty?: boolean }) => MaybePromise<string | null>;\n /** Get element's text and convert it to number */\n textAsNumber: (options?: StrAsNumOptions) => MaybePromise<number | null>;\n /** Get element's attribute */\n attr: (attrName: string, options?: { allowEmpty?: boolean }) => MaybePromise<string | null>;\n /** Get element's attributes */\n attrs: <T extends string>(\n attrNames: T[],\n options?: { allowEmpty?: boolean }\n ) => MaybePromise<Record<T, string | null>>;\n /** Get element's property */\n prop: <R = unknown>(\n /** Single or nested prop path */\n propName: MaybeArray<string>,\n options?: { allowEmpty?: boolean }\n ) => MaybePromise<R>;\n /** Get element's properties */\n props: <R extends any[]>(\n /** List of single or nested prop paths */\n propName: MaybeArray<string>[],\n options?: { allowEmpty?: boolean }\n ) => MaybePromise<R>;\n /** Get element's href */\n href: (options?: { allowEmpty?: boolean } & FormatUrlOptions) => MaybePromise<string | null>;\n /** Get element's src */\n src: (options?: { allowEmpty?: boolean } & FormatUrlOptions) => MaybePromise<string | null>;\n /** Get element's nodeName */\n nodeName: () => MaybePromise<string | null>;\n /** Get URL of website associated with the DOM */\n url: () => MaybePromise<string | null>;\n /** Freely modify the underlying DOM node */\n map: <TVal>(map: (node: El | null) => TVal) => MaybePromise<TVal>;\n\n ///////////////////////\n // NODE OPERATIONS\n ///////////////////////\n\n /** Get a single descendant matching the selector */\n findOne: <TNewEl extends BaseEl = El>(selector: string) => MaybePromise<DOMLib<TNewEl, BaseEl> | null>; // prettier-ignore\n /** Get all descendants matching the selector */\n findMany: <TNewEl extends BaseEl = El>(selector: string) => MaybePromise<DOMLib<TNewEl, BaseEl>[]>; // prettier-ignore\n /** Get a single ancestor (or itself) matching the selector */\n closest: <TNewEl extends BaseEl = El>(selector: string) => MaybePromise<DOMLib<TNewEl, BaseEl> | null>; // prettier-ignore\n /** Get element's parent */\n parent: <TNewEl extends BaseEl = El>() => MaybePromise<DOMLib<TNewEl, BaseEl> | null>;\n /** Get element's children */\n children: <TNewEl extends BaseEl = El>() => MaybePromise<DOMLib<TNewEl, BaseEl>[]>;\n /** Get remove the element */\n remove: () => MaybePromise<void>;\n /** Get root element */\n root: <TNewEl extends BaseEl = El>() => MaybePromise<DOMLib<TNewEl, BaseEl> | null>;\n\n /**\n * Given two elements, return closest ancestor element that encompases them both,\n * or `null` if none such found.\n */\n getCommonAncestor: <TNewEl extends BaseEl = El>(\n otherEl: El\n ) => MaybePromise<DOMLib<TNewEl, BaseEl> | null>;\n /**\n * Given a selector, find all DOM elements that match the selector,\n * and return closest ancestor element that encompases them all,\n * or `null` if none such found.\n */\n getCommonAncestorFromSelector: <TNewEl extends BaseEl = El>(\n selector: string\n ) => MaybePromise<DOMLib<TNewEl, BaseEl> | null>;\n}\n\nexport type BrowserDOMLib<T extends Element = Element> = DOMLib<T, Element>;\n\n/** Implementation of DOMLib in browser (using Browser API) */\nexport const browserDOMLib = <El extends Element>(node: El): BrowserDOMLib<El> => {\n ///////////////////////\n // SCALAR OPERATIONS\n ///////////////////////\n\n const text: BrowserDOMLib<El>['text'] = ({ allowEmpty } = {}) => {\n const txt = node.textContent?.trim() ?? null;\n return strOrNull(txt, allowEmpty);\n };\n\n const textAsUpper: BrowserDOMLib<El>['textAsUpper'] = (options) => {\n const txt = text(options);\n return txt ? (txt as string).toLocaleUpperCase() : txt;\n };\n\n const textAsLower: BrowserDOMLib<El>['textAsLower'] = (options) => {\n const txt = text(options);\n return txt ? (txt as string).toLocaleLowerCase() : txt;\n };\n\n const textAsNumber: BrowserDOMLib<El>['textAsNumber'] = (options) => {\n const txt = text(options);\n return strAsNumber(txt as string, options);\n };\n\n const prop: BrowserDOMLib<El>['prop'] = <R = unknown>(\n propOrPath: MaybeArray<string>,\n { allowEmpty = false } = {}\n ) => {\n const propPath = Array.isArray(propOrPath) ? propOrPath : [propOrPath];\n let propVal = get(node, propPath) ?? null;\n propVal = typeof propVal === 'string' ? propVal.trim() : propVal;\n return strOrNull(propVal, allowEmpty) as R;\n };\n\n const props: BrowserDOMLib<El>['props'] = <R extends any[]>(\n propsOrPaths: MaybeArray<string>[],\n options = {}\n ) => {\n const propPaths = propsOrPaths.map((p) => (Array.isArray(p) ? p : [p]));\n const propData = propPaths.map((path) => prop(path, options));\n return propData as MaybePromise<R>;\n };\n\n const attr: BrowserDOMLib<El>['attr'] = (propName, { allowEmpty } = {}) => {\n let attrVal = node.getAttribute(propName) ?? null;\n attrVal = typeof attrVal === 'string' ? attrVal.trim() : attrVal;\n return strOrNull(attrVal, allowEmpty);\n };\n\n const attrs: BrowserDOMLib<El>['attrs'] = <T extends string>(attrNames: T[], options = {}) => {\n const attrData = attrNames.reduce<Record<T, string | null>>((agg, name) => {\n agg[name] = attr(name, options) as string | null;\n return agg;\n }, {} as any);\n return attrData;\n };\n\n const href: BrowserDOMLib<El>['href'] = ({ allowEmpty, allowRelative, baseUrl } = {}) => {\n const val = prop('href', { allowEmpty }) as string | null;\n return formatUrl(val, { allowRelative, baseUrl });\n };\n\n const src: BrowserDOMLib<El>['src'] = ({ allowEmpty, allowRelative, baseUrl } = {}) => {\n const val = prop('src', { allowEmpty }) as string | null;\n return formatUrl(val, { allowRelative, baseUrl });\n };\n\n const nodeName: BrowserDOMLib<El>['nodeName'] = () => {\n // On UPPER- vs lower-case https://stackoverflow.com/questions/27223756/\n const val = prop('nodeName') as string | null;\n return typeof val === 'string' ? val.toLocaleUpperCase() : val;\n };\n\n const url: BrowserDOMLib<El>['url'] = () => {\n const doc = node.ownerDocument;\n // See https://stackoverflow.com/a/16010322/9788634\n const urlVal = doc.defaultView?.location?.href || null;\n return urlVal;\n };\n\n const map: BrowserDOMLib<El>['map'] = <TVal>(mapFn: (node: El) => TVal) => {\n return mapFn(node);\n };\n\n ///////////////////////\n // NODE OPERATIONS\n ///////////////////////\n\n const findOne: BrowserDOMLib<El>['findOne'] = <TNewEl extends Element = El>(selector) => {\n if (![Node.ELEMENT_NODE, Node.DOCUMENT_NODE].includes(node.nodeType as any)) return null;\n const resultEl = (node.querySelector(selector) ?? null) as TNewEl | null;\n return resultEl ? browserDOMLib(resultEl) : null;\n };\n\n const findMany: BrowserDOMLib<El>['findMany'] = <TNewEl extends Element = El>(selector) => {\n if (![Node.ELEMENT_NODE, Node.DOCUMENT_NODE].includes(node.nodeType as any)) return [];\n const resultEls = [...node.querySelectorAll(selector)] as TNewEl[]; // prettier-ignore\n return resultEls.map((el) => browserDOMLib(el));\n };\n\n const closest: BrowserDOMLib<El>['closest'] = <TNewEl extends Element = El>(selector) => {\n if (![Node.ELEMENT_NODE, Node.DOCUMENT_NODE].includes(node.nodeType as any)) return null;\n const resultEl = (node.closest(selector) ?? null) as TNewEl | null;\n return resultEl ? browserDOMLib(resultEl) : null;\n };\n\n const parent: BrowserDOMLib<El>['parent'] = <TNewEl extends Element = El>() => {\n const parentEl = (node.parentNode || null) as TNewEl | null;\n return parentEl ? browserDOMLib(parentEl) : null;\n };\n\n const children: BrowserDOMLib<El>['children'] = <TNewEl extends Element = El>() => {\n const childEls = [...node.children] as TNewEl[];\n return childEls.map((el) => browserDOMLib(el));\n };\n\n const root: BrowserDOMLib<El>['root'] = <TNewEl extends Element = El>() => {\n const rootEl = ((node.ownerDocument?.documentElement as any) || null) as TNewEl | null;\n return rootEl ? browserDOMLib(rootEl) : null;\n };\n\n const remove: BrowserDOMLib<El>['remove'] = () => {\n node.remove();\n };\n\n const _getCommonAncestor = <El extends Node>(el1: El, el2: El) => {\n // https://stackoverflow.com/a/25154092\n // https://developer.mozilla.org/en-US/docs/Web/API/Range/commonAncestorContainer\n const _getCommonAncestorFromRange = (el1: El, el2: El) => {\n const range = new Range();\n range.setStartBefore(el1);\n range.setEndAfter(el2);\n const containerEl = range.commonAncestorContainer;\n return containerEl;\n };\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Node/compareDocumentPosition\n const isEl1BeforeEl2 = !!(el1.compareDocumentPosition(el2) & Node.DOCUMENT_POSITION_FOLLOWING);\n\n const { firstEl, lastEl } = isEl1BeforeEl2\n ? { firstEl: el1, lastEl: el2 }\n : { firstEl: el2, lastEl: el1 };\n\n const containerEl = _getCommonAncestorFromRange(firstEl, lastEl);\n return containerEl as El | null;\n };\n\n const getCommonAncestor: BrowserDOMLib<El>['getCommonAncestor'] = <TNewEl extends Element = El>(\n otherEl\n ) => {\n const ancestor = _getCommonAncestor(node, otherEl);\n return ancestor ? browserDOMLib<TNewEl>(ancestor) : null;\n };\n\n const _getCommonAncestorFromSelector = _createCommonAncestorFromSelectorFn<El>({\n querySelectorAll: (selector) => node.querySelectorAll(selector) as Iterable<El>,\n getParent: (el) => el.parentElement as El | null,\n isAncestor: (el1, el2) => {\n return !!(el1.compareDocumentPosition(el2) & Node.DOCUMENT_POSITION_CONTAINED_BY);\n },\n getCommonAncestor: (el1, el2) => _getCommonAncestor(el1, el2),\n });\n\n const getCommonAncestorFromSelector: BrowserDOMLib<El>['getCommonAncestorFromSelector'] = async <\n TNewEl extends Element = El\n >(\n selector\n ) => {\n const ancestor = (await _getCommonAncestorFromSelector(selector)) as TNewEl | null;\n return ancestor ? browserDOMLib(ancestor) : null;\n };\n\n return {\n node,\n\n text,\n textAsLower,\n textAsUpper,\n textAsNumber,\n attr,\n attrs,\n prop,\n props,\n href,\n src,\n nodeName,\n url,\n map,\n\n findOne,\n findMany,\n closest,\n parent,\n children,\n root,\n remove,\n getCommonAncestor,\n getCommonAncestorFromSelector,\n } satisfies DOMLib<El, Element>;\n};\n\nexport type CheerioDOMLib<El extends Cheerio<AnyNode> = Cheerio<AnyNode>> = DOMLib<\n El,\n Cheerio<AnyNode>\n>;\n\n/** Implementation of DOMLib in Cheerio */\nexport const cheerioDOMLib = <El extends Cheerio<AnyNode>>(\n cheerioNode: El,\n srcUrl: string | null\n): CheerioDOMLib<El> => {\n ///////////////////////\n // SCALAR OPERATIONS\n ///////////////////////\n\n const text: CheerioDOMLib<El>['text'] = ({ allowEmpty } = {}) => {\n const txt = cheerioNode.text()?.trim() ?? null;\n return strOrNull(txt, allowEmpty);\n };\n\n const textAsUpper: CheerioDOMLib<El>['textAsUpper'] = (options) => {\n const txt = text(options);\n return txt ? (txt as string).toLocaleUpperCase() : txt;\n };\n\n const textAsLower: CheerioDOMLib<El>['textAsLower'] = (options) => {\n const txt = text(options);\n return txt ? (txt as string).toLocaleLowerCase() : txt;\n };\n\n const textAsNumber: CheerioDOMLib<El>['textAsNumber'] = (options) => {\n const txt = text(options);\n return strAsNumber(txt as string, options);\n };\n\n const attr: CheerioDOMLib<El>['attr'] = (attrName, { allowEmpty } = {}) => {\n let attrVal = cheerioNode.attr(attrName) ?? null;\n attrVal = typeof attrVal === 'string' ? attrVal.trim() : attrVal;\n return strOrNull(attrVal, allowEmpty);\n };\n\n const attrs: CheerioDOMLib<El>['attrs'] = <T extends string>(attrNames: T[], options = {}) => {\n const attrData = attrNames.reduce<Record<T, string | null>>((agg, name) => {\n agg[name] = attr(name, options) as string | null;\n return agg;\n }, {} as any);\n return attrData;\n };\n\n const prop: CheerioDOMLib<El>['prop'] = <R = unknown>(\n propOrPath: MaybeArray<string>,\n { allowEmpty = false } = {}\n ) => {\n const propPath = Array.isArray(propOrPath) ? propOrPath : [propOrPath];\n let propVal = cheerioNode.prop(propPath[0]) ?? null;\n if (propPath.length > 1) propVal = get(propVal, propPath.slice(1));\n propVal = typeof propVal === 'string' ? propVal.trim() : propVal;\n return strOrNull(propVal, allowEmpty) as R;\n };\n\n const props: CheerioDOMLib<El>['props'] = <R extends any[]>(\n propsOrPaths: MaybeArray<string>[],\n options = {}\n ) => {\n const propPaths = propsOrPaths.map((p) => (Array.isArray(p) ? p : [p]));\n const propData = propPaths.map((path) => prop(path, options));\n return propData as MaybePromise<R>;\n };\n\n const href: CheerioDOMLib<El>['href'] = ({ allowEmpty, allowRelative, baseUrl } = {}) => {\n const val = prop('href', { allowEmpty }) as string | null;\n return formatUrl(val, { allowRelative, baseUrl });\n };\n\n const src: CheerioDOMLib<El>['src'] = ({ allowEmpty, allowRelative, baseUrl } = {}) => {\n const val = prop('src', { allowEmpty }) as string | null;\n return formatUrl(val, { allowRelative, baseUrl });\n };\n\n const nodeName: CheerioDOMLib<El>['nodeName'] = () => {\n // On UPPER- vs lower-case https://stackoverflow.com/questions/27223756/\n const val = prop('nodeName') as string | null;\n return typeof val === 'string' ? val.toLocaleUpperCase() : val;\n };\n\n const url: CheerioDOMLib<El>['url'] = () => {\n return srcUrl ?? null;\n };\n\n const map: CheerioDOMLib<El>['map'] = <TVal>(mapFn: (node: El) => TVal) => {\n return mapFn(cheerioNode);\n };\n\n ///////////////////////\n // NODE OPERATIONS\n ///////////////////////\n\n const findOne: CheerioDOMLib<El>['findOne'] = <TNewEl extends Cheerio<AnyNode> = El>(\n selector\n ) => {\n const resultEl = cheerioNode.find(selector).first() as TNewEl;\n if (!resultEl.get(0)) return null;\n return cheerioDOMLib(resultEl, srcUrl);\n };\n\n const findMany: CheerioDOMLib<El>['findMany'] = <TNewEl extends Cheerio<AnyNode> = El>(\n selector\n ) => {\n const resultEls = splitCheerioSelection(cheerioNode.find(selector)) as TNewEl[];\n return resultEls.map((ch) => cheerioDOMLib(ch, srcUrl));\n };\n\n const closest: CheerioDOMLib<El>['closest'] = <TNewEl extends Cheerio<AnyNode> = El>(\n selector\n ) => {\n const resultEl = cheerioNode.closest(selector).first() as TNewEl;\n if (!resultEl.get(0)) return null;\n return cheerioDOMLib(resultEl, srcUrl);\n };\n\n const parent: CheerioDOMLib<El>['parent'] = <TNewEl extends Cheerio<AnyNode> = El>() => {\n const parentEl = cheerioNode.parent().first() as TNewEl;\n if (!parentEl.get(0)) return null;\n return cheerioDOMLib(parentEl, srcUrl);\n };\n\n const children: CheerioDOMLib<El>['children'] = <TNewEl extends Cheerio<AnyNode> = El>() => {\n const childEls = splitCheerioSelection(cheerioNode.children()) as TNewEl[];\n return childEls.map((ch) => cheerioDOMLib(ch, srcUrl));\n };\n\n const root: CheerioDOMLib<El>['root'] = <TNewEl extends Cheerio<AnyNode> = El>() => {\n const rootEl = cheerioNode._root?.first() as TNewEl | null;\n if (!rootEl?.get(0)) return null;\n return cheerioDOMLib(rootEl, srcUrl);\n };\n\n const remove: CheerioDOMLib<El>['remove'] = () => {\n cheerioNode.remove();\n };\n\n /** Function that finds the closest common ancestor for `el1` and `el2`. */\n const _getCommonAncestor = async (el1: El, el2: El) => {\n const ch1Parents = splitCheerioSelection(el1.parents()) as El[];\n const ch2Parents = splitCheerioSelection(el2.parents()) as El[];\n\n let commonAncestor: El | null = null;\n for (const comparerParent of ch1Parents) {\n for (const compareeParent of ch2Parents) {\n if (!comparerParent.is(compareeParent)) continue;\n commonAncestor = comparerParent;\n break;\n }\n if (commonAncestor) break;\n }\n return commonAncestor;\n };\n\n const getCommonAncestor: CheerioDOMLib<El>['getCommonAncestor'] = async <\n TNewEl extends Cheerio<AnyNode> = El\n >(\n otherEl\n ) => {\n const ancestor = (await _getCommonAncestor(cheerioNode, otherEl)) as TNewEl | null;\n if (!ancestor?.get(0)) return null;\n return cheerioDOMLib<TNewEl>(ancestor, srcUrl);\n };\n\n const _getCommonAncestorFromSelector = _createCommonAncestorFromSelectorFn<El>({\n querySelectorAll: (selector) => splitCheerioSelection(cheerioNode.find(selector)) as El[],\n getParent: (el) => el.parent() as El | null,\n isAncestor: (el1, el2) => el1.is(el2.parents()),\n getCommonAncestor: (el1, el2) => _getCommonAncestor(el1, el2),\n });\n\n const getCommonAncestorFromSelector: CheerioDOMLib<El>['getCommonAncestorFromSelector'] = async <\n TNewEl extends Cheerio<AnyNode> = El\n >(\n selector\n ) => {\n const ancestor = (await _getCommonAncestorFromSelector(selector)) as TNewEl | null;\n if (!ancestor?.get(0)) return null;\n return cheerioDOMLib<TNewEl>(ancestor, srcUrl);\n };\n\n return {\n node: cheerioNode,\n\n text,\n textAsLower,\n textAsUpper,\n textAsNumber,\n attr,\n attrs,\n prop,\n props,\n href,\n src,\n nodeName,\n url,\n map,\n\n findOne,\n findMany,\n closest,\n parent,\n children,\n root,\n remove,\n getCommonAncestor,\n getCommonAncestorFromSelector,\n } satisfies CheerioDOMLib<El>;\n};\n\nexport type PlaywrightHandleDOMLib<\n El extends Locator | ElementHandle<Node> = Locator | ElementHandle<Node>\n> = DOMLib<El, Locator | ElementHandle<Node>>;\n\nconst verifyHandleEl = async (el: Locator | ElementHandle<Node> | JSHandle | null) => {\n if (!el) return null;\n const exists = await (el as ElementHandle).evaluate((el) => !!el).catch(logAndRethrow);\n return exists ? el : null;\n};\n\n/** Implementation of DOMLib in Playwright using Handles */\nexport const playwrightHandleDOMLib = <El extends Locator | ElementHandle<Node>>(\n node: El,\n page: Page\n): PlaywrightHandleDOMLib<El> => {\n ///////////////////////\n // SCALAR OPERATIONS\n ///////////////////////\n\n const text: PlaywrightHandleDOMLib<El>['text'] = async ({ allowEmpty } = {}) => {\n const txt = (await node.textContent())?.trim() ?? null;\n return strOrNull(txt, allowEmpty);\n };\n\n const textAsUpper: PlaywrightHandleDOMLib<El>['textAsUpper'] = async (options) => {\n const txt = await text(options);\n return txt ? txt.toLocaleUpperCase() : txt;\n };\n\n const textAsLower: PlaywrightHandleDOMLib<El>['textAsLower'] = async (options) => {\n const txt = await text(options);\n return txt ? txt.toLocaleLowerCase() : txt;\n };\n\n const textAsNumber: PlaywrightHandleDOMLib<El>['textAsNumber'] = async (options) => {\n const txt = await text(options);\n return strAsNumber(txt, options);\n };\n\n const prop: PlaywrightHandleDOMLib<El>['prop'] = async <R = unknown>(\n propOrPath: MaybeArray<string>,\n options = {}\n ) => {\n const [resProp] = await props([propOrPath], options);\n return resProp as R;\n };\n\n const props: PlaywrightHandleDOMLib<El>['props'] = async <R extends any[]>(\n propsOrPaths: MaybeArray<string>[],\n { allowEmpty = false } = {}\n ) => {\n const propPaths = propsOrPaths.map((p) => (Array.isArray(p) ? p : [p]));\n const data = await (node as Locator)\n .evaluate(\n (el, { propPaths, allowEmpty }) => {\n return propPaths.map((propPath) => {\n let val: any = el;\n for (const prop of propPath) {\n if (el == null) break;\n val = val[prop];\n }\n val = typeof val === 'string' ? val.trim() : val;\n return strOrNull(val, allowEmpty) as any;\n });\n },\n { propPaths, allowEmpty }\n )\n .catch(logAndRethrow);\n return data as R;\n };\n\n const attr: PlaywrightHandleDOMLib<El>['attr'] = async (attrName, options) => {\n const data = await attrs([attrName], options);\n return data[attrName] ?? null;\n };\n\n const attrs: PlaywrightHandleDOMLib<El>['attrs'] = <El extends string>(\n attrNames: El[],\n { allowEmpty = false } = {}\n ) => {\n const data = (node as Locator)\n .evaluate(\n (el, { attrNames, allowEmpty }) => {\n const attrData = (attrNames as El[]).reduce<Record<El, string | null>>((agg, name) => {\n let attrVal = el.getAttribute(name) ?? null;\n attrVal = typeof attrVal === 'string' ? attrVal.trim() : attrVal;\n agg[name] = strOrNull(attrVal, allowEmpty);\n return agg;\n }, {} as any);\n return attrData;\n },\n { attrNames, allowEmpty }\n )\n .catch(logAndRethrow);\n return data;\n };\n\n const href: PlaywrightHandleDOMLib<El>['href'] = async ({\n allowEmpty,\n allowRelative,\n baseUrl,\n } = {}) => {\n const val = (await prop('href', { allowEmpty })) as string | null;\n return formatUrl(val, { allowRelative, baseUrl });\n };\n\n const src: PlaywrightHandleDOMLib<El>['src'] = async ({\n allowEmpty,\n allowRelative,\n baseUrl,\n } = {}) => {\n const val = (await prop('src', { allowEmpty })) as string | null;\n return formatUrl(val, { allowRelative, baseUrl });\n };\n\n const nodeName: PlaywrightHandleDOMLib<El>['nodeName'] = async () => {\n // On UPPER- vs lower-case https://stackoverflow.com/questions/27223756/\n const val = (await prop('nodeName')) as string | null;\n return typeof val === 'string' ? val.toLocaleUpperCase() : val;\n };\n\n const url: PlaywrightHandleDOMLib<El>['url'] = async () => {\n return page.url() || null;\n };\n\n const map: PlaywrightHandleDOMLib<El>['map'] = <TVal>(mapFn: (node: El) => TVal) => {\n return mapFn(node);\n };\n\n ///////////////////////\n // NODE OPERATIONS\n ///////////////////////\n\n const findOne: PlaywrightHandleDOMLib<El>['findOne'] = async <\n TNewEl extends Locator | ElementHandle<Node> = El\n >(\n selector\n ) => {\n const resultEl = await node\n .evaluateHandle((el, s) => {\n if (![Node.ELEMENT_NODE, Node.DOCUMENT_NODE].includes(el.nodeType as any)) return null;\n return (el as Element).querySelector<Element>(s) || null;\n }, selector)\n .catch(logAndRethrow);\n const hasResult = await verifyHandleEl(resultEl);\n return hasResult ? playwrightHandleDOMLib(resultEl as TNewEl, page) : null;\n };\n\n const findMany: PlaywrightHandleDOMLib<El>['findMany'] = async <\n TNewEl extends Locator | ElementHandle<Node> = El\n >(\n selector\n ) => {\n const elsHandle = await node\n .evaluateHandle((el, s) => {\n if (![Node.ELEMENT_NODE, Node.DOCUMENT_NODE].includes(el.nodeType as any)) return [];\n return [...(el as Element).querySelectorAll<Element>(s)];\n }, selector)\n .catch(logAndRethrow);\n const resultEls = await splitPlaywrightSelection<any>(elsHandle);\n return resultEls.map((el) => playwrightHandleDOMLib(el as TNewEl, page));\n };\n\n const closest: PlaywrightHandleDOMLib<El>['closest'] = async <\n TNewEl extends Locator | ElementHandle<Node> = El\n >(\n selector\n ) => {\n const resultEl = await node\n .evaluateHandle((el, s) => {\n if (![Node.ELEMENT_NODE, Node.DOCUMENT_NODE].includes(el.nodeType as any)) return null;\n return (el as Element).closest(s) || null;\n }, selector)\n .catch(logAndRethrow);\n const hasResult = await verifyHandleEl(resultEl);\n return hasResult ? playwrightHandleDOMLib(resultEl as TNewEl, page) : null;\n };\n\n const parent: PlaywrightHandleDOMLib<El>['parent'] = async <\n TNewEl extends Locator | ElementHandle<Node> = El\n >() => {\n const resultEl = await node\n .evaluateHandle((el) => el.parentElement || null)\n .catch(logAndRethrow);\n const hasResult = await verifyHandleEl(resultEl);\n return hasResult ? playwrightHandleDOMLib(resultEl as TNewEl, page) : null;\n };\n\n const children: PlaywrightHandleDOMLib<El>['children'] = async <\n TNewEl extends Locator | ElementHandle<Node> = El\n >() => {\n const elsHandle = await node\n .evaluateHandle((el) => [...(el as Element).children])\n .catch(logAndRethrow);\n const resultEls = await splitPlaywrightSelection<any>(elsHandle);\n return resultEls.map((el) => playwrightHandleDOMLib(el as TNewEl, page));\n };\n\n const root: PlaywrightHandleDOMLib<El>['root'] = async <\n TNewEl extends Locator | ElementHandle<Node> = El\n >() => {\n const resultEl = await node\n .evaluateHandle((el) => el.ownerDocument?.documentElement || null)\n .catch(logAndRethrow);\n const hasResult = await verifyHandleEl(resultEl);\n return hasResult ? playwrightHandleDOMLib(resultEl as TNewEl, page) : null;\n };\n\n const remove: PlaywrightHandleDOMLib<El>['remove'] = async () => {\n await (node as Locator).evaluate((el) => el.remove()).catch(logAndRethrow);\n };\n\n const _getCommonAncestor = async (loc1: El, loc2: El) => {\n const isEl1BeforeEl2 = await (\n await mergeHandles([loc1, loc2])\n )\n .evaluate(([el1, el2]) => {\n if (!el1 || !el2) return false;\n // https://developer.mozilla.org/en-US/docs/Web/API/Node/compareDocumentPosition\n const result = !!(el1.compareDocumentPosition(el2) & Node.DOCUMENT_POSITION_FOLLOWING);\n return result;\n })\n .catch(logAndRethrow);\n\n const { firstEl, lastEl } = isEl1BeforeEl2\n ? { firstEl: loc1, lastEl: loc2 }\n : { firstEl: loc2, lastEl: loc1 };\n\n const ancestor = await (\n await mergeHandles([firstEl, lastEl])\n )\n .evaluateHandle(([el1, el2]) => {\n if (!el1 || !el2) return null;\n // https://stackoverflow.com/a/25154092\n // https://developer.mozilla.org/en-US/docs/Web/API/Range/commonAncestorContainer\n const range = new Range();\n range.setStartBefore(el1);\n range.setEndAfter(el2);\n const containerEl = range.commonAncestorContainer;\n return containerEl;\n })\n .catch(logAndRethrow);\n\n const hasResult = await (ancestor as JSHandle).evaluate((el) => !!el).catch(logAndRethrow);\n return hasResult ? (ancestor as El) : null;\n };\n\n const getCommonAncestor: PlaywrightHandleDOMLib<El>['getCommonAncestor'] = async <\n TNewEl extends Locator | ElementHandle<Node> = El\n >(\n otherEl\n ) => {\n const resultEl = (await _getCommonAncestor(node, otherEl)) as TNewEl | null;\n const hasResult = await verifyHandleEl(resultEl);\n return resultEl && hasResult ? playwrightHandleDOMLib(resultEl, page) : null;\n };\n\n const _getCommonAncestorFromSelector = _createCommonAncestorFromSelectorFn<El>({\n querySelectorAll: async (selector) => {\n const resultEls = (await findMany(selector)).map((d) => d.node).filter(Boolean);\n return resultEls as NonNullable<(typeof resultEls)[0]>[];\n },\n getParent: async (el) => {\n return (await playwrightHandleDOMLib(el, page).parent())?.node ?? null;\n },\n isAncestor: async (el1, el2) => {\n return (await mergeHandles([el1, el2]))\n .evaluate(([el1, el2]) => {\n if (!el1 || !el2) return false;\n // https://developer.mozilla.org/en-US/docs/Web/API/Node/compareDocumentPosition\n const result = !!(el1.compareDocumentPosition(el2) & Node.DOCUMENT_POSITION_CONTAINED_BY);\n return result;\n })\n .catch(logAndRethrow);\n },\n getCommonAncestor: _getCommonAncestor,\n });\n\n const getCommonAncestorFromSelector: PlaywrightHandleDOMLib<El>['getCommonAncestorFromSelector'] =\n async <TNewEl extends Locator | ElementHandle<Node> = El>(selector) => {\n const resultEl = (await _getCommonAncestorFromSelector(selector)) as TNewEl | null;\n const hasResult = await verifyHandleEl(resultEl);\n return resultEl && hasResult ? playwrightHandleDOMLib(resultEl, page) : null;\n };\n\n return {\n node,\n\n text,\n textAsLower,\n textAsUpper,\n textAsNumber,\n attr,\n attrs,\n prop,\n props,\n href,\n src,\n nodeName,\n url,\n map,\n\n findOne,\n findMany,\n closest,\n parent,\n children,\n root,\n remove,\n getCommonAncestor,\n getCommonAncestorFromSelector,\n } satisfies PlaywrightHandleDOMLib<El>;\n};\n\nexport type PlaywrightLocatorDOMLib<El extends Locator = Locator> = DOMLib<El, Locator>;\n\n/** Implementation of DOMLib in Playwright using Locators */\nexport const playwrightLocatorDOMLib = <El extends Locator>(\n node: El,\n page: Page\n): PlaywrightLocatorDOMLib<El> => {\n // NOTE: Where possible, make use of the already-existing logic for Handles\n const handleDom = playwrightHandleDOMLib(node, page);\n\n ///////////////////////\n // SCALAR OPERATIONS\n ///////////////////////\n\n /** Empty */\n\n ///////////////////////\n // NODE OPERATIONS\n ///////////////////////\n\n const findOne: PlaywrightLocatorDOMLib<El>['findOne'] = async <TNewEl extends Locator = El>(\n selector\n ) => {\n const resultEl = node.locator(selector);\n const hasResult = await verifyHandleEl(resultEl);\n return hasResult ? playwrightLocatorDOMLib(resultEl as TNewEl, page) : null;\n };\n\n const findMany: PlaywrightLocatorDOMLib<El>['findMany'] = async <TNewEl extends Locator = El>(\n selector\n ) => {\n const resultEls = await node.locator(selector).all();\n return resultEls.map((el) => playwrightLocatorDOMLib(el as TNewEl, page));\n };\n\n const closest: PlaywrightLocatorDOMLib<El>['closest'] = async <TNewEl extends Locator = El>(\n selector\n ) => {\n // Find closest ancestor matching the given selector.\n // See https://stackoverflow.com/a/40333166/9788634\n const resultEl = node.locator(`xpath=ancestor::${selector.trim()}[position() = 1]`);\n const hasResult = await verifyHandleEl(resultEl);\n return hasResult ? playwrightLocatorDOMLib(resultEl as TNewEl, page) : null;\n };\n\n const parent: PlaywrightLocatorDOMLib<El>['parent'] = async <TNewEl extends Locator = El>() => {\n return closest<TNewEl>('*');\n };\n\n const children: PlaywrightLocatorDOMLib<El>['children'] = async <\n TNewEl extends Locator = El\n >() => {\n const resultEls = await node.locator('xpath=child::*').all();\n return resultEls.map((el) => playwrightLocatorDOMLib(el as TNewEl, page));\n };\n\n const root: PlaywrightLocatorDOMLib<El>['root'] = async <TNewEl extends Locator = El>() => {\n // Find closest ancestor matching the given selector.\n // See https://stackoverflow.com/a/40333166/9788634 and https://stackoverflow.com/q/31562639/9788634\n const resultEl = node.locator(`xpath=ancestor::*[position() = last()]`);\n const hasResult = await verifyHandleEl(resultEl);\n return hasResult ? playwrightLocatorDOMLib(resultEl as TNewEl, page) : null;\n };\n\n const remove: PlaywrightLocatorDOMLib<El>['remove'] = async () => {\n await node.evaluate((el) => el.remove()).catch(logAndRethrow);\n };\n\n /** Function that finds the closest common ancestor for `el1` and `el2`. */\n const _getCommonAncestor = async (el1: El, el2: El) => {\n const ch1Parents = await el1.locator(`xpath=ancestor::*`).all();\n const ch2Parents = await el2.locator(`xpath=ancestor::*`).all();\n\n let commonAncestor: El | null = null;\n for (const comparerParent of ch1Parents) {\n for (const compareeParent of ch2Parents) {\n const handle = await mergeHandles([comparerParent, compareeParent]);\n const isSame = await handle.evaluate(([el1, el2]: Element[]) => {\n return el1 === el2;\n });\n if (isSame) {\n commonAncestor = comparerParent as El;\n break;\n }\n }\n if (commonAncestor) break;\n }\n return commonAncestor;\n };\n\n const getCommonAncestor: PlaywrightLocatorDOMLib<El>['getCommonAncestor'] = async <\n TNewEl extends Locator = El\n >(\n otherEl\n ) => {\n const resultEl = (await _getCommonAncestor(node, otherEl)) as TNewEl | null;\n const hasResult = await verifyHandleEl(resultEl);\n return resultEl && hasResult ? playwrightLocatorDOMLib(resultEl, page) : null;\n };\n\n const _getCommonAncestorFromSelector = _createCommonAncestorFromSelectorFn<El>({\n querySelectorAll: async (selector) => {\n const resultEls = (await findMany(selector)).map((d) => d.node).filter(Boolean);\n return resultEls as NonNullable<(typeof resultEls)[0]>[];\n },\n getParent: async (el) => {\n return (await playwrightLocatorDOMLib(el, page).parent())?.node ?? null;\n },\n isAncestor: async (el1, el2) => {\n return (await mergeHandles([el1, el2]))\n .evaluate(([el1, el2]) => {\n if (!el1 || !el2) return false;\n // https://developer.mozilla.org/en-US/docs/Web/API/Node/compareDocumentPosition\n const result = !!(el1.compareDocumentPosition(el2) & Node.DOCUMENT_POSITION_CONTAINED_BY);\n return result;\n })\n .catch(logAndRethrow);\n },\n getCommonAncestor: _getCommonAncestor,\n });\n\n const getCommonAncestorFromSelector: PlaywrightLocatorDOMLib<El>['getCommonAncestorFromSelector'] =\n async <TNewEl extends Locator | ElementHandle<Node> = El>(selector) => {\n const ancestor = (await _getCommonAncestorFromSelector(selector)) as TNewEl | null;\n const hasResult = await (ancestor as Locator)?.evaluate((el) => !!el).catch(logAndRethrow);\n return ancestor && hasResult ? playwrightHandleDOMLib(ancestor, page) : null;\n };\n\n return {\n node,\n\n text: handleDom.text,\n textAsLower: handleDom.textAsLower,\n textAsUpper: handleDom.textAsUpper,\n textAsNumber: handleDom.textAsNumber,\n attr: handleDom.attr,\n attrs: handleDom.attrs,\n prop: handleDom.prop,\n props: handleDom.props,\n href: handleDom.href,\n src: handleDom.src,\n nodeName: handleDom.nodeName,\n url: handleDom.url,\n map: handleDom.map,\n\n findOne,\n findMany,\n closest,\n parent,\n children,\n root,\n remove,\n getCommonAncestor,\n getCommonAncestorFromSelector,\n } satisfies PlaywrightLocatorDOMLib<El>;\n};\n\nconst _createCommonAncestorFromSelectorFn = <El>(input: {\n querySelectorAll: (selector: string) => MaybePromise<Iterable<El> | El[]>;\n getParent: (el: El) => MaybePromise<El | null>;\n /** Function that returns `true` if `el1` is ancestor of `el2`. */\n isAncestor: (el1: El, el2: El) => MaybePromise<boolean>;\n /** Function that finds the closest common ancestor for `el1` and `el2`. */\n getCommonAncestor: (el1: El, el2: El) => MaybePromise<El | null>;\n}) => {\n const getCommonAncestorFromSelector = async (selector: string): Promise<El | null> => {\n const els = [...(await input.querySelectorAll(selector))];\n if (!els.length) return null;\n if (els.length === 1) return input.getParent(els[0]);\n\n const comparerEl = els.shift();\n let ancestorEl: El | null = null;\n for (const el of els) {\n const currAncestorEl = comparerEl ? await input.getCommonAncestor(comparerEl, el) : null;\n const newAncestorEl = !ancestorEl\n ? currAncestorEl\n : currAncestorEl && (await input.isAncestor(currAncestorEl, ancestorEl))\n ? currAncestorEl\n : ancestorEl;\n ancestorEl = newAncestorEl;\n }\n\n return ancestorEl as El;\n };\n\n return getCommonAncestorFromSelector;\n};\n"]}
@@ -0,0 +1,42 @@
1
+ import type { AnyNode, Cheerio } from 'cheerio';
2
+ import type { ElementHandle, JSHandle, Locator } from 'playwright';
3
+ import type { MaybeArray, MaybePromise } from '../../utils/types';
4
+ /**
5
+ * Given a Cheerio selection, split it into an array of Cheerio selections,
6
+ * where each has only one element.
7
+ *
8
+ * From `Cheerio[el, el, el, el]`
9
+ *
10
+ * To `[Cheerio[el], Cheerio[el], Cheerio[el], Cheerio[el]]`
11
+ */
12
+ export declare const splitCheerioSelection: (cheerioSel: Cheerio<AnyNode>) => Cheerio<AnyNode>[];
13
+ /**
14
+ * Given a Playwright JSHandle that points to an array of Elements, split it into an array of
15
+ * ElementHandles, where each has only one element.
16
+ *
17
+ * From `JSHandle([el, el, el)]`
18
+ *
19
+ * To `ElHandle(el), ElHandle(el), ElHandle(el)`
20
+ */
21
+ export declare const splitPlaywrightSelection: <T>(handle: JSHandle<T[]>) => Promise<import("playwright-core/types/structs").SmartHandle<T>[]>;
22
+ /** Any instance that is a Playwright Handle. */
23
+ export type AnyHandle<T = any> = JSHandle<T> | ElementHandle<T>;
24
+ /** Any instance that is a Playwright Handle, or can be converted to one. */
25
+ export type HandleLike<T = any> = Locator | JSHandle<T> | ElementHandle<T>;
26
+ export declare const handleIsLocator: <T>(h: HandleLike<T>) => h is Locator;
27
+ /**
28
+ * Join several Locators and Handles in a single JSHandle.
29
+ *
30
+ * Locators are evaluated to their matching elements.
31
+ *
32
+ * To override how Locators are resolved, supply own `locatorResolver` function.
33
+ */
34
+ export declare const mergeHandles: <T = any>(handles: HandleLike<T>[], options?: {
35
+ /**
36
+ * Configure how to process {@link Locator}s into {@link JSHandle}s.
37
+ *
38
+ * By default, Locator resolves to the first DOM Element it matches,
39
+ * using {@link Locator.elementHandle}.
40
+ */
41
+ locatorResolver?: ((loc: Locator) => MaybePromise<MaybeArray<AnyHandle<T>>>) | undefined;
42
+ } | undefined) => Promise<JSHandle<T[]>>;
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.mergeHandles = exports.handleIsLocator = exports.splitPlaywrightSelection = exports.splitCheerioSelection = void 0;
13
+ const async_1 = require("../../utils/async");
14
+ const error_1 = require("../../utils/error");
15
+ /**
16
+ * Given a Cheerio selection, split it into an array of Cheerio selections,
17
+ * where each has only one element.
18
+ *
19
+ * From `Cheerio[el, el, el, el]`
20
+ *
21
+ * To `[Cheerio[el], Cheerio[el], Cheerio[el], Cheerio[el]]`
22
+ */
23
+ const splitCheerioSelection = (cheerioSel) => {
24
+ const arrSize = cheerioSel.length;
25
+ return Array(arrSize)
26
+ .fill(null)
27
+ .map((_, index) => cheerioSel.slice(index, index + 1));
28
+ };
29
+ exports.splitCheerioSelection = splitCheerioSelection;
30
+ /**
31
+ * Given a Playwright JSHandle that points to an array of Elements, split it into an array of
32
+ * ElementHandles, where each has only one element.
33
+ *
34
+ * From `JSHandle([el, el, el)]`
35
+ *
36
+ * To `ElHandle(el), ElHandle(el), ElHandle(el)`
37
+ */
38
+ const splitPlaywrightSelection = (handle) => __awaiter(void 0, void 0, void 0, function* () {
39
+ const arrSize = yield handle.evaluate((arr) => arr.length).catch(error_1.logAndRethrow);
40
+ return (0, async_1.serialAsyncMap)(Array(arrSize).fill(null), (_, index) => {
41
+ return handle.evaluateHandle((arr, i) => arr[i], index).catch(error_1.logAndRethrow);
42
+ });
43
+ });
44
+ exports.splitPlaywrightSelection = splitPlaywrightSelection;
45
+ const handleIsLocator = (h) => {
46
+ return typeof (h === null || h === void 0 ? void 0 : h.page) === 'function' && (h === null || h === void 0 ? void 0 : h.toString().startsWith('Locator@'));
47
+ };
48
+ exports.handleIsLocator = handleIsLocator;
49
+ /**
50
+ * Join several Locators and Handles in a single JSHandle.
51
+ *
52
+ * Locators are evaluated to their matching elements.
53
+ *
54
+ * To override how Locators are resolved, supply own `locatorResolver` function.
55
+ */
56
+ const mergeHandles = (handles, options) => __awaiter(void 0, void 0, void 0, function* () {
57
+ var _a;
58
+ const locatorResolver = (_a = options === null || options === void 0 ? void 0 : options.locatorResolver) !== null && _a !== void 0 ? _a : ((loc) => loc.elementHandle());
59
+ if (!handles.length) {
60
+ throw Error('Nothing to merge, `handles` array is empty.');
61
+ }
62
+ const seenPages = new Map();
63
+ // Resolve Locators into Handlers
64
+ const resolvedHandles = yield handles.reduce((aggPromise, handle, index) => __awaiter(void 0, void 0, void 0, function* () {
65
+ const agg = yield aggPromise;
66
+ if ((0, exports.handleIsLocator)(handle)) {
67
+ // Validate that all locators belong to the same Page instance
68
+ const locPage = handle.page();
69
+ if (!locPage)
70
+ throw Error(`Locator at index ${index} is missing Page instance.`);
71
+ if (seenPages.size > 0 && !seenPages.has(locPage)) {
72
+ const prevSeenIndex = [...seenPages.values()][0];
73
+ throw Error(`Received locators belonging to different Page instances (index ${prevSeenIndex} and ${index}).`);
74
+ }
75
+ seenPages.set(locPage, index);
76
+ const resolved = yield locatorResolver(handle);
77
+ const resolvedArr = resolved ? (Array.isArray(resolved) ? resolved : [resolved]) : [];
78
+ agg.push(...resolvedArr);
79
+ }
80
+ else {
81
+ agg.push(handle);
82
+ }
83
+ return agg;
84
+ }), Promise.resolve([]));
85
+ if (!resolvedHandles.length) {
86
+ throw Error('Nothing to merge, no Handles found after resolving Locators.');
87
+ }
88
+ // There may be multiple instances of this function running on the Page, so we avoid collision
89
+ // them operationId.
90
+ const operationId = Math.floor(Math.random() * Math.pow(10, 9)).toString().padStart(9, '0'); // prettier-ignore
91
+ // Ensure that all handlers belong to the same context by checking that they
92
+ // all see the same value set in context of the first handle.
93
+ const prefix = '__domUtils_mergeHandles_prompt__';
94
+ const prompt = { key: `${prefix}${operationId}`, value: 'hello:)' };
95
+ // Use first handle as reference
96
+ const baseHandle = resolvedHandles[0];
97
+ // 1. Plant the prompt
98
+ yield baseHandle
99
+ .evaluate((_, prompt) => {
100
+ globalThis[prompt.key] = prompt.value;
101
+ }, prompt)
102
+ .catch(error_1.logAndRethrow);
103
+ // 2. Check that all handles see the prompt
104
+ yield (0, async_1.serialAsyncMap)(resolvedHandles, (handle, index) => __awaiter(void 0, void 0, void 0, function* () {
105
+ const response = yield handle
106
+ .evaluate((_, prompt) => globalThis[prompt.key], prompt)
107
+ .catch(error_1.logAndRethrow);
108
+ if (response !== prompt.value) {
109
+ throw Error(`Handle context mismatch! Either Page context changed or JSHandle at index ${index} ` +
110
+ `is in different Page than previous handles.`);
111
+ }
112
+ }));
113
+ // 3. Clean up
114
+ yield baseHandle
115
+ .evaluate((_, prompt) => {
116
+ delete globalThis[prompt.key];
117
+ }, prompt)
118
+ .catch(error_1.logAndRethrow);
119
+ // Now that all handles are sound, pass them to the given function
120
+ const mergedHandle = yield baseHandle
121
+ .evaluateHandle((_, handles) => handles, resolvedHandles)
122
+ .catch(error_1.logAndRethrow);
123
+ return mergedHandle;
124
+ });
125
+ exports.mergeHandles = mergeHandles;
126
+ //# sourceMappingURL=domUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domUtils.js","sourceRoot":"","sources":["../../../../src/lib/actions/domUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AnyNode, Cheerio } from 'cheerio';\nimport type { ElementHandle, JSHandle, Locator, Page } from 'playwright';\n\nimport { serialAsyncMap } from '../../utils/async';\nimport type { MaybeArray, MaybePromise } from '../../utils/types';\nimport { logAndRethrow } from '../../utils/error';\n\n/**\n * Given a Cheerio selection, split it into an array of Cheerio selections,\n * where each has only one element.\n *\n * From `Cheerio[el, el, el, el]`\n *\n * To `[Cheerio[el], Cheerio[el], Cheerio[el], Cheerio[el]]`\n */\nexport const splitCheerioSelection = (cheerioSel: Cheerio<AnyNode>) => {\n const arrSize = cheerioSel.length;\n return Array(arrSize)\n .fill(null)\n .map((_, index) => cheerioSel.slice(index, index + 1));\n};\n\n/**\n * Given a Playwright JSHandle that points to an array of Elements, split it into an array of\n * ElementHandles, where each has only one element.\n *\n * From `JSHandle([el, el, el)]`\n *\n * To `ElHandle(el), ElHandle(el), ElHandle(el)`\n */\nexport const splitPlaywrightSelection = async <T>(handle: JSHandle<T[]>) => {\n const arrSize = await handle.evaluate((arr) => arr.length).catch(logAndRethrow);\n return serialAsyncMap(Array(arrSize).fill(null), (_, index) => {\n return handle.evaluateHandle((arr, i) => arr[i], index).catch(logAndRethrow);\n });\n};\n\n/** Any instance that is a Playwright Handle. */\nexport type AnyHandle<T = any> = JSHandle<T> | ElementHandle<T>;\n/** Any instance that is a Playwright Handle, or can be converted to one. */\nexport type HandleLike<T = any> = Locator | JSHandle<T> | ElementHandle<T>;\n\nexport const handleIsLocator = <T>(h: HandleLike<T>): h is Locator => {\n return typeof (h as Locator)?.page === 'function' && h?.toString().startsWith('Locator@');\n};\n\n/**\n * Join several Locators and Handles in a single JSHandle.\n *\n * Locators are evaluated to their matching elements.\n *\n * To override how Locators are resolved, supply own `locatorResolver` function.\n */\nexport const mergeHandles = async <T = any>(\n handles: HandleLike<T>[],\n options?: {\n /**\n * Configure how to process {@link Locator}s into {@link JSHandle}s.\n *\n * By default, Locator resolves to the first DOM Element it matches,\n * using {@link Locator.elementHandle}.\n */\n locatorResolver?: (loc: Locator) => MaybePromise<MaybeArray<AnyHandle<T>>>;\n }\n) => {\n const locatorResolver = options?.locatorResolver ?? ((loc) => loc.elementHandle());\n\n if (!handles.length) {\n throw Error('Nothing to merge, `handles` array is empty.');\n }\n\n const seenPages = new Map<Page, number>();\n\n // Resolve Locators into Handlers\n const resolvedHandles = await handles.reduce<Promise<AnyHandle[]>>(\n async (aggPromise, handle, index) => {\n const agg = await aggPromise;\n\n if (handleIsLocator(handle)) {\n // Validate that all locators belong to the same Page instance\n const locPage = handle.page();\n if (!locPage) throw Error(`Locator at index ${index} is missing Page instance.`);\n if (seenPages.size > 0 && !seenPages.has(locPage)) {\n const prevSeenIndex = [...seenPages.values()][0];\n throw Error(\n `Received locators belonging to different Page instances (index ${prevSeenIndex} and ${index}).`\n );\n }\n seenPages.set(locPage, index);\n\n const resolved = await locatorResolver(handle);\n const resolvedArr = resolved ? (Array.isArray(resolved) ? resolved : [resolved]) : [];\n agg.push(...resolvedArr);\n } else {\n agg.push(handle);\n }\n return agg;\n },\n Promise.resolve([])\n );\n\n if (!resolvedHandles.length) {\n throw Error('Nothing to merge, no Handles found after resolving Locators.');\n }\n\n // There may be multiple instances of this function running on the Page, so we avoid collision\n // them operationId.\n const operationId = Math.floor(Math.random() * 10 ** 9).toString().padStart(9, '0'); // prettier-ignore\n\n // Ensure that all handlers belong to the same context by checking that they\n // all see the same value set in context of the first handle.\n const prefix = '__domUtils_mergeHandles_prompt__';\n const prompt = { key: `${prefix}${operationId}`, value: 'hello:)' };\n\n // Use first handle as reference\n const baseHandle = resolvedHandles[0];\n\n // 1. Plant the prompt\n await baseHandle\n .evaluate((_, prompt) => {\n globalThis[prompt.key] = prompt.value;\n }, prompt)\n .catch(logAndRethrow);\n\n // 2. Check that all handles see the prompt\n await serialAsyncMap(resolvedHandles, async (handle, index) => {\n const response = await handle\n .evaluate((_, prompt) => globalThis[prompt.key], prompt)\n .catch(logAndRethrow);\n if (response !== prompt.value) {\n throw Error(\n `Handle context mismatch! Either Page context changed or JSHandle at index ${index} ` +\n `is in different Page than previous handles.`\n );\n }\n });\n\n // 3. Clean up\n await baseHandle\n .evaluate((_, prompt) => {\n delete globalThis[prompt.key];\n }, prompt)\n .catch(logAndRethrow);\n\n // Now that all handles are sound, pass them to the given function\n const mergedHandle = await baseHandle\n .evaluateHandle((_, handles) => handles, resolvedHandles)\n .catch(logAndRethrow);\n return mergedHandle as JSHandle<T[]>;\n};\n"]}
@@ -0,0 +1,69 @@
1
+ import type { Page, Locator, ElementHandle, JSHandle } from 'playwright';
2
+ import type { MaybePromise } from '../../utils/types';
3
+ type InfiScrollTypes<TContainer, TChild, TChildren, TCB> = {
4
+ container: TContainer;
5
+ child: TChild;
6
+ children: TChildren;
7
+ callbackArg: TCB;
8
+ };
9
+ type AnyInfiScrollTypes = InfiScrollTypes<any, any, any, any>;
10
+ /**
11
+ * Common interface for working with browser page despite different environments
12
+ * (e.g. Browser API, Playwright, Puppeteer, Selenium).
13
+ *
14
+ * This common interfaces makes the scraping code more portable between them.
15
+ */
16
+ export interface PageLib<TPage, TScroll extends AnyInfiScrollTypes, TCtx extends {
17
+ container: TScroll['container'];
18
+ }> {
19
+ page: TPage;
20
+ /** Load entries via infinite scroll and process them as you go. */
21
+ infiniteScroll: (
22
+ /** A container, or selector for it, that includes the dynamically loaded items. */
23
+ container: string | TScroll['container'],
24
+ /**
25
+ * Callback that receives a handle to the new child elements in the DOM
26
+ *
27
+ * Example:
28
+ * ```js
29
+ * // Get text from all new child elements of the infinite-scroller container
30
+ * async (elementsHandle) => {
31
+ * const result = await page.evaluate((els) => els.map((el) => el.textContent), elementsHandle);
32
+ * return result;
33
+ * };
34
+ * ```
35
+ */
36
+ onNewChildren?: (
37
+ /** New elements that were added */
38
+ elsHandle: TScroll['callbackArg'], ctx: {
39
+ page: TPage;
40
+ container: TScroll['container'];
41
+ },
42
+ /** Function that, if called, stops the infinite scrolling */
43
+ stop: () => void) => MaybePromise<void>, options?: InfiniteScrollLoaderOptions<TScroll, TCtx>) => MaybePromise<void>;
44
+ }
45
+ type PlaywrightInfiScrollTypes = InfiScrollTypes<Locator | ElementHandle<Element>, JSHandle<Element | null>, JSHandle<Element[]>, JSHandle<(Element | null)[]>>;
46
+ type PWIST = PlaywrightInfiScrollTypes;
47
+ export interface InfiniteScrollLoaderOptions<T extends AnyInfiScrollTypes, TCtx extends {
48
+ container: T['container'];
49
+ } = {
50
+ container: T['container'];
51
+ }> {
52
+ /** How many times to retry the infinite scroll if new items aren't loading */
53
+ retries?: number;
54
+ /** Override how container children are counted. Default uses `el.childElementCount` */
55
+ childrenCounter?: (containerEl: T['container'], ctx: TCtx) => MaybePromise<number>;
56
+ /** Override how container children are extraced. Default uses `el.children` */
57
+ childrenGetter?: (containerEl: T['container'], ctx: TCtx) => MaybePromise<T['children']>;
58
+ /** Override how container children are scrolled into view. Default uses `el.scrollIntoView` */
59
+ scrollIntoView?: (childEl: T['child'], ctx: TCtx) => MaybePromise<void>;
60
+ /** Override whether and how to wait after scrolling into view */
61
+ waitAfterScroll?: (childEl: T['child'], ctx: TCtx) => MaybePromise<void>;
62
+ }
63
+ export type PlaywrightPageLib<T extends Page = Page> = PageLib<T, PWIST, {
64
+ container: PWIST['container'];
65
+ page: T;
66
+ }>;
67
+ /** Implementation of PageLib in Playwright */
68
+ export declare const playwrightPageLib: <T extends Page>(page: T) => Promise<PlaywrightPageLib<T>>;
69
+ export {};
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.playwrightPageLib = void 0;
13
+ const error_1 = require("../../utils/error");
14
+ const domUtils_1 = require("./domUtils");
15
+ /** Implementation of PageLib in Playwright */
16
+ const playwrightPageLib = (page) => __awaiter(void 0, void 0, void 0, function* () {
17
+ const { serializeEls, resolveId, resolveIds } = yield _createPlaywrightElementSerializer(page);
18
+ const infiniteScroll = (container, onNewChildren, options) => __awaiter(void 0, void 0, void 0, function* () {
19
+ var _a, _b, _c, _d, _e;
20
+ const childrenCounter = (_a = options === null || options === void 0 ? void 0 : options.childrenCounter) !== null && _a !== void 0 ? _a : ((h) => h.evaluate((el) => el ? el.childElementCount : 0).catch(error_1.logAndRethrow)); // prettier-ignore
21
+ const childrenGetter = (_b = options === null || options === void 0 ? void 0 : options.childrenGetter) !== null && _b !== void 0 ? _b : ((h) => h.evaluateHandle((el) => el ? el.children : []).catch(error_1.logAndRethrow)); // prettier-ignore
22
+ const scrollIntoView = (_c = options === null || options === void 0 ? void 0 : options.scrollIntoView) !== null && _c !== void 0 ? _c : ((h) => h.evaluate((el) => { el && el.scrollIntoView(); }).catch(error_1.logAndRethrow)); // prettier-ignore
23
+ const waitAfterScroll = (_d = options === null || options === void 0 ? void 0 : options.waitAfterScroll) !== null && _d !== void 0 ? _d : (() => page.waitForLoadState('networkidle')); // prettier-ignore
24
+ const handleOrLocator = typeof container === 'string' ? page.locator(container) : container;
25
+ if ((0, domUtils_1.handleIsLocator)(handleOrLocator) && handleOrLocator.page() !== page) {
26
+ throw Error('Locator does not belong to given Page.');
27
+ }
28
+ yield _infiniteScrollLoader(handleOrLocator, (childIds, ctx, stopFn) => __awaiter(void 0, void 0, void 0, function* () {
29
+ // Resolve child IDs to handle of child elements on the page
30
+ const elsHandle = yield resolveIds(childIds);
31
+ // Then pass them to user
32
+ yield (onNewChildren === null || onNewChildren === void 0 ? void 0 : onNewChildren(elsHandle, Object.assign(Object.assign({}, ctx), { page }), stopFn));
33
+ }), {
34
+ retries: (_e = options === null || options === void 0 ? void 0 : options.retries) !== null && _e !== void 0 ? _e : 3,
35
+ childrenCounter: (el, ctx) => childrenCounter(el, Object.assign(Object.assign({}, ctx), { page })),
36
+ childrenGetter: (handle, ctx) => __awaiter(void 0, void 0, void 0, function* () {
37
+ // First let user tell us how to collect the child elements
38
+ const childElsHandle = yield childrenGetter(handle, Object.assign(Object.assign({}, ctx), { page }));
39
+ // Then convert them to serializable IDs that we can return to user
40
+ const childIds = yield serializeEls(childElsHandle);
41
+ return childIds;
42
+ }),
43
+ scrollIntoView: (childId, ctx) => __awaiter(void 0, void 0, void 0, function* () {
44
+ // First resolve serializable ID to an element on the page
45
+ const childElHandle = yield resolveId(childId);
46
+ // Then let user tell us how to scroll into view
47
+ yield scrollIntoView(childElHandle, Object.assign(Object.assign({}, ctx), { page }));
48
+ }),
49
+ waitAfterScroll: (childId, ctx) => __awaiter(void 0, void 0, void 0, function* () {
50
+ // First resolve serializable ID to an element on the page
51
+ const childElHandle = yield resolveId(childId);
52
+ // Then let user tell us how to wait after scroll
53
+ yield waitAfterScroll(childElHandle, Object.assign(Object.assign({}, ctx), { page }));
54
+ }),
55
+ });
56
+ });
57
+ return {
58
+ page,
59
+ infiniteScroll,
60
+ };
61
+ });
62
+ exports.playwrightPageLib = playwrightPageLib;
63
+ /** Load entries via infinite scroll and process them as you go. */
64
+ const _infiniteScrollLoader = (container, onNewChildren, options) => __awaiter(void 0, void 0, void 0, function* () {
65
+ const containerElGetter = (typeof container === 'function' ? container : () => container);
66
+ const processedChildren = new Set();
67
+ let userAskedToStop = false;
68
+ const stopFn = () => {
69
+ userAskedToStop = true;
70
+ };
71
+ const processChildren = (childrenEl) => __awaiter(void 0, void 0, void 0, function* () {
72
+ const newChildren = yield childrenEl.filter((el) => !processedChildren.has(el));
73
+ const container = yield containerElGetter();
74
+ yield (onNewChildren === null || onNewChildren === void 0 ? void 0 : onNewChildren(newChildren, { container }, stopFn));
75
+ newChildren.forEach((el) => processedChildren.add(el));
76
+ });
77
+ const initContainer = yield containerElGetter();
78
+ let currChildrenCount = yield options.childrenCounter(initContainer, { container: initContainer }); // prettier-ignore
79
+ let currRetries = 0;
80
+ while (!userAskedToStop) {
81
+ // Process currently-loaded children
82
+ const containerEl = yield containerElGetter();
83
+ const currChildren = [...(yield options.childrenGetter(containerEl, { container: containerEl }))]; // prettier-ignore
84
+ yield processChildren(currChildren);
85
+ if (userAskedToStop)
86
+ break;
87
+ // Load next batch
88
+ const lastChildEl = currChildren.slice(-1)[0];
89
+ yield options.scrollIntoView(lastChildEl, { container: containerEl });
90
+ yield options.waitAfterScroll(lastChildEl, { container: containerEl });
91
+ const newChildrenCount = yield options.childrenCounter(containerEl, { container: containerEl }); // prettier-ignore
92
+ if (newChildrenCount <= currChildrenCount) {
93
+ if (currRetries >= options.retries)
94
+ break;
95
+ else
96
+ currRetries++;
97
+ }
98
+ else {
99
+ currRetries = 0;
100
+ }
101
+ currChildrenCount = newChildrenCount;
102
+ }
103
+ });
104
+ /**
105
+ * Helper methods that allow to represent HTML Elements on the Page as string IDs
106
+ *
107
+ * We use this so we can identify which elements have already been processed, and which have not.
108
+ * Normally, the elements are represented via Playwright JSHandle/ElementHandle. However, if two
109
+ * Handles are pointing to the same Element, we're unable to count them as one, because it's two
110
+ * instances that don't have any IDs of the Elemenets. On the other hand, using the string IDs,
111
+ * two different JSHandles will return the same string if they point to the same Element, so we
112
+ * cache the IDs outside of Playwright in Sets or Maps.
113
+ */
114
+ const _createPlaywrightElementSerializer = (page) => __awaiter(void 0, void 0, void 0, function* () {
115
+ const prefix = '__domLib_infiniteScrollLoader__';
116
+ const helperKey = `${prefix}helpers_elIdMap`;
117
+ // There may be multiple instances of this cache on the Page, so we distinguish
118
+ // them with operationId.
119
+ const operationId = Math.floor(Math.random() * Math.pow(10, 9)).toString().padStart(9, '0'); // prettier-ignore
120
+ const mapKey = `${prefix}${operationId}`;
121
+ // Prepare a function in-page that creates the cache to store and retrieve the elements.
122
+ yield page
123
+ .evaluate(({ mapKey, helperKey }) => {
124
+ // Create mapping between IDs and HTMLElements, so we can pass the IDs as a serializable
125
+ // reference to the in-page DOM elements
126
+ globalThis[helperKey] = () => {
127
+ const elMap = (globalThis[mapKey] = globalThis[mapKey] || new Map());
128
+ const elMapRev = (globalThis[`${mapKey}_rev`] = globalThis[`${mapKey}_rev`] || new Map());
129
+ return { elMap, elMapRev };
130
+ };
131
+ }, { mapKey, helperKey })
132
+ .catch(error_1.logAndRethrow);
133
+ /**
134
+ * Given a Playwright JSHandle holding an array of Elements, cache the Elements
135
+ * in the Page and generate serializable IDs that can be used to refer to these
136
+ * elements outside of Playwright.
137
+ *
138
+ * This is the opposite of `_resolveIds`.
139
+ *
140
+ * We use this so we can identify which elements have already been processed, and which have not.
141
+ * Normally, the elements are represented via Playwright JSHandle/ElementHandle. However, if two
142
+ * Handles are pointing to the same Element, we're unable to count them as one, because it's two
143
+ * instances that don't have any IDs of the Elemenets. On the other hand, using the string IDs,
144
+ * two different JSHandles will return the same string if they point to the same Element, so we
145
+ * cache the IDs outside of Playwright in Sets or Maps.
146
+ */
147
+ const serializeEls = (elsHandle) => __awaiter(void 0, void 0, void 0, function* () {
148
+ const ids = yield page
149
+ .evaluate(({ els, helperKey }) => {
150
+ if (!els)
151
+ return [];
152
+ const { elMap, elMapRev } = globalThis[helperKey](); // prettier-ignore
153
+ const innerIds = [...els].map((el) => {
154
+ if (!elMap.has(el)) {
155
+ const elId = Math.floor(Math.random() * Math.pow(10, 9))
156
+ .toString()
157
+ .padStart(9, '0');
158
+ elMap.set(el, elId);
159
+ elMapRev.set(elId, el);
160
+ return elId;
161
+ }
162
+ return elMap.get(el);
163
+ });
164
+ return innerIds;
165
+ }, { els: elsHandle, helperKey })
166
+ .catch(error_1.logAndRethrow);
167
+ return ids;
168
+ });
169
+ /**
170
+ * Given an array of IDs, resolve them to a Playwright JSHandle holding an array of corresponding
171
+ * Elements cached in Page's global context.
172
+ *
173
+ * This is the opposite of `_serializeEls`.
174
+ *
175
+ * We use this so we can identify which elements have already been processed, and which have not.
176
+ * Normally, the elements are represented via Playwright JSHandle/ElementHandle. However, if two
177
+ * Handles are pointing to the same Element, we're unable to count them as one, because it's two
178
+ * instances that don't have any IDs of the Elemenets. On the other hand, using the string IDs,
179
+ * two different JSHandles will return the same string if they point to the same Element, so we
180
+ * cache the IDs outside of Playwright in Sets or Maps.
181
+ */
182
+ const resolveIds = (ids) => __awaiter(void 0, void 0, void 0, function* () {
183
+ // Resolve serializable IDs to an element on the page
184
+ const elsHandle = yield page
185
+ .evaluateHandle(({ ids, helperKey }) => {
186
+ const { elMapRev } = globalThis[helperKey](); // prettier-ignore
187
+ const els = ids.map((id) => elMapRev.get(id) || null);
188
+ return els;
189
+ }, { ids, helperKey })
190
+ .catch(error_1.logAndRethrow);
191
+ return elsHandle;
192
+ });
193
+ /** See {@link resolveIds}. */
194
+ const resolveId = (id) => __awaiter(void 0, void 0, void 0, function* () {
195
+ const elsHandle = yield resolveIds([id]);
196
+ const handle = yield elsHandle.evaluateHandle((ids) => ids[0]).catch(error_1.logAndRethrow);
197
+ return handle;
198
+ });
199
+ return {
200
+ serializeEls,
201
+ resolveIds,
202
+ resolveId,
203
+ };
204
+ });
205
+ //# sourceMappingURL=page.js.map