@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,229 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const models_1 = require("../../models");
4
+ const isRequiredForOtherObjects_1 = require("../isRequiredForOtherObjects");
5
+ // Mock repository implementation for testing
6
+ class MockRepository {
7
+ objects = new Map();
8
+ constructor(objects = []) {
9
+ objects.forEach((obj) => this.objects.set(obj.id, obj));
10
+ }
11
+ async getObjectById(id) {
12
+ return Promise.resolve(this.objects.get(id) || null);
13
+ }
14
+ async getObjects(_includeClosed) {
15
+ return Promise.resolve(Array.from(this.objects.values()));
16
+ }
17
+ async saveObject(trellisObject) {
18
+ this.objects.set(trellisObject.id, trellisObject);
19
+ return Promise.resolve();
20
+ }
21
+ async deleteObject(id) {
22
+ this.objects.delete(id);
23
+ return Promise.resolve();
24
+ }
25
+ }
26
+ describe("isRequiredForOtherObjects", () => {
27
+ const createMockObject = (id, status, prerequisites = []) => ({
28
+ id,
29
+ title: `Task ${id}`,
30
+ status,
31
+ priority: models_1.TrellisObjectPriority.MEDIUM,
32
+ prerequisites,
33
+ affectedFiles: new Map(),
34
+ log: [],
35
+ schema: "v1.0",
36
+ childrenIds: [],
37
+ body: `Body for ${id}`,
38
+ type: models_1.TrellisObjectType.TASK,
39
+ });
40
+ it("should return false when no other objects exist", async () => {
41
+ const object = createMockObject("task-1", models_1.TrellisObjectStatus.OPEN);
42
+ const repository = new MockRepository([object]);
43
+ const result = await (0, isRequiredForOtherObjects_1.isRequiredForOtherObjects)(object, repository);
44
+ expect(result).toBe(false);
45
+ });
46
+ it("should return false when no other objects have this object as prerequisite", async () => {
47
+ const object1 = createMockObject("task-1", models_1.TrellisObjectStatus.OPEN);
48
+ const object2 = createMockObject("task-2", models_1.TrellisObjectStatus.OPEN, [
49
+ "task-3",
50
+ ]);
51
+ const object3 = createMockObject("task-3", models_1.TrellisObjectStatus.DONE);
52
+ const repository = new MockRepository([object1, object2, object3]);
53
+ const result = await (0, isRequiredForOtherObjects_1.isRequiredForOtherObjects)(object1, repository);
54
+ expect(result).toBe(false);
55
+ });
56
+ it("should return true when an open object has this object as prerequisite", async () => {
57
+ const prerequisiteObject = createMockObject("prereq-1", models_1.TrellisObjectStatus.DONE);
58
+ const dependentObject = createMockObject("task-1", models_1.TrellisObjectStatus.OPEN, ["prereq-1"]);
59
+ const repository = new MockRepository([
60
+ prerequisiteObject,
61
+ dependentObject,
62
+ ]);
63
+ const result = await (0, isRequiredForOtherObjects_1.isRequiredForOtherObjects)(prerequisiteObject, repository);
64
+ expect(result).toBe(true);
65
+ });
66
+ it("should return true when an in-progress object has this object as prerequisite", async () => {
67
+ const prerequisiteObject = createMockObject("prereq-1", models_1.TrellisObjectStatus.DONE);
68
+ const dependentObject = createMockObject("task-1", models_1.TrellisObjectStatus.IN_PROGRESS, ["prereq-1"]);
69
+ const repository = new MockRepository([
70
+ prerequisiteObject,
71
+ dependentObject,
72
+ ]);
73
+ const result = await (0, isRequiredForOtherObjects_1.isRequiredForOtherObjects)(prerequisiteObject, repository);
74
+ expect(result).toBe(true);
75
+ });
76
+ it("should return true when a draft object has this object as prerequisite", async () => {
77
+ const prerequisiteObject = createMockObject("prereq-1", models_1.TrellisObjectStatus.DONE);
78
+ const dependentObject = createMockObject("task-1", models_1.TrellisObjectStatus.DRAFT, ["prereq-1"]);
79
+ const repository = new MockRepository([
80
+ prerequisiteObject,
81
+ dependentObject,
82
+ ]);
83
+ const result = await (0, isRequiredForOtherObjects_1.isRequiredForOtherObjects)(prerequisiteObject, repository);
84
+ expect(result).toBe(true);
85
+ });
86
+ it("should return false when only closed objects have this object as prerequisite", async () => {
87
+ const prerequisiteObject = createMockObject("prereq-1", models_1.TrellisObjectStatus.DONE);
88
+ const doneObject = createMockObject("task-1", models_1.TrellisObjectStatus.DONE, [
89
+ "prereq-1",
90
+ ]);
91
+ const wontDoObject = createMockObject("task-2", models_1.TrellisObjectStatus.WONT_DO, ["prereq-1"]);
92
+ const repository = new MockRepository([
93
+ prerequisiteObject,
94
+ doneObject,
95
+ wontDoObject,
96
+ ]);
97
+ const result = await (0, isRequiredForOtherObjects_1.isRequiredForOtherObjects)(prerequisiteObject, repository);
98
+ expect(result).toBe(false);
99
+ });
100
+ it("should return true when mix of closed and non-closed objects have this object as prerequisite", async () => {
101
+ const prerequisiteObject = createMockObject("prereq-1", models_1.TrellisObjectStatus.DONE);
102
+ const doneObject = createMockObject("task-1", models_1.TrellisObjectStatus.DONE, [
103
+ "prereq-1",
104
+ ]);
105
+ const openObject = createMockObject("task-2", models_1.TrellisObjectStatus.OPEN, [
106
+ "prereq-1",
107
+ ]);
108
+ const repository = new MockRepository([
109
+ prerequisiteObject,
110
+ doneObject,
111
+ openObject,
112
+ ]);
113
+ const result = await (0, isRequiredForOtherObjects_1.isRequiredForOtherObjects)(prerequisiteObject, repository);
114
+ expect(result).toBe(true);
115
+ });
116
+ it("should handle multiple objects requiring the same object", async () => {
117
+ const prerequisiteObject = createMockObject("prereq-1", models_1.TrellisObjectStatus.DONE);
118
+ const openObject1 = createMockObject("task-1", models_1.TrellisObjectStatus.OPEN, [
119
+ "prereq-1",
120
+ ]);
121
+ const openObject2 = createMockObject("task-2", models_1.TrellisObjectStatus.OPEN, [
122
+ "prereq-1",
123
+ ]);
124
+ const repository = new MockRepository([
125
+ prerequisiteObject,
126
+ openObject1,
127
+ openObject2,
128
+ ]);
129
+ const result = await (0, isRequiredForOtherObjects_1.isRequiredForOtherObjects)(prerequisiteObject, repository);
130
+ expect(result).toBe(true);
131
+ });
132
+ it("should handle objects with multiple prerequisites where target is one of them", async () => {
133
+ const prerequisiteObject = createMockObject("prereq-1", models_1.TrellisObjectStatus.DONE);
134
+ const otherPrereq = createMockObject("prereq-2", models_1.TrellisObjectStatus.DONE);
135
+ const dependentObject = createMockObject("task-1", models_1.TrellisObjectStatus.OPEN, ["prereq-1", "prereq-2", "prereq-3"]);
136
+ const repository = new MockRepository([
137
+ prerequisiteObject,
138
+ otherPrereq,
139
+ dependentObject,
140
+ ]);
141
+ const result = await (0, isRequiredForOtherObjects_1.isRequiredForOtherObjects)(prerequisiteObject, repository);
142
+ expect(result).toBe(true);
143
+ });
144
+ it("should not consider the object itself as a dependent", async () => {
145
+ const object = createMockObject("task-1", models_1.TrellisObjectStatus.OPEN, [
146
+ "task-1",
147
+ ]); // Self-referencing prerequisites (edge case)
148
+ const repository = new MockRepository([object]);
149
+ const result = await (0, isRequiredForOtherObjects_1.isRequiredForOtherObjects)(object, repository);
150
+ expect(result).toBe(false);
151
+ });
152
+ it("should handle empty repository", async () => {
153
+ const object = createMockObject("task-1", models_1.TrellisObjectStatus.OPEN);
154
+ const repository = new MockRepository([]);
155
+ const result = await (0, isRequiredForOtherObjects_1.isRequiredForOtherObjects)(object, repository);
156
+ expect(result).toBe(false);
157
+ });
158
+ it("should work with different object types", async () => {
159
+ const prerequisiteProject = {
160
+ ...createMockObject("proj-1", models_1.TrellisObjectStatus.DONE),
161
+ type: models_1.TrellisObjectType.PROJECT,
162
+ };
163
+ const dependentEpic = {
164
+ ...createMockObject("epic-1", models_1.TrellisObjectStatus.OPEN, ["proj-1"]),
165
+ type: models_1.TrellisObjectType.EPIC,
166
+ };
167
+ const repository = new MockRepository([prerequisiteProject, dependentEpic]);
168
+ const result = await (0, isRequiredForOtherObjects_1.isRequiredForOtherObjects)(prerequisiteProject, repository);
169
+ expect(result).toBe(true);
170
+ });
171
+ it("should handle repository errors gracefully", async () => {
172
+ const object = createMockObject("task-1", models_1.TrellisObjectStatus.OPEN);
173
+ // Mock repository that throws an error
174
+ const mockRepository = {
175
+ getObjectById: jest.fn(),
176
+ getObjects: jest.fn().mockRejectedValue(new Error("Repository error")),
177
+ saveObject: jest.fn(),
178
+ deleteObject: jest.fn(),
179
+ };
180
+ await expect((0, isRequiredForOtherObjects_1.isRequiredForOtherObjects)(object, mockRepository)).rejects.toThrow("Repository error");
181
+ });
182
+ it("should work regardless of the target object's status", async () => {
183
+ const prerequisiteObject = createMockObject("prereq-1", models_1.TrellisObjectStatus.OPEN);
184
+ const dependentObject = createMockObject("task-1", models_1.TrellisObjectStatus.IN_PROGRESS, ["prereq-1"]);
185
+ const repository = new MockRepository([
186
+ prerequisiteObject,
187
+ dependentObject,
188
+ ]);
189
+ const result = await (0, isRequiredForOtherObjects_1.isRequiredForOtherObjects)(prerequisiteObject, repository);
190
+ expect(result).toBe(true);
191
+ });
192
+ it("should handle complex scenario with multiple objects and statuses", async () => {
193
+ const prereq1 = createMockObject("prereq-1", models_1.TrellisObjectStatus.DONE);
194
+ const prereq2 = createMockObject("prereq-2", models_1.TrellisObjectStatus.OPEN);
195
+ // Objects that depend on prereq-1
196
+ const doneTask = createMockObject("task-1", models_1.TrellisObjectStatus.DONE, [
197
+ "prereq-1",
198
+ ]);
199
+ const wontDoTask = createMockObject("task-2", models_1.TrellisObjectStatus.WONT_DO, [
200
+ "prereq-1",
201
+ ]);
202
+ const openTask = createMockObject("task-3", models_1.TrellisObjectStatus.OPEN, [
203
+ "prereq-1",
204
+ ]);
205
+ // Object that depends on prereq-2
206
+ const inProgressTask = createMockObject("task-4", models_1.TrellisObjectStatus.IN_PROGRESS, ["prereq-2"]);
207
+ // Object with no dependencies
208
+ const independentTask = createMockObject("task-5", models_1.TrellisObjectStatus.OPEN);
209
+ const repository = new MockRepository([
210
+ prereq1,
211
+ prereq2,
212
+ doneTask,
213
+ wontDoTask,
214
+ openTask,
215
+ inProgressTask,
216
+ independentTask,
217
+ ]);
218
+ // prereq-1 should be required because openTask depends on it and is not closed
219
+ const result1 = await (0, isRequiredForOtherObjects_1.isRequiredForOtherObjects)(prereq1, repository);
220
+ expect(result1).toBe(true);
221
+ // prereq-2 should be required because inProgressTask depends on it and is not closed
222
+ const result2 = await (0, isRequiredForOtherObjects_1.isRequiredForOtherObjects)(prereq2, repository);
223
+ expect(result2).toBe(true);
224
+ // independentTask should not be required by anyone
225
+ const result3 = await (0, isRequiredForOtherObjects_1.isRequiredForOtherObjects)(independentTask, repository);
226
+ expect(result3).toBe(false);
227
+ });
228
+ });
229
+ //# sourceMappingURL=isRequiredForOtherObjects.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isRequiredForOtherObjects.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/isRequiredForOtherObjects.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=serializationRoundTrip.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializationRoundTrip.test.d.ts","sourceRoot":"","sources":["../../../src/utils/__tests__/serializationRoundTrip.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,389 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const models_1 = require("../../models");
4
+ const deserializeTrellisObject_1 = require("../deserializeTrellisObject");
5
+ const serializeTrellisObject_1 = require("../serializeTrellisObject");
6
+ describe("TrellisObject Serialization/Deserialization Integration Tests", () => {
7
+ describe("Round-trip serialization compatibility", () => {
8
+ it("should handle basic TrellisObject round-trip", () => {
9
+ const original = {
10
+ id: "T-basic-test",
11
+ title: "Basic Test Task",
12
+ status: models_1.TrellisObjectStatus.OPEN,
13
+ priority: models_1.TrellisObjectPriority.MEDIUM,
14
+ prerequisites: ["prereq-1", "prereq-2"],
15
+ affectedFiles: new Map([
16
+ ["src/component.ts", "modified"],
17
+ ["tests/component.test.ts", "created"],
18
+ ]),
19
+ log: ["Initial commit", "Added tests"],
20
+ schema: "v1.0",
21
+ childrenIds: ["child-1"],
22
+ body: "Basic task description",
23
+ type: models_1.TrellisObjectType.TASK,
24
+ };
25
+ const serialized = (0, serializeTrellisObject_1.serializeTrellisObject)(original);
26
+ const deserialized = (0, deserializeTrellisObject_1.deserializeTrellisObject)(serialized);
27
+ expect(deserialized).toEqual(original);
28
+ });
29
+ it("should handle complex multi-line content round-trip", () => {
30
+ const complexBody = `# Complex Task
31
+
32
+ This task involves multiple steps:
33
+
34
+ ## Prerequisites
35
+ - Set up environment
36
+ - Install dependencies
37
+
38
+ ## Implementation Steps
39
+
40
+ 1. Create the main component
41
+ 2. Add unit tests
42
+ 3. Update documentation
43
+
44
+ \`\`\`typescript
45
+ interface Example {
46
+ name: string;
47
+ value: number;
48
+ }
49
+ \`\`\`
50
+
51
+ ## Notes
52
+
53
+ > **Important**: This requires careful attention to detail.
54
+
55
+ ### Edge Cases
56
+ - Handle empty inputs
57
+ - Validate user permissions
58
+ - Graceful error handling
59
+
60
+ ---
61
+
62
+ Additional section with --- delimiters for testing.`;
63
+ const original = {
64
+ id: "T-complex-content-test",
65
+ title: 'Complex Content Test with "quotes" and symbols: @#$%',
66
+ status: models_1.TrellisObjectStatus.IN_PROGRESS,
67
+ priority: models_1.TrellisObjectPriority.HIGH,
68
+ prerequisites: [
69
+ "setup environment",
70
+ 'install deps with "quotes"',
71
+ "config: with: colons",
72
+ ],
73
+ affectedFiles: new Map([
74
+ ["src/complex file name.ts", "created"],
75
+ ["docs/README.md", "updated"],
76
+ ["config/settings.json", "modified"],
77
+ ["tests/integration/complex.test.ts", "created"],
78
+ ]),
79
+ log: [
80
+ "Initial implementation",
81
+ "Multi-line commit message:\n- Added feature A\n- Fixed bug B\n- Updated docs",
82
+ "Code review feedback:\n\n> Reviewer comments:\n> - Good implementation\n> - Consider edge cases",
83
+ 'Final commit with special chars: "quotes" and symbols @#$%',
84
+ ],
85
+ schema: "v2.1-beta",
86
+ childrenIds: ["subtask-1", "subtask-2", "cleanup-task"],
87
+ body: complexBody,
88
+ type: models_1.TrellisObjectType.TASK,
89
+ };
90
+ const serialized = (0, serializeTrellisObject_1.serializeTrellisObject)(original);
91
+ const deserialized = (0, deserializeTrellisObject_1.deserializeTrellisObject)(serialized);
92
+ expect(deserialized).toEqual(original);
93
+ });
94
+ it("should handle empty collections round-trip", () => {
95
+ const original = {
96
+ id: "T-empty-collections-test",
97
+ title: "Empty Collections Test",
98
+ status: models_1.TrellisObjectStatus.DRAFT,
99
+ priority: models_1.TrellisObjectPriority.LOW,
100
+ prerequisites: [],
101
+ affectedFiles: new Map(),
102
+ log: [],
103
+ schema: "v1.0",
104
+ childrenIds: [],
105
+ body: "",
106
+ type: models_1.TrellisObjectType.TASK,
107
+ };
108
+ const serialized = (0, serializeTrellisObject_1.serializeTrellisObject)(original);
109
+ const deserialized = (0, deserializeTrellisObject_1.deserializeTrellisObject)(serialized);
110
+ expect(deserialized).toEqual(original);
111
+ });
112
+ it("should handle special characters and unicode round-trip", () => {
113
+ const original = {
114
+ id: "T-unicode-test-🚀",
115
+ title: "Unicode Test: 你好世界 🌍 émojis & spëcial chars",
116
+ status: models_1.TrellisObjectStatus.OPEN,
117
+ priority: models_1.TrellisObjectPriority.MEDIUM,
118
+ prerequisites: [
119
+ "Setup with émojis 🔧",
120
+ "Config files: ~/.bashrc",
121
+ 'Path with spaces and "quotes"',
122
+ ],
123
+ affectedFiles: new Map([
124
+ ["src/émoji-component.ts", "créated"],
125
+ ["docs/中文文档.md", "updated"],
126
+ ["files/with spaces & symbols.json", "modified"],
127
+ ]),
128
+ log: [
129
+ "Added unicode support 🎉",
130
+ "Fixed encoding issues:\n- UTF-8 properly handled\n- Special chars: àáâãäåæç",
131
+ "Emoji support: 😀😃😄😁😆😅🤣😂",
132
+ ],
133
+ schema: "v1.0",
134
+ childrenIds: ["子任务-1", "tâche-2"],
135
+ body: `# Unicode Support Test
136
+
137
+ This task tests unicode and special character handling.
138
+
139
+ ## Examples:
140
+ - Chinese: 你好世界
141
+ - French: Bonjour le monde
142
+ - Spanish: Hola mundo
143
+ - Emojis: 🚀🌟💫⭐🎯
144
+
145
+ ### Code Example:
146
+ \`\`\`javascript
147
+ const greeting = "Hello 世界! 🌍";
148
+ console.log(greeting);
149
+ \`\`\`
150
+
151
+ > Note: All unicode characters should be preserved.`,
152
+ type: models_1.TrellisObjectType.TASK,
153
+ };
154
+ const serialized = (0, serializeTrellisObject_1.serializeTrellisObject)(original);
155
+ const deserialized = (0, deserializeTrellisObject_1.deserializeTrellisObject)(serialized);
156
+ expect(deserialized).toEqual(original);
157
+ });
158
+ it("should handle body content with YAML-like structure round-trip", () => {
159
+ const yamlLikeBody = `# Task with YAML-like content
160
+
161
+ This task contains content that might confuse the parser:
162
+
163
+ \`\`\`yaml
164
+ ---
165
+ config:
166
+ name: example
167
+ values:
168
+ - item1
169
+ - item2
170
+ ---
171
+ \`\`\`
172
+
173
+ ## Configuration Example
174
+
175
+ \`\`\`
176
+ key: value
177
+ list:
178
+ - first
179
+ - second
180
+ nested:
181
+ deep:
182
+ property: "value with --- markers"
183
+ \`\`\`
184
+
185
+ ---
186
+
187
+ This section starts with --- which could be problematic.
188
+
189
+ ### More content after ---
190
+
191
+ The parser should handle all of this correctly.`;
192
+ const original = {
193
+ id: "T-yaml-body-test",
194
+ title: "YAML Body Content Test",
195
+ status: models_1.TrellisObjectStatus.OPEN,
196
+ priority: models_1.TrellisObjectPriority.HIGH,
197
+ prerequisites: ["yaml-parser-setup"],
198
+ affectedFiles: new Map([["config/app.yaml", "created"]]),
199
+ log: ["Added YAML config support"],
200
+ schema: "v1.0",
201
+ childrenIds: [],
202
+ body: yamlLikeBody,
203
+ type: models_1.TrellisObjectType.TASK,
204
+ };
205
+ const serialized = (0, serializeTrellisObject_1.serializeTrellisObject)(original);
206
+ const deserialized = (0, deserializeTrellisObject_1.deserializeTrellisObject)(serialized);
207
+ expect(deserialized).toEqual(original);
208
+ });
209
+ it("should handle very large content round-trip", () => {
210
+ // Create large arrays and content to test performance and memory handling
211
+ const largePrerequistes = Array.from({ length: 100 }, (_, i) => `prerequisite-${i}`);
212
+ const largeLog = Array.from({ length: 50 }, (_, i) => `Log entry ${i}:\nThis is a multi-line log entry\nwith detailed information\nabout step ${i}`);
213
+ const largeChildrenIds = Array.from({ length: 200 }, (_, i) => `child-task-${i}`);
214
+ const largeAffectedFiles = new Map();
215
+ for (let i = 0; i < 150; i++) {
216
+ largeAffectedFiles.set(`src/component-${i}.ts`, i % 3 === 0 ? "created" : i % 3 === 1 ? "modified" : "deleted");
217
+ }
218
+ const largeBody = `# Large Content Test
219
+
220
+ ${"This is a large body content section that repeats many times. ".repeat(500)}
221
+
222
+ ## Large Section
223
+
224
+ ${"Another section with repeated content for testing serialization performance. ".repeat(300)}
225
+
226
+ ### Code Blocks
227
+
228
+ \`\`\`typescript
229
+ ${Array.from({ length: 50 }, (_, i) => `const variable${i} = "value${i}";`).join("\n")}
230
+ \`\`\`
231
+
232
+ ## Final Notes
233
+
234
+ ${"Final section content repeated multiple times to test large content handling. ".repeat(200)}`;
235
+ const original = {
236
+ id: "T-large-content-test",
237
+ title: "Large Content Performance Test",
238
+ status: models_1.TrellisObjectStatus.OPEN,
239
+ priority: models_1.TrellisObjectPriority.LOW,
240
+ prerequisites: largePrerequistes,
241
+ affectedFiles: largeAffectedFiles,
242
+ log: largeLog,
243
+ schema: "v1.0",
244
+ childrenIds: largeChildrenIds,
245
+ body: largeBody,
246
+ type: models_1.TrellisObjectType.TASK,
247
+ };
248
+ const serialized = (0, serializeTrellisObject_1.serializeTrellisObject)(original);
249
+ const deserialized = (0, deserializeTrellisObject_1.deserializeTrellisObject)(serialized);
250
+ expect(deserialized).toEqual(original);
251
+ });
252
+ it("should maintain Map order and exact string content", () => {
253
+ const original = {
254
+ id: "T-map-order-test",
255
+ title: "Map Order Preservation Test",
256
+ status: models_1.TrellisObjectStatus.OPEN,
257
+ priority: models_1.TrellisObjectPriority.MEDIUM,
258
+ prerequisites: ["first-prereq", "second-prereq", "third-prereq"],
259
+ affectedFiles: new Map([
260
+ ["z-last-file.ts", "created"],
261
+ ["a-first-file.ts", "modified"],
262
+ ["m-middle-file.ts", "deleted"],
263
+ ["1-numeric-start.ts", "created"],
264
+ ["special@file#name.ts", "modified"],
265
+ ]),
266
+ log: [
267
+ "First log entry",
268
+ "Second log with\nmultiple\nlines",
269
+ "Third log entry",
270
+ ],
271
+ schema: "v1.0",
272
+ childrenIds: ["z-child", "a-child", "m-child"],
273
+ body: "Test body content",
274
+ type: models_1.TrellisObjectType.TASK,
275
+ };
276
+ const serialized = (0, serializeTrellisObject_1.serializeTrellisObject)(original);
277
+ const deserialized = (0, deserializeTrellisObject_1.deserializeTrellisObject)(serialized);
278
+ // Check that the Map maintains the same entries
279
+ expect(deserialized.affectedFiles.size).toBe(original.affectedFiles.size);
280
+ // Check each entry individually
281
+ for (const [key, value] of original.affectedFiles) {
282
+ expect(deserialized.affectedFiles.get(key)).toBe(value);
283
+ }
284
+ // Verify complete equality
285
+ expect(deserialized).toEqual(original);
286
+ });
287
+ });
288
+ describe("Serialization format validation", () => {
289
+ it("should produce valid YAML frontmatter structure", () => {
290
+ const original = {
291
+ id: "F-format-test",
292
+ title: "Format Validation Test",
293
+ status: models_1.TrellisObjectStatus.OPEN,
294
+ priority: models_1.TrellisObjectPriority.HIGH,
295
+ prerequisites: ["test-setup"],
296
+ affectedFiles: new Map([["test.ts", "created"]]),
297
+ log: ["Format test"],
298
+ schema: "v1.0",
299
+ childrenIds: ["format-child"],
300
+ body: "Format validation body",
301
+ type: models_1.TrellisObjectType.FEATURE,
302
+ };
303
+ const serialized = (0, serializeTrellisObject_1.serializeTrellisObject)(original);
304
+ // Check overall structure
305
+ expect(serialized).toMatch(/^---\n[\s\S]+\n---\n\nFormat validation body$/);
306
+ // Verify it can be deserialized
307
+ const deserialized = (0, deserializeTrellisObject_1.deserializeTrellisObject)(serialized);
308
+ expect(deserialized).toEqual(original);
309
+ });
310
+ it("should handle edge case: body starting with ---", () => {
311
+ const original = {
312
+ id: "E-edge-case-test",
313
+ title: "Edge Case Test",
314
+ status: models_1.TrellisObjectStatus.OPEN,
315
+ priority: models_1.TrellisObjectPriority.MEDIUM,
316
+ prerequisites: [],
317
+ affectedFiles: new Map(),
318
+ log: [],
319
+ schema: "v1.0",
320
+ childrenIds: [],
321
+ body: "---\nThis body starts with --- which is tricky\n---\nAnd has more --- markers",
322
+ type: models_1.TrellisObjectType.EPIC,
323
+ };
324
+ const serialized = (0, serializeTrellisObject_1.serializeTrellisObject)(original);
325
+ const deserialized = (0, deserializeTrellisObject_1.deserializeTrellisObject)(serialized);
326
+ expect(deserialized).toEqual(original);
327
+ });
328
+ });
329
+ describe("Cross-validation with multiple objects", () => {
330
+ it("should handle multiple different objects in sequence", () => {
331
+ const objects = [
332
+ {
333
+ id: "T-seq-1",
334
+ title: "First Object",
335
+ status: models_1.TrellisObjectStatus.DONE,
336
+ priority: models_1.TrellisObjectPriority.LOW,
337
+ prerequisites: [],
338
+ affectedFiles: new Map([["file1.ts", "created"]]),
339
+ log: ["First object log"],
340
+ schema: "v1.0",
341
+ childrenIds: [],
342
+ body: "First body",
343
+ type: models_1.TrellisObjectType.TASK,
344
+ },
345
+ {
346
+ id: "P-seq-2",
347
+ title: "Second Object",
348
+ status: models_1.TrellisObjectStatus.IN_PROGRESS,
349
+ priority: models_1.TrellisObjectPriority.HIGH,
350
+ prerequisites: ["T-seq-1"],
351
+ affectedFiles: new Map([
352
+ ["file1.ts", "modified"],
353
+ ["file2.ts", "created"],
354
+ ]),
355
+ log: [
356
+ "Started second object",
357
+ "Multi-line log:\nwith details\nand more info",
358
+ ],
359
+ schema: "v2.0",
360
+ childrenIds: ["seq-2-child"],
361
+ body: "# Second Object\n\nMore complex content.",
362
+ type: models_1.TrellisObjectType.PROJECT,
363
+ },
364
+ {
365
+ id: "F-seq-3",
366
+ title: 'Third Object with "quotes"',
367
+ status: models_1.TrellisObjectStatus.OPEN,
368
+ priority: models_1.TrellisObjectPriority.MEDIUM,
369
+ prerequisites: ["T-seq-1", "P-seq-2"],
370
+ affectedFiles: new Map(),
371
+ log: [],
372
+ schema: "v1.5",
373
+ childrenIds: ["seq-3a", "seq-3b"],
374
+ body: "",
375
+ type: models_1.TrellisObjectType.FEATURE,
376
+ },
377
+ ];
378
+ // Serialize all objects
379
+ const serializedObjects = objects.map((obj) => (0, serializeTrellisObject_1.serializeTrellisObject)(obj));
380
+ // Deserialize all objects
381
+ const deserializedObjects = serializedObjects.map((str) => (0, deserializeTrellisObject_1.deserializeTrellisObject)(str));
382
+ // Verify each object matches the original
383
+ deserializedObjects.forEach((deserialized, index) => {
384
+ expect(deserialized).toEqual(objects[index]);
385
+ });
386
+ });
387
+ });
388
+ });
389
+ //# sourceMappingURL=serializationRoundTrip.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializationRoundTrip.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/serializationRoundTrip.test.ts"],"names":[],"mappings":";;AAAA,yCAKsB;AACtB,0EAAuE;AACvE,sEAAmE;AAEnE,QAAQ,CAAC,+DAA+D,EAAE,GAAG,EAAE;IAC7E,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACtD,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,QAAQ,GAAkB;gBAC9B,EAAE,EAAE,cAAc;gBAClB,KAAK,EAAE,iBAAiB;gBACxB,MAAM,EAAE,4BAAmB,CAAC,IAAI;gBAChC,QAAQ,EAAE,8BAAqB,CAAC,MAAM;gBACtC,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;gBACvC,aAAa,EAAE,IAAI,GAAG,CAAC;oBACrB,CAAC,kBAAkB,EAAE,UAAU,CAAC;oBAChC,CAAC,yBAAyB,EAAE,SAAS,CAAC;iBACvC,CAAC;gBACF,GAAG,EAAE,CAAC,gBAAgB,EAAE,aAAa,CAAC;gBACtC,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,CAAC,SAAS,CAAC;gBACxB,IAAI,EAAE,wBAAwB;gBAC9B,IAAI,EAAE,0BAAiB,CAAC,IAAI;aAC7B,CAAC;YAEF,MAAM,UAAU,GAAG,IAAA,+CAAsB,EAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,YAAY,GAAG,IAAA,mDAAwB,EAAC,UAAU,CAAC,CAAC;YAE1D,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oDAgC0B,CAAC;YAE/C,MAAM,QAAQ,GAAkB;gBAC9B,EAAE,EAAE,wBAAwB;gBAC5B,KAAK,EAAE,sDAAsD;gBAC7D,MAAM,EAAE,4BAAmB,CAAC,WAAW;gBACvC,QAAQ,EAAE,8BAAqB,CAAC,IAAI;gBACpC,aAAa,EAAE;oBACb,mBAAmB;oBACnB,4BAA4B;oBAC5B,sBAAsB;iBACvB;gBACD,aAAa,EAAE,IAAI,GAAG,CAAC;oBACrB,CAAC,0BAA0B,EAAE,SAAS,CAAC;oBACvC,CAAC,gBAAgB,EAAE,SAAS,CAAC;oBAC7B,CAAC,sBAAsB,EAAE,UAAU,CAAC;oBACpC,CAAC,mCAAmC,EAAE,SAAS,CAAC;iBACjD,CAAC;gBACF,GAAG,EAAE;oBACH,wBAAwB;oBACxB,8EAA8E;oBAC9E,iGAAiG;oBACjG,4DAA4D;iBAC7D;gBACD,MAAM,EAAE,WAAW;gBACnB,WAAW,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,cAAc,CAAC;gBACvD,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,0BAAiB,CAAC,IAAI;aAC7B,CAAC;YAEF,MAAM,UAAU,GAAG,IAAA,+CAAsB,EAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,YAAY,GAAG,IAAA,mDAAwB,EAAC,UAAU,CAAC,CAAC;YAE1D,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,QAAQ,GAAkB;gBAC9B,EAAE,EAAE,0BAA0B;gBAC9B,KAAK,EAAE,wBAAwB;gBAC/B,MAAM,EAAE,4BAAmB,CAAC,KAAK;gBACjC,QAAQ,EAAE,8BAAqB,CAAC,GAAG;gBACnC,aAAa,EAAE,EAAE;gBACjB,aAAa,EAAE,IAAI,GAAG,EAAE;gBACxB,GAAG,EAAE,EAAE;gBACP,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,EAAE;gBACf,IAAI,EAAE,EAAE;gBACR,IAAI,EAAE,0BAAiB,CAAC,IAAI;aAC7B,CAAC;YAEF,MAAM,UAAU,GAAG,IAAA,+CAAsB,EAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,YAAY,GAAG,IAAA,mDAAwB,EAAC,UAAU,CAAC,CAAC;YAE1D,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,MAAM,QAAQ,GAAkB;gBAC9B,EAAE,EAAE,mBAAmB;gBACvB,KAAK,EAAE,8CAA8C;gBACrD,MAAM,EAAE,4BAAmB,CAAC,IAAI;gBAChC,QAAQ,EAAE,8BAAqB,CAAC,MAAM;gBACtC,aAAa,EAAE;oBACb,sBAAsB;oBACtB,yBAAyB;oBACzB,+BAA+B;iBAChC;gBACD,aAAa,EAAE,IAAI,GAAG,CAAC;oBACrB,CAAC,wBAAwB,EAAE,SAAS,CAAC;oBACrC,CAAC,cAAc,EAAE,SAAS,CAAC;oBAC3B,CAAC,kCAAkC,EAAE,UAAU,CAAC;iBACjD,CAAC;gBACF,GAAG,EAAE;oBACH,0BAA0B;oBAC1B,6EAA6E;oBAC7E,iCAAiC;iBAClC;gBACD,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;gBACjC,IAAI,EAAE;;;;;;;;;;;;;;;;oDAgBsC;gBAC5C,IAAI,EAAE,0BAAiB,CAAC,IAAI;aAC7B,CAAC;YAEF,MAAM,UAAU,GAAG,IAAA,+CAAsB,EAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,YAAY,GAAG,IAAA,mDAAwB,EAAC,UAAU,CAAC,CAAC;YAE1D,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;YACxE,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gDAgCqB,CAAC;YAE3C,MAAM,QAAQ,GAAkB;gBAC9B,EAAE,EAAE,kBAAkB;gBACtB,KAAK,EAAE,wBAAwB;gBAC/B,MAAM,EAAE,4BAAmB,CAAC,IAAI;gBAChC,QAAQ,EAAE,8BAAqB,CAAC,IAAI;gBACpC,aAAa,EAAE,CAAC,mBAAmB,CAAC;gBACpC,aAAa,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC,CAAC;gBACxD,GAAG,EAAE,CAAC,2BAA2B,CAAC;gBAClC,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,EAAE;gBACf,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,0BAAiB,CAAC,IAAI;aAC7B,CAAC;YAEF,MAAM,UAAU,GAAG,IAAA,+CAAsB,EAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,YAAY,GAAG,IAAA,mDAAwB,EAAC,UAAU,CAAC,CAAC;YAE1D,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,0EAA0E;YAC1E,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAClC,EAAE,MAAM,EAAE,GAAG,EAAE,EACf,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAC9B,CAAC;YACF,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CACzB,EAAE,MAAM,EAAE,EAAE,EAAE,EACd,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,aAAa,CAAC,4EAA4E,CAAC,EAAE,CAChG,CAAC;YACF,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CACjC,EAAE,MAAM,EAAE,GAAG,EAAE,EACf,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,CAC5B,CAAC;YAEF,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;YACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7B,kBAAkB,CAAC,GAAG,CACpB,iBAAiB,CAAC,KAAK,EACvB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAC/D,CAAC;YACJ,CAAC;YAED,MAAM,SAAS,GAAG;;EAEtB,gEAAgE,CAAC,MAAM,CAAC,GAAG,CAAC;;;;EAI5E,+EAA+E,CAAC,MAAM,CAAC,GAAG,CAAC;;;;;EAK3F,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;EAKpF,gFAAgF,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAE3F,MAAM,QAAQ,GAAkB;gBAC9B,EAAE,EAAE,sBAAsB;gBAC1B,KAAK,EAAE,gCAAgC;gBACvC,MAAM,EAAE,4BAAmB,CAAC,IAAI;gBAChC,QAAQ,EAAE,8BAAqB,CAAC,GAAG;gBACnC,aAAa,EAAE,iBAAiB;gBAChC,aAAa,EAAE,kBAAkB;gBACjC,GAAG,EAAE,QAAQ;gBACb,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,gBAAgB;gBAC7B,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,0BAAiB,CAAC,IAAI;aAC7B,CAAC;YAEF,MAAM,UAAU,GAAG,IAAA,+CAAsB,EAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,YAAY,GAAG,IAAA,mDAAwB,EAAC,UAAU,CAAC,CAAC;YAE1D,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,QAAQ,GAAkB;gBAC9B,EAAE,EAAE,kBAAkB;gBACtB,KAAK,EAAE,6BAA6B;gBACpC,MAAM,EAAE,4BAAmB,CAAC,IAAI;gBAChC,QAAQ,EAAE,8BAAqB,CAAC,MAAM;gBACtC,aAAa,EAAE,CAAC,cAAc,EAAE,eAAe,EAAE,cAAc,CAAC;gBAChE,aAAa,EAAE,IAAI,GAAG,CAAC;oBACrB,CAAC,gBAAgB,EAAE,SAAS,CAAC;oBAC7B,CAAC,iBAAiB,EAAE,UAAU,CAAC;oBAC/B,CAAC,kBAAkB,EAAE,SAAS,CAAC;oBAC/B,CAAC,oBAAoB,EAAE,SAAS,CAAC;oBACjC,CAAC,sBAAsB,EAAE,UAAU,CAAC;iBACrC,CAAC;gBACF,GAAG,EAAE;oBACH,iBAAiB;oBACjB,kCAAkC;oBAClC,iBAAiB;iBAClB;gBACD,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;gBAC9C,IAAI,EAAE,mBAAmB;gBACzB,IAAI,EAAE,0BAAiB,CAAC,IAAI;aAC7B,CAAC;YAEF,MAAM,UAAU,GAAG,IAAA,+CAAsB,EAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,YAAY,GAAG,IAAA,mDAAwB,EAAC,UAAU,CAAC,CAAC;YAE1D,gDAAgD;YAChD,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAE1E,gCAAgC;YAChC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;gBAClD,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1D,CAAC;YAED,2BAA2B;YAC3B,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC/C,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,QAAQ,GAAkB;gBAC9B,EAAE,EAAE,eAAe;gBACnB,KAAK,EAAE,wBAAwB;gBAC/B,MAAM,EAAE,4BAAmB,CAAC,IAAI;gBAChC,QAAQ,EAAE,8BAAqB,CAAC,IAAI;gBACpC,aAAa,EAAE,CAAC,YAAY,CAAC;gBAC7B,aAAa,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;gBAChD,GAAG,EAAE,CAAC,aAAa,CAAC;gBACpB,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,IAAI,EAAE,wBAAwB;gBAC9B,IAAI,EAAE,0BAAiB,CAAC,OAAO;aAChC,CAAC;YAEF,MAAM,UAAU,GAAG,IAAA,+CAAsB,EAAC,QAAQ,CAAC,CAAC;YAEpD,0BAA0B;YAC1B,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CACxB,+CAA+C,CAChD,CAAC;YAEF,gCAAgC;YAChC,MAAM,YAAY,GAAG,IAAA,mDAAwB,EAAC,UAAU,CAAC,CAAC;YAC1D,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,QAAQ,GAAkB;gBAC9B,EAAE,EAAE,kBAAkB;gBACtB,KAAK,EAAE,gBAAgB;gBACvB,MAAM,EAAE,4BAAmB,CAAC,IAAI;gBAChC,QAAQ,EAAE,8BAAqB,CAAC,MAAM;gBACtC,aAAa,EAAE,EAAE;gBACjB,aAAa,EAAE,IAAI,GAAG,EAAE;gBACxB,GAAG,EAAE,EAAE;gBACP,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,EAAE;gBACf,IAAI,EAAE,+EAA+E;gBACrF,IAAI,EAAE,0BAAiB,CAAC,IAAI;aAC7B,CAAC;YAEF,MAAM,UAAU,GAAG,IAAA,+CAAsB,EAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,YAAY,GAAG,IAAA,mDAAwB,EAAC,UAAU,CAAC,CAAC;YAE1D,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACtD,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,OAAO,GAAoB;gBAC/B;oBACE,EAAE,EAAE,SAAS;oBACb,KAAK,EAAE,cAAc;oBACrB,MAAM,EAAE,4BAAmB,CAAC,IAAI;oBAChC,QAAQ,EAAE,8BAAqB,CAAC,GAAG;oBACnC,aAAa,EAAE,EAAE;oBACjB,aAAa,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;oBACjD,GAAG,EAAE,CAAC,kBAAkB,CAAC;oBACzB,MAAM,EAAE,MAAM;oBACd,WAAW,EAAE,EAAE;oBACf,IAAI,EAAE,YAAY;oBAClB,IAAI,EAAE,0BAAiB,CAAC,IAAI;iBAC7B;gBACD;oBACE,EAAE,EAAE,SAAS;oBACb,KAAK,EAAE,eAAe;oBACtB,MAAM,EAAE,4BAAmB,CAAC,WAAW;oBACvC,QAAQ,EAAE,8BAAqB,CAAC,IAAI;oBACpC,aAAa,EAAE,CAAC,SAAS,CAAC;oBAC1B,aAAa,EAAE,IAAI,GAAG,CAAC;wBACrB,CAAC,UAAU,EAAE,UAAU,CAAC;wBACxB,CAAC,UAAU,EAAE,SAAS,CAAC;qBACxB,CAAC;oBACF,GAAG,EAAE;wBACH,uBAAuB;wBACvB,8CAA8C;qBAC/C;oBACD,MAAM,EAAE,MAAM;oBACd,WAAW,EAAE,CAAC,aAAa,CAAC;oBAC5B,IAAI,EAAE,0CAA0C;oBAChD,IAAI,EAAE,0BAAiB,CAAC,OAAO;iBAChC;gBACD;oBACE,EAAE,EAAE,SAAS;oBACb,KAAK,EAAE,4BAA4B;oBACnC,MAAM,EAAE,4BAAmB,CAAC,IAAI;oBAChC,QAAQ,EAAE,8BAAqB,CAAC,MAAM;oBACtC,aAAa,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;oBACrC,aAAa,EAAE,IAAI,GAAG,EAAE;oBACxB,GAAG,EAAE,EAAE;oBACP,MAAM,EAAE,MAAM;oBACd,WAAW,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;oBACjC,IAAI,EAAE,EAAE;oBACR,IAAI,EAAE,0BAAiB,CAAC,OAAO;iBAChC;aACF,CAAC;YAEF,wBAAwB;YACxB,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC5C,IAAA,+CAAsB,EAAC,GAAG,CAAC,CAC5B,CAAC;YAEF,0BAA0B;YAC1B,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACxD,IAAA,mDAAwB,EAAC,GAAG,CAAC,CAC9B,CAAC;YAEF,0CAA0C;YAC1C,mBAAmB,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE;gBAClD,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}