fix(converter): warnings вместо тихой потери незнакомых нод/марок
Незнакомый тип ноды (default-ветка switch) молча схлопывался в свои дети, а незнакомая марка молча выбрасывалась — тихая потеря данных. Теперь сериализатор РЕПОРТИТ потерю: - по умолчанию поведение байт-в-байт прежнее (graceful degrade), но при переданном options.warnings в сток кладётся по одному сообщению на незамапленный тип (дедуп по типу) — потеря наблюдаема; - options.strict бросает ConverterLossError на ПЕРВОМ незнакомом типе (warning = ошибка). git-sync (lossless-путь) включает strict в stabilizePageBody: тип без серизализующей ветки падает громко на записи, а не пишет lossy .md. Валидный контент не затронут — у всех текущих типов схемы есть ветка. Покрытие: converter-loss-warnings.test.ts (нода/марка × strict/non-strict, дедуп, чистый контент) и strict-пин в git-sync stabilize.test.ts — всё через реальный конвертер. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -72,7 +72,13 @@ export async function stabilizePageFile(
|
||||
* keeps re-pulls of an unchanged page byte-identical (no churn, loop-guard).
|
||||
*/
|
||||
export async function stabilizePageBody(content: unknown): Promise<string> {
|
||||
const md1 = convertProseMirrorToMarkdown(content);
|
||||
// git-sync is the LOSSLESS mirror path, so run the serializer in `strict`
|
||||
// mode: a node/mark type the converter has no case for (e.g. one added to the
|
||||
// schema without a matching serializer arm) throws a ConverterLossError here
|
||||
// rather than silently degrading — surfacing the loss loudly at write time
|
||||
// instead of committing a lossy file. Valid content (every current schema type
|
||||
// has a case) is unaffected.
|
||||
const md1 = convertProseMirrorToMarkdown(content, { strict: true });
|
||||
const doc2 = await markdownToProseMirror(md1);
|
||||
return convertProseMirrorToMarkdown(doc2);
|
||||
return convertProseMirrorToMarkdown(doc2, { strict: true });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user