@langadventurellc/task-trellis-mcp 0.1.0-rc.3

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 (343) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +81 -0
  3. package/dist/configuration/ServerConfig.d.ts +8 -0
  4. package/dist/configuration/ServerConfig.d.ts.map +1 -0
  5. package/dist/configuration/ServerConfig.js +3 -0
  6. package/dist/configuration/ServerConfig.js.map +1 -0
  7. package/dist/configuration/index.d.ts +2 -0
  8. package/dist/configuration/index.d.ts.map +1 -0
  9. package/dist/configuration/index.js +18 -0
  10. package/dist/configuration/index.js.map +1 -0
  11. package/dist/models/TrellisObject.d.ts +18 -0
  12. package/dist/models/TrellisObject.d.ts.map +1 -0
  13. package/dist/models/TrellisObject.js +3 -0
  14. package/dist/models/TrellisObject.js.map +1 -0
  15. package/dist/models/TrellisObjectPriority.d.ts +6 -0
  16. package/dist/models/TrellisObjectPriority.d.ts.map +1 -0
  17. package/dist/models/TrellisObjectPriority.js +10 -0
  18. package/dist/models/TrellisObjectPriority.js.map +1 -0
  19. package/dist/models/TrellisObjectStatus.d.ts +8 -0
  20. package/dist/models/TrellisObjectStatus.d.ts.map +1 -0
  21. package/dist/models/TrellisObjectStatus.js +12 -0
  22. package/dist/models/TrellisObjectStatus.js.map +1 -0
  23. package/dist/models/TrellisObjectType.d.ts +7 -0
  24. package/dist/models/TrellisObjectType.d.ts.map +1 -0
  25. package/dist/models/TrellisObjectType.js +11 -0
  26. package/dist/models/TrellisObjectType.js.map +1 -0
  27. package/dist/models/__tests__/isClaimable.test.d.ts +2 -0
  28. package/dist/models/__tests__/isClaimable.test.d.ts.map +1 -0
  29. package/dist/models/__tests__/isClaimable.test.js +101 -0
  30. package/dist/models/__tests__/isClaimable.test.js.map +1 -0
  31. package/dist/models/__tests__/isClosed.test.d.ts +2 -0
  32. package/dist/models/__tests__/isClosed.test.d.ts.map +1 -0
  33. package/dist/models/__tests__/isClosed.test.js +84 -0
  34. package/dist/models/__tests__/isClosed.test.js.map +1 -0
  35. package/dist/models/__tests__/isOpen.test.d.ts +2 -0
  36. package/dist/models/__tests__/isOpen.test.d.ts.map +1 -0
  37. package/dist/models/__tests__/isOpen.test.js +84 -0
  38. package/dist/models/__tests__/isOpen.test.js.map +1 -0
  39. package/dist/models/index.d.ts +8 -0
  40. package/dist/models/index.d.ts.map +1 -0
  41. package/dist/models/index.js +16 -0
  42. package/dist/models/index.js.map +1 -0
  43. package/dist/models/isClaimable.d.ts +10 -0
  44. package/dist/models/isClaimable.d.ts.map +1 -0
  45. package/dist/models/isClaimable.js +16 -0
  46. package/dist/models/isClaimable.js.map +1 -0
  47. package/dist/models/isClosed.d.ts +10 -0
  48. package/dist/models/isClosed.d.ts.map +1 -0
  49. package/dist/models/isClosed.js +16 -0
  50. package/dist/models/isClosed.js.map +1 -0
  51. package/dist/models/isOpen.d.ts +10 -0
  52. package/dist/models/isOpen.d.ts.map +1 -0
  53. package/dist/models/isOpen.js +16 -0
  54. package/dist/models/isOpen.js.map +1 -0
  55. package/dist/repositories/Repository.d.ts +8 -0
  56. package/dist/repositories/Repository.d.ts.map +1 -0
  57. package/dist/repositories/Repository.js +3 -0
  58. package/dist/repositories/Repository.js.map +1 -0
  59. package/dist/repositories/index.d.ts +3 -0
  60. package/dist/repositories/index.d.ts.map +1 -0
  61. package/dist/repositories/index.js +19 -0
  62. package/dist/repositories/index.js.map +1 -0
  63. package/dist/repositories/local/LocalRepository.d.ts +21 -0
  64. package/dist/repositories/local/LocalRepository.d.ts.map +1 -0
  65. package/dist/repositories/local/LocalRepository.js +75 -0
  66. package/dist/repositories/local/LocalRepository.js.map +1 -0
  67. package/dist/repositories/local/__tests__/deleteObjectById.test.d.ts +2 -0
  68. package/dist/repositories/local/__tests__/deleteObjectById.test.d.ts.map +1 -0
  69. package/dist/repositories/local/__tests__/deleteObjectById.test.js +228 -0
  70. package/dist/repositories/local/__tests__/deleteObjectById.test.js.map +1 -0
  71. package/dist/repositories/local/__tests__/extractMarkdownIds.test.d.ts +2 -0
  72. package/dist/repositories/local/__tests__/extractMarkdownIds.test.d.ts.map +1 -0
  73. package/dist/repositories/local/__tests__/extractMarkdownIds.test.js +135 -0
  74. package/dist/repositories/local/__tests__/extractMarkdownIds.test.js.map +1 -0
  75. package/dist/repositories/local/__tests__/findMarkdownFiles.test.d.ts +2 -0
  76. package/dist/repositories/local/__tests__/findMarkdownFiles.test.d.ts.map +1 -0
  77. package/dist/repositories/local/__tests__/findMarkdownFiles.test.js +236 -0
  78. package/dist/repositories/local/__tests__/findMarkdownFiles.test.js.map +1 -0
  79. package/dist/repositories/local/__tests__/getObjectByFilePath.test.d.ts +2 -0
  80. package/dist/repositories/local/__tests__/getObjectByFilePath.test.d.ts.map +1 -0
  81. package/dist/repositories/local/__tests__/getObjectByFilePath.test.js +96 -0
  82. package/dist/repositories/local/__tests__/getObjectByFilePath.test.js.map +1 -0
  83. package/dist/repositories/local/__tests__/getObjectById.test.d.ts +2 -0
  84. package/dist/repositories/local/__tests__/getObjectById.test.d.ts.map +1 -0
  85. package/dist/repositories/local/__tests__/getObjectById.test.js +46 -0
  86. package/dist/repositories/local/__tests__/getObjectById.test.js.map +1 -0
  87. package/dist/repositories/local/__tests__/getObjectFilePath.test.d.ts +2 -0
  88. package/dist/repositories/local/__tests__/getObjectFilePath.test.d.ts.map +1 -0
  89. package/dist/repositories/local/__tests__/getObjectFilePath.test.js +172 -0
  90. package/dist/repositories/local/__tests__/getObjectFilePath.test.js.map +1 -0
  91. package/dist/repositories/local/__tests__/getObjects.test.d.ts +2 -0
  92. package/dist/repositories/local/__tests__/getObjects.test.d.ts.map +1 -0
  93. package/dist/repositories/local/__tests__/getObjects.test.js +351 -0
  94. package/dist/repositories/local/__tests__/getObjects.test.js.map +1 -0
  95. package/dist/repositories/local/__tests__/scopeFilter.test.d.ts +2 -0
  96. package/dist/repositories/local/__tests__/scopeFilter.test.d.ts.map +1 -0
  97. package/dist/repositories/local/__tests__/scopeFilter.test.js +109 -0
  98. package/dist/repositories/local/__tests__/scopeFilter.test.js.map +1 -0
  99. package/dist/repositories/local/deleteObjectById.d.ts +16 -0
  100. package/dist/repositories/local/deleteObjectById.d.ts.map +1 -0
  101. package/dist/repositories/local/deleteObjectById.js +108 -0
  102. package/dist/repositories/local/deleteObjectById.js.map +1 -0
  103. package/dist/repositories/local/extractMarkdownIds.d.ts +17 -0
  104. package/dist/repositories/local/extractMarkdownIds.d.ts.map +1 -0
  105. package/dist/repositories/local/extractMarkdownIds.js +34 -0
  106. package/dist/repositories/local/extractMarkdownIds.js.map +1 -0
  107. package/dist/repositories/local/filterByScope.d.ts +8 -0
  108. package/dist/repositories/local/filterByScope.d.ts.map +1 -0
  109. package/dist/repositories/local/filterByScope.js +17 -0
  110. package/dist/repositories/local/filterByScope.js.map +1 -0
  111. package/dist/repositories/local/findMarkdownFiles.d.ts +9 -0
  112. package/dist/repositories/local/findMarkdownFiles.d.ts.map +1 -0
  113. package/dist/repositories/local/findMarkdownFiles.js +47 -0
  114. package/dist/repositories/local/findMarkdownFiles.js.map +1 -0
  115. package/dist/repositories/local/getObjectByFilePath.d.ts +9 -0
  116. package/dist/repositories/local/getObjectByFilePath.d.ts.map +1 -0
  117. package/dist/repositories/local/getObjectByFilePath.js +16 -0
  118. package/dist/repositories/local/getObjectByFilePath.js.map +1 -0
  119. package/dist/repositories/local/getObjectById.d.ts +10 -0
  120. package/dist/repositories/local/getObjectById.d.ts.map +1 -0
  121. package/dist/repositories/local/getObjectById.js +36 -0
  122. package/dist/repositories/local/getObjectById.js.map +1 -0
  123. package/dist/repositories/local/getObjectFilePath.d.ts +7 -0
  124. package/dist/repositories/local/getObjectFilePath.d.ts.map +1 -0
  125. package/dist/repositories/local/getObjectFilePath.js +90 -0
  126. package/dist/repositories/local/getObjectFilePath.js.map +1 -0
  127. package/dist/repositories/local/getObjects.d.ts +3 -0
  128. package/dist/repositories/local/getObjects.d.ts.map +1 -0
  129. package/dist/repositories/local/getObjects.js +64 -0
  130. package/dist/repositories/local/getObjects.js.map +1 -0
  131. package/dist/repositories/local/index.d.ts +8 -0
  132. package/dist/repositories/local/index.d.ts.map +1 -0
  133. package/dist/repositories/local/index.js +24 -0
  134. package/dist/repositories/local/index.js.map +1 -0
  135. package/dist/repositories/local/saveObject.d.ts +12 -0
  136. package/dist/repositories/local/saveObject.d.ts.map +1 -0
  137. package/dist/repositories/local/saveObject.js +27 -0
  138. package/dist/repositories/local/saveObject.js.map +1 -0
  139. package/dist/repositories/local/scopeFilter.d.ts +12 -0
  140. package/dist/repositories/local/scopeFilter.d.ts.map +1 -0
  141. package/dist/repositories/local/scopeFilter.js +21 -0
  142. package/dist/repositories/local/scopeFilter.js.map +1 -0
  143. package/dist/server.d.ts +3 -0
  144. package/dist/server.d.ts.map +1 -0
  145. package/dist/server.js +138 -0
  146. package/dist/server.js.map +1 -0
  147. package/dist/tools/__tests__/appendObjectLogTool.test.d.ts +2 -0
  148. package/dist/tools/__tests__/appendObjectLogTool.test.d.ts.map +1 -0
  149. package/dist/tools/__tests__/appendObjectLogTool.test.js +125 -0
  150. package/dist/tools/__tests__/appendObjectLogTool.test.js.map +1 -0
  151. package/dist/tools/__tests__/claimTaskTool.test.d.ts +2 -0
  152. package/dist/tools/__tests__/claimTaskTool.test.d.ts.map +1 -0
  153. package/dist/tools/__tests__/claimTaskTool.test.js +348 -0
  154. package/dist/tools/__tests__/claimTaskTool.test.js.map +1 -0
  155. package/dist/tools/__tests__/completeTaskTool.test.d.ts +2 -0
  156. package/dist/tools/__tests__/completeTaskTool.test.d.ts.map +1 -0
  157. package/dist/tools/__tests__/completeTaskTool.test.js +221 -0
  158. package/dist/tools/__tests__/completeTaskTool.test.js.map +1 -0
  159. package/dist/tools/__tests__/createObjectTool.test.d.ts +2 -0
  160. package/dist/tools/__tests__/createObjectTool.test.d.ts.map +1 -0
  161. package/dist/tools/__tests__/createObjectTool.test.js +387 -0
  162. package/dist/tools/__tests__/createObjectTool.test.js.map +1 -0
  163. package/dist/tools/__tests__/deleteObjectTool.test.d.ts +2 -0
  164. package/dist/tools/__tests__/deleteObjectTool.test.d.ts.map +1 -0
  165. package/dist/tools/__tests__/deleteObjectTool.test.js +169 -0
  166. package/dist/tools/__tests__/deleteObjectTool.test.js.map +1 -0
  167. package/dist/tools/__tests__/getObjectTool.test.d.ts +2 -0
  168. package/dist/tools/__tests__/getObjectTool.test.d.ts.map +1 -0
  169. package/dist/tools/__tests__/getObjectTool.test.js +124 -0
  170. package/dist/tools/__tests__/getObjectTool.test.js.map +1 -0
  171. package/dist/tools/__tests__/listObjectsTool.test.d.ts +2 -0
  172. package/dist/tools/__tests__/listObjectsTool.test.d.ts.map +1 -0
  173. package/dist/tools/__tests__/listObjectsTool.test.js +266 -0
  174. package/dist/tools/__tests__/listObjectsTool.test.js.map +1 -0
  175. package/dist/tools/__tests__/updateObjectTool.test.d.ts +2 -0
  176. package/dist/tools/__tests__/updateObjectTool.test.d.ts.map +1 -0
  177. package/dist/tools/__tests__/updateObjectTool.test.js +208 -0
  178. package/dist/tools/__tests__/updateObjectTool.test.js.map +1 -0
  179. package/dist/tools/activateTool.d.ts +38 -0
  180. package/dist/tools/activateTool.d.ts.map +1 -0
  181. package/dist/tools/activateTool.js +48 -0
  182. package/dist/tools/activateTool.js.map +1 -0
  183. package/dist/tools/appendObjectLogTool.d.ts +26 -0
  184. package/dist/tools/appendObjectLogTool.d.ts.map +1 -0
  185. package/dist/tools/appendObjectLogTool.js +65 -0
  186. package/dist/tools/appendObjectLogTool.js.map +1 -0
  187. package/dist/tools/claimTaskTool.d.ts +30 -0
  188. package/dist/tools/claimTaskTool.d.ts.map +1 -0
  189. package/dist/tools/claimTaskTool.js +109 -0
  190. package/dist/tools/claimTaskTool.js.map +1 -0
  191. package/dist/tools/completeTaskTool.d.ts +33 -0
  192. package/dist/tools/completeTaskTool.d.ts.map +1 -0
  193. package/dist/tools/completeTaskTool.js +61 -0
  194. package/dist/tools/completeTaskTool.js.map +1 -0
  195. package/dist/tools/createObjectTool.d.ts +52 -0
  196. package/dist/tools/createObjectTool.d.ts.map +1 -0
  197. package/dist/tools/createObjectTool.js +87 -0
  198. package/dist/tools/createObjectTool.js.map +1 -0
  199. package/dist/tools/deleteObjectTool.d.ts +27 -0
  200. package/dist/tools/deleteObjectTool.d.ts.map +1 -0
  201. package/dist/tools/deleteObjectTool.js +48 -0
  202. package/dist/tools/deleteObjectTool.js.map +1 -0
  203. package/dist/tools/getObjectTool.d.ts +22 -0
  204. package/dist/tools/getObjectTool.d.ts.map +1 -0
  205. package/dist/tools/getObjectTool.js +53 -0
  206. package/dist/tools/getObjectTool.js.map +1 -0
  207. package/dist/tools/index.d.ts +11 -0
  208. package/dist/tools/index.d.ts.map +1 -0
  209. package/dist/tools/index.js +34 -0
  210. package/dist/tools/index.js.map +1 -0
  211. package/dist/tools/listObjectsTool.d.ts +39 -0
  212. package/dist/tools/listObjectsTool.d.ts.map +1 -0
  213. package/dist/tools/listObjectsTool.js +87 -0
  214. package/dist/tools/listObjectsTool.js.map +1 -0
  215. package/dist/tools/pruneClosedTool.d.ts +26 -0
  216. package/dist/tools/pruneClosedTool.d.ts.map +1 -0
  217. package/dist/tools/pruneClosedTool.js +35 -0
  218. package/dist/tools/pruneClosedTool.js.map +1 -0
  219. package/dist/tools/updateObjectTool.d.ts +46 -0
  220. package/dist/tools/updateObjectTool.d.ts.map +1 -0
  221. package/dist/tools/updateObjectTool.js +93 -0
  222. package/dist/tools/updateObjectTool.js.map +1 -0
  223. package/dist/utils/__tests__/checkPrerequisitesComplete.test.d.ts +2 -0
  224. package/dist/utils/__tests__/checkPrerequisitesComplete.test.d.ts.map +1 -0
  225. package/dist/utils/__tests__/checkPrerequisitesComplete.test.js +200 -0
  226. package/dist/utils/__tests__/checkPrerequisitesComplete.test.js.map +1 -0
  227. package/dist/utils/__tests__/deserializeTrellisObject.test.d.ts +2 -0
  228. package/dist/utils/__tests__/deserializeTrellisObject.test.d.ts.map +1 -0
  229. package/dist/utils/__tests__/deserializeTrellisObject.test.js +329 -0
  230. package/dist/utils/__tests__/deserializeTrellisObject.test.js.map +1 -0
  231. package/dist/utils/__tests__/filterUnavailableObjects.test.d.ts +2 -0
  232. package/dist/utils/__tests__/filterUnavailableObjects.test.d.ts.map +1 -0
  233. package/dist/utils/__tests__/filterUnavailableObjects.test.js +172 -0
  234. package/dist/utils/__tests__/filterUnavailableObjects.test.js.map +1 -0
  235. package/dist/utils/__tests__/generateUniqueId.test.d.ts +2 -0
  236. package/dist/utils/__tests__/generateUniqueId.test.d.ts.map +1 -0
  237. package/dist/utils/__tests__/generateUniqueId.test.js +186 -0
  238. package/dist/utils/__tests__/generateUniqueId.test.js.map +1 -0
  239. package/dist/utils/__tests__/inferObjectType.test.d.ts +2 -0
  240. package/dist/utils/__tests__/inferObjectType.test.d.ts.map +1 -0
  241. package/dist/utils/__tests__/inferObjectType.test.js +43 -0
  242. package/dist/utils/__tests__/inferObjectType.test.js.map +1 -0
  243. package/dist/utils/__tests__/isRequiredForOtherObjects.test.d.ts +2 -0
  244. package/dist/utils/__tests__/isRequiredForOtherObjects.test.d.ts.map +1 -0
  245. package/dist/utils/__tests__/isRequiredForOtherObjects.test.js +229 -0
  246. package/dist/utils/__tests__/isRequiredForOtherObjects.test.js.map +1 -0
  247. package/dist/utils/__tests__/serializationRoundTrip.test.d.ts +2 -0
  248. package/dist/utils/__tests__/serializationRoundTrip.test.d.ts.map +1 -0
  249. package/dist/utils/__tests__/serializationRoundTrip.test.js +389 -0
  250. package/dist/utils/__tests__/serializationRoundTrip.test.js.map +1 -0
  251. package/dist/utils/__tests__/serializeTrellisObject.test.d.ts +2 -0
  252. package/dist/utils/__tests__/serializeTrellisObject.test.d.ts.map +1 -0
  253. package/dist/utils/__tests__/serializeTrellisObject.test.js +192 -0
  254. package/dist/utils/__tests__/serializeTrellisObject.test.js.map +1 -0
  255. package/dist/utils/__tests__/sortTrellisObjects.test.d.ts +2 -0
  256. package/dist/utils/__tests__/sortTrellisObjects.test.d.ts.map +1 -0
  257. package/dist/utils/__tests__/sortTrellisObjects.test.js +114 -0
  258. package/dist/utils/__tests__/sortTrellisObjects.test.js.map +1 -0
  259. package/dist/utils/checkPrerequisitesComplete.d.ts +12 -0
  260. package/dist/utils/checkPrerequisitesComplete.d.ts.map +1 -0
  261. package/dist/utils/checkPrerequisitesComplete.js +38 -0
  262. package/dist/utils/checkPrerequisitesComplete.js.map +1 -0
  263. package/dist/utils/deserializeTrellisObject.d.ts +9 -0
  264. package/dist/utils/deserializeTrellisObject.d.ts.map +1 -0
  265. package/dist/utils/deserializeTrellisObject.js +134 -0
  266. package/dist/utils/deserializeTrellisObject.js.map +1 -0
  267. package/dist/utils/filterUnavailableObjects.d.ts +13 -0
  268. package/dist/utils/filterUnavailableObjects.d.ts.map +1 -0
  269. package/dist/utils/filterUnavailableObjects.js +40 -0
  270. package/dist/utils/filterUnavailableObjects.js.map +1 -0
  271. package/dist/utils/generateUniqueId.d.ts +10 -0
  272. package/dist/utils/generateUniqueId.d.ts.map +1 -0
  273. package/dist/utils/generateUniqueId.js +67 -0
  274. package/dist/utils/generateUniqueId.js.map +1 -0
  275. package/dist/utils/index.d.ts +9 -0
  276. package/dist/utils/index.d.ts.map +1 -0
  277. package/dist/utils/index.js +20 -0
  278. package/dist/utils/index.js.map +1 -0
  279. package/dist/utils/inferObjectType.d.ts +3 -0
  280. package/dist/utils/inferObjectType.d.ts.map +1 -0
  281. package/dist/utils/inferObjectType.js +26 -0
  282. package/dist/utils/inferObjectType.js.map +1 -0
  283. package/dist/utils/isRequiredForOtherObjects.d.ts +12 -0
  284. package/dist/utils/isRequiredForOtherObjects.d.ts.map +1 -0
  285. package/dist/utils/isRequiredForOtherObjects.js +33 -0
  286. package/dist/utils/isRequiredForOtherObjects.js.map +1 -0
  287. package/dist/utils/serializeTrellisObject.d.ts +8 -0
  288. package/dist/utils/serializeTrellisObject.d.ts.map +1 -0
  289. package/dist/utils/serializeTrellisObject.js +35 -0
  290. package/dist/utils/serializeTrellisObject.js.map +1 -0
  291. package/dist/utils/sortTrellisObjects.d.ts +8 -0
  292. package/dist/utils/sortTrellisObjects.d.ts.map +1 -0
  293. package/dist/utils/sortTrellisObjects.js +20 -0
  294. package/dist/utils/sortTrellisObjects.js.map +1 -0
  295. package/dist/validation/ValidationError.d.ts +9 -0
  296. package/dist/validation/ValidationError.d.ts.map +1 -0
  297. package/dist/validation/ValidationError.js +18 -0
  298. package/dist/validation/ValidationError.js.map +1 -0
  299. package/dist/validation/ValidationErrorCode.d.ts +3 -0
  300. package/dist/validation/ValidationErrorCode.d.ts.map +1 -0
  301. package/dist/validation/ValidationErrorCode.js +3 -0
  302. package/dist/validation/ValidationErrorCode.js.map +1 -0
  303. package/dist/validation/ValidationErrorCodes.d.ts +8 -0
  304. package/dist/validation/ValidationErrorCodes.d.ts.map +1 -0
  305. package/dist/validation/ValidationErrorCodes.js +11 -0
  306. package/dist/validation/ValidationErrorCodes.js.map +1 -0
  307. package/dist/validation/__tests__/ValidationError.test.d.ts +2 -0
  308. package/dist/validation/__tests__/ValidationError.test.d.ts.map +1 -0
  309. package/dist/validation/__tests__/ValidationError.test.js +32 -0
  310. package/dist/validation/__tests__/ValidationError.test.js.map +1 -0
  311. package/dist/validation/__tests__/validateObjectCreation.test.d.ts +2 -0
  312. package/dist/validation/__tests__/validateObjectCreation.test.d.ts.map +1 -0
  313. package/dist/validation/__tests__/validateObjectCreation.test.js +93 -0
  314. package/dist/validation/__tests__/validateObjectCreation.test.js.map +1 -0
  315. package/dist/validation/__tests__/validateParentExists.test.d.ts +2 -0
  316. package/dist/validation/__tests__/validateParentExists.test.d.ts.map +1 -0
  317. package/dist/validation/__tests__/validateParentExists.test.js +62 -0
  318. package/dist/validation/__tests__/validateParentExists.test.js.map +1 -0
  319. package/dist/validation/__tests__/validateParentType.test.d.ts +2 -0
  320. package/dist/validation/__tests__/validateParentType.test.d.ts.map +1 -0
  321. package/dist/validation/__tests__/validateParentType.test.js +125 -0
  322. package/dist/validation/__tests__/validateParentType.test.js.map +1 -0
  323. package/dist/validation/__tests__/validateStatusTransition.test.d.ts +2 -0
  324. package/dist/validation/__tests__/validateStatusTransition.test.d.ts.map +1 -0
  325. package/dist/validation/__tests__/validateStatusTransition.test.js +103 -0
  326. package/dist/validation/__tests__/validateStatusTransition.test.js.map +1 -0
  327. package/dist/validation/validateObjectCreation.d.ts +12 -0
  328. package/dist/validation/validateObjectCreation.d.ts.map +1 -0
  329. package/dist/validation/validateObjectCreation.js +24 -0
  330. package/dist/validation/validateObjectCreation.js.map +1 -0
  331. package/dist/validation/validateParentExists.d.ts +10 -0
  332. package/dist/validation/validateParentExists.d.ts.map +1 -0
  333. package/dist/validation/validateParentExists.js +23 -0
  334. package/dist/validation/validateParentExists.js.map +1 -0
  335. package/dist/validation/validateParentType.d.ts +16 -0
  336. package/dist/validation/validateParentType.d.ts.map +1 -0
  337. package/dist/validation/validateParentType.js +48 -0
  338. package/dist/validation/validateParentType.js.map +1 -0
  339. package/dist/validation/validateStatusTransition.d.ts +12 -0
  340. package/dist/validation/validateStatusTransition.d.ts.map +1 -0
  341. package/dist/validation/validateStatusTransition.js +29 -0
  342. package/dist/validation/validateStatusTransition.js.map +1 -0
  343. package/package.json +78 -0
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateUniqueId = generateUniqueId;
4
+ const TrellisObjectType_1 = require("../models/TrellisObjectType");
5
+ const TYPE_PREFIXES = {
6
+ [TrellisObjectType_1.TrellisObjectType.PROJECT]: "P-",
7
+ [TrellisObjectType_1.TrellisObjectType.EPIC]: "E-",
8
+ [TrellisObjectType_1.TrellisObjectType.FEATURE]: "F-",
9
+ [TrellisObjectType_1.TrellisObjectType.TASK]: "T-",
10
+ };
11
+ const MAX_SLUG_LENGTH = 30;
12
+ /**
13
+ * Converts a string to a URL-friendly slug
14
+ */
15
+ function slugify(text) {
16
+ return text
17
+ .toLowerCase()
18
+ .trim()
19
+ .replace(/[^\w\s-]/g, "") // Remove special characters except spaces and hyphens
20
+ .replace(/[\s_-]+/g, "-") // Replace spaces, underscores, and multiple hyphens with single hyphen
21
+ .replace(/^-+|-+$/g, ""); // Remove leading and trailing hyphens
22
+ }
23
+ /**
24
+ * Truncates a slug to a reasonable length while preserving word boundaries
25
+ */
26
+ function truncateSlug(slug, maxLength) {
27
+ if (slug.length <= maxLength) {
28
+ return slug;
29
+ }
30
+ // Try to cut at a word boundary (hyphen)
31
+ const truncated = slug.substring(0, maxLength);
32
+ const lastHyphen = truncated.lastIndexOf("-");
33
+ // If we found a hyphen and it's not too close to the beginning, cut there
34
+ if (lastHyphen > maxLength * 0.6) {
35
+ return truncated.substring(0, lastHyphen);
36
+ }
37
+ // Otherwise, just truncate at max length
38
+ return truncated;
39
+ }
40
+ /**
41
+ * Generates a unique ID for a Trellis object
42
+ * @param title - The title to generate an ID from
43
+ * @param type - The type of Trellis object
44
+ * @param existingIds - List of existing IDs to avoid duplicates
45
+ * @returns A unique ID with appropriate prefix
46
+ */
47
+ function generateUniqueId(title, type, existingIds) {
48
+ if (!title.trim()) {
49
+ throw new Error("Title cannot be empty");
50
+ }
51
+ const prefix = TYPE_PREFIXES[type];
52
+ const slug = truncateSlug(slugify(title), MAX_SLUG_LENGTH);
53
+ if (!slug) {
54
+ throw new Error("Title must contain at least one alphanumeric character");
55
+ }
56
+ let candidateId = `${prefix}${slug}`;
57
+ let counter = 1;
58
+ // Create a Set for O(1) lookup performance
59
+ const existingIdSet = new Set(existingIds);
60
+ // Keep incrementing counter until we find a unique ID
61
+ while (existingIdSet.has(candidateId)) {
62
+ candidateId = `${prefix}${slug}-${counter}`;
63
+ counter++;
64
+ }
65
+ return candidateId;
66
+ }
67
+ //# sourceMappingURL=generateUniqueId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateUniqueId.js","sourceRoot":"","sources":["../../src/utils/generateUniqueId.ts"],"names":[],"mappings":";;AAmDA,4CA6BC;AAhFD,mEAAgE;AAEhE,MAAM,aAAa,GAAsC;IACvD,CAAC,qCAAiB,CAAC,OAAO,CAAC,EAAE,IAAI;IACjC,CAAC,qCAAiB,CAAC,IAAI,CAAC,EAAE,IAAI;IAC9B,CAAC,qCAAiB,CAAC,OAAO,CAAC,EAAE,IAAI;IACjC,CAAC,qCAAiB,CAAC,IAAI,CAAC,EAAE,IAAI;CAC/B,CAAC;AAEF,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B;;GAEG;AACH,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,IAAI,EAAE;SACN,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,sDAAsD;SAC/E,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,uEAAuE;SAChG,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,sCAAsC;AACpE,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,IAAY,EAAE,SAAiB;IACnD,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yCAAyC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAE9C,0EAA0E;IAC1E,IAAI,UAAU,GAAG,SAAS,GAAG,GAAG,EAAE,CAAC;QACjC,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAC5C,CAAC;IAED,yCAAyC;IACzC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAC9B,KAAa,EACb,IAAuB,EACvB,WAAqB;IAErB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC,CAAC;IAE3D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,WAAW,GAAG,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC;IACrC,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,2CAA2C;IAC3C,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IAE3C,sDAAsD;IACtD,OAAO,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,WAAW,GAAG,GAAG,MAAM,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;QAC5C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { checkPrerequisitesComplete } from "./checkPrerequisitesComplete";
2
+ export { deserializeTrellisObject } from "./deserializeTrellisObject";
3
+ export { filterUnavailableObjects } from "./filterUnavailableObjects";
4
+ export { generateUniqueId } from "./generateUniqueId";
5
+ export { inferObjectType } from "./inferObjectType";
6
+ export { isRequiredForOtherObjects } from "./isRequiredForOtherObjects";
7
+ export { serializeTrellisObject } from "./serializeTrellisObject";
8
+ export { sortTrellisObjects } from "./sortTrellisObjects";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sortTrellisObjects = exports.serializeTrellisObject = exports.isRequiredForOtherObjects = exports.inferObjectType = exports.generateUniqueId = exports.filterUnavailableObjects = exports.deserializeTrellisObject = exports.checkPrerequisitesComplete = void 0;
4
+ var checkPrerequisitesComplete_1 = require("./checkPrerequisitesComplete");
5
+ Object.defineProperty(exports, "checkPrerequisitesComplete", { enumerable: true, get: function () { return checkPrerequisitesComplete_1.checkPrerequisitesComplete; } });
6
+ var deserializeTrellisObject_1 = require("./deserializeTrellisObject");
7
+ Object.defineProperty(exports, "deserializeTrellisObject", { enumerable: true, get: function () { return deserializeTrellisObject_1.deserializeTrellisObject; } });
8
+ var filterUnavailableObjects_1 = require("./filterUnavailableObjects");
9
+ Object.defineProperty(exports, "filterUnavailableObjects", { enumerable: true, get: function () { return filterUnavailableObjects_1.filterUnavailableObjects; } });
10
+ var generateUniqueId_1 = require("./generateUniqueId");
11
+ Object.defineProperty(exports, "generateUniqueId", { enumerable: true, get: function () { return generateUniqueId_1.generateUniqueId; } });
12
+ var inferObjectType_1 = require("./inferObjectType");
13
+ Object.defineProperty(exports, "inferObjectType", { enumerable: true, get: function () { return inferObjectType_1.inferObjectType; } });
14
+ var isRequiredForOtherObjects_1 = require("./isRequiredForOtherObjects");
15
+ Object.defineProperty(exports, "isRequiredForOtherObjects", { enumerable: true, get: function () { return isRequiredForOtherObjects_1.isRequiredForOtherObjects; } });
16
+ var serializeTrellisObject_1 = require("./serializeTrellisObject");
17
+ Object.defineProperty(exports, "serializeTrellisObject", { enumerable: true, get: function () { return serializeTrellisObject_1.serializeTrellisObject; } });
18
+ var sortTrellisObjects_1 = require("./sortTrellisObjects");
19
+ Object.defineProperty(exports, "sortTrellisObjects", { enumerable: true, get: function () { return sortTrellisObjects_1.sortTrellisObjects; } });
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;AAAA,2EAA0E;AAAjE,wIAAA,0BAA0B,OAAA;AACnC,uEAAsE;AAA7D,oIAAA,wBAAwB,OAAA;AACjC,uEAAsE;AAA7D,oIAAA,wBAAwB,OAAA;AACjC,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA;AACzB,qDAAoD;AAA3C,kHAAA,eAAe,OAAA;AACxB,yEAAwE;AAA/D,sIAAA,yBAAyB,OAAA;AAClC,mEAAkE;AAAzD,gIAAA,sBAAsB,OAAA;AAC/B,2DAA0D;AAAjD,wHAAA,kBAAkB,OAAA"}
@@ -0,0 +1,3 @@
1
+ import { TrellisObjectType } from "../models";
2
+ export declare function inferObjectType(id: string): TrellisObjectType;
3
+ //# sourceMappingURL=inferObjectType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inferObjectType.d.ts","sourceRoot":"","sources":["../../src/utils/inferObjectType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,CA2B7D"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.inferObjectType = inferObjectType;
4
+ const models_1 = require("../models");
5
+ function inferObjectType(id) {
6
+ if (!id || id.length === 0) {
7
+ throw new Error("ID cannot be empty");
8
+ }
9
+ if (id.length < 2 || id.charAt(1) !== "-") {
10
+ throw new Error(`Invalid ID format: '${id}'. ID must follow pattern X- where X is P, E, F, or T`);
11
+ }
12
+ const firstChar = id.charAt(0).toUpperCase();
13
+ switch (firstChar) {
14
+ case "P":
15
+ return models_1.TrellisObjectType.PROJECT;
16
+ case "E":
17
+ return models_1.TrellisObjectType.EPIC;
18
+ case "F":
19
+ return models_1.TrellisObjectType.FEATURE;
20
+ case "T":
21
+ return models_1.TrellisObjectType.TASK;
22
+ default:
23
+ throw new Error(`Invalid ID format: '${id}'. ID must follow pattern X- where X is P, E, F, or T`);
24
+ }
25
+ }
26
+ //# sourceMappingURL=inferObjectType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inferObjectType.js","sourceRoot":"","sources":["../../src/utils/inferObjectType.ts"],"names":[],"mappings":";;AAEA,0CA2BC;AA7BD,sCAA8C;AAE9C,SAAgB,eAAe,CAAC,EAAU;IACxC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,uBAAuB,EAAE,uDAAuD,CACjF,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAE7C,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,GAAG;YACN,OAAO,0BAAiB,CAAC,OAAO,CAAC;QACnC,KAAK,GAAG;YACN,OAAO,0BAAiB,CAAC,IAAI,CAAC;QAChC,KAAK,GAAG;YACN,OAAO,0BAAiB,CAAC,OAAO,CAAC;QACnC,KAAK,GAAG;YACN,OAAO,0BAAiB,CAAC,IAAI,CAAC;QAChC;YACE,MAAM,IAAI,KAAK,CACb,uBAAuB,EAAE,uDAAuD,CACjF,CAAC;IACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { TrellisObject } from "../models/TrellisObject";
2
+ import { Repository } from "../repositories/Repository";
3
+ /**
4
+ * Checks if a trellis object is a prerequisite for any other objects that are not closed.
5
+ * An object is considered closed if its status is DONE or WONT_DO.
6
+ *
7
+ * @param trellisObject - The trellis object to check if it's required by others
8
+ * @param repository - The repository to load all objects from
9
+ * @returns Promise<boolean> - true if any non-closed objects have this object as a prerequisite, false otherwise
10
+ */
11
+ export declare function isRequiredForOtherObjects(trellisObject: TrellisObject, repository: Repository): Promise<boolean>;
12
+ //# sourceMappingURL=isRequiredForOtherObjects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isRequiredForOtherObjects.d.ts","sourceRoot":"","sources":["../../src/utils/isRequiredForOtherObjects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC7C,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,OAAO,CAAC,CAwBlB"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isRequiredForOtherObjects = isRequiredForOtherObjects;
4
+ const TrellisObjectStatus_1 = require("../models/TrellisObjectStatus");
5
+ /**
6
+ * Checks if a trellis object is a prerequisite for any other objects that are not closed.
7
+ * An object is considered closed if its status is DONE or WONT_DO.
8
+ *
9
+ * @param trellisObject - The trellis object to check if it's required by others
10
+ * @param repository - The repository to load all objects from
11
+ * @returns Promise<boolean> - true if any non-closed objects have this object as a prerequisite, false otherwise
12
+ */
13
+ async function isRequiredForOtherObjects(trellisObject, repository) {
14
+ // Load all objects from the repository
15
+ const allObjects = await repository.getObjects(true); // include closed objects to get all
16
+ // Check each object to see if it has this object as a prerequisite and is not closed
17
+ for (const obj of allObjects) {
18
+ // Skip the object itself
19
+ if (obj.id === trellisObject.id) {
20
+ continue;
21
+ }
22
+ // Check if this object has our target object as a prerequisite
23
+ if (obj.prerequisites.includes(trellisObject.id)) {
24
+ // Check if this object is not closed (i.e., not DONE or WONT_DO)
25
+ if (obj.status !== TrellisObjectStatus_1.TrellisObjectStatus.DONE &&
26
+ obj.status !== TrellisObjectStatus_1.TrellisObjectStatus.WONT_DO) {
27
+ return true;
28
+ }
29
+ }
30
+ }
31
+ return false;
32
+ }
33
+ //# sourceMappingURL=isRequiredForOtherObjects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isRequiredForOtherObjects.js","sourceRoot":"","sources":["../../src/utils/isRequiredForOtherObjects.ts"],"names":[],"mappings":";;AAYA,8DA2BC;AAtCD,uEAAoE;AAGpE;;;;;;;GAOG;AACI,KAAK,UAAU,yBAAyB,CAC7C,aAA4B,EAC5B,UAAsB;IAEtB,uCAAuC;IACvC,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,oCAAoC;IAE1F,qFAAqF;IACrF,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,yBAAyB;QACzB,IAAI,GAAG,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,EAAE,CAAC;YAChC,SAAS;QACX,CAAC;QAED,+DAA+D;QAC/D,IAAI,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC;YACjD,iEAAiE;YACjE,IACE,GAAG,CAAC,MAAM,KAAK,yCAAmB,CAAC,IAAI;gBACvC,GAAG,CAAC,MAAM,KAAK,yCAAmB,CAAC,OAAO,EAC1C,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { TrellisObject } from "../models";
2
+ /**
3
+ * Serializes a TrellisObject to a markdown string with YAML frontmatter
4
+ * @param trellisObject - The TrellisObject to serialize
5
+ * @returns A markdown string with YAML frontmatter
6
+ */
7
+ export declare function serializeTrellisObject(trellisObject: TrellisObject): string;
8
+ //# sourceMappingURL=serializeTrellisObject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializeTrellisObject.d.ts","sourceRoot":"","sources":["../../src/utils/serializeTrellisObject.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,aAAa,GAAG,MAAM,CA4B3E"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serializeTrellisObject = serializeTrellisObject;
4
+ const yaml_1 = require("yaml");
5
+ /**
6
+ * Serializes a TrellisObject to a markdown string with YAML frontmatter
7
+ * @param trellisObject - The TrellisObject to serialize
8
+ * @returns A markdown string with YAML frontmatter
9
+ */
10
+ function serializeTrellisObject(trellisObject) {
11
+ // Convert Map to plain object for YAML serialization
12
+ const affectedFilesObj = Object.fromEntries(trellisObject.affectedFiles);
13
+ // Create the frontmatter object (excluding body since it goes in the markdown content)
14
+ const frontmatter = {
15
+ id: trellisObject.id,
16
+ title: trellisObject.title,
17
+ status: trellisObject.status,
18
+ priority: trellisObject.priority,
19
+ prerequisites: trellisObject.prerequisites,
20
+ affectedFiles: affectedFilesObj,
21
+ log: trellisObject.log,
22
+ schema: trellisObject.schema,
23
+ childrenIds: trellisObject.childrenIds,
24
+ };
25
+ // Generate YAML frontmatter
26
+ const yamlFrontmatter = (0, yaml_1.stringify)(frontmatter).trim();
27
+ // Combine YAML frontmatter with markdown body
28
+ const markdown = `---
29
+ ${yamlFrontmatter}
30
+ ---
31
+
32
+ ${trellisObject.body}`;
33
+ return markdown;
34
+ }
35
+ //# sourceMappingURL=serializeTrellisObject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializeTrellisObject.js","sourceRoot":"","sources":["../../src/utils/serializeTrellisObject.ts"],"names":[],"mappings":";;AAQA,wDA4BC;AApCD,+BAAiC;AAGjC;;;;GAIG;AACH,SAAgB,sBAAsB,CAAC,aAA4B;IACjE,qDAAqD;IACrD,MAAM,gBAAgB,GAAG,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAEzE,uFAAuF;IACvF,MAAM,WAAW,GAAG;QAClB,EAAE,EAAE,aAAa,CAAC,EAAE;QACpB,KAAK,EAAE,aAAa,CAAC,KAAK;QAC1B,MAAM,EAAE,aAAa,CAAC,MAAM;QAC5B,QAAQ,EAAE,aAAa,CAAC,QAAQ;QAChC,aAAa,EAAE,aAAa,CAAC,aAAa;QAC1C,aAAa,EAAE,gBAAgB;QAC/B,GAAG,EAAE,aAAa,CAAC,GAAG;QACtB,MAAM,EAAE,aAAa,CAAC,MAAM;QAC5B,WAAW,EAAE,aAAa,CAAC,WAAW;KACvC,CAAC;IAEF,4BAA4B;IAC5B,MAAM,eAAe,GAAG,IAAA,gBAAS,EAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;IAEtD,8CAA8C;IAC9C,MAAM,QAAQ,GAAG;EACjB,eAAe;;;EAGf,aAAa,CAAC,IAAI,EAAE,CAAC;IAErB,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { TrellisObject } from "../models/TrellisObject";
2
+ /**
3
+ * Sorts an array of TrellisObject by priority (high, medium, low)
4
+ * @param objects - Array of TrellisObject to sort
5
+ * @returns New array sorted by priority (high first, low last)
6
+ */
7
+ export declare function sortTrellisObjects(objects: TrellisObject[]): TrellisObject[];
8
+ //# sourceMappingURL=sortTrellisObjects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sortTrellisObjects.d.ts","sourceRoot":"","sources":["../../src/utils/sortTrellisObjects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAU5E"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sortTrellisObjects = sortTrellisObjects;
4
+ const TrellisObjectPriority_1 = require("../models/TrellisObjectPriority");
5
+ /**
6
+ * Sorts an array of TrellisObject by priority (high, medium, low)
7
+ * @param objects - Array of TrellisObject to sort
8
+ * @returns New array sorted by priority (high first, low last)
9
+ */
10
+ function sortTrellisObjects(objects) {
11
+ const priorityOrder = {
12
+ [TrellisObjectPriority_1.TrellisObjectPriority.HIGH]: 1,
13
+ [TrellisObjectPriority_1.TrellisObjectPriority.MEDIUM]: 2,
14
+ [TrellisObjectPriority_1.TrellisObjectPriority.LOW]: 3,
15
+ };
16
+ return [...objects].sort((a, b) => {
17
+ return priorityOrder[a.priority] - priorityOrder[b.priority];
18
+ });
19
+ }
20
+ //# sourceMappingURL=sortTrellisObjects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sortTrellisObjects.js","sourceRoot":"","sources":["../../src/utils/sortTrellisObjects.ts"],"names":[],"mappings":";;AAQA,gDAUC;AAjBD,2EAAwE;AAExE;;;;GAIG;AACH,SAAgB,kBAAkB,CAAC,OAAwB;IACzD,MAAM,aAAa,GAA0C;QAC3D,CAAC,6CAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,CAAC,6CAAqB,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,CAAC,6CAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;KAC/B,CAAC;IAEF,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAChC,OAAO,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Custom error class for validation failures in object creation.
3
+ */
4
+ export declare class ValidationError extends Error {
5
+ readonly code: string;
6
+ readonly field?: string | undefined;
7
+ constructor(message: string, code: string, field?: string | undefined);
8
+ }
9
+ //# sourceMappingURL=ValidationError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationError.d.ts","sourceRoot":"","sources":["../../src/validation/ValidationError.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,IAAI,EAAE,MAAM;aACZ,KAAK,CAAC,EAAE,MAAM;gBAF9B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,YAAA;CAKjC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ValidationError = void 0;
4
+ /**
5
+ * Custom error class for validation failures in object creation.
6
+ */
7
+ class ValidationError extends Error {
8
+ code;
9
+ field;
10
+ constructor(message, code, field) {
11
+ super(message);
12
+ this.code = code;
13
+ this.field = field;
14
+ this.name = "ValidationError";
15
+ }
16
+ }
17
+ exports.ValidationError = ValidationError;
18
+ //# sourceMappingURL=ValidationError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationError.js","sourceRoot":"","sources":["../../src/validation/ValidationError.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,eAAgB,SAAQ,KAAK;IAGtB;IACA;IAHlB,YACE,OAAe,EACC,IAAY,EACZ,KAAc;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAQ;QACZ,UAAK,GAAL,KAAK,CAAS;QAG9B,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AATD,0CASC"}
@@ -0,0 +1,3 @@
1
+ import { ValidationErrorCodes } from "./ValidationErrorCodes";
2
+ export type ValidationErrorCode = (typeof ValidationErrorCodes)[keyof typeof ValidationErrorCodes];
3
+ //# sourceMappingURL=ValidationErrorCode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationErrorCode.d.ts","sourceRoot":"","sources":["../../src/validation/ValidationErrorCode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,MAAM,mBAAmB,GAC7B,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,OAAO,oBAAoB,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ValidationErrorCode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationErrorCode.js","sourceRoot":"","sources":["../../src/validation/ValidationErrorCode.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Validation error codes for consistent error handling.
3
+ */
4
+ export declare const ValidationErrorCodes: {
5
+ readonly PARENT_NOT_FOUND: "PARENT_NOT_FOUND";
6
+ readonly INVALID_PARENT_TYPE: "INVALID_PARENT_TYPE";
7
+ };
8
+ //# sourceMappingURL=ValidationErrorCodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationErrorCodes.d.ts","sourceRoot":"","sources":["../../src/validation/ValidationErrorCodes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,oBAAoB;;;CAGvB,CAAC"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ /**
3
+ * Validation error codes for consistent error handling.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ValidationErrorCodes = void 0;
7
+ exports.ValidationErrorCodes = {
8
+ PARENT_NOT_FOUND: "PARENT_NOT_FOUND",
9
+ INVALID_PARENT_TYPE: "INVALID_PARENT_TYPE",
10
+ };
11
+ //# sourceMappingURL=ValidationErrorCodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationErrorCodes.js","sourceRoot":"","sources":["../../src/validation/ValidationErrorCodes.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEU,QAAA,oBAAoB,GAAG;IAClC,gBAAgB,EAAE,kBAAkB;IACpC,mBAAmB,EAAE,qBAAqB;CAClC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ValidationError.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationError.test.d.ts","sourceRoot":"","sources":["../../../src/validation/__tests__/ValidationError.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const ValidationError_1 = require("../ValidationError");
4
+ const ValidationErrorCodes_1 = require("../ValidationErrorCodes");
5
+ describe("ValidationError", () => {
6
+ it("should create error with message and code", () => {
7
+ const error = new ValidationError_1.ValidationError("Test error message", ValidationErrorCodes_1.ValidationErrorCodes.PARENT_NOT_FOUND);
8
+ expect(error.message).toBe("Test error message");
9
+ expect(error.code).toBe(ValidationErrorCodes_1.ValidationErrorCodes.PARENT_NOT_FOUND);
10
+ expect(error.name).toBe("ValidationError");
11
+ expect(error.field).toBeUndefined();
12
+ });
13
+ it("should create error with message, code, and field", () => {
14
+ const error = new ValidationError_1.ValidationError("Parent validation failed", ValidationErrorCodes_1.ValidationErrorCodes.PARENT_NOT_FOUND, "parent");
15
+ expect(error.message).toBe("Parent validation failed");
16
+ expect(error.code).toBe(ValidationErrorCodes_1.ValidationErrorCodes.PARENT_NOT_FOUND);
17
+ expect(error.name).toBe("ValidationError");
18
+ expect(error.field).toBe("parent");
19
+ });
20
+ it("should be instance of Error", () => {
21
+ const error = new ValidationError_1.ValidationError("Test error", ValidationErrorCodes_1.ValidationErrorCodes.INVALID_PARENT_TYPE);
22
+ expect(error).toBeInstanceOf(Error);
23
+ expect(error).toBeInstanceOf(ValidationError_1.ValidationError);
24
+ });
25
+ });
26
+ describe("ValidationErrorCodes", () => {
27
+ it("should contain expected error codes", () => {
28
+ expect(ValidationErrorCodes_1.ValidationErrorCodes.PARENT_NOT_FOUND).toBe("PARENT_NOT_FOUND");
29
+ expect(ValidationErrorCodes_1.ValidationErrorCodes.INVALID_PARENT_TYPE).toBe("INVALID_PARENT_TYPE");
30
+ });
31
+ });
32
+ //# sourceMappingURL=ValidationError.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationError.test.js","sourceRoot":"","sources":["../../../src/validation/__tests__/ValidationError.test.ts"],"names":[],"mappings":";;AAAA,wDAAqD;AACrD,kEAA+D;AAE/D,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,KAAK,GAAG,IAAI,iCAAe,CAC/B,oBAAoB,EACpB,2CAAoB,CAAC,gBAAgB,CACtC,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,2CAAoB,CAAC,gBAAgB,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,KAAK,GAAG,IAAI,iCAAe,CAC/B,0BAA0B,EAC1B,2CAAoB,CAAC,gBAAgB,EACrC,QAAQ,CACT,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,2CAAoB,CAAC,gBAAgB,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,KAAK,GAAG,IAAI,iCAAe,CAC/B,YAAY,EACZ,2CAAoB,CAAC,mBAAmB,CACzC,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,iCAAe,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,2CAAoB,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACvE,MAAM,CAAC,2CAAoB,CAAC,mBAAmB,CAAC,CAAC,IAAI,CACnD,qBAAqB,CACtB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validateObjectCreation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateObjectCreation.test.d.ts","sourceRoot":"","sources":["../../../src/validation/__tests__/validateObjectCreation.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const models_1 = require("../../models");
4
+ const validateObjectCreation_1 = require("../validateObjectCreation");
5
+ const validateParentExists_1 = require("../validateParentExists");
6
+ const ValidationError_1 = require("../ValidationError");
7
+ const ValidationErrorCodes_1 = require("../ValidationErrorCodes");
8
+ // Mock the validateParentExists function to test orchestration
9
+ jest.mock("../validateParentExists");
10
+ const mockValidateParentExists = validateParentExists_1.validateParentExists;
11
+ describe("validateObjectCreation", () => {
12
+ let mockRepository;
13
+ let testObject;
14
+ beforeEach(() => {
15
+ mockRepository = {
16
+ getObjectById: jest.fn(),
17
+ getObjects: jest.fn(),
18
+ saveObject: jest.fn(),
19
+ deleteObject: jest.fn(),
20
+ };
21
+ testObject = {
22
+ id: "T-test-123",
23
+ type: models_1.TrellisObjectType.TASK,
24
+ title: "Test Task",
25
+ status: models_1.TrellisObjectStatus.OPEN,
26
+ priority: models_1.TrellisObjectPriority.MEDIUM,
27
+ parent: "F-parent-123",
28
+ prerequisites: [],
29
+ affectedFiles: new Map(),
30
+ log: [],
31
+ schema: "v1.0",
32
+ childrenIds: [],
33
+ body: "Test task description",
34
+ };
35
+ jest.clearAllMocks();
36
+ });
37
+ it("should pass validation when all checks succeed", async () => {
38
+ mockValidateParentExists.mockResolvedValue(undefined);
39
+ await expect((0, validateObjectCreation_1.validateObjectCreation)(testObject, mockRepository)).resolves.toBeUndefined();
40
+ expect(mockValidateParentExists).toHaveBeenCalledWith("F-parent-123", mockRepository);
41
+ expect(mockValidateParentExists).toHaveBeenCalledTimes(1);
42
+ });
43
+ it("should pass validation for object without parent", async () => {
44
+ const objectWithoutParent = { ...testObject, parent: undefined };
45
+ mockValidateParentExists.mockResolvedValue(undefined);
46
+ await expect((0, validateObjectCreation_1.validateObjectCreation)(objectWithoutParent, mockRepository)).resolves.toBeUndefined();
47
+ expect(mockValidateParentExists).toHaveBeenCalledWith(undefined, mockRepository);
48
+ expect(mockValidateParentExists).toHaveBeenCalledTimes(1);
49
+ });
50
+ it("should throw ValidationError when parent validation fails", async () => {
51
+ const validationError = new ValidationError_1.ValidationError("Parent object with ID 'F-parent-123' does not exist", ValidationErrorCodes_1.ValidationErrorCodes.PARENT_NOT_FOUND, "parent");
52
+ mockValidateParentExists.mockRejectedValue(validationError);
53
+ await expect((0, validateObjectCreation_1.validateObjectCreation)(testObject, mockRepository)).rejects.toThrow(ValidationError_1.ValidationError);
54
+ await expect((0, validateObjectCreation_1.validateObjectCreation)(testObject, mockRepository)).rejects.toThrow("Parent object with ID 'F-parent-123' does not exist");
55
+ expect(mockValidateParentExists).toHaveBeenCalledWith("F-parent-123", mockRepository);
56
+ });
57
+ it("should validate all object types with appropriate parents", async () => {
58
+ mockValidateParentExists.mockResolvedValue(undefined);
59
+ const testCases = [
60
+ {
61
+ type: models_1.TrellisObjectType.PROJECT,
62
+ id: "P-project-123",
63
+ parent: undefined,
64
+ },
65
+ {
66
+ type: models_1.TrellisObjectType.EPIC,
67
+ id: "E-epic-123",
68
+ parent: "P-project-123",
69
+ },
70
+ {
71
+ type: models_1.TrellisObjectType.FEATURE,
72
+ id: "F-feature-123",
73
+ parent: "E-epic-123",
74
+ },
75
+ {
76
+ type: models_1.TrellisObjectType.TASK,
77
+ id: "T-task-123",
78
+ parent: "F-feature-123",
79
+ },
80
+ ];
81
+ for (const testCase of testCases) {
82
+ const objectOfType = {
83
+ ...testObject,
84
+ type: testCase.type,
85
+ id: testCase.id,
86
+ parent: testCase.parent,
87
+ };
88
+ await expect((0, validateObjectCreation_1.validateObjectCreation)(objectOfType, mockRepository)).resolves.toBeUndefined();
89
+ }
90
+ expect(mockValidateParentExists).toHaveBeenCalledTimes(testCases.length);
91
+ });
92
+ });
93
+ //# sourceMappingURL=validateObjectCreation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateObjectCreation.test.js","sourceRoot":"","sources":["../../../src/validation/__tests__/validateObjectCreation.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validateParentExists.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateParentExists.test.d.ts","sourceRoot":"","sources":["../../../src/validation/__tests__/validateParentExists.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const models_1 = require("../../models");
4
+ const validateParentExists_1 = require("../validateParentExists");
5
+ const ValidationError_1 = require("../ValidationError");
6
+ const ValidationErrorCodes_1 = require("../ValidationErrorCodes");
7
+ describe("validateParentExists", () => {
8
+ let mockRepository;
9
+ beforeEach(() => {
10
+ mockRepository = {
11
+ getObjectById: jest.fn(),
12
+ getObjects: jest.fn(),
13
+ saveObject: jest.fn(),
14
+ deleteObject: jest.fn(),
15
+ };
16
+ jest.clearAllMocks();
17
+ });
18
+ it("should pass validation when no parent is specified", async () => {
19
+ await expect((0, validateParentExists_1.validateParentExists)(undefined, mockRepository)).resolves.toBeUndefined();
20
+ expect(mockRepository.getObjectById).not.toHaveBeenCalled();
21
+ });
22
+ it("should pass validation when parent exists", async () => {
23
+ const mockParentObject = {
24
+ id: "parent-123",
25
+ type: models_1.TrellisObjectType.PROJECT,
26
+ title: "Parent Project",
27
+ status: models_1.TrellisObjectStatus.OPEN,
28
+ priority: models_1.TrellisObjectPriority.MEDIUM,
29
+ prerequisites: [],
30
+ affectedFiles: new Map(),
31
+ log: [],
32
+ schema: "v1.0",
33
+ childrenIds: [],
34
+ body: "Parent project description",
35
+ };
36
+ mockRepository.getObjectById.mockResolvedValue(mockParentObject);
37
+ await expect((0, validateParentExists_1.validateParentExists)("parent-123", mockRepository)).resolves.toBeUndefined();
38
+ expect(mockRepository.getObjectById).toHaveBeenCalledWith("parent-123");
39
+ expect(mockRepository.getObjectById).toHaveBeenCalledTimes(1);
40
+ });
41
+ it("should throw ValidationError when parent does not exist", async () => {
42
+ mockRepository.getObjectById.mockResolvedValue(null);
43
+ await expect((0, validateParentExists_1.validateParentExists)("nonexistent-parent", mockRepository)).rejects.toThrow(ValidationError_1.ValidationError);
44
+ try {
45
+ await (0, validateParentExists_1.validateParentExists)("nonexistent-parent", mockRepository);
46
+ }
47
+ catch (error) {
48
+ expect(error).toBeInstanceOf(ValidationError_1.ValidationError);
49
+ const validationError = error;
50
+ expect(validationError.message).toBe("Parent object with ID 'nonexistent-parent' does not exist");
51
+ expect(validationError.code).toBe(ValidationErrorCodes_1.ValidationErrorCodes.PARENT_NOT_FOUND);
52
+ expect(validationError.field).toBe("parent");
53
+ }
54
+ expect(mockRepository.getObjectById).toHaveBeenCalledWith("nonexistent-parent");
55
+ expect(mockRepository.getObjectById).toHaveBeenCalledTimes(2); // Called twice due to expect and try/catch
56
+ });
57
+ it("should handle empty string as no parent", async () => {
58
+ await expect((0, validateParentExists_1.validateParentExists)("", mockRepository)).resolves.toBeUndefined();
59
+ expect(mockRepository.getObjectById).not.toHaveBeenCalled();
60
+ });
61
+ });
62
+ //# sourceMappingURL=validateParentExists.test.js.map