import { SAMPLE_COLOR_SCALE } from '../utils/color' import { idFromName, timepointId, } from './builderIdUtils' import { normalizeCondition, normalizeTimePoint, } from './protocolNormalizers' import { createTemplateEnvelope } from './templateEnvelopes' import { validateTimeCourseData } from './templateValidators' import type { CreateTimeCourseTemplateOptions, TimeCourseCondition, TimeCourseTemplate, TimeCourseTemplateData, TimePoint, } from './types' /** @deprecated Scheduled for removal from the core SDK in MINT 1.4; the biology templates move to a dedicated package or the owning plugins. */ export function createTimeCourseTemplate( options: CreateTimeCourseTemplateOptions ): TimeCourseTemplate { const timepoints = options.timepoints.map((timepoint, index): TimePoint => { if (typeof timepoint !== 'number') return normalizeTimePoint(timepoint) return { id: timepointId(timepoint, options.unit, index), label: `${timepoint} ${options.unit}`, value: timepoint, unit: options.unit, metadata: {}, } }).sort((a, b) => a.value - b.value) const conditions = options.conditions.map((condition, index): TimeCourseCondition => { if (typeof condition !== 'string') return normalizeCondition(condition) return { id: idFromName(condition, `condition-${index + 1}`), name: condition, color: SAMPLE_COLOR_SCALE[index % SAMPLE_COLOR_SCALE.length], metadata: {}, } }) const samples = conditions.flatMap(condition => timepoints.flatMap(timepoint => Array.from({ length: options.replicates ?? 1 }, (_, index) => ({ sampleId: `${condition.id}-${timepoint.id}-r${index + 1}`, conditionId: condition.id, timepointId: timepoint.id, replicate: index + 1, metadata: {}, })) ) ) const data: TimeCourseTemplateData = { timepoints, conditions, samples, metadata: options.metadata ?? {}, } validateTimeCourseData(data) return createTemplateEnvelope('time-course', data, options.metadata ?? {}) }