// A repo the test builds in her layout's shape: spaces and capitals in folder names, a .canvas file // and an unmapped top-level note. Bodies are made up; MARKER stands in for her text. import { mkdtempSync, rmSync, mkdirSync, writeFileSync, readFileSync, symlinkSync, chmodSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { dirname, join } from 'node:path'; import { execFileSync } from 'node:child_process'; import { fileURLToPath } from 'node:url'; import { checkMapping } from '../src/mapping.mjs'; export const MARKER = 'MARKER-7f3a-HER-TEXT'; export const FIXTURES = fileURLToPath(new URL('./fixtures/', import.meta.url)); export const mappingEntry = () => JSON.parse(readFileSync(join(FIXTURES, 'mapping.json'), 'utf8')); export const mapping = (change = e => e) => checkMapping(change(mappingEntry())); export const git = (repo, ...args) => execFileSync('git', ['-c', 'user.name=fixture', '-c', 'user.email=fixture@mosaic.invalid', '-c', 'commit.gpgsign=false', '-c', 'core.hooksPath=/dev/null', '-C', repo, ...args], { encoding: 'utf8' }).trim(); export const BASE = { 'Book One/Characters/Mara Vell.md': [ '---', 'type: character', 'name: Mara Vell', 'appears_in: "[[Book One/Chapters/Chapter 01]]"', 'relationships:', ' - "[[Tomas]]"', ' - The Ferryman', '---', `Grey eyes. ${MARKER}`, ''].join('\n'), 'Book One/Characters/Tomas.md': ['---', 'type: character', 'name: Tomas', 'appears_in: ["[[Chapter 01]]"]', '---', MARKER, ''].join('\n'), 'Book One/Chapters/Chapter 01.md': [ '# One', `${MARKER} [[Mara Vell]] met [[Book One/Places/Harbor Town|the harbor]].`, 'See [[../Places/Harbor Town#Docks]] and [[books/Book One/Characters/Tomas]].', '```', '[[Not A Link]]', '```', 'Inline `[[Not Either]]` and [a note](Notes.md).', ''].join('\n'), 'Book One/Places/Harbor Town.md': ['---', 'type: place', '---', `Salt. ${MARKER}`, ''].join('\n'), 'Book One/Playground/What If.md': ['---', 'name: What If', '---', `${MARKER} [[Mara Vell]]`, ''].join('\n'), 'Book One/Board.canvas': '{"nodes":[]}\n', 'Book One/Playground/Sketch.canvas': '{"nodes":[]}\n', 'Inbox Note.md': `${MARKER}\n`, 'Second World/Chapters/01.md': `# Elsewhere ${MARKER}\n`, }; // repo({files, extra}) writes files (path -> text, or { link } / { mode, text }), commits, and // returns { repo, commit }. export function repo(t, files = BASE) { const root = mkdtempSync(join(tmpdir(), 'library-')); t.after(() => rmSync(root, { recursive: true, force: true })); const dir = join(root, 'books'); mkdirSync(dir); git(dir, 'init', '-q', '-b', 'main'); for (const [path, value] of Object.entries(files)) { const file = join(dir, path); mkdirSync(dirname(file), { recursive: true }); if (typeof value === 'object' && value.link) symlinkSync(value.link, file); else if (typeof value === 'object' && value.bytes) writeFileSync(file, value.bytes); else writeFileSync(file, typeof value === 'object' ? value.text : value); if (typeof value === 'object' && value.mode) chmodSync(file, value.mode); } git(dir, 'add', '-A'); git(dir, 'commit', '-qm', 'fixture'); return { root, repo: dir, commit: git(dir, 'rev-parse', 'HEAD') }; }