@lhremote/core 0.7.0 → 0.9.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.
- package/dist/cdp/app-discovery.d.ts +57 -0
- package/dist/cdp/app-discovery.d.ts.map +1 -1
- package/dist/cdp/app-discovery.js +90 -7
- package/dist/cdp/app-discovery.js.map +1 -1
- package/dist/cdp/app-discovery.test.js +180 -9
- package/dist/cdp/app-discovery.test.js.map +1 -1
- package/dist/cdp/client.d.ts +8 -1
- package/dist/cdp/client.d.ts.map +1 -1
- package/dist/cdp/client.js +8 -1
- package/dist/cdp/client.js.map +1 -1
- package/dist/cdp/discovery.d.ts.map +1 -1
- package/dist/cdp/discovery.js +5 -1
- package/dist/cdp/discovery.js.map +1 -1
- package/dist/cdp/discovery.test.js +7 -0
- package/dist/cdp/discovery.test.js.map +1 -1
- package/dist/cdp/index.d.ts +1 -1
- package/dist/cdp/index.d.ts.map +1 -1
- package/dist/cdp/index.js +1 -1
- package/dist/cdp/index.js.map +1 -1
- package/dist/cdp/instance-discovery.d.ts.map +1 -1
- package/dist/cdp/instance-discovery.js +25 -10
- package/dist/cdp/instance-discovery.js.map +1 -1
- package/dist/cdp/instance-discovery.test.js +17 -0
- package/dist/cdp/instance-discovery.test.js.map +1 -1
- package/dist/cdp/testing/launch-chromium.d.ts +1 -1
- package/dist/cdp/testing/launch-chromium.js +2 -2
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +3 -0
- package/dist/db/client.js.map +1 -1
- package/dist/db/index.d.ts +1 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +1 -1
- package/dist/db/index.js.map +1 -1
- package/dist/db/repositories/action-budget.d.ts +29 -0
- package/dist/db/repositories/action-budget.d.ts.map +1 -0
- package/dist/db/repositories/action-budget.js +100 -0
- package/dist/db/repositories/action-budget.js.map +1 -0
- package/dist/db/repositories/action-budget.test.d.ts +2 -0
- package/dist/db/repositories/action-budget.test.d.ts.map +1 -0
- package/dist/db/repositories/action-budget.test.js +181 -0
- package/dist/db/repositories/action-budget.test.js.map +1 -0
- package/dist/db/repositories/campaign-hard-delete.integration.test.d.ts +2 -0
- package/dist/db/repositories/campaign-hard-delete.integration.test.d.ts.map +1 -0
- package/dist/db/repositories/campaign-hard-delete.integration.test.js +78 -0
- package/dist/db/repositories/campaign-hard-delete.integration.test.js.map +1 -0
- package/dist/db/repositories/campaign.d.ts +14 -0
- package/dist/db/repositories/campaign.d.ts.map +1 -1
- package/dist/db/repositories/campaign.js +125 -0
- package/dist/db/repositories/campaign.js.map +1 -1
- package/dist/db/repositories/collection-list.integration.test.js +6 -4
- package/dist/db/repositories/collection-list.integration.test.js.map +1 -1
- package/dist/db/repositories/index.d.ts +1 -0
- package/dist/db/repositories/index.d.ts.map +1 -1
- package/dist/db/repositories/index.js +1 -0
- package/dist/db/repositories/index.js.map +1 -1
- package/dist/index.d.ts +7 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -7
- package/dist/index.js.map +1 -1
- package/dist/linkedin/__tests__/dom-automation.integration.test.d.ts +2 -0
- package/dist/linkedin/__tests__/dom-automation.integration.test.d.ts.map +1 -0
- package/dist/linkedin/__tests__/dom-automation.integration.test.js +160 -0
- package/dist/linkedin/__tests__/dom-automation.integration.test.js.map +1 -0
- package/dist/linkedin/dom-automation-retry.test.d.ts +2 -0
- package/dist/linkedin/dom-automation-retry.test.d.ts.map +1 -0
- package/dist/linkedin/dom-automation-retry.test.js +51 -0
- package/dist/linkedin/dom-automation-retry.test.js.map +1 -0
- package/dist/linkedin/dom-automation.d.ts +224 -0
- package/dist/linkedin/dom-automation.d.ts.map +1 -0
- package/dist/linkedin/dom-automation.js +614 -0
- package/dist/linkedin/dom-automation.js.map +1 -0
- package/dist/linkedin/humanized-mouse.d.ts +69 -0
- package/dist/linkedin/humanized-mouse.d.ts.map +1 -0
- package/dist/linkedin/humanized-mouse.js +109 -0
- package/dist/linkedin/humanized-mouse.js.map +1 -0
- package/dist/linkedin/index.d.ts +4 -0
- package/dist/linkedin/index.d.ts.map +1 -0
- package/dist/linkedin/index.js +6 -0
- package/dist/linkedin/index.js.map +1 -0
- package/dist/linkedin/selectors.d.ts +67 -0
- package/dist/linkedin/selectors.d.ts.map +1 -0
- package/dist/linkedin/selectors.js +74 -0
- package/dist/linkedin/selectors.js.map +1 -0
- package/dist/operations/add-people-to-collection.d.ts +1 -1
- package/dist/operations/add-people-to-collection.d.ts.map +1 -1
- package/dist/operations/add-people-to-collection.js +3 -6
- package/dist/operations/add-people-to-collection.js.map +1 -1
- package/dist/operations/build-linkedin-url.test.d.ts +2 -0
- package/dist/operations/build-linkedin-url.test.d.ts.map +1 -0
- package/dist/operations/build-linkedin-url.test.js +158 -0
- package/dist/operations/build-linkedin-url.test.js.map +1 -0
- package/dist/operations/campaign-add-action.d.ts +1 -1
- package/dist/operations/campaign-add-action.d.ts.map +1 -1
- package/dist/operations/campaign-add-action.js +3 -6
- package/dist/operations/campaign-add-action.js.map +1 -1
- package/dist/operations/campaign-create.d.ts +1 -1
- package/dist/operations/campaign-create.d.ts.map +1 -1
- package/dist/operations/campaign-create.js +3 -6
- package/dist/operations/campaign-create.js.map +1 -1
- package/dist/operations/campaign-delete.d.ts +7 -3
- package/dist/operations/campaign-delete.d.ts.map +1 -1
- package/dist/operations/campaign-delete.js +12 -8
- package/dist/operations/campaign-delete.js.map +1 -1
- package/dist/operations/campaign-delete.test.js +41 -1
- package/dist/operations/campaign-delete.test.js.map +1 -1
- package/dist/operations/campaign-erase.d.ts +19 -0
- package/dist/operations/campaign-erase.d.ts.map +1 -0
- package/dist/operations/campaign-erase.js +19 -0
- package/dist/operations/campaign-erase.js.map +1 -0
- package/dist/operations/campaign-erase.test.d.ts +2 -0
- package/dist/operations/campaign-erase.test.d.ts.map +1 -0
- package/dist/operations/campaign-erase.test.js +101 -0
- package/dist/operations/campaign-erase.test.js.map +1 -0
- package/dist/operations/campaign-exclude-add.d.ts +1 -1
- package/dist/operations/campaign-exclude-add.d.ts.map +1 -1
- package/dist/operations/campaign-exclude-add.js +3 -6
- package/dist/operations/campaign-exclude-add.js.map +1 -1
- package/dist/operations/campaign-exclude-list.d.ts +1 -1
- package/dist/operations/campaign-exclude-list.d.ts.map +1 -1
- package/dist/operations/campaign-exclude-list.js +3 -6
- package/dist/operations/campaign-exclude-list.js.map +1 -1
- package/dist/operations/campaign-exclude-remove.d.ts +1 -1
- package/dist/operations/campaign-exclude-remove.d.ts.map +1 -1
- package/dist/operations/campaign-exclude-remove.js +3 -6
- package/dist/operations/campaign-exclude-remove.js.map +1 -1
- package/dist/operations/campaign-export.d.ts +1 -1
- package/dist/operations/campaign-export.d.ts.map +1 -1
- package/dist/operations/campaign-export.js +3 -6
- package/dist/operations/campaign-export.js.map +1 -1
- package/dist/operations/campaign-get.d.ts +1 -1
- package/dist/operations/campaign-get.d.ts.map +1 -1
- package/dist/operations/campaign-get.js +3 -6
- package/dist/operations/campaign-get.js.map +1 -1
- package/dist/operations/campaign-list-people.d.ts +1 -1
- package/dist/operations/campaign-list-people.d.ts.map +1 -1
- package/dist/operations/campaign-list-people.js +3 -6
- package/dist/operations/campaign-list-people.js.map +1 -1
- package/dist/operations/campaign-list.d.ts +1 -1
- package/dist/operations/campaign-list.d.ts.map +1 -1
- package/dist/operations/campaign-list.js +3 -6
- package/dist/operations/campaign-list.js.map +1 -1
- package/dist/operations/campaign-move-next.d.ts +1 -1
- package/dist/operations/campaign-move-next.d.ts.map +1 -1
- package/dist/operations/campaign-move-next.js +3 -6
- package/dist/operations/campaign-move-next.js.map +1 -1
- package/dist/operations/campaign-remove-action.d.ts +1 -1
- package/dist/operations/campaign-remove-action.d.ts.map +1 -1
- package/dist/operations/campaign-remove-action.js +3 -6
- package/dist/operations/campaign-remove-action.js.map +1 -1
- package/dist/operations/campaign-remove-people.d.ts +1 -1
- package/dist/operations/campaign-remove-people.d.ts.map +1 -1
- package/dist/operations/campaign-remove-people.js +3 -6
- package/dist/operations/campaign-remove-people.js.map +1 -1
- package/dist/operations/campaign-reorder-actions.d.ts +1 -1
- package/dist/operations/campaign-reorder-actions.d.ts.map +1 -1
- package/dist/operations/campaign-reorder-actions.js +3 -6
- package/dist/operations/campaign-reorder-actions.js.map +1 -1
- package/dist/operations/campaign-retry.d.ts +1 -1
- package/dist/operations/campaign-retry.d.ts.map +1 -1
- package/dist/operations/campaign-retry.js +3 -6
- package/dist/operations/campaign-retry.js.map +1 -1
- package/dist/operations/campaign-start.d.ts +1 -1
- package/dist/operations/campaign-start.d.ts.map +1 -1
- package/dist/operations/campaign-start.js +3 -6
- package/dist/operations/campaign-start.js.map +1 -1
- package/dist/operations/campaign-statistics.d.ts +1 -1
- package/dist/operations/campaign-statistics.d.ts.map +1 -1
- package/dist/operations/campaign-statistics.js +3 -6
- package/dist/operations/campaign-statistics.js.map +1 -1
- package/dist/operations/campaign-status.d.ts +1 -1
- package/dist/operations/campaign-status.d.ts.map +1 -1
- package/dist/operations/campaign-status.js +3 -6
- package/dist/operations/campaign-status.js.map +1 -1
- package/dist/operations/campaign-stop.d.ts +1 -1
- package/dist/operations/campaign-stop.d.ts.map +1 -1
- package/dist/operations/campaign-stop.js +3 -6
- package/dist/operations/campaign-stop.js.map +1 -1
- package/dist/operations/campaign-update-action.d.ts +1 -1
- package/dist/operations/campaign-update-action.d.ts.map +1 -1
- package/dist/operations/campaign-update-action.js +3 -6
- package/dist/operations/campaign-update-action.js.map +1 -1
- package/dist/operations/campaign-update.d.ts +1 -1
- package/dist/operations/campaign-update.d.ts.map +1 -1
- package/dist/operations/campaign-update.js +3 -6
- package/dist/operations/campaign-update.js.map +1 -1
- package/dist/operations/check-replies.d.ts +3 -1
- package/dist/operations/check-replies.d.ts.map +1 -1
- package/dist/operations/check-replies.js +132 -17
- package/dist/operations/check-replies.js.map +1 -1
- package/dist/operations/check-replies.test.js +177 -17
- package/dist/operations/check-replies.test.js.map +1 -1
- package/dist/operations/collect-people.d.ts +1 -1
- package/dist/operations/collect-people.d.ts.map +1 -1
- package/dist/operations/collect-people.js +3 -6
- package/dist/operations/collect-people.js.map +1 -1
- package/dist/operations/comment-on-post.d.ts +37 -0
- package/dist/operations/comment-on-post.d.ts.map +1 -0
- package/dist/operations/comment-on-post.js +104 -0
- package/dist/operations/comment-on-post.js.map +1 -0
- package/dist/operations/comment-on-post.test.d.ts +2 -0
- package/dist/operations/comment-on-post.test.d.ts.map +1 -0
- package/dist/operations/comment-on-post.test.js +242 -0
- package/dist/operations/comment-on-post.test.js.map +1 -0
- package/dist/operations/create-collection.d.ts +1 -1
- package/dist/operations/create-collection.d.ts.map +1 -1
- package/dist/operations/create-collection.js +3 -6
- package/dist/operations/create-collection.js.map +1 -1
- package/dist/operations/delete-collection.d.ts +1 -1
- package/dist/operations/delete-collection.d.ts.map +1 -1
- package/dist/operations/delete-collection.js +3 -6
- package/dist/operations/delete-collection.js.map +1 -1
- package/dist/operations/dismiss-errors.d.ts +25 -0
- package/dist/operations/dismiss-errors.d.ts.map +1 -0
- package/dist/operations/dismiss-errors.js +74 -0
- package/dist/operations/dismiss-errors.js.map +1 -0
- package/dist/operations/dismiss-errors.test.d.ts +2 -0
- package/dist/operations/dismiss-errors.test.d.ts.map +1 -0
- package/dist/operations/dismiss-errors.test.js +183 -0
- package/dist/operations/dismiss-errors.test.js.map +1 -0
- package/dist/operations/endorse-skills.d.ts +10 -0
- package/dist/operations/endorse-skills.d.ts.map +1 -0
- package/dist/operations/endorse-skills.js +12 -0
- package/dist/operations/endorse-skills.js.map +1 -0
- package/dist/operations/endorse-skills.test.d.ts +2 -0
- package/dist/operations/endorse-skills.test.d.ts.map +1 -0
- package/dist/operations/endorse-skills.test.js +70 -0
- package/dist/operations/endorse-skills.test.js.map +1 -0
- package/dist/operations/enrich-profile.d.ts +18 -0
- package/dist/operations/enrich-profile.d.ts.map +1 -0
- package/dist/operations/enrich-profile.js +15 -0
- package/dist/operations/enrich-profile.js.map +1 -0
- package/dist/operations/enrich-profile.test.d.ts +2 -0
- package/dist/operations/enrich-profile.test.d.ts.map +1 -0
- package/dist/operations/enrich-profile.test.js +73 -0
- package/dist/operations/enrich-profile.test.js.map +1 -0
- package/dist/operations/ephemeral-action.d.ts +22 -0
- package/dist/operations/ephemeral-action.d.ts.map +1 -0
- package/dist/operations/ephemeral-action.js +28 -0
- package/dist/operations/ephemeral-action.js.map +1 -0
- package/dist/operations/ephemeral-action.test.d.ts +2 -0
- package/dist/operations/ephemeral-action.test.d.ts.map +1 -0
- package/dist/operations/ephemeral-action.test.js +140 -0
- package/dist/operations/ephemeral-action.test.js.map +1 -0
- package/dist/operations/follow-person.d.ts +9 -0
- package/dist/operations/follow-person.d.ts.map +1 -0
- package/dist/operations/follow-person.js +11 -0
- package/dist/operations/follow-person.js.map +1 -0
- package/dist/operations/follow-person.test.d.ts +2 -0
- package/dist/operations/follow-person.test.d.ts.map +1 -0
- package/dist/operations/follow-person.test.js +57 -0
- package/dist/operations/follow-person.test.js.map +1 -0
- package/dist/operations/get-action-budget.d.ts +6 -0
- package/dist/operations/get-action-budget.d.ts.map +1 -0
- package/dist/operations/get-action-budget.js +19 -0
- package/dist/operations/get-action-budget.js.map +1 -0
- package/dist/operations/get-action-budget.test.d.ts +2 -0
- package/dist/operations/get-action-budget.test.d.ts.map +1 -0
- package/dist/operations/get-action-budget.test.js +79 -0
- package/dist/operations/get-action-budget.test.js.map +1 -0
- package/dist/operations/get-errors.d.ts +14 -4
- package/dist/operations/get-errors.d.ts.map +1 -1
- package/dist/operations/get-errors.js +72 -13
- package/dist/operations/get-errors.js.map +1 -1
- package/dist/operations/get-errors.test.js +108 -43
- package/dist/operations/get-errors.test.js.map +1 -1
- package/dist/operations/get-feed.d.ts +112 -0
- package/dist/operations/get-feed.d.ts.map +1 -0
- package/dist/operations/get-feed.js +467 -0
- package/dist/operations/get-feed.js.map +1 -0
- package/dist/operations/get-feed.test.d.ts +2 -0
- package/dist/operations/get-feed.test.d.ts.map +1 -0
- package/dist/operations/get-feed.test.js +502 -0
- package/dist/operations/get-feed.test.js.map +1 -0
- package/dist/operations/get-post-engagers.d.ts +43 -0
- package/dist/operations/get-post-engagers.d.ts.map +1 -0
- package/dist/operations/get-post-engagers.js +328 -0
- package/dist/operations/get-post-engagers.js.map +1 -0
- package/dist/operations/get-post-engagers.test.d.ts +2 -0
- package/dist/operations/get-post-engagers.test.d.ts.map +1 -0
- package/dist/operations/get-post-engagers.test.js +297 -0
- package/dist/operations/get-post-engagers.test.js.map +1 -0
- package/dist/operations/get-post-stats.d.ts +43 -0
- package/dist/operations/get-post-stats.d.ts.map +1 -0
- package/dist/operations/get-post-stats.js +164 -0
- package/dist/operations/get-post-stats.js.map +1 -0
- package/dist/operations/get-post-stats.test.d.ts +2 -0
- package/dist/operations/get-post-stats.test.d.ts.map +1 -0
- package/dist/operations/get-post-stats.test.js +169 -0
- package/dist/operations/get-post-stats.test.js.map +1 -0
- package/dist/operations/get-post.d.ts +42 -0
- package/dist/operations/get-post.d.ts.map +1 -0
- package/dist/operations/get-post.js +416 -0
- package/dist/operations/get-post.js.map +1 -0
- package/dist/operations/get-post.test.d.ts +2 -0
- package/dist/operations/get-post.test.d.ts.map +1 -0
- package/dist/operations/get-post.test.js +272 -0
- package/dist/operations/get-post.test.js.map +1 -0
- package/dist/operations/get-profile-activity.d.ts +50 -0
- package/dist/operations/get-profile-activity.d.ts.map +1 -0
- package/dist/operations/get-profile-activity.js +381 -0
- package/dist/operations/get-profile-activity.js.map +1 -0
- package/dist/operations/get-profile-activity.test.d.ts +2 -0
- package/dist/operations/get-profile-activity.test.d.ts.map +1 -0
- package/dist/operations/get-profile-activity.test.js +324 -0
- package/dist/operations/get-profile-activity.test.js.map +1 -0
- package/dist/operations/get-throttle-status.d.ts +6 -0
- package/dist/operations/get-throttle-status.d.ts.map +1 -0
- package/dist/operations/get-throttle-status.js +24 -0
- package/dist/operations/get-throttle-status.js.map +1 -0
- package/dist/operations/get-throttle-status.test.d.ts +2 -0
- package/dist/operations/get-throttle-status.test.d.ts.map +1 -0
- package/dist/operations/get-throttle-status.test.js +62 -0
- package/dist/operations/get-throttle-status.test.js.map +1 -0
- package/dist/operations/import-people-from-collection.d.ts +1 -1
- package/dist/operations/import-people-from-collection.d.ts.map +1 -1
- package/dist/operations/import-people-from-collection.js +3 -6
- package/dist/operations/import-people-from-collection.js.map +1 -1
- package/dist/operations/import-people-from-urls.d.ts +1 -1
- package/dist/operations/import-people-from-urls.d.ts.map +1 -1
- package/dist/operations/import-people-from-urls.js +3 -6
- package/dist/operations/import-people-from-urls.js.map +1 -1
- package/dist/operations/index.d.ts +23 -1
- package/dist/operations/index.d.ts.map +1 -1
- package/dist/operations/index.js +33 -0
- package/dist/operations/index.js.map +1 -1
- package/dist/operations/like-person-posts.d.ts +14 -0
- package/dist/operations/like-person-posts.d.ts.map +1 -0
- package/dist/operations/like-person-posts.js +28 -0
- package/dist/operations/like-person-posts.js.map +1 -0
- package/dist/operations/like-person-posts.test.d.ts +2 -0
- package/dist/operations/like-person-posts.test.d.ts.map +1 -0
- package/dist/operations/like-person-posts.test.js +103 -0
- package/dist/operations/like-person-posts.test.js.map +1 -0
- package/dist/operations/list-collections.d.ts +1 -1
- package/dist/operations/list-collections.d.ts.map +1 -1
- package/dist/operations/list-collections.js +3 -6
- package/dist/operations/list-collections.js.map +1 -1
- package/dist/operations/message-person.d.ts +11 -0
- package/dist/operations/message-person.d.ts.map +1 -0
- package/dist/operations/message-person.js +19 -0
- package/dist/operations/message-person.js.map +1 -0
- package/dist/operations/message-person.test.d.ts +2 -0
- package/dist/operations/message-person.test.d.ts.map +1 -0
- package/dist/operations/message-person.test.js +108 -0
- package/dist/operations/message-person.test.js.map +1 -0
- package/dist/operations/navigate-away.d.ts +14 -0
- package/dist/operations/navigate-away.d.ts.map +1 -0
- package/dist/operations/navigate-away.js +24 -0
- package/dist/operations/navigate-away.js.map +1 -0
- package/dist/operations/navigate-away.test.d.ts +2 -0
- package/dist/operations/navigate-away.test.d.ts.map +1 -0
- package/dist/operations/navigate-away.test.js +51 -0
- package/dist/operations/navigate-away.test.js.map +1 -0
- package/dist/operations/query-messages.d.ts +1 -1
- package/dist/operations/query-messages.d.ts.map +1 -1
- package/dist/operations/query-messages.js +3 -6
- package/dist/operations/query-messages.js.map +1 -1
- package/dist/operations/react-to-post.d.ts +41 -0
- package/dist/operations/react-to-post.d.ts.map +1 -0
- package/dist/operations/react-to-post.js +80 -0
- package/dist/operations/react-to-post.js.map +1 -0
- package/dist/operations/react-to-post.test.d.ts +2 -0
- package/dist/operations/react-to-post.test.d.ts.map +1 -0
- package/dist/operations/react-to-post.test.js +157 -0
- package/dist/operations/react-to-post.test.js.map +1 -0
- package/dist/operations/remove-connection.d.ts +6 -0
- package/dist/operations/remove-connection.d.ts.map +1 -0
- package/dist/operations/remove-connection.js +7 -0
- package/dist/operations/remove-connection.js.map +1 -0
- package/dist/operations/remove-connection.test.d.ts +2 -0
- package/dist/operations/remove-connection.test.d.ts.map +1 -0
- package/dist/operations/remove-connection.test.js +45 -0
- package/dist/operations/remove-connection.test.js.map +1 -0
- package/dist/operations/remove-people-from-collection.d.ts +1 -1
- package/dist/operations/remove-people-from-collection.d.ts.map +1 -1
- package/dist/operations/remove-people-from-collection.js +3 -6
- package/dist/operations/remove-people-from-collection.js.map +1 -1
- package/dist/operations/resolve-linkedin-entity.d.ts.map +1 -1
- package/dist/operations/resolve-linkedin-entity.js +2 -2
- package/dist/operations/resolve-linkedin-entity.js.map +1 -1
- package/dist/operations/resolve-linkedin-entity.test.d.ts +2 -0
- package/dist/operations/resolve-linkedin-entity.test.d.ts.map +1 -0
- package/dist/operations/resolve-linkedin-entity.test.js +343 -0
- package/dist/operations/resolve-linkedin-entity.test.js.map +1 -0
- package/dist/operations/scrape-messaging-history.d.ts +2 -1
- package/dist/operations/scrape-messaging-history.d.ts.map +1 -1
- package/dist/operations/scrape-messaging-history.js +121 -18
- package/dist/operations/scrape-messaging-history.js.map +1 -1
- package/dist/operations/scrape-messaging-history.test.js +134 -12
- package/dist/operations/scrape-messaging-history.test.js.map +1 -1
- package/dist/operations/search-posts.d.ts +51 -0
- package/dist/operations/search-posts.d.ts.map +1 -0
- package/dist/operations/search-posts.js +419 -0
- package/dist/operations/search-posts.js.map +1 -0
- package/dist/operations/search-posts.test.d.ts +2 -0
- package/dist/operations/search-posts.test.d.ts.map +1 -0
- package/dist/operations/search-posts.test.js +300 -0
- package/dist/operations/search-posts.test.js.map +1 -0
- package/dist/operations/send-inmail.d.ts +11 -0
- package/dist/operations/send-inmail.d.ts.map +1 -0
- package/dist/operations/send-inmail.js +19 -0
- package/dist/operations/send-inmail.js.map +1 -0
- package/dist/operations/send-inmail.test.d.ts +2 -0
- package/dist/operations/send-inmail.test.d.ts.map +1 -0
- package/dist/operations/send-inmail.test.js +108 -0
- package/dist/operations/send-inmail.test.js.map +1 -0
- package/dist/operations/send-invite.d.ts +9 -0
- package/dist/operations/send-invite.d.ts.map +1 -0
- package/dist/operations/send-invite.js +14 -0
- package/dist/operations/send-invite.js.map +1 -0
- package/dist/operations/send-invite.test.d.ts +2 -0
- package/dist/operations/send-invite.test.d.ts.map +1 -0
- package/dist/operations/send-invite.test.js +59 -0
- package/dist/operations/send-invite.test.js.map +1 -0
- package/dist/operations/types.d.ts +24 -1
- package/dist/operations/types.d.ts.map +1 -1
- package/dist/operations/types.js +13 -1
- package/dist/operations/types.js.map +1 -1
- package/dist/operations/visit-profile.d.ts +14 -0
- package/dist/operations/visit-profile.d.ts.map +1 -0
- package/dist/operations/visit-profile.js +46 -0
- package/dist/operations/visit-profile.js.map +1 -0
- package/dist/operations/visit-profile.test.d.ts +2 -0
- package/dist/operations/visit-profile.test.d.ts.map +1 -0
- package/dist/operations/visit-profile.test.js +193 -0
- package/dist/operations/visit-profile.test.js.map +1 -0
- package/dist/services/account-resolution.d.ts +9 -4
- package/dist/services/account-resolution.d.ts.map +1 -1
- package/dist/services/account-resolution.js +60 -5
- package/dist/services/account-resolution.js.map +1 -1
- package/dist/services/app.d.ts +6 -2
- package/dist/services/app.d.ts.map +1 -1
- package/dist/services/app.js +18 -6
- package/dist/services/app.js.map +1 -1
- package/dist/services/app.test.js +41 -7
- package/dist/services/app.test.js.map +1 -1
- package/dist/services/campaign.d.ts +44 -2
- package/dist/services/campaign.d.ts.map +1 -1
- package/dist/services/campaign.js +124 -1
- package/dist/services/campaign.js.map +1 -1
- package/dist/services/collection.d.ts +5 -2
- package/dist/services/collection.d.ts.map +1 -1
- package/dist/services/collection.js +24 -5
- package/dist/services/collection.js.map +1 -1
- package/dist/services/collection.test.js +51 -9
- package/dist/services/collection.test.js.map +1 -1
- package/dist/services/ephemeral-campaign.d.ts +64 -0
- package/dist/services/ephemeral-campaign.d.ts.map +1 -0
- package/dist/services/ephemeral-campaign.js +210 -0
- package/dist/services/ephemeral-campaign.js.map +1 -0
- package/dist/services/ephemeral-campaign.test.d.ts +2 -0
- package/dist/services/ephemeral-campaign.test.d.ts.map +1 -0
- package/dist/services/ephemeral-campaign.test.js +333 -0
- package/dist/services/ephemeral-campaign.test.js.map +1 -0
- package/dist/services/errors.d.ts +12 -1
- package/dist/services/errors.d.ts.map +1 -1
- package/dist/services/errors.js +26 -3
- package/dist/services/errors.js.map +1 -1
- package/dist/services/index.d.ts +2 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +2 -1
- package/dist/services/index.js.map +1 -1
- package/dist/services/instance-context.d.ts +5 -1
- package/dist/services/instance-context.d.ts.map +1 -1
- package/dist/services/instance-context.js +87 -20
- package/dist/services/instance-context.js.map +1 -1
- package/dist/services/instance-context.test.js +82 -2
- package/dist/services/instance-context.test.js.map +1 -1
- package/dist/services/instance-lifecycle.d.ts.map +1 -1
- package/dist/services/instance-lifecycle.js +32 -1
- package/dist/services/instance-lifecycle.js.map +1 -1
- package/dist/services/instance-lifecycle.test.js +52 -1
- package/dist/services/instance-lifecycle.test.js.map +1 -1
- package/dist/services/instance.d.ts +43 -0
- package/dist/services/instance.d.ts.map +1 -1
- package/dist/services/instance.js +163 -1
- package/dist/services/instance.js.map +1 -1
- package/dist/services/instance.test.js +135 -0
- package/dist/services/instance.test.js.map +1 -1
- package/dist/services/launcher.d.ts +54 -3
- package/dist/services/launcher.d.ts.map +1 -1
- package/dist/services/launcher.js +223 -34
- package/dist/services/launcher.js.map +1 -1
- package/dist/services/launcher.test.js +133 -6
- package/dist/services/launcher.test.js.map +1 -1
- package/dist/services/status.d.ts +6 -2
- package/dist/services/status.d.ts.map +1 -1
- package/dist/services/status.js +67 -34
- package/dist/services/status.js.map +1 -1
- package/dist/services/status.test.js +9 -2
- package/dist/services/status.test.js.map +1 -1
- package/dist/testing/e2e-helpers.d.ts +23 -1
- package/dist/testing/e2e-helpers.d.ts.map +1 -1
- package/dist/testing/e2e-helpers.js +110 -5
- package/dist/testing/e2e-helpers.js.map +1 -1
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/types/account.d.ts +1 -1
- package/dist/types/action-budget.d.ts +52 -0
- package/dist/types/action-budget.d.ts.map +1 -0
- package/dist/types/action-budget.js +4 -0
- package/dist/types/action-budget.js.map +1 -0
- package/dist/types/campaign.d.ts +24 -0
- package/dist/types/campaign.d.ts.map +1 -1
- package/dist/types/feed.d.ts +30 -0
- package/dist/types/feed.d.ts.map +1 -0
- package/dist/types/feed.js +4 -0
- package/dist/types/feed.js.map +1 -0
- package/dist/types/index.d.ts +6 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/post-analytics.d.ts +40 -0
- package/dist/types/post-analytics.d.ts.map +1 -0
- package/dist/types/post-analytics.js +4 -0
- package/dist/types/post-analytics.js.map +1 -0
- package/dist/types/post.d.ts +43 -0
- package/dist/types/post.d.ts.map +1 -0
- package/dist/types/post.js +4 -0
- package/dist/types/post.js.map +1 -0
- package/dist/types/ui-health.d.ts +16 -0
- package/dist/types/ui-health.d.ts.map +1 -1
- package/dist/utils/cdp-port.d.ts.map +1 -1
- package/dist/utils/cdp-port.js +3 -1
- package/dist/utils/cdp-port.js.map +1 -1
- package/dist/utils/cdp-port.test.js +1 -1
- package/dist/utils/cdp-port.test.js.map +1 -1
- package/dist/utils/delay.d.ts +79 -0
- package/dist/utils/delay.d.ts.map +1 -1
- package/dist/utils/delay.js +118 -0
- package/dist/utils/delay.js.map +1 -1
- package/dist/utils/delay.test.js +111 -1
- package/dist/utils/delay.test.js.map +1 -1
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/session-pacer.d.ts +27 -0
- package/dist/utils/session-pacer.d.ts.map +1 -0
- package/dist/utils/session-pacer.js +55 -0
- package/dist/utils/session-pacer.js.map +1 -0
- package/dist/utils/session-pacer.test.d.ts +2 -0
- package/dist/utils/session-pacer.test.d.ts.map +1 -0
- package/dist/utils/session-pacer.test.js +111 -0
- package/dist/utils/session-pacer.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-automation.integration.test.d.ts","sourceRoot":"","sources":["../../../src/linkedin/__tests__/dom-automation.integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
|
|
4
|
+
import { CDPClient } from "../../cdp/client.js";
|
|
5
|
+
import { CDPEvaluationError, CDPTimeoutError } from "../../cdp/errors.js";
|
|
6
|
+
import { launchChromium, } from "../../cdp/testing/launch-chromium.js";
|
|
7
|
+
import { click, scrollTo, typeText, waitForElement } from "../dom-automation.js";
|
|
8
|
+
/** Timeout for beforeEach operations (connect + reset) on slow CI runners. */
|
|
9
|
+
const BEFORE_EACH_TIMEOUT = 15_000;
|
|
10
|
+
/**
|
|
11
|
+
* Race a promise against a timeout, throwing a descriptive error on expiry.
|
|
12
|
+
*/
|
|
13
|
+
async function withTimeout(promise, ms, label) {
|
|
14
|
+
const ac = new AbortController();
|
|
15
|
+
const timeout = new Promise((_resolve, reject) => {
|
|
16
|
+
const timer = setTimeout(() => {
|
|
17
|
+
reject(new Error(`${label} timed out after ${ms}ms`));
|
|
18
|
+
}, ms);
|
|
19
|
+
ac.signal.addEventListener("abort", () => clearTimeout(timer));
|
|
20
|
+
});
|
|
21
|
+
try {
|
|
22
|
+
return await Promise.race([promise, timeout]);
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
ac.abort();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Helper to clear document body and create elements without innerHTML
|
|
30
|
+
* (which is blocked by Chromium's Trusted Types policy).
|
|
31
|
+
*/
|
|
32
|
+
async function resetBody(client) {
|
|
33
|
+
await client.evaluate(`while (document.body.firstChild) document.body.removeChild(document.body.firstChild)`);
|
|
34
|
+
}
|
|
35
|
+
describe("DOM automation (integration)", () => {
|
|
36
|
+
let chromium;
|
|
37
|
+
let client;
|
|
38
|
+
beforeAll(async () => {
|
|
39
|
+
chromium = await launchChromium();
|
|
40
|
+
}, 30_000);
|
|
41
|
+
afterAll(async () => {
|
|
42
|
+
await chromium.close();
|
|
43
|
+
});
|
|
44
|
+
beforeEach(async () => {
|
|
45
|
+
client = new CDPClient(chromium.port, { timeout: BEFORE_EACH_TIMEOUT });
|
|
46
|
+
await withTimeout(client.connect(), BEFORE_EACH_TIMEOUT, "client.connect()");
|
|
47
|
+
await withTimeout(resetBody(client), BEFORE_EACH_TIMEOUT, "resetBody()");
|
|
48
|
+
});
|
|
49
|
+
afterEach(() => {
|
|
50
|
+
client.disconnect();
|
|
51
|
+
});
|
|
52
|
+
// ── waitForElement ──────────────────────────────────────────────
|
|
53
|
+
describe("waitForElement", () => {
|
|
54
|
+
it("should resolve immediately when element already exists", async () => {
|
|
55
|
+
await client.evaluate(`(() => {
|
|
56
|
+
const el = document.createElement('div');
|
|
57
|
+
el.id = 'existing';
|
|
58
|
+
el.textContent = 'Hello';
|
|
59
|
+
document.body.appendChild(el);
|
|
60
|
+
})()`);
|
|
61
|
+
await waitForElement(client, "#existing", { timeout: 2000 });
|
|
62
|
+
});
|
|
63
|
+
it("should resolve when element appears after a delay", { timeout: 15_000 }, async () => {
|
|
64
|
+
await client.evaluate(`
|
|
65
|
+
setTimeout(() => {
|
|
66
|
+
const el = document.createElement('div');
|
|
67
|
+
el.id = 'delayed';
|
|
68
|
+
document.body.appendChild(el);
|
|
69
|
+
}, 200);
|
|
70
|
+
`);
|
|
71
|
+
await waitForElement(client, "#delayed", { timeout: 5000 });
|
|
72
|
+
});
|
|
73
|
+
it("should reject with CDPTimeoutError when element never appears", async () => {
|
|
74
|
+
await expect(waitForElement(client, "#nonexistent", { timeout: 500 })).rejects.toThrow(CDPTimeoutError);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
// ── click ───────────────────────────────────────────────────────
|
|
78
|
+
describe("click", () => {
|
|
79
|
+
it("should click the element via JS .click()", async () => {
|
|
80
|
+
await client.evaluate(`(() => {
|
|
81
|
+
const btn = document.createElement('button');
|
|
82
|
+
btn.id = 'btn';
|
|
83
|
+
btn.textContent = 'Click me';
|
|
84
|
+
document.body.appendChild(btn);
|
|
85
|
+
window.__clicked = false;
|
|
86
|
+
btn.addEventListener('click', () => { window.__clicked = true; });
|
|
87
|
+
})()`);
|
|
88
|
+
await click(client, "#btn");
|
|
89
|
+
const clicked = await client.evaluate("window.__clicked");
|
|
90
|
+
expect(clicked).toBe(true);
|
|
91
|
+
});
|
|
92
|
+
it("should throw CDPEvaluationError when element not found", async () => {
|
|
93
|
+
await expect(click(client, "#missing")).rejects.toThrow(CDPEvaluationError);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
// ── scrollTo ────────────────────────────────────────────────────
|
|
97
|
+
describe("scrollTo", () => {
|
|
98
|
+
it("should scroll the element into view", async () => {
|
|
99
|
+
await client.evaluate(`(() => {
|
|
100
|
+
document.body.style.margin = '0';
|
|
101
|
+
document.body.style.height = '3000px';
|
|
102
|
+
const el = document.createElement('div');
|
|
103
|
+
el.id = 'bottom';
|
|
104
|
+
el.textContent = 'Bottom';
|
|
105
|
+
el.style.position = 'absolute';
|
|
106
|
+
el.style.top = '2500px';
|
|
107
|
+
document.body.appendChild(el);
|
|
108
|
+
})()`);
|
|
109
|
+
// Verify element is initially below the viewport
|
|
110
|
+
const beforeY = await client.evaluate(`document.getElementById('bottom').getBoundingClientRect().top`);
|
|
111
|
+
expect(beforeY).toBeGreaterThan(600);
|
|
112
|
+
await scrollTo(client, "#bottom");
|
|
113
|
+
// Verify element is now within the viewport
|
|
114
|
+
const afterRect = await client.evaluate(`(() => {
|
|
115
|
+
const r = document.getElementById('bottom').getBoundingClientRect();
|
|
116
|
+
return { top: r.top, bottom: r.bottom };
|
|
117
|
+
})()`);
|
|
118
|
+
const viewportHeight = await client.evaluate("window.innerHeight");
|
|
119
|
+
expect(afterRect.top).toBeGreaterThanOrEqual(0);
|
|
120
|
+
expect(afterRect.top).toBeLessThan(viewportHeight);
|
|
121
|
+
});
|
|
122
|
+
it("should throw CDPEvaluationError when element not found", async () => {
|
|
123
|
+
await expect(scrollTo(client, "#missing")).rejects.toThrow(CDPEvaluationError);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
// ── typeText ────────────────────────────────────────────────────
|
|
127
|
+
describe("typeText", () => {
|
|
128
|
+
it("should type characters one-by-one into an input", async () => {
|
|
129
|
+
await client.evaluate(`(() => {
|
|
130
|
+
const input = document.createElement('input');
|
|
131
|
+
input.id = 'input';
|
|
132
|
+
input.type = 'text';
|
|
133
|
+
document.body.appendChild(input);
|
|
134
|
+
window.__inputEvents = 0;
|
|
135
|
+
input.addEventListener('keydown', () => { window.__inputEvents++; });
|
|
136
|
+
})()`);
|
|
137
|
+
await typeText(client, "#input", "hello");
|
|
138
|
+
const value = await client.evaluate(`document.getElementById('input').value`);
|
|
139
|
+
expect(value).toBe("hello");
|
|
140
|
+
// Each character should have triggered a keydown event
|
|
141
|
+
const eventCount = await client.evaluate("window.__inputEvents");
|
|
142
|
+
expect(eventCount).toBe(5);
|
|
143
|
+
});
|
|
144
|
+
it("should type into a contenteditable element", async () => {
|
|
145
|
+
await client.evaluate(`(() => {
|
|
146
|
+
const editor = document.createElement('div');
|
|
147
|
+
editor.id = 'editor';
|
|
148
|
+
editor.contentEditable = 'true';
|
|
149
|
+
document.body.appendChild(editor);
|
|
150
|
+
})()`);
|
|
151
|
+
await typeText(client, "#editor", "abc");
|
|
152
|
+
const text = await client.evaluate(`document.getElementById('editor').textContent`);
|
|
153
|
+
expect(text).toBe("abc");
|
|
154
|
+
});
|
|
155
|
+
it("should throw CDPEvaluationError when element not found", async () => {
|
|
156
|
+
await expect(typeText(client, "#missing", "text")).rejects.toThrow(CDPEvaluationError);
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
//# sourceMappingURL=dom-automation.integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-automation.integration.test.js","sourceRoot":"","sources":["../../../src/linkedin/__tests__/dom-automation.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-automation-retry.test.d.ts","sourceRoot":"","sources":["../../src/linkedin/dom-automation-retry.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { describe, expect, it, vi } from "vitest";
|
|
4
|
+
// Mock delay internals before importing the module under test so retries
|
|
5
|
+
// resolve instantly (Vitest hoists vi.mock, but explicit ordering is clearer).
|
|
6
|
+
vi.mock("../utils/delay.js", () => ({
|
|
7
|
+
delay: vi.fn().mockResolvedValue(undefined),
|
|
8
|
+
randomDelay: vi.fn().mockResolvedValue(undefined),
|
|
9
|
+
randomBetween: vi.fn().mockReturnValue(0),
|
|
10
|
+
gaussianRandom: vi.fn().mockReturnValue(0),
|
|
11
|
+
gaussianDelay: vi.fn().mockResolvedValue(undefined),
|
|
12
|
+
gaussianBetween: vi.fn().mockReturnValue(0),
|
|
13
|
+
maybeHesitate: vi.fn().mockResolvedValue(undefined),
|
|
14
|
+
maybeBreak: vi.fn().mockResolvedValue(undefined),
|
|
15
|
+
simulateReadingTime: vi.fn().mockResolvedValue(undefined),
|
|
16
|
+
}));
|
|
17
|
+
import { retryInteraction } from "./dom-automation.js";
|
|
18
|
+
describe("retryInteraction", () => {
|
|
19
|
+
it("returns the result on first success", async () => {
|
|
20
|
+
const fn = vi.fn().mockResolvedValue("ok");
|
|
21
|
+
const result = await retryInteraction(fn, 3);
|
|
22
|
+
expect(result).toBe("ok");
|
|
23
|
+
expect(fn).toHaveBeenCalledTimes(1);
|
|
24
|
+
});
|
|
25
|
+
it("retries on failure and returns eventual success", async () => {
|
|
26
|
+
const fn = vi
|
|
27
|
+
.fn()
|
|
28
|
+
.mockRejectedValueOnce(new Error("fail"))
|
|
29
|
+
.mockResolvedValue("recovered");
|
|
30
|
+
const result = await retryInteraction(fn, 3);
|
|
31
|
+
expect(result).toBe("recovered");
|
|
32
|
+
expect(fn).toHaveBeenCalledTimes(2);
|
|
33
|
+
});
|
|
34
|
+
it("throws after exhausting all attempts", async () => {
|
|
35
|
+
const fn = vi.fn().mockRejectedValue(new Error("persistent"));
|
|
36
|
+
await expect(retryInteraction(fn, 2)).rejects.toThrow("persistent");
|
|
37
|
+
expect(fn).toHaveBeenCalledTimes(2);
|
|
38
|
+
});
|
|
39
|
+
it("defaults to 2 max attempts", async () => {
|
|
40
|
+
const fn = vi.fn().mockRejectedValue(new Error("fail"));
|
|
41
|
+
await expect(retryInteraction(fn)).rejects.toThrow("fail");
|
|
42
|
+
expect(fn).toHaveBeenCalledTimes(2);
|
|
43
|
+
});
|
|
44
|
+
it("returns null without retrying when fn returns null", async () => {
|
|
45
|
+
const fn = vi.fn().mockResolvedValue(null);
|
|
46
|
+
const result = await retryInteraction(fn, 3);
|
|
47
|
+
expect(result).toBeNull();
|
|
48
|
+
expect(fn).toHaveBeenCalledTimes(1);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=dom-automation-retry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-automation-retry.test.js","sourceRoot":"","sources":["../../src/linkedin/dom-automation-retry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import type { CDPClient } from "../cdp/client.js";
|
|
2
|
+
import type { HumanizedMouse } from "./humanized-mouse.js";
|
|
3
|
+
/** Options for {@link waitForElement}. */
|
|
4
|
+
export interface WaitForElementOptions {
|
|
5
|
+
/** Maximum time to wait in ms (default: 30 000). */
|
|
6
|
+
timeout?: number;
|
|
7
|
+
/** Polling interval in ms (default: 100). */
|
|
8
|
+
pollInterval?: number;
|
|
9
|
+
}
|
|
10
|
+
/** Text input method for {@link typeText}. */
|
|
11
|
+
export type TypeMethod = "type";
|
|
12
|
+
/**
|
|
13
|
+
* Poll the DOM until an element matching the selector appears.
|
|
14
|
+
*
|
|
15
|
+
* When a {@link HumanizedMouse} is provided, tiny idle mouse movements
|
|
16
|
+
* (1–5 px) are dispatched on ~20% of poll cycles once the wait exceeds
|
|
17
|
+
* 500 ms. This prevents the cursor from remaining perfectly still
|
|
18
|
+
* during long element waits — a detectable automation fingerprint.
|
|
19
|
+
*
|
|
20
|
+
* @param client - Connected CDP client targeting the page.
|
|
21
|
+
* @param selector - CSS selector to query.
|
|
22
|
+
* @param options - Timeout and polling interval.
|
|
23
|
+
* @param mouse - Optional humanized mouse (enables idle drift).
|
|
24
|
+
* @throws {CDPTimeoutError} If the element does not appear within the timeout.
|
|
25
|
+
*/
|
|
26
|
+
export declare function waitForElement(client: CDPClient, selector: string, options?: WaitForElementOptions, mouse?: HumanizedMouse | null): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Wait until the DOM stops mutating for `quietMs` milliseconds.
|
|
29
|
+
*
|
|
30
|
+
* Installs a `MutationObserver` via `Runtime.evaluate` that tracks
|
|
31
|
+
* the timestamp of the last mutation. Polls until no mutations have
|
|
32
|
+
* occurred for the configured quiet period, then adds a "visual
|
|
33
|
+
* scanning" Gaussian delay to simulate a human pausing to read.
|
|
34
|
+
*
|
|
35
|
+
* @param client - Connected CDP client targeting the page.
|
|
36
|
+
* @param quietMs - Milliseconds of mutation silence required (default: 500).
|
|
37
|
+
*/
|
|
38
|
+
export declare function waitForDOMStable(client: CDPClient, quietMs?: number): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Scroll the page until the target element is visible in the viewport.
|
|
41
|
+
*
|
|
42
|
+
* The element must already exist in the DOM. Use {@link waitForElement}
|
|
43
|
+
* first if it may not be present yet.
|
|
44
|
+
*
|
|
45
|
+
* @param client - Connected CDP client targeting the page.
|
|
46
|
+
* @param selector - CSS selector for the element to scroll to.
|
|
47
|
+
* @throws {CDPEvaluationError} If the element is not found.
|
|
48
|
+
*/
|
|
49
|
+
export declare function scrollTo(client: CDPClient, selector: string): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Trigger a hover on an element by dispatching `mouseenter` + `mouseover`.
|
|
52
|
+
*
|
|
53
|
+
* This is used to reveal hover-dependent UI such as the LinkedIn
|
|
54
|
+
* reactions menu popup.
|
|
55
|
+
*
|
|
56
|
+
* @param client - Connected CDP client targeting the page.
|
|
57
|
+
* @param selector - CSS selector for the element to hover.
|
|
58
|
+
* @throws {CDPEvaluationError} If the element is not found.
|
|
59
|
+
*/
|
|
60
|
+
export declare function hover(client: CDPClient, selector: string): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Click an element via its JavaScript `.click()` method.
|
|
63
|
+
*
|
|
64
|
+
* Uses JS `.click()` rather than `Input.dispatchMouseEvent` because the
|
|
65
|
+
* latter does not reliably trigger handlers on LinkedIn's React components.
|
|
66
|
+
*
|
|
67
|
+
* @param client - Connected CDP client targeting the page.
|
|
68
|
+
* @param selector - CSS selector for the element to click.
|
|
69
|
+
* @throws {CDPEvaluationError} If the element is not found.
|
|
70
|
+
*/
|
|
71
|
+
export declare function click(client: CDPClient, selector: string): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Type text into a focused element character-by-character.
|
|
74
|
+
*
|
|
75
|
+
* The element is focused first, then each character is dispatched via
|
|
76
|
+
* CDP `Input.dispatchKeyEvent` with character-context-aware Gaussian
|
|
77
|
+
* delays to approximate human typing cadence:
|
|
78
|
+
*
|
|
79
|
+
* - **Intra-word** (letters, digits): ~65 ms mean — fast, rhythmic typing
|
|
80
|
+
* - **Word boundary** (space): ~180 ms mean — natural pause between words
|
|
81
|
+
* - **Sentence boundary** (space after `.!?`): ~350 ms mean — thinking pause
|
|
82
|
+
* - **Paragraph boundary** (newline): ~700 ms mean — composing the next thought
|
|
83
|
+
* - **Micro-hesitation** (5% per character): ~300 ms extra — brief mid-word thinking
|
|
84
|
+
*
|
|
85
|
+
* @param client - Connected CDP client targeting the page.
|
|
86
|
+
* @param selector - CSS selector for the input element.
|
|
87
|
+
* @param text - The string to type.
|
|
88
|
+
* @param method - Input method (default: `"type"`).
|
|
89
|
+
* @throws {CDPEvaluationError} If the element is not found.
|
|
90
|
+
*/
|
|
91
|
+
export declare function typeText(client: CDPClient, selector: string, text: string, method?: TypeMethod): Promise<void>;
|
|
92
|
+
/** Bounding rect returned by element bounds queries. */
|
|
93
|
+
export interface ElementBounds {
|
|
94
|
+
top: number;
|
|
95
|
+
bottom: number;
|
|
96
|
+
height: number;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get the bounding rect of a DOM element selected by CSS selector.
|
|
100
|
+
*
|
|
101
|
+
* @returns `null` if the element is not found.
|
|
102
|
+
*/
|
|
103
|
+
export declare function getElementBounds(client: CDPClient, selector: string): Promise<ElementBounds | null>;
|
|
104
|
+
/**
|
|
105
|
+
* Get the bounding rect of the Nth element matching a CSS selector.
|
|
106
|
+
*
|
|
107
|
+
* Equivalent to `document.querySelectorAll(baseSelector)[index]`.
|
|
108
|
+
*
|
|
109
|
+
* @returns `null` if no element exists at the given index.
|
|
110
|
+
*/
|
|
111
|
+
export declare function getElementBoundsByIndex(client: CDPClient, baseSelector: string, index: number): Promise<ElementBounds | null>;
|
|
112
|
+
/**
|
|
113
|
+
* Get the viewport height (`window.innerHeight`).
|
|
114
|
+
*/
|
|
115
|
+
export declare function getViewportHeight(client: CDPClient): Promise<number>;
|
|
116
|
+
/**
|
|
117
|
+
* Scroll the page until the target element is centered in the viewport,
|
|
118
|
+
* using incremental humanized mouse-wheel strokes.
|
|
119
|
+
*
|
|
120
|
+
* When a {@link HumanizedMouse} is available, the cursor scrolls the page
|
|
121
|
+
* in small increments until the element's bounding rect is in the viewport
|
|
122
|
+
* center zone. Falls back to instant `scrollIntoView` otherwise.
|
|
123
|
+
*
|
|
124
|
+
* @param client - Connected CDP client targeting the page.
|
|
125
|
+
* @param selector - CSS selector for the element to scroll to.
|
|
126
|
+
* @param mouse - Optional humanized mouse instance.
|
|
127
|
+
*/
|
|
128
|
+
export declare function humanizedScrollTo(client: CDPClient, selector: string, mouse?: HumanizedMouse | null): Promise<void>;
|
|
129
|
+
/**
|
|
130
|
+
* Scroll the page until the Nth element matching a selector is centered,
|
|
131
|
+
* using incremental humanized mouse-wheel strokes.
|
|
132
|
+
*
|
|
133
|
+
* Falls back to instant `scrollIntoView` when humanized mouse is unavailable.
|
|
134
|
+
*
|
|
135
|
+
* @param client - Connected CDP client targeting the page.
|
|
136
|
+
* @param baseSelector - CSS selector matching multiple elements.
|
|
137
|
+
* @param index - Zero-based index into the matched elements.
|
|
138
|
+
* @param mouse - Optional humanized mouse instance.
|
|
139
|
+
*/
|
|
140
|
+
export declare function humanizedScrollToByIndex(client: CDPClient, baseSelector: string, index: number, mouse?: HumanizedMouse | null): Promise<void>;
|
|
141
|
+
/** Viewport-relative point returned by `getElementCenter`. */
|
|
142
|
+
interface ElementCenter {
|
|
143
|
+
x: number;
|
|
144
|
+
y: number;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Get a jittered viewport-relative point near the center of a DOM element.
|
|
148
|
+
*
|
|
149
|
+
* A Gaussian offset is applied so the click target varies naturally within
|
|
150
|
+
* the element bounds, removing the dead-center automation fingerprint.
|
|
151
|
+
*
|
|
152
|
+
* @returns `null` if the element is not found.
|
|
153
|
+
*/
|
|
154
|
+
export declare function getElementCenter(client: CDPClient, selector: string): Promise<ElementCenter | null>;
|
|
155
|
+
/**
|
|
156
|
+
* Click an element with humanized mouse movement when available.
|
|
157
|
+
*
|
|
158
|
+
* When a {@link HumanizedMouse} is provided and available, the cursor
|
|
159
|
+
* follows a Bezier path to the element center before clicking. The
|
|
160
|
+
* VirtualMouse dispatches `mousePressed` / `mouseReleased` via CDP.
|
|
161
|
+
*
|
|
162
|
+
* **Pre-focus hover** (60% probability, HumanizedMouse only): before
|
|
163
|
+
* clicking, the cursor first moves to a point 20–50 px from the target,
|
|
164
|
+
* pauses briefly to simulate visual scanning, then proceeds to the
|
|
165
|
+
* target — a two-phase approach that mimics how a human visually locates
|
|
166
|
+
* a button before moving to click it.
|
|
167
|
+
*
|
|
168
|
+
* **Viewport comfort zone**: if the target sits in the outer 20% of the
|
|
169
|
+
* viewport, a small scroll brings it more central before interacting.
|
|
170
|
+
*
|
|
171
|
+
* Falls back to the standard JS `.click()` when humanized mouse is
|
|
172
|
+
* unavailable (or the element cannot be located by bounding rect).
|
|
173
|
+
*
|
|
174
|
+
* @param client - Connected CDP client targeting the LinkedIn page.
|
|
175
|
+
* @param selector - CSS selector for the element to click.
|
|
176
|
+
* @param mouse - Optional humanized mouse instance.
|
|
177
|
+
*/
|
|
178
|
+
export declare function humanizedClick(client: CDPClient, selector: string, mouse?: HumanizedMouse | null): Promise<void>;
|
|
179
|
+
/**
|
|
180
|
+
* Hover over an element with humanized mouse movement when available.
|
|
181
|
+
*
|
|
182
|
+
* When a {@link HumanizedMouse} is provided, the cursor physically
|
|
183
|
+
* moves to the element center — which is more realistic than
|
|
184
|
+
* dispatching synthetic `mouseenter` / `mouseover` JS events.
|
|
185
|
+
*
|
|
186
|
+
* Falls back to synthetic JS events when unavailable.
|
|
187
|
+
*
|
|
188
|
+
* @param client - Connected CDP client targeting the LinkedIn page.
|
|
189
|
+
* @param selector - CSS selector for the element to hover.
|
|
190
|
+
* @param mouse - Optional humanized mouse instance.
|
|
191
|
+
*/
|
|
192
|
+
export declare function humanizedHover(client: CDPClient, selector: string, mouse?: HumanizedMouse | null): Promise<void>;
|
|
193
|
+
/**
|
|
194
|
+
* Scroll the page vertically with humanized mouse-wheel strokes.
|
|
195
|
+
*
|
|
196
|
+
* When a {@link HumanizedMouse} is provided, scrolling is emulated as
|
|
197
|
+
* incremental wheel strokes (150 px / 25 ms) at the given position,
|
|
198
|
+
* matching the behavior of a physical mouse wheel.
|
|
199
|
+
*
|
|
200
|
+
* Falls back to a single CDP `mouseWheel` event when unavailable.
|
|
201
|
+
*
|
|
202
|
+
* @param client - Connected CDP client targeting the LinkedIn page.
|
|
203
|
+
* @param deltaY - Pixels to scroll (positive = down).
|
|
204
|
+
* @param x - Viewport X coordinate for the scroll position.
|
|
205
|
+
* @param y - Viewport Y coordinate for the scroll position.
|
|
206
|
+
* @param mouse - Optional humanized mouse instance.
|
|
207
|
+
*/
|
|
208
|
+
export declare function humanizedScrollY(client: CDPClient, deltaY: number, x: number, y: number, mouse?: HumanizedMouse | null): Promise<void>;
|
|
209
|
+
/**
|
|
210
|
+
* Retry an interaction function with escalating Gaussian-distributed
|
|
211
|
+
* delays between attempts.
|
|
212
|
+
*
|
|
213
|
+
* Wraps critical interaction sequences (click after scroll, hover after
|
|
214
|
+
* navigate) where elements may vanish due to React re-renders. Each
|
|
215
|
+
* retry waits progressively longer — `800 * (attempt + 1)` ms mean —
|
|
216
|
+
* giving the page time to stabilise.
|
|
217
|
+
*
|
|
218
|
+
* @param fn - The async interaction to attempt.
|
|
219
|
+
* @param maxAttempts - Maximum number of attempts (default: 2).
|
|
220
|
+
* @returns The result of the first successful attempt.
|
|
221
|
+
*/
|
|
222
|
+
export declare function retryInteraction<T>(fn: () => Promise<T>, maxAttempts?: number): Promise<T>;
|
|
223
|
+
export {};
|
|
224
|
+
//# sourceMappingURL=dom-automation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-automation.d.ts","sourceRoot":"","sources":["../../src/linkedin/dom-automation.ts"],"names":[],"mappings":"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"}
|