@mp-lb/mdkit 0.2.3 → 0.2.4-main.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/collaboration/useMdKitCollaboration.d.ts +1 -1
  2. package/dist/collaboration/useMdKitCollaboration.js +304 -18
  3. package/dist/core/checkpointPolicy.d.ts +25 -0
  4. package/dist/core/checkpointPolicy.js +45 -0
  5. package/dist/core/index.d.ts +2 -0
  6. package/dist/core/index.js +1 -0
  7. package/dist/document/MdKitConflictPanel.d.ts +1 -1
  8. package/dist/document/MdKitConflictPanel.js +1 -1
  9. package/dist/document/MdKitDocumentToolbar.d.ts +3 -3
  10. package/dist/document/MdKitDocumentToolbar.js +6 -8
  11. package/dist/document/documentTypes.d.ts +7 -0
  12. package/dist/document/useMdKitDocument.d.ts +1 -1
  13. package/dist/fastify.d.ts +3 -3
  14. package/dist/fastify.js +1 -1
  15. package/dist/index.d.ts +29 -25
  16. package/dist/index.js +14 -12
  17. package/dist/markdown/MarkdownBubbleMenu.js +1 -1
  18. package/dist/markdown/MdKitEditor.d.ts +2 -2
  19. package/dist/markdown/MdKitEditor.js +2 -2
  20. package/dist/markdown/MdKitView.js +1 -1
  21. package/dist/markdown/TiptapMarkdownSurface.d.ts +2 -2
  22. package/dist/markdown/TiptapMarkdownSurface.js +17 -26
  23. package/dist/markdown/createMdKitTiptapExtensions.d.ts +8 -0
  24. package/dist/markdown/createMdKitTiptapExtensions.js +27 -0
  25. package/dist/markdown/prepareMarkdownForEditorHydration.js +1 -1
  26. package/dist/markdown/preserveMarkdownWhitespace.js +1 -1
  27. package/dist/server.d.ts +2 -0
  28. package/dist/server.js +1 -0
  29. package/dist/theme/MdKitThemeEditor.d.ts +1 -1
  30. package/dist/transport/backend.d.ts +29 -0
  31. package/dist/transport/backend.js +93 -0
  32. package/dist/transport/fastify.d.ts +1 -1
  33. package/dist/transport/fastify.js +1 -1
  34. package/dist/transport/http.d.ts +1 -1
  35. package/dist/transport/index.d.ts +5 -5
  36. package/dist/transport/index.js +2 -2
  37. package/dist/transport/rest.d.ts +1 -1
  38. package/dist/transport/store.d.ts +1 -1
  39. package/dist/transport/trpcClient.d.ts +29 -8
  40. package/dist/transport/trpcServer.d.ts +1 -1
  41. package/dist/trpc/client.d.ts +3 -3
  42. package/dist/trpc/client.js +1 -1
  43. package/dist/trpc/server.d.ts +5 -3
  44. package/dist/trpc/server.js +2 -1
  45. package/dist/trpc.d.ts +3 -3
  46. package/dist/trpc.js +1 -1
  47. package/dist/versioning/VersionHistoryPanel.d.ts +2 -2
  48. package/dist/versioning/VersionHistoryPanel.js +1 -1
  49. package/dist/versioning/useMdKitDocumentVersions.d.ts +2 -1
  50. package/dist/versioning/useMdKitDocumentVersions.js +6 -6
  51. package/dist/yjs/MdKitMarkdownYjs.d.ts +12 -0
  52. package/dist/yjs/MdKitMarkdownYjs.js +40 -0
  53. package/dist/yjs/index.d.ts +2 -0
  54. package/dist/yjs/index.js +1 -0
  55. package/docs/.vitepress/cache/deps/@theme_index.js +275 -0
  56. package/docs/.vitepress/cache/deps/@theme_index.js.map +7 -0
  57. package/docs/.vitepress/cache/deps/_metadata.json +40 -0
  58. package/docs/.vitepress/cache/deps/chunk-PM3I3KHC.js +9719 -0
  59. package/docs/.vitepress/cache/deps/chunk-PM3I3KHC.js.map +7 -0
  60. package/docs/.vitepress/cache/deps/chunk-VSHFF4ZG.js +13018 -0
  61. package/docs/.vitepress/cache/deps/chunk-VSHFF4ZG.js.map +7 -0
  62. package/docs/.vitepress/cache/deps/package.json +3 -0
  63. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +4505 -0
  64. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +7 -0
  65. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +583 -0
  66. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +7 -0
  67. package/docs/.vitepress/cache/deps/vue.js +347 -0
  68. package/docs/.vitepress/cache/deps/vue.js.map +7 -0
  69. package/docs/.vitepress/config.ts +11 -0
  70. package/docs/api.md +153 -18
  71. package/docs/architecture.md +24 -9
  72. package/docs/collaboration-persistence.md +147 -0
  73. package/docs/index.md +140 -65
  74. package/docs/permissions.md +139 -0
  75. package/docs/rest.md +98 -0
  76. package/docs/shadcn.md +6 -3
  77. package/docs/styling.md +11 -10
  78. package/docs/use-cases.md +148 -0
  79. package/package.json +15 -2
