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.
Files changed (392) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +92 -100
  3. package/bin/vectra.js +3 -0
  4. package/lib/BrowserWebFetcher.d.ts +75 -0
  5. package/lib/BrowserWebFetcher.d.ts.map +1 -0
  6. package/lib/BrowserWebFetcher.js +290 -0
  7. package/lib/BrowserWebFetcher.js.map +1 -0
  8. package/lib/FileFetcher.d.ts +5 -0
  9. package/lib/FileFetcher.d.ts.map +1 -0
  10. package/lib/FileFetcher.js +89 -0
  11. package/lib/FileFetcher.js.map +1 -0
  12. package/lib/FileFetcher.spec.d.ts +2 -0
  13. package/lib/FileFetcher.spec.d.ts.map +1 -0
  14. package/lib/FileFetcher.spec.js +244 -0
  15. package/lib/FileFetcher.spec.js.map +1 -0
  16. package/lib/FolderWatcher.d.ts +91 -0
  17. package/lib/FolderWatcher.d.ts.map +1 -0
  18. package/lib/FolderWatcher.js +304 -0
  19. package/lib/FolderWatcher.js.map +1 -0
  20. package/lib/FolderWatcher.spec.d.ts +2 -0
  21. package/lib/FolderWatcher.spec.d.ts.map +1 -0
  22. package/lib/FolderWatcher.spec.js +308 -0
  23. package/lib/FolderWatcher.spec.js.map +1 -0
  24. package/lib/GPT3Tokenizer.d.ts +9 -0
  25. package/lib/GPT3Tokenizer.spec.d.ts +2 -0
  26. package/lib/GPT3Tokenizer.spec.d.ts.map +1 -0
  27. package/lib/GPT3Tokenizer.spec.js +45 -0
  28. package/lib/GPT3Tokenizer.spec.js.map +1 -0
  29. package/lib/ItemSelector.d.ts +41 -0
  30. package/lib/ItemSelector.d.ts.map +1 -0
  31. package/lib/ItemSelector.js +179 -0
  32. package/lib/ItemSelector.js.map +1 -0
  33. package/lib/ItemSelector.spec.d.ts +2 -0
  34. package/lib/ItemSelector.spec.d.ts.map +1 -0
  35. package/lib/ItemSelector.spec.js +204 -0
  36. package/lib/ItemSelector.spec.js.map +1 -0
  37. package/lib/LocalDocument.d.ts +54 -0
  38. package/lib/LocalDocument.d.ts.map +1 -1
  39. package/lib/LocalDocument.js +116 -0
  40. package/lib/LocalDocument.js.map +1 -0
  41. package/lib/LocalDocument.spec.d.ts +2 -0
  42. package/lib/LocalDocument.spec.d.ts.map +1 -0
  43. package/lib/LocalDocument.spec.js +214 -0
  44. package/lib/LocalDocument.spec.js.map +1 -0
  45. package/lib/LocalDocumentIndex.d.ts +152 -0
  46. package/lib/LocalDocumentIndex.d.ts.map +1 -1
  47. package/lib/LocalDocumentIndex.js +420 -0
  48. package/lib/LocalDocumentIndex.js.map +1 -0
  49. package/lib/LocalDocumentIndex.spec.d.ts +2 -0
  50. package/lib/LocalDocumentIndex.spec.d.ts.map +1 -0
  51. package/lib/LocalDocumentIndex.spec.js +494 -0
  52. package/lib/LocalDocumentIndex.spec.js.map +1 -0
  53. package/lib/LocalDocumentResult.d.ts +66 -0
  54. package/lib/LocalDocumentResult.d.ts.map +1 -1
  55. package/lib/LocalDocumentResult.js +376 -0
  56. package/lib/LocalDocumentResult.js.map +1 -0
  57. package/lib/LocalDocumentResult.spec.d.ts +2 -0
  58. package/lib/LocalDocumentResult.spec.d.ts.map +1 -0
  59. package/lib/LocalDocumentResult.spec.js +373 -0
  60. package/lib/LocalDocumentResult.spec.js.map +1 -0
  61. package/lib/LocalEmbeddings.d.ts +59 -0
  62. package/lib/LocalEmbeddings.d.ts.map +1 -0
  63. package/lib/LocalEmbeddings.js +101 -0
  64. package/lib/LocalEmbeddings.js.map +1 -0
  65. package/lib/LocalEmbeddings.spec.d.ts +2 -0
  66. package/lib/LocalEmbeddings.spec.d.ts.map +1 -0
  67. package/lib/LocalEmbeddings.spec.js +155 -0
  68. package/lib/LocalEmbeddings.spec.js.map +1 -0
  69. package/lib/LocalIndex.d.ts +159 -0
  70. package/lib/LocalIndex.d.ts.map +1 -1
  71. package/lib/LocalIndex.js +519 -0
  72. package/lib/LocalIndex.js.map +1 -0
  73. package/lib/LocalIndex.spec.d.ts +2 -0
  74. package/lib/LocalIndex.spec.js +611 -9
  75. package/lib/LocalIndex.spec.js.map +1 -1
  76. package/lib/OpenAIEmbeddings.d.ts +124 -0
  77. package/lib/OpenAIEmbeddings.d.ts.map +1 -0
  78. package/lib/OpenAIEmbeddings.js +166 -0
  79. package/lib/OpenAIEmbeddings.js.map +1 -0
  80. package/lib/OpenAIEmbeddings.spec.d.ts +2 -0
  81. package/lib/OpenAIEmbeddings.spec.d.ts.map +1 -0
  82. package/lib/OpenAIEmbeddings.spec.js +298 -0
  83. package/lib/OpenAIEmbeddings.spec.js.map +1 -0
  84. package/lib/TextSplitter.d.ts +21 -0
  85. package/lib/TextSplitter.d.ts.map +1 -1
  86. package/lib/TextSplitter.js +500 -0
  87. package/lib/TextSplitter.js.map +1 -0
  88. package/lib/TextSplitter.spec.d.ts +2 -0
  89. package/lib/TextSplitter.spec.d.ts.map +1 -0
  90. package/lib/TextSplitter.spec.js +337 -0
  91. package/lib/TextSplitter.spec.js.map +1 -0
  92. package/lib/TransformersEmbeddings.d.ts +121 -0
  93. package/lib/TransformersEmbeddings.d.ts.map +1 -0
  94. package/lib/TransformersEmbeddings.js +176 -0
  95. package/lib/TransformersEmbeddings.js.map +1 -0
  96. package/lib/TransformersEmbeddings.spec.d.ts +2 -0
  97. package/lib/TransformersEmbeddings.spec.d.ts.map +1 -0
  98. package/lib/TransformersEmbeddings.spec.js +198 -0
  99. package/lib/TransformersEmbeddings.spec.js.map +1 -0
  100. package/lib/TransformersTokenizer.d.ts +33 -0
  101. package/lib/TransformersTokenizer.d.ts.map +1 -0
  102. package/lib/TransformersTokenizer.js +44 -0
  103. package/lib/TransformersTokenizer.js.map +1 -0
  104. package/lib/TransformersTokenizer.spec.d.ts +2 -0
  105. package/lib/TransformersTokenizer.spec.d.ts.map +1 -0
  106. package/lib/TransformersTokenizer.spec.js +112 -0
  107. package/lib/TransformersTokenizer.spec.js.map +1 -0
  108. package/lib/WebFetcher.d.ts +14 -0
  109. package/lib/WebFetcher.d.ts.map +1 -0
  110. package/lib/WebFetcher.js +238 -0
  111. package/lib/WebFetcher.js.map +1 -0
  112. package/lib/WebFetcher.spec.d.ts +2 -0
  113. package/lib/WebFetcher.spec.d.ts.map +1 -0
  114. package/lib/WebFetcher.spec.js +263 -0
  115. package/lib/WebFetcher.spec.js.map +1 -0
  116. package/lib/browser.d.ts +30 -0
  117. package/lib/browser.d.ts.map +1 -0
  118. package/lib/browser.js +52 -0
  119. package/lib/browser.js.map +1 -0
  120. package/lib/codecs/IndexCodec.d.ts +37 -0
  121. package/lib/codecs/IndexCodec.d.ts.map +1 -0
  122. package/lib/codecs/IndexCodec.js +3 -0
  123. package/lib/codecs/IndexCodec.js.map +1 -0
  124. package/lib/codecs/JsonCodec.d.ts +19 -0
  125. package/lib/codecs/JsonCodec.d.ts.map +1 -0
  126. package/lib/codecs/JsonCodec.js +35 -0
  127. package/lib/codecs/JsonCodec.js.map +1 -0
  128. package/lib/codecs/JsonCodec.spec.d.ts +2 -0
  129. package/lib/codecs/JsonCodec.spec.d.ts.map +1 -0
  130. package/lib/codecs/JsonCodec.spec.js +66 -0
  131. package/lib/codecs/JsonCodec.spec.js.map +1 -0
  132. package/lib/codecs/LocalIndex.protobuf.spec.d.ts +2 -0
  133. package/lib/codecs/LocalIndex.protobuf.spec.d.ts.map +1 -0
  134. package/lib/codecs/LocalIndex.protobuf.spec.js +108 -0
  135. package/lib/codecs/LocalIndex.protobuf.spec.js.map +1 -0
  136. package/lib/codecs/ProtobufCodec.d.ts +20 -0
  137. package/lib/codecs/ProtobufCodec.d.ts.map +1 -0
  138. package/lib/codecs/ProtobufCodec.js +225 -0
  139. package/lib/codecs/ProtobufCodec.js.map +1 -0
  140. package/lib/codecs/ProtobufCodec.spec.d.ts +2 -0
  141. package/lib/codecs/ProtobufCodec.spec.d.ts.map +1 -0
  142. package/lib/codecs/ProtobufCodec.spec.js +155 -0
  143. package/lib/codecs/ProtobufCodec.spec.js.map +1 -0
  144. package/lib/codecs/index.d.ts +5 -0
  145. package/lib/codecs/index.d.ts.map +1 -0
  146. package/lib/codecs/index.js +21 -0
  147. package/lib/codecs/index.js.map +1 -0
  148. package/lib/codecs/migrateIndex.d.ts +24 -0
  149. package/lib/codecs/migrateIndex.d.ts.map +1 -0
  150. package/lib/codecs/migrateIndex.js +119 -0
  151. package/lib/codecs/migrateIndex.js.map +1 -0
  152. package/lib/codecs/migrateIndex.spec.d.ts +2 -0
  153. package/lib/codecs/migrateIndex.spec.d.ts.map +1 -0
  154. package/lib/codecs/migrateIndex.spec.js +151 -0
  155. package/lib/codecs/migrateIndex.spec.js.map +1 -0
  156. package/lib/codecs/schemas/index.proto +34 -0
  157. package/lib/index.d.ts +20 -0
  158. package/lib/index.d.ts.map +1 -1
  159. package/lib/index.js +36 -0
  160. package/lib/index.js.map +1 -0
  161. package/lib/internals/Colorize.d.ts +14 -0
  162. package/lib/internals/Colorize.d.ts.map +1 -0
  163. package/lib/internals/Colorize.js +69 -0
  164. package/lib/internals/Colorize.js.map +1 -0
  165. package/lib/internals/index.d.ts +3 -0
  166. package/lib/internals/index.d.ts.map +1 -0
  167. package/lib/internals/index.js +19 -0
  168. package/lib/internals/index.js.map +1 -0
  169. package/lib/internals/types.d.ts +43 -0
  170. package/lib/internals/types.d.ts.map +1 -0
  171. package/lib/internals/types.js +3 -0
  172. package/lib/internals/types.js.map +1 -0
  173. package/lib/server/IndexManager.d.ts +78 -0
  174. package/lib/server/IndexManager.d.ts.map +1 -0
  175. package/lib/server/IndexManager.js +259 -0
  176. package/lib/server/IndexManager.js.map +1 -0
  177. package/lib/server/VectraServer.d.ts +40 -0
  178. package/lib/server/VectraServer.d.ts.map +1 -0
  179. package/lib/server/VectraServer.js +151 -0
  180. package/lib/server/VectraServer.js.map +1 -0
  181. package/lib/server/VectraServer.spec.d.ts +2 -0
  182. package/lib/server/VectraServer.spec.d.ts.map +1 -0
  183. package/lib/server/VectraServer.spec.js +322 -0
  184. package/lib/server/VectraServer.spec.js.map +1 -0
  185. package/lib/server/handlers/documentHandlers.d.ts +15 -0
  186. package/lib/server/handlers/documentHandlers.d.ts.map +1 -0
  187. package/lib/server/handlers/documentHandlers.js +95 -0
  188. package/lib/server/handlers/documentHandlers.js.map +1 -0
  189. package/lib/server/handlers/helpers.d.ts +23 -0
  190. package/lib/server/handlers/helpers.d.ts.map +1 -0
  191. package/lib/server/handlers/helpers.js +138 -0
  192. package/lib/server/handlers/helpers.js.map +1 -0
  193. package/lib/server/handlers/index.d.ts +8 -0
  194. package/lib/server/handlers/index.d.ts.map +1 -0
  195. package/lib/server/handlers/index.js +22 -0
  196. package/lib/server/handlers/index.js.map +1 -0
  197. package/lib/server/handlers/indexHandlers.d.ts +14 -0
  198. package/lib/server/handlers/indexHandlers.d.ts.map +1 -0
  199. package/lib/server/handlers/indexHandlers.js +85 -0
  200. package/lib/server/handlers/indexHandlers.js.map +1 -0
  201. package/lib/server/handlers/itemHandlers.d.ts +34 -0
  202. package/lib/server/handlers/itemHandlers.d.ts.map +1 -0
  203. package/lib/server/handlers/itemHandlers.js +166 -0
  204. package/lib/server/handlers/itemHandlers.js.map +1 -0
  205. package/lib/server/handlers/lifecycleHandlers.d.ts +11 -0
  206. package/lib/server/handlers/lifecycleHandlers.d.ts.map +1 -0
  207. package/lib/server/handlers/lifecycleHandlers.js +31 -0
  208. package/lib/server/handlers/lifecycleHandlers.js.map +1 -0
  209. package/lib/server/handlers/queryHandlers.d.ts +27 -0
  210. package/lib/server/handlers/queryHandlers.d.ts.map +1 -0
  211. package/lib/server/handlers/queryHandlers.js +135 -0
  212. package/lib/server/handlers/queryHandlers.js.map +1 -0
  213. package/lib/server/handlers/statsHandlers.d.ts +17 -0
  214. package/lib/server/handlers/statsHandlers.d.ts.map +1 -0
  215. package/lib/server/handlers/statsHandlers.js +81 -0
  216. package/lib/server/handlers/statsHandlers.js.map +1 -0
  217. package/lib/server/index.d.ts +4 -0
  218. package/lib/server/index.d.ts.map +1 -0
  219. package/lib/server/index.js +23 -0
  220. package/lib/server/index.js.map +1 -0
  221. package/lib/storage/FileStorage.d.ts +92 -0
  222. package/lib/storage/FileStorage.d.ts.map +1 -0
  223. package/lib/storage/FileStorage.js +3 -0
  224. package/lib/storage/FileStorage.js.map +1 -0
  225. package/lib/storage/FileStorageUtilities.d.ts +36 -0
  226. package/lib/storage/FileStorageUtilities.d.ts.map +1 -0
  227. package/lib/storage/FileStorageUtilities.js +91 -0
  228. package/lib/storage/FileStorageUtilities.js.map +1 -0
  229. package/lib/storage/FileStorageUtilities.spec.d.ts +2 -0
  230. package/lib/storage/FileStorageUtilities.spec.d.ts.map +1 -0
  231. package/lib/storage/FileStorageUtilities.spec.js +98 -0
  232. package/lib/storage/FileStorageUtilities.spec.js.map +1 -0
  233. package/lib/storage/FileType.d.ts +29 -0
  234. package/lib/storage/FileType.d.ts.map +1 -0
  235. package/lib/storage/FileType.js +38 -0
  236. package/lib/storage/FileType.js.map +1 -0
  237. package/lib/storage/IndexedDBStorage.d.ts +47 -0
  238. package/lib/storage/IndexedDBStorage.d.ts.map +1 -0
  239. package/lib/storage/IndexedDBStorage.js +347 -0
  240. package/lib/storage/IndexedDBStorage.js.map +1 -0
  241. package/lib/storage/LocalFileStorage.browser.d.ts +19 -0
  242. package/lib/storage/LocalFileStorage.browser.d.ts.map +1 -0
  243. package/lib/storage/LocalFileStorage.browser.js +43 -0
  244. package/lib/storage/LocalFileStorage.browser.js.map +1 -0
  245. package/lib/storage/LocalFileStorage.d.ts +23 -0
  246. package/lib/storage/LocalFileStorage.d.ts.map +1 -0
  247. package/lib/storage/LocalFileStorage.js +152 -0
  248. package/lib/storage/LocalFileStorage.js.map +1 -0
  249. package/lib/storage/LocalFileStorage.spec.d.ts +2 -0
  250. package/lib/storage/LocalFileStorage.spec.d.ts.map +1 -0
  251. package/lib/storage/LocalFileStorage.spec.js +249 -0
  252. package/lib/storage/LocalFileStorage.spec.js.map +1 -0
  253. package/lib/storage/VirtualFileStorage.d.ts +18 -0
  254. package/lib/storage/VirtualFileStorage.d.ts.map +1 -0
  255. package/lib/storage/VirtualFileStorage.js +178 -0
  256. package/lib/storage/VirtualFileStorage.js.map +1 -0
  257. package/lib/storage/VirtualFileStorage.spec.d.ts +2 -0
  258. package/lib/storage/VirtualFileStorage.spec.d.ts.map +1 -0
  259. package/lib/storage/VirtualFileStorage.spec.js +302 -0
  260. package/lib/storage/VirtualFileStorage.spec.js.map +1 -0
  261. package/lib/storage/index.d.ts +6 -0
  262. package/lib/storage/index.d.ts.map +1 -0
  263. package/lib/storage/index.js +22 -0
  264. package/lib/storage/index.js.map +1 -0
  265. package/lib/templates/templates/csharp/README.md +48 -0
  266. package/lib/templates/templates/csharp/VectraClient.cs +234 -0
  267. package/lib/templates/templates/go/README.md +71 -0
  268. package/lib/templates/templates/go/vectra_client.go +322 -0
  269. package/lib/templates/templates/java/README.md +81 -0
  270. package/lib/templates/templates/java/VectraClient.java +232 -0
  271. package/lib/templates/templates/python/README.md +37 -0
  272. package/lib/templates/templates/python/vectra_client.py +279 -0
  273. package/lib/templates/templates/rust/Cargo.toml +14 -0
  274. package/lib/templates/templates/rust/README.md +39 -0
  275. package/lib/templates/templates/rust/build.rs +4 -0
  276. package/lib/templates/templates/rust/lib.rs +284 -0
  277. package/lib/templates/templates/typescript/README.md +96 -0
  278. package/lib/templates/templates/typescript/VectraClient.ts +374 -0
  279. package/lib/templates/typescript/VectraClient.d.ts +114 -0
  280. package/lib/templates/typescript/VectraClient.d.ts.map +1 -0
  281. package/lib/templates/typescript/VectraClient.js +328 -0
  282. package/lib/templates/typescript/VectraClient.js.map +1 -0
  283. package/lib/types.d.ts +153 -0
  284. package/lib/types.d.ts.map +1 -0
  285. package/lib/types.js +3 -0
  286. package/lib/types.js.map +1 -0
  287. package/lib/utils/index.d.ts +2 -0
  288. package/lib/utils/index.d.ts.map +1 -0
  289. package/lib/utils/index.js +18 -0
  290. package/lib/utils/index.js.map +1 -0
  291. package/lib/utils/pathUtils.d.ts +40 -0
  292. package/lib/utils/pathUtils.d.ts.map +1 -0
  293. package/lib/utils/pathUtils.js +98 -0
  294. package/lib/utils/pathUtils.js.map +1 -0
  295. package/lib/vectra-cli.d.ts +2 -0
  296. package/lib/vectra-cli.d.ts.map +1 -1
  297. package/lib/vectra-cli.generate.spec.d.ts +2 -0
  298. package/lib/vectra-cli.generate.spec.d.ts.map +1 -0
  299. package/lib/vectra-cli.generate.spec.js +112 -0
  300. package/lib/vectra-cli.generate.spec.js.map +1 -0
  301. package/lib/vectra-cli.js +760 -0
  302. package/lib/vectra-cli.js.map +1 -0
  303. package/lib/vectra-cli.spec.d.ts +1 -0
  304. package/lib/vectra-cli.spec.d.ts.map +1 -0
  305. package/lib/vectra-cli.spec.js +2 -0
  306. package/lib/vectra-cli.spec.js.map +1 -0
  307. package/package.json +91 -16
  308. package/proto/vectra_service.proto +276 -0
  309. package/src/BrowserWebFetcher.ts +345 -0
  310. package/src/FileFetcher.spec.ts +234 -0
  311. package/src/FileFetcher.ts +37 -25
  312. package/src/FolderWatcher.spec.ts +288 -0
  313. package/src/FolderWatcher.ts +304 -0
  314. package/src/GPT3Tokenizer.spec.ts +50 -0
  315. package/src/ItemSelector.spec.ts +252 -0
  316. package/src/ItemSelector.ts +163 -150
  317. package/src/LocalDocument.spec.ts +211 -0
  318. package/src/LocalDocument.ts +88 -94
  319. package/src/LocalDocumentIndex.spec.ts +481 -0
  320. package/src/LocalDocumentIndex.ts +39 -40
  321. package/src/LocalDocumentResult.spec.ts +373 -0
  322. package/src/LocalDocumentResult.ts +489 -319
  323. package/src/LocalEmbeddings.spec.ts +138 -0
  324. package/src/LocalEmbeddings.ts +120 -0
  325. package/src/LocalIndex.spec.ts +808 -66
  326. package/src/LocalIndex.ts +479 -429
  327. package/src/OpenAIEmbeddings.spec.ts +354 -0
  328. package/src/OpenAIEmbeddings.ts +26 -27
  329. package/src/TextSplitter.spec.ts +342 -0
  330. package/src/TextSplitter.ts +517 -532
  331. package/src/TransformersEmbeddings.spec.ts +188 -0
  332. package/src/TransformersEmbeddings.ts +232 -0
  333. package/src/TransformersTokenizer.spec.ts +143 -0
  334. package/src/TransformersTokenizer.ts +45 -0
  335. package/src/WebFetcher.spec.ts +288 -0
  336. package/src/WebFetcher.ts +184 -186
  337. package/src/browser.ts +69 -0
  338. package/src/codecs/IndexCodec.ts +40 -0
  339. package/src/codecs/JsonCodec.spec.ts +70 -0
  340. package/src/codecs/JsonCodec.ts +37 -0
  341. package/src/codecs/LocalIndex.protobuf.spec.ts +115 -0
  342. package/src/codecs/ProtobufCodec.spec.ts +166 -0
  343. package/src/codecs/ProtobufCodec.ts +193 -0
  344. package/src/codecs/index.ts +4 -0
  345. package/src/codecs/migrateIndex.spec.ts +176 -0
  346. package/src/codecs/migrateIndex.ts +125 -0
  347. package/src/codecs/schemas/index.proto +34 -0
  348. package/src/index.ts +9 -1
  349. package/src/internals/Colorize.ts +19 -16
  350. package/src/server/IndexManager.ts +243 -0
  351. package/src/server/VectraServer.spec.ts +303 -0
  352. package/src/server/VectraServer.ts +156 -0
  353. package/src/server/handlers/documentHandlers.ts +59 -0
  354. package/src/server/handlers/helpers.ts +93 -0
  355. package/src/server/handlers/index.ts +7 -0
  356. package/src/server/handlers/indexHandlers.ts +44 -0
  357. package/src/server/handlers/itemHandlers.ts +140 -0
  358. package/src/server/handlers/lifecycleHandlers.ts +26 -0
  359. package/src/server/handlers/queryHandlers.ts +96 -0
  360. package/src/server/handlers/statsHandlers.ts +38 -0
  361. package/src/server/index.ts +3 -0
  362. package/src/storage/FileStorage.ts +105 -0
  363. package/src/storage/FileStorageUtilities.spec.ts +106 -0
  364. package/src/storage/FileStorageUtilities.ts +77 -0
  365. package/src/storage/FileType.ts +61 -0
  366. package/src/storage/IndexedDBStorage.ts +365 -0
  367. package/src/storage/LocalFileStorage.browser.ts +52 -0
  368. package/src/storage/LocalFileStorage.spec.ts +292 -0
  369. package/src/storage/LocalFileStorage.ts +98 -0
  370. package/src/storage/VirtualFileStorage.spec.ts +307 -0
  371. package/src/storage/VirtualFileStorage.ts +169 -0
  372. package/src/storage/index.ts +5 -0
  373. package/src/templates/csharp/README.md +48 -0
  374. package/src/templates/csharp/VectraClient.cs +234 -0
  375. package/src/templates/go/README.md +71 -0
  376. package/src/templates/go/vectra_client.go +322 -0
  377. package/src/templates/java/README.md +81 -0
  378. package/src/templates/java/VectraClient.java +232 -0
  379. package/src/templates/python/README.md +37 -0
  380. package/src/templates/python/vectra_client.py +279 -0
  381. package/src/templates/rust/Cargo.toml +14 -0
  382. package/src/templates/rust/README.md +39 -0
  383. package/src/templates/rust/build.rs +4 -0
  384. package/src/templates/rust/lib.rs +284 -0
  385. package/src/templates/typescript/README.md +96 -0
  386. package/src/templates/typescript/VectraClient.ts +374 -0
  387. package/src/types.ts +131 -123
  388. package/src/utils/index.ts +1 -0
  389. package/src/utils/pathUtils.ts +106 -0
  390. package/src/vectra-cli.generate.spec.ts +72 -0
  391. package/src/vectra-cli.spec.ts +0 -0
  392. 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 from 'turndown';
