@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.
- package/LICENSE +674 -0
- package/README.md +81 -0
- package/dist/configuration/ServerConfig.d.ts +8 -0
- package/dist/configuration/ServerConfig.d.ts.map +1 -0
- package/dist/configuration/ServerConfig.js +3 -0
- package/dist/configuration/ServerConfig.js.map +1 -0
- package/dist/configuration/index.d.ts +2 -0
- package/dist/configuration/index.d.ts.map +1 -0
- package/dist/configuration/index.js +18 -0
- package/dist/configuration/index.js.map +1 -0
- package/dist/models/TrellisObject.d.ts +18 -0
- package/dist/models/TrellisObject.d.ts.map +1 -0
- package/dist/models/TrellisObject.js +3 -0
- package/dist/models/TrellisObject.js.map +1 -0
- package/dist/models/TrellisObjectPriority.d.ts +6 -0
- package/dist/models/TrellisObjectPriority.d.ts.map +1 -0
- package/dist/models/TrellisObjectPriority.js +10 -0
- package/dist/models/TrellisObjectPriority.js.map +1 -0
- package/dist/models/TrellisObjectStatus.d.ts +8 -0
- package/dist/models/TrellisObjectStatus.d.ts.map +1 -0
- package/dist/models/TrellisObjectStatus.js +12 -0
- package/dist/models/TrellisObjectStatus.js.map +1 -0
- package/dist/models/TrellisObjectType.d.ts +7 -0
- package/dist/models/TrellisObjectType.d.ts.map +1 -0
- package/dist/models/TrellisObjectType.js +11 -0
- package/dist/models/TrellisObjectType.js.map +1 -0
- package/dist/models/__tests__/isClaimable.test.d.ts +2 -0
- package/dist/models/__tests__/isClaimable.test.d.ts.map +1 -0
- package/dist/models/__tests__/isClaimable.test.js +101 -0
- package/dist/models/__tests__/isClaimable.test.js.map +1 -0
- package/dist/models/__tests__/isClosed.test.d.ts +2 -0
- package/dist/models/__tests__/isClosed.test.d.ts.map +1 -0
- package/dist/models/__tests__/isClosed.test.js +84 -0
- package/dist/models/__tests__/isClosed.test.js.map +1 -0
- package/dist/models/__tests__/isOpen.test.d.ts +2 -0
- package/dist/models/__tests__/isOpen.test.d.ts.map +1 -0
- package/dist/models/__tests__/isOpen.test.js +84 -0
- package/dist/models/__tests__/isOpen.test.js.map +1 -0
- package/dist/models/index.d.ts +8 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +16 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/isClaimable.d.ts +10 -0
- package/dist/models/isClaimable.d.ts.map +1 -0
- package/dist/models/isClaimable.js +16 -0
- package/dist/models/isClaimable.js.map +1 -0
- package/dist/models/isClosed.d.ts +10 -0
- package/dist/models/isClosed.d.ts.map +1 -0
- package/dist/models/isClosed.js +16 -0
- package/dist/models/isClosed.js.map +1 -0
- package/dist/models/isOpen.d.ts +10 -0
- package/dist/models/isOpen.d.ts.map +1 -0
- package/dist/models/isOpen.js +16 -0
- package/dist/models/isOpen.js.map +1 -0
- package/dist/repositories/Repository.d.ts +8 -0
- package/dist/repositories/Repository.d.ts.map +1 -0
- package/dist/repositories/Repository.js +3 -0
- package/dist/repositories/Repository.js.map +1 -0
- package/dist/repositories/index.d.ts +3 -0
- package/dist/repositories/index.d.ts.map +1 -0
- package/dist/repositories/index.js +19 -0
- package/dist/repositories/index.js.map +1 -0
- package/dist/repositories/local/LocalRepository.d.ts +21 -0
- package/dist/repositories/local/LocalRepository.d.ts.map +1 -0
- package/dist/repositories/local/LocalRepository.js +75 -0
- package/dist/repositories/local/LocalRepository.js.map +1 -0
- package/dist/repositories/local/__tests__/deleteObjectById.test.d.ts +2 -0
- package/dist/repositories/local/__tests__/deleteObjectById.test.d.ts.map +1 -0
- package/dist/repositories/local/__tests__/deleteObjectById.test.js +228 -0
- package/dist/repositories/local/__tests__/deleteObjectById.test.js.map +1 -0
- package/dist/repositories/local/__tests__/extractMarkdownIds.test.d.ts +2 -0
- package/dist/repositories/local/__tests__/extractMarkdownIds.test.d.ts.map +1 -0
- package/dist/repositories/local/__tests__/extractMarkdownIds.test.js +135 -0
- package/dist/repositories/local/__tests__/extractMarkdownIds.test.js.map +1 -0
- package/dist/repositories/local/__tests__/findMarkdownFiles.test.d.ts +2 -0
- package/dist/repositories/local/__tests__/findMarkdownFiles.test.d.ts.map +1 -0
- package/dist/repositories/local/__tests__/findMarkdownFiles.test.js +236 -0
- package/dist/repositories/local/__tests__/findMarkdownFiles.test.js.map +1 -0
- package/dist/repositories/local/__tests__/getObjectByFilePath.test.d.ts +2 -0
- package/dist/repositories/local/__tests__/getObjectByFilePath.test.d.ts.map +1 -0
- package/dist/repositories/local/__tests__/getObjectByFilePath.test.js +96 -0
- package/dist/repositories/local/__tests__/getObjectByFilePath.test.js.map +1 -0
- package/dist/repositories/local/__tests__/getObjectById.test.d.ts +2 -0
- package/dist/repositories/local/__tests__/getObjectById.test.d.ts.map +1 -0
- package/dist/repositories/local/__tests__/getObjectById.test.js +46 -0
- package/dist/repositories/local/__tests__/getObjectById.test.js.map +1 -0
- package/dist/repositories/local/__tests__/getObjectFilePath.test.d.ts +2 -0
- package/dist/repositories/local/__tests__/getObjectFilePath.test.d.ts.map +1 -0
- package/dist/repositories/local/__tests__/getObjectFilePath.test.js +172 -0
- package/dist/repositories/local/__tests__/getObjectFilePath.test.js.map +1 -0
- package/dist/repositories/local/__tests__/getObjects.test.d.ts +2 -0
- package/dist/repositories/local/__tests__/getObjects.test.d.ts.map +1 -0
- package/dist/repositories/local/__tests__/getObjects.test.js +351 -0
- package/dist/repositories/local/__tests__/getObjects.test.js.map +1 -0
- package/dist/repositories/local/__tests__/scopeFilter.test.d.ts +2 -0
- package/dist/repositories/local/__tests__/scopeFilter.test.d.ts.map +1 -0
- package/dist/repositories/local/__tests__/scopeFilter.test.js +109 -0
- package/dist/repositories/local/__tests__/scopeFilter.test.js.map +1 -0
- package/dist/repositories/local/deleteObjectById.d.ts +16 -0
- package/dist/repositories/local/deleteObjectById.d.ts.map +1 -0
- package/dist/repositories/local/deleteObjectById.js +108 -0
- package/dist/repositories/local/deleteObjectById.js.map +1 -0
- package/dist/repositories/local/extractMarkdownIds.d.ts +17 -0
- package/dist/repositories/local/extractMarkdownIds.d.ts.map +1 -0
- package/dist/repositories/local/extractMarkdownIds.js +34 -0
- package/dist/repositories/local/extractMarkdownIds.js.map +1 -0
- package/dist/repositories/local/filterByScope.d.ts +8 -0
- package/dist/repositories/local/filterByScope.d.ts.map +1 -0
- package/dist/repositories/local/filterByScope.js +17 -0
- package/dist/repositories/local/filterByScope.js.map +1 -0
- package/dist/repositories/local/findMarkdownFiles.d.ts +9 -0
- package/dist/repositories/local/findMarkdownFiles.d.ts.map +1 -0
- package/dist/repositories/local/findMarkdownFiles.js +47 -0
- package/dist/repositories/local/findMarkdownFiles.js.map +1 -0
- package/dist/repositories/local/getObjectByFilePath.d.ts +9 -0
- package/dist/repositories/local/getObjectByFilePath.d.ts.map +1 -0
- package/dist/repositories/local/getObjectByFilePath.js +16 -0
- package/dist/repositories/local/getObjectByFilePath.js.map +1 -0
- package/dist/repositories/local/getObjectById.d.ts +10 -0
- package/dist/repositories/local/getObjectById.d.ts.map +1 -0
- package/dist/repositories/local/getObjectById.js +36 -0
- package/dist/repositories/local/getObjectById.js.map +1 -0
- package/dist/repositories/local/getObjectFilePath.d.ts +7 -0
- package/dist/repositories/local/getObjectFilePath.d.ts.map +1 -0
- package/dist/repositories/local/getObjectFilePath.js +90 -0
- package/dist/repositories/local/getObjectFilePath.js.map +1 -0
- package/dist/repositories/local/getObjects.d.ts +3 -0
- package/dist/repositories/local/getObjects.d.ts.map +1 -0
- package/dist/repositories/local/getObjects.js +64 -0
- package/dist/repositories/local/getObjects.js.map +1 -0
- package/dist/repositories/local/index.d.ts +8 -0
- package/dist/repositories/local/index.d.ts.map +1 -0
- package/dist/repositories/local/index.js +24 -0
- package/dist/repositories/local/index.js.map +1 -0
- package/dist/repositories/local/saveObject.d.ts +12 -0
- package/dist/repositories/local/saveObject.d.ts.map +1 -0
- package/dist/repositories/local/saveObject.js +27 -0
- package/dist/repositories/local/saveObject.js.map +1 -0
- package/dist/repositories/local/scopeFilter.d.ts +12 -0
- package/dist/repositories/local/scopeFilter.d.ts.map +1 -0
- package/dist/repositories/local/scopeFilter.js +21 -0
- package/dist/repositories/local/scopeFilter.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +138 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/__tests__/appendObjectLogTool.test.d.ts +2 -0
- package/dist/tools/__tests__/appendObjectLogTool.test.d.ts.map +1 -0
- package/dist/tools/__tests__/appendObjectLogTool.test.js +125 -0
- package/dist/tools/__tests__/appendObjectLogTool.test.js.map +1 -0
- package/dist/tools/__tests__/claimTaskTool.test.d.ts +2 -0
- package/dist/tools/__tests__/claimTaskTool.test.d.ts.map +1 -0
- package/dist/tools/__tests__/claimTaskTool.test.js +348 -0
- package/dist/tools/__tests__/claimTaskTool.test.js.map +1 -0
- package/dist/tools/__tests__/completeTaskTool.test.d.ts +2 -0
- package/dist/tools/__tests__/completeTaskTool.test.d.ts.map +1 -0
- package/dist/tools/__tests__/completeTaskTool.test.js +221 -0
- package/dist/tools/__tests__/completeTaskTool.test.js.map +1 -0
- package/dist/tools/__tests__/createObjectTool.test.d.ts +2 -0
- package/dist/tools/__tests__/createObjectTool.test.d.ts.map +1 -0
- package/dist/tools/__tests__/createObjectTool.test.js +387 -0
- package/dist/tools/__tests__/createObjectTool.test.js.map +1 -0
- package/dist/tools/__tests__/deleteObjectTool.test.d.ts +2 -0
- package/dist/tools/__tests__/deleteObjectTool.test.d.ts.map +1 -0
- package/dist/tools/__tests__/deleteObjectTool.test.js +169 -0
- package/dist/tools/__tests__/deleteObjectTool.test.js.map +1 -0
- package/dist/tools/__tests__/getObjectTool.test.d.ts +2 -0
- package/dist/tools/__tests__/getObjectTool.test.d.ts.map +1 -0
- package/dist/tools/__tests__/getObjectTool.test.js +124 -0
- package/dist/tools/__tests__/getObjectTool.test.js.map +1 -0
- package/dist/tools/__tests__/listObjectsTool.test.d.ts +2 -0
- package/dist/tools/__tests__/listObjectsTool.test.d.ts.map +1 -0
- package/dist/tools/__tests__/listObjectsTool.test.js +266 -0
- package/dist/tools/__tests__/listObjectsTool.test.js.map +1 -0
- package/dist/tools/__tests__/updateObjectTool.test.d.ts +2 -0
- package/dist/tools/__tests__/updateObjectTool.test.d.ts.map +1 -0
- package/dist/tools/__tests__/updateObjectTool.test.js +208 -0
- package/dist/tools/__tests__/updateObjectTool.test.js.map +1 -0
- package/dist/tools/activateTool.d.ts +38 -0
- package/dist/tools/activateTool.d.ts.map +1 -0
- package/dist/tools/activateTool.js +48 -0
- package/dist/tools/activateTool.js.map +1 -0
- package/dist/tools/appendObjectLogTool.d.ts +26 -0
- package/dist/tools/appendObjectLogTool.d.ts.map +1 -0
- package/dist/tools/appendObjectLogTool.js +65 -0
- package/dist/tools/appendObjectLogTool.js.map +1 -0
- package/dist/tools/claimTaskTool.d.ts +30 -0
- package/dist/tools/claimTaskTool.d.ts.map +1 -0
- package/dist/tools/claimTaskTool.js +109 -0
- package/dist/tools/claimTaskTool.js.map +1 -0
- package/dist/tools/completeTaskTool.d.ts +33 -0
- package/dist/tools/completeTaskTool.d.ts.map +1 -0
- package/dist/tools/completeTaskTool.js +61 -0
- package/dist/tools/completeTaskTool.js.map +1 -0
- package/dist/tools/createObjectTool.d.ts +52 -0
- package/dist/tools/createObjectTool.d.ts.map +1 -0
- package/dist/tools/createObjectTool.js +87 -0
- package/dist/tools/createObjectTool.js.map +1 -0
- package/dist/tools/deleteObjectTool.d.ts +27 -0
- package/dist/tools/deleteObjectTool.d.ts.map +1 -0
- package/dist/tools/deleteObjectTool.js +48 -0
- package/dist/tools/deleteObjectTool.js.map +1 -0
- package/dist/tools/getObjectTool.d.ts +22 -0
- package/dist/tools/getObjectTool.d.ts.map +1 -0
- package/dist/tools/getObjectTool.js +53 -0
- package/dist/tools/getObjectTool.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +34 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/listObjectsTool.d.ts +39 -0
- package/dist/tools/listObjectsTool.d.ts.map +1 -0
- package/dist/tools/listObjectsTool.js +87 -0
- package/dist/tools/listObjectsTool.js.map +1 -0
- package/dist/tools/pruneClosedTool.d.ts +26 -0
- package/dist/tools/pruneClosedTool.d.ts.map +1 -0
- package/dist/tools/pruneClosedTool.js +35 -0
- package/dist/tools/pruneClosedTool.js.map +1 -0
- package/dist/tools/updateObjectTool.d.ts +46 -0
- package/dist/tools/updateObjectTool.d.ts.map +1 -0
- package/dist/tools/updateObjectTool.js +93 -0
- package/dist/tools/updateObjectTool.js.map +1 -0
- package/dist/utils/__tests__/checkPrerequisitesComplete.test.d.ts +2 -0
- package/dist/utils/__tests__/checkPrerequisitesComplete.test.d.ts.map +1 -0
- package/dist/utils/__tests__/checkPrerequisitesComplete.test.js +200 -0
- package/dist/utils/__tests__/checkPrerequisitesComplete.test.js.map +1 -0
- package/dist/utils/__tests__/deserializeTrellisObject.test.d.ts +2 -0
- package/dist/utils/__tests__/deserializeTrellisObject.test.d.ts.map +1 -0
- package/dist/utils/__tests__/deserializeTrellisObject.test.js +329 -0
- package/dist/utils/__tests__/deserializeTrellisObject.test.js.map +1 -0
- package/dist/utils/__tests__/filterUnavailableObjects.test.d.ts +2 -0
- package/dist/utils/__tests__/filterUnavailableObjects.test.d.ts.map +1 -0
- package/dist/utils/__tests__/filterUnavailableObjects.test.js +172 -0
- package/dist/utils/__tests__/filterUnavailableObjects.test.js.map +1 -0
- package/dist/utils/__tests__/generateUniqueId.test.d.ts +2 -0
- package/dist/utils/__tests__/generateUniqueId.test.d.ts.map +1 -0
- package/dist/utils/__tests__/generateUniqueId.test.js +186 -0
- package/dist/utils/__tests__/generateUniqueId.test.js.map +1 -0
- package/dist/utils/__tests__/inferObjectType.test.d.ts +2 -0
- package/dist/utils/__tests__/inferObjectType.test.d.ts.map +1 -0
- package/dist/utils/__tests__/inferObjectType.test.js +43 -0
- package/dist/utils/__tests__/inferObjectType.test.js.map +1 -0
- package/dist/utils/__tests__/isRequiredForOtherObjects.test.d.ts +2 -0
- package/dist/utils/__tests__/isRequiredForOtherObjects.test.d.ts.map +1 -0
- package/dist/utils/__tests__/isRequiredForOtherObjects.test.js +229 -0
- package/dist/utils/__tests__/isRequiredForOtherObjects.test.js.map +1 -0
- package/dist/utils/__tests__/serializationRoundTrip.test.d.ts +2 -0
- package/dist/utils/__tests__/serializationRoundTrip.test.d.ts.map +1 -0
- package/dist/utils/__tests__/serializationRoundTrip.test.js +389 -0
- package/dist/utils/__tests__/serializationRoundTrip.test.js.map +1 -0
- package/dist/utils/__tests__/serializeTrellisObject.test.d.ts +2 -0
- package/dist/utils/__tests__/serializeTrellisObject.test.d.ts.map +1 -0
- package/dist/utils/__tests__/serializeTrellisObject.test.js +192 -0
- package/dist/utils/__tests__/serializeTrellisObject.test.js.map +1 -0
- package/dist/utils/__tests__/sortTrellisObjects.test.d.ts +2 -0
- package/dist/utils/__tests__/sortTrellisObjects.test.d.ts.map +1 -0
- package/dist/utils/__tests__/sortTrellisObjects.test.js +114 -0
- package/dist/utils/__tests__/sortTrellisObjects.test.js.map +1 -0
- package/dist/utils/checkPrerequisitesComplete.d.ts +12 -0
- package/dist/utils/checkPrerequisitesComplete.d.ts.map +1 -0
- package/dist/utils/checkPrerequisitesComplete.js +38 -0
- package/dist/utils/checkPrerequisitesComplete.js.map +1 -0
- package/dist/utils/deserializeTrellisObject.d.ts +9 -0
- package/dist/utils/deserializeTrellisObject.d.ts.map +1 -0
- package/dist/utils/deserializeTrellisObject.js +134 -0
- package/dist/utils/deserializeTrellisObject.js.map +1 -0
- package/dist/utils/filterUnavailableObjects.d.ts +13 -0
- package/dist/utils/filterUnavailableObjects.d.ts.map +1 -0
- package/dist/utils/filterUnavailableObjects.js +40 -0
- package/dist/utils/filterUnavailableObjects.js.map +1 -0
- package/dist/utils/generateUniqueId.d.ts +10 -0
- package/dist/utils/generateUniqueId.d.ts.map +1 -0
- package/dist/utils/generateUniqueId.js +67 -0
- package/dist/utils/generateUniqueId.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +20 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/inferObjectType.d.ts +3 -0
- package/dist/utils/inferObjectType.d.ts.map +1 -0
- package/dist/utils/inferObjectType.js +26 -0
- package/dist/utils/inferObjectType.js.map +1 -0
- package/dist/utils/isRequiredForOtherObjects.d.ts +12 -0
- package/dist/utils/isRequiredForOtherObjects.d.ts.map +1 -0
- package/dist/utils/isRequiredForOtherObjects.js +33 -0
- package/dist/utils/isRequiredForOtherObjects.js.map +1 -0
- package/dist/utils/serializeTrellisObject.d.ts +8 -0
- package/dist/utils/serializeTrellisObject.d.ts.map +1 -0
- package/dist/utils/serializeTrellisObject.js +35 -0
- package/dist/utils/serializeTrellisObject.js.map +1 -0
- package/dist/utils/sortTrellisObjects.d.ts +8 -0
- package/dist/utils/sortTrellisObjects.d.ts.map +1 -0
- package/dist/utils/sortTrellisObjects.js +20 -0
- package/dist/utils/sortTrellisObjects.js.map +1 -0
- package/dist/validation/ValidationError.d.ts +9 -0
- package/dist/validation/ValidationError.d.ts.map +1 -0
- package/dist/validation/ValidationError.js +18 -0
- package/dist/validation/ValidationError.js.map +1 -0
- package/dist/validation/ValidationErrorCode.d.ts +3 -0
- package/dist/validation/ValidationErrorCode.d.ts.map +1 -0
- package/dist/validation/ValidationErrorCode.js +3 -0
- package/dist/validation/ValidationErrorCode.js.map +1 -0
- package/dist/validation/ValidationErrorCodes.d.ts +8 -0
- package/dist/validation/ValidationErrorCodes.d.ts.map +1 -0
- package/dist/validation/ValidationErrorCodes.js +11 -0
- package/dist/validation/ValidationErrorCodes.js.map +1 -0
- package/dist/validation/__tests__/ValidationError.test.d.ts +2 -0
- package/dist/validation/__tests__/ValidationError.test.d.ts.map +1 -0
- package/dist/validation/__tests__/ValidationError.test.js +32 -0
- package/dist/validation/__tests__/ValidationError.test.js.map +1 -0
- package/dist/validation/__tests__/validateObjectCreation.test.d.ts +2 -0
- package/dist/validation/__tests__/validateObjectCreation.test.d.ts.map +1 -0
- package/dist/validation/__tests__/validateObjectCreation.test.js +93 -0
- package/dist/validation/__tests__/validateObjectCreation.test.js.map +1 -0
- package/dist/validation/__tests__/validateParentExists.test.d.ts +2 -0
- package/dist/validation/__tests__/validateParentExists.test.d.ts.map +1 -0
- package/dist/validation/__tests__/validateParentExists.test.js +62 -0
- package/dist/validation/__tests__/validateParentExists.test.js.map +1 -0
- package/dist/validation/__tests__/validateParentType.test.d.ts +2 -0
- package/dist/validation/__tests__/validateParentType.test.d.ts.map +1 -0
- package/dist/validation/__tests__/validateParentType.test.js +125 -0
- package/dist/validation/__tests__/validateParentType.test.js.map +1 -0
- package/dist/validation/__tests__/validateStatusTransition.test.d.ts +2 -0
- package/dist/validation/__tests__/validateStatusTransition.test.d.ts.map +1 -0
- package/dist/validation/__tests__/validateStatusTransition.test.js +103 -0
- package/dist/validation/__tests__/validateStatusTransition.test.js.map +1 -0
- package/dist/validation/validateObjectCreation.d.ts +12 -0
- package/dist/validation/validateObjectCreation.d.ts.map +1 -0
- package/dist/validation/validateObjectCreation.js +24 -0
- package/dist/validation/validateObjectCreation.js.map +1 -0
- package/dist/validation/validateParentExists.d.ts +10 -0
- package/dist/validation/validateParentExists.d.ts.map +1 -0
- package/dist/validation/validateParentExists.js +23 -0
- package/dist/validation/validateParentExists.js.map +1 -0
- package/dist/validation/validateParentType.d.ts +16 -0
- package/dist/validation/validateParentType.d.ts.map +1 -0
- package/dist/validation/validateParentType.js +48 -0
- package/dist/validation/validateParentType.js.map +1 -0
- package/dist/validation/validateStatusTransition.d.ts +12 -0
- package/dist/validation/validateStatusTransition.d.ts.map +1 -0
- package/dist/validation/validateStatusTransition.js +29 -0
- package/dist/validation/validateStatusTransition.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|