refactor(mcp): single docmostSchema + shared encode-error helper + catch test (#152 review)
Review of #154 (Request changes) — all clean follow-ups, no defect in the fix: 1. Single source of the ProseMirror schema: export `docmostSchema` from docmost-schema.ts (next to docmostExtensions); diff.ts and collaboration.ts import it instead of each calling getSchema(docmostExtensions) — the schema can no longer drift between call sites. Removed both local builds + the now unused getSchema imports. 2. Doc fix: assertYjsEncodable's docstring and the client.ts comment no longer claim "the same encoder as apply" — apply uses updateYFragment, the dry-run uses toYdoc; both reject the same unstorable attrs but are NOT byte-identical. Reworded to "independent encodability gate". 3+4+5. Extracted `unstorableYjsError(safe, label, e)` — buildYDoc and applyDocToFragment now share one message template (label kept for diagnostics: toYdoc vs updateYFragment), so the wording can't drift between dry-run/apply. 6. Test for applyDocToFragment's catch branch: an unknown node type makes the schema-validated PMNode.fromJSON throw, and the function must re-throw it wrapped with the (updateYFragment) diagnostic. build/ rebuilt for the three changed lib modules; 293 package tests green. (Left build/client.js untouched: rebuilding it would pull in a pre-existing, unrelated src/build drift — a listSidebarPages slugId fix never rebuilt on develop — and my client.ts change there is comment-only.) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -73,3 +73,21 @@ test("anchoring a comment mark keeps the cursor in the marked text (issue #152)"
|
||||
const abs = Y.createAbsolutePositionFromRelativePosition(relPos, ydoc);
|
||||
assert.notEqual(abs, null, "comment anchoring must not destroy the cursor anchor");
|
||||
});
|
||||
|
||||
// The diagnostic catch branch of applyDocToFragment (#154 review): a doc that
|
||||
// cannot be hydrated/encoded must be re-thrown wrapped with the stage label, not
|
||||
// leak the raw ProseMirror/Yjs error. An unknown node type makes
|
||||
// PMNode.fromJSON (against the docmost schema) throw — a reliable trigger
|
||||
// (sanitizeForYjs only strips `undefined`, so an undefined attr would be removed
|
||||
// before it could fail).
|
||||
test("applyDocToFragment wraps an encode/build failure with the (updateYFragment) diagnostic", () => {
|
||||
const ydoc = new Y.Doc();
|
||||
const bad = {
|
||||
type: "doc",
|
||||
content: [{ type: "totally_unknown_node_xyz_12345" }],
|
||||
};
|
||||
assert.throws(
|
||||
() => applyDocToFragment(ydoc, bad),
|
||||
/Failed to encode document to Yjs \(updateYFragment\)/,
|
||||
);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user