From 68f5619ca2c958b1b1c7d738b25be9a787335144 Mon Sep 17 00:00:00 2001 From: callumalpass Date: Fri, 31 Jul 2026 21:50:35 +1000 Subject: [PATCH] Generate task date-or-datetime schemas --- src/generated/tasknotes-data-contract.ts | 24 ++++++++++++++++++++---- src/mdbase.ts | 13 +++++++++++-- test/mdbase.test.mjs | 10 ++++++++++ 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/generated/tasknotes-data-contract.ts b/src/generated/tasknotes-data-contract.ts index dea06dc..9c78135 100644 --- a/src/generated/tasknotes-data-contract.ts +++ b/src/generated/tasknotes-data-contract.ts @@ -30,12 +30,28 @@ export const TASKNOTES_TASK_SCHEMA = { "minLength": 1 }, "due": { - "type": "string", - "format": "date" + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "string", + "format": "date-time" + } + ] }, "scheduled": { - "type": "string", - "format": "date" + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "string", + "format": "date-time" + } + ] }, "contexts": { "type": "array", diff --git a/src/mdbase.ts b/src/mdbase.ts index 0630494..da5142a 100644 --- a/src/mdbase.ts +++ b/src/mdbase.ts @@ -461,8 +461,8 @@ export function buildTaskNotesMdbaseResources( addField("priority", mapping.priority, { enum: priorityValues }, { defaultValue: modelConfig.defaults.priority, }); - addField("due", mapping.due, dateSchema(legacyCompatibility)); - addField("scheduled", mapping.scheduled, dateSchema(legacyCompatibility)); + addField("due", mapping.due, taskDateSchema(legacyCompatibility)); + addField("scheduled", mapping.scheduled, taskDateSchema(legacyCompatibility)); addField("contexts", mapping.contexts, arraySchema(stringSchema({}, legacyCompatibility), legacyCompatibility)); addField( "projects", @@ -1247,6 +1247,15 @@ function dateSchema(_legacyCompatibility: boolean): Record { return { type: "string", format: "date" }; } +function taskDateSchema(legacyCompatibility: boolean): Record { + return { + anyOf: [ + dateSchema(legacyCompatibility), + dateTimeSchema(legacyCompatibility), + ], + }; +} + function dateTimeSchema(legacyCompatibility: boolean): Record { return legacyCompatibility ? { diff --git a/test/mdbase.test.mjs b/test/mdbase.test.mjs index 13e89cf..0b76290 100644 --- a/test/mdbase.test.mjs +++ b/test/mdbase.test.mjs @@ -52,6 +52,16 @@ test("builds one canonical TaskNotes and mdbase collection contract", () => { ]); assert.equal(taskImplementation.fields.completedDate, "completedDate"); assert.equal(taskImplementation.fields.id, "id"); + const taskDateSchema = { + anyOf: [ + { type: "string", format: "date" }, + { type: "string", format: "date-time" }, + ], + }; + assert.deepEqual(schema.properties.due, taskDateSchema); + assert.deepEqual(schema.properties.scheduled, taskDateSchema); + assert.deepEqual(resources.taskSchema.properties.due, taskDateSchema); + assert.deepEqual(resources.taskSchema.properties.scheduled, taskDateSchema); assert.deepEqual(type.collection.unique, [{ field: "id", scope: "type" }]); assert.deepEqual(type.lifecycle.on_create.set.id, { uuid: true }); assert.deepEqual(schema.properties.completedDate, { type: "string", format: "date" });