@tabula-md/tabula 0.2.0
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 +106 -0
- package/dist/activeDocumentRuntime.d.ts +50 -0
- package/dist/activeDocumentRuntime.d.ts.map +1 -0
- package/dist/collabCollaborators.d.ts +16 -0
- package/dist/collabCollaborators.d.ts.map +1 -0
- package/dist/collabConnectionModel.d.ts +11 -0
- package/dist/collabConnectionModel.d.ts.map +1 -0
- package/dist/collabSessionState.d.ts +24 -0
- package/dist/collabSessionState.d.ts.map +1 -0
- package/dist/collaboration.d.ts +8 -0
- package/dist/collaboration.d.ts.map +1 -0
- package/dist/collaboration.js +78 -0
- package/dist/collaboration.js.map +1 -0
- package/dist/collaborationPresence.d.ts +7 -0
- package/dist/collaborationPresence.d.ts.map +1 -0
- package/dist/collaborationTypes.d.ts +27 -0
- package/dist/collaborationTypes.d.ts.map +1 -0
- package/dist/commentRuntimeModel.d.ts +53 -0
- package/dist/commentRuntimeModel.d.ts.map +1 -0
- package/dist/data/base64Url.d.ts +3 -0
- package/dist/data/base64Url.d.ts.map +1 -0
- package/dist/data/encode.d.ts +20 -0
- package/dist/data/encode.d.ts.map +1 -0
- package/dist/data/encode.js +61 -0
- package/dist/data/encode.js.map +1 -0
- package/dist/data/encryption.d.ts +20 -0
- package/dist/data/encryption.d.ts.map +1 -0
- package/dist/data/encryption.js +13 -0
- package/dist/data/encryption.js.map +1 -0
- package/dist/data/json.d.ts +18 -0
- package/dist/data/json.d.ts.map +1 -0
- package/dist/data/json.js +18 -0
- package/dist/data/json.js.map +1 -0
- package/dist/data/restore.d.ts +3 -0
- package/dist/data/restore.d.ts.map +1 -0
- package/dist/data/restore.js +6 -0
- package/dist/data/restore.js.map +1 -0
- package/dist/documentBuffer.d.ts +68 -0
- package/dist/documentBuffer.d.ts.map +1 -0
- package/dist/documentControlsModel.d.ts +58 -0
- package/dist/documentControlsModel.d.ts.map +1 -0
- package/dist/documentMetrics.d.ts +2 -0
- package/dist/documentMetrics.d.ts.map +1 -0
- package/dist/documentPrimitives.d.ts +9 -0
- package/dist/documentPrimitives.d.ts.map +1 -0
- package/dist/documentSurfaceModel.d.ts +44 -0
- package/dist/documentSurfaceModel.d.ts.map +1 -0
- package/dist/encryption-B0xRVvlF.js +82 -0
- package/dist/encryption-B0xRVvlF.js.map +1 -0
- package/dist/index.d.ts +85 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2474 -0
- package/dist/index.js.map +1 -0
- package/dist/jsonShareLinkModel.d.ts +36 -0
- package/dist/jsonShareLinkModel.d.ts.map +1 -0
- package/dist/lineSurfaceModel.d.ts +73 -0
- package/dist/lineSurfaceModel.d.ts.map +1 -0
- package/dist/markdown/editing.d.ts +12 -0
- package/dist/markdown/editing.d.ts.map +1 -0
- package/dist/markdown/links.d.ts +23 -0
- package/dist/markdown/links.d.ts.map +1 -0
- package/dist/markdown/tasks.d.ts +22 -0
- package/dist/markdown/tasks.d.ts.map +1 -0
- package/dist/markdown.d.ts +25 -0
- package/dist/markdown.d.ts.map +1 -0
- package/dist/markdownEditing.d.ts +2 -0
- package/dist/markdownEditing.d.ts.map +1 -0
- package/dist/markdownFormatting.d.ts +11 -0
- package/dist/markdownFormatting.d.ts.map +1 -0
- package/dist/previewBlockModel.d.ts +66 -0
- package/dist/previewBlockModel.d.ts.map +1 -0
- package/dist/productPerformancePolicy.d.ts +14 -0
- package/dist/productPerformancePolicy.d.ts.map +1 -0
- package/dist/rightPanelCommentViewModel.d.ts +39 -0
- package/dist/rightPanelCommentViewModel.d.ts.map +1 -0
- package/dist/room/envelope.d.ts +27 -0
- package/dist/room/envelope.d.ts.map +1 -0
- package/dist/room/envelope.js +38 -0
- package/dist/room/envelope.js.map +1 -0
- package/dist/roomBinaryProtocol.d.ts +43 -0
- package/dist/roomBinaryProtocol.d.ts.map +1 -0
- package/dist/roomCollaboration.d.ts +39 -0
- package/dist/roomCollaboration.d.ts.map +1 -0
- package/dist/roomProtocol.d.ts +11 -0
- package/dist/roomProtocol.d.ts.map +1 -0
- package/dist/roomShareLinkModel.d.ts +20 -0
- package/dist/roomShareLinkModel.d.ts.map +1 -0
- package/dist/shareLinkViewModel.d.ts +8 -0
- package/dist/shareLinkViewModel.d.ts.map +1 -0
- package/dist/shareSnapshotPayload-CsTw9sRq.js +209 -0
- package/dist/shareSnapshotPayload-CsTw9sRq.js.map +1 -0
- package/dist/shareSnapshotPayload.d.ts +75 -0
- package/dist/shareSnapshotPayload.d.ts.map +1 -0
- package/dist/shareViewModel.d.ts +33 -0
- package/dist/shareViewModel.d.ts.map +1 -0
- package/dist/sourceScrollTransfer.d.ts +54 -0
- package/dist/sourceScrollTransfer.d.ts.map +1 -0
- package/dist/statusBarViewModel.d.ts +13 -0
- package/dist/statusBarViewModel.d.ts.map +1 -0
- package/dist/textPatches.d.ts +16 -0
- package/dist/textPatches.d.ts.map +1 -0
- package/dist/workspaceFileRuntimeModel.d.ts +11 -0
- package/dist/workspaceFileRuntimeModel.d.ts.map +1 -0
- package/dist/workspaceIoModel.d.ts +37 -0
- package/dist/workspaceIoModel.d.ts.map +1 -0
- package/dist/workspaceModel.d.ts +112 -0
- package/dist/workspaceModel.d.ts.map +1 -0
- package/dist/workspaceRoomCheckpoint.d.ts +46 -0
- package/dist/workspaceRoomCheckpoint.d.ts.map +1 -0
- package/dist/workspaceRoomCrdt.d.ts +55 -0
- package/dist/workspaceRoomCrdt.d.ts.map +1 -0
- package/dist/workspaceRoomModel-CO-5ZOpS.js +78 -0
- package/dist/workspaceRoomModel-CO-5ZOpS.js.map +1 -0
- package/dist/workspaceRoomModel.d.ts +69 -0
- package/dist/workspaceRoomModel.d.ts.map +1 -0
- package/dist/workspaceRoomSync-B3niC7cn.js +758 -0
- package/dist/workspaceRoomSync-B3niC7cn.js.map +1 -0
- package/dist/workspaceRoomSync.d.ts +98 -0
- package/dist/workspaceRoomSync.d.ts.map +1 -0
- package/dist/workspaceViewModel.d.ts +13 -0
- package/dist/workspaceViewModel.d.ts.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { type FileViewMode, type ReadingWidth } from "./documentPrimitives";
|
|
2
|
+
export type WorkspaceModelFile = {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
text: string;
|
|
6
|
+
viewMode: FileViewMode;
|
|
7
|
+
readingWidth: ReadingWidth;
|
|
8
|
+
splitRatio?: number;
|
|
9
|
+
lineWrapping: boolean;
|
|
10
|
+
lineNumbers: boolean;
|
|
11
|
+
};
|
|
12
|
+
export type WorkspaceModelState<TFile extends WorkspaceModelFile = WorkspaceModelFile> = {
|
|
13
|
+
files: TFile[];
|
|
14
|
+
openFileIds: string[];
|
|
15
|
+
activeFileId: string;
|
|
16
|
+
};
|
|
17
|
+
export type CloseFileResult<TFile extends WorkspaceModelFile = WorkspaceModelFile> = {
|
|
18
|
+
closedActiveFile: boolean;
|
|
19
|
+
nextActiveFile?: TFile;
|
|
20
|
+
};
|
|
21
|
+
export type RenameFileResult = {
|
|
22
|
+
ok: true;
|
|
23
|
+
title: string;
|
|
24
|
+
} | {
|
|
25
|
+
ok: false;
|
|
26
|
+
reason: "empty" | "duplicate";
|
|
27
|
+
title: string;
|
|
28
|
+
message: string;
|
|
29
|
+
};
|
|
30
|
+
type WorkspaceValueUpdater<T> = T | ((currentValue: T) => T);
|
|
31
|
+
export type WorkspaceModelAction<TFile extends WorkspaceModelFile = WorkspaceModelFile> = {
|
|
32
|
+
type: "replaceWorkspace";
|
|
33
|
+
state: WorkspaceModelState<TFile>;
|
|
34
|
+
} | {
|
|
35
|
+
type: "replaceFiles";
|
|
36
|
+
update: WorkspaceValueUpdater<TFile[]>;
|
|
37
|
+
} | {
|
|
38
|
+
type: "replaceOpenFileIds";
|
|
39
|
+
update: WorkspaceValueUpdater<string[]>;
|
|
40
|
+
} | {
|
|
41
|
+
type: "setActiveFileId";
|
|
42
|
+
fileId: string;
|
|
43
|
+
} | {
|
|
44
|
+
type: "selectFile";
|
|
45
|
+
fileId: string;
|
|
46
|
+
} | {
|
|
47
|
+
type: "addFile";
|
|
48
|
+
file: TFile;
|
|
49
|
+
insertAfterFileId?: string;
|
|
50
|
+
} | {
|
|
51
|
+
type: "renameFile";
|
|
52
|
+
fileId: string;
|
|
53
|
+
title: string;
|
|
54
|
+
} | {
|
|
55
|
+
type: "closeFile";
|
|
56
|
+
fileId: string;
|
|
57
|
+
} | {
|
|
58
|
+
type: "deleteFile";
|
|
59
|
+
fileId: string;
|
|
60
|
+
} | {
|
|
61
|
+
type: "reorderOpenFile";
|
|
62
|
+
sourceFileId: string;
|
|
63
|
+
targetFileId: string;
|
|
64
|
+
} | {
|
|
65
|
+
type: "setActiveFileText";
|
|
66
|
+
text: string;
|
|
67
|
+
} | {
|
|
68
|
+
type: "setActiveFileViewMode";
|
|
69
|
+
viewMode: FileViewMode;
|
|
70
|
+
} | {
|
|
71
|
+
type: "setActiveFileReadingWidth";
|
|
72
|
+
readingWidth: ReadingWidth;
|
|
73
|
+
} | {
|
|
74
|
+
type: "setActiveFileLineWrapping";
|
|
75
|
+
lineWrapping: boolean;
|
|
76
|
+
} | {
|
|
77
|
+
type: "setActiveFileLineNumbers";
|
|
78
|
+
lineNumbers: boolean;
|
|
79
|
+
} | {
|
|
80
|
+
type: "setActiveFileSplitRatio";
|
|
81
|
+
splitRatio: number;
|
|
82
|
+
};
|
|
83
|
+
export declare const createWorkspaceModelState: <TFile extends WorkspaceModelFile>({ files, openFileIds, activeFileId, }: WorkspaceModelState<TFile>) => WorkspaceModelState<TFile>;
|
|
84
|
+
export declare const getOpenWorkspaceFiles: <TFile extends WorkspaceModelFile>(state: WorkspaceModelState<TFile>) => TFile[];
|
|
85
|
+
export declare const getActiveWorkspaceFile: <TFile extends WorkspaceModelFile>(state: WorkspaceModelState<TFile>) => TFile | undefined;
|
|
86
|
+
export declare const normalizeWorkspaceFileTitle: (title: string) => string;
|
|
87
|
+
export declare const getAvailableWorkspaceFileTitle: <TFile extends WorkspaceModelFile>(files: TFile[], baseTitle: string) => string;
|
|
88
|
+
export declare const renameWorkspaceFile: <TFile extends WorkspaceModelFile>(state: WorkspaceModelState<TFile>, fileId: string, nextRawTitle: string) => {
|
|
89
|
+
state: WorkspaceModelState<TFile>;
|
|
90
|
+
result: RenameFileResult;
|
|
91
|
+
};
|
|
92
|
+
export declare const selectWorkspaceFile: <TFile extends WorkspaceModelFile>(state: WorkspaceModelState<TFile>, fileId: string) => WorkspaceModelState<TFile>;
|
|
93
|
+
export declare const setWorkspaceActiveFileId: <TFile extends WorkspaceModelFile>(state: WorkspaceModelState<TFile>, fileId: string) => WorkspaceModelState<TFile>;
|
|
94
|
+
export declare const addWorkspaceFile: <TFile extends WorkspaceModelFile>(state: WorkspaceModelState<TFile>, file: TFile, options?: {
|
|
95
|
+
insertAfterFileId?: string;
|
|
96
|
+
}) => WorkspaceModelState<TFile>;
|
|
97
|
+
export declare const closeWorkspaceFile: <TFile extends WorkspaceModelFile>(state: WorkspaceModelState<TFile>, fileId: string) => {
|
|
98
|
+
state: WorkspaceModelState<TFile>;
|
|
99
|
+
result: CloseFileResult<TFile>;
|
|
100
|
+
} | undefined;
|
|
101
|
+
export declare const deleteWorkspaceFile: <TFile extends WorkspaceModelFile>(state: WorkspaceModelState<TFile>, fileId: string) => {
|
|
102
|
+
state: WorkspaceModelState<TFile>;
|
|
103
|
+
result: CloseFileResult<TFile>;
|
|
104
|
+
} | undefined;
|
|
105
|
+
export declare const reorderOpenWorkspaceFile: <TFile extends WorkspaceModelFile>(state: WorkspaceModelState<TFile>, sourceFileId: string, targetFileId: string) => WorkspaceModelState<TFile>;
|
|
106
|
+
export declare const selectAdjacentWorkspaceFile: <TFile extends WorkspaceModelFile>(state: WorkspaceModelState<TFile>, direction: -1 | 1) => {
|
|
107
|
+
state: WorkspaceModelState<TFile>;
|
|
108
|
+
file?: TFile;
|
|
109
|
+
};
|
|
110
|
+
export declare const workspaceReducer: <TFile extends WorkspaceModelFile>(state: WorkspaceModelState<TFile>, action: WorkspaceModelAction<TFile>) => WorkspaceModelState<TFile>;
|
|
111
|
+
export {};
|
|
112
|
+
//# sourceMappingURL=workspaceModel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceModel.d.ts","sourceRoot":"","sources":["../src/workspaceModel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { WORKSPACE_ROOM_SCHEMA_VERSION } from "./workspaceRoomModel";
|
|
2
|
+
export declare const ROOM_CHECKPOINT_RETENTION_MS: number;
|
|
3
|
+
export type WorkspaceRoomCheckpointMetadata = {
|
|
4
|
+
kind: "workspace-room-crdt";
|
|
5
|
+
roomId: string;
|
|
6
|
+
schemaVersion: typeof WORKSPACE_ROOM_SCHEMA_VERSION;
|
|
7
|
+
};
|
|
8
|
+
export type LoadedWorkspaceRoomCheckpoint = {
|
|
9
|
+
status: "ready";
|
|
10
|
+
generation: number;
|
|
11
|
+
encryptedCheckpoint: Uint8Array;
|
|
12
|
+
expiresAt: number;
|
|
13
|
+
} | {
|
|
14
|
+
status: "expired";
|
|
15
|
+
generation: number;
|
|
16
|
+
expiresAt: number;
|
|
17
|
+
};
|
|
18
|
+
export type SaveWorkspaceRoomCheckpointRequest = {
|
|
19
|
+
expectedGeneration: number;
|
|
20
|
+
encryptedCheckpoint: Uint8Array;
|
|
21
|
+
expiresAt: number;
|
|
22
|
+
};
|
|
23
|
+
export type SaveWorkspaceRoomCheckpointResult = {
|
|
24
|
+
ok: true;
|
|
25
|
+
generation: number;
|
|
26
|
+
} | {
|
|
27
|
+
ok: false;
|
|
28
|
+
reason: "conflict";
|
|
29
|
+
generation: number;
|
|
30
|
+
};
|
|
31
|
+
export type WorkspaceRoomCheckpointStore = {
|
|
32
|
+
enabled: boolean;
|
|
33
|
+
loadEncryptedCheckpoint(roomId: string, signal?: AbortSignal): Promise<LoadedWorkspaceRoomCheckpoint | null>;
|
|
34
|
+
saveEncryptedCheckpoint(roomId: string, request: SaveWorkspaceRoomCheckpointRequest, signal?: AbortSignal): Promise<SaveWorkspaceRoomCheckpointResult>;
|
|
35
|
+
};
|
|
36
|
+
export declare const encryptWorkspaceRoomCheckpoint: ({ roomId, update, roomKey, }: {
|
|
37
|
+
roomId: string;
|
|
38
|
+
update: Uint8Array;
|
|
39
|
+
roomKey: string | CryptoKey;
|
|
40
|
+
}) => Promise<Uint8Array<ArrayBuffer>>;
|
|
41
|
+
export declare const decryptWorkspaceRoomCheckpoint: ({ encryptedCheckpoint, roomId, roomKey, }: {
|
|
42
|
+
encryptedCheckpoint: Uint8Array;
|
|
43
|
+
roomId: string;
|
|
44
|
+
roomKey: string | CryptoKey;
|
|
45
|
+
}) => Promise<Uint8Array<ArrayBufferLike>>;
|
|
46
|
+
//# sourceMappingURL=workspaceRoomCheckpoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceRoomCheckpoint.d.ts","sourceRoot":"","sources":["../src/workspaceRoomCheckpoint.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AAErE,eAAO,MAAM,4BAA4B,QAA0B,CAAC;AAEpE,MAAM,MAAM,+BAA+B,GAAG;IAC5C,IAAI,EAAE,qBAAqB,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,6BAA6B,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,6BAA6B,GACrC;IACE,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,UAAU,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;CACnB,GACD;IACE,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEN,MAAM,MAAM,kCAAkC,GAAG;IAC/C,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,UAAU,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GACzC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,MAAM,MAAM,4BAA4B,GAAG;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,uBAAuB,CACrB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,6BAA6B,GAAG,IAAI,CAAC,CAAC;IACjD,uBAAuB,CACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,kCAAkC,EAC3C,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,iCAAiC,CAAC,CAAC;CAC/C,CAAC;AAOF,eAAO,MAAM,8BAA8B,GAAU,8BAIlD;IACD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,qCASG,CAAC;AAEL,eAAO,MAAM,8BAA8B,GAAU,2CAIlD;IACD,mBAAmB,EAAE,UAAU,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,yCAiBA,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import * as Y from "yjs";
|
|
2
|
+
import { type WorkspaceRoomComment, type WorkspaceRoomCommentReply, type WorkspaceRoomNodeType, type WorkspaceRoomSnapshot, type WorkspaceRoomStructureSnapshot } from "./workspaceRoomModel";
|
|
3
|
+
export type WorkspaceRoomCrdt = {
|
|
4
|
+
doc: Y.Doc;
|
|
5
|
+
meta: Y.Map<unknown>;
|
|
6
|
+
nodes: Y.Map<Y.Map<unknown>>;
|
|
7
|
+
documents: Y.Map<Y.Text>;
|
|
8
|
+
comments: Y.Map<Y.Map<unknown>>;
|
|
9
|
+
};
|
|
10
|
+
export type WorkspaceRoomStructureResult = {
|
|
11
|
+
ok: true;
|
|
12
|
+
} | {
|
|
13
|
+
ok: false;
|
|
14
|
+
message: string;
|
|
15
|
+
};
|
|
16
|
+
type InitialWorkspaceRoomNode = {
|
|
17
|
+
id: string;
|
|
18
|
+
type: WorkspaceRoomNodeType;
|
|
19
|
+
parentId?: string | null;
|
|
20
|
+
title: string;
|
|
21
|
+
order?: number;
|
|
22
|
+
createdAt?: string;
|
|
23
|
+
updatedAt?: string;
|
|
24
|
+
markdown?: string;
|
|
25
|
+
};
|
|
26
|
+
type InitialWorkspaceRoomComment = Omit<WorkspaceRoomComment, "replies"> & {
|
|
27
|
+
replies?: readonly WorkspaceRoomCommentReply[];
|
|
28
|
+
};
|
|
29
|
+
export declare const createWorkspaceRoomCrdt: ({ roomId, doc, initialize, }: {
|
|
30
|
+
roomId: string;
|
|
31
|
+
doc?: Y.Doc;
|
|
32
|
+
initialize?: boolean;
|
|
33
|
+
}) => WorkspaceRoomCrdt;
|
|
34
|
+
export declare const validateWorkspaceRoomStructure: (room: WorkspaceRoomCrdt, expectedRoomId: string) => WorkspaceRoomStructureResult;
|
|
35
|
+
export declare const initializeWorkspaceRoomCrdt: (room: WorkspaceRoomCrdt, { nodes, comments, }: {
|
|
36
|
+
nodes: readonly InitialWorkspaceRoomNode[];
|
|
37
|
+
comments?: readonly InitialWorkspaceRoomComment[];
|
|
38
|
+
}) => void;
|
|
39
|
+
export declare const getWorkspaceRoomDocument: (room: WorkspaceRoomCrdt, documentId: string) => Y.Text | null;
|
|
40
|
+
export declare const createWorkspaceRoomFolder: (room: WorkspaceRoomCrdt, input: Omit<InitialWorkspaceRoomNode, "type" | "markdown">) => boolean;
|
|
41
|
+
export declare const createWorkspaceRoomDocument: (room: WorkspaceRoomCrdt, input: Omit<InitialWorkspaceRoomNode, "type">) => boolean;
|
|
42
|
+
export declare const deleteWorkspaceRoomNode: (room: WorkspaceRoomCrdt, nodeId: string) => void;
|
|
43
|
+
export declare const renameWorkspaceRoomNode: (room: WorkspaceRoomCrdt, nodeId: string, title: string, updatedAt?: string) => boolean;
|
|
44
|
+
export declare const moveWorkspaceRoomNode: (room: WorkspaceRoomCrdt, nodeId: string, parentId: string, updatedAt?: string) => boolean;
|
|
45
|
+
export declare const setWorkspaceRoomNodeOrder: (room: WorkspaceRoomCrdt, nodeId: string, order: number, updatedAt?: string) => boolean;
|
|
46
|
+
export declare const setWorkspaceRoomComment: (room: WorkspaceRoomCrdt, comment: InitialWorkspaceRoomComment) => boolean;
|
|
47
|
+
export declare const deleteWorkspaceRoomComment: (room: WorkspaceRoomCrdt, commentId: string) => void;
|
|
48
|
+
export declare const setWorkspaceRoomCommentResolved: (room: WorkspaceRoomCrdt, commentId: string, resolved: boolean) => void;
|
|
49
|
+
export declare const addWorkspaceRoomCommentReply: (room: WorkspaceRoomCrdt, commentId: string, reply: WorkspaceRoomCommentReply) => boolean;
|
|
50
|
+
export declare const getWorkspaceRoomDocumentComments: (room: WorkspaceRoomCrdt, documentId: string) => WorkspaceRoomComment[];
|
|
51
|
+
export declare const getWorkspaceRoomSnapshot: (room: WorkspaceRoomCrdt) => WorkspaceRoomSnapshot;
|
|
52
|
+
export declare const getWorkspaceRoomStructureSnapshot: (room: WorkspaceRoomCrdt) => WorkspaceRoomStructureSnapshot;
|
|
53
|
+
export declare const getWorkspaceRoomComments: (room: WorkspaceRoomCrdt) => Record<string, WorkspaceRoomComment[]>;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=workspaceRoomCrdt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceRoomCrdt.d.ts","sourceRoot":"","sources":["../src/workspaceRoomCrdt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
const M = 2, i = "workspace-root", R = 10485760, l = 500, d = 500, A = 32, u = 5e3, S = 100, m = 1e4, _ = new TextEncoder(), a = (t, O) => {
|
|
2
|
+
var s;
|
|
3
|
+
let o = 0, n = t.parentId;
|
|
4
|
+
const e = /* @__PURE__ */ new Set([t.id]);
|
|
5
|
+
for (; n; ) {
|
|
6
|
+
if (e.has(n)) return Number.POSITIVE_INFINITY;
|
|
7
|
+
e.add(n), o += 1, n = ((s = O.get(n)) == null ? void 0 : s.parentId) ?? null;
|
|
8
|
+
}
|
|
9
|
+
return o;
|
|
10
|
+
}, C = (t) => {
|
|
11
|
+
const O = E(t);
|
|
12
|
+
if (!O.ok) return O;
|
|
13
|
+
const o = Object.values(t.commentsByFileId).flat();
|
|
14
|
+
return o.length > 5e3 ? {
|
|
15
|
+
ok: !1,
|
|
16
|
+
violation: "comments",
|
|
17
|
+
message: "A live workspace can include up to 5000 comments."
|
|
18
|
+
} : o.some((e) => e.body.length > 1e4) ? {
|
|
19
|
+
ok: !1,
|
|
20
|
+
violation: "comment-length",
|
|
21
|
+
message: "Comments can contain up to 10000 characters."
|
|
22
|
+
} : o.some((e) => e.replies.length > 100) ? {
|
|
23
|
+
ok: !1,
|
|
24
|
+
violation: "replies",
|
|
25
|
+
message: "A comment can include up to 100 replies."
|
|
26
|
+
} : Object.values(t.documents).reduce(
|
|
27
|
+
(e, s) => e + _.encode(s).byteLength,
|
|
28
|
+
0
|
|
29
|
+
) + o.reduce(
|
|
30
|
+
(e, s) => e + _.encode(s.body).byteLength + s.replies.reduce(
|
|
31
|
+
(c, r) => c + _.encode(r.body).byteLength,
|
|
32
|
+
0
|
|
33
|
+
),
|
|
34
|
+
0
|
|
35
|
+
) > 10485760 ? {
|
|
36
|
+
ok: !1,
|
|
37
|
+
violation: "content-bytes",
|
|
38
|
+
message: "A live workspace can contain up to 10 MiB of Markdown and comments."
|
|
39
|
+
} : { ok: !0 };
|
|
40
|
+
}, E = (t) => {
|
|
41
|
+
const O = t.nodes.filter((e) => e.type === "document"), o = t.nodes.filter(
|
|
42
|
+
(e) => e.type === "folder" && e.id !== t.rootId
|
|
43
|
+
);
|
|
44
|
+
if (O.length > 500)
|
|
45
|
+
return {
|
|
46
|
+
ok: !1,
|
|
47
|
+
violation: "documents",
|
|
48
|
+
message: "A live workspace can include up to 500 documents."
|
|
49
|
+
};
|
|
50
|
+
if (o.length > 500)
|
|
51
|
+
return {
|
|
52
|
+
ok: !1,
|
|
53
|
+
violation: "folders",
|
|
54
|
+
message: "A live workspace can include up to 500 folders."
|
|
55
|
+
};
|
|
56
|
+
const n = new Map(t.nodes.map((e) => [e.id, e]));
|
|
57
|
+
return t.nodes.some(
|
|
58
|
+
(e) => a(e, n) > 32
|
|
59
|
+
) ? {
|
|
60
|
+
ok: !1,
|
|
61
|
+
violation: "tree-depth",
|
|
62
|
+
message: "Folder nesting can be up to 32 levels deep."
|
|
63
|
+
} : { ok: !0 };
|
|
64
|
+
};
|
|
65
|
+
export {
|
|
66
|
+
u as W,
|
|
67
|
+
m as a,
|
|
68
|
+
R as b,
|
|
69
|
+
l as c,
|
|
70
|
+
d,
|
|
71
|
+
S as e,
|
|
72
|
+
A as f,
|
|
73
|
+
i as g,
|
|
74
|
+
M as h,
|
|
75
|
+
E as i,
|
|
76
|
+
C as v
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=workspaceRoomModel-CO-5ZOpS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceRoomModel-CO-5ZOpS.js","sources":["../src/workspaceRoomModel.ts"],"sourcesContent":["export const WORKSPACE_ROOM_SCHEMA_VERSION = 2;\nexport const WORKSPACE_ROOM_ROOT_ID = \"workspace-root\";\nexport const WORKSPACE_ROOM_MAX_CONTENT_BYTES = 10 * 1024 * 1024;\nexport const WORKSPACE_ROOM_MAX_DOCUMENTS = 500;\nexport const WORKSPACE_ROOM_MAX_FOLDERS = 500;\nexport const WORKSPACE_ROOM_MAX_TREE_DEPTH = 32;\nexport const WORKSPACE_ROOM_MAX_COMMENTS = 5_000;\nexport const WORKSPACE_ROOM_MAX_REPLIES = 100;\nexport const WORKSPACE_ROOM_MAX_COMMENT_LENGTH = 10_000;\n\nexport type WorkspaceRoomNodeType = \"folder\" | \"document\";\n\nexport type WorkspaceRoomNode = {\n id: string;\n type: WorkspaceRoomNodeType;\n parentId: string | null;\n title: string;\n order: number;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type WorkspaceRoomDocumentSnapshot = WorkspaceRoomNode & {\n type: \"document\";\n markdown: string;\n};\n\nexport type WorkspaceRoomFolderSnapshot = WorkspaceRoomNode & {\n type: \"folder\";\n};\n\nexport type WorkspaceRoomCommentReply = {\n id: string;\n body: string;\n authorId?: string;\n authorName?: string;\n authorColor?: string;\n createdAt: string;\n};\n\nexport type WorkspaceRoomComment = {\n id: string;\n fileId: string;\n body: string;\n authorId?: string;\n authorName?: string;\n authorColor?: string;\n quote?: string;\n sourceQuote?: string;\n selectionStart?: number;\n selectionEnd?: number;\n resolved: boolean;\n createdAt: string;\n replies: WorkspaceRoomCommentReply[];\n};\n\nexport type WorkspaceRoomSnapshot = {\n roomId: string;\n schemaVersion: typeof WORKSPACE_ROOM_SCHEMA_VERSION;\n rootId: string;\n nodes: WorkspaceRoomNode[];\n documents: Record<string, string>;\n commentsByFileId: Record<string, WorkspaceRoomComment[]>;\n};\n\nexport type WorkspaceRoomStructureSnapshot = Pick<\n WorkspaceRoomSnapshot,\n \"roomId\" | \"schemaVersion\" | \"rootId\" | \"nodes\"\n>;\n\nexport type WorkspaceRoomLimitViolation =\n | \"content-bytes\"\n | \"documents\"\n | \"folders\"\n | \"tree-depth\"\n | \"comments\"\n | \"comment-length\"\n | \"replies\";\n\nexport type WorkspaceRoomLimitResult =\n | { ok: true }\n | { ok: false; violation: WorkspaceRoomLimitViolation; message: string };\n\nconst textEncoder = new TextEncoder();\n\nconst getNodeDepth = (node: WorkspaceRoomNode, nodesById: Map<string, WorkspaceRoomNode>) => {\n let depth = 0;\n let parentId = node.parentId;\n const visited = new Set<string>([node.id]);\n while (parentId) {\n if (visited.has(parentId)) return Number.POSITIVE_INFINITY;\n visited.add(parentId);\n depth += 1;\n parentId = nodesById.get(parentId)?.parentId ?? null;\n }\n return depth;\n};\n\nexport const validateWorkspaceRoomLimits = (\n snapshot: WorkspaceRoomSnapshot,\n): WorkspaceRoomLimitResult => {\n const structureLimits = validateWorkspaceRoomStructureLimits(snapshot);\n if (!structureLimits.ok) return structureLimits;\n const comments = Object.values(snapshot.commentsByFileId).flat();\n if (comments.length > WORKSPACE_ROOM_MAX_COMMENTS) {\n return {\n ok: false,\n violation: \"comments\",\n message: `A live workspace can include up to ${WORKSPACE_ROOM_MAX_COMMENTS} comments.`,\n };\n }\n if (comments.some((comment) => comment.body.length > WORKSPACE_ROOM_MAX_COMMENT_LENGTH)) {\n return {\n ok: false,\n violation: \"comment-length\",\n message: `Comments can contain up to ${WORKSPACE_ROOM_MAX_COMMENT_LENGTH} characters.`,\n };\n }\n if (comments.some((comment) => comment.replies.length > WORKSPACE_ROOM_MAX_REPLIES)) {\n return {\n ok: false,\n violation: \"replies\",\n message: `A comment can include up to ${WORKSPACE_ROOM_MAX_REPLIES} replies.`,\n };\n }\n const contentBytes =\n Object.values(snapshot.documents).reduce(\n (total, text) => total + textEncoder.encode(text).byteLength,\n 0,\n ) +\n comments.reduce(\n (total, comment) =>\n total +\n textEncoder.encode(comment.body).byteLength +\n comment.replies.reduce(\n (replyTotal, reply) => replyTotal + textEncoder.encode(reply.body).byteLength,\n 0,\n ),\n 0,\n );\n if (contentBytes > WORKSPACE_ROOM_MAX_CONTENT_BYTES) {\n return {\n ok: false,\n violation: \"content-bytes\",\n message: \"A live workspace can contain up to 10 MiB of Markdown and comments.\",\n };\n }\n return { ok: true };\n};\n\nexport const validateWorkspaceRoomStructureLimits = (\n snapshot: Pick<WorkspaceRoomStructureSnapshot, \"rootId\" | \"nodes\">,\n): WorkspaceRoomLimitResult => {\n const documents = snapshot.nodes.filter((node) => node.type === \"document\");\n const folders = snapshot.nodes.filter(\n (node) => node.type === \"folder\" && node.id !== snapshot.rootId,\n );\n if (documents.length > WORKSPACE_ROOM_MAX_DOCUMENTS) {\n return {\n ok: false,\n violation: \"documents\",\n message: `A live workspace can include up to ${WORKSPACE_ROOM_MAX_DOCUMENTS} documents.`,\n };\n }\n if (folders.length > WORKSPACE_ROOM_MAX_FOLDERS) {\n return {\n ok: false,\n violation: \"folders\",\n message: `A live workspace can include up to ${WORKSPACE_ROOM_MAX_FOLDERS} folders.`,\n };\n }\n const nodesById = new Map(snapshot.nodes.map((node) => [node.id, node]));\n if (\n snapshot.nodes.some(\n (node) => getNodeDepth(node, nodesById) > WORKSPACE_ROOM_MAX_TREE_DEPTH,\n )\n ) {\n return {\n ok: false,\n violation: \"tree-depth\",\n message: `Folder nesting can be up to ${WORKSPACE_ROOM_MAX_TREE_DEPTH} levels deep.`,\n };\n }\n return { ok: true };\n};\n"],"names":["WORKSPACE_ROOM_SCHEMA_VERSION","WORKSPACE_ROOM_ROOT_ID","WORKSPACE_ROOM_MAX_CONTENT_BYTES","WORKSPACE_ROOM_MAX_DOCUMENTS","WORKSPACE_ROOM_MAX_FOLDERS","WORKSPACE_ROOM_MAX_TREE_DEPTH","WORKSPACE_ROOM_MAX_COMMENTS","WORKSPACE_ROOM_MAX_REPLIES","WORKSPACE_ROOM_MAX_COMMENT_LENGTH","textEncoder","getNodeDepth","node","nodesById","_a","depth","parentId","visited","validateWorkspaceRoomLimits","snapshot","structureLimits","validateWorkspaceRoomStructureLimits","comments","comment","total","text","replyTotal","reply","documents","folders"],"mappings":"AAAO,MAAMA,IAAgC,GAChCC,IAAyB,kBACzBC,IAAmC,UACnCC,IAA+B,KAC/BC,IAA6B,KAC7BC,IAAgC,IAChCC,IAA8B,KAC9BC,IAA6B,KAC7BC,IAAoC,KA2E3CC,IAAc,IAAI,YAAA,GAElBC,IAAe,CAACC,GAAyBC,MAA8C;AArFtF,MAAAC;AAsFL,MAAIC,IAAQ,GACRC,IAAWJ,EAAK;AACpB,QAAMK,IAAU,oBAAI,IAAY,CAACL,EAAK,EAAE,CAAC;AACzC,SAAOI,KAAU;AACf,QAAIC,EAAQ,IAAID,CAAQ,UAAU,OAAO;AACzC,IAAAC,EAAQ,IAAID,CAAQ,GACpBD,KAAS,GACTC,MAAWF,IAAAD,EAAU,IAAIG,CAAQ,MAAtB,gBAAAF,EAAyB,aAAY;AAAA,EAClD;AACA,SAAOC;AACT,GAEaG,IAA8B,CACzCC,MAC6B;AAC7B,QAAMC,IAAkBC,EAAqCF,CAAQ;AACrE,MAAI,CAACC,EAAgB,GAAI,QAAOA;AAChC,QAAME,IAAW,OAAO,OAAOH,EAAS,gBAAgB,EAAE,KAAA;AAC1D,SAAIG,EAAS,SAAS,MACb;AAAA,IACL,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,SAAS;AAAA,EAAiE,IAG1EA,EAAS,KAAK,CAACC,MAAYA,EAAQ,KAAK,SAAS,GAAiC,IAC7E;AAAA,IACL,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,SAAS;AAAA,EAA+D,IAGxED,EAAS,KAAK,CAACC,MAAYA,EAAQ,QAAQ,SAAS,GAA0B,IACzE;AAAA,IACL,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,SAAS;AAAA,EAAyD,IAIpE,OAAO,OAAOJ,EAAS,SAAS,EAAE;AAAA,IAChC,CAACK,GAAOC,MAASD,IAAQd,EAAY,OAAOe,CAAI,EAAE;AAAA,IAClD;AAAA,EAAA,IAEFH,EAAS;AAAA,IACP,CAACE,GAAOD,MACNC,IACAd,EAAY,OAAOa,EAAQ,IAAI,EAAE,aACjCA,EAAQ,QAAQ;AAAA,MACd,CAACG,GAAYC,MAAUD,IAAahB,EAAY,OAAOiB,EAAM,IAAI,EAAE;AAAA,MACnE;AAAA,IAAA;AAAA,IAEJ;AAAA,EAAA,IAEe,WACV;AAAA,IACL,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA,IAGN,EAAE,IAAI,GAAA;AACf,GAEaN,IAAuC,CAClDF,MAC6B;AAC7B,QAAMS,IAAYT,EAAS,MAAM,OAAO,CAACP,MAASA,EAAK,SAAS,UAAU,GACpEiB,IAAUV,EAAS,MAAM;AAAA,IAC7B,CAACP,MAASA,EAAK,SAAS,YAAYA,EAAK,OAAOO,EAAS;AAAA,EAAA;AAE3D,MAAIS,EAAU,SAAS;AACrB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,WAAW;AAAA,MACX,SAAS;AAAA,IAAkE;AAG/E,MAAIC,EAAQ,SAAS;AACnB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,WAAW;AAAA,MACX,SAAS;AAAA,IAAgE;AAG7E,QAAMhB,IAAY,IAAI,IAAIM,EAAS,MAAM,IAAI,CAACP,MAAS,CAACA,EAAK,IAAIA,CAAI,CAAC,CAAC;AACvE,SACEO,EAAS,MAAM;AAAA,IACb,CAACP,MAASD,EAAaC,GAAMC,CAAS,IAAI;AAAA,EAAA,IAGrC;AAAA,IACL,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,SAAS;AAAA,EAA4D,IAGlE,EAAE,IAAI,GAAA;AACf;"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export declare const WORKSPACE_ROOM_SCHEMA_VERSION = 2;
|
|
2
|
+
export declare const WORKSPACE_ROOM_ROOT_ID = "workspace-root";
|
|
3
|
+
export declare const WORKSPACE_ROOM_MAX_CONTENT_BYTES: number;
|
|
4
|
+
export declare const WORKSPACE_ROOM_MAX_DOCUMENTS = 500;
|
|
5
|
+
export declare const WORKSPACE_ROOM_MAX_FOLDERS = 500;
|
|
6
|
+
export declare const WORKSPACE_ROOM_MAX_TREE_DEPTH = 32;
|
|
7
|
+
export declare const WORKSPACE_ROOM_MAX_COMMENTS = 5000;
|
|
8
|
+
export declare const WORKSPACE_ROOM_MAX_REPLIES = 100;
|
|
9
|
+
export declare const WORKSPACE_ROOM_MAX_COMMENT_LENGTH = 10000;
|
|
10
|
+
export type WorkspaceRoomNodeType = "folder" | "document";
|
|
11
|
+
export type WorkspaceRoomNode = {
|
|
12
|
+
id: string;
|
|
13
|
+
type: WorkspaceRoomNodeType;
|
|
14
|
+
parentId: string | null;
|
|
15
|
+
title: string;
|
|
16
|
+
order: number;
|
|
17
|
+
createdAt: string;
|
|
18
|
+
updatedAt: string;
|
|
19
|
+
};
|
|
20
|
+
export type WorkspaceRoomDocumentSnapshot = WorkspaceRoomNode & {
|
|
21
|
+
type: "document";
|
|
22
|
+
markdown: string;
|
|
23
|
+
};
|
|
24
|
+
export type WorkspaceRoomFolderSnapshot = WorkspaceRoomNode & {
|
|
25
|
+
type: "folder";
|
|
26
|
+
};
|
|
27
|
+
export type WorkspaceRoomCommentReply = {
|
|
28
|
+
id: string;
|
|
29
|
+
body: string;
|
|
30
|
+
authorId?: string;
|
|
31
|
+
authorName?: string;
|
|
32
|
+
authorColor?: string;
|
|
33
|
+
createdAt: string;
|
|
34
|
+
};
|
|
35
|
+
export type WorkspaceRoomComment = {
|
|
36
|
+
id: string;
|
|
37
|
+
fileId: string;
|
|
38
|
+
body: string;
|
|
39
|
+
authorId?: string;
|
|
40
|
+
authorName?: string;
|
|
41
|
+
authorColor?: string;
|
|
42
|
+
quote?: string;
|
|
43
|
+
sourceQuote?: string;
|
|
44
|
+
selectionStart?: number;
|
|
45
|
+
selectionEnd?: number;
|
|
46
|
+
resolved: boolean;
|
|
47
|
+
createdAt: string;
|
|
48
|
+
replies: WorkspaceRoomCommentReply[];
|
|
49
|
+
};
|
|
50
|
+
export type WorkspaceRoomSnapshot = {
|
|
51
|
+
roomId: string;
|
|
52
|
+
schemaVersion: typeof WORKSPACE_ROOM_SCHEMA_VERSION;
|
|
53
|
+
rootId: string;
|
|
54
|
+
nodes: WorkspaceRoomNode[];
|
|
55
|
+
documents: Record<string, string>;
|
|
56
|
+
commentsByFileId: Record<string, WorkspaceRoomComment[]>;
|
|
57
|
+
};
|
|
58
|
+
export type WorkspaceRoomStructureSnapshot = Pick<WorkspaceRoomSnapshot, "roomId" | "schemaVersion" | "rootId" | "nodes">;
|
|
59
|
+
export type WorkspaceRoomLimitViolation = "content-bytes" | "documents" | "folders" | "tree-depth" | "comments" | "comment-length" | "replies";
|
|
60
|
+
export type WorkspaceRoomLimitResult = {
|
|
61
|
+
ok: true;
|
|
62
|
+
} | {
|
|
63
|
+
ok: false;
|
|
64
|
+
violation: WorkspaceRoomLimitViolation;
|
|
65
|
+
message: string;
|
|
66
|
+
};
|
|
67
|
+
export declare const validateWorkspaceRoomLimits: (snapshot: WorkspaceRoomSnapshot) => WorkspaceRoomLimitResult;
|
|
68
|
+
export declare const validateWorkspaceRoomStructureLimits: (snapshot: Pick<WorkspaceRoomStructureSnapshot, "rootId" | "nodes">) => WorkspaceRoomLimitResult;
|
|
69
|
+
//# sourceMappingURL=workspaceRoomModel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceRoomModel.d.ts","sourceRoot":"","sources":["../src/workspaceRoomModel.ts"],"names":[],"mappings":"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"}
|