package/dist/index.js CHANGED
@@ -1,12 +1,14 @@
1
- export { useMdKitCollaboration } from "./collaboration/useMdKitCollaboration";
2
- export { createMdKitDocumentRecord, detectMdKitDocumentConflict, normalizeMdKitVersionToken, restoreMdKitDocumentVersion, writeMdKitDocumentRecord, } from "./core/documentEngine";
3
- export { useMdKitDocument } from "./document/useMdKitDocument";
4
- export { MdKitConflictPanel } from "./document/MdKitConflictPanel";
5
- export { MdKitDocumentToolbar } from "./document/MdKitDocumentToolbar";
6
- export { MdKitEditor } from "./markdown/MdKitEditor";
7
- export { MdKitView } from "./markdown/MdKitView";
8
- export { MdKitThemeEditor } from "./theme/MdKitThemeEditor";
9
- export { createMdKitRestAdapter } from "./transport/rest";
10
- export { createMdKitEditorThemeStyle, darkMdKitEditorTheme, defaultMdKitEditorTheme, } from "./theme/editorTheme";
11
- export { VersionHistoryPanel } from "./versioning/VersionHistoryPanel";
12
- export { useMdKitDocumentVersions } from "./versioning/useMdKitDocumentVersions";
1
+ export { useMdKitCollaboration } from "./collaboration/useMdKitCollaboration.js";
2
+ export { CheckpointPolicy, measureMdKitEditDistance, } from "./core/checkpointPolicy.js";
3
+ export { createMdKitDocumentRecord, detectMdKitDocumentConflict, normalizeMdKitVersionToken, restoreMdKitDocumentVersion, writeMdKitDocumentRecord, } from "./core/documentEngine.js";
4
+ export { useMdKitDocument } from "./document/useMdKitDocument.js";
5
+ export { MdKitConflictPanel } from "./document/MdKitConflictPanel.js";
6
+ export { MdKitDocumentToolbar } from "./document/MdKitDocumentToolbar.js";
7
+ export { MdKitEditor } from "./markdown/MdKitEditor.js";
8
+ export { MdKitView } from "./markdown/MdKitView.js";
9
+ export { MdKitThemeEditor } from "./theme/MdKitThemeEditor.js";
10
+ export { createMdKitRestAdapter } from "./transport/rest.js";
11
+ export { createMdKitEditorThemeStyle, darkMdKitEditorTheme, defaultMdKitEditorTheme, } from "./theme/editorTheme.js";
12
+ export { VersionHistoryPanel } from "./versioning/VersionHistoryPanel.js";
13
+ export { useMdKitDocumentVersions } from "./versioning/useMdKitDocumentVersions.js";
14
+ export { yjs } from "./yjs/index.js";
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEditorState } from "@tiptap/react";
3
3
  import { BubbleMenu } from "@tiptap/react/menus";
4
4
  import { Bold, Code2, Heading1, Heading2, Italic, Link2, List, ListOrdered, Quote, Strikethrough, } from "lucide-react";