3
+ import TurndownService from 'turndown';
5
4
 
6
5
  const ALLOWED_CONTENT_TYPES = [
7
- "text/html",
8
- "application/json",
9
- "application/xml",
10
- "application/javascript",
11
- "text/plain",
6
+ "text/html",
7
+ "application/json",
8
+ "application/xml",
9
+ "application/javascript",
10
+ "text/plain",
12
11
  ];
13
12
 
14
- const DEFAULT_HEADERS = {
15
- Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
16
- "Accept-Encoding": "gzip, deflate, sdch, br",
17
- "Accept-Language": "en-US,en;q=0.8,ms;q=0.6",
18
- "Alt-Used": "LEAVE-THIS-KEY-SET-BY-TOOL",
19
- Connection: "keep-alive",
20
- Host: "LEAVE-THIS-KEY-SET-BY-TOOL",
21
- Referer: "https://www.google.com/",
22
- "Sec-Fetch-Dest": "document",
23
- "Sec-Fetch-Mode": "navigate",
24
- "Sec-Fetch-Site": "cross-site",
25
- "Upgrade-Insecure-Requests": "1",
26
- "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
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
- headers?: Record<string,string>;
31
- requestConfig?: AxiosRequestConfig;
32
- htmlToMarkdown: boolean;
33
- summarizeHtml: boolean;
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
- private readonly _config: WebFetcherConfig;
38
-
39
- public constructor(config?: Partial<WebFetcherConfig>) {
40
- this._config = Object.assign({
41
- htmlToMarkdown: true,
42
- summarizeHtml: false,
43
- } as WebFetcherConfig, config);
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
- public async fetch(uri: string, onDocument: (uri: string, text: string, docType?: string) => Promise<boolean>): Promise<boolean> {
47
- const httpClient = axios.create({
48
- validateStatus: () => true,
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
- private htmlToMarkdown(html: string, baseUrl: string): string {
88
- // Parse HTML and remove scripts
89
- const $ = cheerio.load(html, { scriptingEnabled: true });
90
-
91
- // Remove scripts and convert relative links to absolute
92
- $('script').remove();
93
- $('a').each((i, elem) => {
94
- const $el = $(elem);
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
- function convertTables(turndownService: TurndownService): void {
125
- turndownService.addRule('tableCell', {
126
- filter: ['th', 'td'],
127
- replacement: function (content, node) {
128
- return cell(content, node)
129
- }
130
- });
131
-
132
- turndownService.addRule('tableRow', {
133
- filter: 'tr',
134
- replacement: function (content, node) {
135
- var borderCells = ''
136
- var alignMap: any = { left: ':--', right: '--:', center: ':-:' }
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
- turndownService.addRule('table', {
155
- filter: ['table'],
156
- replacement: function (content, node) {
157
- // Ensure there are no blank lines
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
- turndownService.addRule('tableSection', {
164
- filter: ['thead', 'tbody', 'tfoot'],
165
- replacement: function (content) {
166
- return content
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
- var parentNode = tr.parentNode
181
- return (
182
- parentNode.nodeName === 'THEAD' ||
183
- (
184
- parentNode.firstChild === tr &&
185
- (parentNode.nodeName === 'TABLE' || isFirstTbody(parentNode)) &&
186
- every.call(tr.childNodes, function (n) { return n.nodeName === 'TH' })
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
- var previousSibling = element.previousSibling
193
- return (
194
- element.nodeName === 'TBODY' && (
195
- !previousSibling ||
196
- (
197
- previousSibling.nodeName === 'THEAD' &&
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
- var index = indexOf.call(node.parentNode.childNodes, node)
206
- var prefix = ' '
207
- if (index === 0) {
208
- prefix = '| '
209
- }
210
- return cleanContent(prefix + content + ' |');
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
- let output = '';
215
- const chars = ['\n', '\r', '\t', '\f', '\v', '\u00a0', '\u2028', '\u2029', ' '];
216
- for (let i = 0; i < content.length; i++) {
217
- if (chars.includes(content[i])) {
218
- if (output[output.length - 1] != ' ') {
219
- output += ' ';
220
- }
221
- continue;
222
- } else {
223
- output += content[i];
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
- return output;
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
+ }