@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,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ensureBrowserScripts = ensureBrowserScripts;
7
+ var _fs = require("fs");
8
+ var _path = require("path");
9
+ async function ensureBrowserScripts(page) {
10
+ const pageHasScript = await page.evaluate('() => typeof window.__INTUNED__ !== "undefined"');
11
+ if (pageHasScript) {
12
+ return;
13
+ }
14
+ const scriptPath = (0, _path.join)(__dirname, "..", "common", "browser_scripts.js");
15
+ const scriptContent = (0, _fs.readFileSync)(scriptPath, "utf-8");
16
+ await page.evaluate(scriptContent);
17
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getEnvironmentVariable = getEnvironmentVariable;
7
+ function getEnvironmentVariable(name) {
8
+ if (name === "RUN_ENVIRONMENT") {
9
+ const value = process.env.RUN_ENVIRONMENT;
10
+ if (!value) {
11
+ throw new Error("run environment is not set");
12
+ }
13
+ return value;
14
+ }
15
+ return undefined;
16
+ }
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getAiTrackingHeaders = getAiTrackingHeaders;
7
+ function getAiTrackingHeaders({
8
+ environment,
9
+ type,
10
+ runId,
11
+ jobId,
12
+ jobRunId,
13
+ queueId
14
+ }) {
15
+ const headers = new Headers();
16
+ if (runId) {
17
+ headers.append("x-intuned-run-id", runId);
18
+ }
19
+ if (jobId) {
20
+ headers.append("x-intuned-job-id", jobId);
21
+ }
22
+ if (jobRunId) {
23
+ headers.append("x-intuned-job-run-id", jobRunId);
24
+ }
25
+ if (queueId) {
26
+ headers.append("x-intuned-queue-id", queueId);
27
+ }
28
+ headers.append("x-intuned-environment", environment);
29
+ headers.append("x-intuned-type", type);
30
+ return Object.fromEntries(headers);
31
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getFilesTrackingHeaders = getFilesTrackingHeaders;
7
+ function getFilesTrackingHeaders({
8
+ environment,
9
+ runId,
10
+ identifier,
11
+ jobId,
12
+ jobRunId,
13
+ queueId
14
+ }) {
15
+ const headers = new Headers();
16
+ if (runId) headers.append("x-intuned-run-id", runId);
17
+ if (identifier) headers.append("x-intuned-identifier", identifier);
18
+ if (jobId) headers.append("x-intuned-job-id", jobId);
19
+ if (jobRunId) headers.append("x-intuned-job-run-id", jobRunId);
20
+ if (queueId) headers.append("x-intuned-queue-id", queueId);
21
+ headers.append("x-intuned-environment", environment);
22
+ return Object.fromEntries(headers);
23
+ }
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.RunType = exports.RunEnvironment = void 0;
7
+ Object.defineProperty(exports, "afterAll", {
8
+ enumerable: true,
9
+ get: function () {
10
+ return _vitest.afterAll;
11
+ }
12
+ });
13
+ Object.defineProperty(exports, "afterEach", {
14
+ enumerable: true,
15
+ get: function () {
16
+ return _vitest.afterEach;
17
+ }
18
+ });
19
+ Object.defineProperty(exports, "beforeAll", {
20
+ enumerable: true,
21
+ get: function () {
22
+ return _vitest.beforeAll;
23
+ }
24
+ });
25
+ Object.defineProperty(exports, "beforeEach", {
26
+ enumerable: true,
27
+ get: function () {
28
+ return _vitest.beforeEach;
29
+ }
30
+ });
31
+ Object.defineProperty(exports, "describe", {
32
+ enumerable: true,
33
+ get: function () {
34
+ return _vitest.describe;
35
+ }
36
+ });
37
+ exports.expect = void 0;
38
+ Object.defineProperty(exports, "it", {
39
+ enumerable: true,
40
+ get: function () {
41
+ return _vitest.it;
42
+ }
43
+ });
44
+ exports.test = void 0;
45
+ Object.defineProperty(exports, "vi", {
46
+ enumerable: true,
47
+ get: function () {
48
+ return _vitest.vi;
49
+ }
50
+ });
51
+ var dotenv = _interopRequireWildcard(require("dotenv"));
52
+ var _vitest = require("vitest");
53
+ var _runtime = require("@intuned/runtime");
54
+ var _extractionHelpers = require("./extractionHelpers");
55
+ var _fsExtra = require("fs-extra");
56
+ var _nanoid = require("nanoid");
57
+ 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); }
58
+ dotenv.config();
59
+ let RunEnvironment = exports.RunEnvironment = function (RunEnvironment) {
60
+ RunEnvironment["IDE"] = "IDE";
61
+ RunEnvironment["DEPLOYED"] = "DEPLOYED";
62
+ return RunEnvironment;
63
+ }({});
64
+ let RunType = exports.RunType = function (RunType) {
65
+ RunType["SYNC"] = "SYNC";
66
+ RunType["ASYNC"] = "ASYNC";
67
+ RunType["JOB"] = "JOB";
68
+ RunType["QUEUE"] = "QUEUE";
69
+ return RunType;
70
+ }({});
71
+ const withPlaywright = (name, testFn, {
72
+ headless,
73
+ trace,
74
+ runId,
75
+ jobId,
76
+ jobRunId,
77
+ queueId
78
+ }) => {
79
+ return async () => {
80
+ return (0, _runtime.runWithContext)({
81
+ runId: runId ?? (0, _nanoid.nanoid)(),
82
+ extendedPayloads: [],
83
+ runEnvironment: RunEnvironment.IDE,
84
+ jobId,
85
+ jobRunId,
86
+ queueId
87
+ }, async () => {
88
+ const downloadsPath = (0, _runtime.getDownloadDirectoryPath)();
89
+ const {
90
+ page,
91
+ context
92
+ } = await (0, _runtime.getProductionPlaywrightConstructs)({
93
+ headless: headless ?? true,
94
+ downloadsPath
95
+ });
96
+ context.setDefaultTimeout(10000);
97
+ try {
98
+ if (trace) {
99
+ await context.tracing.start({
100
+ screenshots: true
101
+ });
102
+ }
103
+ await testFn({
104
+ context,
105
+ page
106
+ });
107
+ if (trace) {
108
+ await context.tracing.stop({
109
+ path: `./reports/traces/${name}.zip`
110
+ });
111
+ }
112
+ } finally {
113
+ await page.close();
114
+ await context.close();
115
+ await (0, _fsExtra.remove)(downloadsPath);
116
+ }
117
+ });
118
+ };
119
+ };
120
+ const test = (name, fn, options = {}) => {
121
+ if (process.env.CI) {
122
+ options.headless = true;
123
+ } else {
124
+ options.timeout = 1000000;
125
+ }
126
+ return (0, _vitest.test)(name, withPlaywright(name, fn, options), options);
127
+ };
128
+ exports.test = test;
129
+ _vitest.expect.extend({
130
+ async toHaveText(locator, expectedText) {
131
+ const textContent = await locator.textContent();
132
+ const pass = !!textContent && (0, _extractionHelpers.compressStringSpaces)(textContent) === expectedText;
133
+ return {
134
+ pass,
135
+ message: () => `Expected locator with selector "${locator}" to have text "${expectedText}", but it has "${textContent}"`
136
+ };
137
+ }
138
+ });
139
+ test.skip = _vitest.test.skip;
140
+ test.only = (name, fn, options = {}) => {
141
+ if (process.env.CI) {
142
+ options.headless = true;
143
+ } else {
144
+ options.timeout = 1000000;
145
+ }
146
+ return _vitest.test.only(name, withPlaywright(name, fn, options), options);
147
+ };
148
+ const expect = exports.expect = _vitest.expect;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.compressStringSpaces = compressStringSpaces;
7
+ exports.selectLocatorsUsingXpath = selectLocatorsUsingXpath;
8
+ exports.splitContainerIntoListLocators = splitContainerIntoListLocators;
9
+ function compressStringSpaces(str) {
10
+ return str.replace(/\s+/g, " ").trim();
11
+ }
12
+ async function splitContainerIntoListLocators(locator) {
13
+ const childrenLocators = await locator.locator(":scope > *").all();
14
+ return childrenLocators;
15
+ }
16
+ async function selectLocatorsUsingXpath(page, xpath) {
17
+ const trimmed = xpath.replace(/^(\/+)/, "");
18
+ return await page.locator(`//${trimmed}`).all();
19
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.formatZodError = formatZodError;
7
+ function formatZodError(zodError) {
8
+ const formattedErrors = zodError.errors.map(error => {
9
+ const path = error.path.map(segment => {
10
+ return typeof segment === "number" ? `[${segment}]` : segment;
11
+ }).join(".");
12
+ if (path) {
13
+ return `${path} is invalid - ${error.message}`;
14
+ }
15
+ return error.message;
16
+ });
17
+ return formattedErrors;
18
+ }
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+
3
+ var _ = _interopRequireWildcard(require("lodash"));
4
+ var _vitest = require("vitest");
5
+ var _utils = require("./utils");
6
+ var _levenshteinSearch = require("./levenshtein-search");
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
+ (0, _vitest.describe)("searchExact", () => {
9
+ const search = (needle, haystack, ...args) => [...(0, _utils.searchExact)(needle, haystack, ...args)];
10
+ (0, _vitest.test)("empty needle", () => {
11
+ (0, _vitest.expect)(search("", "TEXT")).toEqual([]);
12
+ });
13
+ (0, _vitest.test)("empty haystack", () => {
14
+ (0, _vitest.expect)(search("PATTERN", "")).toEqual([]);
15
+ });
16
+ const testCases = {
17
+ identical: ["abc", "abc", [0]],
18
+ substring: ["abc", "-ab-abc-ab-", [4]],
19
+ "double first item": ["def", "abcddefg", [4]],
20
+ "missing second item": ["bde", "abcdefg", []],
21
+ "completely different": ["abc", "def", []],
22
+ startswith: ["abc", "abcd", [0]],
23
+ endswith: ["bcd", "abcd", [1]],
24
+ "multiple matches": ["abc", "-abc-abc-abc-", [1, 5, 9]]
25
+ };
26
+ for (const [name, data] of _.toPairs(testCases)) {
27
+ const [needle, haystack, expected] = data;
28
+ (0, _vitest.test)(`searchExact, '${name}' -> ${expected}`, () => {
29
+ (0, _vitest.expect)(search(needle, haystack)).toEqual(expected);
30
+ });
31
+ }
32
+ for (const [start, expected] of [[1, [1, 5, 9]], [2, [5, 9]], [5, [5, 9]], [6, [9]]]) {
33
+ (0, _vitest.test)(`searchExact('abc', '-abc-abc-abc-', ${start},) -> ${expected}`, () => {
34
+ (0, _vitest.expect)(search("abc", "-abc-abc-abc-", start)).toEqual(expected);
35
+ });
36
+ }
37
+ for (const [start, end, expected] of [[0, 3, []], [0, 4, [1]], [0, 7, [1]], [0, 8, [1, 5]], [0, 11, [1, 5]], [0, 12, [1, 5, 9]], [1, 13, [1, 5, 9]], [2, 13, [5, 9]], [5, 13, [5, 9]], [6, 13, [9]], [3, 7, []], [4, 10, [5]]]) {
38
+ (0, _vitest.test)(`searchExact('abc', '-abc-abc-abc-', ${start}, ${end}) -> ${expected}`, () => {
39
+ (0, _vitest.expect)(search("abc", "-abc-abc-abc-", start, end)).toEqual(expected);
40
+ });
41
+ }
42
+ });
43
+ (0, _vitest.describe)("editDistance", () => {
44
+ for (const [a, b, dist] of [["", "", 0], ["a", "", 1], ["abc", "abc", 0], ["abc", "def", 3], ["elephant", "relevant", 3], ["abc", "aabc", 1], ["abc", "abbc", 1], ["abc", "abcc", 1], ["abc", "-abc", 1], ["abc", "a-bc", 1], ["abc", "ab-c", 1], ["abc", "abc-", 1], ["aabccdeefgg", "abcdefg", 4]]) {
45
+ (0, _vitest.test)(`editDistance(${a}, ${b}) == ${dist}`, () => {
46
+ (0, _vitest.expect)((0, _levenshteinSearch.editDistance)(a, b)).toBe(dist);
47
+ (0, _vitest.expect)((0, _levenshteinSearch.editDistance)(b, a)).toBe(dist);
48
+ });
49
+ }
50
+ });
51
+ (0, _vitest.describe)("fuzzySearch string", () => {
52
+ const testedFunctions = [_levenshteinSearch.fuzzySearch, _levenshteinSearch.fuzzySearchNgrams, _levenshteinSearch.fuzzySearchCandidates];
53
+ const longstr = string => string.replace(/\s+/g, "");
54
+ const testCases = {
55
+ "identical sequence": ["PATTERN", "PATTERN", [[0, [[0, 7, 0]]]]],
56
+ substring: ["PATTERN", "----------PATTERN---------", [[0, [[10, 17, 0]]], [1, [[10, 17, 0]]], [2, [[10, 17, 0]]]]],
57
+ "double first item": ["def", "abcddefg", [[1, [[4, 7, 0]]]]],
58
+ "double last item": ["def", "abcdeffg", [[1, [[3, 6, 0]]]]],
59
+ "double first items": ["defgh", "abcdedefghi", [[3, [[5, 10, 0]]]]],
60
+ "double last items": ["cdefgh", "abcdefghghi", [[3, [[2, 8, 0]]]]],
61
+ "missing second item": ["bde", "abcdefg", [[1, [[1, 5, 1]]]]],
62
+ "missing second to last item": ["bce", "abcdefg", [[1, [[1, 5, 1]]], [2, [[1, 5, 1]]]]],
63
+ "one missing in middle": ["PATTERN", "----------PATERN---------", [[0, []], [1, [[10, 16, 1]]], [2, [[10, 16, 1]]]]],
64
+ "one changed in middle": ["PATTERN", "----------PAT-ERN---------", [[0, []], [1, [[10, 17, 1]]], [2, [[10, 17, 1]]]]],
65
+ "one extra in middle": ["PATTERN", "----------PATT-ERN---------", [[0, []], [1, [[10, 18, 1]]], [2, [[10, 18, 1]]]]],
66
+ "one extra repeating in middle": ["PATTERN", "----------PATTTERN---------", [[0, []], [1, [[10, 18, 1]]], [2, [[10, 18, 1]]]]],
67
+ "one extra repeating at end": ["PATTERN", "----------PATTERNN---------", [[0, [[10, 17, 0]]], [1, [[10, 17, 0]]], [2, [[10, 17, 0]]]]],
68
+ "one missing at end": ["defg", "abcdef", [[1, [[3, 6, 1]]]]],
69
+ "DNA search": ["TGCACTGTAGGGATAACAAT", longstr(`
70
+ GACTAGCACTGTAGGGATAACAATTTCACACAGGTGGACAATTACATTGAAAATCACAGATTG
71
+ GTCACACACACATTGGACATACATAGAAACACACACACATACATTAGATACGAACATAGAAAC
72
+ ACACATTAGACGCGTACATAGACACAAACACATTGACAGGCAGTTCAGATGATGACGCCCGAC
73
+ TGATACTCGCGTAGTCGTGGGAGGCAAGGCACACAGGGGATAGG
74
+ `), [[2, [[3, 24, 1]]]]],
75
+ "protein search 1": ["GGGTTLTTSS", longstr(`
76
+ XXXXXXXXXXXXXXXXXXXGGGTTVTTSSAAAAAAAAAAAAAGGGTTLTTSSAAAAAAAAAAA
77
+ AAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBGGGTTLTTSS
78
+ `), [[0, [[42, 52, 0], [99, 109, 0]]], [1, [[19, 29, 1], [42, 52, 0], [99, 109, 0]]], [2, [[19, 29, 1], [42, 52, 0], [99, 109, 0]]]]],
79
+ "protein search 2": ["GGGTTLTTSS", longstr(`
80
+ XXXXXXXXXXXXXXXXXXXGGGTTVTTSSAAAAAAAAAAAAAGGGTTVTTSSAAAAAAAAAAA
81
+ AAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBGGGTTLTTSS
82
+ `), [[0, [[99, 109, 0]]], [1, [[19, 29, 1], [42, 52, 1], [99, 109, 0]]], [2, [[19, 29, 1], [42, 52, 1], [99, 109, 0]]]]]
83
+ };
84
+ for (const func of testedFunctions) {
85
+ const search = (needle, haystack, maxDist) => _.chain([...func(needle, haystack, maxDist)]).uniqWith(_.isEqual).sortBy(["start", "end", "dist"]).value();
86
+ (0, _vitest.expect)(search("abc", "abc", 0)).toEqual([{
87
+ start: 0,
88
+ end: 3,
89
+ dist: 0
90
+ }]);
91
+ (0, _vitest.expect)(search("abc", "a-c", 0)).toEqual([]);
92
+ (0, _vitest.expect)(search("abc", "a-c", 1)).toEqual([{
93
+ start: 0,
94
+ end: 3,
95
+ dist: 1
96
+ }]);
97
+ (0, _vitest.expect)(search("abcdefghij", "abcdefghij", 0)).toEqual([{
98
+ start: 0,
99
+ end: 10,
100
+ dist: 0
101
+ }]);
102
+ (0, _vitest.expect)(search("abcdefghij", "abcdefghij", 1)).toContainEqual({
103
+ start: 0,
104
+ end: 10,
105
+ dist: 0
106
+ });
107
+ (0, _vitest.expect)(search("abcdefghij", "abcdefghi", 1)).toContainEqual({
108
+ start: 0,
109
+ end: 9,
110
+ dist: 1
111
+ });
112
+ for (const [name, data] of _.toPairs(testCases)) {
113
+ const [needle, haystack, maxDist2expectedMatches] = data;
114
+ for (const [maxDist, expectedMatches] of maxDist2expectedMatches) {
115
+ const expectedMatchObjs = expectedMatches.map(([start, end, dist]) => {
116
+ return {
117
+ start,
118
+ end,
119
+ dist
120
+ };
121
+ });
122
+ (0, _vitest.test)(`${func.name}, '${name}', maxDist=${maxDist} -> ${expectedMatches}`, () => {
123
+ (0, _vitest.expect)(search(needle, haystack, maxDist)).toEqual(_vitest.expect.arrayContaining(expectedMatchObjs));
124
+ });
125
+ }
126
+ }
127
+ }
128
+ });
129
+ (0, _vitest.describe)("fuzzySearch array of strings", () => {
130
+ const testedFunctions = [_levenshteinSearch.fuzzySearchCandidates];
131
+ for (const func of testedFunctions) {
132
+ (0, _vitest.test)(`${func.name}`, () => {
133
+ const search = (needle, haystack, maxDist) => _.sortedUniqBy([...func(needle, haystack, maxDist)], _.isEqual);
134
+ (0, _vitest.expect)(search(["a", "b", "c"], ["a", "b", "c"], 0)).toEqual([{
135
+ start: 0,
136
+ end: 3,
137
+ dist: 0
138
+ }]);
139
+ (0, _vitest.expect)(search(["abc", "def", "ghi"], ["abc", "def", "ghi"], 0)).toEqual([{
140
+ start: 0,
141
+ end: 3,
142
+ dist: 0
143
+ }]);
144
+ (0, _vitest.expect)(search(["a", "b", "c"], ["a", "d", "c"], 0)).toEqual([]);
145
+ (0, _vitest.expect)(search(["abc", "def", "ghi"], ["abc", "xyz", "ghi"], 1)).toEqual([{
146
+ start: 0,
147
+ end: 3,
148
+ dist: 1
149
+ }]);
150
+ });
151
+ }
152
+ });
153
+ (0, _vitest.test)("isEditDistanceNoGreaterThan", () => {
154
+ function m(str, n) {
155
+ let result = "";
156
+ for (;;) {
157
+ if (n & 1) result += str;
158
+ n >>= 1;
159
+ if (n) str += str;else break;
160
+ }
161
+ return result;
162
+ }
163
+ (0, _vitest.expect)((0, _levenshteinSearch.isEditDistanceNoGreaterThan)("a", "a", 0)).toBe(true);
164
+ (0, _vitest.expect)((0, _levenshteinSearch.isEditDistanceNoGreaterThan)("a", "b", 0)).toBe(false);
165
+ (0, _vitest.expect)((0, _levenshteinSearch.isEditDistanceNoGreaterThan)("a", "b", 1)).toBe(true);
166
+ (0, _vitest.expect)((0, _levenshteinSearch.isEditDistanceNoGreaterThan)("aaaaa", "aaaaa", 0)).toBe(true);
167
+ (0, _vitest.expect)((0, _levenshteinSearch.isEditDistanceNoGreaterThan)("aaaaa", "baaaa", 0)).toBe(false);
168
+ (0, _vitest.expect)((0, _levenshteinSearch.isEditDistanceNoGreaterThan)("aaaaa", "aabaa", 0)).toBe(false);
169
+ (0, _vitest.expect)((0, _levenshteinSearch.isEditDistanceNoGreaterThan)("aaaaa", "aaaab", 0)).toBe(false);
170
+ (0, _vitest.expect)((0, _levenshteinSearch.isEditDistanceNoGreaterThan)("aaaaa", "aabaa", 1)).toBe(true);
171
+ (0, _vitest.expect)((0, _levenshteinSearch.isEditDistanceNoGreaterThan)("aaaaa", "aabba", 1)).toBe(false);
172
+ const x100 = m("x", 100);
173
+ for (const [a, b, dist] of [["aaaaa", "bbbbb", 5], [`${x100}yz${x100}`, m("x", 200), 2], [`${x100}yz${x100}`, m("x", 202), 2], [`${x100}yz${x100}yz${x100}`, m("x", 304), 4]]) {
174
+ if (dist > 0) {
175
+ (0, _vitest.expect)((0, _levenshteinSearch.isEditDistanceNoGreaterThan)(a, b, dist - 1)).toBe(false);
176
+ }
177
+ (0, _vitest.expect)((0, _levenshteinSearch.isEditDistanceNoGreaterThan)(a, b, dist)).toBe(true);
178
+ (0, _vitest.expect)((0, _levenshteinSearch.isEditDistanceNoGreaterThan)(a, b, dist + 1)).toBe(true);
179
+ }
180
+ });
181
+ (0, _vitest.describe)("_expand() unit tests", () => {
182
+ (0, _vitest.test)("both empty", () => {
183
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("", "", 0)).toEqual([0, 0]);
184
+ });
185
+ (0, _vitest.test)("empty needle", () => {
186
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("", "haystack", 0)).toEqual([0, 0]);
187
+ });
188
+ (0, _vitest.test)("both empty", () => {
189
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("needle", "", 0)).toEqual([null, null]);
190
+ });
191
+ (0, _vitest.test)("identical", () => {
192
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abc", "abc", 0)).toEqual([0, 3]);
193
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abc", "abc", 1)).toEqual([0, 3]);
194
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abc", "abc", 2)).toEqual([0, 3]);
195
+ });
196
+ (0, _vitest.test)("first item missing", () => {
197
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abcd", "bcd", 0)).toEqual([null, null]);
198
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abcd", "bcd", 1)).toEqual([1, 3]);
199
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abcd", "bcd", 2)).toEqual([1, 3]);
200
+ });
201
+ (0, _vitest.test)("first second missing", () => {
202
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abcd", "acd", 0)).toEqual([null, null]);
203
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abcd", "acd", 1)).toEqual([1, 3]);
204
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abcd", "acd", 2)).toEqual([1, 3]);
205
+ });
206
+ (0, _vitest.test)("before last missing", () => {
207
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abcd", "abd", 0)).toEqual([null, null]);
208
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abcd", "abd", 1)).toEqual([1, 3]);
209
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abcd", "abd", 2)).toEqual([1, 3]);
210
+ });
211
+ (0, _vitest.test)("last missing", () => {
212
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abcd", "abc", 0)).toEqual([null, null]);
213
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abcd", "abc", 1)).toEqual([1, 3]);
214
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abcd", "abc", 2)).toEqual([1, 3]);
215
+ });
216
+ (0, _vitest.test)("completely different", () => {
217
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abc", "def", 0)).toEqual([null, null]);
218
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abc", "def", 1)).toEqual([null, null]);
219
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abc", "def", 2)).toEqual([null, null]);
220
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abc", "def", 3)).toEqual([3, 3]);
221
+ });
222
+ (0, _vitest.test)("startswith", () => {
223
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abc", "abcd", 0)).toEqual([0, 3]);
224
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abc", "abcd", 1)).toEqual([0, 3]);
225
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abc", "abcd", 2)).toEqual([0, 3]);
226
+ });
227
+ (0, _vitest.test)("missing at start, middle, and end", () => {
228
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abcd", "-ab-cd-", 0)).toEqual([null, null]);
229
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abcd", "-ab-cd-", 1)).toEqual([null, null]);
230
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abcd", "-ab-cd-", 2)).toEqual([2, 6]);
231
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abcd", "-ab-cd-", 3)).toEqual([2, 6]);
232
+ });
233
+ (0, _vitest.test)("long needle", () => {
234
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abcdefghijklmnop", "abcdefg-hijk-mnopqrst", 0)).toEqual([null, null]);
235
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abcdefghijklmnop", "abcdefg-hijk-mnopqrst", 1)).toEqual([null, null]);
236
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abcdefghijklmnop", "abcdefg-hijk-mnopqrst", 2)).toEqual([2, 17]);
237
+ (0, _vitest.expect)((0, _levenshteinSearch._expand)("abcdefghijklmnop", "abcdefg-hijk-mnopqrst", 3)).toEqual([2, 17]);
238
+ });
239
+ });
240
+ (0, _vitest.describe)("super long test", () => {
241
+ (0, _vitest.test)("super long test", () => {
242
+ const haystack = "lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua";
243
+ const needle = "lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua";
244
+ const results = [];
245
+ for (const result of (0, _levenshteinSearch.fuzzySearchCandidates)(needle, haystack, 24)) {
246
+ results.push(result);
247
+ }
248
+ console.log(results.reverse());
249
+ });
250
+ });