5
- import { joinClassNames } from "../ui/joinClassNames";
5
+ import { joinClassNames } from "../ui/joinClassNames.js";
6
6
  const toolbarActiveStateIsEqual = (left, right) => {
7
7
  if (!right) {
8
8
  return false;
@@ -1,6 +1,6 @@
1
1
  import type { CSSProperties } from "react";
2
- import type { MdKitCollaborationSession } from "../document/documentTypes";
3
- import type { MdKitEditorDebugEvent } from "./editorDebug";
2
+ import type { MdKitCollaborationSession } from "../document/documentTypes.js";
3
+ import type { MdKitEditorDebugEvent } from "./editorDebug.js";
4
4
  type MdKitEditorBaseProps = {
5
5
  className?: string;
6
6
  fillHeight?: boolean;
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { joinClassNames } from "../ui/joinClassNames";
3
- import { TiptapMarkdownSurface } from "./TiptapMarkdownSurface";
2
+ import { joinClassNames } from "../ui/joinClassNames.js";
3
+ import { TiptapMarkdownSurface } from "./TiptapMarkdownSurface.js";
4
4
  export const MdKitEditor = (props) => {
5
5
  const { className, fillHeight = false, readOnly = false, style, ...surfaceProps } = props;
6
6
  return (_jsx("div", { className: joinClassNames("mp-lb-mdkit-markdown-editor", fillHeight && "mp-lb-mdkit-markdown-editor-fill-height", className), "data-read-only": readOnly ? "true" : undefined, style: style, children: _jsx(TiptapMarkdownSurface, { readOnly: readOnly, ...surfaceProps }, props.instanceKey) }));
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import ReactMarkdown from "react-markdown";
3
3
  import remarkGfm from "remark-gfm";
4
- import { joinClassNames } from "../ui/joinClassNames";
4
+ import { joinClassNames } from "../ui/joinClassNames.js";
5
5
  export const MdKitView = ({ className, fillHeight = false, placeholder, style, value, }) => {
6
6
  const renderedValue = value.trim().length > 0 ? value : (placeholder ?? "");
7
7
  return (_jsx("div", { className: joinClassNames("mp-lb-mdkit-markdown-editor", "mp-lb-mdkit-markdown-view", fillHeight && "mp-lb-mdkit-markdown-editor-fill-height", className), "data-read-only": "true", style: style, children: _jsx("div", { className: "mp-lb-mdkit-editor-shell", children: _jsx("div", { className: "mp-lb-mdkit-editor-surface", children: renderedValue.length > 0 ? (_jsx("div", { className: "mp-lb-mdkit-tiptap mp-lb-mdkit-view-content", children: _jsx(ReactMarkdown, { components: {
@@ -1,5 +1,5 @@
1
- import type { MdKitCollaborationSession } from "../document/documentTypes";
2
- import type { MdKitEditorDebugEvent } from "./editorDebug";
1
+ import type { MdKitCollaborationSession } from "../document/documentTypes.js";
2
+ import type { MdKitEditorDebugEvent } from "./editorDebug.js";
3
3
  type LocalTiptapMarkdownSurfaceProps = {
4
4
  collaboration?: null;
5
5
  onChange?: (markdown: string) => void;
@@ -2,13 +2,11 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useMemo, useRef } from "react";
3
3
  import Collaboration from "@tiptap/extension-collaboration";
4
4
  import CollaborationCaret from "@tiptap/extension-collaboration-caret";
5
- import { Markdown } from "@tiptap/markdown";
6
- import Placeholder from "@tiptap/extension-placeholder";
7
5
  import { EditorContent, useEditor } from "@tiptap/react";
8
- import StarterKit from "@tiptap/starter-kit";
9
- import { MarkdownBubbleMenu } from "./MarkdownBubbleMenu";
10
- import { normalizeMarkdownSerialization } from "./normalizeMarkdownSerialization";
11
- import { prepareMarkdownForEditorHydration } from "./prepareMarkdownForEditorHydration";
6
+ import { createMdKitTiptapExtensions } from "./createMdKitTiptapExtensions.js";
7
+ import { MarkdownBubbleMenu } from "./MarkdownBubbleMenu.js";
8
+ import { normalizeMarkdownSerialization } from "./normalizeMarkdownSerialization.js";
9
+ import { prepareMarkdownForEditorHydration } from "./prepareMarkdownForEditorHydration.js";
12
10
  const describeElement = (element) => {
13
11
  const classes = element instanceof HTMLElement && element.className
14
12
  ? `.${String(element.className).trim().replace(/\s+/g, ".")}`
@@ -74,6 +72,8 @@ export const TiptapMarkdownSurface = (props) => {
74
72
  const collaborationDocument = collaboration?.document ?? null;
75
73
  const collaborationProvider = collaboration?.provider ?? null;
76
74
  const collaborationUserColor = collaboration?.collaborator.color ?? "";
75
+ const collaborationUserId = collaboration?.collaborator.id ?? "";
76
+ const collaborationUserImageUrl = collaboration?.collaborator.imageUrl ?? "";
77
77
  const collaborationUserName = collaboration?.collaborator.name ?? "";
78
78
  const hasCollaboration = !!collaborationDocument;
79
79
  useEffect(() => {
@@ -105,11 +105,19 @@ export const TiptapMarkdownSurface = (props) => {
105
105
  }),
106
106
  user: {
107
107
  color: collaborationUserColor,
108
+ id: collaborationUserId,
109
+ imageUrl: collaborationUserImageUrl || undefined,
108
110
  name: collaborationUserName,
109
111
  },
110
112
  }),
111
113
  ]
112
- : [], [collaborationProvider, collaborationUserColor, collaborationUserName]);
114
+ : [], [
115
+ collaborationProvider,
116
+ collaborationUserColor,
117
+ collaborationUserId,
118
+ collaborationUserImageUrl,
119
+ collaborationUserName,
120
+ ]);
113
121
  const editor = useEditor({
114
122
  content: hasCollaboration
115
123
  ? undefined
@@ -123,26 +131,9 @@ export const TiptapMarkdownSurface = (props) => {
123
131
  },
124
132
  },
125
133
  extensions: [
126
- StarterKit.configure({
127
- heading: { levels: [1, 2] },
128
- link: {
129
- HTMLAttributes: {
130
- rel: "noopener noreferrer",
131
- target: "_blank",
132
- },
133
- autolink: true,
134
- linkOnPaste: true,
135
- openOnClick: true,
136
- },
137
- undoRedo: hasCollaboration ? false : undefined,
138
- }),
139
- Placeholder.configure({
134
+ ...createMdKitTiptapExtensions({
140
135
  placeholder,
141
- }),
142
- Markdown.configure({
143
- markedOptions: {
144
- gfm: true,
145
- },
136
+ undoRedo: !hasCollaboration,
146
137
  }),
147
138
  ...(collaborationDocument
148
139
  ? [
@@ -0,0 +1,8 @@
1
+ import type { Extensions } from "@tiptap/core";
2
+ type CreateMdKitTiptapExtensionsOptions = {
3
+ placeholder?: string;
4
+ undoRedo?: boolean;
5
+ };
6
+ export declare const defaultMdKitMarkdownPlaceholder = "Start writing...";
7
+ export declare const createMdKitTiptapExtensions: ({ placeholder, undoRedo, }?: CreateMdKitTiptapExtensionsOptions) => Extensions;
8
+ export {};
@@ -0,0 +1,27 @@
1
+ import { Markdown } from "@tiptap/markdown";
2
+ import Placeholder from "@tiptap/extension-placeholder";
3
+ import StarterKit from "@tiptap/starter-kit";
4
+ export const defaultMdKitMarkdownPlaceholder = "Start writing...";
5
+ export const createMdKitTiptapExtensions = ({ placeholder = defaultMdKitMarkdownPlaceholder, undoRedo = true, } = {}) => [
6
+ StarterKit.configure({
7
+ heading: { levels: [1, 2] },
8
+ link: {
9
+ HTMLAttributes: {
10
+ rel: "noopener noreferrer",
11
+ target: "_blank",
12
+ },
13
+ autolink: true,
14
+ linkOnPaste: true,
15
+ openOnClick: true,
16
+ },
17
+ undoRedo: undoRedo ? undefined : false,
18
+ }),
19
+ Placeholder.configure({
20
+ placeholder,
21
+ }),
22
+ Markdown.configure({
23
+ markedOptions: {
24
+ gfm: true,
25
+ },
26
+ }),
27
+ ];
@@ -1,4 +1,4 @@
1
- import { getMarkdownFenceRanges, isInsideMarkdownFence, } from "./markdownFenceRanges";
1
+ import { getMarkdownFenceRanges, isInsideMarkdownFence, } from "./markdownFenceRanges.js";
2
2
  const expandedBlankLineRunPattern = /\n{3,}/g;
3
3
  export const prepareMarkdownForEditorHydration = (markdown) => {
4
4
  const fenceRanges = getMarkdownFenceRanges(markdown);
@@ -1,4 +1,4 @@
1
- import { getMarkdownFenceRanges, isInsideMarkdownFence, } from "./markdownFenceRanges";
1
+ import { getMarkdownFenceRanges, isInsideMarkdownFence, } from "./markdownFenceRanges.js";
2
2
  const tokenizeMarkdownBlocks = (markdown) => {
3
3
  const ranges = getMarkdownFenceRanges(markdown);
4
4
  const tokens = [];
@@ -0,0 +1,2 @@
1
+ export { createMdKitBackend } from "./transport/backend.js";
2
+ export type { CreateMdKitBackendOptions, MdKitBackendStore, MdKitCreateCheckpointInput, } from "./transport/backend.js";
package/dist/server.js ADDED
@@ -0,0 +1 @@
1
+ export { createMdKitBackend } from "./transport/backend.js";
@@ -1,4 +1,4 @@
1
- import type { MdKitEditorTheme } from "./editorTheme";
1
+ import type { MdKitEditorTheme } from "./editorTheme.js";
2
2
  export type MdKitThemeEditorProps = {
3
3
  className?: string;
4
4
  onChange: (theme: MdKitEditorTheme) => void;
@@ -0,0 +1,29 @@
1
+ import type { MdKitDocumentSnapshot, MdKitDocumentVersionDetail, MdKitDocumentVersionSummary, MdKitDocumentVersionToken, MdKitDocumentWriteInput, MdKitDocumentWriteResult } from "../document/documentTypes.js";
2
+ import { type MdKitCheckpointPolicy } from "../core/checkpointPolicy.js";
3
+ import type { MdKitRestoreDocumentVersionInput, MdKitTransportStore } from "./store.js";
4
+ export type MdKitCreateCheckpointInput = {
5
+ content: string;
6
+ documentId: string;
7
+ metadata?: unknown;
8
+ sourceRevision: MdKitDocumentVersionToken;
9
+ };
10
+ export type MdKitBackendStore = {
11
+ createCheckpoint?(input: MdKitCreateCheckpointInput): Promise<MdKitDocumentVersionSummary> | MdKitDocumentVersionSummary;
12
+ getLatestCheckpoint?(documentId: string): Promise<MdKitDocumentVersionDetail | null> | MdKitDocumentVersionDetail | null;
13
+ listDocumentVersions?(documentId: string): Promise<MdKitDocumentVersionSummary[]> | MdKitDocumentVersionSummary[];
14
+ readCollaborationState?(documentName: string): Promise<Uint8Array | null> | Uint8Array | null;
15
+ readDocument(documentId: string): Promise<MdKitDocumentSnapshot> | MdKitDocumentSnapshot;
16
+ readDocumentVersion?(input: {
17
+ documentId: string;
18
+ versionId: string;
19
+ }): Promise<MdKitDocumentVersionDetail | null> | MdKitDocumentVersionDetail | null;
20
+ resyncDocument?(documentId: string): Promise<MdKitDocumentSnapshot> | MdKitDocumentSnapshot;
21
+ restoreDocumentVersion?(input: MdKitRestoreDocumentVersionInput): Promise<MdKitDocumentWriteResult> | MdKitDocumentWriteResult;
22
+ writeCollaborationState?(documentName: string, state: Uint8Array): Promise<void> | void;
23
+ writeDocument(input: MdKitDocumentWriteInput): Promise<MdKitDocumentWriteResult> | MdKitDocumentWriteResult;
24
+ };
25
+ export type CreateMdKitBackendOptions = {
26
+ checkpointPolicy?: MdKitCheckpointPolicy;
27
+ store: MdKitBackendStore;
28
+ };
29
+ export declare const createMdKitBackend: ({ checkpointPolicy, store, }: CreateMdKitBackendOptions) => MdKitTransportStore;
@@ -0,0 +1,93 @@
1
+ import { CheckpointPolicy, measureMdKitEditDistance, } from "../core/checkpointPolicy.js";
2
+ const timestampMs = (value) => {
3
+ if (!value) {
4
+ return null;
5
+ }
6
+ const timestamp = Date.parse(value);
7
+ return Number.isFinite(timestamp) ? timestamp : null;
8
+ };
9
+ const successfulWriteRevision = (result) => "conflict" in result ? null : result.version;
10
+ const latestCheckpointFromList = async (store, documentId) => {
11
+ const versions = await store.listDocumentVersions?.(documentId);
12
+ const latestSummary = versions?.at(-1);
13
+ if (!latestSummary || !store.readDocumentVersion) {
14
+ return null;
15
+ }
16
+ return store.readDocumentVersion({
17
+ documentId,
18
+ versionId: latestSummary.id,
19
+ });
20
+ };
21
+ const readLatestCheckpoint = async (store, documentId) => (await store.getLatestCheckpoint?.(documentId)) ??
22
+ (await latestCheckpointFromList(store, documentId));
23
+ const maybeCreateCheckpoint = async (store, policy, input, result) => {
24
+ const sourceRevision = successfulWriteRevision(result);
25
+ if (!store.createCheckpoint || sourceRevision === null) {
26
+ return;
27
+ }
28
+ const previousCheckpoint = await readLatestCheckpoint(store, input.documentId);
29
+ const previousCheckpointContent = previousCheckpoint?.content ?? null;
30
+ const editDistance = measureMdKitEditDistance(previousCheckpointContent ?? "", input.content);
31
+ const checkpointTimestamp = timestampMs(previousCheckpoint?.createdAt);
32
+ const timeSinceLastCheckpointMs = checkpointTimestamp === null ? null : Date.now() - checkpointTimestamp;
33
+ const shouldCheckpoint = await policy.shouldCheckpoint({
34
+ currentContent: input.content,
35
+ documentId: input.documentId,
36
+ editDistance,
37
+ previousCheckpoint,
38
+ previousCheckpointContent,
39
+ timeSinceLastCheckpointMs,
40
+ writeInput: input,
41
+ writeResult: result,
42
+ });
43
+ if (!shouldCheckpoint) {
44
+ return;
45
+ }
46
+ await store.createCheckpoint({
47
+ content: input.content,
48
+ documentId: input.documentId,
49
+ sourceRevision,
50
+ });
51
+ };
52
+ const restoreWithStorePrimitives = async (store, input) => {
53
+ if (!store.readDocumentVersion) {
54
+ if (!store.restoreDocumentVersion) {
55
+ throw new Error("Version restore is not supported");
56
+ }
57
+ return store.restoreDocumentVersion(input);
58
+ }
59
+ const restoredVersion = await store.readDocumentVersion(input);
60
+ if (!restoredVersion) {
61
+ throw new Error(`Version not found: ${input.versionId}`);
62
+ }
63
+ const current = await store.readDocument(input.documentId);
64
+ const latestCheckpoint = await readLatestCheckpoint(store, input.documentId);
65
+ if (store.createCheckpoint &&
66
+ latestCheckpoint?.content !== current.content) {
67
+ await store.createCheckpoint({
68
+ content: current.content,
69
+ documentId: input.documentId,
70
+ sourceRevision: current.version,
71
+ });
72
+ }
73
+ return store.writeDocument({
74
+ baseVersion: current.version,
75
+ content: restoredVersion.content,
76
+ documentId: input.documentId,
77
+ force: true,
78
+ });
79
+ };
80
+ export const createMdKitBackend = ({ checkpointPolicy = CheckpointPolicy.never(), store, }) => ({
81
+ listDocumentVersions: (documentId) => store.listDocumentVersions?.(documentId) ?? [],
82
+ readCollaborationState: (documentName) => store.readCollaborationState?.(documentName) ?? null,
83
+ readDocument: (documentId) => store.readDocument(documentId),
84
+ readDocumentVersion: (input) => store.readDocumentVersion?.(input) ?? null,
85
+ resyncDocument: (documentId) => (store.resyncDocument ?? store.readDocument)(documentId),
86
+ restoreDocumentVersion: (input) => restoreWithStorePrimitives(store, input),
87
+ writeCollaborationState: (documentName, state) => store.writeCollaborationState?.(documentName, state),
88
+ writeDocument: async (input) => {
89
+ const result = await store.writeDocument(input);
90
+ await maybeCreateCheckpoint(store, checkpointPolicy, input, result);
91
+ return result;
92
+ },
93
+ });
@@ -1,5 +1,5 @@
1
1
  import type { FastifyInstance } from "fastify";
2
- import type { MdKitTransportStore } from "./store";
2
+ import type { MdKitTransportStore } from "./store.js";
3
3
  export type RegisterMdKitFastifyOptions = {
4
4
  prefix?: string;
5
5
  store: MdKitTransportStore;
@@ -1,4 +1,4 @@
1
- import { createMdKitHttpHandlers } from "./http";
1
+ import { createMdKitHttpHandlers } from "./http.js";
2
2
  const send = async (reply, response) => {
3
3
  const { body, status } = await response;
4
4
  return reply.status(status).send(body);
@@ -1,4 +1,4 @@
1
- import type { MdKitTransportStore } from "./store";
1
+ import type { MdKitTransportStore } from "./store.js";
2
2
  export type MdKitHttpRequest = {
3
3
  body?: unknown;
4
4
  params?: Record<string, unknown>;
@@ -1,5 +1,5 @@
1
- export { createMdKitHttpHandlers } from "./http";
2
- export { createMdKitRestAdapter } from "./rest";
3
- export type { MdKitHttpHandlers, MdKitHttpRequest, MdKitHttpResponse, } from "./http";
4
- export type { CreateMdKitRestAdapterOptions } from "./rest";
5
- export type { MdKitRestoreDocumentVersionInput, MdKitTransportStore, } from "./store";
1
+ export { createMdKitHttpHandlers } from "./http.js";
2
+ export { createMdKitRestAdapter } from "./rest.js";
3
+ export type { MdKitHttpHandlers, MdKitHttpRequest, MdKitHttpResponse, } from "./http.js";
4
+ export type { CreateMdKitRestAdapterOptions } from "./rest.js";
5
+ export type { MdKitRestoreDocumentVersionInput, MdKitTransportStore, } from "./store.js";
@@ -1,2 +1,2 @@
1
- export { createMdKitHttpHandlers } from "./http";
2
- export { createMdKitRestAdapter } from "./rest";
1
+ export { createMdKitHttpHandlers } from "./http.js";
2
+ export { createMdKitRestAdapter } from "./rest.js";
@@ -1,4 +1,4 @@
1
- import type { MdKitDocumentAdapter } from "../document/documentTypes";
1
+ import type { MdKitDocumentAdapter } from "../document/documentTypes.js";
2
2
  export type CreateMdKitRestAdapterOptions = {
3
3
  baseUrl: string;
4
4
  fetch?: typeof fetch;
@@ -1,4 +1,4 @@
1
- import type { MdKitDocumentSnapshot, MdKitDocumentVersionDetail, MdKitDocumentVersionSummary, MdKitDocumentWriteInput, MdKitDocumentWriteResult } from "../document/documentTypes";
1
+ import type { MdKitDocumentSnapshot, MdKitDocumentVersionDetail, MdKitDocumentVersionSummary, MdKitDocumentWriteInput, MdKitDocumentWriteResult } from "../document/documentTypes.js";
2
2
  export type MdKitTransportStore = {
3
3
  readDocument(documentId: string): Promise<MdKitDocumentSnapshot> | MdKitDocumentSnapshot;
4
4
  writeDocument(input: MdKitDocumentWriteInput): Promise<MdKitDocumentWriteResult> | MdKitDocumentWriteResult;
@@ -1,11 +1,31 @@
1
- import { createTRPCProxyClient } from "@trpc/client";
2
- import type { MdKitDocumentAdapter } from "../document/documentTypes";
3
- import type { MdKitTrpcRouter } from "./trpcServer";
1
+ import type { MdKitDocumentAdapter, MdKitDocumentSnapshot, MdKitDocumentVersionDetail, MdKitDocumentVersionSummary, MdKitDocumentWriteInput, MdKitDocumentWriteResult } from "../document/documentTypes.js";
4
2
  export type CreateMdKitTrpcClientAdapterOptions = {
5
3
  url: string;
6
4
  };
5
+ type MdKitTrpcQuery<Input, Output> = {
6
+ query(input: Input): Promise<Output>;
7
+ };
8
+ type MdKitTrpcMutation<Input, Output> = {
9
+ mutate(input: Input): Promise<Output>;
10
+ };
11
+ type MdKitDocumentInput = {
12
+ documentId: string;
13
+ };
14
+ type MdKitVersionInput = {
15
+ documentId: string;
16
+ versionId: string;
17
+ };
18
+ export type MdKitTrpcClient = {
19
+ listDocumentVersions: MdKitTrpcQuery<MdKitDocumentInput, {
20
+ versions: MdKitDocumentVersionSummary[];
21
+ }>;
22
+ readDocument: MdKitTrpcQuery<MdKitDocumentInput, MdKitDocumentSnapshot>;
23
+ readDocumentVersion: MdKitTrpcQuery<MdKitVersionInput, MdKitDocumentVersionDetail | null>;
24
+ resyncDocument: MdKitTrpcMutation<MdKitDocumentInput, MdKitDocumentSnapshot>;
25
+ writeDocument: MdKitTrpcMutation<MdKitDocumentWriteInput, MdKitDocumentWriteResult>;
26
+ };
7
27
  export type CreateMdKitTrpcAdapterOptions = {
8
- client: ReturnType<typeof createTRPCProxyClient<MdKitTrpcRouter>>;
28
+ client: MdKitTrpcClient;
9
29
  };
10
30
  export declare const createMdKitTrpcAdapter: ({ client, }: CreateMdKitTrpcAdapterOptions) => MdKitDocumentAdapter;
11
31
  export declare const createMdKitTrpcClient: ({ url, }: CreateMdKitTrpcClientAdapterOptions) => import("@trpc/client").TRPCClient<import("@trpc/server").TRPCBuiltRouter<{
@@ -19,7 +39,7 @@ export declare const createMdKitTrpcClient: ({ url, }: CreateMdKitTrpcClientAdap
19
39
  documentId: string;
20
40
  };
21
41
  output: {
22
- versions: import("..").MdKitDocumentVersionSummary[];
42
+ versions: MdKitDocumentVersionSummary[];
23
43
  };
24
44
  meta: object;
25
45
  }>;
@@ -27,7 +47,7 @@ export declare const createMdKitTrpcClient: ({ url, }: CreateMdKitTrpcClientAdap
27
47
  input: {
28
48
  documentId: string;
29
49
  };
30
- output: import("..").MdKitDocumentSnapshot;
50
+ output: MdKitDocumentSnapshot;
31
51
  meta: object;
32
52
  }>;
33
53
  readDocumentVersion: import("@trpc/server").TRPCQueryProcedure<{
@@ -35,14 +55,14 @@ export declare const createMdKitTrpcClient: ({ url, }: CreateMdKitTrpcClientAdap
35
55
  documentId: string;
36
56
  versionId: string;
37
57
  };
38
- output: import("..").MdKitDocumentVersionDetail | null;
58
+ output: MdKitDocumentVersionDetail | null;
39
59
  meta: object;
40
60
  }>;
41
61
  resyncDocument: import("@trpc/server").TRPCMutationProcedure<{
42
62
  input: {
43
63
  documentId: string;
44
64
  };
45
- output: import("..").MdKitDocumentSnapshot;
65
+ output: MdKitDocumentSnapshot;
46
66
  meta: object;
47
67
  }>;
48
68
  restoreDocumentVersion: import("@trpc/server").TRPCMutationProcedure<{
@@ -79,3 +99,4 @@ export declare const createMdKitTrpcClient: ({ url, }: CreateMdKitTrpcClientAdap
79
99
  }>;
80
100
  }>>>;
81
101
  export declare const createMdKitTrpcClientAdapter: ({ url, }: CreateMdKitTrpcClientAdapterOptions) => MdKitDocumentAdapter;
102
+ export {};
@@ -1,4 +1,4 @@
1
- import type { MdKitTransportStore } from "./store";
1
+ import type { MdKitTransportStore } from "./store.js";
2
2
  export declare const createMdKitTrpcRouter: (store: MdKitTransportStore) => import("@trpc/server").TRPCBuiltRouter<{
3
3
  ctx: object;
4
4
  meta: object;
@@ -1,3 +1,3 @@
1
- export { createMdKitTrpcAdapter, createMdKitTrpcClient, createMdKitTrpcClientAdapter, } from "../transport/trpcClient";
2
- export type { CreateMdKitTrpcAdapterOptions, CreateMdKitTrpcClientAdapterOptions, } from "../transport/trpcClient";
3
- export type { MdKitTrpcRouter } from "../transport/trpcServer";
1
+ export { createMdKitTrpcAdapter, createMdKitTrpcClient, createMdKitTrpcClientAdapter, } from "../transport/trpcClient.js";
2
+ export type { CreateMdKitTrpcAdapterOptions, CreateMdKitTrpcClientAdapterOptions, MdKitTrpcClient, } from "../transport/trpcClient.js";
3
+ export type { MdKitTrpcRouter } from "../transport/trpcServer.js";
@@ -1 +1 @@
1
- export { createMdKitTrpcAdapter, createMdKitTrpcClient, createMdKitTrpcClientAdapter, } from "../transport/trpcClient";
1
+ export { createMdKitTrpcAdapter, createMdKitTrpcClient, createMdKitTrpcClientAdapter, } from "../transport/trpcClient.js";
@@ -1,3 +1,5 @@
1
- export { createMdKitTrpcRouter } from "../transport/trpcServer";
2
- export type { MdKitTrpcRouter } from "../transport/trpcServer";
3
- export type { MdKitRestoreDocumentVersionInput, MdKitTransportStore, } from "../transport/store";
1
+ export { createMdKitBackend } from "../transport/backend.js";
2
+ export { createMdKitTrpcRouter } from "../transport/trpcServer.js";
3
+ export type { CreateMdKitBackendOptions, MdKitBackendStore, MdKitCreateCheckpointInput, } from "../transport/backend.js";
4
+ export type { MdKitTrpcRouter } from "../transport/trpcServer.js";
5
+ export type { MdKitRestoreDocumentVersionInput, MdKitTransportStore, } from "../transport/store.js";
@@ -1 +1,2 @@
1
- export { createMdKitTrpcRouter } from "../transport/trpcServer";
1
+ export { createMdKitBackend } from "../transport/backend.js";
2
+ export { createMdKitTrpcRouter } from "../transport/trpcServer.js";
package/dist/trpc.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { createMdKitTrpcAdapter, createMdKitTrpcClient, createMdKitTrpcClientAdapter, } from "./transport/trpcClient";
2
- export type { CreateMdKitTrpcAdapterOptions, CreateMdKitTrpcClientAdapterOptions, } from "./transport/trpcClient";
3
- export type { MdKitTrpcRouter } from "./transport/trpcServer";
1
+ export { createMdKitTrpcAdapter, createMdKitTrpcClient, createMdKitTrpcClientAdapter, } from "./transport/trpcClient.js";
2
+ export type { CreateMdKitTrpcAdapterOptions, CreateMdKitTrpcClientAdapterOptions, MdKitTrpcClient, } from "./transport/trpcClient.js";
3
+ export type { MdKitTrpcRouter } from "./transport/trpcServer.js";
package/dist/trpc.js CHANGED
@@ -1 +1 @@
1
- export { createMdKitTrpcAdapter, createMdKitTrpcClient, createMdKitTrpcClientAdapter, } from "./transport/trpcClient";
1
+ export { createMdKitTrpcAdapter, createMdKitTrpcClient, createMdKitTrpcClientAdapter, } from "./transport/trpcClient.js";
@@ -1,5 +1,5 @@
1
- import type { MdKitDocumentVersionDetail } from "../document/documentTypes";
2
- import type { MdKitDocumentVersionsController } from "./useMdKitDocumentVersions";
1
+ import type { MdKitDocumentVersionDetail } from "../document/documentTypes.js";
2
+ import type { MdKitDocumentVersionsController } from "./useMdKitDocumentVersions.js";
3
3
  export type VersionHistoryPanelProps = {
4
4
  className?: string;
5
5
  controller: MdKitDocumentVersionsController;
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useState } from "react";
3
- import { joinClassNames } from "../ui/joinClassNames";
3
+ import { joinClassNames } from "../ui/joinClassNames.js";
4
4
  const getVersionLabel = (version) => {
5
5
  if (version.label) {
6
6
  return version.label;
@@ -1,7 +1,8 @@
1
- import type { MdKitDocumentAdapter, MdKitDocumentVersionDetail, MdKitDocumentVersionSummary } from "../document/documentTypes";
1
+ import type { MdKitDocumentAdapter, MdKitDocumentVersionDetail, MdKitDocumentVersionSummary } from "../document/documentTypes.js";
2
2
  export type UseMdKitDocumentVersionsOptions = {
3
3
  adapter: Pick<MdKitDocumentAdapter, "listDocumentVersions" | "readDocumentVersion">;
4
4
  documentId: string | null;
5
+ enabled?: boolean;
5
6
  };
6
7
  export type MdKitDocumentVersionsController = {
7
8
  error: string | null;
@@ -1,14 +1,14 @@
1
1
  import { useCallback, useEffect, useMemo, useState } from "react";
2
2
  export const useMdKitDocumentVersions = (options) => {
3
- const { adapter, documentId } = options;
3
+ const { adapter, documentId, enabled = true } = options;
4
4
  const [versions, setVersions] = useState([]);
5
5
  const [selectedVersionId, setSelectedVersionId] = useState(null);
6
6
  const [selectedVersion, setSelectedVersion] = useState(null);
7
7
  const [isLoading, setIsLoading] = useState(false);
8
8
  const [error, setError] = useState(null);
9
- const hasVersioning = !!adapter.listDocumentVersions && !!adapter.readDocumentVersion;
9
+ const hasVersioning = enabled && !!adapter.listDocumentVersions && !!adapter.readDocumentVersion;
10
10
  const refresh = useCallback(async () => {
11
- if (!documentId || !adapter.listDocumentVersions) {
11
+ if (!hasVersioning || !documentId || !adapter.listDocumentVersions) {
12
12
  setVersions([]);
13
13
  setSelectedVersionId(null);
14
14
  setSelectedVersion(null);
@@ -34,9 +34,9 @@ export const useMdKitDocumentVersions = (options) => {
34
34
  finally {
35
35
  setIsLoading(false);
36
36
  }
37
- }, [adapter, documentId]);
37
+ }, [adapter, documentId, hasVersioning]);
38
38
  const openVersion = useCallback(async (versionId) => {
39
- if (!documentId || !adapter.readDocumentVersion) {
39
+ if (!hasVersioning || !documentId || !adapter.readDocumentVersion) {
40
40
  return;
41
41
  }
42
42
  setSelectedVersionId(versionId);
@@ -60,7 +60,7 @@ export const useMdKitDocumentVersions = (options) => {
60
60
  finally {
61
61
  setIsLoading(false);
62
62
  }
63
- }, [adapter, documentId]);
63
+ }, [adapter, documentId, hasVersioning]);
64
64
  useEffect(() => {
65
65
  setSelectedVersionId(null);
66
66
  setSelectedVersion(null);
@@ -0,0 +1,12 @@
1
+ import * as Y from "yjs";
2
+ export type MdKitMarkdownYjsOptions = {
3
+ fragmentName?: string;
4
+ };
5
+ export declare const replaceMdKitYjsMarkdown: (ydoc: Y.Doc, markdown: string, options?: MdKitMarkdownYjsOptions) => Uint8Array;
6
+ export declare const markdownToMdKitYjs: (markdown: string, options?: MdKitMarkdownYjsOptions) => Uint8Array;
7
+ export declare const mdKitYjsToMarkdown: (yjsState: Uint8Array, options?: MdKitMarkdownYjsOptions) => string;
8
+ export declare const yjs: {
9
+ markdownToMdKitYjs: (markdown: string, options?: MdKitMarkdownYjsOptions) => Uint8Array;
10
+ mdKitYjsToMarkdown: (yjsState: Uint8Array, options?: MdKitMarkdownYjsOptions) => string;
11
+ replaceMdKitYjsMarkdown: (ydoc: Y.Doc, markdown: string, options?: MdKitMarkdownYjsOptions) => Uint8Array;
12
+ };