@sharpee/engine 0.9.60-beta
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/LICENSE +21 -0
- package/README.md +328 -0
- package/dist/action-context-factory.d.ts +11 -0
- package/dist/action-context-factory.d.ts.map +1 -0
- package/dist/action-context-factory.js +258 -0
- package/dist/action-context-factory.js.map +1 -0
- package/dist/capability-dispatch-helper.d.ts +106 -0
- package/dist/capability-dispatch-helper.d.ts.map +1 -0
- package/dist/capability-dispatch-helper.js +269 -0
- package/dist/capability-dispatch-helper.js.map +1 -0
- package/dist/command-executor.d.ts +53 -0
- package/dist/command-executor.d.ts.map +1 -0
- package/dist/command-executor.js +329 -0
- package/dist/command-executor.js.map +1 -0
- package/dist/event-adapter.d.ts +44 -0
- package/dist/event-adapter.d.ts.map +1 -0
- package/dist/event-adapter.js +127 -0
- package/dist/event-adapter.js.map +1 -0
- package/dist/event-sequencer.d.ts +73 -0
- package/dist/event-sequencer.d.ts.map +1 -0
- package/dist/event-sequencer.js +134 -0
- package/dist/event-sequencer.js.map +1 -0
- package/dist/events/event-emitter.d.ts +34 -0
- package/dist/events/event-emitter.d.ts.map +1 -0
- package/dist/events/event-emitter.js +67 -0
- package/dist/events/event-emitter.js.map +1 -0
- package/dist/game-engine.d.ts +292 -0
- package/dist/game-engine.d.ts.map +1 -0
- package/dist/game-engine.js +1631 -0
- package/dist/game-engine.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62 -0
- package/dist/index.js.map +1 -0
- package/dist/narrative/index.d.ts +5 -0
- package/dist/narrative/index.d.ts.map +1 -0
- package/dist/narrative/index.js +10 -0
- package/dist/narrative/index.js.map +1 -0
- package/dist/narrative/narrative-settings.d.ts +73 -0
- package/dist/narrative/narrative-settings.d.ts.map +1 -0
- package/dist/narrative/narrative-settings.js +28 -0
- package/dist/narrative/narrative-settings.js.map +1 -0
- package/dist/parser-interface.d.ts +77 -0
- package/dist/parser-interface.d.ts.map +1 -0
- package/dist/parser-interface.js +48 -0
- package/dist/parser-interface.js.map +1 -0
- package/dist/platform-operations.d.ts +83 -0
- package/dist/platform-operations.d.ts.map +1 -0
- package/dist/platform-operations.js +218 -0
- package/dist/platform-operations.js.map +1 -0
- package/dist/save-restore-service.d.ts +133 -0
- package/dist/save-restore-service.d.ts.map +1 -0
- package/dist/save-restore-service.js +446 -0
- package/dist/save-restore-service.js.map +1 -0
- package/dist/scheduler/index.d.ts +9 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +25 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/scheduler-service.d.ts +75 -0
- package/dist/scheduler/scheduler-service.d.ts.map +1 -0
- package/dist/scheduler/scheduler-service.js +310 -0
- package/dist/scheduler/scheduler-service.js.map +1 -0
- package/dist/scheduler/seeded-random.d.ts +7 -0
- package/dist/scheduler/seeded-random.d.ts.map +1 -0
- package/dist/scheduler/seeded-random.js +11 -0
- package/dist/scheduler/seeded-random.js.map +1 -0
- package/dist/scheduler/types.d.ts +134 -0
- package/dist/scheduler/types.d.ts.map +1 -0
- package/dist/scheduler/types.js +9 -0
- package/dist/scheduler/types.js.map +1 -0
- package/dist/shared-data-keys.d.ts +53 -0
- package/dist/shared-data-keys.d.ts.map +1 -0
- package/dist/shared-data-keys.js +29 -0
- package/dist/shared-data-keys.js.map +1 -0
- package/dist/story.d.ts +211 -0
- package/dist/story.d.ts.map +1 -0
- package/dist/story.js +60 -0
- package/dist/story.js.map +1 -0
- package/dist/test-helpers/mock-text-service.d.ts +11 -0
- package/dist/test-helpers/mock-text-service.d.ts.map +1 -0
- package/dist/test-helpers/mock-text-service.js +47 -0
- package/dist/test-helpers/mock-text-service.js.map +1 -0
- package/dist/turn-event-processor.d.ts +89 -0
- package/dist/turn-event-processor.d.ts.map +1 -0
- package/dist/turn-event-processor.js +144 -0
- package/dist/turn-event-processor.js.map +1 -0
- package/dist/types.d.ts +214 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/vocabulary-manager.d.ts +35 -0
- package/dist/vocabulary-manager.d.ts.map +1 -0
- package/dist/vocabulary-manager.js +74 -0
- package/dist/vocabulary-manager.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Platform Operations Handler - Handles platform events (save/restore/quit/restart/undo)
|
|
4
|
+
*
|
|
5
|
+
* Extracted from GameEngine as part of Phase 4 remediation.
|
|
6
|
+
* Uses strategy pattern to handle different platform operation types.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.PlatformOperationHandler = void 0;
|
|
10
|
+
exports.createPlatformOperationHandler = createPlatformOperationHandler;
|
|
11
|
+
const core_1 = require("@sharpee/core");
|
|
12
|
+
const parser_interface_1 = require("./parser-interface");
|
|
13
|
+
/**
|
|
14
|
+
* Handler for platform operations
|
|
15
|
+
*/
|
|
16
|
+
class PlatformOperationHandler {
|
|
17
|
+
saveRestoreHooks;
|
|
18
|
+
saveRestoreService;
|
|
19
|
+
stateProvider;
|
|
20
|
+
vocabularyManager;
|
|
21
|
+
constructor(saveRestoreHooks, saveRestoreService, stateProvider, vocabularyManager) {
|
|
22
|
+
this.saveRestoreHooks = saveRestoreHooks;
|
|
23
|
+
this.saveRestoreService = saveRestoreService;
|
|
24
|
+
this.stateProvider = stateProvider;
|
|
25
|
+
this.vocabularyManager = vocabularyManager;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Process all pending platform operations
|
|
29
|
+
*
|
|
30
|
+
* @param pendingOps - Array of pending platform operations
|
|
31
|
+
* @param context - Platform operation context
|
|
32
|
+
* @param engineCallbacks - Callbacks for engine-level operations
|
|
33
|
+
*/
|
|
34
|
+
async processAll(pendingOps, context, engineCallbacks) {
|
|
35
|
+
// Ensure there's an entry for the current turn
|
|
36
|
+
if (!context.turnEvents.has(context.currentTurn)) {
|
|
37
|
+
context.turnEvents.set(context.currentTurn, []);
|
|
38
|
+
}
|
|
39
|
+
for (const platformOp of pendingOps) {
|
|
40
|
+
try {
|
|
41
|
+
const resultEvent = await this.handleOperation(platformOp, context, engineCallbacks);
|
|
42
|
+
if (resultEvent) {
|
|
43
|
+
// Add to event source and turn events
|
|
44
|
+
context.eventSource.emit(resultEvent);
|
|
45
|
+
context.turnEvents.get(context.currentTurn)?.push(resultEvent);
|
|
46
|
+
context.emitEvent(resultEvent);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.error(`Error processing platform operation ${platformOp.type}:`, error);
|
|
51
|
+
// Emit appropriate error event
|
|
52
|
+
const errorEvent = this.createErrorEvent(platformOp.type, error instanceof Error ? error.message : 'Unknown error');
|
|
53
|
+
if (errorEvent) {
|
|
54
|
+
context.eventSource.emit(errorEvent);
|
|
55
|
+
context.turnEvents.get(context.currentTurn)?.push(errorEvent);
|
|
56
|
+
context.emitEvent(errorEvent);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Handle a single platform operation
|
|
63
|
+
*/
|
|
64
|
+
async handleOperation(platformOp, context, engineCallbacks) {
|
|
65
|
+
switch (platformOp.type) {
|
|
66
|
+
case core_1.PlatformEventType.SAVE_REQUESTED:
|
|
67
|
+
return this.handleSave(platformOp);
|
|
68
|
+
case core_1.PlatformEventType.RESTORE_REQUESTED:
|
|
69
|
+
return this.handleRestore(platformOp, engineCallbacks);
|
|
70
|
+
case core_1.PlatformEventType.QUIT_REQUESTED:
|
|
71
|
+
return this.handleQuit(platformOp, context, engineCallbacks);
|
|
72
|
+
case core_1.PlatformEventType.RESTART_REQUESTED:
|
|
73
|
+
return this.handleRestart(platformOp, context, engineCallbacks);
|
|
74
|
+
case core_1.PlatformEventType.UNDO_REQUESTED:
|
|
75
|
+
return this.handleUndo(engineCallbacks);
|
|
76
|
+
default:
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Handle save request
|
|
82
|
+
*/
|
|
83
|
+
async handleSave(platformOp) {
|
|
84
|
+
if (!this.saveRestoreHooks?.onSaveRequested) {
|
|
85
|
+
return (0, core_1.createSaveCompletedEvent)(false, 'No save handler registered');
|
|
86
|
+
}
|
|
87
|
+
const saveContext = platformOp.payload.context;
|
|
88
|
+
const saveData = this.saveRestoreService.createSaveData(this.stateProvider);
|
|
89
|
+
// Add any additional context from the platform event
|
|
90
|
+
if (saveContext?.saveName) {
|
|
91
|
+
saveData.metadata.description = saveContext.saveName;
|
|
92
|
+
}
|
|
93
|
+
if (saveContext?.metadata) {
|
|
94
|
+
Object.assign(saveData.metadata, saveContext.metadata);
|
|
95
|
+
}
|
|
96
|
+
await this.saveRestoreHooks.onSaveRequested(saveData);
|
|
97
|
+
return (0, core_1.createSaveCompletedEvent)(true);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Handle restore request
|
|
101
|
+
*/
|
|
102
|
+
async handleRestore(platformOp, engineCallbacks) {
|
|
103
|
+
if (!this.saveRestoreHooks?.onRestoreRequested) {
|
|
104
|
+
return (0, core_1.createRestoreCompletedEvent)(false, 'No restore handler registered');
|
|
105
|
+
}
|
|
106
|
+
const saveData = await this.saveRestoreHooks.onRestoreRequested();
|
|
107
|
+
if (!saveData) {
|
|
108
|
+
return (0, core_1.createRestoreCompletedEvent)(false, 'No save data available or restore cancelled');
|
|
109
|
+
}
|
|
110
|
+
const result = this.saveRestoreService.loadSaveData(saveData, this.stateProvider);
|
|
111
|
+
// Update context
|
|
112
|
+
engineCallbacks.updateContext({ currentTurn: result.currentTurn });
|
|
113
|
+
// Reset pronoun context
|
|
114
|
+
const parser = engineCallbacks.getParser();
|
|
115
|
+
if (parser && (0, parser_interface_1.hasPronounContext)(parser)) {
|
|
116
|
+
parser.resetPronounContext();
|
|
117
|
+
}
|
|
118
|
+
// Update vocabulary for current scope
|
|
119
|
+
engineCallbacks.updateScopeVocabulary();
|
|
120
|
+
engineCallbacks.emitStateChanged();
|
|
121
|
+
return (0, core_1.createRestoreCompletedEvent)(true);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Handle quit request
|
|
125
|
+
*/
|
|
126
|
+
async handleQuit(platformOp, context, engineCallbacks) {
|
|
127
|
+
const quitContext = platformOp.payload.context;
|
|
128
|
+
if (this.saveRestoreHooks?.onQuitRequested) {
|
|
129
|
+
const shouldQuit = await this.saveRestoreHooks.onQuitRequested(quitContext || {});
|
|
130
|
+
if (shouldQuit) {
|
|
131
|
+
engineCallbacks.stopEngine('quit');
|
|
132
|
+
return (0, core_1.createQuitConfirmedEvent)();
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
return (0, core_1.createQuitCancelledEvent)();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
// No quit hook registered, auto-confirm
|
|
140
|
+
return (0, core_1.createQuitConfirmedEvent)();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Handle restart request
|
|
145
|
+
*/
|
|
146
|
+
async handleRestart(platformOp, context, engineCallbacks) {
|
|
147
|
+
const restartContext = platformOp.payload.context;
|
|
148
|
+
if (this.saveRestoreHooks?.onRestartRequested) {
|
|
149
|
+
const shouldRestart = await this.saveRestoreHooks.onRestartRequested(restartContext || {});
|
|
150
|
+
if (shouldRestart) {
|
|
151
|
+
// Reset pronoun context
|
|
152
|
+
const parser = engineCallbacks.getParser();
|
|
153
|
+
if (parser && (0, parser_interface_1.hasPronounContext)(parser)) {
|
|
154
|
+
parser.resetPronounContext();
|
|
155
|
+
}
|
|
156
|
+
await engineCallbacks.restartStory();
|
|
157
|
+
return (0, core_1.createRestartCompletedEvent)(true);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
return (0, core_1.createRestartCompletedEvent)(false);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
// No restart hook registered - default behavior is to restart
|
|
165
|
+
const parser = engineCallbacks.getParser();
|
|
166
|
+
if (parser && (0, parser_interface_1.hasPronounContext)(parser)) {
|
|
167
|
+
parser.resetPronounContext();
|
|
168
|
+
}
|
|
169
|
+
await engineCallbacks.restartStory();
|
|
170
|
+
return (0, core_1.createRestartCompletedEvent)(true);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Handle undo request
|
|
175
|
+
*/
|
|
176
|
+
handleUndo(engineCallbacks) {
|
|
177
|
+
const world = this.stateProvider.getWorld();
|
|
178
|
+
const result = this.saveRestoreService.undo(world);
|
|
179
|
+
if (result) {
|
|
180
|
+
// Update context with restored turn
|
|
181
|
+
engineCallbacks.updateContext({ currentTurn: result.turn });
|
|
182
|
+
// Update vocabulary for current scope
|
|
183
|
+
engineCallbacks.updateScopeVocabulary();
|
|
184
|
+
engineCallbacks.emitStateChanged();
|
|
185
|
+
return (0, core_1.createUndoCompletedEvent)(true, result.turn);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
return (0, core_1.createUndoCompletedEvent)(false, undefined, 'Nothing to undo');
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Create an error event for a failed operation
|
|
193
|
+
*/
|
|
194
|
+
createErrorEvent(operationType, errorMessage) {
|
|
195
|
+
switch (operationType) {
|
|
196
|
+
case core_1.PlatformEventType.SAVE_REQUESTED:
|
|
197
|
+
return (0, core_1.createSaveCompletedEvent)(false, errorMessage);
|
|
198
|
+
case core_1.PlatformEventType.RESTORE_REQUESTED:
|
|
199
|
+
return (0, core_1.createRestoreCompletedEvent)(false, errorMessage);
|
|
200
|
+
case core_1.PlatformEventType.QUIT_REQUESTED:
|
|
201
|
+
return (0, core_1.createQuitCancelledEvent)();
|
|
202
|
+
case core_1.PlatformEventType.RESTART_REQUESTED:
|
|
203
|
+
return (0, core_1.createRestartCompletedEvent)(false);
|
|
204
|
+
case core_1.PlatformEventType.UNDO_REQUESTED:
|
|
205
|
+
return (0, core_1.createUndoCompletedEvent)(false, undefined, errorMessage);
|
|
206
|
+
default:
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
exports.PlatformOperationHandler = PlatformOperationHandler;
|
|
212
|
+
/**
|
|
213
|
+
* Create a platform operation handler instance
|
|
214
|
+
*/
|
|
215
|
+
function createPlatformOperationHandler(saveRestoreHooks, saveRestoreService, stateProvider, vocabularyManager) {
|
|
216
|
+
return new PlatformOperationHandler(saveRestoreHooks, saveRestoreService, stateProvider, vocabularyManager);
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=platform-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-operations.js","sourceRoot":"","sources":["../src/platform-operations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Save/Restore Service - Manages game state persistence and undo
|
|
3
|
+
*
|
|
4
|
+
* Extracted from GameEngine as part of Phase 4 remediation.
|
|
5
|
+
* Handles save/restore data creation, undo snapshots, and serialization.
|
|
6
|
+
*/
|
|
7
|
+
import { WorldModel } from '@sharpee/world-model';
|
|
8
|
+
import { ISaveData, ISerializedTurn, ISemanticEventSource } from '@sharpee/core';
|
|
9
|
+
import { ISchedulerService } from './scheduler';
|
|
10
|
+
import { TurnResult, GameContext } from './types';
|
|
11
|
+
import { Story } from './story';
|
|
12
|
+
/**
|
|
13
|
+
* Interface for accessing engine state needed for save/restore
|
|
14
|
+
*/
|
|
15
|
+
export interface ISaveRestoreStateProvider {
|
|
16
|
+
getWorld(): WorldModel;
|
|
17
|
+
getContext(): GameContext;
|
|
18
|
+
getStory(): Story | undefined;
|
|
19
|
+
getEventSource(): ISemanticEventSource;
|
|
20
|
+
getScheduler(): ISchedulerService;
|
|
21
|
+
getParser(): unknown | undefined;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Configuration for the undo system
|
|
25
|
+
*/
|
|
26
|
+
export interface UndoConfig {
|
|
27
|
+
maxSnapshots: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Service for managing save/restore and undo functionality
|
|
31
|
+
*/
|
|
32
|
+
export declare class SaveRestoreService {
|
|
33
|
+
private undoSnapshots;
|
|
34
|
+
private undoSnapshotTurns;
|
|
35
|
+
private maxUndoSnapshots;
|
|
36
|
+
constructor(config?: UndoConfig);
|
|
37
|
+
/**
|
|
38
|
+
* Create an undo snapshot of the current world state
|
|
39
|
+
*/
|
|
40
|
+
createUndoSnapshot(world: WorldModel, currentTurn: number): void;
|
|
41
|
+
/**
|
|
42
|
+
* Undo to previous turn
|
|
43
|
+
* @returns The turn number restored to, or null if nothing to undo
|
|
44
|
+
*/
|
|
45
|
+
undo(world: WorldModel): {
|
|
46
|
+
turn: number;
|
|
47
|
+
} | null;
|
|
48
|
+
/**
|
|
49
|
+
* Check if undo is available
|
|
50
|
+
*/
|
|
51
|
+
canUndo(): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Get number of undo levels available
|
|
54
|
+
*/
|
|
55
|
+
getUndoLevels(): number;
|
|
56
|
+
/**
|
|
57
|
+
* Clear all undo snapshots (e.g., after restore)
|
|
58
|
+
*/
|
|
59
|
+
clearUndoSnapshots(): void;
|
|
60
|
+
/**
|
|
61
|
+
* Create save data from current engine state
|
|
62
|
+
*/
|
|
63
|
+
createSaveData(provider: ISaveRestoreStateProvider): ISaveData;
|
|
64
|
+
/**
|
|
65
|
+
* Load save data into engine state
|
|
66
|
+
* @returns New event source with restored events
|
|
67
|
+
*/
|
|
68
|
+
loadSaveData(saveData: ISaveData, provider: ISaveRestoreStateProvider): {
|
|
69
|
+
eventSource: ISemanticEventSource;
|
|
70
|
+
currentTurn: number;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Serialize event source
|
|
74
|
+
*/
|
|
75
|
+
private serializeEventSource;
|
|
76
|
+
/**
|
|
77
|
+
* Serialize event data, handling functions and special types
|
|
78
|
+
*/
|
|
79
|
+
private serializeEventData;
|
|
80
|
+
/**
|
|
81
|
+
* Deserialize event source
|
|
82
|
+
*/
|
|
83
|
+
private deserializeEventSource;
|
|
84
|
+
/**
|
|
85
|
+
* Deserialize event data, handling function markers
|
|
86
|
+
*/
|
|
87
|
+
private deserializeEventData;
|
|
88
|
+
/**
|
|
89
|
+
* Serialize spatial index (world state)
|
|
90
|
+
*/
|
|
91
|
+
private serializeSpatialIndex;
|
|
92
|
+
/**
|
|
93
|
+
* Deserialize spatial index
|
|
94
|
+
*/
|
|
95
|
+
private deserializeSpatialIndex;
|
|
96
|
+
/**
|
|
97
|
+
* Serialize turn history
|
|
98
|
+
*/
|
|
99
|
+
private serializeTurnHistory;
|
|
100
|
+
/**
|
|
101
|
+
* Deserialize turn history
|
|
102
|
+
*/
|
|
103
|
+
deserializeTurnHistory(turns: ISerializedTurn[], eventSource: ISemanticEventSource): TurnResult[];
|
|
104
|
+
/**
|
|
105
|
+
* Serialize parser state
|
|
106
|
+
*/
|
|
107
|
+
private serializeParserState;
|
|
108
|
+
/**
|
|
109
|
+
* Serialize scheduler state (daemons and fuses)
|
|
110
|
+
*/
|
|
111
|
+
private serializeSchedulerState;
|
|
112
|
+
/**
|
|
113
|
+
* Deserialize scheduler state
|
|
114
|
+
*/
|
|
115
|
+
private deserializeSchedulerState;
|
|
116
|
+
/**
|
|
117
|
+
* Serialize a trait
|
|
118
|
+
*/
|
|
119
|
+
private serializeTrait;
|
|
120
|
+
/**
|
|
121
|
+
* Deserialize a trait
|
|
122
|
+
*/
|
|
123
|
+
private deserializeTrait;
|
|
124
|
+
/**
|
|
125
|
+
* Extract connections from a location entity
|
|
126
|
+
*/
|
|
127
|
+
private extractConnections;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Create a save/restore service instance
|
|
131
|
+
*/
|
|
132
|
+
export declare function createSaveRestoreService(config?: UndoConfig): SaveRestoreService;
|
|
133
|
+
//# sourceMappingURL=save-restore-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save-restore-service.d.ts","sourceRoot":"","sources":["../src/save-restore-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,UAAU,EAIX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,SAAS,EAQT,eAAe,EAGf,oBAAoB,EAErB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGhC;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,IAAI,UAAU,CAAC;IACvB,UAAU,IAAI,WAAW,CAAC;IAC1B,QAAQ,IAAI,KAAK,GAAG,SAAS,CAAC;IAC9B,cAAc,IAAI,oBAAoB,CAAC;IACvC,YAAY,IAAI,iBAAiB,CAAC;IAClC,SAAS,IAAI,OAAO,GAAG,SAAS,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAE7B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,gBAAgB,CAAS;gBAErB,MAAM,CAAC,EAAE,UAAU;IAI/B;;OAEG;IACH,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAiBhE;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAehD;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAK1B;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,yBAAyB,GAAG,SAAS;IAwC9D;;;OAGG;IACH,YAAY,CACV,QAAQ,EAAE,SAAS,EACnB,QAAQ,EAAE,yBAAyB,GAClC;QACD,WAAW,EAAE,oBAAoB,CAAC;QAClC,WAAW,EAAE,MAAM,CAAC;KACrB;IAwCD;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA6B1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAgB9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAwB5B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyC7B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAoC/B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;OAEG;IACH,sBAAsB,CACpB,KAAK,EAAE,eAAe,EAAE,EACxB,WAAW,EAAE,oBAAoB,GAChC,UAAU,EAAE;IAyBf;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAmB/B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAqBjC;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;CA0C3B;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,kBAAkB,CAEhF"}
|