feat: save mobile note frontmatter

This commit is contained in:
lucaronin
2026-05-05 10:32:10 +02:00
parent 6cf7b4b118
commit d08da1c7bf
4 changed files with 132 additions and 1 deletions

View File

@@ -1,6 +1,8 @@
import { demoNoteSources } from './demoData'
import type { MobileEditorDraft } from './mobileEditorDraft'
import { saveMobileEditorDraft } from './mobileEditorDraftSave'
import { saveMobileNoteFrontmatter } from './mobileNoteFrontmatterSave'
import type { WritableMobileNoteFrontmatter } from './mobileNoteFrontmatterWrite'
import { createMobileNoteFile } from './mobileNoteCreate'
import {
createMobileVaultConfigFromMetadata,
@@ -51,6 +53,23 @@ export async function deleteDemoVaultNote(noteId: string, vaultMetadata = defaul
}).deleteNote(noteId)
}
export function saveDemoVaultNoteFrontmatter({
metadata,
noteId,
vaultMetadata = defaultMobileVaultMetadata,
}: {
metadata: WritableMobileNoteFrontmatter
noteId: string
vaultMetadata?: MobileVaultMetadata
}) {
return saveMobileNoteFrontmatter({
metadata,
noteId,
storage: createNativeMobileVaultStorage(),
vault: createDemoVaultConfig(vaultMetadata),
})
}
function demoVaultFiles(): MobileVaultFile[] {
return demoNoteSources.map((source) => ({
path: source.filename,

View File

@@ -0,0 +1,65 @@
import { describe, expect, it } from 'vitest'
import { saveMobileNoteFrontmatter } from './mobileNoteFrontmatterSave'
import { createMobileVaultConfig } from './mobileVaultConfig'
import { createMemoryMobileVaultStorage } from './mobileVaultStorage'
const vault = createVault()
describe('mobile note frontmatter save', () => {
it('updates note frontmatter through vault storage', async () => {
const storage = createMemoryMobileVaultStorage([
{
path: 'notes/workflow.md',
content: '---\ntitle: Workflow\nprivate: true\n---\n# Workflow',
},
])
await expect(saveMobileNoteFrontmatter({
metadata: {
status: 'Draft',
tags: ['mobile'],
type: 'Project',
},
noteId: 'notes/workflow',
storage,
vault,
})).resolves.toEqual({
status: 'saved',
path: 'notes/workflow.md',
})
await expect(storage.readMarkdownFile(vault, 'notes/workflow.md')).resolves.toBe([
'---',
'title: Workflow',
'private: true',
'type: Project',
'status: Draft',
'tags: [mobile]',
'---',
'# Workflow',
].join('\n'))
})
it('returns missing when the note file does not exist', async () => {
const storage = createMemoryMobileVaultStorage([])
await expect(saveMobileNoteFrontmatter({
metadata: { type: 'Essay' },
noteId: 'missing',
storage,
vault,
})).resolves.toEqual({
status: 'missing',
path: 'missing.md',
})
})
})
function createVault() {
const result = createMobileVaultConfig({ id: 'personal', name: 'Personal Journal' })
if (!result.ok) {
throw new Error(result.error)
}
return result.config
}

View File

@@ -0,0 +1,41 @@
import type { MobileVaultConfig } from './mobileVaultConfig'
import type { MobileVaultStorageDriver } from './mobileVaultStorage'
import {
writeMobileNoteFrontmatter,
type WritableMobileNoteFrontmatter,
} from './mobileNoteFrontmatterWrite'
export type MobileNoteFrontmatterSaveResult =
| {
status: 'saved'
path: string
}
| {
status: 'missing'
path: string
}
export async function saveMobileNoteFrontmatter({
metadata,
noteId,
storage,
vault,
}: {
metadata: WritableMobileNoteFrontmatter
noteId: string
storage: MobileVaultStorageDriver
vault: MobileVaultConfig
}): Promise<MobileNoteFrontmatterSaveResult> {
const path = notePath(noteId)
const content = await storage.readMarkdownFile(vault, path)
if (content === null) {
return { status: 'missing', path }
}
await storage.writeMarkdownFile(vault, path, writeMobileNoteFrontmatter({ content, metadata }))
return { status: 'saved', path }
}
function notePath(noteId: string) {
return `${noteId}.md`
}