@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.
- package/dist/collaboration/useMdKitCollaboration.d.ts +1 -1
- package/dist/collaboration/useMdKitCollaboration.js +304 -18
- package/dist/core/checkpointPolicy.d.ts +25 -0
- package/dist/core/checkpointPolicy.js +45 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +1 -0
- package/dist/document/MdKitConflictPanel.d.ts +1 -1
- package/dist/document/MdKitConflictPanel.js +1 -1
- package/dist/document/MdKitDocumentToolbar.d.ts +3 -3
- package/dist/document/MdKitDocumentToolbar.js +6 -8
- package/dist/document/documentTypes.d.ts +7 -0
- package/dist/document/useMdKitDocument.d.ts +1 -1
- package/dist/fastify.d.ts +3 -3
- package/dist/fastify.js +1 -1
- package/dist/index.d.ts +29 -25
- package/dist/index.js +14 -12
- package/dist/markdown/MarkdownBubbleMenu.js +1 -1
- package/dist/markdown/MdKitEditor.d.ts +2 -2
- package/dist/markdown/MdKitEditor.js +2 -2
- package/dist/markdown/MdKitView.js +1 -1
- package/dist/markdown/TiptapMarkdownSurface.d.ts +2 -2
- package/dist/markdown/TiptapMarkdownSurface.js +17 -26
- package/dist/markdown/createMdKitTiptapExtensions.d.ts +8 -0
- package/dist/markdown/createMdKitTiptapExtensions.js +27 -0
- package/dist/markdown/prepareMarkdownForEditorHydration.js +1 -1
- package/dist/markdown/preserveMarkdownWhitespace.js +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.js +1 -0
- package/dist/theme/MdKitThemeEditor.d.ts +1 -1
- package/dist/transport/backend.d.ts +29 -0
- package/dist/transport/backend.js +93 -0
- package/dist/transport/fastify.d.ts +1 -1
- package/dist/transport/fastify.js +1 -1
- package/dist/transport/http.d.ts +1 -1
- package/dist/transport/index.d.ts +5 -5
- package/dist/transport/index.js +2 -2
- package/dist/transport/rest.d.ts +1 -1
- package/dist/transport/store.d.ts +1 -1
- package/dist/transport/trpcClient.d.ts +29 -8
- package/dist/transport/trpcServer.d.ts +1 -1
- package/dist/trpc/client.d.ts +3 -3
- package/dist/trpc/client.js +1 -1
- package/dist/trpc/server.d.ts +5 -3
- package/dist/trpc/server.js +2 -1
- package/dist/trpc.d.ts +3 -3
- package/dist/trpc.js +1 -1
- package/dist/versioning/VersionHistoryPanel.d.ts +2 -2
- package/dist/versioning/VersionHistoryPanel.js +1 -1
- package/dist/versioning/useMdKitDocumentVersions.d.ts +2 -1
- package/dist/versioning/useMdKitDocumentVersions.js +6 -6
- package/dist/yjs/MdKitMarkdownYjs.d.ts +12 -0
- package/dist/yjs/MdKitMarkdownYjs.js +40 -0
- package/dist/yjs/index.d.ts +2 -0
- package/dist/yjs/index.js +1 -0
- package/docs/.vitepress/cache/deps/@theme_index.js +275 -0
- package/docs/.vitepress/cache/deps/@theme_index.js.map +7 -0
- package/docs/.vitepress/cache/deps/_metadata.json +40 -0
- package/docs/.vitepress/cache/deps/chunk-PM3I3KHC.js +9719 -0
- package/docs/.vitepress/cache/deps/chunk-PM3I3KHC.js.map +7 -0
- package/docs/.vitepress/cache/deps/chunk-VSHFF4ZG.js +13018 -0
- package/docs/.vitepress/cache/deps/chunk-VSHFF4ZG.js.map +7 -0
- package/docs/.vitepress/cache/deps/package.json +3 -0
- package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +4505 -0
- package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +7 -0
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +583 -0
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +7 -0
- package/docs/.vitepress/cache/deps/vue.js +347 -0
- package/docs/.vitepress/cache/deps/vue.js.map +7 -0
- package/docs/.vitepress/config.ts +11 -0
- package/docs/api.md +153 -18
- package/docs/architecture.md +24 -9
- package/docs/collaboration-persistence.md +147 -0
- package/docs/index.md +140 -65
- package/docs/permissions.md +139 -0
- package/docs/rest.md +98 -0
- package/docs/shadcn.md +6 -3
- package/docs/styling.md +11 -10
- package/docs/use-cases.md +148 -0
- package/package.json +15 -2
package/dist/index.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
export { useMdKitCollaboration } from "./collaboration/useMdKitCollaboration";
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
6
|
-
export {
|
|
7
|
-
export {
|
|
8
|
-
export {
|
|
9
|
-
export {
|
|
10
|
-
export {
|
|
11
|
-
export {
|
|
12
|
-
export {
|
|
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
|
|
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
|
-
: [], [
|
|
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
|
-
|
|
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 = [];
|
package/dist/server.d.ts
ADDED
package/dist/server.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createMdKitBackend } from "./transport/backend.js";
|
|
@@ -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
|
+
});
|
package/dist/transport/http.d.ts
CHANGED
|
@@ -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";
|
package/dist/transport/index.js
CHANGED
|
@@ -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";
|
package/dist/transport/rest.d.ts
CHANGED
|
@@ -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 {
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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 {};
|
package/dist/trpc/client.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/client.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { createMdKitTrpcAdapter, createMdKitTrpcClient, createMdKitTrpcClientAdapter, } from "../transport/trpcClient";
|
|
1
|
+
export { createMdKitTrpcAdapter, createMdKitTrpcClient, createMdKitTrpcClientAdapter, } from "../transport/trpcClient.js";
|
package/dist/trpc/server.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export
|
|
3
|
-
export type {
|
|
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";
|
package/dist/trpc/server.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export {
|
|
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
|
+
};
|