@intuned/browser-dev 0.1.4-dev.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 (212) hide show
  1. package/.babelrc +21 -0
  2. package/.eslintignore +10 -0
  3. package/.eslintrc.js +39 -0
  4. package/BROWSER_SCRIPTS_SETUP.md +84 -0
  5. package/LICENSE +43 -0
  6. package/README.md +160 -0
  7. package/RELEASE.md +60 -0
  8. package/dist/ai/export.d.js +5 -0
  9. package/dist/ai/export.d.ts +641 -0
  10. package/dist/ai/extractStructuredData.js +320 -0
  11. package/dist/ai/extractStructuredDataUsingAi.js +142 -0
  12. package/dist/ai/extractionHelpers/screenshotHelpers.js +56 -0
  13. package/dist/ai/extractionHelpers/validateSchema.js +148 -0
  14. package/dist/ai/index.d.ts +641 -0
  15. package/dist/ai/index.js +19 -0
  16. package/dist/ai/isPageLoaded.js +80 -0
  17. package/dist/ai/prompt.js +39 -0
  18. package/dist/ai/tests/testCheckAllTypesAreStrings.spec.js +137 -0
  19. package/dist/ai/tests/testExtractFromContent.spec.js +372 -0
  20. package/dist/ai/tests/testExtractStructuredData.spec.js +646 -0
  21. package/dist/ai/tests/testIsPageLoaded.spec.js +277 -0
  22. package/dist/ai/tools/index.js +48 -0
  23. package/dist/ai/types/errors.js +67 -0
  24. package/dist/ai/types/models.js +45 -0
  25. package/dist/ai/types/types.js +48 -0
  26. package/dist/ai/validators.js +167 -0
  27. package/dist/common/Logger/index.js +60 -0
  28. package/dist/common/Logger/types.js +5 -0
  29. package/dist/common/SdkError.js +50 -0
  30. package/dist/common/aiModelsValidations.js +32 -0
  31. package/dist/common/ensureBrowserScripts.js +14 -0
  32. package/dist/common/extendedTest.js +157 -0
  33. package/dist/common/extractionHelpers.js +19 -0
  34. package/dist/common/formatZodError.js +18 -0
  35. package/dist/common/fuzzySearch/fuzzySearch.test.js +250 -0
  36. package/dist/common/fuzzySearch/levenshtein-search.js +298 -0
  37. package/dist/common/fuzzySearch/utils.js +23 -0
  38. package/dist/common/getModelProvider.js +18 -0
  39. package/dist/common/getSimplifiedHtml.js +122 -0
  40. package/dist/common/hashObject.js +32 -0
  41. package/dist/common/html2markdown/convertElementToMarkdown.js +469 -0
  42. package/dist/common/html2markdown/index.js +19 -0
  43. package/dist/common/jwtTokenManager.js +57 -0
  44. package/dist/common/loadRuntime.js +16 -0
  45. package/dist/common/locatorHelpers.js +41 -0
  46. package/dist/common/matching/collectStrings.js +32 -0
  47. package/dist/common/matching/levenshtein.js +40 -0
  48. package/dist/common/matching/matching.js +317 -0
  49. package/dist/common/matching/types.js +1 -0
  50. package/dist/common/noEmpty.js +9 -0
  51. package/dist/common/saveSnapshotWithExamples.js +60 -0
  52. package/dist/common/script.js +2602 -0
  53. package/dist/common/tests/testEnsureBrowserScript.spec.js +31 -0
  54. package/dist/common/xpathMapping.js +107 -0
  55. package/dist/helpers/clickUntilExhausted.js +85 -0
  56. package/dist/helpers/downloadFile.js +125 -0
  57. package/dist/helpers/export.d.js +5 -0
  58. package/dist/helpers/export.d.ts +1220 -0
  59. package/dist/helpers/extractMarkdown.js +35 -0
  60. package/dist/helpers/filterEmptyValues.js +54 -0
  61. package/dist/helpers/gotoUrl.js +98 -0
  62. package/dist/helpers/index.d.ts +1220 -0
  63. package/dist/helpers/index.js +122 -0
  64. package/dist/helpers/processDate.js +25 -0
  65. package/dist/helpers/resolveUrl.js +64 -0
  66. package/dist/helpers/sanitizeHtml.js +74 -0
  67. package/dist/helpers/saveFileToS3.js +50 -0
  68. package/dist/helpers/scrollToLoadContent.js +57 -0
  69. package/dist/helpers/tests/testClickUntilExhausted.spec.js +372 -0
  70. package/dist/helpers/tests/testDownloadFile.spec.js +206 -0
  71. package/dist/helpers/tests/testExtractMarkdown.spec.js +290 -0
  72. package/dist/helpers/tests/testFilterEmptyValues.spec.js +151 -0
  73. package/dist/helpers/tests/testGoToUrl.spec.js +37 -0
  74. package/dist/helpers/tests/testProcessDate.spec.js +13 -0
  75. package/dist/helpers/tests/testResolveUrl.spec.js +341 -0
  76. package/dist/helpers/tests/testSanitizeHtml.spec.js +330 -0
  77. package/dist/helpers/tests/testScrollToLoadContent.spec.js +163 -0
  78. package/dist/helpers/tests/testValidateDataUsingSchema.spec.js +342 -0
  79. package/dist/helpers/tests/testWithDomSettledWait.spec.js +164 -0
  80. package/dist/helpers/tests/testWithNetworkIdleWait.spec.js +114 -0
  81. package/dist/helpers/types/Attachment.js +115 -0
  82. package/dist/helpers/types/CustomTypeRegistry.js +48 -0
  83. package/dist/helpers/types/RunEnvironment.js +18 -0
  84. package/dist/helpers/types/ValidationError.js +17 -0
  85. package/dist/helpers/types/index.js +51 -0
  86. package/dist/helpers/uploadFileToS3.js +154 -0
  87. package/dist/helpers/utils/getS3Client.js +22 -0
  88. package/dist/helpers/utils/index.js +73 -0
  89. package/dist/helpers/utils/isDownload.js +10 -0
  90. package/dist/helpers/utils/isGenerateCodeMode.js +9 -0
  91. package/dist/helpers/utils/isLocator.js +9 -0
  92. package/dist/helpers/utils/jwtTokenManager.js +18 -0
  93. package/dist/helpers/validateDataUsingSchema.js +103 -0
  94. package/dist/helpers/waitForDomSettled.js +90 -0
  95. package/dist/helpers/withNetworkSettledWait.js +91 -0
  96. package/dist/index.d.js +16 -0
  97. package/dist/index.d.ts +10 -0
  98. package/dist/index.js +16 -0
  99. package/dist/intunedServices/ApiGateway/aiApiGateway.js +143 -0
  100. package/dist/intunedServices/ApiGateway/factory.js +16 -0
  101. package/dist/intunedServices/ApiGateway/providers/Anthropic.js +26 -0
  102. package/dist/intunedServices/ApiGateway/providers/Gemini.js +29 -0
  103. package/dist/intunedServices/ApiGateway/providers/OpenAI.js +29 -0
  104. package/dist/intunedServices/ApiGateway/tests/testApiGateway.spec.js +355 -0
  105. package/dist/intunedServices/ApiGateway/types.js +11 -0
  106. package/dist/intunedServices/cache/cache.js +61 -0
  107. package/dist/intunedServices/cache/index.js +12 -0
  108. package/dist/intunedServices/cache/tests/testCache.spec.js +117 -0
  109. package/dist/optimized-extractors/common/buildExamplesPrompt.js +12 -0
  110. package/dist/optimized-extractors/common/buildImagesFromPage.js +55 -0
  111. package/dist/optimized-extractors/common/extractStructuredDataUsingClaude.js +135 -0
  112. package/dist/optimized-extractors/common/extractStructuredDataUsingGoogle.js +37 -0
  113. package/dist/optimized-extractors/common/extractStructuredDataUsingOpenAi.js +132 -0
  114. package/dist/optimized-extractors/common/extractStrucutredDataUsingAiInstance.js +122 -0
  115. package/dist/optimized-extractors/common/findTableHeaders.js +162 -0
  116. package/dist/optimized-extractors/common/index.js +55 -0
  117. package/dist/optimized-extractors/common/isTableHeaderOrFooter.js +84 -0
  118. package/dist/optimized-extractors/common/matching/matching.js +212 -0
  119. package/dist/optimized-extractors/common/matching/matching.test.js +655 -0
  120. package/dist/optimized-extractors/common/matching/types.js +18 -0
  121. package/dist/optimized-extractors/common/matching/utils.js +184 -0
  122. package/dist/optimized-extractors/common/utils.js +58 -0
  123. package/dist/optimized-extractors/export.d.js +5 -0
  124. package/dist/optimized-extractors/export.d.ts +397 -0
  125. package/dist/optimized-extractors/extractArray.js +120 -0
  126. package/dist/optimized-extractors/extractObject.js +104 -0
  127. package/dist/optimized-extractors/index.d.ts +397 -0
  128. package/dist/optimized-extractors/index.js +31 -0
  129. package/dist/optimized-extractors/listExtractionHelpers/__tests__/dynamicListExtractor.spec.js +269 -0
  130. package/dist/optimized-extractors/listExtractionHelpers/__tests__/findSetOfXpathsToCreateAnArrayExtractor.test.js +22 -0
  131. package/dist/optimized-extractors/listExtractionHelpers/__tests__/getContainerElement.test.js +21 -0
  132. package/dist/optimized-extractors/listExtractionHelpers/__tests__/partOfSameArrayXpath.test.js +42 -0
  133. package/dist/optimized-extractors/listExtractionHelpers/__tests__/testArrayExtractorFromLocator.spec.js +146 -0
  134. package/dist/optimized-extractors/listExtractionHelpers/__tests__/testArrayExtractorFromPage.spec.js +130 -0
  135. package/dist/optimized-extractors/listExtractionHelpers/__tests__/verifyThatAllXpathsArePartOfSameArray.test.js +9 -0
  136. package/dist/optimized-extractors/listExtractionHelpers/dynamicListExtractor.js +160 -0
  137. package/dist/optimized-extractors/listExtractionHelpers/errors.js +46 -0
  138. package/dist/optimized-extractors/listExtractionHelpers/getListMatches.js +14 -0
  139. package/dist/optimized-extractors/listExtractionHelpers/runAiExtraction.js +243 -0
  140. package/dist/optimized-extractors/listExtractionHelpers/typesAndSchema.js +5 -0
  141. package/dist/optimized-extractors/listExtractionHelpers/utils/extractPropertiesUsingGPTFromArray.js +277 -0
  142. package/dist/optimized-extractors/listExtractionHelpers/utils/extractStructuredListUsingAi.js +44 -0
  143. package/dist/optimized-extractors/listExtractionHelpers/utils/getListContainerXpath.js +94 -0
  144. package/dist/optimized-extractors/listExtractionHelpers/utils/getRelativeContainerXpathSelector.js +20 -0
  145. package/dist/optimized-extractors/listExtractionHelpers/utils/getSimplifiedHtmlPerListItem.js +21 -0
  146. package/dist/optimized-extractors/listExtractionHelpers/utils/tablesUtils.js +48 -0
  147. package/dist/optimized-extractors/listExtractionHelpers/utils/validateOptions.js +52 -0
  148. package/dist/optimized-extractors/models/anthropicModel.js +23 -0
  149. package/dist/optimized-extractors/models/openaiModel.js +23 -0
  150. package/dist/optimized-extractors/objectExtractionHelpers/AIExtractors.js +73 -0
  151. package/dist/optimized-extractors/objectExtractionHelpers/__tests__/checksumUtils.test.js +103 -0
  152. package/dist/optimized-extractors/objectExtractionHelpers/__tests__/testObjectExtractorFromLocator.spec.js +107 -0
  153. package/dist/optimized-extractors/objectExtractionHelpers/__tests__/testObjectExtractorFromPage.spec.js +107 -0
  154. package/dist/optimized-extractors/objectExtractionHelpers/calculateObjectExampleHash.js +28 -0
  155. package/dist/optimized-extractors/objectExtractionHelpers/captureSnapshot.js +26 -0
  156. package/dist/optimized-extractors/objectExtractionHelpers/checksumUtils.js +32 -0
  157. package/dist/optimized-extractors/objectExtractionHelpers/constants.js +7 -0
  158. package/dist/optimized-extractors/objectExtractionHelpers/dynamicObjectExtractor.js +106 -0
  159. package/dist/optimized-extractors/objectExtractionHelpers/errors.js +42 -0
  160. package/dist/optimized-extractors/objectExtractionHelpers/findDomMatches.js +54 -0
  161. package/dist/optimized-extractors/objectExtractionHelpers/getSimplifiedHtml.js +122 -0
  162. package/dist/optimized-extractors/objectExtractionHelpers/typesAndSchemas.js +5 -0
  163. package/dist/optimized-extractors/objectExtractionHelpers/validateDynamicObjectExtractorOptions.js +52 -0
  164. package/dist/optimized-extractors/types/aiModelsValidation.js +45 -0
  165. package/dist/optimized-extractors/types/errors.js +42 -0
  166. package/dist/optimized-extractors/types/jsonSchema.d.js +5 -0
  167. package/dist/optimized-extractors/types/jsonSchema.d.ts +50 -0
  168. package/dist/optimized-extractors/types/types.js +5 -0
  169. package/dist/optimized-extractors/validators.js +152 -0
  170. package/dist/types/intuned-runtime.d.js +1 -0
  171. package/dist/types/intuned-runtime.d.ts +64 -0
  172. package/dist/vite-env.d.js +1 -0
  173. package/dist/vite-env.d.ts +9 -0
  174. package/generated-docs/ai/functions/extractStructuredData.mdx +255 -0
  175. package/generated-docs/ai/functions/isPageLoaded.mdx +88 -0
  176. package/generated-docs/ai/interfaces/ArraySchema.mdx +36 -0
  177. package/generated-docs/ai/interfaces/BasicSchema.mdx +14 -0
  178. package/generated-docs/ai/interfaces/BooleanSchema.mdx +28 -0
  179. package/generated-docs/ai/interfaces/ImageBufferContentItem.mdx +16 -0
  180. package/generated-docs/ai/interfaces/ImageUrlContentItem.mdx +16 -0
  181. package/generated-docs/ai/interfaces/NumberSchema.mdx +35 -0
  182. package/generated-docs/ai/interfaces/ObjectSchema.mdx +39 -0
  183. package/generated-docs/ai/interfaces/StringSchema.mdx +35 -0
  184. package/generated-docs/ai/interfaces/TextContentItem.mdx +14 -0
  185. package/generated-docs/ai/type-aliases/ContentItem.mdx +12 -0
  186. package/generated-docs/ai/type-aliases/JsonSchema.mdx +47 -0
  187. package/generated-docs/ai/type-aliases/SUPPORTED_MODELS.mdx +85 -0
  188. package/generated-docs/helpers/functions/downloadFile.mdx +99 -0
  189. package/generated-docs/helpers/functions/extractMarkdown.mdx +56 -0
  190. package/generated-docs/helpers/functions/filterEmptyValues.mdx +51 -0
  191. package/generated-docs/helpers/functions/goToUrl.mdx +124 -0
  192. package/generated-docs/helpers/functions/processDate.mdx +55 -0
  193. package/generated-docs/helpers/functions/resolveUrl.mdx +165 -0
  194. package/generated-docs/helpers/functions/sanitizeHtml.mdx +113 -0
  195. package/generated-docs/helpers/functions/saveFileToS3.mdx +127 -0
  196. package/generated-docs/helpers/functions/scrollToLoadContent.mdx +89 -0
  197. package/generated-docs/helpers/functions/uploadFileToS3.mdx +121 -0
  198. package/generated-docs/helpers/functions/validateDataUsingSchema.mdx +90 -0
  199. package/generated-docs/helpers/functions/waitForDomSettled.mdx +91 -0
  200. package/generated-docs/helpers/functions/withNetworkSettledWait.mdx +76 -0
  201. package/generated-docs/helpers/interfaces/Attachment.mdx +56 -0
  202. package/generated-docs/helpers/interfaces/S3Configs.mdx +52 -0
  203. package/generated-docs/helpers/interfaces/SanitizeHtmlOptions.mdx +22 -0
  204. package/generated-docs/helpers/type-aliases/AttachmentType.mdx +10 -0
  205. package/generated-docs/helpers/type-aliases/FileType.mdx +61 -0
  206. package/generated-docs/helpers/type-aliases/Trigger.mdx +62 -0
  207. package/how-to-generate-docs.md +61 -0
  208. package/how-to-run-tests.md +42 -0
  209. package/intuned-runtime-setup.md +13 -0
  210. package/package.json +124 -0
  211. package/tsconfig.eslint.json +5 -0
  212. package/tsconfig.json +26 -0
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.logger = void 0;
7
+ var _nodeUtil = require("node:util");
8
+ var _chalk = _interopRequireDefault(require("chalk"));
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ const format = _nodeUtil.formatWithOptions.bind(undefined, {
11
+ colors: true
12
+ });
13
+ const LOG_LEVEL_COLORS = {
14
+ TRACE: _chalk.default.gray,
15
+ DEBUG: _chalk.default.blue,
16
+ INFO: _chalk.default.green,
17
+ WARN: _chalk.default.yellow,
18
+ ERROR: _chalk.default.red
19
+ };
20
+ class Logger {
21
+ logFunction(entry) {
22
+ const {
23
+ level,
24
+ timestamp,
25
+ message,
26
+ meta
27
+ } = entry;
28
+ const date = new Date(timestamp);
29
+ const levelColor = LOG_LEVEL_COLORS[level];
30
+ if (meta === undefined) {
31
+ process.stderr.write(`${format(date)} [@intuned/sdk][${levelColor(level)}] ${message}\n`);
32
+ } else {
33
+ process.stderr.write(`${format(date)} [@intuned/sdk][${levelColor(level)}] ${message} ${format(meta)}\n`);
34
+ }
35
+ }
36
+ log(level, message, meta) {
37
+ this.logFunction({
38
+ level,
39
+ message,
40
+ meta: meta && Object.keys(meta).length === 0 ? undefined : meta,
41
+ timestamp: Date.now()
42
+ });
43
+ }
44
+ trace(message, meta) {
45
+ this.log("TRACE", message, meta);
46
+ }
47
+ debug(message, meta) {
48
+ this.log("DEBUG", message, meta);
49
+ }
50
+ info(message, meta) {
51
+ this.log("INFO", message, meta);
52
+ }
53
+ warn(message, meta) {
54
+ this.log("WARN", message, meta);
55
+ }
56
+ error(message, meta) {
57
+ this.log("ERROR", message, meta);
58
+ }
59
+ }
60
+ const logger = exports.logger = new Logger();
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.captureUserStack = exports.SdkError = void 0;
7
+ var _stackUtils = _interopRequireDefault(require("stack-utils"));
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
+ const stack = new _stackUtils.default({
10
+ cwd: process.cwd(),
11
+ internals: _stackUtils.default.nodeInternals()
12
+ });
13
+ class SdkError extends Error {
14
+ constructor(message, userStack) {
15
+ super(message);
16
+ this.name = "SdkError";
17
+ this.stack = `${this.name}: ${this.message}\nCaused by:\n${userStack}`;
18
+ }
19
+ }
20
+ exports.SdkError = SdkError;
21
+ const captureUserStack = () => {
22
+ const traces = stack.capture();
23
+ const filteredTraces = traces.filter(i => {
24
+ const fileName = i.getFileName();
25
+ const typeName = i.getTypeName();
26
+ if (typeName === "Proxy") return false;
27
+ if (fileName !== null && fileName !== void 0 && fileName.includes("dist/commands/") || fileName !== null && fileName !== void 0 && fileName.includes("captureUserStack") || fileName !== null && fileName !== void 0 && fileName.includes("SdkError")) return false;
28
+ return true;
29
+ });
30
+ const originalStack = filteredTraces.map(formatCallSite);
31
+ return originalStack.join("\n");
32
+ };
33
+ exports.captureUserStack = captureUserStack;
34
+ function formatCallSite(callSite) {
35
+ const functionName = callSite.getFunctionName() || "anonymous";
36
+ const methodName = callSite.getMethodName();
37
+ const typeName = callSite.getTypeName();
38
+ const fileName = callSite.getFileName();
39
+ const lineNumber = callSite.getLineNumber();
40
+ const columnNumber = callSite.getColumnNumber();
41
+ let methodPart = functionName;
42
+ if (methodName && functionName !== methodName) {
43
+ methodPart = `${functionName} [as ${methodName}]`;
44
+ }
45
+ let typePart = "";
46
+ if (typeName) {
47
+ typePart = `${typeName}.`;
48
+ }
49
+ return `at ${typePart}${methodPart} (${fileName === null || fileName === void 0 ? void 0 : fileName.replace(process.cwd(), ".")}:${lineNumber}:${columnNumber})`;
50
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SUPPPORTED_GPT_MODELS = exports.SUPPPORTED_CLAUDE_MODELS = exports.SUPPORTED_MODELS = exports.MODELS_MAPPINGS = exports.MAX_TOKENS_OVERRIDES = exports.GPT_MODELS = exports.GOOGLE_MODELS = exports.CLAUDE_VISION_SUPPORTED_MODELS = exports.CLAUDE_MODELS_MAPPINGS = exports.CLAUDE_MODELS = void 0;
7
+ const CLAUDE_MODELS = exports.CLAUDE_MODELS = ["claude-opus-4-20250514", "claude-sonnet-4-20250514", "claude-3-7-sonnet-20250219", "claude-3-5-sonnet-20241022", "claude-3-5-sonnet-20240620", "claude-3-5-haiku-20241022", "claude-3-opus-20240229", "claude-3-sonnet-20240229", "claude-3-haiku-20240307"];
8
+ const MAX_TOKENS_OVERRIDES = exports.MAX_TOKENS_OVERRIDES = {
9
+ "claude-3-5-sonnet-20240620": 8192,
10
+ "gemini-1.5-pro-002": 8192,
11
+ "gemini-1.5-flash-8b-002": 8192,
12
+ "gemini-1.5-flash-002": 8192,
13
+ "gemini-2.0-flash-exp": 8192
14
+ };
15
+ const CLAUDE_VISION_SUPPORTED_MODELS = exports.CLAUDE_VISION_SUPPORTED_MODELS = [...CLAUDE_MODELS];
16
+ const CLAUDE_MODELS_MAPPINGS = exports.CLAUDE_MODELS_MAPPINGS = {
17
+ "claude-3-haiku": "claude-3-haiku-20240307",
18
+ "claude-3-5-haiku": "claude-3-5-haiku-20241022",
19
+ "claude-3-opus": "claude-3-opus-20240229",
20
+ "claude-3-sonnet": "claude-3-sonnet-20240229",
21
+ "claude-3.5-sonnet": "claude-3-5-sonnet-20241022",
22
+ "claude-4-sonnet": "claude-sonnet-4-20250514",
23
+ "claude-4-opus": "claude-opus-4-20250514"
24
+ };
25
+ const GPT_MODELS = exports.GPT_MODELS = ["gpt-4.1", "gpt-4.1-mini", "gpt-4.1-nano", "gpt-4o", "gpt-4o-mini", "gpt-4o-audio-preview", "gpt-4-turbo", "gpt-4", "gpt-3.5-turbo", "o1", "o1-mini", "o1-preview", "o3-mini", "o3", "o4-mini", "chatgpt-4o-latest", "gpt4-turbo"];
26
+ const GOOGLE_MODELS = exports.GOOGLE_MODELS = ["gemini-2.5-pro", "gemini-2.5-flash", "gemini-2.5-flash-lite", "gemini-2.5-flash-lite-preview-06-17", "gemini-2.0-flash", "gemini-1.5-pro", "gemini-1.5-pro-latest", "gemini-1.5-flash", "gemini-1.5-flash-latest", "gemini-1.5-flash-8b", "gemini-1.5-flash-8b-latest"];
27
+ const MODELS_MAPPINGS = exports.MODELS_MAPPINGS = {
28
+ ...CLAUDE_MODELS_MAPPINGS
29
+ };
30
+ const SUPPPORTED_CLAUDE_MODELS = exports.SUPPPORTED_CLAUDE_MODELS = ["claude-3-5-haiku-20241022", "claude-3-5-haiku-latest", "claude-3-5-sonnet-20240620", "claude-3-5-sonnet-20241022", "claude-3-5-sonnet-latest", "claude-3-7-sonnet-20250219", "claude-3-7-sonnet-latest", "claude-3-haiku-20240307", "claude-4-opus-20250514", "claude-4-sonnet-20250514", "claude-opus-4-1", "claude-opus-4-1-20250805", "claude-opus-4-20250514", "claude-sonnet-4-20250514"];
31
+ const SUPPPORTED_GPT_MODELS = exports.SUPPPORTED_GPT_MODELS = ["gpt-3.5-turbo", "gpt-3.5-turbo-0125", "gpt-3.5-turbo-0301", "gpt-3.5-turbo-0613", "gpt-3.5-turbo-1106", "gpt-3.5-turbo-16k", "gpt-3.5-turbo-16k-0613", "gpt-3.5-turbo-instruct", "gpt-3.5-turbo-instruct-0914", "gpt-4", "gpt-4-0314", "gpt-4-0613", "gpt-4-32k", "gpt-4-32k-0314", "gpt-4-32k-0613", "gpt-4-turbo", "gpt-4-turbo-2024-04-09", "gpt-4.1", "gpt-4.1-2025-04-14", "gpt-4.1-mini", "gpt-4.1-mini-2025-04-14", "gpt-4.1-nano", "gpt-4.1-nano-2025-04-14", "gpt-4o", "gpt-4o-2024-05-13", "gpt-4o-2024-08-06", "gpt-4o-2024-11-20", "gpt-4o-mini", "gpt-4o-mini-2024-07-18", "gpt-5", "gpt-5-2025-08-07", "gpt-5-chat", "gpt-5-chat-latest", "gpt-5-mini", "gpt-5-mini-2025-08-07", "gpt-5-nano", "gpt-5-nano-2025-08-07", "o1", "o1-2024-12-17", "o1-mini", "o1-mini-2024-09-12", "o1-pro", "o1-pro-2025-03-19", "o3", "o3-2025-04-16", "o3-deep-research", "o3-deep-research-2025-06-26", "o3-mini", "o3-mini-2025-01-31", "o3-pro", "o3-pro-2025-06-10", "o4-mini", "o4-mini-2025-04-16", "o4-mini-deep-research", "o4-mini-deep-research-2025-06-26"];
32
+ const SUPPORTED_MODELS = exports.SUPPORTED_MODELS = [...SUPPPORTED_CLAUDE_MODELS, ...SUPPPORTED_GPT_MODELS];
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ensureBrowserScripts = ensureBrowserScripts;
7
+ var _script = require("./script");
8
+ async function ensureBrowserScripts(page) {
9
+ const pageHasScript = await page.evaluate('() => typeof window.__INTUNED__ !== "undefined"');
10
+ if (pageHasScript) {
11
+ return;
12
+ }
13
+ await page.evaluate(_script.BROWSER_SCRIPT);
14
+ }
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "afterAll", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _vitest.afterAll;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "afterEach", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _vitest.afterEach;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "beforeAll", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _vitest.beforeAll;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "beforeEach", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _vitest.beforeEach;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "describe", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _vitest.describe;
34
+ }
35
+ });
36
+ exports.expect = void 0;
37
+ Object.defineProperty(exports, "it", {
38
+ enumerable: true,
39
+ get: function () {
40
+ return _vitest.it;
41
+ }
42
+ });
43
+ exports.test = void 0;
44
+ Object.defineProperty(exports, "vi", {
45
+ enumerable: true,
46
+ get: function () {
47
+ return _vitest.vi;
48
+ }
49
+ });
50
+ var dotenv = _interopRequireWildcard(require("dotenv"));
51
+ var _vitest = require("vitest");
52
+ var _nanoid = require("nanoid");
53
+ var _extractionHelpers = require("./extractionHelpers");
54
+ var _script = require("./script");
55
+ 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); }
56
+ dotenv.config();
57
+ const loadRuntime = async () => {
58
+ try {
59
+ const runtime = await Promise.resolve().then(() => _interopRequireWildcard(require("@intuned/runtime")));
60
+ return {
61
+ withPlaywrightContext: runtime.withPlaywrightContext,
62
+ runWithContext: runtime.runWithContext,
63
+ getDownloadDirectoryPath: runtime.getDownloadDirectoryPath
64
+ };
65
+ } catch {
66
+ return {
67
+ withPlaywrightContext: null,
68
+ runWithContext: null,
69
+ getDownloadDirectoryPath: null
70
+ };
71
+ }
72
+ };
73
+ const withPlaywright = (name, testFn, {
74
+ headless,
75
+ trace,
76
+ runId,
77
+ jobId,
78
+ jobRunId,
79
+ queueId
80
+ }) => {
81
+ return async () => {
82
+ const runtime = await loadRuntime();
83
+ if (!runtime.runWithContext || !runtime.withPlaywrightContext || !runtime.getDownloadDirectoryPath) {
84
+ throw new Error("@intuned/runtime is required for running tests. Please install it as a dependency.");
85
+ }
86
+ return runtime.runWithContext({
87
+ runId: runId ?? (0, _nanoid.nanoid)(),
88
+ extendedPayloads: [],
89
+ runEnvironment: "IDE",
90
+ jobId,
91
+ jobRunId,
92
+ queueId
93
+ }, async () => {
94
+ const downloadsPath = runtime.getDownloadDirectoryPath();
95
+ await runtime.withPlaywrightContext({
96
+ headless: headless ?? true,
97
+ downloadsPath
98
+ }, async (context, page) => {
99
+ context.setDefaultTimeout(10000);
100
+ try {
101
+ await context.addInitScript({
102
+ content: _script.BROWSER_SCRIPT
103
+ });
104
+ for (const page of context.pages()) {
105
+ await page.evaluate(_script.BROWSER_SCRIPT);
106
+ }
107
+ } catch (error) {
108
+ console.error("Error reading browser scripts:", error);
109
+ }
110
+ if (trace) {
111
+ await context.tracing.start({
112
+ screenshots: true
113
+ });
114
+ }
115
+ await testFn({
116
+ context: context,
117
+ page
118
+ });
119
+ if (trace) {
120
+ await context.tracing.stop({
121
+ path: `./reports/traces/${name}.zip`
122
+ });
123
+ }
124
+ return {};
125
+ });
126
+ });
127
+ };
128
+ };
129
+ const test = (name, fn, options = {}) => {
130
+ if (process.env.CI) {
131
+ options.headless = true;
132
+ } else {
133
+ options.timeout = 1000000;
134
+ }
135
+ return (0, _vitest.test)(name, withPlaywright(name, fn, options), options);
136
+ };
137
+ exports.test = test;
138
+ _vitest.expect.extend({
139
+ async toHaveText(locator, expectedText) {
140
+ const textContent = await locator.textContent();
141
+ const pass = !!textContent && (0, _extractionHelpers.compressStringSpaces)(textContent) === expectedText;
142
+ return {
143
+ pass,
144
+ message: () => `Expected locator with selector "${locator}" to have text "${expectedText}", but it has "${textContent}"`
145
+ };
146
+ }
147
+ });
148
+ test.skip = _vitest.test.skip;
149
+ test.only = (name, fn, options = {}) => {
150
+ if (process.env.CI) {
151
+ options.headless = true;
152
+ } else {
153
+ options.timeout = 1000000;
154
+ }
155
+ return _vitest.test.only(name, withPlaywright(name, fn, options), options);
156
+ };
157
+ 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
+ });