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
@@ -0,0 +1,252 @@
1
+ import { strict as assert } from 'node:assert';
2
+ import { ItemSelector } from './ItemSelector';
3
+
4
+ function almostEqual(actual: number, expected: number, eps = 1e-12) {
5
+ assert.ok(Math.abs(actual - expected) <= eps, `actual ${actual} not within ${eps} of expected ${expected}`);
6
+ }
7
+
8
+ describe('ItemSelector', () => {
9
+ describe('normalize', () => {
10
+ it('returns correct norm for typical vector', () => {
11
+ assert.equal(ItemSelector.normalize([3, 4]), 5);
12
+ });
13
+
14
+ it('handles negatives', () => {
15
+ assert.equal(ItemSelector.normalize([-2, -3]), Math.sqrt(13));
16
+ });
17
+
18
+ it('returns 0 for zero vector', () => {
19
+ assert.equal(ItemSelector.normalize([0, 0]), 0);
20
+ });
21
+
22
+ it('returns 0 for empty vector', () => {
23
+ assert.equal(ItemSelector.normalize([]), 0);
24
+ });
25
+ });
26
+
27
+ describe('cosineSimilarity', () => {
28
+ it('returns ~1 for identical vectors', () => {
29
+ const actual = ItemSelector.cosineSimilarity([1, 2], [1, 2]);
30
+ almostEqual(actual, 1);
31
+ });
32
+
33
+ it('returns ~0 for orthogonal vectors', () => {
34
+ const actual = ItemSelector.cosineSimilarity([1, 0], [0, 1]);
35
+ almostEqual(actual, 0);
36
+ });
37
+
38
+ it('returns ~-1 for opposite vectors', () => {
39
+ const actual = ItemSelector.cosineSimilarity([1, 0], [-1, 0]);
40
+ almostEqual(actual, -1);
41
+ });
42
+
43
+ it('returns NaN if one vector is zero', () => {
44
+ assert.ok(Number.isNaN(ItemSelector.cosineSimilarity([0, 0], [1, 2])));
45
+ });
46
+
47
+ it('returns NaN if both vectors are zero', () => {
48
+ assert.ok(Number.isNaN(ItemSelector.cosineSimilarity([0, 0], [0, 0])));
49
+ });
50
+
51
+ it('handles different lengths by ignoring extra elements (including in norms)', () => {
52
+ const v1 = [1, 2, 3];
53
+ const v2 = [4, 5];
54
+ const minLen = Math.min(v1.length, v2.length);
55
+
56
+ const dot = v1.slice(0, minLen).reduce((sum, val, i) => sum + val * v2[i], 0);
57
+ const norm1 = ItemSelector.normalize(v1.slice(0, minLen));
58
+ const norm2 = ItemSelector.normalize(v2.slice(0, minLen));
59
+ const expected = dot / (norm1 * norm2);
60
+
61
+ const result = ItemSelector.cosineSimilarity(v1, v2);
62
+ almostEqual(result, expected);
63
+ });
64
+ });
65
+
66
+ describe('normalizedCosineSimilarity', () => {
67
+ it('returns correct similarity with valid norms', () => {
68
+ const v1 = [1, 2];
69
+ const v2 = [2, 3];
70
+ const norm1 = ItemSelector.normalize(v1);
71
+ const norm2 = ItemSelector.normalize(v2);
72
+ const expected = (v1[0] * v2[0] + v1[1] * v2[1]) / (norm1 * norm2);
73
+ const actual = ItemSelector.normalizedCosineSimilarity(v1, norm1, v2, norm2);
74
+ almostEqual(actual, expected);
75
+ });
76
+
77
+ it('returns NaN if norm1 is zero', () => {
78
+ assert.ok(Number.isNaN(ItemSelector.normalizedCosineSimilarity([1, 2], 0, [2, 3], 1)));
79
+ });
80
+
81
+ it('returns NaN if norm2 is zero', () => {
82
+ assert.ok(Number.isNaN(ItemSelector.normalizedCosineSimilarity([1, 2], 1, [2, 3], 0)));
83
+ });
84
+ });
85
+
86
+ describe('select', () => {
87
+ it('returns true for empty filter object', () => {
88
+ assert.equal(ItemSelector.select({ a: 1 }, {} as any), true);
89
+ });
90
+
91
+ it('returns false if unknown key and metadata missing key', () => {
92
+ assert.equal(ItemSelector.select({}, { unknown: 'value' } as any), false);
93
+ });
94
+
95
+ it('returns true if unknown key and metadata has equal value', () => {
96
+ assert.equal(ItemSelector.select({ unknown: 'value' }, { unknown: 'value' } as any), true);
97
+ });
98
+
99
+ it('returns false if filter value is undefined or null', () => {
100
+ assert.equal(ItemSelector.select({ name: 'alice' }, { name: undefined } as any), false);
101
+ assert.equal(ItemSelector.select({ name: 'alice' }, { name: null } as any), false);
102
+ });
103
+
104
+ it('handles $and with all subfilters passing', () => {
105
+ const filter = { $and: [{ a: 1 }, { b: 2 }] } as any;
106
+ const metadata = { a: 1, b: 2 };
107
+ assert.equal(ItemSelector.select(metadata, filter), true);
108
+ });
109
+
110
+ it('handles $and with one subfilter failing', () => {
111
+ const filter = { $and: [{ a: 1 }, { b: 3 }] } as any;
112
+ const metadata = { a: 1, b: 2 };
113
+ assert.equal(ItemSelector.select(metadata, filter), false);
114
+ });
115
+
116
+ it('handles empty $and array', () => {
117
+ assert.equal(ItemSelector.select({}, { $and: [] } as any), true);
118
+ });
119
+
120
+ it('handles nested $and/$or combinations', () => {
121
+ const filter = { $and: [{ $or: [{ a: 1 }, { b: 2 }] }, { c: 3 }] } as any;
122
+ const metadata1 = { a: 1, c: 3 };
123
+ const metadata2 = { b: 2, c: 3 };
124
+ const metadata3 = { a: 1, c: 4 };
125
+ assert.equal(ItemSelector.select(metadata1, filter), true);
126
+ assert.equal(ItemSelector.select(metadata2, filter), true);
127
+ assert.equal(ItemSelector.select(metadata3, filter), false);
128
+ });
129
+
130
+ it('handles $or with at least one subfilter passing', () => {
131
+ const filter = { $or: [{ a: 1 }, { b: 2 }] } as any;
132
+ const metadata = { a: 1, b: 3 };
133
+ assert.equal(ItemSelector.select(metadata, filter), true);
134
+ });
135
+
136
+ it('handles $or with all subfilters failing', () => {
137
+ const filter = { $or: [{ a: 2 }, { b: 3 }] } as any;
138
+ const metadata = { a: 1, b: 2 };
139
+ assert.equal(ItemSelector.select(metadata, filter), false);
140
+ });
141
+
142
+ it('handles empty $or array', () => {
143
+ assert.equal(ItemSelector.select({}, { $or: [] } as any), false);
144
+ });
145
+
146
+ it('handles metadataFilter numeric comparisons', () => {
147
+ const metadata = { num: 5, str: 'hello' };
148
+
149
+ assert.equal(ItemSelector.select(metadata, { num: { $eq: 5 } } as any), true);
150
+ assert.equal(ItemSelector.select(metadata, { num: { $eq: 4 } } as any), false);
151
+
152
+ assert.equal(ItemSelector.select(metadata, { num: { $ne: 4 } } as any), true);
153
+ assert.equal(ItemSelector.select(metadata, { num: { $ne: 5 } } as any), false);
154
+
155
+ assert.equal(ItemSelector.select(metadata, { num: { $gt: 4 } } as any), true);
156
+ assert.equal(ItemSelector.select(metadata, { num: { $gt: 5 } } as any), false);
157
+ assert.equal(ItemSelector.select(metadata, { num: { $gt: 4.9 } } as any), true);
158
+ assert.equal(ItemSelector.select(metadata, { str: { $gt: 'a' } } as any), false);
159
+
160
+ assert.equal(ItemSelector.select(metadata, { num: { $gte: 5 } } as any), true);
161
+ assert.equal(ItemSelector.select(metadata, { num: { $gte: 6 } } as any), false);
162
+ assert.equal(ItemSelector.select(metadata, { str: { $gte: 'a' } } as any), false);
163
+
164
+ assert.equal(ItemSelector.select(metadata, { num: { $lt: 6 } } as any), true);
165
+ assert.equal(ItemSelector.select(metadata, { num: { $lt: 5 } } as any), false);
166
+ assert.equal(ItemSelector.select(metadata, { str: { $lt: 'z' } } as any), false);
167
+
168
+ assert.equal(ItemSelector.select(metadata, { num: { $lte: 5 } } as any), true);
169
+ assert.equal(ItemSelector.select(metadata, { num: { $lte: 4 } } as any), false);
170
+ assert.equal(ItemSelector.select(metadata, { str: { $lte: 'z' } } as any), false);
171
+ });
172
+
173
+ it('$in behavior matches implementation (booleans false, exact match for strings, substring for strings, numbers via substring in array strings)', () => {
174
+ const metadataBool = { val: true };
175
+ const metadataStr = { val: 'foo' };
176
+ const metadataStr2 = { val: 'oo' };
177
+ const metadataNum = { val: 42 };
178
+ const arrStr = ['foo', 'bar'];
179
+ const arrMixedNo = ['foobar', 'baz'];
180
+ const arrMixedYes = ['x42y', 'baz'];
181
+
182
+ // boolean always false
183
+ assert.equal(ItemSelector.select(metadataBool, { val: { $in: ['foo'] } } as any), false);
184
+
185
+ // string exact includes
186
+ assert.equal(ItemSelector.select(metadataStr, { val: { $in: arrStr } } as any), true);
187
+
188
+ // string not included
189
+ assert.equal(ItemSelector.select(metadataStr2, { val: { $in: arrStr } } as any), false);
190
+
191
+ // number: true only if some array string includes the number as a substring
192
+ assert.equal(ItemSelector.select(metadataNum, { val: { $in: arrMixedNo } } as any), false);
193
+ assert.equal(ItemSelector.select(metadataNum, { val: { $in: arrMixedYes } } as any), true);
194
+
195
+ // array of numbers does not include string '42'
196
+ assert.equal(ItemSelector.select({ val: '42' }, { val: { $in: [1, 2] } } as any), false);
197
+ });
198
+
199
+ it('$nin behavior matches implementation (booleans false, blocks exact/substring for strings, numbers only blocked by substring in array strings)', () => {
200
+ const metadataBool = { val: true };
201
+ const metadataStr = { val: 'foo' };
202
+ const metadataStrSub = { val: 'oo' };
203
+ const metadataNum = { val: 42 };
204
+ const arrStr = ['foo', 'bar'];
205
+ const arrMixedNo = ['foobar', 'baz'];
206
+ const arrMixedYes = ['baz', 'z42z'];
207
+ const arrNum = [42];
208
+
209
+ // boolean always false
210
+ assert.equal(ItemSelector.select(metadataBool, { val: { $nin: ['foo'] } } as any), false);
211
+
212
+ // string exact match present -> false
213
+ assert.equal(ItemSelector.select(metadataStr, { val: { $nin: arrStr } } as any), false);
214
+
215
+ // string is a substring of an element -> false
216
+ assert.equal(ItemSelector.select(metadataStrSub, { val: { $nin: arrMixedNo } } as any), false);
217
+
218
+ // number: true if no array string includes the number as substring
219
+ assert.equal(ItemSelector.select(metadataNum, { val: { $nin: arrMixedNo } } as any), true);
220
+
221
+ // number: false if some array string includes the number as substring
222
+ assert.equal(ItemSelector.select(metadataNum, { val: { $nin: arrMixedYes } } as any), false);
223
+
224
+ // array of numbers does not block number (implementation detail)
225
+ assert.equal(ItemSelector.select(metadataNum, { val: { $nin: arrNum } } as any), true);
226
+ });
227
+
228
+ it('handles default operator fall-through (unknown operator compares equality to its value)', () => {
229
+ const metadata = { field: 'bar' };
230
+ // Unknown operator compares metadata value to the operator's value
231
+ assert.equal(ItemSelector.select(metadata, { field: { $foo: 'bar' } } as any), true);
232
+ assert.equal(ItemSelector.select(metadata, { field: { $foo: 'baz' } } as any), false);
233
+
234
+ // Direct scalar equality
235
+ assert.equal(ItemSelector.select(metadata, { field: 'bar' } as any), true);
236
+ assert.equal(ItemSelector.select(metadata, { field: 'baz' } as any), false);
237
+ });
238
+
239
+ it('returns false if metadata key missing in object filter', () => {
240
+ const metadata = {};
241
+ assert.equal(ItemSelector.select(metadata, { age: { $gt: 18 } } as any), false);
242
+ });
243
+
244
+ it('handles multi-field filter with mixed scalar and operator filters', () => {
245
+ const metadata = { a: 1, b: 2, c: 3 };
246
+ const filter = { a: 1, b: { $gt: 1 }, c: { $lt: 4 } } as any;
247
+ assert.equal(ItemSelector.select(metadata, filter), true);
248
+ const filterFail = { a: 1, b: { $gt: 2 }, c: { $lt: 4 } } as any;
249
+ assert.equal(ItemSelector.select(metadata, filterFail), false);
250
+ });
251
+ });
252
+ });
@@ -1,168 +1,181 @@
1
1
  import { MetadataFilter, MetadataTypes } from './types';
