Merge pull request 'refactor(mcp): дедупликация конвертер-смежных хелперов (node-ops форк, footnote-*, parse-node-arg)' (#429) from refactor/414-dedup-node-ops into develop

Reviewed-on: #429
This commit was merged in pull request #429.
This commit is contained in:
2026-07-10 07:01:07 +03:00
28 changed files with 457 additions and 1442 deletions
@@ -17,7 +17,7 @@ import {
resolveCurrentPageResult,
type SelectionContext,
} from './current-page.util';
import { parseNodeArg } from './parse-node-arg';
import { parseNodeArg } from '@docmost/prosemirror-markdown';
import { modelFriendlyInput } from './model-friendly-input';
import { SandboxStore } from '../../../integrations/sandbox/sandbox.store';
import {
@@ -1,10 +1,10 @@
import { parseNodeArg } from './parse-node-arg';
import { parseNodeArg } from '@docmost/prosemirror-markdown';
/**
* Unit tests for the in-app `parseNodeArg` helper. It mirrors the standalone
* MCP helper (packages/mcp/src/lib/parse-node-arg.ts) and is used by the
* patchNode / insertNode / updatePageJson tool adapters. Behavior must be
* byte-identical: object passthrough, valid-string parse, invalid-string throw.
* Unit tests for the shared `parseNodeArg` helper (#414: now the single copy in
* `@docmost/prosemirror-markdown`, imported by both the server tool adapters and
* `@docmost/mcp`). Used by the patchNode / insertNode / updatePageJson adapters.
* Behavior: object passthrough, valid-string parse, invalid-string throw.
*/
describe('parseNodeArg', () => {
it('passes an object through unchanged', () => {
@@ -1,26 +0,0 @@
// The model sometimes serializes a ProseMirror node arg as a JSON string
// instead of an object. Normalize: parse a string to an object (throwing on
// invalid JSON), pass an object through unchanged. Shared by patchNode /
// insertNode (and the analogous updatePageJson content parsing).
//
// This is behaviorally identical to `packages/mcp/src/lib/parse-node-arg.ts`
// (the function logic, default/explicit throw messages and branch order match;
// only comments and quote style differ). We cannot import that helper here:
// `@docmost/mcp` is ESM-only and this server
// compiles with module:commonjs, so it is loaded at runtime via the
// `new Function('import()')` trick (see docmost-client.loader.ts). Sharing
// runtime code across that ESM/CJS boundary by a normal import is impossible,
// hence the mirrored copy.
export function parseNodeArg(
node: unknown,
errMsg = 'node was a string but not valid JSON',
): unknown {
if (typeof node === 'string') {
try {
return JSON.parse(node);
} catch {
throw new Error(errMsg);
}
}
return node;
}