42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
import fm from "front-matter";
|
|
import * as yaml from "js-yaml";
|
|
import { Task, TaskPriority, TaskStatus } from "@/model/task";
|
|
|
|
function toISO(value: unknown): string {
|
|
if (value instanceof Date) return value.toISOString();
|
|
if (typeof value === "string") return value;
|
|
return new Date().toISOString();
|
|
}
|
|
|
|
export function parseTaskFile(content: string): Task {
|
|
const parsed = fm<Record<string, unknown>>(content);
|
|
const data = parsed.attributes;
|
|
return {
|
|
id: data.id as string,
|
|
title: data.title as string,
|
|
description: parsed.body.trim(),
|
|
status: (data.status as TaskStatus) ?? "todo",
|
|
priority: (data.priority as TaskPriority) ?? "medium",
|
|
tags: (data.tags as string[]) ?? [],
|
|
assignee: (data.assignee as string) ?? "",
|
|
created: toISO(data.created),
|
|
updated: toISO(data.updated),
|
|
};
|
|
}
|
|
|
|
export function serializeTask(task: Task): string {
|
|
const frontmatter: Record<string, unknown> = {
|
|
id: task.id,
|
|
title: task.title,
|
|
status: task.status,
|
|
priority: task.priority,
|
|
tags: task.tags,
|
|
assignee: task.assignee,
|
|
created: task.created,
|
|
updated: task.updated,
|
|
};
|
|
|
|
const yamlStr = yaml.dump(frontmatter).trim();
|
|
return `---\n${yamlStr}\n---\n${task.description}`;
|
|
}
|