@hanivanrizky/nestjs-browser-action 0.1.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 (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +279 -0
  3. package/dist/browser-action.module-definition.d.ts +7 -0
  4. package/dist/browser-action.module-definition.js +3 -0
  5. package/dist/browser-action.module-definition.js.map +1 -0
  6. package/dist/browser-action.module.d.ts +8 -0
  7. package/dist/browser-action.module.js +93 -0
  8. package/dist/browser-action.module.js.map +1 -0
  9. package/dist/constants/browser-action.constants.d.ts +28 -0
  10. package/dist/constants/browser-action.constants.js +32 -0
  11. package/dist/constants/browser-action.constants.js.map +1 -0
  12. package/dist/constants/index.d.ts +1 -0
  13. package/dist/constants/index.js +18 -0
  14. package/dist/constants/index.js.map +1 -0
  15. package/dist/decorators/index.d.ts +2 -0
  16. package/dist/decorators/index.js +19 -0
  17. package/dist/decorators/index.js.map +1 -0
  18. package/dist/decorators/inject-browser.decorator.d.ts +1 -0
  19. package/dist/decorators/inject-browser.decorator.js +7 -0
  20. package/dist/decorators/inject-browser.decorator.js.map +1 -0
  21. package/dist/decorators/inject-page.decorator.d.ts +1 -0
  22. package/dist/decorators/inject-page.decorator.js +7 -0
  23. package/dist/decorators/inject-page.decorator.js.map +1 -0
  24. package/dist/enums/cleansing-profile.enum.d.ts +7 -0
  25. package/dist/enums/cleansing-profile.enum.js +12 -0
  26. package/dist/enums/cleansing-profile.enum.js.map +1 -0
  27. package/dist/enums/cleansing-type.enum.d.ts +15 -0
  28. package/dist/enums/cleansing-type.enum.js +20 -0
  29. package/dist/enums/cleansing-type.enum.js.map +1 -0
  30. package/dist/enums/index.d.ts +2 -0
  31. package/dist/enums/index.js +19 -0
  32. package/dist/enums/index.js.map +1 -0
  33. package/dist/helpers/action-helpers.service.d.ts +41 -0
  34. package/dist/helpers/action-helpers.service.js +534 -0
  35. package/dist/helpers/action-helpers.service.js.map +1 -0
  36. package/dist/helpers/dom.util.d.ts +4 -0
  37. package/dist/helpers/dom.util.js +27 -0
  38. package/dist/helpers/dom.util.js.map +1 -0
  39. package/dist/helpers/index.d.ts +2 -0
  40. package/dist/helpers/index.js +19 -0
  41. package/dist/helpers/index.js.map +1 -0
  42. package/dist/helpers/logger.util.d.ts +10 -0
  43. package/dist/helpers/logger.util.js +47 -0
  44. package/dist/helpers/logger.util.js.map +1 -0
  45. package/dist/index.d.ts +12 -0
  46. package/dist/index.js +29 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/interfaces/browser-action-options.d.ts +17 -0
  49. package/dist/interfaces/browser-action-options.js +3 -0
  50. package/dist/interfaces/browser-action-options.js.map +1 -0
  51. package/dist/interfaces/cleansing-options.d.ts +14 -0
  52. package/dist/interfaces/cleansing-options.js +3 -0
  53. package/dist/interfaces/cleansing-options.js.map +1 -0
  54. package/dist/interfaces/cookie-options.d.ts +31 -0
  55. package/dist/interfaces/cookie-options.js +3 -0
  56. package/dist/interfaces/cookie-options.js.map +1 -0
  57. package/dist/interfaces/index.d.ts +6 -0
  58. package/dist/interfaces/index.js +23 -0
  59. package/dist/interfaces/index.js.map +1 -0
  60. package/dist/interfaces/pool-options.d.ts +6 -0
  61. package/dist/interfaces/pool-options.js +3 -0
  62. package/dist/interfaces/pool-options.js.map +1 -0
  63. package/dist/interfaces/types.d.ts +31 -0
  64. package/dist/interfaces/types.js +3 -0
  65. package/dist/interfaces/types.js.map +1 -0
  66. package/dist/interfaces/workflow-options.d.ts +50 -0
  67. package/dist/interfaces/workflow-options.js +3 -0
  68. package/dist/interfaces/workflow-options.js.map +1 -0
  69. package/dist/pipes/alt-flag.pipe.d.ts +10 -0
  70. package/dist/pipes/alt-flag.pipe.js +63 -0
  71. package/dist/pipes/alt-flag.pipe.js.map +1 -0
  72. package/dist/pipes/cleansing-pipe.d.ts +7 -0
  73. package/dist/pipes/cleansing-pipe.js +25 -0
  74. package/dist/pipes/cleansing-pipe.js.map +1 -0
  75. package/dist/pipes/date-format.pipe.d.ts +10 -0
  76. package/dist/pipes/date-format.pipe.js +88 -0
  77. package/dist/pipes/date-format.pipe.js.map +1 -0
  78. package/dist/pipes/index.d.ts +15 -0
  79. package/dist/pipes/index.js +32 -0
  80. package/dist/pipes/index.js.map +1 -0
  81. package/dist/pipes/normalize-whitespace.pipe.d.ts +8 -0
  82. package/dist/pipes/normalize-whitespace.pipe.js +49 -0
  83. package/dist/pipes/normalize-whitespace.pipe.js.map +1 -0
  84. package/dist/pipes/profiles/currency.profile.d.ts +2 -0
  85. package/dist/pipes/profiles/currency.profile.js +19 -0
  86. package/dist/pipes/profiles/currency.profile.js.map +1 -0
  87. package/dist/pipes/profiles/date.profile.d.ts +2 -0
  88. package/dist/pipes/profiles/date.profile.js +14 -0
  89. package/dist/pipes/profiles/date.profile.js.map +1 -0
  90. package/dist/pipes/profiles/email.profile.d.ts +2 -0
  91. package/dist/pipes/profiles/email.profile.js +18 -0
  92. package/dist/pipes/profiles/email.profile.js.map +1 -0
  93. package/dist/pipes/profiles/phone.profile.d.ts +2 -0
  94. package/dist/pipes/profiles/phone.profile.js +18 -0
  95. package/dist/pipes/profiles/phone.profile.js.map +1 -0
  96. package/dist/pipes/profiles/price.profile.d.ts +2 -0
  97. package/dist/pipes/profiles/price.profile.js +19 -0
  98. package/dist/pipes/profiles/price.profile.js.map +1 -0
  99. package/dist/pipes/profiles.d.ts +3 -0
  100. package/dist/pipes/profiles.js +17 -0
  101. package/dist/pipes/profiles.js.map +1 -0
  102. package/dist/pipes/regex-extract.pipe.d.ts +7 -0
  103. package/dist/pipes/regex-extract.pipe.js +73 -0
  104. package/dist/pipes/regex-extract.pipe.js.map +1 -0
  105. package/dist/pipes/regex-replace.pipe.d.ts +9 -0
  106. package/dist/pipes/regex-replace.pipe.js +59 -0
  107. package/dist/pipes/regex-replace.pipe.js.map +1 -0
  108. package/dist/pipes/remove-currency-symbol.pipe.d.ts +7 -0
  109. package/dist/pipes/remove-currency-symbol.pipe.js +65 -0
  110. package/dist/pipes/remove-currency-symbol.pipe.js.map +1 -0
  111. package/dist/pipes/remove-line-breaks.pipe.d.ts +7 -0
  112. package/dist/pipes/remove-line-breaks.pipe.js +42 -0
  113. package/dist/pipes/remove-line-breaks.pipe.js.map +1 -0
  114. package/dist/pipes/remove-special-chars.pipe.d.ts +7 -0
  115. package/dist/pipes/remove-special-chars.pipe.js +44 -0
  116. package/dist/pipes/remove-special-chars.pipe.js.map +1 -0
  117. package/dist/pipes/sanitize-text.pipe.d.ts +7 -0
  118. package/dist/pipes/sanitize-text.pipe.js +86 -0
  119. package/dist/pipes/sanitize-text.pipe.js.map +1 -0
  120. package/dist/pipes/to-lower-case.pipe.d.ts +6 -0
  121. package/dist/pipes/to-lower-case.pipe.js +16 -0
  122. package/dist/pipes/to-lower-case.pipe.js.map +1 -0
  123. package/dist/pipes/to-number.pipe.d.ts +9 -0
  124. package/dist/pipes/to-number.pipe.js +57 -0
  125. package/dist/pipes/to-number.pipe.js.map +1 -0
  126. package/dist/pipes/to-upper-case.pipe.d.ts +6 -0
  127. package/dist/pipes/to-upper-case.pipe.js +16 -0
  128. package/dist/pipes/to-upper-case.pipe.js.map +1 -0
  129. package/dist/pipes/trim.pipe.d.ts +8 -0
  130. package/dist/pipes/trim.pipe.js +44 -0
  131. package/dist/pipes/trim.pipe.js.map +1 -0
  132. package/dist/services/browser-manager.service.d.ts +15 -0
  133. package/dist/services/browser-manager.service.js +47 -0
  134. package/dist/services/browser-manager.service.js.map +1 -0
  135. package/dist/services/browser-pool.service.d.ts +26 -0
  136. package/dist/services/browser-pool.service.js +163 -0
  137. package/dist/services/browser-pool.service.js.map +1 -0
  138. package/dist/services/cleansing.service.d.ts +10 -0
  139. package/dist/services/cleansing.service.js +78 -0
  140. package/dist/services/cleansing.service.js.map +1 -0
  141. package/dist/services/cookie.service.d.ts +20 -0
  142. package/dist/services/cookie.service.js +246 -0
  143. package/dist/services/cookie.service.js.map +1 -0
  144. package/dist/services/index.d.ts +4 -0
  145. package/dist/services/index.js +21 -0
  146. package/dist/services/index.js.map +1 -0
  147. package/dist/services/page-service.d.ts +16 -0
  148. package/dist/services/page-service.js +68 -0
  149. package/dist/services/page-service.js.map +1 -0
  150. package/dist/tsconfig.build.tsbuildinfo +1 -0
  151. package/package.json +98 -0
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./cleansing-type.enum"), exports);
18
+ __exportStar(require("./cleansing-profile.enum"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/enums/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC;AACtC,2DAAyC"}
@@ -0,0 +1,41 @@
1
+ import type { Page, ScreenshotOptions, PDFOptions } from 'puppeteer';
2
+ import { PageService } from '../services/page-service';
3
+ import { CookieService } from '../services/cookie.service';
4
+ import { CleansingService } from '../services/cleansing.service';
5
+ import type { WorkflowDefinition, VariableContext } from '../interfaces/workflow-options';
6
+ import { SelectorMap, ScraperOptions, ScrapeResult, ScrapeAllResult, WorkflowResultTyped } from '../interfaces/types';
7
+ export declare class ActionHelpersService {
8
+ private readonly pageService;
9
+ private readonly cookieService;
10
+ private readonly cleansingService;
11
+ private readonly logger;
12
+ private readonly pipeCache;
13
+ constructor(pageService: PageService, cookieService: CookieService, cleansingService: CleansingService);
14
+ takeScreenshot(url: string, path: string, options?: ScreenshotOptions): Promise<Buffer>;
15
+ generatePDF(url: string, path: string, options?: PDFOptions): Promise<Buffer>;
16
+ scrape<T extends SelectorMap>(url: string, selectors: T, options?: ScraperOptions): Promise<ScrapeResult>;
17
+ scrapeAll<T extends SelectorMap>(url: string, selectors: T, options?: ScraperOptions): Promise<ScrapeAllResult>;
18
+ private extractAllData;
19
+ private extractAllFromShadowRoot;
20
+ waitForSelector(url: string, selector: string, timeout?: number): Promise<Page>;
21
+ evaluate<T = unknown>(url: string, script: string | (() => any)): Promise<T>;
22
+ scrapeWithActions<T = Record<string, unknown>>(url: string, workflow: WorkflowDefinition, variables?: VariableContext): Promise<WorkflowResultTyped<T>>;
23
+ scrapeAllWithWorkflow<T = Record<string, unknown>>(url: string, workflow: WorkflowDefinition, variables?: VariableContext): Promise<WorkflowResultTyped<T>>;
24
+ private executeAction;
25
+ private evaluateCondition;
26
+ private findElement;
27
+ private findElementInShadowRoot;
28
+ private waitForTarget;
29
+ private clickElement;
30
+ private typeText;
31
+ private selectOption;
32
+ private scrollToElement;
33
+ private maybeScrollToElement;
34
+ private scrollElementIntoView;
35
+ private getCachedPipeInstances;
36
+ private validateSelector;
37
+ private extractData;
38
+ private wait;
39
+ private resolveValue;
40
+ private interpolateValue;
41
+ }
@@ -0,0 +1,534 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var ActionHelpersService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.ActionHelpersService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const page_service_1 = require("../services/page-service");
16
+ const cookie_service_1 = require("../services/cookie.service");
17
+ const cleansing_service_1 = require("../services/cleansing.service");
18
+ const logger_util_1 = require("./logger.util");
19
+ const browser_action_constants_1 = require("../constants/browser-action.constants");
20
+ let ActionHelpersService = ActionHelpersService_1 = class ActionHelpersService {
21
+ pageService;
22
+ cookieService;
23
+ cleansingService;
24
+ logger;
25
+ pipeCache = new Map();
26
+ constructor(pageService, cookieService, cleansingService) {
27
+ this.pageService = pageService;
28
+ this.cookieService = cookieService;
29
+ this.cleansingService = cleansingService;
30
+ this.logger = new logger_util_1.LoggerWithLevel(ActionHelpersService_1.name, this.pageService.getLogLevel());
31
+ }
32
+ async takeScreenshot(url, path, options) {
33
+ this.logger.log(`Taking screenshot of ${url}`, 'debug');
34
+ const page = await this.pageService.navigateTo(url);
35
+ const result = await page.screenshot({ path, ...options });
36
+ await this.pageService.closePage();
37
+ return result;
38
+ }
39
+ async generatePDF(url, path, options) {
40
+ this.logger.log(`Generating PDF for ${url}`, 'debug');
41
+ const page = await this.pageService.navigateTo(url);
42
+ const pdf = await page.pdf({ path, ...options });
43
+ await this.pageService.closePage();
44
+ return Buffer.from(pdf);
45
+ }
46
+ async scrape(url, selectors, options) {
47
+ this.logger.log(`Scraping ${url}`, 'debug');
48
+ const page = await this.pageService.navigateTo(url);
49
+ const result = {};
50
+ for (const [key, selector] of Object.entries(selectors)) {
51
+ try {
52
+ const value = await page.$eval(selector, (el) => el.textContent);
53
+ if (options?.pipes?.[key]) {
54
+ const pipeInstances = this.getCachedPipeInstances(options.pipes[key]);
55
+ result[key] = this.cleansingService.cleanse(value, pipeInstances);
56
+ }
57
+ else {
58
+ result[key] = value;
59
+ }
60
+ }
61
+ catch {
62
+ this.logger.log(`Failed to scrape ${selector}`, 'warn');
63
+ }
64
+ }
65
+ await this.pageService.closePage();
66
+ return result;
67
+ }
68
+ async scrapeAll(url, selectors, options) {
69
+ this.logger.log(`Scraping all elements from ${url}`, 'debug');
70
+ const page = await this.pageService.navigateTo(url);
71
+ const result = {};
72
+ for (const [key, selector] of Object.entries(selectors)) {
73
+ this.validateSelector(key, selector);
74
+ try {
75
+ const trimmedSelector = selector.trim();
76
+ const isXPath = trimmedSelector.startsWith('//') || trimmedSelector.startsWith('(');
77
+ let values;
78
+ if (isXPath) {
79
+ values = await page.evaluate((xpathSelector) => {
80
+ const results = document.evaluate(xpathSelector, document, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);
81
+ const vals = [];
82
+ let node;
83
+ while ((node = results.iterateNext())) {
84
+ vals.push(node?.textContent?.trim() || '');
85
+ }
86
+ return vals;
87
+ }, selector);
88
+ }
89
+ else {
90
+ values = await page.$$eval(selector, (elements) => elements.map((el) => el.textContent?.trim() || ''));
91
+ }
92
+ if (options?.pipes?.[key]) {
93
+ const pipeInstances = this.getCachedPipeInstances(options.pipes[key]);
94
+ result[key] = values.map((value) => this.cleansingService.cleanse(value, pipeInstances));
95
+ }
96
+ else {
97
+ result[key] = values;
98
+ }
99
+ }
100
+ catch {
101
+ this.logger.log(`Failed to scrape ${selector}`, 'warn');
102
+ }
103
+ }
104
+ await this.pageService.closePage();
105
+ return result;
106
+ }
107
+ async extractAllData(page, target) {
108
+ if (target.shadowHost) {
109
+ return await this.extractAllFromShadowRoot(page, target);
110
+ }
111
+ if (target.type === 'css') {
112
+ return await page.$$eval(target.value, (elements) => elements.map((el) => el.textContent?.trim() || ''));
113
+ }
114
+ return await page.evaluate((selector) => {
115
+ const results = document.evaluate(selector, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
116
+ const values = [];
117
+ for (let i = 0; i < results.snapshotLength; i++) {
118
+ const node = results.snapshotItem(i);
119
+ values.push(node?.textContent?.trim() || '');
120
+ }
121
+ return values;
122
+ }, target.value);
123
+ }
124
+ async extractAllFromShadowRoot(page, target) {
125
+ const hosts = await page.$$(target.shadowHost);
126
+ const allResults = await Promise.all(hosts.map(async (host) => {
127
+ return await host.evaluate((el, selector, targetType) => {
128
+ const shadowRoot = el.shadowRoot;
129
+ if (!shadowRoot)
130
+ return [];
131
+ if (targetType === 'css') {
132
+ const elements = shadowRoot.querySelectorAll(selector);
133
+ return Array.from(elements).map((e) => e.textContent?.trim() || '');
134
+ }
135
+ const results = document.evaluate(selector, shadowRoot, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);
136
+ const values = [];
137
+ let node;
138
+ while ((node = results.iterateNext())) {
139
+ values.push(node?.textContent?.trim() || '');
140
+ }
141
+ return values;
142
+ }, target.value, target.type);
143
+ }));
144
+ return allResults.flat();
145
+ }
146
+ async waitForSelector(url, selector, timeout) {
147
+ this.logger.log(`Waiting for ${selector} on ${url}`, 'debug');
148
+ const page = await this.pageService.navigateTo(url);
149
+ await page.waitForSelector(selector, { timeout });
150
+ return page;
151
+ }
152
+ async evaluate(url, script) {
153
+ this.logger.log(`Evaluating script on ${url}`, 'debug');
154
+ const page = await this.pageService.navigateTo(url);
155
+ const result = await page.evaluate(script);
156
+ await this.pageService.closePage();
157
+ return result;
158
+ }
159
+ async scrapeWithActions(url, workflow, variables) {
160
+ this.logger.log(`Starting workflow execution for ${url}`, 'debug');
161
+ const page = await this.pageService.navigateTo(url);
162
+ const result = {
163
+ success: false,
164
+ data: {},
165
+ errors: [],
166
+ screenshots: [],
167
+ };
168
+ try {
169
+ const context = variables || {};
170
+ const errorConfig = workflow.onError || {};
171
+ for (const action of workflow.actions) {
172
+ try {
173
+ await this.executeAction(page, action, context);
174
+ }
175
+ catch (error) {
176
+ const errorMessage = error instanceof Error ? error.message : String(error);
177
+ this.logger.log(`Action failed: ${errorMessage}`, 'error');
178
+ if (action.onError === 'continue' || action.onError === 'skip') {
179
+ continue;
180
+ }
181
+ if (errorConfig.screenshot) {
182
+ const screenshotPath = errorConfig.screenshotPath ||
183
+ `${browser_action_constants_1.DEFAULT_ERROR_SCREENSHOT_FILENAME}-${Date.now()}.png`;
184
+ await page.screenshot({ path: screenshotPath });
185
+ result.screenshots?.push(screenshotPath);
186
+ }
187
+ if (!errorConfig.continue) {
188
+ result.errors.push(errorMessage);
189
+ await this.pageService.closePage();
190
+ return result;
191
+ }
192
+ }
193
+ }
194
+ result.success = true;
195
+ result.data = context;
196
+ }
197
+ catch (error) {
198
+ const errorMessage = error instanceof Error ? error.message : String(error);
199
+ result.errors.push(errorMessage);
200
+ this.logger.log(`Workflow execution failed: ${errorMessage}`, 'error');
201
+ }
202
+ finally {
203
+ await this.pageService.closePage();
204
+ }
205
+ return result;
206
+ }
207
+ async scrapeAllWithWorkflow(url, workflow, variables) {
208
+ return await this.scrapeWithActions(url, workflow, variables);
209
+ }
210
+ async executeAction(page, action, context) {
211
+ if (action.condition) {
212
+ const shouldExecute = await this.evaluateCondition(page, action.condition);
213
+ if (!shouldExecute) {
214
+ this.logger.log(`Skipping action due to condition: ${action.action}`, 'debug');
215
+ return;
216
+ }
217
+ }
218
+ const value = this.interpolateValue(String(action.value || ''), context);
219
+ switch (action.action) {
220
+ case 'navigate':
221
+ await page.goto(value);
222
+ break;
223
+ case 'wait':
224
+ await this.wait(Number(action.value) || 0);
225
+ break;
226
+ case 'waitFor':
227
+ await this.waitForTarget(page, action.target, action.options);
228
+ break;
229
+ case 'click':
230
+ await this.clickElement(page, action.target, action.options);
231
+ break;
232
+ case 'type':
233
+ await this.typeText(page, action.target, value, action.options);
234
+ break;
235
+ case 'select':
236
+ await this.selectOption(page, action.target, value, action.options);
237
+ break;
238
+ case 'scroll':
239
+ await this.scrollToElement(page, action.target);
240
+ break;
241
+ case 'extract': {
242
+ const extractOptions = action.options || {};
243
+ if (extractOptions.multiple) {
244
+ const allValues = await this.extractAllData(page, action.target);
245
+ if (action.id) {
246
+ context[action.id] = allValues;
247
+ }
248
+ }
249
+ else {
250
+ const extractedValue = await this.extractData(page, action.target);
251
+ if (action.id) {
252
+ context[action.id] = extractedValue;
253
+ }
254
+ }
255
+ break;
256
+ }
257
+ case 'screenshot': {
258
+ const screenshotPath = String(action.value || `${browser_action_constants_1.DEFAULT_SCREENSHOT_FILENAME}-${Date.now()}.png`);
259
+ await page.screenshot({ path: screenshotPath });
260
+ break;
261
+ }
262
+ case 'evaluate': {
263
+ let evalCode;
264
+ if (value.includes('=>')) {
265
+ evalCode = `(${value})()`;
266
+ }
267
+ else {
268
+ evalCode = value;
269
+ }
270
+ this.logger.log(`Evaluating: ${evalCode}`, 'debug');
271
+ const evalResult = await page.evaluate(evalCode);
272
+ this.logger.log(`Result: ${JSON.stringify(evalResult)}`, 'debug');
273
+ if (action.id) {
274
+ context[action.id] = evalResult;
275
+ }
276
+ break;
277
+ }
278
+ case 'cleanse': {
279
+ const pipes = (action.options?.pipes || []);
280
+ if (pipes.length === 0) {
281
+ throw new Error('cleanse action requires at least one pipe');
282
+ }
283
+ const currentValue = this.resolveValue(String(action.value || ''), context);
284
+ const pipeInstances = this.cleansingService.loadPipes(pipes);
285
+ const cleanedValue = this.cleansingService.cleanse(currentValue, pipeInstances);
286
+ if (action.id) {
287
+ context[action.id] = cleanedValue;
288
+ this.logger.log(`Cleansed value for '${action.id}': ${JSON.stringify(cleanedValue)}`, 'debug');
289
+ }
290
+ break;
291
+ }
292
+ case 'saveCookies': {
293
+ const sessionName = String(value);
294
+ const overwrite = action.options?.overwrite ?? false;
295
+ const metadata = {};
296
+ if (action.options?.metadata) {
297
+ Object.assign(metadata, action.options.metadata);
298
+ }
299
+ await this.cookieService.saveCookies(page, sessionName, {
300
+ overwrite,
301
+ metadata,
302
+ });
303
+ break;
304
+ }
305
+ case 'loadCookies': {
306
+ const sessionName = String(value);
307
+ const throwIfNotExists = action.onError !== 'skip' && action.onError !== 'continue';
308
+ await this.cookieService.loadCookies(page, sessionName, {
309
+ throwIfNotExists,
310
+ });
311
+ break;
312
+ }
313
+ case 'clearCookies': {
314
+ const sessionName = String(value);
315
+ await this.cookieService.deleteCookies(sessionName);
316
+ break;
317
+ }
318
+ case 'listCookies': {
319
+ const sessions = await this.cookieService.listCookies();
320
+ if (action.id) {
321
+ context[action.id] = sessions;
322
+ }
323
+ break;
324
+ }
325
+ default: {
326
+ const exhaustiveCheck = action.action;
327
+ throw new Error(`Unknown action type: ${String(exhaustiveCheck)}`);
328
+ }
329
+ }
330
+ }
331
+ async evaluateCondition(page, condition) {
332
+ if (!condition)
333
+ return true;
334
+ if (condition.ifExists) {
335
+ const element = await this.findElement(page, condition.ifExists);
336
+ return element !== null;
337
+ }
338
+ if (condition.unlessExists) {
339
+ const element = await this.findElement(page, condition.unlessExists);
340
+ return element === null;
341
+ }
342
+ return true;
343
+ }
344
+ async findElement(page, target) {
345
+ if (target.shadowHost) {
346
+ return this.findElementInShadowRoot(page, target);
347
+ }
348
+ if (target.type === 'css') {
349
+ return page.$(target.value);
350
+ }
351
+ return page
352
+ .evaluateHandle((selector) => {
353
+ const result = document.evaluate(selector, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
354
+ return result.singleNodeValue;
355
+ }, target.value)
356
+ .then((handle) => handle.asElement());
357
+ }
358
+ async findElementInShadowRoot(page, target) {
359
+ const host = await page.$(target.shadowHost);
360
+ if (!host)
361
+ return null;
362
+ return host
363
+ .evaluateHandle((el, selector, targetType) => {
364
+ const shadowRoot = el.shadowRoot;
365
+ if (!shadowRoot)
366
+ return null;
367
+ if (targetType === 'css') {
368
+ return shadowRoot.querySelector(selector);
369
+ }
370
+ const result = document.evaluate(selector, shadowRoot, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
371
+ return result.singleNodeValue;
372
+ }, target.value, target.type)
373
+ .then((handle) => handle.asElement());
374
+ }
375
+ async waitForTarget(page, target, options) {
376
+ const timeout = options?.timeout || browser_action_constants_1.DEFAULT_ACTION_TIMEOUT;
377
+ if (target.type === 'css') {
378
+ await page.waitForSelector(target.value, { timeout });
379
+ }
380
+ else {
381
+ await page.waitForFunction((selector) => {
382
+ const result = document.evaluate(selector, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
383
+ return result.singleNodeValue !== null;
384
+ }, { timeout }, target.value);
385
+ }
386
+ }
387
+ async clickElement(page, target, options) {
388
+ const element = await this.findElement(page, target);
389
+ if (!element) {
390
+ throw new Error(`Element not found: ${target.value}`);
391
+ }
392
+ await this.maybeScrollToElement(element, options?.scrollTo);
393
+ const elem = element;
394
+ await elem.click();
395
+ if (options?.waitForNavigation) {
396
+ await page.waitForNavigation({
397
+ timeout: options.navigationTimeout || browser_action_constants_1.DEFAULT_NAVIGATION_TIMEOUT,
398
+ });
399
+ }
400
+ }
401
+ async typeText(page, target, value, options) {
402
+ const element = await this.findElement(page, target);
403
+ if (!element) {
404
+ throw new Error(`Element not found: ${target.value}`);
405
+ }
406
+ await this.maybeScrollToElement(element, options?.scrollTo);
407
+ const elem = element;
408
+ await elem.click();
409
+ const delay = options?.delay || 0;
410
+ await elem.type(value, { delay });
411
+ }
412
+ async selectOption(page, target, value, options) {
413
+ const element = await this.findElement(page, target);
414
+ if (!element) {
415
+ throw new Error(`Element not found: ${target.value}`);
416
+ }
417
+ await this.maybeScrollToElement(element, options?.scrollTo);
418
+ const elem = element;
419
+ await elem.select(value);
420
+ }
421
+ async scrollToElement(page, target) {
422
+ const element = await this.findElement(page, target);
423
+ if (!element) {
424
+ throw new Error(`Element not found: ${target.value}`);
425
+ }
426
+ await this.scrollElementIntoView(element);
427
+ }
428
+ async maybeScrollToElement(element, shouldScroll) {
429
+ if (shouldScroll) {
430
+ await this.scrollElementIntoView(element);
431
+ }
432
+ }
433
+ async scrollElementIntoView(element) {
434
+ await element.evaluate((el) => el.scrollIntoView({ behavior: 'smooth', block: 'center' }), {});
435
+ await this.wait(browser_action_constants_1.DEFAULT_SCROLL_DELAY_MS / 1000);
436
+ }
437
+ getCachedPipeInstances(config) {
438
+ const cacheKey = JSON.stringify(config);
439
+ if (!this.pipeCache.has(cacheKey)) {
440
+ this.pipeCache.set(cacheKey, this.cleansingService.loadPipes(config));
441
+ }
442
+ return this.pipeCache.get(cacheKey);
443
+ }
444
+ validateSelector(key, selector) {
445
+ if (!selector || selector.trim() === '') {
446
+ throw new Error(`Selector for '${key}' cannot be empty`);
447
+ }
448
+ }
449
+ async extractData(page, target) {
450
+ const element = await this.findElement(page, target);
451
+ if (!element) {
452
+ throw new Error(`Element not found: ${target.value}`);
453
+ }
454
+ return element.evaluate((el) => el.textContent?.trim() || '', {});
455
+ }
456
+ wait(seconds) {
457
+ return new Promise((resolve) => setTimeout(resolve, seconds * 1000));
458
+ }
459
+ resolveValue(value, context) {
460
+ if (value.startsWith('${') && value.endsWith('}')) {
461
+ const path = value.slice(2, -1);
462
+ if (!path.includes('${')) {
463
+ const keys = path.split('.');
464
+ let result = context;
465
+ for (const key of keys) {
466
+ const arrayMatch = key.match(/^(\w+)\[(\d+)\]$/);
467
+ if (arrayMatch) {
468
+ const [, arrayKey, indexStr] = arrayMatch;
469
+ if (!result || typeof result !== 'object') {
470
+ return value;
471
+ }
472
+ const arrayValue = result[arrayKey];
473
+ const index = parseInt(indexStr, 10);
474
+ result = Array.isArray(arrayValue) ? arrayValue[index] : undefined;
475
+ }
476
+ else {
477
+ if (!result || typeof result !== 'object') {
478
+ return value;
479
+ }
480
+ result = result[key];
481
+ }
482
+ if (result === undefined) {
483
+ return value;
484
+ }
485
+ }
486
+ if (result === null || typeof result === 'object') {
487
+ return value;
488
+ }
489
+ return result;
490
+ }
491
+ return this.interpolateValue(path, context);
492
+ }
493
+ return value;
494
+ }
495
+ interpolateValue(value, context) {
496
+ return value.replace(/\$\{([^}]+)\}/g, (_match, path) => {
497
+ const keys = path.split('.');
498
+ let result = context;
499
+ for (const key of keys) {
500
+ const arrayMatch = key.match(/^(\w+)\[(\d+)\]$/);
501
+ if (arrayMatch) {
502
+ const [, arrayKey, indexStr] = arrayMatch;
503
+ if (!result || typeof result !== 'object') {
504
+ return '';
505
+ }
506
+ const arrayValue = result[arrayKey];
507
+ const index = parseInt(indexStr, 10);
508
+ result = Array.isArray(arrayValue) ? arrayValue[index] : undefined;
509
+ }
510
+ else {
511
+ if (!result || typeof result !== 'object') {
512
+ return '';
513
+ }
514
+ result = result[key];
515
+ }
516
+ if (result === undefined) {
517
+ return '';
518
+ }
519
+ }
520
+ if (result === null || typeof result === 'object') {
521
+ return '';
522
+ }
523
+ return result;
524
+ });
525
+ }
526
+ };
527
+ exports.ActionHelpersService = ActionHelpersService;
528
+ exports.ActionHelpersService = ActionHelpersService = ActionHelpersService_1 = __decorate([
529
+ (0, common_1.Injectable)(),
530
+ __metadata("design:paramtypes", [page_service_1.PageService,
531
+ cookie_service_1.CookieService,
532
+ cleansing_service_1.CleansingService])
533
+ ], ActionHelpersService);
534
+ //# sourceMappingURL=action-helpers.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-helpers.service.js","sourceRoot":"","sources":["../../src/helpers/action-helpers.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function extractTextContent(el: Element | Node | null): string;
2
+ export declare function evaluateXPathAll(selector: string, root: Document | ShadowRoot): string[];
3
+ export declare function evaluateXPathFirst(selector: string, root: Document | ShadowRoot): Element | null;
4
+ export declare function isXPathSelector(selector: string): boolean;