feat(git-sync): CommonJS build + §13.1 editor-ext idempotency gate (Phase A.2)

Make @docmost/git-sync natively consumable by the CommonJS server (and jest):
build to CommonJS (tsconfig module CommonJS, drop type:module, strip .js from
relative imports), and lazy-load the only ESM-only dep (marked) via the dynamic
Function('import()') trick (mirrors docmost-client.loader.ts) with a require()
fallback so vitest's evaluator works too. git-sync tests stay green (314 pass,
3 expected fail).

Add the §13.1 idempotency gate (apps/server .../git-sync-converter-gate.spec.ts):
13 editor-ext docs (paragraphs/headings, marks, links, bullet/ordered/task lists,
blockquote, callouts, code block, hr, table, nested mix) round-trip
content(editor-ext) -> convertProseMirrorToMarkdown -> markdownToProseMirror ->
TiptapTransformer.toYdoc/fromYdoc(tiptapExtensions) -> canonicalize and assert
docsCanonicallyEqual. All green => the vendored converter's docmost-schema is
schema-compatible with editor-ext (no node/mark/attr loss), which the plan §13.1
requires before Phase B. The one intrinsic markdown-image lossiness (width/height
/align can't ride plain ![](src)) is isolated in a KNOWN DIVERGENCE block, not
hidden. Server tsc clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
claude code agent 227
2026-06-21 14:25:43 +03:00
parent 9a807e972d
commit 2e670934b8
27 changed files with 693 additions and 162 deletions

View File

@@ -1 +1 @@
{"version":"4.1.6","results":[[":test/node-ops.test.ts",{"duration":72.75441799999993,"failed":false}],[":test/markdown-converter.test.ts",{"duration":40.04070800000005,"failed":false}],[":test/diff.test.ts",{"duration":45.133106999999995,"failed":false}],[":test/node-ops-extra.test.ts",{"duration":71.94072099999994,"failed":false}],[":test/reconcile.test.ts",{"duration":21.84252799999996,"failed":false}],[":test/canonicalize.test.ts",{"duration":16.461569999999938,"failed":false}],[":test/markdown-roundtrip.property.test.ts",{"duration":8485.791874999999,"failed":false}],[":test/stabilize.test.ts",{"duration":149.45158199999992,"failed":false}],[":test/canonicalize-extra.test.ts",{"duration":143.13797799999998,"failed":false}],[":test/loop-guard.test.ts",{"duration":8.612892999999985,"failed":false}],[":test/markdown-document.test.ts",{"duration":9.541832999999997,"failed":false}],[":test/sanitize.test.ts",{"duration":19.523975000000007,"failed":false}],[":test/markdown-converter-golden.test.ts",{"duration":16.99206300000003,"failed":false}],[":test/roundtrip-corpus.test.ts",{"duration":284.4818779999998,"failed":false}],[":test/layout.test.ts",{"duration":19.557320000000004,"failed":false}],[":test/markdown-document-envelope.test.ts",{"duration":17.526741999999956,"failed":false}],[":test/roundtrip.test.ts",{"duration":91.81696899999997,"failed":false}]]}
{"version":"4.1.6","results":[[":test/node-ops.test.ts",{"duration":55.050974999999994,"failed":false}],[":test/markdown-converter.test.ts",{"duration":34.13685399999997,"failed":false}],[":test/diff.test.ts",{"duration":49.63132299999995,"failed":false}],[":test/node-ops-extra.test.ts",{"duration":49.444255,"failed":false}],[":test/reconcile.test.ts",{"duration":14.958778999999993,"failed":false}],[":test/canonicalize.test.ts",{"duration":15.778381999999965,"failed":false}],[":test/markdown-roundtrip.property.test.ts",{"duration":8319.439738000001,"failed":false}],[":test/stabilize.test.ts",{"duration":150.99475900000016,"failed":false}],[":test/canonicalize-extra.test.ts",{"duration":155.9570060000001,"failed":false}],[":test/loop-guard.test.ts",{"duration":8.774560999999949,"failed":false}],[":test/markdown-document.test.ts",{"duration":8.800682999999935,"failed":false}],[":test/sanitize.test.ts",{"duration":13.741441000000009,"failed":false}],[":test/markdown-converter-golden.test.ts",{"duration":16.489082999999994,"failed":false}],[":test/roundtrip-corpus.test.ts",{"duration":298.84454900000014,"failed":false}],[":test/layout.test.ts",{"duration":13.172171000000048,"failed":false}],[":test/markdown-document-envelope.test.ts",{"duration":17.021231,"failed":false}],[":test/roundtrip.test.ts",{"duration":97.44139999999993,"failed":false}]]}