2
2
 
3
3
  export class ItemSelector {
4
- /**
5
- * Returns the similarity between two vectors using the cosine similarity.
6
- * @param vector1 Vector 1
7
- * @param vector2 Vector 2
8
- * @returns Similarity between the two vectors
9
- */
10
- public static cosineSimilarity(vector1: number[], vector2: number[]) {
11
- // Return the quotient of the dot product and the product of the norms
12
- return this.dotProduct(vector1, vector2) / (this.normalize(vector1) * this.normalize(vector2));
4
+ /**
5
+ * Returns the similarity between two vectors using the cosine similarity.
6
+ * @param vector1 Vector 1
7
+ * @param vector2 Vector 2
8
+ * @returns Similarity between the two vectors
9
+ */
10
+ public static cosineSimilarity(vector1: number[], vector2: number[]) {
11
+ // Use only the overlapping portion of both vectors (dot and norms)
12
+ const minLen = Math.min(vector1.length, vector2.length);
13
+ const v1 = vector1.slice(0, minLen);
14
+ const v2 = vector2.slice(0, minLen);
15
+
16
+ const norm1 = this.normalize(v1);
17
+ const norm2 = this.normalize(v2);
18
+ if (norm1 === 0 || norm2 === 0) {
19
+ return NaN;
13
20
  }
14
21
 
15
- /**
16
- * Normalizes a vector.
17
- * @remarks
18
- * The norm of a vector is the square root of the sum of the squares of the elements.
19
- * The LocalIndex pre-normalizes all vectors to improve performance.
20
- * @param vector Vector to normalize
21
- * @returns Normalized vector
22
- */
23
- public static normalize(vector: number[]) {
24
- // Initialize a variable to store the sum of the squares
25
- let sum = 0;
26
- // Loop through the elements of the array
27
- for (let i = 0; i < vector.length; i++) {
28
- // Square the element and add it to the sum
29
- sum += vector[i] * vector[i];
30
- }
31
- // Return the square root of the sum
32
- return Math.sqrt(sum);
22
+ return this.dotProduct(v1, v2) / (norm1 * norm2);
23
+ }
24
+
25
+ /**
26
+ * Normalizes a vector.
27
+ * @remarks
28
+ * The norm of a vector is the square root of the sum of the squares of the elements.
29
+ * The LocalIndex pre-normalizes all vectors to improve performance.
30
+ * @param vector Vector to normalize
31
+ * @returns Normalized vector
32
+ */
33
+ public static normalize(vector: number[]) {
34
+ // Initialize a variable to store the sum of the squares
35
+ let sum = 0;
36
+ // Loop through the elements of the array
37
+ for (let i = 0; i < vector.length; i++) {
38
+ // Square the element and add it to the sum
39
+ sum += vector[i] * vector[i];
33
40
  }
41
+ // Return the square root of the sum
42
+ return Math.sqrt(sum);
43
+ }
34
44
 
35
- /**
36
- * Returns the similarity between two vectors using cosine similarity.
37
- * @remarks
38
- * The LocalIndex pre-normalizes all vectors to improve performance.
39
- * This method uses the pre-calculated norms to improve performance.
40
- * @param vector1 Vector 1
41
- * @param norm1 Norm of vector 1
42
- * @param vector2 Vector 2
43
- * @param norm2 Norm of vector 2
44
- * @returns Similarity between the two vectors
45
- */
46
- public static normalizedCosineSimilarity(vector1: number[], norm1: number, vector2: number[], norm2: number) {
47
- // Return the quotient of the dot product and the product of the norms
48
- return this.dotProduct(vector1, vector2) / (norm1 * norm2);
45
+ /**
46
+ * Returns the similarity between two vectors using cosine similarity.
47
+ * @remarks
48
+ * The LocalIndex pre-normalizes all vectors to improve performance.
49
+ * This method uses the pre-calculated norms to improve performance.
50
+ * @param vector1 Vector 1
51
+ * @param norm1 Norm of vector 1
52
+ * @param vector2 Vector 2
53
+ * @param norm2 Norm of vector 2
54
+ * @returns Similarity between the two vectors
55
+ */
56
+ public static normalizedCosineSimilarity(vector1: number[], norm1: number, vector2: number[], norm2: number) {
57
+ // Explicitly return NaN if either norm is zero
58
+ if (norm1 === 0 || norm2 === 0) {
59
+ return NaN;
49
60
  }
61
+ // Return the quotient of the dot product and the product of the norms
62
+ return this.dotProduct(vector1, vector2) / (norm1 * norm2);
63
+ }
50
64
 
51
- /**
52
- * Applies a filter to the metadata of an item.
53
- * @param metadata Metadata of the item
54
- * @param filter Filter to apply
55
- * @returns True if the item matches the filter, false otherwise
56
- */
57
- public static select(metadata: Record<string, MetadataTypes>, filter: MetadataFilter): boolean {
58
- if (filter === undefined || filter === null) {
59
- return true;
60
- }
65
+ /**
66
+ * Applies a filter to the metadata of an item.
67
+ * @param metadata Metadata of the item
68
+ * @param filter Filter to apply
69
+ * @returns True if the item matches the filter, false otherwise
70
+ */
71
+ public static select(metadata: Record<string, MetadataTypes>, filter: MetadataFilter): boolean {
72
+ // Treat null/undefined and {} as "no filter"
73
+ if (filter == null || (typeof filter === 'object' && Object.keys(filter).length === 0)) {
74
+ return true;
75
+ }
61
76
 
62
- for (const key in filter) {
63
- switch (key) {
64
- case '$and':
65
- if (!filter[key]!.every((f: MetadataFilter) => this.select(metadata, f))) {
66
- return false;
67
- }
68
- break;
69
- case '$or':
70
- if (!filter[key]!.some((f: MetadataFilter) => this.select(metadata, f))) {
71
- return false;
72
- }
73
- break;
74
- default:
75
- const value = filter[key];
76
- if (value === undefined || value === null) {
77
- return false;
78
- } else if (typeof value == 'object') {
79
- if (!this.metadataFilter(metadata[key], value as MetadataFilter)) {
80
- return false;
81
- }
82
- } else {
83
- if (metadata[key] !== value) {
84
- return false;
85
- }
86
- }
87
- break;
77
+ for (const key in filter) {
78
+ switch (key) {
79
+ case '$and':
80
+ if (!filter[key]!.every((f: MetadataFilter) => this.select(metadata, f))) {
81
+ return false;
82
+ }
83
+ break;
84
+ case '$or':
85
+ if (!filter[key]!.some((f: MetadataFilter) => this.select(metadata, f))) {
86
+ return false;
87
+ }
88
+ break;
89
+ default:
90
+ const value = filter[key];
91
+ if (value === undefined || value === null) {
92
+ return false;
93
+ } else if (typeof value == 'object') {
94
+ if (!this.metadataFilter(metadata[key], value as MetadataFilter)) {
95
+ return false;
88
96
  }
89
- }
90
- return true;
97
+ } else {
98
+ if (metadata[key] !== value) {
99
+ return false;
100
+ }
101
+ }
102
+ break;
103
+ }
91
104
  }
105
+ return true;
106
+ }
92
107
 
93
- private static dotProduct(arr1: number[], arr2: number[]) {
94
- // Initialize a variable to store the sum of the products
95
- let sum = 0;
96
- // Loop through the elements of the arrays
97
- for (let i = 0; i < arr1.length; i++) {
98
- // Multiply the corresponding elements and add them to the sum
99
- sum += arr1[i] * arr2[i];
100
- }
101
- // Return the sum
102
- return sum;
108
+ private static dotProduct(arr1: number[], arr2: number[]) {
109
+ // Use only overlapping indices to avoid NaN when lengths differ
110
+ const minLen = Math.min(arr1.length, arr2.length);
111
+ let sum = 0;
112
+ for (let i = 0; i < minLen; i++) {
113
+ sum += arr1[i] * arr2[i];
103
114
  }
115
+ return sum;
116
+ }
104
117
 
105
- private static metadataFilter(value: MetadataTypes, filter: MetadataFilter): boolean {
106
- if (value === undefined || value === null) {
107
- return false;
108
- }
118
+ private static metadataFilter(value: MetadataTypes, filter: MetadataFilter): boolean {
119
+ if (value === undefined || value === null) {
120
+ return false;
121
+ }
109
122
 
110
- for (const key in filter) {
111
- switch (key) {
112
- case '$eq':
113
- if (value !== filter[key]) {
114
- return false;
115
- }
116
- break;
117
- case '$ne':
118
- if (value === filter[key]) {
119
- return false;
120
- }
121
- break;
122
- case '$gt':
123
- if (typeof value != 'number' || value <= filter[key]!) {
124
- return false;
125
- }
126
- break;
127
- case '$gte':
128
- if (typeof value != 'number' || value < filter[key]!) {
129
- return false;
130
- }
131
- break;
132
- case '$lt':
133
- if (typeof value != 'number' || value >= filter[key]!) {
134
- return false;
135
- }
136
- break;
137
- case '$lte':
138
- if (typeof value != 'number' || value > filter[key]!) {
139
- return false;
140
- }
141
- break;
142
- case '$in':
143
- if (typeof value == 'boolean') {
144
- return false;
145
- } else if(typeof value == 'string' && !filter[key]!.includes(value)){
146
- return false
147
- } else if(!filter[key]!.some(val => typeof val == 'string' && val.includes(value as string))){
148
- return false
149
- }
150
- break;
151
- case '$nin':
152
- if (typeof value == 'boolean') {
153
- return false;
154
- }
155
- else if (typeof value == 'string' && filter[key]!.includes(value)) {
156
- return false;
157
- }
158
- else if (filter[key]!.some(val => typeof val == 'string' && val.includes(value as string))) {
159
- return false;
160
- }
161
- break;
162
- default:
163
- return value === filter[key];
164
- }
165
- }
166
- return true;
123
+ for (const key in filter) {
124
+ switch (key) {
125
+ case '$eq':
126
+ if (value !== filter[key]) {
127
+ return false;
128
+ }
129
+ break;
130
+ case '$ne':
131
+ if (value === filter[key]) {
132
+ return false;
133
+ }
134
+ break;
135
+ case '$gt':
136
+ if (typeof value != 'number' || value <= filter[key]!) {
137
+ return false;
138
+ }
139
+ break;
140
+ case '$gte':
141
+ if (typeof value != 'number' || value < filter[key]!) {
142
+ return false;
143
+ }
144
+ break;
145
+ case '$lt':
146
+ if (typeof value != 'number' || value >= filter[key]!) {
147
+ return false;
148
+ }
149
+ break;
150
+ case '$lte':
151
+ if (typeof value != 'number' || value > filter[key]!) {
152
+ return false;
153
+ }
154
+ break;
155
+ case '$in':
156
+ if (typeof value == 'boolean') {
157
+ return false;
158
+ } else if (typeof value == 'string' && !filter[key]!.includes(value)) {
159
+ return false;
160
+ } else if (!filter[key]!.some(val => typeof val == 'string' && val.includes(value as string))) {
161
+ return false;
162
+ }
163
+ break;
164
+ case '$nin':
165
+ if (typeof value == 'boolean') {
166
+ return false;
167
+ }
168
+ else if (typeof value == 'string' && filter[key]!.includes(value)) {
169
+ return false;
170
+ }
171
+ else if (filter[key]!.some(val => typeof val == 'string' && val.includes(value as string))) {
172
+ return false;
173
+ }
174
+ break;
175
+ default:
176
+ return value === filter[key];
177
+ }
167
178
  }
179
+ return true;
180
+ }
168
181
  }