@intuned/browser-dev 2.2.3-unify-sdks.20

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 (195) hide show
  1. package/.babelrc +21 -0
  2. package/.eslintignore +10 -0
  3. package/.eslintrc.js +39 -0
  4. package/LICENSE +43 -0
  5. package/dist/ai-extractors/AnthropicClient/index.js +23 -0
  6. package/dist/ai-extractors/export.d.js +5 -0
  7. package/dist/ai-extractors/export.d.ts +422 -0
  8. package/dist/ai-extractors/extractStructuredData.js +79 -0
  9. package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/constants.js +7 -0
  10. package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/errors.js +42 -0
  11. package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/extractStructuredDataUsingClaude.js +149 -0
  12. package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/extractStructuredDataUsingGoogle.js +37 -0
  13. package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/extractStructuredDataUsingOpenAi.js +144 -0
  14. package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/extractStrucutredDataUsingAiInstance.js +123 -0
  15. package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/index.js +55 -0
  16. package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/isItemTableHeaderOrFooter.js +96 -0
  17. package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/screenshotHelpers.js +55 -0
  18. package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/types.js +5 -0
  19. package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/utils.js +53 -0
  20. package/dist/ai-extractors/extractionHelpers/types.js +5 -0
  21. package/dist/ai-extractors/fileExtractors.js +176 -0
  22. package/dist/ai-extractors/index.js +31 -0
  23. package/dist/ai-extractors/jsonSchema.d.js +5 -0
  24. package/dist/ai-extractors/jsonSchema.d.ts +49 -0
  25. package/dist/ai-extractors/openAiClients/index.js +23 -0
  26. package/dist/ai-extractors/validators.js +239 -0
  27. package/dist/browser/ai/export.d.js +3 -0
  28. package/dist/browser/ai/export.d.ts +587 -0
  29. package/dist/browser/ai/extractMarkdown.js +15 -0
  30. package/dist/browser/ai/extractStructuredData.js +231 -0
  31. package/dist/browser/ai/extractStructuredDataUsingAi.js +140 -0
  32. package/dist/browser/ai/extractionHelpers/screenshotHelpers.js +55 -0
  33. package/dist/browser/ai/extractionHelpers/validateSchema.js +148 -0
  34. package/dist/browser/ai/index.d.ts +587 -0
  35. package/dist/browser/ai/index.js +19 -0
  36. package/dist/browser/ai/isPageLoaded.js +67 -0
  37. package/dist/browser/ai/prompt.js +39 -0
  38. package/dist/browser/ai/tests/testCheckAllTypesAreStrings.spec.js +143 -0
  39. package/dist/browser/ai/tests/testExtractStructuredData.spec.js +622 -0
  40. package/dist/browser/ai/tools/index.js +48 -0
  41. package/dist/browser/ai/types/errors.js +67 -0
  42. package/dist/browser/ai/types/models.js +45 -0
  43. package/dist/browser/ai/types/types.js +48 -0
  44. package/dist/browser/ai/validators.js +136 -0
  45. package/dist/common/Logger/index.js +60 -0
  46. package/dist/common/Logger/types.js +5 -0
  47. package/dist/common/SdkError.js +50 -0
  48. package/dist/common/aiModelsValidations.js +50 -0
  49. package/dist/common/browser_scripts.js +2596 -0
  50. package/dist/common/ensureBrowserScripts.js +17 -0
  51. package/dist/common/environmentVariables.js +16 -0
  52. package/dist/common/eventTracking/getAiTrackingHeaders.js +31 -0
  53. package/dist/common/eventTracking/getFileTrackingHeaders.js +23 -0
  54. package/dist/common/extendedTest.js +148 -0
  55. package/dist/common/extractionHelpers.js +19 -0
  56. package/dist/common/formatZodError.js +18 -0
  57. package/dist/common/fuzzySearch/fuzzySearch.test.js +250 -0
  58. package/dist/common/fuzzySearch/levenshtein-search.js +298 -0
  59. package/dist/common/fuzzySearch/utils.js +23 -0
  60. package/dist/common/getModelProvider.js +18 -0
  61. package/dist/common/getSimplifiedHtml.js +122 -0
  62. package/dist/common/hashObject.js +32 -0
  63. package/dist/common/html2markdown/convertElementToMarkdown.js +469 -0
  64. package/dist/common/html2markdown/index.js +19 -0
  65. package/dist/common/jwtTokenManager.js +18 -0
  66. package/dist/common/loadRuntime.js +16 -0
  67. package/dist/common/locatorHelpers.js +41 -0
  68. package/dist/common/matching/collectStrings.js +32 -0
  69. package/dist/common/matching/levenshtein.js +40 -0
  70. package/dist/common/matching/matching.js +317 -0
  71. package/dist/common/matching/types.js +1 -0
  72. package/dist/common/noEmpty.js +9 -0
  73. package/dist/common/saveSnapshotWithExamples.js +60 -0
  74. package/dist/common/tests/testEnsureBrowserScript.spec.js +31 -0
  75. package/dist/common/xpathMapping.js +107 -0
  76. package/dist/helpers/downloadFile.js +125 -0
  77. package/dist/helpers/export.d.js +1 -0
  78. package/dist/helpers/export.d.ts +1294 -0
  79. package/dist/helpers/extractMarkdown.js +35 -0
  80. package/dist/helpers/filterEmptyValues.js +54 -0
  81. package/dist/helpers/gotoUrl.js +93 -0
  82. package/dist/helpers/index.d.ts +1294 -0
  83. package/dist/helpers/index.js +115 -0
  84. package/dist/helpers/processDate.js +25 -0
  85. package/dist/helpers/resolveUrl.js +63 -0
  86. package/dist/helpers/sanitizeHtml.js +73 -0
  87. package/dist/helpers/saveFileToS3.js +46 -0
  88. package/dist/helpers/scrollToLoadContent.js +50 -0
  89. package/dist/helpers/tests/extendedTest.js +130 -0
  90. package/dist/helpers/tests/testDownloadFile.spec.js +197 -0
  91. package/dist/helpers/tests/testFilterEmptyValues.spec.js +151 -0
  92. package/dist/helpers/tests/testGoToUrl.spec.js +37 -0
  93. package/dist/helpers/tests/testIsPageLoaded.spec.js +285 -0
  94. package/dist/helpers/tests/testProcessDate.spec.js +13 -0
  95. package/dist/helpers/tests/testResolveUrl.spec.js +341 -0
  96. package/dist/helpers/tests/testSanitizeHtml.spec.js +330 -0
  97. package/dist/helpers/tests/testSimplifyHtml.spec.js +251 -0
  98. package/dist/helpers/tests/testValidateDataUsingSchema.spec.js +380 -0
  99. package/dist/helpers/tests/testWaitForDomSettled.spec.js +169 -0
  100. package/dist/helpers/tests/testWaitForNetworkIdle.spec.js +115 -0
  101. package/dist/helpers/types/Attachment.js +81 -0
  102. package/dist/helpers/types/CustomTypeRegistry.js +48 -0
  103. package/dist/helpers/types/RunEnvironment.js +18 -0
  104. package/dist/helpers/types/ValidationError.js +17 -0
  105. package/dist/helpers/types/index.js +51 -0
  106. package/dist/helpers/uploadFileToS3.js +153 -0
  107. package/dist/helpers/utils/getS3Client.js +21 -0
  108. package/dist/helpers/utils/index.js +73 -0
  109. package/dist/helpers/utils/isDownload.js +10 -0
  110. package/dist/helpers/utils/isGenerateCodeMode.js +9 -0
  111. package/dist/helpers/utils/isLocator.js +9 -0
  112. package/dist/helpers/utils/jwtTokenManager.js +18 -0
  113. package/dist/helpers/validateDataUsingSchema.js +119 -0
  114. package/dist/helpers/waitForDomSettled.js +182 -0
  115. package/dist/helpers/waitForNetworkIdle.js +191 -0
  116. package/dist/index.d.js +82 -0
  117. package/dist/index.d.ts +11 -0
  118. package/dist/index.js +84 -0
  119. package/dist/intunedServices/ApiGateway/aiApiGateway.js +87 -0
  120. package/dist/intunedServices/ApiGateway/factory.js +13 -0
  121. package/dist/intunedServices/ApiGateway/providers/Anthropic.js +26 -0
  122. package/dist/intunedServices/ApiGateway/providers/Gemini.js +29 -0
  123. package/dist/intunedServices/ApiGateway/providers/OpenAI.js +29 -0
  124. package/dist/intunedServices/ApiGateway/tests/testApiGateway.spec.js +221 -0
  125. package/dist/intunedServices/ApiGateway/types.js +11 -0
  126. package/dist/intunedServices/cache/cache.js +61 -0
  127. package/dist/intunedServices/cache/index.js +12 -0
  128. package/dist/intunedServices/cache/tests/testCache.spec.js +117 -0
  129. package/dist/optimized-extractors/common/buildExamplesPrompt.js +12 -0
  130. package/dist/optimized-extractors/common/buildImagesFromPage.js +55 -0
  131. package/dist/optimized-extractors/common/extractStructuredDataUsingClaude.js +149 -0
  132. package/dist/optimized-extractors/common/extractStructuredDataUsingGoogle.js +37 -0
  133. package/dist/optimized-extractors/common/extractStructuredDataUsingOpenAi.js +145 -0
  134. package/dist/optimized-extractors/common/extractStrucutredDataUsingAiInstance.js +122 -0
  135. package/dist/optimized-extractors/common/findTableHeaders.js +175 -0
  136. package/dist/optimized-extractors/common/index.js +55 -0
  137. package/dist/optimized-extractors/common/isTableHeaderOrFooter.js +97 -0
  138. package/dist/optimized-extractors/common/matching/matching.js +212 -0
  139. package/dist/optimized-extractors/common/matching/matching.test.js +655 -0
  140. package/dist/optimized-extractors/common/matching/types.js +18 -0
  141. package/dist/optimized-extractors/common/matching/utils.js +184 -0
  142. package/dist/optimized-extractors/common/utils.js +58 -0
  143. package/dist/optimized-extractors/export.d.js +5 -0
  144. package/dist/optimized-extractors/export.d.ts +397 -0
  145. package/dist/optimized-extractors/extractArray.js +120 -0
  146. package/dist/optimized-extractors/extractObject.js +104 -0
  147. package/dist/optimized-extractors/index.d.ts +397 -0
  148. package/dist/optimized-extractors/index.js +31 -0
  149. package/dist/optimized-extractors/listExtractionHelpers/__tests__/dynamicListExtractor.spec.js +312 -0
  150. package/dist/optimized-extractors/listExtractionHelpers/__tests__/findSetOfXpathsToCreateAnArrayExtractor.test.js +22 -0
  151. package/dist/optimized-extractors/listExtractionHelpers/__tests__/getContainerElement.test.js +21 -0
  152. package/dist/optimized-extractors/listExtractionHelpers/__tests__/partOfSameArrayXpath.test.js +42 -0
  153. package/dist/optimized-extractors/listExtractionHelpers/__tests__/verifyThatAllXpathsArePartOfSameArray.test.js +9 -0
  154. package/dist/optimized-extractors/listExtractionHelpers/dynamicListExtractor.js +152 -0
  155. package/dist/optimized-extractors/listExtractionHelpers/errors.js +46 -0
  156. package/dist/optimized-extractors/listExtractionHelpers/getListMatches.js +14 -0
  157. package/dist/optimized-extractors/listExtractionHelpers/runAiExtraction.js +240 -0
  158. package/dist/optimized-extractors/listExtractionHelpers/typesAndSchema.js +5 -0
  159. package/dist/optimized-extractors/listExtractionHelpers/utils/extractPropertiesUsingGPTFromArray.js +277 -0
  160. package/dist/optimized-extractors/listExtractionHelpers/utils/extractStructuredListUsingAi.js +44 -0
  161. package/dist/optimized-extractors/listExtractionHelpers/utils/getListContainerXpath.js +94 -0
  162. package/dist/optimized-extractors/listExtractionHelpers/utils/getRelativeContainerXpathSelector.js +20 -0
  163. package/dist/optimized-extractors/listExtractionHelpers/utils/getSimplifiedHtmlPerListItem.js +21 -0
  164. package/dist/optimized-extractors/listExtractionHelpers/utils/tablesUtils.js +48 -0
  165. package/dist/optimized-extractors/listExtractionHelpers/utils/validateOptions.js +52 -0
  166. package/dist/optimized-extractors/models/anthropicModel.js +23 -0
  167. package/dist/optimized-extractors/models/openaiModel.js +23 -0
  168. package/dist/optimized-extractors/objectExtractionHelpers/AIExtractors.js +73 -0
  169. package/dist/optimized-extractors/objectExtractionHelpers/__tests__/checksumUtils.test.js +103 -0
  170. package/dist/optimized-extractors/objectExtractionHelpers/__tests__/testObjectExtractorFromLocator.spec.js +107 -0
  171. package/dist/optimized-extractors/objectExtractionHelpers/__tests__/testObjectExtractorFromPage.spec.js +107 -0
  172. package/dist/optimized-extractors/objectExtractionHelpers/calculateObjectExampleHash.js +28 -0
  173. package/dist/optimized-extractors/objectExtractionHelpers/captureSnapshot.js +26 -0
  174. package/dist/optimized-extractors/objectExtractionHelpers/checksumUtils.js +32 -0
  175. package/dist/optimized-extractors/objectExtractionHelpers/constants.js +7 -0
  176. package/dist/optimized-extractors/objectExtractionHelpers/dynamicObjectExtractor.js +106 -0
  177. package/dist/optimized-extractors/objectExtractionHelpers/errors.js +42 -0
  178. package/dist/optimized-extractors/objectExtractionHelpers/findDomMatches.js +54 -0
  179. package/dist/optimized-extractors/objectExtractionHelpers/getSimplifiedHtml.js +122 -0
  180. package/dist/optimized-extractors/objectExtractionHelpers/typesAndSchemas.js +5 -0
  181. package/dist/optimized-extractors/objectExtractionHelpers/validateDynamicObjectExtractorOptions.js +52 -0
  182. package/dist/optimized-extractors/types/aiModelsValidation.js +45 -0
  183. package/dist/optimized-extractors/types/errors.js +42 -0
  184. package/dist/optimized-extractors/types/jsonSchema.d.js +5 -0
  185. package/dist/optimized-extractors/types/jsonSchema.d.ts +50 -0
  186. package/dist/optimized-extractors/types/types.js +5 -0
  187. package/dist/optimized-extractors/validators.js +152 -0
  188. package/dist/vite-env.d.js +1 -0
  189. package/dist/vite-env.d.ts +9 -0
  190. package/docs.md +14 -0
  191. package/how-to-run-tests.md +10 -0
  192. package/intuned-runtime-setup.md +13 -0
  193. package/package.json +124 -0
  194. package/tsconfig.eslint.json +5 -0
  195. package/tsconfig.json +26 -0
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+
3
+ var _extendedTest = require("./extendedTest");
4
+ var _playwrightCore = require("playwright-core");
5
+ var _fs = _interopRequireDefault(require("fs"));
6
+ var _ = require("..");
7
+ var _promises = require("fs/promises");
8
+ var _os = require("os");
9
+ var _path = require("path");
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ const content = `
12
+ <!DOCTYPE html>
13
+ <html lang="en">
14
+ <head>
15
+ <meta charset="UTF-8">
16
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
17
+ <title>Test Fixture Page</title>
18
+ </head>
19
+ <body>
20
+ <h1>Test Fixture Page</h1>
21
+ <p>This is a simple HTML page used for testing purposes.</p>
22
+ <div>
23
+ <h3>Downloadable Image</h3>
24
+ <p>Image for download:</p>
25
+ <img src="https://cdn11.bigcommerce.com/s-scmrv6kkrz/images/stencil/1280x1280/products/192719/166712/1891-clear-14-vdc-miniature-lb93__16581.1568390384.jpg?c=2" alt="Sample placeholder image" width="400" height="300">
26
+ <br>
27
+ <a href="https://cdn11.bigcommerce.com/s-scmrv6kkrz/images/stencil/1280x1280/products/192719/166712/1891-clear-14-vdc-miniature-lb93__16581.1568390384.jpg?c=2" download="sample-image.png">Download Image</a>
28
+ </div>
29
+
30
+ <div>
31
+ <h3>Download normal file</h3>
32
+ <a href="https://intuned-docs-public-images.s3.amazonaws.com/32UP83A_ENG_US.pdf" download="sample-file.txt">Download Text File</a>
33
+ </div>
34
+
35
+ <div>
36
+ <h3>Large PDF Download</h3>
37
+ <a href="https://intuned-docs-public-images.s3.us-west-2.amazonaws.com/large_pdf.pdf">Download Text File</a>
38
+ </div>
39
+
40
+ </body>
41
+ </html>
42
+ `;
43
+ async function createUserDirWithPreferences() {
44
+ const tempDir = await (0, _promises.mkdtemp)((0, _path.join)((0, _os.tmpdir)(), "pw-"));
45
+ const userDir = (0, _path.join)(tempDir, "userdir");
46
+ const defaultDir = (0, _path.join)(userDir, "Default");
47
+ await (0, _promises.mkdir)(defaultDir, {
48
+ recursive: true
49
+ });
50
+ const preferences = {
51
+ plugins: {
52
+ always_open_pdf_externally: true
53
+ }
54
+ };
55
+ const preferencesPath = (0, _path.join)(defaultDir, "Preferences");
56
+ await (0, _promises.writeFile)(preferencesPath, JSON.stringify(preferences));
57
+ return (0, _path.resolve)(userDir);
58
+ }
59
+ _extendedTest.describe.skip("TestNotInGeneration", () => {
60
+ let context;
61
+ let page;
62
+ (0, _extendedTest.beforeAll)(async () => {
63
+ const dir = await createUserDirWithPreferences();
64
+ process.env.MODE = "";
65
+ context = await _playwrightCore.chromium.launchPersistentContext(dir, {
66
+ headless: false,
67
+ args: ["--no-first-run", "--disable-sync", "--disable-translate", "--disable-features=TranslateUI", "--disable-features=NetworkService", "--lang=en", "--disable-blink-features=AutomationControlled"],
68
+ acceptDownloads: true
69
+ });
70
+ });
71
+ (0, _extendedTest.afterAll)(async () => {
72
+ await context.close();
73
+ });
74
+ (0, _extendedTest.beforeEach)(async () => {
75
+ page = await context.newPage();
76
+ });
77
+ (0, _extendedTest.afterEach)(async () => {
78
+ await page.close();
79
+ });
80
+ (0, _extendedTest.test)("should not cancel download", async () => {
81
+ await page.setContent(content);
82
+ const download = await (0, _.downloadFile)({
83
+ page,
84
+ trigger: "https://intuned-docs-public-images.s3.amazonaws.com/32UP83A_ENG_US.pdf"
85
+ });
86
+ const downloadPath = await download.path();
87
+ (0, _extendedTest.expect)(download.suggestedFilename()).toBeDefined();
88
+ (0, _extendedTest.expect)(downloadPath).toBeDefined();
89
+ });
90
+ (0, _extendedTest.test)("should download image successfully", async () => {
91
+ await page.setContent(content);
92
+ const downloadedImage = await (0, _.downloadFile)({
93
+ page,
94
+ trigger: "https://cdn11.bigcommerce.com/s-scmrv6kkrz/images/stencil/1280x1280/products/192719/166712/1891-clear-14-vdc-miniature-lb93__16581.1568390384.jpg?c=2"
95
+ });
96
+ const path = await downloadedImage.path();
97
+ (0, _extendedTest.expect)(path).toBeDefined();
98
+ (0, _extendedTest.expect)(String(path)).toContain("/var/folders/");
99
+ });
100
+ (0, _extendedTest.test)("should upload image to s3", async () => {
101
+ await page.setContent(content);
102
+ const downloadedImage = await (0, _.downloadFile)({
103
+ page,
104
+ trigger: "https://cdn11.bigcommerce.com/s-scmrv6kkrz/images/stencil/1280x1280/products/192719/166712/1891-clear-14-vdc-miniature-lb93__16581.1568390384.jpg?c=2"
105
+ });
106
+ (0, _extendedTest.expect)(downloadedImage).toBeDefined();
107
+ const path = await downloadedImage.path();
108
+ (0, _extendedTest.expect)(_fs.default.existsSync(path)).toBe(true);
109
+ const uploadedFile = await (0, _.uploadFileToS3)({
110
+ file: downloadedImage
111
+ });
112
+ (0, _extendedTest.expect)(_fs.default.existsSync(path)).toBe(false);
113
+ (0, _extendedTest.expect)(uploadedFile.suggestedFileName).toBeDefined();
114
+ (0, _extendedTest.expect)(uploadedFile.bucket).toBe(process.env.INTUNED_S3_BUCKET);
115
+ });
116
+ (0, _extendedTest.test)("should upload file to s3", async () => {
117
+ await page.setContent(content);
118
+ const download = await (0, _.downloadFile)({
119
+ page,
120
+ trigger: "https://intuned-docs-public-images.s3.amazonaws.com/32UP83A_ENG_US.pdf"
121
+ });
122
+ _extendedTest.expect;
123
+ const uploadedFile = await (0, _.uploadFileToS3)({
124
+ file: download
125
+ });
126
+ (0, _extendedTest.expect)(uploadedFile.suggestedFileName).toBeDefined();
127
+ (0, _extendedTest.expect)(uploadedFile.bucket).toBe(process.env.INTUNED_S3_BUCKET);
128
+ });
129
+ });
130
+ (0, _extendedTest.describe)("TestInGeneration", () => {
131
+ let context;
132
+ let page;
133
+ (0, _extendedTest.beforeAll)(async () => {
134
+ process.env.MODE = "generate_code";
135
+ const dir = await createUserDirWithPreferences();
136
+ context = await _playwrightCore.chromium.launchPersistentContext(dir, {
137
+ headless: false,
138
+ userAgent: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36",
139
+ args: ["--no-first-run", "--disable-sync", "--disable-translate", "--disable-features=TranslateUI", "--disable-features=NetworkService", "--lang=en", "--disable-blink-features=AutomationControlled"],
140
+ acceptDownloads: true
141
+ });
142
+ });
143
+ (0, _extendedTest.afterAll)(async () => {
144
+ await context.close();
145
+ });
146
+ (0, _extendedTest.beforeEach)(async () => {
147
+ page = await context.newPage();
148
+ });
149
+ (0, _extendedTest.afterEach)(async () => {
150
+ await page.close();
151
+ });
152
+ (0, _extendedTest.test)("should cancel download", async () => {
153
+ await page.setContent(content);
154
+ const largePdfLocator = page.locator("xpath=//a[contains(@href, 'large_pdf.pdf')]");
155
+ const downloadedFile = await (0, _.downloadFile)({
156
+ page,
157
+ trigger: largePdfLocator
158
+ });
159
+ await (0, _extendedTest.expect)(async () => {
160
+ await downloadedFile.path();
161
+ }).rejects.toThrow(/canceled/);
162
+ });
163
+ (0, _extendedTest.test)("should download image successfully", async () => {
164
+ await page.setContent(content);
165
+ const downloadedImage = await (0, _.downloadFile)({
166
+ page,
167
+ trigger: "https://cdn11.bigcommerce.com/s-scmrv6kkrz/images/stencil/1280x1280/products/192719/166712/1891-clear-14-vdc-miniature-lb93__16581.1568390384.jpg?c=2"
168
+ });
169
+ const cancelled = await downloadedImage.failure();
170
+ (0, _extendedTest.expect)(cancelled).toContain("canceled");
171
+ });
172
+ (0, _extendedTest.test)("should upload image to s3", async () => {
173
+ process.env.S3_BUCKET = "mock-bucket";
174
+ process.env.S3_REGION = "mock-region";
175
+ await page.setContent(content);
176
+ const downloadedImage = await (0, _.downloadFile)({
177
+ page,
178
+ trigger: "https://cdn11.bigcommerce.com/s-scmrv6kkrz/images/stencil/1280x1280/products/192719/166712/1891-clear-14-vdc-miniature-lb93__16581.1568390384.jpg?c=2"
179
+ });
180
+ (0, _extendedTest.expect)(downloadedImage.path).toBeDefined();
181
+ });
182
+ (0, _extendedTest.test)("should upload file to s3", async () => {
183
+ await page.setContent(content);
184
+ const download = await (0, _.downloadFile)({
185
+ page,
186
+ trigger: "https://intuned-docs-public-images.s3.amazonaws.com/32UP83A_ENG_US.pdf"
187
+ });
188
+ (0, _extendedTest.expect)(download).toBeDefined();
189
+ (0, _extendedTest.expect)(typeof download.suggestedFilename).toBe("function");
190
+ (0, _extendedTest.expect)(typeof download.path).toBe("function");
191
+ const uploadedFile = await (0, _.uploadFileToS3)({
192
+ file: download
193
+ });
194
+ (0, _extendedTest.expect)(uploadedFile.bucket).toBe("testing_bucket");
195
+ (0, _extendedTest.expect)(uploadedFile.region).toBe("testing_region");
196
+ });
197
+ });
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+
3
+ var _extendedTest = require("./extendedTest");
4
+ var _ = require("..");
5
+ (0, _extendedTest.describe)("Filter Empty Values Utility Functions Tests", () => {
6
+ (0, _extendedTest.test)("should filter empty JSON fields", async () => {
7
+ const inputData = {
8
+ field1: "value1",
9
+ field2: "",
10
+ field3: null,
11
+ field4: 0,
12
+ field5: [],
13
+ field6: {},
14
+ field7: "value2"
15
+ };
16
+ const expectedOutput = {
17
+ field1: "value1",
18
+ field4: 0,
19
+ field7: "value2"
20
+ };
21
+ const filteredResults = (0, _.filterEmptyValues)({
22
+ data: inputData
23
+ });
24
+ console.log("Filtered results:", filteredResults);
25
+ (0, _extendedTest.expect)(filteredResults).toEqual(expectedOutput);
26
+ });
27
+ (0, _extendedTest.test)("should filter nested empty JSON fields", async () => {
28
+ const inputData = {
29
+ field1: "value1",
30
+ field2: {
31
+ subfield1: "",
32
+ subfield2: null,
33
+ subfield3: "value3"
34
+ },
35
+ field3: [],
36
+ field4: {
37
+ subfield4: 0,
38
+ subfield5: {}
39
+ }
40
+ };
41
+ const expectedOutput = {
42
+ field1: "value1",
43
+ field2: {
44
+ subfield3: "value3"
45
+ },
46
+ field4: {
47
+ subfield4: 0
48
+ }
49
+ };
50
+ const filteredResults = (0, _.filterEmptyValues)({
51
+ data: inputData
52
+ });
53
+ console.log("Filtered results:", filteredResults);
54
+ (0, _extendedTest.expect)(filteredResults).toEqual(expectedOutput);
55
+ });
56
+ (0, _extendedTest.test)("should handle empty input object", async () => {
57
+ const inputData = {};
58
+ const expectedOutput = {};
59
+ const filteredResults = (0, _.filterEmptyValues)({
60
+ data: inputData
61
+ });
62
+ (0, _extendedTest.expect)(filteredResults).toEqual(expectedOutput);
63
+ });
64
+ (0, _extendedTest.test)("should handle object with all empty values", async () => {
65
+ const inputData = {
66
+ field1: "",
67
+ field2: null,
68
+ field3: undefined,
69
+ field4: [],
70
+ field5: {}
71
+ };
72
+ const expectedOutput = {};
73
+ const filteredResults = (0, _.filterEmptyValues)({
74
+ data: inputData
75
+ });
76
+ (0, _extendedTest.expect)(filteredResults).toEqual(expectedOutput);
77
+ });
78
+ (0, _extendedTest.test)("should preserve falsy values that are not empty", async () => {
79
+ const inputData = {
80
+ field1: 0,
81
+ field2: false,
82
+ field3: "",
83
+ field4: null,
84
+ field5: "valid string"
85
+ };
86
+ const expectedOutput = {
87
+ field1: 0,
88
+ field2: false,
89
+ field5: "valid string"
90
+ };
91
+ const filteredResults = (0, _.filterEmptyValues)({
92
+ data: inputData
93
+ });
94
+ (0, _extendedTest.expect)(filteredResults).toEqual(expectedOutput);
95
+ });
96
+ (0, _extendedTest.test)("should handle deeply nested objects", async () => {
97
+ const inputData = {
98
+ level1: {
99
+ level2: {
100
+ level3: {
101
+ field1: "value",
102
+ field2: "",
103
+ field3: null
104
+ },
105
+ emptyField: {}
106
+ },
107
+ field4: "another value"
108
+ },
109
+ emptyArray: []
110
+ };
111
+ const expectedOutput = {
112
+ level1: {
113
+ level2: {
114
+ level3: {
115
+ field1: "value"
116
+ }
117
+ },
118
+ field4: "another value"
119
+ }
120
+ };
121
+ const filteredResults = (0, _.filterEmptyValues)({
122
+ data: inputData
123
+ });
124
+ (0, _extendedTest.expect)(filteredResults).toEqual(expectedOutput);
125
+ });
126
+ (0, _extendedTest.test)("should handle arrays with objects", async () => {
127
+ const inputData = {
128
+ field1: "value1",
129
+ arrayField: [{
130
+ subfield1: "value",
131
+ subfield2: ""
132
+ }, {
133
+ subfield3: null,
134
+ subfield4: "value2"
135
+ }],
136
+ emptyArray: []
137
+ };
138
+ const expectedOutput = {
139
+ field1: "value1",
140
+ arrayField: [{
141
+ subfield1: "value"
142
+ }, {
143
+ subfield4: "value2"
144
+ }]
145
+ };
146
+ const filteredResults = (0, _.filterEmptyValues)({
147
+ data: inputData
148
+ });
149
+ (0, _extendedTest.expect)(filteredResults).toEqual(expectedOutput);
150
+ });
151
+ });
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ var _extendedTest = require("./extendedTest");
4
+ var _ = require("..");
5
+ var _playwrightCore = require("playwright-core");
6
+ var _dotenv = require("dotenv");
7
+ (0, _dotenv.config)();
8
+ (0, _extendedTest.describe)("goToUrl E2E Tests", () => {
9
+ let browser;
10
+ let page;
11
+ (0, _extendedTest.beforeAll)(async () => {
12
+ browser = await _playwrightCore.chromium.launch({
13
+ headless: false
14
+ });
15
+ });
16
+ (0, _extendedTest.afterAll)(async () => {
17
+ await browser.close();
18
+ });
19
+ (0, _extendedTest.beforeEach)(async () => {
20
+ page = await browser.newPage();
21
+ });
22
+ (0, _extendedTest.afterEach)(async () => {
23
+ await page.close();
24
+ });
25
+ (0, _extendedTest.describe)("successful navigation", () => {
26
+ const urls = ["https://mhtml-viewer.com/test-html2", "https://www.google.com", "https://github.com"];
27
+ for (const url of urls) {
28
+ (0, _extendedTest.test)(`should navigate to ${url}`, async () => {
29
+ await (0, _.goToUrl)({
30
+ page,
31
+ url,
32
+ waitForLoadingStateUsingAi: false
33
+ });
34
+ });
35
+ }
36
+ });
37
+ });
@@ -0,0 +1,285 @@
1
+ "use strict";
2
+
3
+ var _extendedTest = require("./extendedTest");
4
+ var _playwrightCore = require("playwright-core");
5
+ var _isPageLoaded = require("../../browser/ai/isPageLoaded");
6
+ var dotenv = _interopRequireWildcard(require("dotenv"));
7
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
8
+ dotenv.config({
9
+ override: true
10
+ });
11
+ const FULLY_LOADED_PAGE = `
12
+ <!DOCTYPE html>
13
+ <html lang="en">
14
+ <head>
15
+ <meta charset="UTF-8">
16
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
17
+ <title>Fully Loaded Page</title>
18
+ <style>
19
+ body { font-family: Arial, sans-serif; margin: 20px; }
20
+ .header { background: #f0f0f0; padding: 20px; }
21
+ .content { margin: 20px 0; }
22
+ .footer { background: #e0e0e0; padding: 20px; }
23
+ .image { width: 200px; height: 150px; background: #ccc; }
24
+ </style>
25
+ </head>
26
+ <body>
27
+ <div class="header">
28
+ <h1>Welcome to Our Website</h1>
29
+ <nav>
30
+ <a href="#home">Home</a> |
31
+ <a href="#about">About</a> |
32
+ <a href="#contact">Contact</a>
33
+ </nav>
34
+ </div>
35
+ <div class="content">
36
+ <h2>Main Content</h2>
37
+ <p>This page is fully loaded with all content visible.</p>
38
+ <div class="image">Image Placeholder</div>
39
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
40
+ </div>
41
+ <div class="footer">
42
+ <p>&copy; 2024 Test Company. All rights reserved.</p>
43
+ </div>
44
+ </body>
45
+ </html>
46
+ `;
47
+ const LOADING_PAGE = `
48
+ <!DOCTYPE html>
49
+ <html lang="en">
50
+ <head>
51
+ <meta charset="UTF-8">
52
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
53
+ <title>Loading Page</title>
54
+ <style>
55
+ body {
56
+ font-family: Arial, sans-serif;
57
+ display: flex;
58
+ justify-content: center;
59
+ align-items: center;
60
+ height: 100vh;
61
+ margin: 0;
62
+ background: #f5f5f5;
63
+ }
64
+ .loading-container {
65
+ text-align: center;
66
+ }
67
+ .spinner {
68
+ border: 4px solid #f3f3f3;
69
+ border-top: 4px solid #3498db;
70
+ border-radius: 50%;
71
+ width: 50px;
72
+ height: 50px;
73
+ animation: spin 1s linear infinite;
74
+ margin: 0 auto 20px;
75
+ }
76
+ @keyframes spin {
77
+ 0% { transform: rotate(0deg); }
78
+ 100% { transform: rotate(360deg); }
79
+ }
80
+ .loading-text {
81
+ font-size: 18px;
82
+ color: #666;
83
+ }
84
+ </style>
85
+ </head>
86
+ <body>
87
+ <div class="loading-container">
88
+ <div class="spinner"></div>
89
+ <div class="loading-text">Loading, please wait...</div>
90
+ </div>
91
+ </body>
92
+ </html>
93
+ `;
94
+ const BLANK_PAGE = `
95
+ <!DOCTYPE html>
96
+ <html lang="en">
97
+ <head>
98
+ <meta charset="UTF-8">
99
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
100
+ <title>Blank Page</title>
101
+ <style>
102
+ body { margin: 0; padding: 0; background: white; }
103
+ </style>
104
+ </head>
105
+ <body>
106
+ <!-- Completely blank page -->
107
+ </body>
108
+ </html>
109
+ `;
110
+ const PARTIALLY_LOADED_PAGE = `
111
+ <!DOCTYPE html>
112
+ <html lang="en">
113
+ <head>
114
+ <meta charset="UTF-8">
115
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
116
+ <title>Partially Loaded Page</title>
117
+ <style>
118
+ body { font-family: Arial, sans-serif; margin: 20px; }
119
+ .loaded { opacity: 1; }
120
+ .loading { opacity: 0.3; }
121
+ .placeholder {
122
+ background: #ddd;
123
+ height: 100px;
124
+ margin: 10px 0;
125
+ display: flex;
126
+ align-items: center;
127
+ justify-content: center;
128
+ color: #666;
129
+ }
130
+ </style>
131
+ </head>
132
+ <body>
133
+ <h1 class="loaded">Website Header</h1>
134
+ <div class="placeholder loading">Content Loading...</div>
135
+ <div class="placeholder loading">Images Loading...</div>
136
+ <div class="placeholder loading">More Content Loading...</div>
137
+ <p class="loaded">Some content has loaded but other parts are still loading.</p>
138
+ </body>
139
+ </html>
140
+ `;
141
+ const ERROR_PAGE = `
142
+ <!DOCTYPE html>
143
+ <html lang="en">
144
+ <head>
145
+ <meta charset="UTF-8">
146
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
147
+ <title>Error Page</title>
148
+ <style>
149
+ body {
150
+ font-family: Arial, sans-serif;
151
+ display: flex;
152
+ justify-content: center;
153
+ align-items: center;
154
+ height: 100vh;
155
+ margin: 0;
156
+ background: #ffe6e6;
157
+ }
158
+ .error-container {
159
+ text-align: center;
160
+ background: white;
161
+ padding: 40px;
162
+ border-radius: 10px;
163
+ box-shadow: 0 2px 10px rgba(0,0,0,0.1);
164
+ }
165
+ .error-code { font-size: 48px; color: #e74c3c; font-weight: bold; }
166
+ .error-message { font-size: 18px; color: #666; margin: 20px 0; }
167
+ </style>
168
+ </head>
169
+ <body>
170
+ <div class="error-container">
171
+ <div class="error-code">404</div>
172
+ <div class="error-message">Page Not Found</div>
173
+ <p>The page you are looking for could not be found.</p>
174
+ </div>
175
+ </body>
176
+ </html>
177
+ `;
178
+ (0, _extendedTest.describe)("isPageLoaded Tests", () => {
179
+ let browser;
180
+ let page;
181
+ (0, _extendedTest.beforeAll)(async () => {
182
+ browser = await _playwrightCore.chromium.launch({
183
+ headless: false
184
+ });
185
+ });
186
+ (0, _extendedTest.afterAll)(async () => {
187
+ await browser.close();
188
+ });
189
+ (0, _extendedTest.beforeEach)(async () => {
190
+ page = await browser.newPage();
191
+ });
192
+ (0, _extendedTest.afterEach)(async () => {
193
+ await page.close();
194
+ });
195
+ (0, _extendedTest.describe)("Real LLM calls", () => {
196
+ (0, _extendedTest.test)("should detect fully loaded page", async () => {
197
+ await page.setContent(FULLY_LOADED_PAGE);
198
+ await page.waitForSelector("h1", {
199
+ timeout: 5000
200
+ });
201
+ const result = await (0, _isPageLoaded.isPageLoaded)(page, {
202
+ model: "gpt-4o-2024-05-13",
203
+ apiKey: process.env.OPENAI_API_KEY,
204
+ timeoutInMs: 10000
205
+ });
206
+ (0, _extendedTest.expect)(result["status"]).toBe(true);
207
+ (0, _extendedTest.expect)(typeof result["reason"]).toBe("string");
208
+ (0, _extendedTest.expect)(result["reason"]).not.toBeNull();
209
+ (0, _extendedTest.expect)(typeof result["cost"]).toBe("number");
210
+ console.log("Fully loaded page result:", result);
211
+ });
212
+ (0, _extendedTest.test)("should detect loading page with spinner", async () => {
213
+ await page.setContent(LOADING_PAGE);
214
+ await page.waitForSelector(".spinner", {
215
+ timeout: 5000
216
+ });
217
+ const apiKey = process.env.OPENAI_API_KEY;
218
+ const result = await (0, _isPageLoaded.isPageLoaded)(page, {
219
+ model: "gpt-4o-2024-05-13",
220
+ apiKey: apiKey,
221
+ timeoutInMs: 10000
222
+ });
223
+ (0, _extendedTest.expect)(result["status"]).toBe(false);
224
+ (0, _extendedTest.expect)(typeof result["reason"]).toBe("string");
225
+ (0, _extendedTest.expect)(result["reason"]).not.toBeNull();
226
+ (0, _extendedTest.expect)(typeof result["cost"]).toBe("number");
227
+ console.log("Loading page result:", result);
228
+ });
229
+ (0, _extendedTest.test)("should detect blank page", async () => {
230
+ await page.setContent(BLANK_PAGE);
231
+ const result = await (0, _isPageLoaded.isPageLoaded)(page, {
232
+ model: "gpt-4o-2024-05-13",
233
+ apiKey: process.env.OPENAI_API_KEY,
234
+ timeoutInMs: 10000
235
+ });
236
+ (0, _extendedTest.expect)([false, "Dont know"]).toContain(result["status"]);
237
+ (0, _extendedTest.expect)(typeof result["reason"]).toBe("string");
238
+ (0, _extendedTest.expect)(typeof result["cost"]).toBe("number");
239
+ console.log("Blank page result:", result);
240
+ });
241
+ (0, _extendedTest.test)("should handle partially loaded page", async () => {
242
+ await page.setContent(PARTIALLY_LOADED_PAGE);
243
+ await page.waitForSelector("h1", {
244
+ timeout: 5000
245
+ });
246
+ const result = await (0, _isPageLoaded.isPageLoaded)(page, {
247
+ model: "gpt-4o-2024-05-13",
248
+ apiKey: process.env.OPENAI_API_KEY,
249
+ timeoutInMs: 10000
250
+ });
251
+ (0, _extendedTest.expect)([true, false, "Dont know"]).toContain(result["status"]);
252
+ (0, _extendedTest.expect)(typeof result["reason"]).toBe("string");
253
+ (0, _extendedTest.expect)(typeof result["cost"]).toBe("number");
254
+ console.log("Partially loaded page result:", result);
255
+ });
256
+ (0, _extendedTest.test)("should handle error page", async () => {
257
+ await page.setContent(ERROR_PAGE);
258
+ await page.waitForSelector(".error-code", {
259
+ timeout: 5000
260
+ });
261
+ const result = await (0, _isPageLoaded.isPageLoaded)(page, {
262
+ model: "gpt-4o-2024-05-13",
263
+ apiKey: process.env.OPENAI_API_KEY,
264
+ timeoutInMs: 10000
265
+ });
266
+ (0, _extendedTest.expect)([true, "Dont know"]).toContain(result["status"]);
267
+ (0, _extendedTest.expect)(typeof result["reason"]).toBe("string");
268
+ (0, _extendedTest.expect)(typeof result["cost"]).toBe("number");
269
+ console.log("Error page result:", result);
270
+ });
271
+ });
272
+ (0, _extendedTest.describe)("Different model types", () => {
273
+ (0, _extendedTest.test)("should work with claude-3-5-sonnet-20240620", async () => {
274
+ await page.setContent(FULLY_LOADED_PAGE);
275
+ const result = await (0, _isPageLoaded.isPageLoaded)(page, {
276
+ model: "claude-3-5-sonnet-20240620",
277
+ apiKey: process.env.ANTHROPIC_API_KEY,
278
+ timeoutInMs: 10000
279
+ });
280
+ (0, _extendedTest.expect)([true, false, "Dont know"]).toContain(result["status"]);
281
+ (0, _extendedTest.expect)(typeof result["reason"]).toBe("string");
282
+ (0, _extendedTest.expect)(typeof result["cost"]).toBe("number");
283
+ });
284
+ });
285
+ });
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ var _extendedTest = require("./extendedTest");
4
+ var _ = require("..");
5
+ const dates = [["22/11/2024 21:19:05", new Date(2024, 10, 22)], ["13/12/2024", new Date(2024, 11, 13)], ["22/11/2024 15:35:06", new Date(2024, 10, 22)], ["01/17/2025 3:00:00 PM CT", new Date(2025, 0, 17)], ["10/25/2024", new Date(2024, 9, 25)], ["09/18/2024", new Date(2024, 8, 18)], ["10/23/2024 12:06 PM CST", new Date(2024, 9, 23)], ["11/24/2024", new Date(2024, 10, 24)], ["11/28/2024 1:59:59 AM", new Date(2024, 10, 28)], ["11/1/2024 10:30:00 PM", new Date(2024, 10, 1)], ["12/09/2024 9:00 AM", new Date(2024, 11, 9)], ["12/05/2024 9:00 AM", new Date(2024, 11, 5)], ["11/07/2024", new Date(2024, 10, 7)], ["12/10/2024", new Date(2024, 11, 10)], ["10/21/2024", new Date(2024, 9, 21)], ["10/08/2024", new Date(2024, 9, 8)], ["12/19/2024 - 2:00 PM", new Date(2024, 11, 19)], ["11/15/2024", new Date(2024, 10, 15)], ["8/16/2019", new Date(2019, 7, 16)], ["9/28/2024", new Date(2024, 8, 28)], ["5 Dec 2024 8:00 AM PST", new Date(2024, 11, 5)], ["11 Sep 2024", new Date(2024, 8, 11)], ["November 14, 2024", new Date(2024, 10, 14)], ["January 31, 2025, 5:00 pm", new Date(2025, 0, 31)], ["22/11/2024 19:45:00", new Date(2024, 10, 22)], ["09/01/2025 15:00:00", new Date(2025, 8, 1)], ["06/01/2023 11:00:00", new Date(2023, 5, 1)], ["04/30/2023 14:00:00", new Date(2023, 3, 30)]];
6
+ dates.forEach(([dateString, expectedDate]) => {
7
+ (0, _extendedTest.test)(`process_date: ${dateString}`, async () => {
8
+ const result = (0, _.processDate)({
9
+ date: dateString
10
+ });
11
+ (0, _extendedTest.expect)(result).toEqual(expectedDate);
12
+ });
13
+ });