@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.
- package/.babelrc +21 -0
- package/.eslintignore +10 -0
- package/.eslintrc.js +39 -0
- package/LICENSE +43 -0
- package/dist/ai-extractors/AnthropicClient/index.js +23 -0
- package/dist/ai-extractors/export.d.js +5 -0
- package/dist/ai-extractors/export.d.ts +422 -0
- package/dist/ai-extractors/extractStructuredData.js +79 -0
- package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/constants.js +7 -0
- package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/errors.js +42 -0
- package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/extractStructuredDataUsingClaude.js +149 -0
- package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/extractStructuredDataUsingGoogle.js +37 -0
- package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/extractStructuredDataUsingOpenAi.js +144 -0
- package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/extractStrucutredDataUsingAiInstance.js +123 -0
- package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/index.js +55 -0
- package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/isItemTableHeaderOrFooter.js +96 -0
- package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/screenshotHelpers.js +55 -0
- package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/types.js +5 -0
- package/dist/ai-extractors/extractionHelpers/extractStructuredDataUsingAi/utils.js +53 -0
- package/dist/ai-extractors/extractionHelpers/types.js +5 -0
- package/dist/ai-extractors/fileExtractors.js +176 -0
- package/dist/ai-extractors/index.js +31 -0
- package/dist/ai-extractors/jsonSchema.d.js +5 -0
- package/dist/ai-extractors/jsonSchema.d.ts +49 -0
- package/dist/ai-extractors/openAiClients/index.js +23 -0
- package/dist/ai-extractors/validators.js +239 -0
- package/dist/browser/ai/export.d.js +3 -0
- package/dist/browser/ai/export.d.ts +587 -0
- package/dist/browser/ai/extractMarkdown.js +15 -0
- package/dist/browser/ai/extractStructuredData.js +231 -0
- package/dist/browser/ai/extractStructuredDataUsingAi.js +140 -0
- package/dist/browser/ai/extractionHelpers/screenshotHelpers.js +55 -0
- package/dist/browser/ai/extractionHelpers/validateSchema.js +148 -0
- package/dist/browser/ai/index.d.ts +587 -0
- package/dist/browser/ai/index.js +19 -0
- package/dist/browser/ai/isPageLoaded.js +67 -0
- package/dist/browser/ai/prompt.js +39 -0
- package/dist/browser/ai/tests/testCheckAllTypesAreStrings.spec.js +143 -0
- package/dist/browser/ai/tests/testExtractStructuredData.spec.js +622 -0
- package/dist/browser/ai/tools/index.js +48 -0
- package/dist/browser/ai/types/errors.js +67 -0
- package/dist/browser/ai/types/models.js +45 -0
- package/dist/browser/ai/types/types.js +48 -0
- package/dist/browser/ai/validators.js +136 -0
- package/dist/common/Logger/index.js +60 -0
- package/dist/common/Logger/types.js +5 -0
- package/dist/common/SdkError.js +50 -0
- package/dist/common/aiModelsValidations.js +50 -0
- package/dist/common/browser_scripts.js +2596 -0
- package/dist/common/ensureBrowserScripts.js +17 -0
- package/dist/common/environmentVariables.js +16 -0
- package/dist/common/eventTracking/getAiTrackingHeaders.js +31 -0
- package/dist/common/eventTracking/getFileTrackingHeaders.js +23 -0
- package/dist/common/extendedTest.js +148 -0
- package/dist/common/extractionHelpers.js +19 -0
- package/dist/common/formatZodError.js +18 -0
- package/dist/common/fuzzySearch/fuzzySearch.test.js +250 -0
- package/dist/common/fuzzySearch/levenshtein-search.js +298 -0
- package/dist/common/fuzzySearch/utils.js +23 -0
- package/dist/common/getModelProvider.js +18 -0
- package/dist/common/getSimplifiedHtml.js +122 -0
- package/dist/common/hashObject.js +32 -0
- package/dist/common/html2markdown/convertElementToMarkdown.js +469 -0
- package/dist/common/html2markdown/index.js +19 -0
- package/dist/common/jwtTokenManager.js +18 -0
- package/dist/common/loadRuntime.js +16 -0
- package/dist/common/locatorHelpers.js +41 -0
- package/dist/common/matching/collectStrings.js +32 -0
- package/dist/common/matching/levenshtein.js +40 -0
- package/dist/common/matching/matching.js +317 -0
- package/dist/common/matching/types.js +1 -0
- package/dist/common/noEmpty.js +9 -0
- package/dist/common/saveSnapshotWithExamples.js +60 -0
- package/dist/common/tests/testEnsureBrowserScript.spec.js +31 -0
- package/dist/common/xpathMapping.js +107 -0
- package/dist/helpers/downloadFile.js +125 -0
- package/dist/helpers/export.d.js +1 -0
- package/dist/helpers/export.d.ts +1294 -0
- package/dist/helpers/extractMarkdown.js +35 -0
- package/dist/helpers/filterEmptyValues.js +54 -0
- package/dist/helpers/gotoUrl.js +93 -0
- package/dist/helpers/index.d.ts +1294 -0
- package/dist/helpers/index.js +115 -0
- package/dist/helpers/processDate.js +25 -0
- package/dist/helpers/resolveUrl.js +63 -0
- package/dist/helpers/sanitizeHtml.js +73 -0
- package/dist/helpers/saveFileToS3.js +46 -0
- package/dist/helpers/scrollToLoadContent.js +50 -0
- package/dist/helpers/tests/extendedTest.js +130 -0
- package/dist/helpers/tests/testDownloadFile.spec.js +197 -0
- package/dist/helpers/tests/testFilterEmptyValues.spec.js +151 -0
- package/dist/helpers/tests/testGoToUrl.spec.js +37 -0
- package/dist/helpers/tests/testIsPageLoaded.spec.js +285 -0
- package/dist/helpers/tests/testProcessDate.spec.js +13 -0
- package/dist/helpers/tests/testResolveUrl.spec.js +341 -0
- package/dist/helpers/tests/testSanitizeHtml.spec.js +330 -0
- package/dist/helpers/tests/testSimplifyHtml.spec.js +251 -0
- package/dist/helpers/tests/testValidateDataUsingSchema.spec.js +380 -0
- package/dist/helpers/tests/testWaitForDomSettled.spec.js +169 -0
- package/dist/helpers/tests/testWaitForNetworkIdle.spec.js +115 -0
- package/dist/helpers/types/Attachment.js +81 -0
- package/dist/helpers/types/CustomTypeRegistry.js +48 -0
- package/dist/helpers/types/RunEnvironment.js +18 -0
- package/dist/helpers/types/ValidationError.js +17 -0
- package/dist/helpers/types/index.js +51 -0
- package/dist/helpers/uploadFileToS3.js +153 -0
- package/dist/helpers/utils/getS3Client.js +21 -0
- package/dist/helpers/utils/index.js +73 -0
- package/dist/helpers/utils/isDownload.js +10 -0
- package/dist/helpers/utils/isGenerateCodeMode.js +9 -0
- package/dist/helpers/utils/isLocator.js +9 -0
- package/dist/helpers/utils/jwtTokenManager.js +18 -0
- package/dist/helpers/validateDataUsingSchema.js +119 -0
- package/dist/helpers/waitForDomSettled.js +182 -0
- package/dist/helpers/waitForNetworkIdle.js +191 -0
- package/dist/index.d.js +82 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +84 -0
- package/dist/intunedServices/ApiGateway/aiApiGateway.js +87 -0
- package/dist/intunedServices/ApiGateway/factory.js +13 -0
- package/dist/intunedServices/ApiGateway/providers/Anthropic.js +26 -0
- package/dist/intunedServices/ApiGateway/providers/Gemini.js +29 -0
- package/dist/intunedServices/ApiGateway/providers/OpenAI.js +29 -0
- package/dist/intunedServices/ApiGateway/tests/testApiGateway.spec.js +221 -0
- package/dist/intunedServices/ApiGateway/types.js +11 -0
- package/dist/intunedServices/cache/cache.js +61 -0
- package/dist/intunedServices/cache/index.js +12 -0
- package/dist/intunedServices/cache/tests/testCache.spec.js +117 -0
- package/dist/optimized-extractors/common/buildExamplesPrompt.js +12 -0
- package/dist/optimized-extractors/common/buildImagesFromPage.js +55 -0
- package/dist/optimized-extractors/common/extractStructuredDataUsingClaude.js +149 -0
- package/dist/optimized-extractors/common/extractStructuredDataUsingGoogle.js +37 -0
- package/dist/optimized-extractors/common/extractStructuredDataUsingOpenAi.js +145 -0
- package/dist/optimized-extractors/common/extractStrucutredDataUsingAiInstance.js +122 -0
- package/dist/optimized-extractors/common/findTableHeaders.js +175 -0
- package/dist/optimized-extractors/common/index.js +55 -0
- package/dist/optimized-extractors/common/isTableHeaderOrFooter.js +97 -0
- package/dist/optimized-extractors/common/matching/matching.js +212 -0
- package/dist/optimized-extractors/common/matching/matching.test.js +655 -0
- package/dist/optimized-extractors/common/matching/types.js +18 -0
- package/dist/optimized-extractors/common/matching/utils.js +184 -0
- package/dist/optimized-extractors/common/utils.js +58 -0
- package/dist/optimized-extractors/export.d.js +5 -0
- package/dist/optimized-extractors/export.d.ts +397 -0
- package/dist/optimized-extractors/extractArray.js +120 -0
- package/dist/optimized-extractors/extractObject.js +104 -0
- package/dist/optimized-extractors/index.d.ts +397 -0
- package/dist/optimized-extractors/index.js +31 -0
- package/dist/optimized-extractors/listExtractionHelpers/__tests__/dynamicListExtractor.spec.js +312 -0
- package/dist/optimized-extractors/listExtractionHelpers/__tests__/findSetOfXpathsToCreateAnArrayExtractor.test.js +22 -0
- package/dist/optimized-extractors/listExtractionHelpers/__tests__/getContainerElement.test.js +21 -0
- package/dist/optimized-extractors/listExtractionHelpers/__tests__/partOfSameArrayXpath.test.js +42 -0
- package/dist/optimized-extractors/listExtractionHelpers/__tests__/verifyThatAllXpathsArePartOfSameArray.test.js +9 -0
- package/dist/optimized-extractors/listExtractionHelpers/dynamicListExtractor.js +152 -0
- package/dist/optimized-extractors/listExtractionHelpers/errors.js +46 -0
- package/dist/optimized-extractors/listExtractionHelpers/getListMatches.js +14 -0
- package/dist/optimized-extractors/listExtractionHelpers/runAiExtraction.js +240 -0
- package/dist/optimized-extractors/listExtractionHelpers/typesAndSchema.js +5 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/extractPropertiesUsingGPTFromArray.js +277 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/extractStructuredListUsingAi.js +44 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/getListContainerXpath.js +94 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/getRelativeContainerXpathSelector.js +20 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/getSimplifiedHtmlPerListItem.js +21 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/tablesUtils.js +48 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/validateOptions.js +52 -0
- package/dist/optimized-extractors/models/anthropicModel.js +23 -0
- package/dist/optimized-extractors/models/openaiModel.js +23 -0
- package/dist/optimized-extractors/objectExtractionHelpers/AIExtractors.js +73 -0
- package/dist/optimized-extractors/objectExtractionHelpers/__tests__/checksumUtils.test.js +103 -0
- package/dist/optimized-extractors/objectExtractionHelpers/__tests__/testObjectExtractorFromLocator.spec.js +107 -0
- package/dist/optimized-extractors/objectExtractionHelpers/__tests__/testObjectExtractorFromPage.spec.js +107 -0
- package/dist/optimized-extractors/objectExtractionHelpers/calculateObjectExampleHash.js +28 -0
- package/dist/optimized-extractors/objectExtractionHelpers/captureSnapshot.js +26 -0
- package/dist/optimized-extractors/objectExtractionHelpers/checksumUtils.js +32 -0
- package/dist/optimized-extractors/objectExtractionHelpers/constants.js +7 -0
- package/dist/optimized-extractors/objectExtractionHelpers/dynamicObjectExtractor.js +106 -0
- package/dist/optimized-extractors/objectExtractionHelpers/errors.js +42 -0
- package/dist/optimized-extractors/objectExtractionHelpers/findDomMatches.js +54 -0
- package/dist/optimized-extractors/objectExtractionHelpers/getSimplifiedHtml.js +122 -0
- package/dist/optimized-extractors/objectExtractionHelpers/typesAndSchemas.js +5 -0
- package/dist/optimized-extractors/objectExtractionHelpers/validateDynamicObjectExtractorOptions.js +52 -0
- package/dist/optimized-extractors/types/aiModelsValidation.js +45 -0
- package/dist/optimized-extractors/types/errors.js +42 -0
- package/dist/optimized-extractors/types/jsonSchema.d.js +5 -0
- package/dist/optimized-extractors/types/jsonSchema.d.ts +50 -0
- package/dist/optimized-extractors/types/types.js +5 -0
- package/dist/optimized-extractors/validators.js +152 -0
- package/dist/vite-env.d.js +1 -0
- package/dist/vite-env.d.ts +9 -0
- package/docs.md +14 -0
- package/how-to-run-tests.md +10 -0
- package/intuned-runtime-setup.md +13 -0
- package/package.json +124 -0
- package/tsconfig.eslint.json +5 -0
- 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
|
+
});
|