vikunja-mcp-ng 0.4.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 (582) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +123 -0
  3. package/dist/auth/AuthManager.d.ts +63 -0
  4. package/dist/auth/AuthManager.d.ts.map +1 -0
  5. package/dist/auth/AuthManager.js +137 -0
  6. package/dist/auth/AuthManager.js.map +1 -0
  7. package/dist/auth/index.d.ts +7 -0
  8. package/dist/auth/index.d.ts.map +1 -0
  9. package/dist/auth/index.js +14 -0
  10. package/dist/auth/index.js.map +1 -0
  11. package/dist/auth/permissions.d.ts +60 -0
  12. package/dist/auth/permissions.d.ts.map +1 -0
  13. package/dist/auth/permissions.js +173 -0
  14. package/dist/auth/permissions.js.map +1 -0
  15. package/dist/client/VikunjaClientFactory.d.ts +41 -0
  16. package/dist/client/VikunjaClientFactory.d.ts.map +1 -0
  17. package/dist/client/VikunjaClientFactory.js +58 -0
  18. package/dist/client/VikunjaClientFactory.js.map +1 -0
  19. package/dist/client.d.ts +70 -0
  20. package/dist/client.d.ts.map +1 -0
  21. package/dist/client.js +136 -0
  22. package/dist/client.js.map +1 -0
  23. package/dist/config/ConfigurationManager.d.ts +106 -0
  24. package/dist/config/ConfigurationManager.d.ts.map +1 -0
  25. package/dist/config/ConfigurationManager.js +509 -0
  26. package/dist/config/ConfigurationManager.js.map +1 -0
  27. package/dist/config/index.d.ts +9 -0
  28. package/dist/config/index.d.ts.map +1 -0
  29. package/dist/config/index.js +36 -0
  30. package/dist/config/index.js.map +1 -0
  31. package/dist/config/secrets.d.ts +33 -0
  32. package/dist/config/secrets.d.ts.map +1 -0
  33. package/dist/config/secrets.js +90 -0
  34. package/dist/config/secrets.js.map +1 -0
  35. package/dist/config/types.d.ts +1113 -0
  36. package/dist/config/types.d.ts.map +1 -0
  37. package/dist/config/types.js +189 -0
  38. package/dist/config/types.js.map +1 -0
  39. package/dist/formatters/BatchImportResponseFormatter.d.ts +89 -0
  40. package/dist/formatters/BatchImportResponseFormatter.d.ts.map +1 -0
  41. package/dist/formatters/BatchImportResponseFormatter.js +125 -0
  42. package/dist/formatters/BatchImportResponseFormatter.js.map +1 -0
  43. package/dist/index.d.ts +20 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +130 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/middleware/direct-middleware.d.ts +9 -0
  48. package/dist/middleware/direct-middleware.d.ts.map +1 -0
  49. package/dist/middleware/direct-middleware.js +49 -0
  50. package/dist/middleware/direct-middleware.js.map +1 -0
  51. package/dist/middleware/index.d.ts +8 -0
  52. package/dist/middleware/index.d.ts.map +1 -0
  53. package/dist/middleware/index.js +21 -0
  54. package/dist/middleware/index.js.map +1 -0
  55. package/dist/middleware/simplified-rate-limit.d.ts +147 -0
  56. package/dist/middleware/simplified-rate-limit.d.ts.map +1 -0
  57. package/dist/middleware/simplified-rate-limit.js +533 -0
  58. package/dist/middleware/simplified-rate-limit.js.map +1 -0
  59. package/dist/parsers/CSVParser.d.ts +36 -0
  60. package/dist/parsers/CSVParser.d.ts.map +1 -0
  61. package/dist/parsers/CSVParser.js +69 -0
  62. package/dist/parsers/CSVParser.js.map +1 -0
  63. package/dist/parsers/InputParserFactory.d.ts +17 -0
  64. package/dist/parsers/InputParserFactory.d.ts.map +1 -0
  65. package/dist/parsers/InputParserFactory.js +137 -0
  66. package/dist/parsers/InputParserFactory.js.map +1 -0
  67. package/dist/parsers/JSONParser.d.ts +74 -0
  68. package/dist/parsers/JSONParser.d.ts.map +1 -0
  69. package/dist/parsers/JSONParser.js +69 -0
  70. package/dist/parsers/JSONParser.js.map +1 -0
  71. package/dist/services/EntityResolver.d.ts +92 -0
  72. package/dist/services/EntityResolver.d.ts.map +1 -0
  73. package/dist/services/EntityResolver.js +201 -0
  74. package/dist/services/EntityResolver.js.map +1 -0
  75. package/dist/services/TaskCreationService.d.ts +99 -0
  76. package/dist/services/TaskCreationService.d.ts.map +1 -0
  77. package/dist/services/TaskCreationService.js +392 -0
  78. package/dist/services/TaskCreationService.js.map +1 -0
  79. package/dist/storage/SimpleFilterStorage.d.ts +103 -0
  80. package/dist/storage/SimpleFilterStorage.d.ts.map +1 -0
  81. package/dist/storage/SimpleFilterStorage.js +350 -0
  82. package/dist/storage/SimpleFilterStorage.js.map +1 -0
  83. package/dist/storage/filtering/FilterSerializer.d.ts +45 -0
  84. package/dist/storage/filtering/FilterSerializer.d.ts.map +1 -0
  85. package/dist/storage/filtering/FilterSerializer.js +171 -0
  86. package/dist/storage/filtering/FilterSerializer.js.map +1 -0
  87. package/dist/storage/filtering/FilterValidator.d.ts +59 -0
  88. package/dist/storage/filtering/FilterValidator.d.ts.map +1 -0
  89. package/dist/storage/filtering/FilterValidator.js +183 -0
  90. package/dist/storage/filtering/FilterValidator.js.map +1 -0
  91. package/dist/storage/index.d.ts +61 -0
  92. package/dist/storage/index.d.ts.map +1 -0
  93. package/dist/storage/index.js +125 -0
  94. package/dist/storage/index.js.map +1 -0
  95. package/dist/storage/templateFileStore.d.ts +62 -0
  96. package/dist/storage/templateFileStore.d.ts.map +1 -0
  97. package/dist/storage/templateFileStore.js +151 -0
  98. package/dist/storage/templateFileStore.js.map +1 -0
  99. package/dist/tools/admin.d.ts +51 -0
  100. package/dist/tools/admin.d.ts.map +1 -0
  101. package/dist/tools/admin.js +207 -0
  102. package/dist/tools/admin.js.map +1 -0
  103. package/dist/tools/auth.d.ts +9 -0
  104. package/dist/tools/auth.d.ts.map +1 -0
  105. package/dist/tools/auth.js +175 -0
  106. package/dist/tools/auth.js.map +1 -0
  107. package/dist/tools/batch-import.d.ts +5 -0
  108. package/dist/tools/batch-import.d.ts.map +1 -0
  109. package/dist/tools/batch-import.js +153 -0
  110. package/dist/tools/batch-import.js.map +1 -0
  111. package/dist/tools/caldav-tokens.d.ts +45 -0
  112. package/dist/tools/caldav-tokens.d.ts.map +1 -0
  113. package/dist/tools/caldav-tokens.js +93 -0
  114. package/dist/tools/caldav-tokens.js.map +1 -0
  115. package/dist/tools/export.d.ts +14 -0
  116. package/dist/tools/export.d.ts.map +1 -0
  117. package/dist/tools/export.js +252 -0
  118. package/dist/tools/export.js.map +1 -0
  119. package/dist/tools/filters.d.ts +50 -0
  120. package/dist/tools/filters.d.ts.map +1 -0
  121. package/dist/tools/filters.js +512 -0
  122. package/dist/tools/filters.js.map +1 -0
  123. package/dist/tools/index.d.ts +53 -0
  124. package/dist/tools/index.d.ts.map +1 -0
  125. package/dist/tools/index.js +217 -0
  126. package/dist/tools/index.js.map +1 -0
  127. package/dist/tools/labels.d.ts +22 -0
  128. package/dist/tools/labels.d.ts.map +1 -0
  129. package/dist/tools/labels.js +206 -0
  130. package/dist/tools/labels.js.map +1 -0
  131. package/dist/tools/notifications.d.ts +17 -0
  132. package/dist/tools/notifications.d.ts.map +1 -0
  133. package/dist/tools/notifications.js +171 -0
  134. package/dist/tools/notifications.js.map +1 -0
  135. package/dist/tools/projects/backgrounds.d.ts +80 -0
  136. package/dist/tools/projects/backgrounds.d.ts.map +1 -0
  137. package/dist/tools/projects/backgrounds.js +154 -0
  138. package/dist/tools/projects/backgrounds.js.map +1 -0
  139. package/dist/tools/projects/buckets.d.ts +147 -0
  140. package/dist/tools/projects/buckets.d.ts.map +1 -0
  141. package/dist/tools/projects/buckets.js +291 -0
  142. package/dist/tools/projects/buckets.js.map +1 -0
  143. package/dist/tools/projects/crud.d.ts +145 -0
  144. package/dist/tools/projects/crud.d.ts.map +1 -0
  145. package/dist/tools/projects/crud.js +425 -0
  146. package/dist/tools/projects/crud.js.map +1 -0
  147. package/dist/tools/projects/duplicate.d.ts +41 -0
  148. package/dist/tools/projects/duplicate.d.ts.map +1 -0
  149. package/dist/tools/projects/duplicate.js +49 -0
  150. package/dist/tools/projects/duplicate.js.map +1 -0
  151. package/dist/tools/projects/hierarchy.d.ts +77 -0
  152. package/dist/tools/projects/hierarchy.d.ts.map +1 -0
  153. package/dist/tools/projects/hierarchy.js +300 -0
  154. package/dist/tools/projects/hierarchy.js.map +1 -0
  155. package/dist/tools/projects/index.d.ts +34 -0
  156. package/dist/tools/projects/index.d.ts.map +1 -0
  157. package/dist/tools/projects/index.js +522 -0
  158. package/dist/tools/projects/index.js.map +1 -0
  159. package/dist/tools/projects/permission.d.ts +26 -0
  160. package/dist/tools/projects/permission.d.ts.map +1 -0
  161. package/dist/tools/projects/permission.js +53 -0
  162. package/dist/tools/projects/permission.js.map +1 -0
  163. package/dist/tools/projects/response-formatter.d.ts +54 -0
  164. package/dist/tools/projects/response-formatter.d.ts.map +1 -0
  165. package/dist/tools/projects/response-formatter.js +139 -0
  166. package/dist/tools/projects/response-formatter.js.map +1 -0
  167. package/dist/tools/projects/sharing-access.d.ts +165 -0
  168. package/dist/tools/projects/sharing-access.d.ts.map +1 -0
  169. package/dist/tools/projects/sharing-access.js +450 -0
  170. package/dist/tools/projects/sharing-access.js.map +1 -0
  171. package/dist/tools/projects/sharing.d.ts +105 -0
  172. package/dist/tools/projects/sharing.d.ts.map +1 -0
  173. package/dist/tools/projects/sharing.js +258 -0
  174. package/dist/tools/projects/sharing.js.map +1 -0
  175. package/dist/tools/projects/validation.d.ts +51 -0
  176. package/dist/tools/projects/validation.d.ts.map +1 -0
  177. package/dist/tools/projects/validation.js +160 -0
  178. package/dist/tools/projects/validation.js.map +1 -0
  179. package/dist/tools/projects/views.d.ts +161 -0
  180. package/dist/tools/projects/views.d.ts.map +1 -0
  181. package/dist/tools/projects/views.js +234 -0
  182. package/dist/tools/projects/views.js.map +1 -0
  183. package/dist/tools/projects.d.ts +20 -0
  184. package/dist/tools/projects.d.ts.map +1 -0
  185. package/dist/tools/projects.js +66 -0
  186. package/dist/tools/projects.js.map +1 -0
  187. package/dist/tools/reactions.d.ts +25 -0
  188. package/dist/tools/reactions.d.ts.map +1 -0
  189. package/dist/tools/reactions.js +108 -0
  190. package/dist/tools/reactions.js.map +1 -0
  191. package/dist/tools/subscriptions.d.ts +23 -0
  192. package/dist/tools/subscriptions.d.ts.map +1 -0
  193. package/dist/tools/subscriptions.js +111 -0
  194. package/dist/tools/subscriptions.js.map +1 -0
  195. package/dist/tools/task-assignees.d.ts +13 -0
  196. package/dist/tools/task-assignees.d.ts.map +1 -0
  197. package/dist/tools/task-assignees.js +74 -0
  198. package/dist/tools/task-assignees.js.map +1 -0
  199. package/dist/tools/task-bulk.d.ts +13 -0
  200. package/dist/tools/task-bulk.d.ts.map +1 -0
  201. package/dist/tools/task-bulk.js +117 -0
  202. package/dist/tools/task-bulk.js.map +1 -0
  203. package/dist/tools/task-comments.d.ts +12 -0
  204. package/dist/tools/task-comments.d.ts.map +1 -0
  205. package/dist/tools/task-comments.js +65 -0
  206. package/dist/tools/task-comments.js.map +1 -0
  207. package/dist/tools/task-crud.d.ts +13 -0
  208. package/dist/tools/task-crud.d.ts.map +1 -0
  209. package/dist/tools/task-crud.js +168 -0
  210. package/dist/tools/task-crud.js.map +1 -0
  211. package/dist/tools/task-labels.d.ts +13 -0
  212. package/dist/tools/task-labels.d.ts.map +1 -0
  213. package/dist/tools/task-labels.js +64 -0
  214. package/dist/tools/task-labels.js.map +1 -0
  215. package/dist/tools/task-relations.d.ts +13 -0
  216. package/dist/tools/task-relations.d.ts.map +1 -0
  217. package/dist/tools/task-relations.js +74 -0
  218. package/dist/tools/task-relations.js.map +1 -0
  219. package/dist/tools/task-reminders.d.ts +13 -0
  220. package/dist/tools/task-reminders.d.ts.map +1 -0
  221. package/dist/tools/task-reminders.js +69 -0
  222. package/dist/tools/task-reminders.js.map +1 -0
  223. package/dist/tools/tasks/assignees/AssigneeOperationsService.d.ts +63 -0
  224. package/dist/tools/tasks/assignees/AssigneeOperationsService.d.ts.map +1 -0
  225. package/dist/tools/tasks/assignees/AssigneeOperationsService.js +152 -0
  226. package/dist/tools/tasks/assignees/AssigneeOperationsService.js.map +1 -0
  227. package/dist/tools/tasks/assignees/AssigneeResponseFormatter.d.ts +28 -0
  228. package/dist/tools/tasks/assignees/AssigneeResponseFormatter.d.ts.map +1 -0
  229. package/dist/tools/tasks/assignees/AssigneeResponseFormatter.js +73 -0
  230. package/dist/tools/tasks/assignees/AssigneeResponseFormatter.js.map +1 -0
  231. package/dist/tools/tasks/assignees/AssigneeValidationService.d.ts +46 -0
  232. package/dist/tools/tasks/assignees/AssigneeValidationService.d.ts.map +1 -0
  233. package/dist/tools/tasks/assignees/AssigneeValidationService.js +70 -0
  234. package/dist/tools/tasks/assignees/AssigneeValidationService.js.map +1 -0
  235. package/dist/tools/tasks/assignees/index.d.ts +52 -0
  236. package/dist/tools/tasks/assignees/index.d.ts.map +1 -0
  237. package/dist/tools/tasks/assignees/index.js +103 -0
  238. package/dist/tools/tasks/assignees/index.js.map +1 -0
  239. package/dist/tools/tasks/attach.d.ts +39 -0
  240. package/dist/tools/tasks/attach.d.ts.map +1 -0
  241. package/dist/tools/tasks/attach.js +90 -0
  242. package/dist/tools/tasks/attach.js.map +1 -0
  243. package/dist/tools/tasks/attachments.d.ts +67 -0
  244. package/dist/tools/tasks/attachments.d.ts.map +1 -0
  245. package/dist/tools/tasks/attachments.js +153 -0
  246. package/dist/tools/tasks/attachments.js.map +1 -0
  247. package/dist/tools/tasks/buckets.d.ts +41 -0
  248. package/dist/tools/tasks/buckets.d.ts.map +1 -0
  249. package/dist/tools/tasks/buckets.js +75 -0
  250. package/dist/tools/tasks/buckets.js.map +1 -0
  251. package/dist/tools/tasks/bulk/BatchProcessorFactory.d.ts +30 -0
  252. package/dist/tools/tasks/bulk/BatchProcessorFactory.d.ts.map +1 -0
  253. package/dist/tools/tasks/bulk/BatchProcessorFactory.js +69 -0
  254. package/dist/tools/tasks/bulk/BatchProcessorFactory.js.map +1 -0
  255. package/dist/tools/tasks/bulk/BulkOperationErrorHandler.d.ts +50 -0
  256. package/dist/tools/tasks/bulk/BulkOperationErrorHandler.d.ts.map +1 -0
  257. package/dist/tools/tasks/bulk/BulkOperationErrorHandler.js +183 -0
  258. package/dist/tools/tasks/bulk/BulkOperationErrorHandler.js.map +1 -0
  259. package/dist/tools/tasks/bulk/BulkOperationProcessor.d.ts +101 -0
  260. package/dist/tools/tasks/bulk/BulkOperationProcessor.d.ts.map +1 -0
  261. package/dist/tools/tasks/bulk/BulkOperationProcessor.js +416 -0
  262. package/dist/tools/tasks/bulk/BulkOperationProcessor.js.map +1 -0
  263. package/dist/tools/tasks/bulk/BulkOperationTypes.d.ts +50 -0
  264. package/dist/tools/tasks/bulk/BulkOperationTypes.d.ts.map +1 -0
  265. package/dist/tools/tasks/bulk/BulkOperationTypes.js +6 -0
  266. package/dist/tools/tasks/bulk/BulkOperationTypes.js.map +1 -0
  267. package/dist/tools/tasks/bulk/BulkOperationValidator.d.ts +53 -0
  268. package/dist/tools/tasks/bulk/BulkOperationValidator.d.ts.map +1 -0
  269. package/dist/tools/tasks/bulk/BulkOperationValidator.js +216 -0
  270. package/dist/tools/tasks/bulk/BulkOperationValidator.js.map +1 -0
  271. package/dist/tools/tasks/bulk/index.d.ts +9 -0
  272. package/dist/tools/tasks/bulk/index.d.ts.map +1 -0
  273. package/dist/tools/tasks/bulk/index.js +15 -0
  274. package/dist/tools/tasks/bulk/index.js.map +1 -0
  275. package/dist/tools/tasks/bulk-operations-simplified.d.ts +62 -0
  276. package/dist/tools/tasks/bulk-operations-simplified.d.ts.map +1 -0
  277. package/dist/tools/tasks/bulk-operations-simplified.js +416 -0
  278. package/dist/tools/tasks/bulk-operations-simplified.js.map +1 -0
  279. package/dist/tools/tasks/bulk-operations.d.ts +8 -0
  280. package/dist/tools/tasks/bulk-operations.d.ts.map +1 -0
  281. package/dist/tools/tasks/bulk-operations.js +13 -0
  282. package/dist/tools/tasks/bulk-operations.js.map +1 -0
  283. package/dist/tools/tasks/by-index.d.ts +36 -0
  284. package/dist/tools/tasks/by-index.d.ts.map +1 -0
  285. package/dist/tools/tasks/by-index.js +52 -0
  286. package/dist/tools/tasks/by-index.js.map +1 -0
  287. package/dist/tools/tasks/comments/CommentOperationsService.d.ts +44 -0
  288. package/dist/tools/tasks/comments/CommentOperationsService.d.ts.map +1 -0
  289. package/dist/tools/tasks/comments/CommentOperationsService.js +86 -0
  290. package/dist/tools/tasks/comments/CommentOperationsService.js.map +1 -0
  291. package/dist/tools/tasks/comments/CommentResponseFormatter.d.ts +41 -0
  292. package/dist/tools/tasks/comments/CommentResponseFormatter.d.ts.map +1 -0
  293. package/dist/tools/tasks/comments/CommentResponseFormatter.js +114 -0
  294. package/dist/tools/tasks/comments/CommentResponseFormatter.js.map +1 -0
  295. package/dist/tools/tasks/comments/CommentValidationService.d.ts +62 -0
  296. package/dist/tools/tasks/comments/CommentValidationService.d.ts.map +1 -0
  297. package/dist/tools/tasks/comments/CommentValidationService.js +105 -0
  298. package/dist/tools/tasks/comments/CommentValidationService.js.map +1 -0
  299. package/dist/tools/tasks/comments/index.d.ts +66 -0
  300. package/dist/tools/tasks/comments/index.d.ts.map +1 -0
  301. package/dist/tools/tasks/comments/index.js +99 -0
  302. package/dist/tools/tasks/comments/index.js.map +1 -0
  303. package/dist/tools/tasks/constants.d.ts +19 -0
  304. package/dist/tools/tasks/constants.d.ts.map +1 -0
  305. package/dist/tools/tasks/constants.js +82 -0
  306. package/dist/tools/tasks/constants.js.map +1 -0
  307. package/dist/tools/tasks/crud/TaskCreationService.d.ts +29 -0
  308. package/dist/tools/tasks/crud/TaskCreationService.d.ts.map +1 -0
  309. package/dist/tools/tasks/crud/TaskCreationService.js +274 -0
  310. package/dist/tools/tasks/crud/TaskCreationService.js.map +1 -0
  311. package/dist/tools/tasks/crud/TaskDeletionService.d.ts +19 -0
  312. package/dist/tools/tasks/crud/TaskDeletionService.d.ts.map +1 -0
  313. package/dist/tools/tasks/crud/TaskDeletionService.js +96 -0
  314. package/dist/tools/tasks/crud/TaskDeletionService.js.map +1 -0
  315. package/dist/tools/tasks/crud/TaskReadService.d.ts +19 -0
  316. package/dist/tools/tasks/crud/TaskReadService.d.ts.map +1 -0
  317. package/dist/tools/tasks/crud/TaskReadService.js +66 -0
  318. package/dist/tools/tasks/crud/TaskReadService.js.map +1 -0
  319. package/dist/tools/tasks/crud/TaskResponseFormatter.d.ts +18 -0
  320. package/dist/tools/tasks/crud/TaskResponseFormatter.d.ts.map +1 -0
  321. package/dist/tools/tasks/crud/TaskResponseFormatter.js +248 -0
  322. package/dist/tools/tasks/crud/TaskResponseFormatter.js.map +1 -0
  323. package/dist/tools/tasks/crud/TaskUpdateService.d.ts +33 -0
  324. package/dist/tools/tasks/crud/TaskUpdateService.d.ts.map +1 -0
  325. package/dist/tools/tasks/crud/TaskUpdateService.js +294 -0
  326. package/dist/tools/tasks/crud/TaskUpdateService.js.map +1 -0
  327. package/dist/tools/tasks/crud/index.d.ts +17 -0
  328. package/dist/tools/tasks/crud/index.d.ts.map +1 -0
  329. package/dist/tools/tasks/crud/index.js +20 -0
  330. package/dist/tools/tasks/crud/index.js.map +1 -0
  331. package/dist/tools/tasks/duplicate.d.ts +28 -0
  332. package/dist/tools/tasks/duplicate.d.ts.map +1 -0
  333. package/dist/tools/tasks/duplicate.js +41 -0
  334. package/dist/tools/tasks/duplicate.js.map +1 -0
  335. package/dist/tools/tasks/filtering/FilterExecutor.d.ts +39 -0
  336. package/dist/tools/tasks/filtering/FilterExecutor.d.ts.map +1 -0
  337. package/dist/tools/tasks/filtering/FilterExecutor.js +214 -0
  338. package/dist/tools/tasks/filtering/FilterExecutor.js.map +1 -0
  339. package/dist/tools/tasks/filtering/FilterValidator.d.ts +59 -0
  340. package/dist/tools/tasks/filtering/FilterValidator.d.ts.map +1 -0
  341. package/dist/tools/tasks/filtering/FilterValidator.js +257 -0
  342. package/dist/tools/tasks/filtering/FilterValidator.js.map +1 -0
  343. package/dist/tools/tasks/filtering/TaskFilteringOrchestrator.d.ts +78 -0
  344. package/dist/tools/tasks/filtering/TaskFilteringOrchestrator.d.ts.map +1 -0
  345. package/dist/tools/tasks/filtering/TaskFilteringOrchestrator.js +195 -0
  346. package/dist/tools/tasks/filtering/TaskFilteringOrchestrator.js.map +1 -0
  347. package/dist/tools/tasks/filtering/evaluators.d.ts +41 -0
  348. package/dist/tools/tasks/filtering/evaluators.d.ts.map +1 -0
  349. package/dist/tools/tasks/filtering/evaluators.js +224 -0
  350. package/dist/tools/tasks/filtering/evaluators.js.map +1 -0
  351. package/dist/tools/tasks/filtering/index.d.ts +11 -0
  352. package/dist/tools/tasks/filtering/index.d.ts.map +1 -0
  353. package/dist/tools/tasks/filtering/index.js +26 -0
  354. package/dist/tools/tasks/filtering/index.js.map +1 -0
  355. package/dist/tools/tasks/index.d.ts +9 -0
  356. package/dist/tools/tasks/index.d.ts.map +1 -0
  357. package/dist/tools/tasks/index.js +337 -0
  358. package/dist/tools/tasks/index.js.map +1 -0
  359. package/dist/tools/tasks/labels.d.ts +49 -0
  360. package/dist/tools/tasks/labels.d.ts.map +1 -0
  361. package/dist/tools/tasks/labels.js +223 -0
  362. package/dist/tools/tasks/labels.js.map +1 -0
  363. package/dist/tools/tasks/mark-read.d.ts +27 -0
  364. package/dist/tools/tasks/mark-read.d.ts.map +1 -0
  365. package/dist/tools/tasks/mark-read.js +38 -0
  366. package/dist/tools/tasks/mark-read.js.map +1 -0
  367. package/dist/tools/tasks/position.d.ts +53 -0
  368. package/dist/tools/tasks/position.d.ts.map +1 -0
  369. package/dist/tools/tasks/position.js +83 -0
  370. package/dist/tools/tasks/position.js.map +1 -0
  371. package/dist/tools/tasks/reminders.d.ts +56 -0
  372. package/dist/tools/tasks/reminders.d.ts.map +1 -0
  373. package/dist/tools/tasks/reminders.js +213 -0
  374. package/dist/tools/tasks/reminders.js.map +1 -0
  375. package/dist/tools/tasks/subtasks.d.ts +85 -0
  376. package/dist/tools/tasks/subtasks.d.ts.map +1 -0
  377. package/dist/tools/tasks/subtasks.js +286 -0
  378. package/dist/tools/tasks/subtasks.js.map +1 -0
  379. package/dist/tools/tasks/types/filters.d.ts +136 -0
  380. package/dist/tools/tasks/types/filters.d.ts.map +1 -0
  381. package/dist/tools/tasks/types/filters.js +7 -0
  382. package/dist/tools/tasks/types/filters.js.map +1 -0
  383. package/dist/tools/tasks/validation.d.ts +47 -0
  384. package/dist/tools/tasks/validation.d.ts.map +1 -0
  385. package/dist/tools/tasks/validation.js +131 -0
  386. package/dist/tools/tasks/validation.js.map +1 -0
  387. package/dist/tools/tasks-relations.d.ts +25 -0
  388. package/dist/tools/tasks-relations.d.ts.map +1 -0
  389. package/dist/tools/tasks-relations.js +271 -0
  390. package/dist/tools/tasks-relations.js.map +1 -0
  391. package/dist/tools/tasks.d.ts +6 -0
  392. package/dist/tools/tasks.d.ts.map +1 -0
  393. package/dist/tools/tasks.js +10 -0
  394. package/dist/tools/tasks.js.map +1 -0
  395. package/dist/tools/teams.d.ts +9 -0
  396. package/dist/tools/teams.d.ts.map +1 -0
  397. package/dist/tools/teams.js +255 -0
  398. package/dist/tools/teams.js.map +1 -0
  399. package/dist/tools/templates.d.ts +9 -0
  400. package/dist/tools/templates.d.ts.map +1 -0
  401. package/dist/tools/templates.js +450 -0
  402. package/dist/tools/templates.js.map +1 -0
  403. package/dist/tools/tokens.d.ts +37 -0
  404. package/dist/tools/tokens.d.ts.map +1 -0
  405. package/dist/tools/tokens.js +122 -0
  406. package/dist/tools/tokens.js.map +1 -0
  407. package/dist/tools/user-deletion.d.ts +41 -0
  408. package/dist/tools/user-deletion.d.ts.map +1 -0
  409. package/dist/tools/user-deletion.js +126 -0
  410. package/dist/tools/user-deletion.js.map +1 -0
  411. package/dist/tools/users.d.ts +9 -0
  412. package/dist/tools/users.d.ts.map +1 -0
  413. package/dist/tools/users.js +418 -0
  414. package/dist/tools/users.js.map +1 -0
  415. package/dist/tools/webhooks.d.ts +31 -0
  416. package/dist/tools/webhooks.d.ts.map +1 -0
  417. package/dist/tools/webhooks.js +414 -0
  418. package/dist/tools/webhooks.js.map +1 -0
  419. package/dist/transforms/base.d.ts +204 -0
  420. package/dist/transforms/base.d.ts.map +1 -0
  421. package/dist/transforms/base.js +175 -0
  422. package/dist/transforms/base.js.map +1 -0
  423. package/dist/transforms/field-selector.d.ts +27 -0
  424. package/dist/transforms/field-selector.d.ts.map +1 -0
  425. package/dist/transforms/field-selector.js +91 -0
  426. package/dist/transforms/field-selector.js.map +1 -0
  427. package/dist/transforms/index.d.ts +15 -0
  428. package/dist/transforms/index.d.ts.map +1 -0
  429. package/dist/transforms/index.js +50 -0
  430. package/dist/transforms/index.js.map +1 -0
  431. package/dist/transforms/size-calculator.d.ts +131 -0
  432. package/dist/transforms/size-calculator.d.ts.map +1 -0
  433. package/dist/transforms/size-calculator.js +284 -0
  434. package/dist/transforms/size-calculator.js.map +1 -0
  435. package/dist/transforms/task.d.ts +207 -0
  436. package/dist/transforms/task.d.ts.map +1 -0
  437. package/dist/transforms/task.js +259 -0
  438. package/dist/transforms/task.js.map +1 -0
  439. package/dist/types/errors.d.ts +65 -0
  440. package/dist/types/errors.d.ts.map +1 -0
  441. package/dist/types/errors.js +44 -0
  442. package/dist/types/errors.js.map +1 -0
  443. package/dist/types/filters.d.ts +149 -0
  444. package/dist/types/filters.d.ts.map +1 -0
  445. package/dist/types/filters.js +26 -0
  446. package/dist/types/filters.js.map +1 -0
  447. package/dist/types/index.d.ts +147 -0
  448. package/dist/types/index.d.ts.map +1 -0
  449. package/dist/types/index.js +24 -0
  450. package/dist/types/index.js.map +1 -0
  451. package/dist/types/node-vikunja-extended.d.ts +36 -0
  452. package/dist/types/node-vikunja-extended.d.ts.map +1 -0
  453. package/dist/types/node-vikunja-extended.js +25 -0
  454. package/dist/types/node-vikunja-extended.js.map +1 -0
  455. package/dist/types/responses.d.ts +121 -0
  456. package/dist/types/responses.d.ts.map +1 -0
  457. package/dist/types/responses.js +26 -0
  458. package/dist/types/responses.js.map +1 -0
  459. package/dist/types/vikunja.d.ts +319 -0
  460. package/dist/types/vikunja.d.ts.map +1 -0
  461. package/dist/types/vikunja.js +7 -0
  462. package/dist/types/vikunja.js.map +1 -0
  463. package/dist/utils/auth-error-handler.d.ts +23 -0
  464. package/dist/utils/auth-error-handler.d.ts.map +1 -0
  465. package/dist/utils/auth-error-handler.js +162 -0
  466. package/dist/utils/auth-error-handler.js.map +1 -0
  467. package/dist/utils/composite-operation.d.ts +184 -0
  468. package/dist/utils/composite-operation.d.ts.map +1 -0
  469. package/dist/utils/composite-operation.js +293 -0
  470. package/dist/utils/composite-operation.js.map +1 -0
  471. package/dist/utils/error-handler.d.ts +39 -0
  472. package/dist/utils/error-handler.d.ts.map +1 -0
  473. package/dist/utils/error-handler.js +336 -0
  474. package/dist/utils/error-handler.js.map +1 -0
  475. package/dist/utils/filtering/ClientSideFilteringStrategy.d.ts +13 -0
  476. package/dist/utils/filtering/ClientSideFilteringStrategy.d.ts.map +1 -0
  477. package/dist/utils/filtering/ClientSideFilteringStrategy.js +129 -0
  478. package/dist/utils/filtering/ClientSideFilteringStrategy.js.map +1 -0
  479. package/dist/utils/filtering/FilteringContext.d.ts +40 -0
  480. package/dist/utils/filtering/FilteringContext.d.ts.map +1 -0
  481. package/dist/utils/filtering/FilteringContext.js +58 -0
  482. package/dist/utils/filtering/FilteringContext.js.map +1 -0
  483. package/dist/utils/filtering/HybridFilteringStrategy.d.ts +15 -0
  484. package/dist/utils/filtering/HybridFilteringStrategy.d.ts.map +1 -0
  485. package/dist/utils/filtering/HybridFilteringStrategy.js +55 -0
  486. package/dist/utils/filtering/HybridFilteringStrategy.js.map +1 -0
  487. package/dist/utils/filtering/RestCrossProjectFilteringStrategy.d.ts +42 -0
  488. package/dist/utils/filtering/RestCrossProjectFilteringStrategy.d.ts.map +1 -0
  489. package/dist/utils/filtering/RestCrossProjectFilteringStrategy.js +120 -0
  490. package/dist/utils/filtering/RestCrossProjectFilteringStrategy.js.map +1 -0
  491. package/dist/utils/filtering/ServerSideFilteringStrategy.d.ts +13 -0
  492. package/dist/utils/filtering/ServerSideFilteringStrategy.d.ts.map +1 -0
  493. package/dist/utils/filtering/ServerSideFilteringStrategy.js +88 -0
  494. package/dist/utils/filtering/ServerSideFilteringStrategy.js.map +1 -0
  495. package/dist/utils/filtering/TaskFilteringStrategy.d.ts +19 -0
  496. package/dist/utils/filtering/TaskFilteringStrategy.d.ts.map +1 -0
  497. package/dist/utils/filtering/TaskFilteringStrategy.js +10 -0
  498. package/dist/utils/filtering/TaskFilteringStrategy.js.map +1 -0
  499. package/dist/utils/filtering/index.d.ts +14 -0
  500. package/dist/utils/filtering/index.d.ts.map +1 -0
  501. package/dist/utils/filtering/index.js +22 -0
  502. package/dist/utils/filtering/index.js.map +1 -0
  503. package/dist/utils/filtering/types.d.ts +108 -0
  504. package/dist/utils/filtering/types.d.ts.map +1 -0
  505. package/dist/utils/filtering/types.js +6 -0
  506. package/dist/utils/filtering/types.js.map +1 -0
  507. package/dist/utils/filters.d.ts +70 -0
  508. package/dist/utils/filters.d.ts.map +1 -0
  509. package/dist/utils/filters.js +812 -0
  510. package/dist/utils/filters.js.map +1 -0
  511. package/dist/utils/http-error-detail.d.ts +28 -0
  512. package/dist/utils/http-error-detail.d.ts.map +1 -0
  513. package/dist/utils/http-error-detail.js +67 -0
  514. package/dist/utils/http-error-detail.js.map +1 -0
  515. package/dist/utils/label-bulk.d.ts +21 -0
  516. package/dist/utils/label-bulk.d.ts.map +1 -0
  517. package/dist/utils/label-bulk.js +51 -0
  518. package/dist/utils/label-bulk.js.map +1 -0
  519. package/dist/utils/logger.d.ts +20 -0
  520. package/dist/utils/logger.d.ts.map +1 -0
  521. package/dist/utils/logger.js +66 -0
  522. package/dist/utils/logger.js.map +1 -0
  523. package/dist/utils/memory.d.ts +73 -0
  524. package/dist/utils/memory.d.ts.map +1 -0
  525. package/dist/utils/memory.js +194 -0
  526. package/dist/utils/memory.js.map +1 -0
  527. package/dist/utils/performance/batch-processor.d.ts +77 -0
  528. package/dist/utils/performance/batch-processor.d.ts.map +1 -0
  529. package/dist/utils/performance/batch-processor.js +218 -0
  530. package/dist/utils/performance/batch-processor.js.map +1 -0
  531. package/dist/utils/performance/index.d.ts +42 -0
  532. package/dist/utils/performance/index.d.ts.map +1 -0
  533. package/dist/utils/performance/index.js +49 -0
  534. package/dist/utils/performance/index.js.map +1 -0
  535. package/dist/utils/performance/performance-monitor.d.ts +116 -0
  536. package/dist/utils/performance/performance-monitor.d.ts.map +1 -0
  537. package/dist/utils/performance/performance-monitor.js +307 -0
  538. package/dist/utils/performance/performance-monitor.js.map +1 -0
  539. package/dist/utils/read-only.d.ts +111 -0
  540. package/dist/utils/read-only.d.ts.map +1 -0
  541. package/dist/utils/read-only.js +503 -0
  542. package/dist/utils/read-only.js.map +1 -0
  543. package/dist/utils/response-factory.d.ts +81 -0
  544. package/dist/utils/response-factory.d.ts.map +1 -0
  545. package/dist/utils/response-factory.js +86 -0
  546. package/dist/utils/response-factory.js.map +1 -0
  547. package/dist/utils/retry.d.ts +160 -0
  548. package/dist/utils/retry.d.ts.map +1 -0
  549. package/dist/utils/retry.js +316 -0
  550. package/dist/utils/retry.js.map +1 -0
  551. package/dist/utils/security.d.ts +70 -0
  552. package/dist/utils/security.d.ts.map +1 -0
  553. package/dist/utils/security.js +358 -0
  554. package/dist/utils/security.js.map +1 -0
  555. package/dist/utils/simple-response.d.ts +75 -0
  556. package/dist/utils/simple-response.d.ts.map +1 -0
  557. package/dist/utils/simple-response.js +311 -0
  558. package/dist/utils/simple-response.js.map +1 -0
  559. package/dist/utils/storage-errors.d.ts +9 -0
  560. package/dist/utils/storage-errors.d.ts.map +1 -0
  561. package/dist/utils/storage-errors.js +20 -0
  562. package/dist/utils/storage-errors.js.map +1 -0
  563. package/dist/utils/task-rest-transport.d.ts +28 -0
  564. package/dist/utils/task-rest-transport.d.ts.map +1 -0
  565. package/dist/utils/task-rest-transport.js +33 -0
  566. package/dist/utils/task-rest-transport.js.map +1 -0
  567. package/dist/utils/unicode-fix.d.ts +19 -0
  568. package/dist/utils/unicode-fix.d.ts.map +1 -0
  569. package/dist/utils/unicode-fix.js +70 -0
  570. package/dist/utils/unicode-fix.js.map +1 -0
  571. package/dist/utils/validation.d.ts +75 -0
  572. package/dist/utils/validation.d.ts.map +1 -0
  573. package/dist/utils/validation.js +758 -0
  574. package/dist/utils/validation.js.map +1 -0
  575. package/dist/utils/vikunja-rest.d.ts +159 -0
  576. package/dist/utils/vikunja-rest.d.ts.map +1 -0
  577. package/dist/utils/vikunja-rest.js +378 -0
  578. package/dist/utils/vikunja-rest.js.map +1 -0
  579. package/docs/CONFIGURATION.md +957 -0
  580. package/docs/DOCKER-DESKTOP-MCP.md +207 -0
  581. package/docs/TOOLS.md +422 -0
  582. package/package.json +145 -0
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ /**
3
+ * Hybrid filtering strategy
4
+ *
5
+ * This strategy attempts server-side filtering first, and falls back to
6
+ * client-side filtering if server-side fails. This provides the best of
7
+ * both worlds: efficiency when possible, reliability always.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.HybridFilteringStrategy = void 0;
11
+ const ServerSideFilteringStrategy_1 = require("./ServerSideFilteringStrategy");
12
+ const ClientSideFilteringStrategy_1 = require("./ClientSideFilteringStrategy");
13
+ const logger_1 = require("../logger");
14
+ class HybridFilteringStrategy {
15
+ serverSideStrategy = new ServerSideFilteringStrategy_1.ServerSideFilteringStrategy();
16
+ clientSideStrategy = new ClientSideFilteringStrategy_1.ClientSideFilteringStrategy();
17
+ async execute(params) {
18
+ const { filterString } = params;
19
+ if (!filterString) {
20
+ // No filtering needed, use client-side strategy (which just loads tasks)
21
+ return this.clientSideStrategy.execute(params);
22
+ }
23
+ // Attempt server-side filtering first
24
+ try {
25
+ logger_1.logger.info('Hybrid filtering: attempting server-side filtering first', {
26
+ filter: filterString
27
+ });
28
+ const result = await this.serverSideStrategy.execute(params);
29
+ logger_1.logger.info('Hybrid filtering: server-side filtering succeeded', {
30
+ taskCount: result.tasks.length,
31
+ filter: filterString
32
+ });
33
+ return result;
34
+ }
35
+ catch (error) {
36
+ // Server-side filtering failed, fall back to client-side
37
+ logger_1.logger.warn('Hybrid filtering: server-side filtering failed, falling back to client-side', {
38
+ error: error instanceof Error ? error.message : String(error),
39
+ filter: filterString
40
+ });
41
+ const result = await this.clientSideStrategy.execute(params);
42
+ // Update metadata to reflect that server-side was attempted
43
+ return {
44
+ ...result,
45
+ metadata: {
46
+ ...result.metadata,
47
+ serverSideFilteringAttempted: true,
48
+ filteringNote: 'Server-side filtering failed, client-side filtering applied as fallback'
49
+ }
50
+ };
51
+ }
52
+ }
53
+ }
54
+ exports.HybridFilteringStrategy = HybridFilteringStrategy;
55
+ //# sourceMappingURL=HybridFilteringStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HybridFilteringStrategy.js","sourceRoot":"","sources":["../../../src/utils/filtering/HybridFilteringStrategy.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAIH,+EAA4E;AAC5E,+EAA4E;AAC5E,sCAAmC;AAEnC,MAAa,uBAAuB;IAC1B,kBAAkB,GAAG,IAAI,yDAA2B,EAAE,CAAC;IACvD,kBAAkB,GAAG,IAAI,yDAA2B,EAAE,CAAC;IAE/D,KAAK,CAAC,OAAO,CAAC,MAAuB;QACnC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;QAEhC,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,yEAAyE;YACzE,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC;QAED,sCAAsC;QACtC,IAAI,CAAC;YACH,eAAM,CAAC,IAAI,CAAC,0DAA0D,EAAE;gBACtE,MAAM,EAAE,YAAY;aACrB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAE7D,eAAM,CAAC,IAAI,CAAC,mDAAmD,EAAE;gBAC/D,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;gBAC9B,MAAM,EAAE,YAAY;aACrB,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;QAEhB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,yDAAyD;YACzD,eAAM,CAAC,IAAI,CAAC,6EAA6E,EAAE;gBACzF,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,MAAM,EAAE,YAAY;aACrB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAE7D,4DAA4D;YAC5D,OAAO;gBACL,GAAG,MAAM;gBACT,QAAQ,EAAE;oBACR,GAAG,MAAM,CAAC,QAAQ;oBAClB,4BAA4B,EAAE,IAAI;oBAClC,aAAa,EAAE,yEAAyE;iBACzF;aACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AA/CD,0DA+CC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * REST cross-project filtering strategy
3
+ *
4
+ * Vikunja documents a single-call `GET /tasks` endpoint for listing tasks
5
+ * across every project the user can access, with `page`, `per_page`, `s`,
6
+ * `sort_by`, `order_by`, `filter`, `filter_timezone`, `filter_include_nulls`
7
+ * and `expand` query params (see docs/vikunja-openapi.json). Neither
8
+ * the legacy client's `getAllTasks` (which calls the non-existent `GET
9
+ * /tasks/all`, confirmed to 400 "Invalid model provided" on real servers —
10
+ * see `ClientSideFilteringStrategy`) nor any other code path in this
11
+ * project ever called the real endpoint.
12
+ *
13
+ * This strategy calls `GET /tasks` directly via `vikunjaRestRequest` and is
14
+ * the PRIMARY strategy for cross-project ("all projects" or no `projectId`)
15
+ * listing — one call instead of an N+1 per-project aggregation. If the
16
+ * direct call fails for any reason (older server without the endpoint, the
17
+ * circuit breaker open, a transient network error surviving retries, etc.)
18
+ * it falls back to the existing per-project aggregation
19
+ * (`ClientSideFilteringStrategy`, which itself applies `filterExpression`
20
+ * client-side), kept as the documented fallback per
21
+ * docs/ENDPOINT-PLAYBOOK.md's hybrid pattern — the fallback matters if some
22
+ * server versions reject `GET /tasks`.
23
+ *
24
+ * Single-project listing is untouched by this strategy: it is only selected
25
+ * by `FilteringContext` when the listing is cross-project.
26
+ */
27
+ import type { TaskFilteringStrategy } from './TaskFilteringStrategy';
28
+ import type { FilteringArgs, FilteringParams, FilteringResult, TaskListApiParams } from './types';
29
+ /**
30
+ * Builds the `GET /tasks` query string from the shared API params plus the
31
+ * task-list-only extras (`order_by`, `filter_timezone`,
32
+ * `filter_include_nulls`, `expand`) — single-project listing
33
+ * (`ClientSideFilteringStrategy`/`ServerSideFilteringStrategy`) does not
34
+ * honor these, since they were never part of the legacy client's `GetTasksParams`
35
+ * shape that the pre-migration single-project call sites used (see
36
+ * docs/ENDPOINT-PLAYBOOK.md's direct-REST rule).
37
+ */
38
+ export declare function buildTasksListQuery(apiParams: TaskListApiParams, filterString: string | undefined, args: FilteringArgs): string;
39
+ export declare class RestCrossProjectFilteringStrategy implements TaskFilteringStrategy {
40
+ execute(params: FilteringParams): Promise<FilteringResult>;
41
+ }
42
+ //# sourceMappingURL=RestCrossProjectFilteringStrategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RestCrossProjectFilteringStrategy.d.ts","sourceRoot":"","sources":["../../../src/utils/filtering/RestCrossProjectFilteringStrategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAe,MAAM,SAAS,CAAC;AAM/G;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,iBAAiB,EAC5B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,IAAI,EAAE,aAAa,GAClB,MAAM,CAkBR;AAED,qBAAa,iCAAkC,YAAW,qBAAqB;IACvE,OAAO,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;CA6DjE"}
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ /**
3
+ * REST cross-project filtering strategy
4
+ *
5
+ * Vikunja documents a single-call `GET /tasks` endpoint for listing tasks
6
+ * across every project the user can access, with `page`, `per_page`, `s`,
7
+ * `sort_by`, `order_by`, `filter`, `filter_timezone`, `filter_include_nulls`
8
+ * and `expand` query params (see docs/vikunja-openapi.json). Neither
9
+ * the legacy client's `getAllTasks` (which calls the non-existent `GET
10
+ * /tasks/all`, confirmed to 400 "Invalid model provided" on real servers —
11
+ * see `ClientSideFilteringStrategy`) nor any other code path in this
12
+ * project ever called the real endpoint.
13
+ *
14
+ * This strategy calls `GET /tasks` directly via `vikunjaRestRequest` and is
15
+ * the PRIMARY strategy for cross-project ("all projects" or no `projectId`)
16
+ * listing — one call instead of an N+1 per-project aggregation. If the
17
+ * direct call fails for any reason (older server without the endpoint, the
18
+ * circuit breaker open, a transient network error surviving retries, etc.)
19
+ * it falls back to the existing per-project aggregation
20
+ * (`ClientSideFilteringStrategy`, which itself applies `filterExpression`
21
+ * client-side), kept as the documented fallback per
22
+ * docs/ENDPOINT-PLAYBOOK.md's hybrid pattern — the fallback matters if some
23
+ * server versions reject `GET /tasks`.
24
+ *
25
+ * Single-project listing is untouched by this strategy: it is only selected
26
+ * by `FilteringContext` when the listing is cross-project.
27
+ */
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.RestCrossProjectFilteringStrategy = void 0;
30
+ exports.buildTasksListQuery = buildTasksListQuery;
31
+ const ClientSideFilteringStrategy_1 = require("./ClientSideFilteringStrategy");
32
+ const vikunja_rest_1 = require("../vikunja-rest");
33
+ const types_1 = require("../../types");
34
+ const logger_1 = require("../logger");
35
+ /**
36
+ * Builds the `GET /tasks` query string from the shared API params plus the
37
+ * task-list-only extras (`order_by`, `filter_timezone`,
38
+ * `filter_include_nulls`, `expand`) — single-project listing
39
+ * (`ClientSideFilteringStrategy`/`ServerSideFilteringStrategy`) does not
40
+ * honor these, since they were never part of the legacy client's `GetTasksParams`
41
+ * shape that the pre-migration single-project call sites used (see
42
+ * docs/ENDPOINT-PLAYBOOK.md's direct-REST rule).
43
+ */
44
+ function buildTasksListQuery(apiParams, filterString, args) {
45
+ const query = new URLSearchParams();
46
+ if (apiParams.page !== undefined)
47
+ query.set('page', String(apiParams.page));
48
+ if (apiParams.per_page !== undefined)
49
+ query.set('per_page', String(apiParams.per_page));
50
+ if (apiParams.s !== undefined)
51
+ query.set('s', String(apiParams.s));
52
+ if (apiParams.sort_by !== undefined)
53
+ query.set('sort_by', String(apiParams.sort_by));
54
+ if (filterString)
55
+ query.set('filter', filterString);
56
+ if (args.orderBy)
57
+ query.set('order_by', args.orderBy);
58
+ if (args.filterTimezone)
59
+ query.set('filter_timezone', args.filterTimezone);
60
+ if (args.filterIncludeNulls !== undefined) {
61
+ query.set('filter_include_nulls', args.filterIncludeNulls ? 'true' : 'false');
62
+ }
63
+ if (args.expand && args.expand.length > 0) {
64
+ for (const value of args.expand) {
65
+ query.append('expand', value);
66
+ }
67
+ }
68
+ return query.toString();
69
+ }
70
+ class RestCrossProjectFilteringStrategy {
71
+ async execute(params) {
72
+ const { authManager, filterString, args, params: apiParams } = params;
73
+ if (!authManager) {
74
+ // Programmer error: FilteringContext must only select this strategy
75
+ // when an authManager was threaded through from the tool handler.
76
+ throw new types_1.MCPError(types_1.ErrorCode.INTERNAL_ERROR, 'RestCrossProjectFilteringStrategy requires an authManager');
77
+ }
78
+ const query = buildTasksListQuery(apiParams, filterString, args);
79
+ const path = `/tasks${query ? `?${query}` : ''}`;
80
+ try {
81
+ logger_1.logger.info('Attempting cross-project task listing via direct REST GET /tasks', {
82
+ filter: filterString,
83
+ path,
84
+ });
85
+ const tasks = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', path);
86
+ const safeTasks = Array.isArray(tasks) ? tasks : [];
87
+ logger_1.logger.info('Direct REST GET /tasks succeeded for cross-project listing', {
88
+ taskCount: safeTasks.length,
89
+ });
90
+ return {
91
+ tasks: safeTasks,
92
+ metadata: {
93
+ serverSideFilteringUsed: Boolean(filterString),
94
+ serverSideFilteringAttempted: true,
95
+ clientSideFiltering: false,
96
+ filteringNote: filterString
97
+ ? 'Server-side filtering used via direct REST GET /tasks'
98
+ : 'Cross-project listing via direct REST GET /tasks (single call, no per-project aggregation)',
99
+ },
100
+ };
101
+ }
102
+ catch (error) {
103
+ logger_1.logger.warn('Direct REST GET /tasks failed for cross-project listing, falling back to per-project aggregation', {
104
+ error: error instanceof Error ? error.message : String(error),
105
+ filter: filterString,
106
+ });
107
+ const fallbackResult = await new ClientSideFilteringStrategy_1.ClientSideFilteringStrategy().execute(params);
108
+ return {
109
+ ...fallbackResult,
110
+ metadata: {
111
+ ...fallbackResult.metadata,
112
+ serverSideFilteringAttempted: true,
113
+ filteringNote: 'Direct REST GET /tasks failed; used per-project aggregation fallback',
114
+ },
115
+ };
116
+ }
117
+ }
118
+ }
119
+ exports.RestCrossProjectFilteringStrategy = RestCrossProjectFilteringStrategy;
120
+ //# sourceMappingURL=RestCrossProjectFilteringStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RestCrossProjectFilteringStrategy.js","sourceRoot":"","sources":["../../../src/utils/filtering/RestCrossProjectFilteringStrategy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Server-side filtering strategy
3
+ *
4
+ * This strategy attempts to use Vikunja's server-side filtering capabilities
5
+ * by passing filter parameters directly to the API. This is the most efficient
6
+ * approach when the server supports advanced filtering.
7
+ */
8
+ import type { TaskFilteringStrategy } from './TaskFilteringStrategy';
9
+ import type { FilteringParams, FilteringResult } from './types';
10
+ export declare class ServerSideFilteringStrategy implements TaskFilteringStrategy {
11
+ execute(params: FilteringParams): Promise<FilteringResult>;
12
+ }
13
+ //# sourceMappingURL=ServerSideFilteringStrategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerSideFilteringStrategy.d.ts","sourceRoot":"","sources":["../../../src/utils/filtering/ServerSideFilteringStrategy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAe,MAAM,SAAS,CAAC;AAO7E,qBAAa,2BAA4B,YAAW,qBAAqB;IACjE,OAAO,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;CAkFjE"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ /**
3
+ * Server-side filtering strategy
4
+ *
5
+ * This strategy attempts to use Vikunja's server-side filtering capabilities
6
+ * by passing filter parameters directly to the API. This is the most efficient
7
+ * approach when the server supports advanced filtering.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.ServerSideFilteringStrategy = void 0;
11
+ const vikunja_rest_1 = require("../vikunja-rest");
12
+ const validation_1 = require("../../tools/tasks/validation");
13
+ const logger_1 = require("../logger");
14
+ const types_1 = require("../../types");
15
+ const RestCrossProjectFilteringStrategy_1 = require("./RestCrossProjectFilteringStrategy");
16
+ class ServerSideFilteringStrategy {
17
+ async execute(params) {
18
+ const { args, filterString, params: apiParams, authManager } = params;
19
+ if (!filterString) {
20
+ throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'Server-side filtering requires a filter string');
21
+ }
22
+ if (!authManager) {
23
+ // Programmer error: FilteringContext must only select this strategy
24
+ // (via HybridFilteringStrategy) when an authManager was threaded
25
+ // through from the tool handler.
26
+ throw new types_1.MCPError(types_1.ErrorCode.INTERNAL_ERROR, 'ServerSideFilteringStrategy requires an authManager');
27
+ }
28
+ const query = (0, RestCrossProjectFilteringStrategy_1.buildTasksListQuery)(apiParams, filterString, {});
29
+ const singleProject = args.projectId !== undefined && !args.allProjects;
30
+ logger_1.logger.info('Attempting server-side filtering', {
31
+ filter: filterString,
32
+ endpoint: singleProject ? 'getProjectTasks' : 'getAllTasks'
33
+ });
34
+ let tasks;
35
+ try {
36
+ if (singleProject && args.projectId !== undefined) {
37
+ // Validate project ID
38
+ (0, validation_1.validateId)(args.projectId, 'projectId');
39
+ // Get tasks for specific project with server-side filter. Calls the
40
+ // same `GET /projects/{id}/tasks` path the legacy client's
41
+ // `getProjectTasks` used pre-migration — a literal call-site
42
+ // migration, not an endpoint redesign (see
43
+ // ClientSideFilteringStrategy's `fetchProjectTasks` doc comment for
44
+ // why the spec's `get?: never` at this path doesn't block reusing it
45
+ // here).
46
+ const path = `/projects/${args.projectId}/tasks${query ? `?${query}` : ''}`;
47
+ tasks = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', path);
48
+ }
49
+ else {
50
+ // Get all tasks across all projects with server-side filter. Calls
51
+ // the same (non-existent, confirmed 400 "Invalid model provided" on
52
+ // real servers) `GET /tasks/all` path the legacy client's `getAllTasks`
53
+ // used pre-migration. This branch is unreachable in production —
54
+ // `FilteringContext` always routes cross-project listings through
55
+ // `RestCrossProjectFilteringStrategy` (real `GET /tasks`) before
56
+ // this strategy is ever selected — but the literal call-site
57
+ // migration is preserved rather than silently redirected to a
58
+ // different, working endpoint, per this item's byte-compatible
59
+ // refactor-not-redesign scope.
60
+ const path = `/tasks/all${query ? `?${query}` : ''}`;
61
+ tasks = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', path);
62
+ }
63
+ logger_1.logger.info('Server-side filtering completed successfully', {
64
+ taskCount: tasks?.length || 0,
65
+ filter: filterString
66
+ });
67
+ return {
68
+ tasks: tasks || [],
69
+ metadata: {
70
+ serverSideFilteringUsed: true,
71
+ serverSideFilteringAttempted: true,
72
+ clientSideFiltering: false,
73
+ filteringNote: 'Server-side filtering used (modern Vikunja)'
74
+ }
75
+ };
76
+ }
77
+ catch (error) {
78
+ logger_1.logger.error('Server-side filtering failed', {
79
+ error: error instanceof Error ? error.message : String(error),
80
+ filter: filterString
81
+ });
82
+ // Re-throw the error to be handled by the calling code
83
+ throw error;
84
+ }
85
+ }
86
+ }
87
+ exports.ServerSideFilteringStrategy = ServerSideFilteringStrategy;
88
+ //# sourceMappingURL=ServerSideFilteringStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerSideFilteringStrategy.js","sourceRoot":"","sources":["../../../src/utils/filtering/ServerSideFilteringStrategy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Base interface for task filtering strategies
3
+ *
4
+ * This interface defines the contract that all filtering strategies must implement.
5
+ * It follows the Strategy pattern to encapsulate different filtering approaches
6
+ * while maintaining a consistent interface.
7
+ */
8
+ import type { FilteringParams, FilteringResult } from './types';
9
+ export interface TaskFilteringStrategy {
10
+ /**
11
+ * Execute the filtering strategy
12
+ *
13
+ * @param params - The filtering parameters including args, expressions, and API params
14
+ * @returns Promise resolving to the filtering result with tasks and metadata
15
+ * @throws MCPError for validation or API errors
16
+ */
17
+ execute(params: FilteringParams): Promise<FilteringResult>;
18
+ }
19
+ //# sourceMappingURL=TaskFilteringStrategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TaskFilteringStrategy.d.ts","sourceRoot":"","sources":["../../../src/utils/filtering/TaskFilteringStrategy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAEhE,MAAM,WAAW,qBAAqB;IACpC;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC5D"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ /**
3
+ * Base interface for task filtering strategies
4
+ *
5
+ * This interface defines the contract that all filtering strategies must implement.
6
+ * It follows the Strategy pattern to encapsulate different filtering approaches
7
+ * while maintaining a consistent interface.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ //# sourceMappingURL=TaskFilteringStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TaskFilteringStrategy.js","sourceRoot":"","sources":["../../../src/utils/filtering/TaskFilteringStrategy.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Filtering strategy pattern exports
3
+ *
4
+ * This module provides a clean interface for the filtering strategy pattern
5
+ * implementation, allowing easy import of all necessary components.
6
+ */
7
+ export type { TaskFilteringStrategy } from './TaskFilteringStrategy';
8
+ export { ServerSideFilteringStrategy } from './ServerSideFilteringStrategy';
9
+ export { ClientSideFilteringStrategy } from './ClientSideFilteringStrategy';
10
+ export { HybridFilteringStrategy } from './HybridFilteringStrategy';
11
+ export { RestCrossProjectFilteringStrategy } from './RestCrossProjectFilteringStrategy';
12
+ export { FilteringContext } from './FilteringContext';
13
+ export type { FilteringArgs, FilteringParams, FilteringMetadata, FilteringResult, StrategyConfig } from './types';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/filtering/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAGrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AAGxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,YAAY,EACV,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,cAAc,EACf,MAAM,SAAS,CAAC"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ /**
3
+ * Filtering strategy pattern exports
4
+ *
5
+ * This module provides a clean interface for the filtering strategy pattern
6
+ * implementation, allowing easy import of all necessary components.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.FilteringContext = exports.RestCrossProjectFilteringStrategy = exports.HybridFilteringStrategy = exports.ClientSideFilteringStrategy = exports.ServerSideFilteringStrategy = void 0;
10
+ // Strategy implementations
11
+ var ServerSideFilteringStrategy_1 = require("./ServerSideFilteringStrategy");
12
+ Object.defineProperty(exports, "ServerSideFilteringStrategy", { enumerable: true, get: function () { return ServerSideFilteringStrategy_1.ServerSideFilteringStrategy; } });
13
+ var ClientSideFilteringStrategy_1 = require("./ClientSideFilteringStrategy");
14
+ Object.defineProperty(exports, "ClientSideFilteringStrategy", { enumerable: true, get: function () { return ClientSideFilteringStrategy_1.ClientSideFilteringStrategy; } });
15
+ var HybridFilteringStrategy_1 = require("./HybridFilteringStrategy");
16
+ Object.defineProperty(exports, "HybridFilteringStrategy", { enumerable: true, get: function () { return HybridFilteringStrategy_1.HybridFilteringStrategy; } });
17
+ var RestCrossProjectFilteringStrategy_1 = require("./RestCrossProjectFilteringStrategy");
18
+ Object.defineProperty(exports, "RestCrossProjectFilteringStrategy", { enumerable: true, get: function () { return RestCrossProjectFilteringStrategy_1.RestCrossProjectFilteringStrategy; } });
19
+ // Context for strategy selection
20
+ var FilteringContext_1 = require("./FilteringContext");
21
+ Object.defineProperty(exports, "FilteringContext", { enumerable: true, get: function () { return FilteringContext_1.FilteringContext; } });
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/filtering/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAKH,2BAA2B;AAC3B,6EAA4E;AAAnE,0IAAA,2BAA2B,OAAA;AACpC,6EAA4E;AAAnE,0IAAA,2BAA2B,OAAA;AACpC,qEAAoE;AAA3D,kIAAA,uBAAuB,OAAA;AAChC,yFAAwF;AAA/E,sJAAA,iCAAiC,OAAA;AAE1C,iCAAiC;AACjC,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Type definitions for the filtering strategy pattern
3
+ */
4
+ import type { FilterExpression } from '../../types/filters';
5
+ import type { AuthManager } from '../../auth/AuthManager';
6
+ import type { components } from '../../types/generated/vikunja-openapi';
7
+ /** `models.Task` per the OpenAPI spec. */
8
+ export type VikunjaTask = components['schemas']['models.Task'];
9
+ /**
10
+ * Query params shared by the task-listing endpoints (page/per_page/s/sort_by
11
+ * plus the server-side `filter` string). Mirrors the legacy client's
12
+ * `GetTasksParams` shape without depending on the (EOL) legacy client package.
13
+ */
14
+ export interface TaskListApiParams {
15
+ page?: number;
16
+ per_page?: number;
17
+ s?: string;
18
+ sort_by?: string;
19
+ filter?: string;
20
+ }
21
+ /**
22
+ * Arguments for filtering operations
23
+ */
24
+ export interface FilteringArgs {
25
+ projectId?: number;
26
+ page?: number;
27
+ perPage?: number;
28
+ search?: string;
29
+ sort?: string;
30
+ filter?: string;
31
+ filterId?: string;
32
+ allProjects?: boolean;
33
+ done?: boolean;
34
+ /**
35
+ * The documented GET /tasks `order_by` param ('asc' | 'desc', paired with
36
+ * `sort_by`). Only honored by `RestCrossProjectFilteringStrategy` —
37
+ * single-project listing (`ClientSideFilteringStrategy`/
38
+ * `ServerSideFilteringStrategy`) never supported this param even
39
+ * pre-migration, so it stays REST-cross-project-only to preserve exact
40
+ * behavior.
41
+ */
42
+ orderBy?: 'asc' | 'desc';
43
+ /** GET /tasks `filter_timezone` param. Same REST-only scope as `orderBy`. */
44
+ filterTimezone?: string;
45
+ /** GET /tasks `filter_include_nulls` param. Same REST-only scope as `orderBy`. */
46
+ filterIncludeNulls?: boolean;
47
+ /** GET /tasks `expand` param (repeatable). Same REST-only scope as `orderBy`. */
48
+ expand?: string[];
49
+ }
50
+ /**
51
+ * Parameters passed to filtering strategies
52
+ */
53
+ export interface FilteringParams {
54
+ args: FilteringArgs;
55
+ filterExpression: FilterExpression | null;
56
+ filterString: string | undefined;
57
+ params: TaskListApiParams;
58
+ /**
59
+ * Active auth manager, required by strategies that call the direct-REST
60
+ * helper (`RestCrossProjectFilteringStrategy`). Kept as its own field
61
+ * rather than folded into `args` so that logging/debugging code that logs
62
+ * `args` wholesale never accidentally serializes session credentials.
63
+ */
64
+ authManager?: AuthManager;
65
+ }
66
+ /**
67
+ * Metadata about the filtering operation performed
68
+ */
69
+ export interface FilteringMetadata {
70
+ serverSideFilteringUsed: boolean;
71
+ serverSideFilteringAttempted: boolean;
72
+ clientSideFiltering: boolean;
73
+ filteringNote: string;
74
+ }
75
+ /**
76
+ * Result of a filtering operation
77
+ */
78
+ export interface FilteringResult {
79
+ tasks: VikunjaTask[];
80
+ metadata: FilteringMetadata;
81
+ }
82
+ /**
83
+ * Configuration for strategy selection
84
+ */
85
+ export interface StrategyConfig {
86
+ enableServerSide: boolean;
87
+ /**
88
+ * True when the listing spans every accessible project (no `projectId`,
89
+ * or `allProjects: true`). Cross-project listing always routes through
90
+ * `RestCrossProjectFilteringStrategy` (direct REST GET /tasks, falling
91
+ * back to per-project aggregation), regardless of `enableServerSide` —
92
+ * the documented single-call endpoint is strictly better than the N+1
93
+ * aggregation whether or not a filter is present.
94
+ */
95
+ crossProject?: boolean;
96
+ }
97
+ /**
98
+ * Task filtering strategy interface
99
+ */
100
+ export interface TaskFilteringStrategy {
101
+ /**
102
+ * Execute the filtering strategy
103
+ * @param params - Filtering parameters
104
+ * @returns Promise resolving to filtering result
105
+ */
106
+ execute(params: FilteringParams): Promise<FilteringResult>;
107
+ }
108
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/utils/filtering/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAExE,0CAA0C;AAC1C,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,CAAC;AAE/D;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,aAAa,CAAC;IACpB,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC1C,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,MAAM,EAAE,iBAAiB,CAAC;IAC1B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,uBAAuB,EAAE,OAAO,CAAC;IACjC,4BAA4B,EAAE,OAAO,CAAC;IACtC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,OAAO,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC5D"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Type definitions for the filtering strategy pattern
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/utils/filtering/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Zod-based filter validation and parsing system
3
+ * Replaces the complex custom tokenizer/parser with secure Zod schemas
4
+ */
5
+ import type { FilterCondition, FilterExpression, FilterField, FilterGroup, FilterOperator, FilterValidationResult, FilterValidationConfig, LogicalOperator, ParseResult } from '../types/filters';
6
+ /**
7
+ * Security validation functions
8
+ */
9
+ export declare const SecurityValidator: {
10
+ /**
11
+ * Validates input string contains only allowed characters
12
+ */
13
+ validateAllowedChars(input: string): boolean;
14
+ /**
15
+ * Validates filter string length
16
+ */
17
+ validateLength(input: string): {
18
+ isValid: boolean;
19
+ error?: string;
20
+ };
21
+ /**
22
+ * Validates individual value length and safety
23
+ */
24
+ validateValue(value: string): {
25
+ isValid: boolean;
26
+ error?: string;
27
+ };
28
+ };
29
+ /**
30
+ * Main filter string parsing function
31
+ * Replaces the complex tokenizer/parser system with Zod validation
32
+ */
33
+ export declare function parseFilterString(filterStr: string): ParseResult;
34
+ /**
35
+ * Validate a filter condition using enhanced validation
36
+ */
37
+ export declare function validateCondition(condition: FilterCondition): string[];
38
+ /**
39
+ * Validate filter expression using Zod
40
+ */
41
+ export declare function validateFilterExpression(expression: FilterExpression, config?: FilterValidationConfig): FilterValidationResult;
42
+ /**
43
+ * Convert condition to string representation
44
+ */
45
+ export declare function conditionToString(condition: FilterCondition): string;
46
+ /**
47
+ * Convert group to string representation
48
+ */
49
+ export declare function groupToString(group: FilterGroup): string;
50
+ /**
51
+ * Convert expression to string representation
52
+ */
53
+ export declare function expressionToString(expression: FilterExpression): string;
54
+ /**
55
+ * Filter builder class for fluent construction
56
+ */
57
+ export declare class FilterBuilder {
58
+ private expression;
59
+ private currentGroup;
60
+ constructor();
61
+ where(field: FilterField, operator: FilterOperator, value: unknown): FilterBuilder;
62
+ and(): FilterBuilder;
63
+ or(): FilterBuilder;
64
+ group(operator?: LogicalOperator): FilterBuilder;
65
+ groupOperator(operator: LogicalOperator): FilterBuilder;
66
+ build(): FilterExpression;
67
+ toString(): string;
68
+ validate(config?: FilterValidationConfig): FilterValidationResult;
69
+ }
70
+ //# sourceMappingURL=filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/utils/filters.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,WAAW,EAEZ,MAAM,kBAAkB,CAAC;AA+E1B;;GAEG;AACH,eAAO,MAAM,iBAAiB;IAC5B;;OAEG;gCACyB,MAAM,GAAG,OAAO;IAI5C;;OAEG;0BACmB,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAUnE;;OAEG;yBACkB,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;CASnE,CAAC;AA8XF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAgHhE;AAmHD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,eAAe,GAAG,MAAM,EAAE,CAoBtE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,gBAAgB,EAC5B,MAAM,GAAE,sBAA2B,GAClC,sBAAsB,CAiDxB;AAwBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,eAAe,GAAG,MAAM,CAoBpE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAKxD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,CAIvE;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,YAAY,CAAc;;IAYlC,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,GAAG,aAAa;IASlF,GAAG,IAAI,aAAa;IAKpB,EAAE,IAAI,aAAa;IAKnB,KAAK,CAAC,QAAQ,GAAE,eAAsB,GAAG,aAAa;IAStD,aAAa,CAAC,QAAQ,EAAE,eAAe,GAAG,aAAa;IAKvD,KAAK,IAAI,gBAAgB;IAKzB,QAAQ,IAAI,MAAM;IAIlB,QAAQ,CAAC,MAAM,CAAC,EAAE,sBAAsB,GAAG,sBAAsB;CAGlE"}