@xats-org/types
Version:
Shared TypeScript types for xats
86 lines • 2.99 kB
JavaScript
/**
* 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