@skenora/editor 0.1.2
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 +51 -0
- package/dist/commands/annotation-commands.d.ts +12 -0
- package/dist/commands/annotation-commands.d.ts.map +1 -0
- package/dist/commands/annotation-commands.js +37 -0
- package/dist/commands/annotation-commands.js.map +1 -0
- package/dist/commands/camera-entity-commands.d.ts +12 -0
- package/dist/commands/camera-entity-commands.d.ts.map +1 -0
- package/dist/commands/camera-entity-commands.js +60 -0
- package/dist/commands/camera-entity-commands.js.map +1 -0
- package/dist/commands/camera-path-commands.d.ts +9 -0
- package/dist/commands/camera-path-commands.d.ts.map +1 -0
- package/dist/commands/camera-path-commands.js +95 -0
- package/dist/commands/camera-path-commands.js.map +1 -0
- package/dist/commands/flow-commands.d.ts +10 -0
- package/dist/commands/flow-commands.d.ts.map +1 -0
- package/dist/commands/flow-commands.js +86 -0
- package/dist/commands/flow-commands.js.map +1 -0
- package/dist/commands/geometry-commands.d.ts +8 -0
- package/dist/commands/geometry-commands.d.ts.map +1 -0
- package/dist/commands/geometry-commands.js +85 -0
- package/dist/commands/geometry-commands.js.map +1 -0
- package/dist/commands/material-assignment.d.ts +7 -0
- package/dist/commands/material-assignment.d.ts.map +1 -0
- package/dist/commands/material-assignment.js +69 -0
- package/dist/commands/material-assignment.js.map +1 -0
- package/dist/commands/material-commands.d.ts +13 -0
- package/dist/commands/material-commands.d.ts.map +1 -0
- package/dist/commands/material-commands.js +182 -0
- package/dist/commands/material-commands.js.map +1 -0
- package/dist/commands/model-import-commands.d.ts +6 -0
- package/dist/commands/model-import-commands.d.ts.map +1 -0
- package/dist/commands/model-import-commands.js +120 -0
- package/dist/commands/model-import-commands.js.map +1 -0
- package/dist/commands/particle-commands.d.ts +13 -0
- package/dist/commands/particle-commands.d.ts.map +1 -0
- package/dist/commands/particle-commands.js +47 -0
- package/dist/commands/particle-commands.js.map +1 -0
- package/dist/commands/primitive-commands.d.ts +18 -0
- package/dist/commands/primitive-commands.d.ts.map +1 -0
- package/dist/commands/primitive-commands.js +24 -0
- package/dist/commands/primitive-commands.js.map +1 -0
- package/dist/commands/procedural-commands.d.ts +13 -0
- package/dist/commands/procedural-commands.d.ts.map +1 -0
- package/dist/commands/procedural-commands.js +20 -0
- package/dist/commands/procedural-commands.js.map +1 -0
- package/dist/commands/scene-commands.d.ts +16 -0
- package/dist/commands/scene-commands.d.ts.map +1 -0
- package/dist/commands/scene-commands.js +146 -0
- package/dist/commands/scene-commands.js.map +1 -0
- package/dist/commands/shape-commands.d.ts +24 -0
- package/dist/commands/shape-commands.d.ts.map +1 -0
- package/dist/commands/shape-commands.js +95 -0
- package/dist/commands/shape-commands.js.map +1 -0
- package/dist/commands/texture-animation-commands.d.ts +5 -0
- package/dist/commands/texture-animation-commands.d.ts.map +1 -0
- package/dist/commands/texture-animation-commands.js +23 -0
- package/dist/commands/texture-animation-commands.js.map +1 -0
- package/dist/core/candidate-commit.d.ts +59 -0
- package/dist/core/candidate-commit.d.ts.map +1 -0
- package/dist/core/candidate-commit.js +54 -0
- package/dist/core/candidate-commit.js.map +1 -0
- package/dist/core/commands.d.ts +20 -0
- package/dist/core/commands.d.ts.map +1 -0
- package/dist/core/commands.js +282 -0
- package/dist/core/commands.js.map +1 -0
- package/dist/core/editor-session.d.ts +92 -0
- package/dist/core/editor-session.d.ts.map +1 -0
- package/dist/core/editor-session.js +496 -0
- package/dist/core/editor-session.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/properties/property-descriptors.d.ts +58 -0
- package/dist/properties/property-descriptors.d.ts.map +1 -0
- package/dist/properties/property-descriptors.js +832 -0
- package/dist/properties/property-descriptors.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/** Core command contract and reusable document operations. */
|
|
2
|
+
import { createMaterialBindingId, getMaterialBindingsForEntity, toMaterialDefinition, } from "@skenora/contracts";
|
|
3
|
+
import { getAtPath, } from "@skenora/document";
|
|
4
|
+
let commandSequence = 0;
|
|
5
|
+
export function createCommandId(prefix = "command") {
|
|
6
|
+
commandSequence += 1;
|
|
7
|
+
return `${prefix}-${Date.now()}-${commandSequence}`;
|
|
8
|
+
}
|
|
9
|
+
export function setPropertyCommand(path, value, label = "Set property") {
|
|
10
|
+
return {
|
|
11
|
+
id: createCommandId("set"),
|
|
12
|
+
label,
|
|
13
|
+
createPatches(document) {
|
|
14
|
+
const previousValue = getAtPath(document, path);
|
|
15
|
+
if (Object.is(previousValue, value))
|
|
16
|
+
return [];
|
|
17
|
+
return [{ op: "set", path, value, previousValue }];
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export function replaceDocumentCommand(document, label = "Replace document") {
|
|
22
|
+
return setPropertyCommand([], document, label);
|
|
23
|
+
}
|
|
24
|
+
export function addEntityCommand(entity) {
|
|
25
|
+
return {
|
|
26
|
+
id: createCommandId("add-entity"),
|
|
27
|
+
label: `Add ${entity.name}`,
|
|
28
|
+
createPatches(document) {
|
|
29
|
+
if (document.entities[entity.id]) {
|
|
30
|
+
throw new Error(`Entity already exists: ${entity.id}`);
|
|
31
|
+
}
|
|
32
|
+
const patches = [
|
|
33
|
+
{
|
|
34
|
+
op: "set",
|
|
35
|
+
path: ["entities", entity.id],
|
|
36
|
+
value: entity,
|
|
37
|
+
previousValue: undefined,
|
|
38
|
+
},
|
|
39
|
+
];
|
|
40
|
+
if (entity.parentId === null) {
|
|
41
|
+
patches.push({
|
|
42
|
+
op: "set",
|
|
43
|
+
path: ["rootEntityIds"],
|
|
44
|
+
value: [...document.rootEntityIds, entity.id],
|
|
45
|
+
previousValue: document.rootEntityIds,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return patches;
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export function removeEntityCommand(entityId) {
|
|
53
|
+
return {
|
|
54
|
+
id: createCommandId("remove-entity"),
|
|
55
|
+
label: "Remove entity",
|
|
56
|
+
createPatches(document) {
|
|
57
|
+
const target = document.entities[entityId];
|
|
58
|
+
if (!target)
|
|
59
|
+
return [];
|
|
60
|
+
const descendants = collectDescendants(document, entityId);
|
|
61
|
+
const removedIds = new Set([entityId, ...descendants]);
|
|
62
|
+
const nextRoots = document.rootEntityIds.filter((id) => !removedIds.has(id));
|
|
63
|
+
const patches = [];
|
|
64
|
+
for (const id of [...descendants].reverse()) {
|
|
65
|
+
const entity = document.entities[id];
|
|
66
|
+
if (!entity)
|
|
67
|
+
continue;
|
|
68
|
+
patches.push({
|
|
69
|
+
op: "delete",
|
|
70
|
+
path: ["entities", id],
|
|
71
|
+
previousValue: entity,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
patches.push({
|
|
75
|
+
op: "delete",
|
|
76
|
+
path: ["entities", entityId],
|
|
77
|
+
previousValue: target,
|
|
78
|
+
});
|
|
79
|
+
for (const [bindingId, binding] of Object.entries(document.materialBindings)) {
|
|
80
|
+
if (!removedIds.has(binding.entityId))
|
|
81
|
+
continue;
|
|
82
|
+
patches.push({
|
|
83
|
+
op: "delete",
|
|
84
|
+
path: ["materialBindings", bindingId],
|
|
85
|
+
previousValue: binding,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
if (nextRoots.length !== document.rootEntityIds.length) {
|
|
89
|
+
patches.push({
|
|
90
|
+
op: "set",
|
|
91
|
+
path: ["rootEntityIds"],
|
|
92
|
+
value: nextRoots,
|
|
93
|
+
previousValue: document.rootEntityIds,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return patches;
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export function setEntityTransformCommand(entityId, transform) {
|
|
101
|
+
return setPropertyCommand(["entities", entityId, "transform"], transform, "Transform entity");
|
|
102
|
+
}
|
|
103
|
+
export function renameEntityCommand(entityId, name) {
|
|
104
|
+
return setPropertyCommand(["entities", entityId, "name"], name, "Rename entity");
|
|
105
|
+
}
|
|
106
|
+
export function setEntityEnabledCommand(entityId, enabled) {
|
|
107
|
+
return setPropertyCommand(["entities", entityId, "enabled"], enabled, enabled ? "Enable entity" : "Disable entity");
|
|
108
|
+
}
|
|
109
|
+
export function setEntityVisibleCommand(entityId, visible) {
|
|
110
|
+
return setPropertyCommand(["entities", entityId, "visible"], visible, visible ? "Show entity" : "Hide entity");
|
|
111
|
+
}
|
|
112
|
+
export function reparentEntityCommand(entityId, parentId) {
|
|
113
|
+
return {
|
|
114
|
+
id: createCommandId("reparent"),
|
|
115
|
+
label: "Reparent entity",
|
|
116
|
+
createPatches(document) {
|
|
117
|
+
const entity = document.entities[entityId];
|
|
118
|
+
if (!entity)
|
|
119
|
+
throw new Error(`Entity not found: ${entityId}`);
|
|
120
|
+
if (parentId === entityId)
|
|
121
|
+
throw new Error("An entity cannot parent itself");
|
|
122
|
+
if (parentId && !document.entities[parentId]) {
|
|
123
|
+
throw new Error(`Parent entity not found: ${parentId}`);
|
|
124
|
+
}
|
|
125
|
+
if (parentId &&
|
|
126
|
+
collectDescendants(document, entityId).includes(parentId)) {
|
|
127
|
+
throw new Error("An entity cannot be parented below one of its descendants");
|
|
128
|
+
}
|
|
129
|
+
if (entity.parentId === parentId)
|
|
130
|
+
return [];
|
|
131
|
+
const wasRoot = entity.parentId === null;
|
|
132
|
+
const becomesRoot = parentId === null;
|
|
133
|
+
const patches = [
|
|
134
|
+
{
|
|
135
|
+
op: "set",
|
|
136
|
+
path: ["entities", entityId, "parentId"],
|
|
137
|
+
value: parentId,
|
|
138
|
+
previousValue: entity.parentId,
|
|
139
|
+
},
|
|
140
|
+
];
|
|
141
|
+
if (wasRoot !== becomesRoot) {
|
|
142
|
+
patches.push({
|
|
143
|
+
op: "set",
|
|
144
|
+
path: ["rootEntityIds"],
|
|
145
|
+
value: becomesRoot
|
|
146
|
+
? [...document.rootEntityIds, entityId]
|
|
147
|
+
: document.rootEntityIds.filter((id) => id !== entityId),
|
|
148
|
+
previousValue: document.rootEntityIds,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
return patches;
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
export function duplicateEntityTreeCommand(entityId, createId = (sourceId) => `${sourceId}-copy-${createCommandId("entity")}`) {
|
|
156
|
+
return {
|
|
157
|
+
id: createCommandId("duplicate"),
|
|
158
|
+
label: "Duplicate entity",
|
|
159
|
+
createPatches(document) {
|
|
160
|
+
const source = document.entities[entityId];
|
|
161
|
+
if (!source)
|
|
162
|
+
throw new Error(`Entity not found: ${entityId}`);
|
|
163
|
+
const sourceIds = [entityId, ...collectDescendants(document, entityId)];
|
|
164
|
+
const idMap = new Map(sourceIds.map((id) => [id, createId(id)]));
|
|
165
|
+
const nextEntityIds = [...idMap.values()];
|
|
166
|
+
if (new Set(nextEntityIds).size !== nextEntityIds.length ||
|
|
167
|
+
nextEntityIds.some((id) => !id.trim() || document.entities[id])) {
|
|
168
|
+
throw new Error("Duplicate entity ids must be unique and unused");
|
|
169
|
+
}
|
|
170
|
+
const occupiedMaterialIds = new Set(Object.keys(document.materials));
|
|
171
|
+
const occupiedBindingIds = new Set(Object.keys(document.materialBindings));
|
|
172
|
+
const materialIdMap = new Map();
|
|
173
|
+
const patches = [];
|
|
174
|
+
for (const sourceId of sourceIds) {
|
|
175
|
+
const entity = document.entities[sourceId];
|
|
176
|
+
const nextId = idMap.get(sourceId);
|
|
177
|
+
if (!entity || !nextId)
|
|
178
|
+
continue;
|
|
179
|
+
const parentId = sourceId === entityId
|
|
180
|
+
? entity.parentId
|
|
181
|
+
: entity.parentId
|
|
182
|
+
? (idMap.get(entity.parentId) ?? entity.parentId)
|
|
183
|
+
: null;
|
|
184
|
+
const copy = {
|
|
185
|
+
...structuredClone(entity),
|
|
186
|
+
id: nextId,
|
|
187
|
+
name: sourceId === entityId ? `${entity.name} copy` : entity.name,
|
|
188
|
+
parentId,
|
|
189
|
+
};
|
|
190
|
+
delete copy.materialIds;
|
|
191
|
+
for (const binding of getMaterialBindingsForEntity(document, sourceId)) {
|
|
192
|
+
const material = document.materials[binding.materialId];
|
|
193
|
+
if (!material) {
|
|
194
|
+
throw new Error(`Material not found: ${binding.materialId}`);
|
|
195
|
+
}
|
|
196
|
+
const nextMaterialId = availableRecordId(`${nextId}:${binding.materialId}`, occupiedMaterialIds);
|
|
197
|
+
occupiedMaterialIds.add(nextMaterialId);
|
|
198
|
+
materialIdMap.set(binding.materialId, nextMaterialId);
|
|
199
|
+
patches.push({
|
|
200
|
+
op: "set",
|
|
201
|
+
path: ["materials", nextMaterialId],
|
|
202
|
+
value: {
|
|
203
|
+
...toMaterialDefinition(material),
|
|
204
|
+
id: nextMaterialId,
|
|
205
|
+
},
|
|
206
|
+
previousValue: undefined,
|
|
207
|
+
});
|
|
208
|
+
const nextBindingId = createMaterialBindingId(nextMaterialId, nextId, binding.targetName, occupiedBindingIds);
|
|
209
|
+
occupiedBindingIds.add(nextBindingId);
|
|
210
|
+
patches.push({
|
|
211
|
+
op: "set",
|
|
212
|
+
path: ["materialBindings", nextBindingId],
|
|
213
|
+
value: {
|
|
214
|
+
id: nextBindingId,
|
|
215
|
+
materialId: nextMaterialId,
|
|
216
|
+
entityId: nextId,
|
|
217
|
+
...(binding.targetName ? { targetName: binding.targetName } : {}),
|
|
218
|
+
},
|
|
219
|
+
previousValue: undefined,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
patches.push({
|
|
223
|
+
op: "set",
|
|
224
|
+
path: ["entities", nextId],
|
|
225
|
+
value: copy,
|
|
226
|
+
previousValue: undefined,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
const occupiedAnimationIds = new Set(Object.keys(document.textureAnimations));
|
|
230
|
+
for (const [animationId, animation] of Object.entries(document.textureAnimations)) {
|
|
231
|
+
const materialId = materialIdMap.get(animation.materialId);
|
|
232
|
+
if (!materialId)
|
|
233
|
+
continue;
|
|
234
|
+
const nextAnimationId = availableRecordId(`${materialId}:${animationId}`, occupiedAnimationIds);
|
|
235
|
+
occupiedAnimationIds.add(nextAnimationId);
|
|
236
|
+
patches.push({
|
|
237
|
+
op: "set",
|
|
238
|
+
path: ["textureAnimations", nextAnimationId],
|
|
239
|
+
value: {
|
|
240
|
+
...structuredClone(animation),
|
|
241
|
+
id: nextAnimationId,
|
|
242
|
+
materialId,
|
|
243
|
+
},
|
|
244
|
+
previousValue: undefined,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
const rootCopyId = idMap.get(entityId);
|
|
248
|
+
if (source.parentId === null && rootCopyId) {
|
|
249
|
+
patches.push({
|
|
250
|
+
op: "set",
|
|
251
|
+
path: ["rootEntityIds"],
|
|
252
|
+
value: [...document.rootEntityIds, rootCopyId],
|
|
253
|
+
previousValue: document.rootEntityIds,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
return patches;
|
|
257
|
+
},
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
function availableRecordId(base, occupied) {
|
|
261
|
+
if (!occupied.has(base))
|
|
262
|
+
return base;
|
|
263
|
+
let suffix = 2;
|
|
264
|
+
while (occupied.has(`${base}-${suffix}`))
|
|
265
|
+
suffix += 1;
|
|
266
|
+
return `${base}-${suffix}`;
|
|
267
|
+
}
|
|
268
|
+
function collectDescendants(document, entityId) {
|
|
269
|
+
const result = [];
|
|
270
|
+
const queue = [entityId];
|
|
271
|
+
while (queue.length > 0) {
|
|
272
|
+
const parentId = queue.shift();
|
|
273
|
+
for (const entity of Object.values(document.entities)) {
|
|
274
|
+
if (entity.parentId !== parentId)
|
|
275
|
+
continue;
|
|
276
|
+
result.push(entity.id);
|
|
277
|
+
queue.push(entity.id);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return result;
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/core/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/** Instance-scoped headless authoring session. */
|
|
2
|
+
import { type SceneDocumentData } from "@skenora/contracts";
|
|
3
|
+
import { type DocumentChange } from "@skenora/document";
|
|
4
|
+
import { EventHub, type EventEnvelope } from "@skenora/events";
|
|
5
|
+
import { type SkenoraPlugin } from "@skenora/plugins";
|
|
6
|
+
import { type CandidateCommitOptions, type CandidateCommitResult } from "./candidate-commit.js";
|
|
7
|
+
import { type EditorCommand } from "./commands.js";
|
|
8
|
+
export interface EditorEventMap {
|
|
9
|
+
"document.changed": DocumentChange;
|
|
10
|
+
"selection.changed": {
|
|
11
|
+
entityIds: readonly string[];
|
|
12
|
+
};
|
|
13
|
+
"history.changed": {
|
|
14
|
+
canUndo: boolean;
|
|
15
|
+
canRedo: boolean;
|
|
16
|
+
};
|
|
17
|
+
"dirty.changed": {
|
|
18
|
+
dirty: boolean;
|
|
19
|
+
};
|
|
20
|
+
"command.rejected": {
|
|
21
|
+
commandId: string;
|
|
22
|
+
error: unknown;
|
|
23
|
+
};
|
|
24
|
+
"transaction.committed": {
|
|
25
|
+
transactionId: string;
|
|
26
|
+
label: string;
|
|
27
|
+
mergeKey: string | null;
|
|
28
|
+
};
|
|
29
|
+
"transaction.cancelled": {
|
|
30
|
+
transactionId: string;
|
|
31
|
+
label: string;
|
|
32
|
+
};
|
|
33
|
+
"extension.error": {
|
|
34
|
+
extensionId: string;
|
|
35
|
+
error: unknown;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export interface EditorSessionOptions {
|
|
39
|
+
events?: EventHub<EditorEventMap>;
|
|
40
|
+
historyLimit?: number;
|
|
41
|
+
validate?: false | ((document: Readonly<SceneDocumentData>) => void);
|
|
42
|
+
plugins?: readonly EditorPlugin[];
|
|
43
|
+
}
|
|
44
|
+
export type EditorPlugin = SkenoraPlugin<EditorSession>;
|
|
45
|
+
/** @deprecated Use {@link EditorPlugin}. */
|
|
46
|
+
export type EditorExtension = EditorPlugin;
|
|
47
|
+
export interface TransactionOptions {
|
|
48
|
+
label?: string;
|
|
49
|
+
mergeKey?: string;
|
|
50
|
+
mergeWindowMs?: number;
|
|
51
|
+
}
|
|
52
|
+
export interface TransactionHandle {
|
|
53
|
+
readonly id: string;
|
|
54
|
+
readonly label: string;
|
|
55
|
+
readonly active: boolean;
|
|
56
|
+
execute(command: EditorCommand): DocumentChange | null;
|
|
57
|
+
commit(): DocumentChange | null;
|
|
58
|
+
cancel(): DocumentChange | null;
|
|
59
|
+
}
|
|
60
|
+
export declare class EditorSession {
|
|
61
|
+
#private;
|
|
62
|
+
readonly events: EventHub<EditorEventMap>;
|
|
63
|
+
constructor(document: SceneDocumentData, options?: EditorSessionOptions);
|
|
64
|
+
get snapshot(): Readonly<SceneDocumentData>;
|
|
65
|
+
get revision(): number;
|
|
66
|
+
/**
|
|
67
|
+
* Commits a complete candidate document with an Editor-level revision CAS.
|
|
68
|
+
*
|
|
69
|
+
* The candidate is normalized and asserted before being converted into
|
|
70
|
+
* granular patches. The expected revision and optional document hash are
|
|
71
|
+
* checked again inside the synchronous commit boundary immediately before
|
|
72
|
+
* the Store commit, so stale candidates produce no history entry or document
|
|
73
|
+
* change. Queueing belongs to the SDK executor, not this session.
|
|
74
|
+
*/
|
|
75
|
+
commitCandidateAtRevision(candidate: unknown, options: CandidateCommitOptions): CandidateCommitResult;
|
|
76
|
+
get selection(): readonly string[];
|
|
77
|
+
get dirty(): boolean;
|
|
78
|
+
get canUndo(): boolean;
|
|
79
|
+
get canRedo(): boolean;
|
|
80
|
+
get transactionActive(): boolean;
|
|
81
|
+
execute(command: EditorCommand): DocumentChange | null;
|
|
82
|
+
transaction(label: string, commands: readonly EditorCommand[]): DocumentChange | null;
|
|
83
|
+
beginTransaction(options?: TransactionOptions): TransactionHandle;
|
|
84
|
+
undo(): DocumentChange | null;
|
|
85
|
+
redo(): DocumentChange | null;
|
|
86
|
+
select(entityIds: readonly string[]): void;
|
|
87
|
+
markSaved(): void;
|
|
88
|
+
install(plugin: EditorPlugin): () => void;
|
|
89
|
+
subscribe<TKey extends keyof EditorEventMap & string>(type: TKey, handler: (payload: EditorEventMap[TKey], event: EventEnvelope<string, EditorEventMap[TKey]>) => void, signal?: AbortSignal): () => void;
|
|
90
|
+
dispose(): void;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=editor-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor-session.d.ts","sourceRoot":"","sources":["../../src/core/editor-session.ts"],"names":[],"mappings":"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"}
|