( root: string, oldRel: string, targetFolder: NoteFolder, targetSubpath: string )
| 689 | moveBetweenFolders(root, rel, 'inbox') |
| 690 | |
| 691 | export async function moveNote( |
| 692 | root: string, |
| 693 | oldRel: string, |
| 694 | targetFolder: NoteFolder, |
| 695 | targetSubpath: string |
| 696 | ): Promise<NoteMeta> { |
| 697 | const oldAbs = resolveSafe(root, oldRel) |
| 698 | const filename = path.basename(oldAbs) |
| 699 | const cleanSub = targetSubpath.replace(/^\/+|\/+$/g, '') |
| 700 | const folderAbs = await folderRoot(root, targetFolder) |
| 701 | const destDir = cleanSub ? resolveSafe(folderAbs, cleanSub) : folderAbs |
| 702 | if (path.dirname(oldAbs) === destDir) { |
| 703 | const folder = folderOf(root, oldAbs) |
| 704 | if (!folder) throw new Error(`Note not in a known folder: ${oldRel}`) |
| 705 | return await readMeta(root, oldAbs, folder) |
| 706 | } |
| 707 | await fs.mkdir(destDir, { recursive: true }) |
| 708 | const ext = path.extname(filename) |
| 709 | const baseTitle = path.basename(filename, ext) |
| 710 | const finalTitle = await uniqueTitle(destDir, baseTitle) |
| 711 | const destAbs = path.join(destDir, `${finalTitle}${ext}`) |
| 712 | await fs.rename(oldAbs, destAbs) |
| 713 | return await readMeta(root, destAbs, targetFolder) |
| 714 | } |
| 715 | |
| 716 | export async function duplicateNote(root: string, rel: string): Promise<NoteMeta> { |
| 717 | const abs = resolveSafe(root, rel) |
no test coverage detected