UNPKG

@xats-org/types

Version:

Shared TypeScript types for xats

86 lines 2.99 kB
/** * xats v0.5.0 Collaborative Project Types * * TypeScript type definitions for collaborative project features * introduced in xats schema version 0.5.0 */ /** * Utility functions for collaborative projects */ /** * Validate that a collaborative project has required components */ export function validateCollaborativeProject(project) { const errors = []; if (!project.title || !project.title.runs || project.title.runs.length === 0) { errors.push('Project must have a title'); } if (!project.description || !project.description.runs || project.description.runs.length === 0) { errors.push('Project must have a description'); } if (!project.roles || project.roles.length === 0) { errors.push('Project must define at least one role'); } if (!project.deliverables || project.deliverables.length === 0) { errors.push('Project must define at least one deliverable'); } // Validate role IDs are unique const roleIds = new Set(); for (const role of project.roles || []) { if (roleIds.has(role.roleId)) { errors.push(`Duplicate role ID: ${role.roleId}`); } roleIds.add(role.roleId); } // Validate deliverable IDs are unique const deliverableIds = new Set(); for (const deliverable of project.deliverables || []) { if (deliverableIds.has(deliverable.deliverableId)) { errors.push(`Duplicate deliverable ID: ${deliverable.deliverableId}`); } deliverableIds.add(deliverable.deliverableId); } return errors; } /** * Calculate total assessment weight for deliverable */ export function calculateDeliverableWeight(deliverable) { if (!deliverable.assessmentCriteria) return 0; return deliverable.assessmentCriteria.reduce((sum, criterion) => sum + criterion.weight, 0); } /** * Get all unique skills required across all roles */ export function getRequiredSkills(project) { const skills = new Set(); for (const role of project.roles) { if (role.requiredSkills) { role.requiredSkills.forEach((skill) => skills.add(skill)); } } return Array.from(skills); } /** * Check if project timeline is consistent with deliverable dates */ export function validateTimeline(project) { const errors = []; if (!project.timeline?.phases || !project.deliverables) { return errors; } // Check that referenced deliverables exist for (const phase of project.timeline.phases) { if (phase.deliverableIds) { for (const deliverableId of phase.deliverableIds) { const deliverable = project.deliverables.find((d) => d.deliverableId === deliverableId); if (!deliverable) { errors.push(`Phase ${phase.phaseId} references non-existent deliverable: ${deliverableId}`); } } } } return errors; } //# sourceMappingURL=collaborative.js.map