(value: Record<string, unknown>, options: { workingTaskIds: string[]; pinnedTaskIds: string[] })
| 116 | } |
| 117 | |
| 118 | function toOpenADEProject(value: Record<string, unknown>, options: { workingTaskIds: string[]; pinnedTaskIds: string[] }): OpenADEProject | null { |
| 119 | const id = stringValue(value.id) |
| 120 | if (!id) return null |
| 121 | |
| 122 | const rawTasks = Array.isArray(value.tasks) ? value.tasks : [] |
| 123 | const tasks = rawTasks |
| 124 | .map((task) => (isRecord(task) ? toOpenADETaskPreview(task) : null)) |
| 125 | .filter((task): task is OpenADETaskPreview => task !== null) |
| 126 | |
| 127 | return { |
| 128 | id, |
| 129 | name: stringValue(value.name, "Untitled project"), |
| 130 | path: stringValue(value.path), |
| 131 | archived: optionalBoolean(value.archived), |
| 132 | tasks: sortTasksLikeSidebar(tasks, options.workingTaskIds, options.pinnedTaskIds), |
| 133 | } |
| 134 | } |
| 135 | |
| 136 | async function readPersonalSettings(storage: OpenADEYjsStorageAdapter): Promise<Record<string, unknown>> { |
| 137 | return (await storage.readMapObject("code:personal_settings", "personal_settings")) ?? {} |
no test coverage detected