vectra 0.12.2 → 0.14.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.
- package/LICENSE +1 -1
- package/README.md +92 -100
- package/bin/vectra.js +3 -0
- package/lib/BrowserWebFetcher.d.ts +75 -0
- package/lib/BrowserWebFetcher.d.ts.map +1 -0
- package/lib/BrowserWebFetcher.js +290 -0
- package/lib/BrowserWebFetcher.js.map +1 -0
- package/lib/FileFetcher.d.ts +5 -0
- package/lib/FileFetcher.d.ts.map +1 -0
- package/lib/FileFetcher.js +89 -0
- package/lib/FileFetcher.js.map +1 -0
- package/lib/FileFetcher.spec.d.ts +2 -0
- package/lib/FileFetcher.spec.d.ts.map +1 -0
- package/lib/FileFetcher.spec.js +244 -0
- package/lib/FileFetcher.spec.js.map +1 -0
- package/lib/FolderWatcher.d.ts +91 -0
- package/lib/FolderWatcher.d.ts.map +1 -0
- package/lib/FolderWatcher.js +304 -0
- package/lib/FolderWatcher.js.map +1 -0
- package/lib/FolderWatcher.spec.d.ts +2 -0
- package/lib/FolderWatcher.spec.d.ts.map +1 -0
- package/lib/FolderWatcher.spec.js +308 -0
- package/lib/FolderWatcher.spec.js.map +1 -0
- package/lib/GPT3Tokenizer.d.ts +9 -0
- package/lib/GPT3Tokenizer.spec.d.ts +2 -0
- package/lib/GPT3Tokenizer.spec.d.ts.map +1 -0
- package/lib/GPT3Tokenizer.spec.js +45 -0
- package/lib/GPT3Tokenizer.spec.js.map +1 -0
- package/lib/ItemSelector.d.ts +41 -0
- package/lib/ItemSelector.d.ts.map +1 -0
- package/lib/ItemSelector.js +179 -0
- package/lib/ItemSelector.js.map +1 -0
- package/lib/ItemSelector.spec.d.ts +2 -0
- package/lib/ItemSelector.spec.d.ts.map +1 -0
- package/lib/ItemSelector.spec.js +204 -0
- package/lib/ItemSelector.spec.js.map +1 -0
- package/lib/LocalDocument.d.ts +54 -0
- package/lib/LocalDocument.d.ts.map +1 -1
- package/lib/LocalDocument.js +116 -0
- package/lib/LocalDocument.js.map +1 -0
- package/lib/LocalDocument.spec.d.ts +2 -0
- package/lib/LocalDocument.spec.d.ts.map +1 -0
- package/lib/LocalDocument.spec.js +214 -0
- package/lib/LocalDocument.spec.js.map +1 -0
- package/lib/LocalDocumentIndex.d.ts +152 -0
- package/lib/LocalDocumentIndex.d.ts.map +1 -1
- package/lib/LocalDocumentIndex.js +420 -0
- package/lib/LocalDocumentIndex.js.map +1 -0
- package/lib/LocalDocumentIndex.spec.d.ts +2 -0
- package/lib/LocalDocumentIndex.spec.d.ts.map +1 -0
- package/lib/LocalDocumentIndex.spec.js +494 -0
- package/lib/LocalDocumentIndex.spec.js.map +1 -0
- package/lib/LocalDocumentResult.d.ts +66 -0
- package/lib/LocalDocumentResult.d.ts.map +1 -1
- package/lib/LocalDocumentResult.js +376 -0
- package/lib/LocalDocumentResult.js.map +1 -0
- package/lib/LocalDocumentResult.spec.d.ts +2 -0
- package/lib/LocalDocumentResult.spec.d.ts.map +1 -0
- package/lib/LocalDocumentResult.spec.js +373 -0
- package/lib/LocalDocumentResult.spec.js.map +1 -0
- package/lib/LocalEmbeddings.d.ts +59 -0
- package/lib/LocalEmbeddings.d.ts.map +1 -0
- package/lib/LocalEmbeddings.js +101 -0
- package/lib/LocalEmbeddings.js.map +1 -0
- package/lib/LocalEmbeddings.spec.d.ts +2 -0
- package/lib/LocalEmbeddings.spec.d.ts.map +1 -0
- package/lib/LocalEmbeddings.spec.js +155 -0
- package/lib/LocalEmbeddings.spec.js.map +1 -0
- package/lib/LocalIndex.d.ts +159 -0
- package/lib/LocalIndex.d.ts.map +1 -1
- package/lib/LocalIndex.js +519 -0
- package/lib/LocalIndex.js.map +1 -0
- package/lib/LocalIndex.spec.d.ts +2 -0
- package/lib/LocalIndex.spec.js +611 -9
- package/lib/LocalIndex.spec.js.map +1 -1
- package/lib/OpenAIEmbeddings.d.ts +124 -0
- package/lib/OpenAIEmbeddings.d.ts.map +1 -0
- package/lib/OpenAIEmbeddings.js +166 -0
- package/lib/OpenAIEmbeddings.js.map +1 -0
- package/lib/OpenAIEmbeddings.spec.d.ts +2 -0
- package/lib/OpenAIEmbeddings.spec.d.ts.map +1 -0
- package/lib/OpenAIEmbeddings.spec.js +298 -0
- package/lib/OpenAIEmbeddings.spec.js.map +1 -0
- package/lib/TextSplitter.d.ts +21 -0
- package/lib/TextSplitter.d.ts.map +1 -1
- package/lib/TextSplitter.js +500 -0
- package/lib/TextSplitter.js.map +1 -0
- package/lib/TextSplitter.spec.d.ts +2 -0
- package/lib/TextSplitter.spec.d.ts.map +1 -0
- package/lib/TextSplitter.spec.js +337 -0
- package/lib/TextSplitter.spec.js.map +1 -0
- package/lib/TransformersEmbeddings.d.ts +121 -0
- package/lib/TransformersEmbeddings.d.ts.map +1 -0
- package/lib/TransformersEmbeddings.js +176 -0
- package/lib/TransformersEmbeddings.js.map +1 -0
- package/lib/TransformersEmbeddings.spec.d.ts +2 -0
- package/lib/TransformersEmbeddings.spec.d.ts.map +1 -0
- package/lib/TransformersEmbeddings.spec.js +198 -0
- package/lib/TransformersEmbeddings.spec.js.map +1 -0
- package/lib/TransformersTokenizer.d.ts +33 -0
- package/lib/TransformersTokenizer.d.ts.map +1 -0
- package/lib/TransformersTokenizer.js +44 -0
- package/lib/TransformersTokenizer.js.map +1 -0
- package/lib/TransformersTokenizer.spec.d.ts +2 -0
- package/lib/TransformersTokenizer.spec.d.ts.map +1 -0
- package/lib/TransformersTokenizer.spec.js +112 -0
- package/lib/TransformersTokenizer.spec.js.map +1 -0
- package/lib/WebFetcher.d.ts +14 -0
- package/lib/WebFetcher.d.ts.map +1 -0
- package/lib/WebFetcher.js +238 -0
- package/lib/WebFetcher.js.map +1 -0
- package/lib/WebFetcher.spec.d.ts +2 -0
- package/lib/WebFetcher.spec.d.ts.map +1 -0
- package/lib/WebFetcher.spec.js +263 -0
- package/lib/WebFetcher.spec.js.map +1 -0
- package/lib/browser.d.ts +30 -0
- package/lib/browser.d.ts.map +1 -0
- package/lib/browser.js +52 -0
- package/lib/browser.js.map +1 -0
- package/lib/codecs/IndexCodec.d.ts +37 -0
- package/lib/codecs/IndexCodec.d.ts.map +1 -0
- package/lib/codecs/IndexCodec.js +3 -0
- package/lib/codecs/IndexCodec.js.map +1 -0
- package/lib/codecs/JsonCodec.d.ts +19 -0
- package/lib/codecs/JsonCodec.d.ts.map +1 -0
- package/lib/codecs/JsonCodec.js +35 -0
- package/lib/codecs/JsonCodec.js.map +1 -0
- package/lib/codecs/JsonCodec.spec.d.ts +2 -0
- package/lib/codecs/JsonCodec.spec.d.ts.map +1 -0
- package/lib/codecs/JsonCodec.spec.js +66 -0
- package/lib/codecs/JsonCodec.spec.js.map +1 -0
- package/lib/codecs/LocalIndex.protobuf.spec.d.ts +2 -0
- package/lib/codecs/LocalIndex.protobuf.spec.d.ts.map +1 -0
- package/lib/codecs/LocalIndex.protobuf.spec.js +108 -0
- package/lib/codecs/LocalIndex.protobuf.spec.js.map +1 -0
- package/lib/codecs/ProtobufCodec.d.ts +20 -0
- package/lib/codecs/ProtobufCodec.d.ts.map +1 -0
- package/lib/codecs/ProtobufCodec.js +225 -0
- package/lib/codecs/ProtobufCodec.js.map +1 -0
- package/lib/codecs/ProtobufCodec.spec.d.ts +2 -0
- package/lib/codecs/ProtobufCodec.spec.d.ts.map +1 -0
- package/lib/codecs/ProtobufCodec.spec.js +155 -0
- package/lib/codecs/ProtobufCodec.spec.js.map +1 -0
- package/lib/codecs/index.d.ts +5 -0
- package/lib/codecs/index.d.ts.map +1 -0
- package/lib/codecs/index.js +21 -0
- package/lib/codecs/index.js.map +1 -0
- package/lib/codecs/migrateIndex.d.ts +24 -0
- package/lib/codecs/migrateIndex.d.ts.map +1 -0
- package/lib/codecs/migrateIndex.js +119 -0
- package/lib/codecs/migrateIndex.js.map +1 -0
- package/lib/codecs/migrateIndex.spec.d.ts +2 -0
- package/lib/codecs/migrateIndex.spec.d.ts.map +1 -0
- package/lib/codecs/migrateIndex.spec.js +151 -0
- package/lib/codecs/migrateIndex.spec.js.map +1 -0
- package/lib/codecs/schemas/index.proto +34 -0
- package/lib/index.d.ts +20 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +36 -0
- package/lib/index.js.map +1 -0
- package/lib/internals/Colorize.d.ts +14 -0
- package/lib/internals/Colorize.d.ts.map +1 -0
- package/lib/internals/Colorize.js +69 -0
- package/lib/internals/Colorize.js.map +1 -0
- package/lib/internals/index.d.ts +3 -0
- package/lib/internals/index.d.ts.map +1 -0
- package/lib/internals/index.js +19 -0
- package/lib/internals/index.js.map +1 -0
- package/lib/internals/types.d.ts +43 -0
- package/lib/internals/types.d.ts.map +1 -0
- package/lib/internals/types.js +3 -0
- package/lib/internals/types.js.map +1 -0
- package/lib/server/IndexManager.d.ts +78 -0
- package/lib/server/IndexManager.d.ts.map +1 -0
- package/lib/server/IndexManager.js +259 -0
- package/lib/server/IndexManager.js.map +1 -0
- package/lib/server/VectraServer.d.ts +40 -0
- package/lib/server/VectraServer.d.ts.map +1 -0
- package/lib/server/VectraServer.js +151 -0
- package/lib/server/VectraServer.js.map +1 -0
- package/lib/server/VectraServer.spec.d.ts +2 -0
- package/lib/server/VectraServer.spec.d.ts.map +1 -0
- package/lib/server/VectraServer.spec.js +322 -0
- package/lib/server/VectraServer.spec.js.map +1 -0
- package/lib/server/handlers/documentHandlers.d.ts +15 -0
- package/lib/server/handlers/documentHandlers.d.ts.map +1 -0
- package/lib/server/handlers/documentHandlers.js +95 -0
- package/lib/server/handlers/documentHandlers.js.map +1 -0
- package/lib/server/handlers/helpers.d.ts +23 -0
- package/lib/server/handlers/helpers.d.ts.map +1 -0
- package/lib/server/handlers/helpers.js +138 -0
- package/lib/server/handlers/helpers.js.map +1 -0
- package/lib/server/handlers/index.d.ts +8 -0
- package/lib/server/handlers/index.d.ts.map +1 -0
- package/lib/server/handlers/index.js +22 -0
- package/lib/server/handlers/index.js.map +1 -0
- package/lib/server/handlers/indexHandlers.d.ts +14 -0
- package/lib/server/handlers/indexHandlers.d.ts.map +1 -0
- package/lib/server/handlers/indexHandlers.js +85 -0
- package/lib/server/handlers/indexHandlers.js.map +1 -0
- package/lib/server/handlers/itemHandlers.d.ts +34 -0
- package/lib/server/handlers/itemHandlers.d.ts.map +1 -0
- package/lib/server/handlers/itemHandlers.js +166 -0
- package/lib/server/handlers/itemHandlers.js.map +1 -0
- package/lib/server/handlers/lifecycleHandlers.d.ts +11 -0
- package/lib/server/handlers/lifecycleHandlers.d.ts.map +1 -0
- package/lib/server/handlers/lifecycleHandlers.js +31 -0
- package/lib/server/handlers/lifecycleHandlers.js.map +1 -0
- package/lib/server/handlers/queryHandlers.d.ts +27 -0
- package/lib/server/handlers/queryHandlers.d.ts.map +1 -0
- package/lib/server/handlers/queryHandlers.js +135 -0
- package/lib/server/handlers/queryHandlers.js.map +1 -0
- package/lib/server/handlers/statsHandlers.d.ts +17 -0
- package/lib/server/handlers/statsHandlers.d.ts.map +1 -0
- package/lib/server/handlers/statsHandlers.js +81 -0
- package/lib/server/handlers/statsHandlers.js.map +1 -0
- package/lib/server/index.d.ts +4 -0
- package/lib/server/index.d.ts.map +1 -0
- package/lib/server/index.js +23 -0
- package/lib/server/index.js.map +1 -0
- package/lib/storage/FileStorage.d.ts +92 -0
- package/lib/storage/FileStorage.d.ts.map +1 -0
- package/lib/storage/FileStorage.js +3 -0
- package/lib/storage/FileStorage.js.map +1 -0
- package/lib/storage/FileStorageUtilities.d.ts +36 -0
- package/lib/storage/FileStorageUtilities.d.ts.map +1 -0
- package/lib/storage/FileStorageUtilities.js +91 -0
- package/lib/storage/FileStorageUtilities.js.map +1 -0
- package/lib/storage/FileStorageUtilities.spec.d.ts +2 -0
- package/lib/storage/FileStorageUtilities.spec.d.ts.map +1 -0
- package/lib/storage/FileStorageUtilities.spec.js +98 -0
- package/lib/storage/FileStorageUtilities.spec.js.map +1 -0
- package/lib/storage/FileType.d.ts +29 -0
- package/lib/storage/FileType.d.ts.map +1 -0
- package/lib/storage/FileType.js +38 -0
- package/lib/storage/FileType.js.map +1 -0
- package/lib/storage/IndexedDBStorage.d.ts +47 -0
- package/lib/storage/IndexedDBStorage.d.ts.map +1 -0
- package/lib/storage/IndexedDBStorage.js +347 -0
- package/lib/storage/IndexedDBStorage.js.map +1 -0
- package/lib/storage/LocalFileStorage.browser.d.ts +19 -0
- package/lib/storage/LocalFileStorage.browser.d.ts.map +1 -0
- package/lib/storage/LocalFileStorage.browser.js +43 -0
- package/lib/storage/LocalFileStorage.browser.js.map +1 -0
- package/lib/storage/LocalFileStorage.d.ts +23 -0
- package/lib/storage/LocalFileStorage.d.ts.map +1 -0
- package/lib/storage/LocalFileStorage.js +152 -0
- package/lib/storage/LocalFileStorage.js.map +1 -0
- package/lib/storage/LocalFileStorage.spec.d.ts +2 -0
- package/lib/storage/LocalFileStorage.spec.d.ts.map +1 -0
- package/lib/storage/LocalFileStorage.spec.js +249 -0
- package/lib/storage/LocalFileStorage.spec.js.map +1 -0
- package/lib/storage/VirtualFileStorage.d.ts +18 -0
- package/lib/storage/VirtualFileStorage.d.ts.map +1 -0
- package/lib/storage/VirtualFileStorage.js +178 -0
- package/lib/storage/VirtualFileStorage.js.map +1 -0
- package/lib/storage/VirtualFileStorage.spec.d.ts +2 -0
- package/lib/storage/VirtualFileStorage.spec.d.ts.map +1 -0
- package/lib/storage/VirtualFileStorage.spec.js +302 -0
- package/lib/storage/VirtualFileStorage.spec.js.map +1 -0
- package/lib/storage/index.d.ts +6 -0
- package/lib/storage/index.d.ts.map +1 -0
- package/lib/storage/index.js +22 -0
- package/lib/storage/index.js.map +1 -0
- package/lib/templates/templates/csharp/README.md +48 -0
- package/lib/templates/templates/csharp/VectraClient.cs +234 -0
- package/lib/templates/templates/go/README.md +71 -0
- package/lib/templates/templates/go/vectra_client.go +322 -0
- package/lib/templates/templates/java/README.md +81 -0
- package/lib/templates/templates/java/VectraClient.java +232 -0
- package/lib/templates/templates/python/README.md +37 -0
- package/lib/templates/templates/python/vectra_client.py +279 -0
- package/lib/templates/templates/rust/Cargo.toml +14 -0
- package/lib/templates/templates/rust/README.md +39 -0
- package/lib/templates/templates/rust/build.rs +4 -0
- package/lib/templates/templates/rust/lib.rs +284 -0
- package/lib/templates/templates/typescript/README.md +96 -0
- package/lib/templates/templates/typescript/VectraClient.ts +374 -0
- package/lib/templates/typescript/VectraClient.d.ts +114 -0
- package/lib/templates/typescript/VectraClient.d.ts.map +1 -0
- package/lib/templates/typescript/VectraClient.js +328 -0
- package/lib/templates/typescript/VectraClient.js.map +1 -0
- package/lib/types.d.ts +153 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +3 -0
- package/lib/types.js.map +1 -0
- package/lib/utils/index.d.ts +2 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/index.js +18 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/pathUtils.d.ts +40 -0
- package/lib/utils/pathUtils.d.ts.map +1 -0
- package/lib/utils/pathUtils.js +98 -0
- package/lib/utils/pathUtils.js.map +1 -0
- package/lib/vectra-cli.d.ts +2 -0
- package/lib/vectra-cli.d.ts.map +1 -1
- package/lib/vectra-cli.generate.spec.d.ts +2 -0
- package/lib/vectra-cli.generate.spec.d.ts.map +1 -0
- package/lib/vectra-cli.generate.spec.js +112 -0
- package/lib/vectra-cli.generate.spec.js.map +1 -0
- package/lib/vectra-cli.js +760 -0
- package/lib/vectra-cli.js.map +1 -0
- package/lib/vectra-cli.spec.d.ts +1 -0
- package/lib/vectra-cli.spec.d.ts.map +1 -0
- package/lib/vectra-cli.spec.js +2 -0
- package/lib/vectra-cli.spec.js.map +1 -0
- package/package.json +91 -16
- package/proto/vectra_service.proto +276 -0
- package/src/BrowserWebFetcher.ts +345 -0
- package/src/FileFetcher.spec.ts +234 -0
- package/src/FileFetcher.ts +37 -25
- package/src/FolderWatcher.spec.ts +288 -0
- package/src/FolderWatcher.ts +304 -0
- package/src/GPT3Tokenizer.spec.ts +50 -0
- package/src/ItemSelector.spec.ts +252 -0
- package/src/ItemSelector.ts +163 -150
- package/src/LocalDocument.spec.ts +211 -0
- package/src/LocalDocument.ts +88 -94
- package/src/LocalDocumentIndex.spec.ts +481 -0
- package/src/LocalDocumentIndex.ts +39 -40
- package/src/LocalDocumentResult.spec.ts +373 -0
- package/src/LocalDocumentResult.ts +489 -319
- package/src/LocalEmbeddings.spec.ts +138 -0
- package/src/LocalEmbeddings.ts +120 -0
- package/src/LocalIndex.spec.ts +808 -66
- package/src/LocalIndex.ts +479 -429
- package/src/OpenAIEmbeddings.spec.ts +354 -0
- package/src/OpenAIEmbeddings.ts +26 -27
- package/src/TextSplitter.spec.ts +342 -0
- package/src/TextSplitter.ts +517 -532
- package/src/TransformersEmbeddings.spec.ts +188 -0
- package/src/TransformersEmbeddings.ts +232 -0
- package/src/TransformersTokenizer.spec.ts +143 -0
- package/src/TransformersTokenizer.ts +45 -0
- package/src/WebFetcher.spec.ts +288 -0
- package/src/WebFetcher.ts +184 -186
- package/src/browser.ts +69 -0
- package/src/codecs/IndexCodec.ts +40 -0
- package/src/codecs/JsonCodec.spec.ts +70 -0
- package/src/codecs/JsonCodec.ts +37 -0
- package/src/codecs/LocalIndex.protobuf.spec.ts +115 -0
- package/src/codecs/ProtobufCodec.spec.ts +166 -0
- package/src/codecs/ProtobufCodec.ts +193 -0
- package/src/codecs/index.ts +4 -0
- package/src/codecs/migrateIndex.spec.ts +176 -0
- package/src/codecs/migrateIndex.ts +125 -0
- package/src/codecs/schemas/index.proto +34 -0
- package/src/index.ts +9 -1
- package/src/internals/Colorize.ts +19 -16
- package/src/server/IndexManager.ts +243 -0
- package/src/server/VectraServer.spec.ts +303 -0
- package/src/server/VectraServer.ts +156 -0
- package/src/server/handlers/documentHandlers.ts +59 -0
- package/src/server/handlers/helpers.ts +93 -0
- package/src/server/handlers/index.ts +7 -0
- package/src/server/handlers/indexHandlers.ts +44 -0
- package/src/server/handlers/itemHandlers.ts +140 -0
- package/src/server/handlers/lifecycleHandlers.ts +26 -0
- package/src/server/handlers/queryHandlers.ts +96 -0
- package/src/server/handlers/statsHandlers.ts +38 -0
- package/src/server/index.ts +3 -0
- package/src/storage/FileStorage.ts +105 -0
- package/src/storage/FileStorageUtilities.spec.ts +106 -0
- package/src/storage/FileStorageUtilities.ts +77 -0
- package/src/storage/FileType.ts +61 -0
- package/src/storage/IndexedDBStorage.ts +365 -0
- package/src/storage/LocalFileStorage.browser.ts +52 -0
- package/src/storage/LocalFileStorage.spec.ts +292 -0
- package/src/storage/LocalFileStorage.ts +98 -0
- package/src/storage/VirtualFileStorage.spec.ts +307 -0
- package/src/storage/VirtualFileStorage.ts +169 -0
- package/src/storage/index.ts +5 -0
- package/src/templates/csharp/README.md +48 -0
- package/src/templates/csharp/VectraClient.cs +234 -0
- package/src/templates/go/README.md +71 -0
- package/src/templates/go/vectra_client.go +322 -0
- package/src/templates/java/README.md +81 -0
- package/src/templates/java/VectraClient.java +232 -0
- package/src/templates/python/README.md +37 -0
- package/src/templates/python/vectra_client.py +279 -0
- package/src/templates/rust/Cargo.toml +14 -0
- package/src/templates/rust/README.md +39 -0
- package/src/templates/rust/build.rs +4 -0
- package/src/templates/rust/lib.rs +284 -0
- package/src/templates/typescript/README.md +96 -0
- package/src/templates/typescript/VectraClient.ts +374 -0
- package/src/types.ts +131 -123
- package/src/utils/index.ts +1 -0
- package/src/utils/pathUtils.ts +106 -0
- package/src/vectra-cli.generate.spec.ts +72 -0
- package/src/vectra-cli.spec.ts +0 -0
- package/src/vectra-cli.ts +687 -246
package/src/WebFetcher.ts
CHANGED
|
@@ -1,227 +1,225 @@
|
|
|
1
|
-
import axios, { AxiosRequestConfig } from "axios";
|
|
2
1
|
import { TextFetcher } from './types';
|
|
3
2
|
import * as cheerio from 'cheerio';
|
|
4
|
-
import TurndownService
|
|
3
|
+
import TurndownService from 'turndown';
|
|
5
4
|
|
|
6
5
|
const ALLOWED_CONTENT_TYPES = [
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
"text/html",
|
|
7
|
+
"application/json",
|
|
8
|
+
"application/xml",
|
|
9
|
+
"application/javascript",
|
|
10
|
+
"text/plain",
|
|
12
11
|
];
|
|
13
12
|
|
|
14
|
-
const DEFAULT_HEADERS = {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
13
|
+
const DEFAULT_HEADERS: Record<string, string> = {
|
|
14
|
+
Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
|
|
15
|
+
"Accept-Encoding": "gzip, deflate, sdch, br",
|
|
16
|
+
"Accept-Language": "en-US,en;q=0.8,ms;q=0.6",
|
|
17
|
+
"Alt-Used": "LEAVE-THIS-KEY-SET-BY-TOOL",
|
|
18
|
+
Connection: "keep-alive",
|
|
19
|
+
Host: "LEAVE-THIS-KEY-SET-BY-TOOL",
|
|
20
|
+
Referer: "https://www.google.com/",
|
|
21
|
+
"Sec-Fetch-Dest": "document",
|
|
22
|
+
"Sec-Fetch-Mode": "navigate",
|
|
23
|
+
"Sec-Fetch-Site": "cross-site",
|
|
24
|
+
"Upgrade-Insecure-Requests": "1",
|
|
25
|
+
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
|
27
26
|
};
|
|
28
27
|
|
|
29
28
|
export interface WebFetcherConfig {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
headers?: Record<string, string>;
|
|
30
|
+
requestConfig?: RequestInit;
|
|
31
|
+
htmlToMarkdown: boolean;
|
|
32
|
+
summarizeHtml: boolean;
|
|
34
33
|
}
|
|
35
34
|
|
|
36
35
|
export class WebFetcher implements TextFetcher {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
private readonly _config: WebFetcherConfig;
|
|
37
|
+
|
|
38
|
+
public constructor(config?: Partial<WebFetcherConfig>) {
|
|
39
|
+
this._config = Object.assign(
|
|
40
|
+
{
|
|
41
|
+
htmlToMarkdown: true,
|
|
42
|
+
summarizeHtml: false,
|
|
43
|
+
} as WebFetcherConfig,
|
|
44
|
+
config
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public async fetch(
|
|
49
|
+
uri: string,
|
|
50
|
+
onDocument: (uri: string, text: string, docType?: string) => Promise<boolean>
|
|
51
|
+
): Promise<boolean> {
|
|
52
|
+
// Clone headers to avoid mutating the original
|
|
53
|
+
const headers: Record<string, string> = Object.assign({}, DEFAULT_HEADERS, this._config.headers);
|
|
54
|
+
|
|
55
|
+
// get hostname from url
|
|
56
|
+
const host = new URL(uri).hostname;
|
|
57
|
+
headers['Host'] = host;
|
|
58
|
+
headers['Alt-Used'] = host;
|
|
59
|
+
|
|
60
|
+
// Fetch page and check for errors
|
|
61
|
+
const response = await fetch(uri, {
|
|
62
|
+
...this._config.requestConfig,
|
|
63
|
+
method: 'GET',
|
|
64
|
+
headers,
|
|
65
|
+
});
|
|
66
|
+
if (response.status >= 400) {
|
|
67
|
+
throw new Error(`Site returned an HTTP status of ${response.status}`);
|
|
44
68
|
}
|
|
45
69
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
// Clone headers to avoid mutating the original
|
|
52
|
-
const headers = Object.assign({}, DEFAULT_HEADERS, this._config.headers)
|
|
53
|
-
|
|
54
|
-
// get hostname from url
|
|
55
|
-
const host = new URL(uri).hostname;
|
|
56
|
-
headers['Host'] = host;
|
|
57
|
-
headers['Alt-Used'] = host;
|
|
58
|
-
|
|
59
|
-
// Fetch page and check for errors
|
|
60
|
-
const response = await httpClient.get(uri, {
|
|
61
|
-
headers,
|
|
62
|
-
...this._config.requestConfig,
|
|
63
|
-
});
|
|
64
|
-
if (response.status >= 400) {
|
|
65
|
-
throw new Error(`Site returned an HTTP status of ${response.status}`);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Check for valid content type
|
|
69
|
-
const contentType = response.headers['content-type'];
|
|
70
|
-
const contentTypeArray = contentType.split(';');
|
|
71
|
-
if (!contentTypeArray[0] || !ALLOWED_CONTENT_TYPES.includes(contentTypeArray[0])) {
|
|
72
|
-
throw new Error(`Site returned an invalid content type of ${contentType}`);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// Convert content type to doc type
|
|
76
|
-
const docType = contentTypeArray[0] != 'text/plain' ? contentTypeArray[0].split('/')[1] : undefined;
|
|
77
|
-
if (docType == 'html' && this._config.htmlToMarkdown) {
|
|
78
|
-
const text = this.htmlToMarkdown(response.data, uri);
|
|
79
|
-
return await onDocument(uri, text, 'md');
|
|
80
|
-
} else {
|
|
81
|
-
const text = response.data;
|
|
82
|
-
return await onDocument(uri, text, docType);
|
|
83
|
-
}
|
|
70
|
+
// Check for valid content type
|
|
71
|
+
const contentType = response.headers.get('content-type') ?? '';
|
|
72
|
+
const contentTypeArray = contentType.split(';');
|
|
73
|
+
if (!contentTypeArray[0] || !ALLOWED_CONTENT_TYPES.includes(contentTypeArray[0])) {
|
|
74
|
+
throw new Error(`Site returned an invalid content type of ${contentType}`);
|
|
84
75
|
}
|
|
85
76
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const href = $el.attr("href");
|
|
96
|
-
if (href && !href.startsWith("http")) {
|
|
97
|
-
// Try converting to an absolute link
|
|
98
|
-
try {
|
|
99
|
-
$el.attr("href", new URL(href, baseUrl).toString());
|
|
100
|
-
} catch {
|
|
101
|
-
// Leave as is
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
// Convert to markdown
|
|
107
|
-
const body = $('body').html() ?? '';
|
|
108
|
-
const turndownService = new TurndownService({
|
|
109
|
-
hr: '\n\n---\n\n',
|
|
110
|
-
});
|
|
111
|
-
convertTables(turndownService);
|
|
112
|
-
const md = turndownService.turndown(body);
|
|
113
|
-
|
|
114
|
-
// Remove any overly long header text
|
|
115
|
-
const contentStart = Math.min(md.indexOf('\n'), md.indexOf(' '));
|
|
116
|
-
if (contentStart > 64) {
|
|
117
|
-
return md.slice(contentStart);
|
|
118
|
-
} else {
|
|
119
|
-
return md;
|
|
120
|
-
}
|
|
77
|
+
// Convert content type to doc type
|
|
78
|
+
const docType = contentTypeArray[0] != 'text/plain' ? contentTypeArray[0].split('/')[1] : undefined;
|
|
79
|
+
if (docType == 'html' && this._config.htmlToMarkdown) {
|
|
80
|
+
const data = await response.text();
|
|
81
|
+
const text = this.htmlToMarkdown(data, uri);
|
|
82
|
+
return await onDocument(uri, text, 'md');
|
|
83
|
+
} else {
|
|
84
|
+
const text = await response.text();
|
|
85
|
+
return await onDocument(uri, text, docType);
|
|
121
86
|
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
if (isHeadingRow(node)) {
|
|
139
|
-
for (var i = 0; i < node.childNodes.length; i++) {
|
|
140
|
-
var border = '---'
|
|
141
|
-
var align: string = (
|
|
142
|
-
node.childNodes[i].getAttribute('align') || ''
|
|
143
|
-
).toLowerCase()
|
|
144
|
-
|
|
145
|
-
if (align) border = alignMap[align] || border
|
|
146
|
-
|
|
147
|
-
borderCells += cell(border, node.childNodes[i])
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
return '\n' + content + (borderCells ? '\n' + borderCells : '')
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
private htmlToMarkdown(html: string, baseUrl: string): string {
|
|
90
|
+
// Parse HTML
|
|
91
|
+
const $ = cheerio.load(html, { scriptingEnabled: true });
|
|
92
|
+
|
|
93
|
+
// Remove scripts and convert relative links to absolute
|
|
94
|
+
$("script").remove();
|
|
95
|
+
$("a").each((_, elem) => {
|
|
96
|
+
const $el = $(elem);
|
|
97
|
+
const href = $el.attr("href");
|
|
98
|
+
if (href && !href.startsWith("http")) {
|
|
99
|
+
try {
|
|
100
|
+
$el.attr("href", new URL(href, baseUrl).toString());
|
|
101
|
+
} catch {
|
|
102
|
+
// ignore bad URLs
|
|
151
103
|
}
|
|
104
|
+
}
|
|
152
105
|
});
|
|
153
106
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
content = content.replace('\n\n', '\n')
|
|
159
|
-
return '\n\n' + content + '\n\n'
|
|
160
|
-
}
|
|
107
|
+
// Convert to markdown
|
|
108
|
+
const body = $("body").html() ?? "";
|
|
109
|
+
const turndownService = new TurndownService({
|
|
110
|
+
hr: "\n\n---\n\n",
|
|
161
111
|
});
|
|
112
|
+
convertTables(turndownService);
|
|
113
|
+
const md = turndownService.turndown(body);
|
|
114
|
+
|
|
115
|
+
// Remove any overly long header text
|
|
116
|
+
const firstSpace = md.indexOf(" ");
|
|
117
|
+
const firstNewline = md.indexOf("\n");
|
|
118
|
+
const candidates = [firstSpace, firstNewline].filter((i) => i >= 0);
|
|
119
|
+
const contentStart = candidates.length ? Math.min(...candidates) : -1;
|
|
120
|
+
|
|
121
|
+
if (contentStart > 64) {
|
|
122
|
+
return md.slice(contentStart);
|
|
123
|
+
} else {
|
|
124
|
+
return md;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
162
128
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
129
|
+
function convertTables(turndownService: TurndownService): void {
|
|
130
|
+
turndownService.addRule("tableCell", {
|
|
131
|
+
filter: ["th", "td"],
|
|
132
|
+
replacement: function (content: string, node: any): string {
|
|
133
|
+
return cell(content, node);
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
turndownService.addRule("tableRow", {
|
|
138
|
+
filter: "tr",
|
|
139
|
+
replacement: function (content: string, node: any): string {
|
|
140
|
+
let borderCells = "";
|
|
141
|
+
const alignMap: Record<string, string> = { left: ":--", right: "--:", center: ":-:" };
|
|
142
|
+
|
|
143
|
+
if (isHeadingRow(node)) {
|
|
144
|
+
const children = (node as any).childNodes;
|
|
145
|
+
for (let i = 0; i < children.length; i++) {
|
|
146
|
+
let border = "---";
|
|
147
|
+
const align: string = (children[i].getAttribute?.("align") || "").toLowerCase();
|
|
148
|
+
if (align) border = (alignMap as any)[align] || border;
|
|
149
|
+
borderCells += cell(border, children[i]);
|
|
167
150
|
}
|
|
168
|
-
|
|
151
|
+
}
|
|
152
|
+
return "\n" + content + (borderCells ? "\n" + borderCells : "");
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
turndownService.addRule("table", {
|
|
157
|
+
filter: ["table"],
|
|
158
|
+
replacement: function (content: string): string {
|
|
159
|
+
// Ensure there are no blank lines
|
|
160
|
+
content = content.replace("\n\n", "\n");
|
|
161
|
+
return "\n\n" + content + "\n\n";
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
turndownService.addRule("tableSection", {
|
|
166
|
+
filter: ["thead", "tbody", "tfoot"],
|
|
167
|
+
replacement: function (content: string): string {
|
|
168
|
+
return content;
|
|
169
|
+
},
|
|
170
|
+
});
|
|
169
171
|
}
|
|
170
172
|
|
|
171
|
-
const indexOf = Array.prototype.indexOf
|
|
172
|
-
const every = Array.prototype.every
|
|
173
|
+
const indexOf = Array.prototype.indexOf;
|
|
174
|
+
const every = Array.prototype.every;
|
|
173
175
|
|
|
174
176
|
// A tr is a heading row if:
|
|
175
177
|
// - the parent is a THEAD
|
|
176
178
|
// - or if its the first child of the TABLE or the first TBODY (possibly
|
|
177
179
|
// following a blank THEAD)
|
|
178
180
|
// - and every cell is a TH
|
|
179
|
-
function isHeadingRow(tr: any) {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
181
|
+
function isHeadingRow(tr: any): boolean {
|
|
182
|
+
const parentNode = tr.parentNode;
|
|
183
|
+
return (
|
|
184
|
+
parentNode.nodeName === "THEAD" ||
|
|
185
|
+
(parentNode.firstChild === tr &&
|
|
186
|
+
(parentNode.nodeName === "TABLE" || isFirstTbody(parentNode)) &&
|
|
187
|
+
every.call(parentNode ? tr.childNodes : [], function (n: any) {
|
|
188
|
+
return n.nodeName === "TH";
|
|
189
|
+
}))
|
|
190
|
+
);
|
|
189
191
|
}
|
|
190
192
|
|
|
191
|
-
function isFirstTbody(element: any) {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
/^\s*$/i.test(previousSibling.textContent)
|
|
199
|
-
)
|
|
200
|
-
)
|
|
201
|
-
)
|
|
193
|
+
function isFirstTbody(element: any): boolean {
|
|
194
|
+
const previousSibling = element.previousSibling;
|
|
195
|
+
return (
|
|
196
|
+
element.nodeName === "TBODY" &&
|
|
197
|
+
(!previousSibling ||
|
|
198
|
+
(previousSibling.nodeName === "THEAD" && /^\s*$/i.test(previousSibling.textContent)))
|
|
199
|
+
);
|
|
202
200
|
}
|
|
203
201
|
|
|
204
202
|
function cell(content: string, node: any): string {
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
203
|
+
const index = indexOf.call(node.parentNode.childNodes, node);
|
|
204
|
+
let prefix = " ";
|
|
205
|
+
if (index === 0) {
|
|
206
|
+
prefix = "| ";
|
|
207
|
+
}
|
|
208
|
+
return cleanContent(prefix + content + " |");
|
|
211
209
|
}
|
|
212
210
|
|
|
213
211
|
function cleanContent(content: string): string {
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
}
|
|
212
|
+
let output = "";
|
|
213
|
+
const chars = ["\n", "\r", "\t", "\f", "\v", "\u00a0", "\u2028", "\u2029", " "];
|
|
214
|
+
for (let i = 0; i < content.length; i++) {
|
|
215
|
+
if (chars.includes(content[i])) {
|
|
216
|
+
if (output[output.length - 1] !== " ") {
|
|
217
|
+
output += " ";
|
|
218
|
+
}
|
|
219
|
+
continue;
|
|
220
|
+
} else {
|
|
221
|
+
output += content[i];
|
|
225
222
|
}
|
|
226
|
-
|
|
223
|
+
}
|
|
224
|
+
return output;
|
|
227
225
|
}
|
package/src/browser.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser entry point for Vectra.
|
|
3
|
+
*
|
|
4
|
+
* This module exports only browser-compatible components.
|
|
5
|
+
* Node-specific components (LocalFileStorage, FileFetcher, WebFetcher) are excluded.
|
|
6
|
+
*
|
|
7
|
+
* For browser usage:
|
|
8
|
+
* - Use `VirtualFileStorage` for in-memory storage (ephemeral)
|
|
9
|
+
* - Use `IndexedDBStorage` for persistent browser storage
|
|
10
|
+
* - Use `BrowserWebFetcher` for fetching web content
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
// Core index classes
|
|
14
|
+
export { LocalIndex, CreateIndexConfig } from './LocalIndex';
|
|
15
|
+
export { LocalDocumentIndex, LocalDocumentIndexConfig, DocumentQueryOptions } from './LocalDocumentIndex';
|
|
16
|
+
|
|
17
|
+
// Document classes
|
|
18
|
+
export { LocalDocument } from './LocalDocument';
|
|
19
|
+
export { LocalDocumentResult } from './LocalDocumentResult';
|
|
20
|
+
|
|
21
|
+
// Text processing
|
|
22
|
+
export { TextSplitter, TextSplitterConfig } from './TextSplitter';
|
|
23
|
+
export { GPT3Tokenizer } from './GPT3Tokenizer';
|
|
24
|
+
|
|
25
|
+
// Embeddings
|
|
26
|
+
export {
|
|
27
|
+
OpenAIEmbeddings,
|
|
28
|
+
OpenAIEmbeddingsOptions,
|
|
29
|
+
AzureOpenAIEmbeddingsOptions,
|
|
30
|
+
OSSEmbeddingsOptions,
|
|
31
|
+
BaseOpenAIEmbeddingsOptions
|
|
32
|
+
} from './OpenAIEmbeddings';
|
|
33
|
+
export { TransformersEmbeddings, TransformersEmbeddingsOptions } from './TransformersEmbeddings';
|
|
34
|
+
export { TransformersTokenizer } from './TransformersTokenizer';
|
|
35
|
+
|
|
36
|
+
// Query utilities
|
|
37
|
+
export { ItemSelector } from './ItemSelector';
|
|
38
|
+
|
|
39
|
+
// Types
|
|
40
|
+
export {
|
|
41
|
+
EmbeddingsModel,
|
|
42
|
+
EmbeddingsResponse,
|
|
43
|
+
EmbeddingsResponseStatus,
|
|
44
|
+
TextChunk,
|
|
45
|
+
TextFetcher,
|
|
46
|
+
IndexStats,
|
|
47
|
+
IndexItem,
|
|
48
|
+
MetadataFilter,
|
|
49
|
+
MetadataTypes,
|
|
50
|
+
QueryResult,
|
|
51
|
+
Tokenizer,
|
|
52
|
+
DocumentChunkMetadata,
|
|
53
|
+
DocumentCatalogStats,
|
|
54
|
+
DocumentTextSection,
|
|
55
|
+
IndexData
|
|
56
|
+
} from './types';
|
|
57
|
+
|
|
58
|
+
// Storage - browser compatible
|
|
59
|
+
export { FileStorage, FileDetails, ListFilesFilter } from './storage/FileStorage';
|
|
60
|
+
export { FileStorageUtilities } from './storage/FileStorageUtilities';
|
|
61
|
+
export { FileType } from './storage/FileType';
|
|
62
|
+
export { VirtualFileStorage } from './storage/VirtualFileStorage';
|
|
63
|
+
export { IndexedDBStorage } from './storage/IndexedDBStorage';
|
|
64
|
+
|
|
65
|
+
// Browser-compatible fetcher
|
|
66
|
+
export { BrowserWebFetcher, BrowserWebFetcherConfig } from './BrowserWebFetcher';
|
|
67
|
+
|
|
68
|
+
// Utilities
|
|
69
|
+
export { pathUtils } from './utils/pathUtils';
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { IndexData, MetadataTypes } from '../types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Catalog structure for document indexes.
|
|
5
|
+
*/
|
|
6
|
+
export interface DocumentCatalog {
|
|
7
|
+
version: number;
|
|
8
|
+
count: number;
|
|
9
|
+
uriToId: { [uri: string]: string };
|
|
10
|
+
idToUri: { [id: string]: string };
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Abstraction for index serialization format.
|
|
15
|
+
* @remarks
|
|
16
|
+
* Implementations control how index data, catalogs, and metadata are
|
|
17
|
+
* serialized to and from Buffers written by the storage backend.
|
|
18
|
+
*/
|
|
19
|
+
export interface IndexCodec {
|
|
20
|
+
/** File extension used for index files (e.g., '.json', '.pb') */
|
|
21
|
+
readonly extension: string;
|
|
22
|
+
|
|
23
|
+
/** Serialize IndexData to a Buffer for writing to storage */
|
|
24
|
+
serializeIndex(data: IndexData): Buffer;
|
|
25
|
+
|
|
26
|
+
/** Deserialize a Buffer read from storage into IndexData */
|
|
27
|
+
deserializeIndex(buffer: Buffer): IndexData;
|
|
28
|
+
|
|
29
|
+
/** Serialize a DocumentCatalog to a Buffer */
|
|
30
|
+
serializeCatalog(catalog: DocumentCatalog): Buffer;
|
|
31
|
+
|
|
32
|
+
/** Deserialize a Buffer into a DocumentCatalog */
|
|
33
|
+
deserializeCatalog(buffer: Buffer): DocumentCatalog;
|
|
34
|
+
|
|
35
|
+
/** Serialize arbitrary metadata to a Buffer */
|
|
36
|
+
serializeMetadata(metadata: Record<string, MetadataTypes>): Buffer;
|
|
37
|
+
|
|
38
|
+
/** Deserialize a Buffer into metadata */
|
|
39
|
+
deserializeMetadata(buffer: Buffer): Record<string, MetadataTypes>;
|
|
40
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import { JsonCodec } from './JsonCodec';
|
|
3
|
+
import { IndexData } from '../types';
|
|
4
|
+
import { DocumentCatalog } from './IndexCodec';
|
|
5
|
+
|
|
6
|
+
describe('JsonCodec', () => {
|
|
7
|
+
const codec = new JsonCodec();
|
|
8
|
+
|
|
9
|
+
it('has .json extension', () => {
|
|
10
|
+
assert.equal(codec.extension, '.json');
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
describe('serializeIndex / deserializeIndex', () => {
|
|
14
|
+
it('round-trips IndexData', () => {
|
|
15
|
+
const data: IndexData = {
|
|
16
|
+
version: 1,
|
|
17
|
+
metadata_config: { indexed: ['category'] },
|
|
18
|
+
items: [
|
|
19
|
+
{ id: 'a', metadata: { category: 'food', score: 0.9 }, vector: [1.5, 2.5, 3.5], norm: 4.5 },
|
|
20
|
+
{ id: 'b', metadata: {}, vector: [0, 0, 0], norm: 0, metadataFile: 'ext.json' },
|
|
21
|
+
],
|
|
22
|
+
};
|
|
23
|
+
const buf = codec.serializeIndex(data);
|
|
24
|
+
assert.ok(Buffer.isBuffer(buf));
|
|
25
|
+
const result = codec.deserializeIndex(buf);
|
|
26
|
+
assert.deepStrictEqual(result, data);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('handles empty items', () => {
|
|
30
|
+
const data: IndexData = { version: 2, metadata_config: {}, items: [] };
|
|
31
|
+
const result = codec.deserializeIndex(codec.serializeIndex(data));
|
|
32
|
+
assert.deepStrictEqual(result, data);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
describe('serializeCatalog / deserializeCatalog', () => {
|
|
37
|
+
it('round-trips DocumentCatalog', () => {
|
|
38
|
+
const catalog: DocumentCatalog = {
|
|
39
|
+
version: 1,
|
|
40
|
+
count: 2,
|
|
41
|
+
uriToId: { 'http://a': 'id-a', 'http://b': 'id-b' },
|
|
42
|
+
idToUri: { 'id-a': 'http://a', 'id-b': 'http://b' },
|
|
43
|
+
};
|
|
44
|
+
const buf = codec.serializeCatalog(catalog);
|
|
45
|
+
assert.ok(Buffer.isBuffer(buf));
|
|
46
|
+
const result = codec.deserializeCatalog(buf);
|
|
47
|
+
assert.deepStrictEqual(result, catalog);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('handles empty catalog', () => {
|
|
51
|
+
const catalog: DocumentCatalog = { version: 1, count: 0, uriToId: {}, idToUri: {} };
|
|
52
|
+
const result = codec.deserializeCatalog(codec.serializeCatalog(catalog));
|
|
53
|
+
assert.deepStrictEqual(result, catalog);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
describe('serializeMetadata / deserializeMetadata', () => {
|
|
58
|
+
it('round-trips metadata with all types', () => {
|
|
59
|
+
const metadata = { name: 'test', score: 42, active: true };
|
|
60
|
+
const buf = codec.serializeMetadata(metadata);
|
|
61
|
+
const result = codec.deserializeMetadata(buf);
|
|
62
|
+
assert.deepStrictEqual(result, metadata);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('handles empty metadata', () => {
|
|
66
|
+
const result = codec.deserializeMetadata(codec.serializeMetadata({}));
|
|
67
|
+
assert.deepStrictEqual(result, {});
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { IndexData, MetadataTypes } from '../types';
|
|
2
|
+
import { DocumentCatalog, IndexCodec } from './IndexCodec';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* JSON codec — default serialization format.
|
|
6
|
+
* @remarks
|
|
7
|
+
* Wraps the existing JSON.stringify/JSON.parse behavior. This preserves
|
|
8
|
+
* full backward compatibility with indexes created before the codec
|
|
9
|
+
* abstraction was introduced.
|
|
10
|
+
*/
|
|
11
|
+
export class JsonCodec implements IndexCodec {
|
|
12
|
+
readonly extension = '.json';
|
|
13
|
+
|
|
14
|
+
serializeIndex(data: IndexData): Buffer {
|
|
15
|
+
return Buffer.from(JSON.stringify(data), 'utf-8');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
deserializeIndex(buffer: Buffer): IndexData {
|
|
19
|
+
return JSON.parse(buffer.toString('utf-8'));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
serializeCatalog(catalog: DocumentCatalog): Buffer {
|
|
23
|
+
return Buffer.from(JSON.stringify(catalog), 'utf-8');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
deserializeCatalog(buffer: Buffer): DocumentCatalog {
|
|
27
|
+
return JSON.parse(buffer.toString('utf-8'));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
serializeMetadata(metadata: Record<string, MetadataTypes>): Buffer {
|
|
31
|
+
return Buffer.from(JSON.stringify(metadata), 'utf-8');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
deserializeMetadata(buffer: Buffer): Record<string, MetadataTypes> {
|
|
35
|
+
return JSON.parse(buffer.toString('utf-8'));
|
|
36
|
+
}
|
|
37
|
+
}
|