@mp-lb/mdkit 0.0.1-main.2.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/README.md +132 -0
- package/dist/collaboration/useMdKitCollaboration.d.ts +10 -0
- package/dist/collaboration/useMdKitCollaboration.js +90 -0
- package/dist/core/documentEngine.d.ts +38 -0
- package/dist/core/documentEngine.js +95 -0
- package/dist/core/documentEngine.test.d.ts +1 -0
- package/dist/core/documentEngine.test.js +119 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.js +1 -0
- package/dist/document/MdKitConflictPanel.d.ts +7 -0
- package/dist/document/MdKitConflictPanel.js +41 -0
- package/dist/document/MdKitDocumentToolbar.d.ts +13 -0
- package/dist/document/MdKitDocumentToolbar.js +48 -0
- package/dist/document/documentTypes.d.ts +57 -0
- package/dist/document/documentTypes.js +1 -0
- package/dist/document/useMdKitDocument.d.ts +33 -0
- package/dist/document/useMdKitDocument.js +396 -0
- package/dist/document/useMdKitDocument.test.d.ts +1 -0
- package/dist/document/useMdKitDocument.test.js +151 -0
- package/dist/fastify.d.ts +3 -0
- package/dist/fastify.js +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +11 -0
- package/dist/markdown/MarkdownBubbleMenu.d.ts +6 -0
- package/dist/markdown/MarkdownBubbleMenu.js +29 -0
- package/dist/markdown/MdKitEditor.d.ts +25 -0
- package/dist/markdown/MdKitEditor.js +7 -0
- package/dist/markdown/MdKitEditor.test.d.ts +1 -0
- package/dist/markdown/MdKitEditor.test.js +126 -0
- package/dist/markdown/TiptapMarkdownSurface.d.ts +23 -0
- package/dist/markdown/TiptapMarkdownSurface.js +430 -0
- package/dist/markdown/editorDebug.d.ts +5 -0
- package/dist/markdown/editorDebug.js +1 -0
- package/dist/markdown/markdownFenceRanges.d.ts +6 -0
- package/dist/markdown/markdownFenceRanges.js +41 -0
- package/dist/markdown/normalizeMarkdownSerialization.d.ts +1 -0
- package/dist/markdown/normalizeMarkdownSerialization.js +34 -0
- package/dist/markdown/normalizeMarkdownSerialization.test.d.ts +1 -0
- package/dist/markdown/normalizeMarkdownSerialization.test.js +16 -0
- package/dist/markdown/prepareMarkdownForEditorHydration.d.ts +1 -0
- package/dist/markdown/prepareMarkdownForEditorHydration.js +12 -0
- package/dist/markdown/prepareMarkdownForEditorHydration.test.d.ts +1 -0
- package/dist/markdown/prepareMarkdownForEditorHydration.test.js +13 -0
- package/dist/markdown/preserveMarkdownWhitespace.d.ts +1 -0
- package/dist/markdown/preserveMarkdownWhitespace.js +86 -0
- package/dist/markdown/preserveMarkdownWhitespace.test.d.ts +1 -0
- package/dist/markdown/preserveMarkdownWhitespace.test.js +25 -0
- package/dist/test/setup.d.ts +1 -0
- package/dist/test/setup.js +13 -0
- package/dist/theme/MdKitThemeEditor.d.ts +8 -0
- package/dist/theme/MdKitThemeEditor.js +13 -0
- package/dist/theme/editorTheme.d.ts +20 -0
- package/dist/theme/editorTheme.js +47 -0
- package/dist/transport/fastify.d.ts +7 -0
- package/dist/transport/fastify.js +19 -0
- package/dist/transport/http.d.ts +43 -0
- package/dist/transport/http.js +80 -0
- package/dist/transport/index.d.ts +5 -0
- package/dist/transport/index.js +2 -0
- package/dist/transport/rest.d.ts +6 -0
- package/dist/transport/rest.js +34 -0
- package/dist/transport/store.d.ts +21 -0
- package/dist/transport/store.js +1 -0
- package/dist/transport/trpcClient.d.ts +81 -0
- package/dist/transport/trpcClient.js +21 -0
- package/dist/transport/trpcServer.d.ts +72 -0
- package/dist/transport/trpcServer.js +45 -0
- package/dist/trpc/client.d.ts +3 -0
- package/dist/trpc/client.js +1 -0
- package/dist/trpc/server.d.ts +3 -0
- package/dist/trpc/server.js +1 -0
- package/dist/trpc.d.ts +3 -0
- package/dist/trpc.js +1 -0
- package/dist/ui/joinClassNames.d.ts +1 -0
- package/dist/ui/joinClassNames.js +1 -0
- package/dist/versioning/VersionHistoryPanel.d.ts +9 -0
- package/dist/versioning/VersionHistoryPanel.js +29 -0
- package/dist/versioning/useMdKitDocumentVersions.d.ts +16 -0
- package/dist/versioning/useMdKitDocumentVersions.js +88 -0
- package/dist/versioning/useMdKitDocumentVersions.test.d.ts +1 -0
- package/dist/versioning/useMdKitDocumentVersions.test.js +41 -0
- package/docs/.vitepress/config.ts +34 -0
- package/docs/.vitepress/dist/404.html +22 -0
- package/docs/.vitepress/dist/api.html +120 -0
- package/docs/.vitepress/dist/architecture.html +25 -0
- package/docs/.vitepress/dist/assets/api.md.asncK3PQ.js +96 -0
- package/docs/.vitepress/dist/assets/api.md.asncK3PQ.lean.js +1 -0
- package/docs/.vitepress/dist/assets/app.BQvrHyG0.js +1 -0
- package/docs/.vitepress/dist/assets/architecture.md.BHQLarmZ.js +1 -0
- package/docs/.vitepress/dist/assets/architecture.md.BHQLarmZ.lean.js +1 -0
- package/docs/.vitepress/dist/assets/chunks/framework.RRduUuAx.js +19 -0
- package/docs/.vitepress/dist/assets/chunks/theme.CkCo6Nk1.js +1 -0
- package/docs/.vitepress/dist/assets/index.md.CITl-897.js +137 -0
- package/docs/.vitepress/dist/assets/index.md.CITl-897.lean.js +1 -0
- package/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
- package/docs/.vitepress/dist/assets/shadcn.md.C3idOo2N.js +57 -0
- package/docs/.vitepress/dist/assets/shadcn.md.C3idOo2N.lean.js +1 -0
- package/docs/.vitepress/dist/assets/style.BtrGaL3i.css +1 -0
- package/docs/.vitepress/dist/assets/styling.md.B2C6kVFa.js +91 -0
- package/docs/.vitepress/dist/assets/styling.md.B2C6kVFa.lean.js +1 -0
- package/docs/.vitepress/dist/hashmap.json +1 -0
- package/docs/.vitepress/dist/index.html +161 -0
- package/docs/.vitepress/dist/shadcn.html +81 -0
- package/docs/.vitepress/dist/styling.html +115 -0
- package/docs/.vitepress/dist/vp-icons.css +1 -0
- package/docs/api.md +343 -0
- package/docs/architecture.md +67 -0
- package/docs/index.md +244 -0
- package/docs/shadcn.md +118 -0
- package/docs/styling.md +247 -0
- package/package.json +105 -0
- package/src/styles.css +676 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createTRPCProxyClient, httpBatchLink } from "@trpc/client";
|
|
2
|
+
export const createMdKitTrpcAdapter = ({ client, }) => ({
|
|
3
|
+
listDocumentVersions: async (documentId) => {
|
|
4
|
+
const body = await client.listDocumentVersions.query({ documentId });
|
|
5
|
+
return body.versions;
|
|
6
|
+
},
|
|
7
|
+
readDocument: (documentId) => client.readDocument.query({ documentId }),
|
|
8
|
+
readDocumentVersion: (input) => client.readDocumentVersion.query(input),
|
|
9
|
+
resyncDocument: (documentId) => client.resyncDocument.mutate({ documentId }),
|
|
10
|
+
writeDocument: (input) => client.writeDocument.mutate(input),
|
|
11
|
+
});
|
|
12
|
+
export const createMdKitTrpcClient = ({ url, }) => createTRPCProxyClient({
|
|
13
|
+
links: [
|
|
14
|
+
httpBatchLink({
|
|
15
|
+
url,
|
|
16
|
+
}),
|
|
17
|
+
],
|
|
18
|
+
});
|
|
19
|
+
export const createMdKitTrpcClientAdapter = ({ url, }) => createMdKitTrpcAdapter({
|
|
20
|
+
client: createMdKitTrpcClient({ url }),
|
|
21
|
+
});
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { MdKitTransportStore } from "./store";
|
|
2
|
+
export declare const createMdKitTrpcRouter: (store: MdKitTransportStore) => import("@trpc/server").TRPCBuiltRouter<{
|
|
3
|
+
ctx: object;
|
|
4
|
+
meta: object;
|
|
5
|
+
errorShape: import("@trpc/server").TRPCDefaultErrorShape;
|
|
6
|
+
transformer: false;
|
|
7
|
+
}, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
|
|
8
|
+
listDocumentVersions: import("@trpc/server").TRPCQueryProcedure<{
|
|
9
|
+
input: {
|
|
10
|
+
documentId: string;
|
|
11
|
+
};
|
|
12
|
+
output: {
|
|
13
|
+
versions: import("..").MdKitDocumentVersionSummary[];
|
|
14
|
+
};
|
|
15
|
+
meta: object;
|
|
16
|
+
}>;
|
|
17
|
+
readDocument: import("@trpc/server").TRPCQueryProcedure<{
|
|
18
|
+
input: {
|
|
19
|
+
documentId: string;
|
|
20
|
+
};
|
|
21
|
+
output: import("..").MdKitDocumentSnapshot;
|
|
22
|
+
meta: object;
|
|
23
|
+
}>;
|
|
24
|
+
readDocumentVersion: import("@trpc/server").TRPCQueryProcedure<{
|
|
25
|
+
input: {
|
|
26
|
+
documentId: string;
|
|
27
|
+
versionId: string;
|
|
28
|
+
};
|
|
29
|
+
output: import("..").MdKitDocumentVersionDetail | null;
|
|
30
|
+
meta: object;
|
|
31
|
+
}>;
|
|
32
|
+
resyncDocument: import("@trpc/server").TRPCMutationProcedure<{
|
|
33
|
+
input: {
|
|
34
|
+
documentId: string;
|
|
35
|
+
};
|
|
36
|
+
output: import("..").MdKitDocumentSnapshot;
|
|
37
|
+
meta: object;
|
|
38
|
+
}>;
|
|
39
|
+
restoreDocumentVersion: import("@trpc/server").TRPCMutationProcedure<{
|
|
40
|
+
input: {
|
|
41
|
+
documentId: string;
|
|
42
|
+
versionId: string;
|
|
43
|
+
};
|
|
44
|
+
output: {
|
|
45
|
+
version: import("..").MdKitDocumentVersionToken;
|
|
46
|
+
updatedAt?: string | null;
|
|
47
|
+
} | {
|
|
48
|
+
conflict: true;
|
|
49
|
+
version?: import("..").MdKitDocumentVersionToken;
|
|
50
|
+
updatedAt?: string | null;
|
|
51
|
+
};
|
|
52
|
+
meta: object;
|
|
53
|
+
}>;
|
|
54
|
+
writeDocument: import("@trpc/server").TRPCMutationProcedure<{
|
|
55
|
+
input: {
|
|
56
|
+
baseVersion: string | number | null;
|
|
57
|
+
content: string;
|
|
58
|
+
documentId: string;
|
|
59
|
+
force?: boolean | undefined;
|
|
60
|
+
};
|
|
61
|
+
output: {
|
|
62
|
+
version: import("..").MdKitDocumentVersionToken;
|
|
63
|
+
updatedAt?: string | null;
|
|
64
|
+
} | {
|
|
65
|
+
conflict: true;
|
|
66
|
+
version?: import("..").MdKitDocumentVersionToken;
|
|
67
|
+
updatedAt?: string | null;
|
|
68
|
+
};
|
|
69
|
+
meta: object;
|
|
70
|
+
}>;
|
|
71
|
+
}>>;
|
|
72
|
+
export type MdKitTrpcRouter = ReturnType<typeof createMdKitTrpcRouter>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { initTRPC } from "@trpc/server";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
const t = initTRPC.create();
|
|
4
|
+
const documentInput = z.object({
|
|
5
|
+
documentId: z.string(),
|
|
6
|
+
});
|
|
7
|
+
const versionInput = z.object({
|
|
8
|
+
documentId: z.string(),
|
|
9
|
+
versionId: z.string(),
|
|
10
|
+
});
|
|
11
|
+
const versionToken = z.union([z.string(), z.number()]).nullable();
|
|
12
|
+
const writeInput = z.object({
|
|
13
|
+
baseVersion: versionToken,
|
|
14
|
+
content: z.string(),
|
|
15
|
+
documentId: z.string(),
|
|
16
|
+
force: z.boolean().optional(),
|
|
17
|
+
});
|
|
18
|
+
export const createMdKitTrpcRouter = (store) => t.router({
|
|
19
|
+
listDocumentVersions: t.procedure
|
|
20
|
+
.input(documentInput)
|
|
21
|
+
.query(async ({ input }) => ({
|
|
22
|
+
versions: await (store.listDocumentVersions?.(input.documentId) ?? []),
|
|
23
|
+
})),
|
|
24
|
+
readDocument: t.procedure
|
|
25
|
+
.input(documentInput)
|
|
26
|
+
.query(({ input }) => store.readDocument(input.documentId)),
|
|
27
|
+
readDocumentVersion: t.procedure.input(versionInput).query(({ input }) => store.readDocumentVersion?.({
|
|
28
|
+
documentId: input.documentId,
|
|
29
|
+
versionId: input.versionId,
|
|
30
|
+
}) ?? null),
|
|
31
|
+
resyncDocument: t.procedure
|
|
32
|
+
.input(documentInput)
|
|
33
|
+
.mutation(({ input }) => (store.resyncDocument ?? store.readDocument)(input.documentId)),
|
|
34
|
+
restoreDocumentVersion: t.procedure
|
|
35
|
+
.input(versionInput)
|
|
36
|
+
.mutation(({ input }) => {
|
|
37
|
+
if (!store.restoreDocumentVersion) {
|
|
38
|
+
throw new Error("Version restore is not supported");
|
|
39
|
+
}
|
|
40
|
+
return store.restoreDocumentVersion(input);
|
|
41
|
+
}),
|
|
42
|
+
writeDocument: t.procedure
|
|
43
|
+
.input(writeInput)
|
|
44
|
+
.mutation(({ input }) => store.writeDocument(input)),
|
|
45
|
+
});
|
|
@@ -0,0 +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";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createMdKitTrpcAdapter, createMdKitTrpcClient, createMdKitTrpcClientAdapter, } from "../transport/trpcClient";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createMdKitTrpcRouter } from "../transport/trpcServer";
|
package/dist/trpc.d.ts
ADDED
|
@@ -0,0 +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";
|
package/dist/trpc.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createMdKitTrpcAdapter, createMdKitTrpcClient, createMdKitTrpcClientAdapter, } from "./transport/trpcClient";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const joinClassNames: (...values: Array<string | false | null | undefined>) => string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const joinClassNames = (...values) => values.filter(Boolean).join(" ");
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { MdKitDocumentVersionDetail } from "../document/documentTypes";
|
|
2
|
+
import type { MdKitDocumentVersionsController } from "./useMdKitDocumentVersions";
|
|
3
|
+
export type VersionHistoryPanelProps = {
|
|
4
|
+
className?: string;
|
|
5
|
+
controller: MdKitDocumentVersionsController;
|
|
6
|
+
onRestoreVersion?: (version: MdKitDocumentVersionDetail) => Promise<void> | void;
|
|
7
|
+
title?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare const VersionHistoryPanel: ({ className, controller, onRestoreVersion, title, }: VersionHistoryPanelProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { joinClassNames } from "../ui/joinClassNames";
|
|
4
|
+
const getVersionLabel = (version) => {
|
|
5
|
+
if (version.label) {
|
|
6
|
+
return version.label;
|
|
7
|
+
}
|
|
8
|
+
if (version.version != null) {
|
|
9
|
+
return `Version ${String(version.version)}`;
|
|
10
|
+
}
|
|
11
|
+
return version.id.slice(0, 8);
|
|
12
|
+
};
|
|
13
|
+
export const VersionHistoryPanel = ({ className, controller, onRestoreVersion, title = "Version history", }) => {
|
|
14
|
+
const [isRestoring, setIsRestoring] = useState(false);
|
|
15
|
+
const restoreSelectedVersion = async () => {
|
|
16
|
+
if (!controller.selectedVersion || !onRestoreVersion) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
setIsRestoring(true);
|
|
20
|
+
try {
|
|
21
|
+
await onRestoreVersion(controller.selectedVersion);
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
setIsRestoring(false);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
return (_jsxs("aside", { className: joinClassNames("mdkit-version-history-panel", className), children: [_jsx("div", { className: "mdkit-version-history-header", children: _jsxs("div", { children: [_jsx("h2", { className: "mdkit-version-history-title", children: title }), _jsx("p", { className: "mdkit-version-history-subtitle", children: "Browse saved revisions and restore one when you need it." })] }) }), !controller.hasVersioning ? (_jsx("div", { className: "mdkit-version-history-empty", children: "This adapter does not expose version history." })) : null, controller.error ? (_jsx("div", { className: "mdkit-version-history-error", children: controller.error })) : null, controller.hasVersioning ? (_jsxs("div", { className: "mdkit-version-history-layout", children: [_jsx("div", { className: "mdkit-version-history-list", role: "list", children: controller.versions.length === 0 ? (_jsx("div", { className: "mdkit-version-history-empty", children: "No revisions have been recorded for this document yet." })) : (controller.versions.map((version) => (_jsxs("button", { type: "button", className: joinClassNames("mdkit-version-history-item", controller.selectedVersionId === version.id &&
|
|
28
|
+
"mdkit-version-history-item-active"), onClick: () => void controller.openVersion(version.id), children: [_jsx("span", { className: "mdkit-version-history-item-title", children: getVersionLabel(version) }), _jsx("span", { className: "mdkit-version-history-item-meta", children: new Date(version.createdAt).toLocaleString() })] }, version.id)))) }), _jsx("div", { className: "mdkit-version-history-preview", children: controller.selectedVersion ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "mdkit-version-history-preview-header", children: [_jsxs("div", { children: [_jsx("h3", { className: "mdkit-version-history-preview-title", children: getVersionLabel(controller.selectedVersion) }), _jsx("p", { className: "mdkit-version-history-item-meta", children: new Date(controller.selectedVersion.createdAt).toLocaleString() })] }), onRestoreVersion ? (_jsx("button", { type: "button", className: "mdkit-panel-primary-action", disabled: isRestoring, onClick: () => void restoreSelectedVersion(), children: isRestoring ? "Restoring..." : "Restore" })) : null] }), _jsx("pre", { className: "mdkit-version-history-code", children: controller.selectedVersion.content })] })) : (_jsx("div", { className: "mdkit-version-history-empty", children: "Select a saved revision to preview it here." })) })] })) : null, controller.isLoading ? (_jsx("div", { className: "mdkit-version-history-meta", children: "Loading version data..." })) : null] }));
|
|
29
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { MdKitDocumentAdapter, MdKitDocumentVersionDetail, MdKitDocumentVersionSummary } from "../document/documentTypes";
|
|
2
|
+
export type UseMdKitDocumentVersionsOptions = {
|
|
3
|
+
adapter: Pick<MdKitDocumentAdapter, "listDocumentVersions" | "readDocumentVersion">;
|
|
4
|
+
documentId: string | null;
|
|
5
|
+
};
|
|
6
|
+
export type MdKitDocumentVersionsController = {
|
|
7
|
+
error: string | null;
|
|
8
|
+
hasVersioning: boolean;
|
|
9
|
+
isLoading: boolean;
|
|
10
|
+
openVersion: (versionId: string) => Promise<void>;
|
|
11
|
+
refresh: () => Promise<void>;
|
|
12
|
+
selectedVersion: MdKitDocumentVersionDetail | null;
|
|
13
|
+
selectedVersionId: string | null;
|
|
14
|
+
versions: MdKitDocumentVersionSummary[];
|
|
15
|
+
};
|
|
16
|
+
export declare const useMdKitDocumentVersions: (options: UseMdKitDocumentVersionsOptions) => MdKitDocumentVersionsController;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
2
|
+
export const useMdKitDocumentVersions = (options) => {
|
|
3
|
+
const { adapter, documentId } = options;
|
|
4
|
+
const [versions, setVersions] = useState([]);
|
|
5
|
+
const [selectedVersionId, setSelectedVersionId] = useState(null);
|
|
6
|
+
const [selectedVersion, setSelectedVersion] = useState(null);
|
|
7
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
8
|
+
const [error, setError] = useState(null);
|
|
9
|
+
const hasVersioning = !!adapter.listDocumentVersions && !!adapter.readDocumentVersion;
|
|
10
|
+
const refresh = useCallback(async () => {
|
|
11
|
+
if (!documentId || !adapter.listDocumentVersions) {
|
|
12
|
+
setVersions([]);
|
|
13
|
+
setSelectedVersionId(null);
|
|
14
|
+
setSelectedVersion(null);
|
|
15
|
+
setError(null);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
setIsLoading(true);
|
|
19
|
+
setError(null);
|
|
20
|
+
try {
|
|
21
|
+
const nextVersions = await adapter.listDocumentVersions(documentId);
|
|
22
|
+
setVersions(nextVersions);
|
|
23
|
+
setSelectedVersionId((currentSelectedVersionId) => {
|
|
24
|
+
if (!nextVersions.some((version) => version.id === currentSelectedVersionId)) {
|
|
25
|
+
setSelectedVersion(null);
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
return currentSelectedVersionId;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
setError(`Failed to load versions: ${String(err)}`);
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
setIsLoading(false);
|
|
36
|
+
}
|
|
37
|
+
}, [adapter, documentId]);
|
|
38
|
+
const openVersion = useCallback(async (versionId) => {
|
|
39
|
+
if (!documentId || !adapter.readDocumentVersion) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
setSelectedVersionId(versionId);
|
|
43
|
+
setIsLoading(true);
|
|
44
|
+
setError(null);
|
|
45
|
+
try {
|
|
46
|
+
const nextVersion = await adapter.readDocumentVersion({
|
|
47
|
+
documentId,
|
|
48
|
+
versionId,
|
|
49
|
+
});
|
|
50
|
+
if (!nextVersion) {
|
|
51
|
+
setSelectedVersion(null);
|
|
52
|
+
setError("That version is no longer available.");
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
setSelectedVersion(nextVersion);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
setError(`Failed to load version: ${String(err)}`);
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
setIsLoading(false);
|
|
62
|
+
}
|
|
63
|
+
}, [adapter, documentId]);
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
setSelectedVersionId(null);
|
|
66
|
+
setSelectedVersion(null);
|
|
67
|
+
void refresh();
|
|
68
|
+
}, [documentId, refresh]);
|
|
69
|
+
return useMemo(() => ({
|
|
70
|
+
error,
|
|
71
|
+
hasVersioning,
|
|
72
|
+
isLoading,
|
|
73
|
+
openVersion,
|
|
74
|
+
refresh,
|
|
75
|
+
selectedVersion,
|
|
76
|
+
selectedVersionId,
|
|
77
|
+
versions,
|
|
78
|
+
}), [
|
|
79
|
+
error,
|
|
80
|
+
hasVersioning,
|
|
81
|
+
isLoading,
|
|
82
|
+
openVersion,
|
|
83
|
+
refresh,
|
|
84
|
+
selectedVersion,
|
|
85
|
+
selectedVersionId,
|
|
86
|
+
versions,
|
|
87
|
+
]);
|
|
88
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { act, renderHook, waitFor } from "@testing-library/react";
|
|
2
|
+
import { describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { useMdKitDocumentVersions } from "./useMdKitDocumentVersions";
|
|
4
|
+
describe("useMdKitDocumentVersions", () => {
|
|
5
|
+
it("keeps the selected version preview open after loading it", async () => {
|
|
6
|
+
const adapter = {
|
|
7
|
+
listDocumentVersions: vi.fn(async () => [
|
|
8
|
+
{
|
|
9
|
+
createdAt: "2026-01-01T00:00:00.000Z",
|
|
10
|
+
id: "1",
|
|
11
|
+
label: "Version 1",
|
|
12
|
+
version: 1,
|
|
13
|
+
},
|
|
14
|
+
]),
|
|
15
|
+
readDocumentVersion: vi.fn(async () => ({
|
|
16
|
+
content: "Version one content",
|
|
17
|
+
createdAt: "2026-01-01T00:00:00.000Z",
|
|
18
|
+
id: "1",
|
|
19
|
+
label: "Version 1",
|
|
20
|
+
updatedAt: "2026-01-01T00:00:00.000Z",
|
|
21
|
+
version: 1,
|
|
22
|
+
})),
|
|
23
|
+
};
|
|
24
|
+
const { result } = renderHook(() => useMdKitDocumentVersions({
|
|
25
|
+
adapter,
|
|
26
|
+
documentId: "docs/example.md",
|
|
27
|
+
}));
|
|
28
|
+
await waitFor(() => {
|
|
29
|
+
expect(result.current.versions).toHaveLength(1);
|
|
30
|
+
});
|
|
31
|
+
await act(async () => {
|
|
32
|
+
await result.current.openVersion("1");
|
|
33
|
+
});
|
|
34
|
+
await waitFor(() => {
|
|
35
|
+
expect(result.current.selectedVersionId).toBe("1");
|
|
36
|
+
expect(result.current.selectedVersion?.content).toBe("Version one content");
|
|
37
|
+
expect(result.current.isLoading).toBe(false);
|
|
38
|
+
});
|
|
39
|
+
expect(adapter.listDocumentVersions).toHaveBeenCalledTimes(1);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { defineConfig } from "vitepress";
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
title: "Markdown Editor Kit",
|
|
5
|
+
description: "Docs for the mdkit markdown editor package",
|
|
6
|
+
cleanUrls: true,
|
|
7
|
+
themeConfig: {
|
|
8
|
+
nav: [
|
|
9
|
+
{ text: "Quick Start", link: "/" },
|
|
10
|
+
{ text: "Styling", link: "/styling" },
|
|
11
|
+
{ text: "Shadcn", link: "/shadcn" },
|
|
12
|
+
{ text: "API", link: "/api" },
|
|
13
|
+
{ text: "Architecture", link: "/architecture" },
|
|
14
|
+
],
|
|
15
|
+
sidebar: [
|
|
16
|
+
{
|
|
17
|
+
text: "Guide",
|
|
18
|
+
items: [
|
|
19
|
+
{ text: "Quick Start", link: "/" },
|
|
20
|
+
{ text: "Styling", link: "/styling" },
|
|
21
|
+
{ text: "Shadcn Plugin", link: "/shadcn" },
|
|
22
|
+
{ text: "API Reference", link: "/api" },
|
|
23
|
+
{ text: "Architecture", link: "/architecture" },
|
|
24
|
+
],
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
socialLinks: [
|
|
28
|
+
{
|
|
29
|
+
icon: "github",
|
|
30
|
+
link: "https://github.com/mp-lb/mdkit",
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en-US" dir="ltr">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
6
|
+
<title>404 | Markdown Editor Kit</title>
|
|
7
|
+
<meta name="description" content="Not Found">
|
|
8
|
+
<meta name="generator" content="VitePress v1.6.4">
|
|
9
|
+
<link rel="preload stylesheet" href="/assets/style.BtrGaL3i.css" as="style">
|
|
10
|
+
<link rel="preload stylesheet" href="/vp-icons.css" as="style">
|
|
11
|
+
|
|
12
|
+
<script type="module" src="/assets/app.BQvrHyG0.js"></script>
|
|
13
|
+
<link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
|
|
14
|
+
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
|
|
15
|
+
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
|
|
16
|
+
</head>
|
|
17
|
+
<body>
|
|
18
|
+
<div id="app"></div>
|
|
19
|
+
<script>window.__VP_HASH_MAP__=JSON.parse("{\"api.md\":\"asncK3PQ\",\"architecture.md\":\"BHQLarmZ\",\"index.md\":\"CITl-897\",\"shadcn.md\":\"C3idOo2N\",\"styling.md\":\"B2C6kVFa\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Markdown Editor Kit\",\"description\":\"Docs for the mdkit markdown editor package\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"nav\":[{\"text\":\"Quick Start\",\"link\":\"/\"},{\"text\":\"Styling\",\"link\":\"/styling\"},{\"text\":\"Shadcn\",\"link\":\"/shadcn\"},{\"text\":\"API\",\"link\":\"/api\"},{\"text\":\"Architecture\",\"link\":\"/architecture\"}],\"sidebar\":[{\"text\":\"Guide\",\"items\":[{\"text\":\"Quick Start\",\"link\":\"/\"},{\"text\":\"Styling\",\"link\":\"/styling\"},{\"text\":\"Shadcn Plugin\",\"link\":\"/shadcn\"},{\"text\":\"API Reference\",\"link\":\"/api\"},{\"text\":\"Architecture\",\"link\":\"/architecture\"}]}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/mp-lb/mdkit\"}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":true}");</script>
|
|
20
|
+
|
|
21
|
+
</body>
|
|
22
|
+
</html>
|