qnce-engine 1.2.0 → 1.2.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.
Files changed (125) hide show
  1. package/README.md +713 -7
  2. package/dist/cli/audit.js +0 -0
  3. package/dist/cli/init.js +0 -0
  4. package/dist/cli/perf.d.ts.map +1 -1
  5. package/dist/cli/perf.js +2 -1
  6. package/dist/cli/perf.js.map +1 -1
  7. package/dist/cli/play.d.ts +4 -0
  8. package/dist/cli/play.d.ts.map +1 -0
  9. package/dist/cli/play.js +259 -0
  10. package/dist/cli/play.js.map +1 -0
  11. package/dist/engine/condition.d.ts +69 -0
  12. package/dist/engine/condition.d.ts.map +1 -0
  13. package/dist/engine/condition.js +195 -0
  14. package/dist/engine/condition.js.map +1 -0
  15. package/dist/engine/core.d.ts +274 -3
  16. package/dist/engine/core.d.ts.map +1 -1
  17. package/dist/engine/core.js +1148 -9
  18. package/dist/engine/core.js.map +1 -1
  19. package/dist/engine/demo-story.d.ts.map +1 -1
  20. package/dist/engine/demo-story.js +99 -13
  21. package/dist/engine/demo-story.js.map +1 -1
  22. package/dist/engine/errors.d.ts +76 -0
  23. package/dist/engine/errors.d.ts.map +1 -0
  24. package/dist/engine/errors.js +178 -0
  25. package/dist/engine/errors.js.map +1 -0
  26. package/dist/engine/types.d.ts +445 -0
  27. package/dist/engine/types.d.ts.map +1 -0
  28. package/dist/engine/types.js +9 -0
  29. package/dist/engine/types.js.map +1 -0
  30. package/dist/engine/validation.d.ts +110 -0
  31. package/dist/engine/validation.d.ts.map +1 -0
  32. package/dist/engine/validation.js +261 -0
  33. package/dist/engine/validation.js.map +1 -0
  34. package/dist/examples/examples/autosave-undo-demo.js +248 -0
  35. package/dist/examples/examples/persistence-demo.js +63 -0
  36. package/dist/examples/src/engine/condition.js +194 -0
  37. package/dist/examples/src/engine/core.js +1382 -0
  38. package/dist/examples/src/engine/demo-story.js +200 -0
  39. package/dist/examples/src/engine/types.js +8 -0
  40. package/dist/examples/src/index.js +35 -0
  41. package/dist/examples/src/integrations/react.js +322 -0
  42. package/dist/examples/src/narrative/branching/engine-simple.js +348 -0
  43. package/dist/examples/src/narrative/branching/index.js +55 -0
  44. package/dist/examples/src/narrative/branching/models.js +5 -0
  45. package/dist/examples/src/performance/ObjectPool.js +296 -0
  46. package/dist/examples/src/performance/PerfReporter.js +280 -0
  47. package/dist/examples/src/performance/ThreadPool.js +347 -0
  48. package/dist/index.d.ts +4 -0
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +12 -1
  51. package/dist/index.js.map +1 -1
  52. package/dist/integrations/react.d.ts +200 -0
  53. package/dist/integrations/react.d.ts.map +1 -0
  54. package/dist/integrations/react.js +365 -0
  55. package/dist/integrations/react.js.map +1 -0
  56. package/dist/narrative/branching/engine-simple.js +3 -3
  57. package/dist/narrative/branching/engine-simple.js.map +1 -1
  58. package/dist/narrative/branching/engine.d.ts +1 -0
  59. package/dist/narrative/branching/engine.d.ts.map +1 -0
  60. package/dist/narrative/branching/engine.js +2 -0
  61. package/dist/narrative/branching/engine.js.map +1 -0
  62. package/dist/narrative/branching/models.d.ts.map +1 -1
  63. package/dist/performance/HotReloadDelta.d.ts +25 -8
  64. package/dist/performance/HotReloadDelta.d.ts.map +1 -1
  65. package/dist/performance/HotReloadDelta.js +10 -15
  66. package/dist/performance/HotReloadDelta.js.map +1 -1
  67. package/dist/ui/__tests__/AutosaveIndicator.test.d.ts +2 -0
  68. package/dist/ui/__tests__/AutosaveIndicator.test.d.ts.map +1 -0
  69. package/dist/ui/__tests__/AutosaveIndicator.test.js +329 -0
  70. package/dist/ui/__tests__/AutosaveIndicator.test.js.map +1 -0
  71. package/dist/ui/__tests__/UndoRedoControls.test.d.ts +2 -0
  72. package/dist/ui/__tests__/UndoRedoControls.test.d.ts.map +1 -0
  73. package/dist/ui/__tests__/UndoRedoControls.test.js +245 -0
  74. package/dist/ui/__tests__/UndoRedoControls.test.js.map +1 -0
  75. package/dist/ui/__tests__/autosave-simple.test.d.ts +2 -0
  76. package/dist/ui/__tests__/autosave-simple.test.d.ts.map +1 -0
  77. package/dist/ui/__tests__/autosave-simple.test.js +29 -0
  78. package/dist/ui/__tests__/autosave-simple.test.js.map +1 -0
  79. package/dist/ui/__tests__/setup.d.ts +2 -0
  80. package/dist/ui/__tests__/setup.d.ts.map +1 -0
  81. package/dist/ui/__tests__/setup.js +40 -0
  82. package/dist/ui/__tests__/setup.js.map +1 -0
  83. package/dist/ui/__tests__/smoke-test.d.ts +2 -0
  84. package/dist/ui/__tests__/smoke-test.d.ts.map +1 -0
  85. package/dist/ui/__tests__/smoke-test.js +18 -0
  86. package/dist/ui/__tests__/smoke-test.js.map +1 -0
  87. package/dist/ui/__tests__/smoke-test.test.d.ts +2 -0
  88. package/dist/ui/__tests__/smoke-test.test.d.ts.map +1 -0
  89. package/dist/ui/__tests__/smoke-test.test.js +18 -0
  90. package/dist/ui/__tests__/smoke-test.test.js.map +1 -0
  91. package/dist/ui/__tests__/useKeyboardShortcuts.test.d.ts +2 -0
  92. package/dist/ui/__tests__/useKeyboardShortcuts.test.d.ts.map +1 -0
  93. package/dist/ui/__tests__/useKeyboardShortcuts.test.js +374 -0
  94. package/dist/ui/__tests__/useKeyboardShortcuts.test.js.map +1 -0
  95. package/dist/ui/components/AutosaveIndicator.d.ts +18 -0
  96. package/dist/ui/components/AutosaveIndicator.d.ts.map +1 -0
  97. package/dist/ui/components/AutosaveIndicator.js +175 -0
  98. package/dist/ui/components/AutosaveIndicator.js.map +1 -0
  99. package/dist/ui/components/UndoRedoControls.d.ts +16 -0
  100. package/dist/ui/components/UndoRedoControls.d.ts.map +1 -0
  101. package/dist/ui/components/UndoRedoControls.js +144 -0
  102. package/dist/ui/components/UndoRedoControls.js.map +1 -0
  103. package/dist/ui/hooks/useKeyboardShortcuts.d.ts +22 -0
  104. package/dist/ui/hooks/useKeyboardShortcuts.d.ts.map +1 -0
  105. package/dist/ui/hooks/useKeyboardShortcuts.js +162 -0
  106. package/dist/ui/hooks/useKeyboardShortcuts.js.map +1 -0
  107. package/dist/ui/index.d.ts +9 -0
  108. package/dist/ui/index.d.ts.map +1 -0
  109. package/dist/ui/index.js +14 -0
  110. package/dist/ui/index.js.map +1 -0
  111. package/dist/ui/types.d.ts +141 -0
  112. package/dist/ui/types.d.ts.map +1 -0
  113. package/dist/ui/types.js +51 -0
  114. package/dist/ui/types.js.map +1 -0
  115. package/examples/autosave-undo-demo.ts +306 -0
  116. package/examples/branching-demo-simple.ts +0 -0
  117. package/examples/branching-demo.ts +0 -0
  118. package/examples/persistence-demo.ts +84 -0
  119. package/examples/tsconfig.json +13 -0
  120. package/examples/ui-components-demo.tsx +320 -0
  121. package/examples/validation-demo-story.json +177 -0
  122. package/examples/validation-demo.js +163 -0
  123. package/package.json +24 -4
  124. package/docs/branching/PDM.md +0 -443
  125. package/docs/branching/RELEASE-v1.2.0.md +0 -169
@@ -0,0 +1,306 @@
1
+ /**
2
+ * QNCE Autosave & Undo/Redo Demo
3
+ *
4
+ * Demonstrates the Sprint 3.5 autosave and undo/redo functionality
5
+ * with interactive examples and performance metrics.
6
+ */
7
+
8
+ import { createQNCEEngine } from '../src/engine/core.js';
9
+ import { DEMO_STORY } from '../src/engine/demo-story.js';
10
+
11
+ console.log('🔄 QNCE Autosave & Undo/Redo Demo - Sprint 3.5');
12
+ console.log('='.repeat(50));
13
+
14
+ async function demonstrateUndoRedo() {
15
+ console.log('\n📝 Demonstrating Undo/Redo Functionality');
16
+ console.log('-'.repeat(40));
17
+
18
+ const engine = createQNCEEngine(DEMO_STORY);
19
+
20
+ // Configure undo/redo with detailed logging
21
+ engine.configureUndoRedo({
22
+ enabled: true,
23
+ maxUndoEntries: 10,
24
+ maxRedoEntries: 5
25
+ });
26
+
27
+ console.log('Initial state:', engine.getCurrentNode().text.substring(0, 50) + '...');
28
+ console.log('Can undo:', engine.canUndo());
29
+ console.log('Can redo:', engine.canRedo());
30
+
31
+ // Make some choices
32
+ console.log('\n🎮 Making choices...');
33
+ const choices1 = engine.getAvailableChoices();
34
+ if (choices1.length > 0) {
35
+ console.log(`Selecting: "${choices1[0].text}"`);
36
+ engine.selectChoice(choices1[0]);
37
+ console.log('New state:', engine.getCurrentNode().text.substring(0, 50) + '...');
38
+ console.log('Undo count:', engine.getUndoCount());
39
+ }
40
+
41
+ const choices2 = engine.getAvailableChoices();
42
+ if (choices2.length > 0) {
43
+ console.log(`Selecting: "${choices2[0].text}"`);
44
+ engine.selectChoice(choices2[0]);
45
+ console.log('New state:', engine.getCurrentNode().text.substring(0, 50) + '...');
46
+ console.log('Undo count:', engine.getUndoCount());
47
+ }
48
+
49
+ // Demonstrate undo
50
+ console.log('\n⏪ Testing undo...');
51
+ const undoResult1 = engine.undo();
52
+ if (undoResult1.success) {
53
+ console.log('✅ Undo successful');
54
+ console.log('Restored to:', engine.getCurrentNode().text.substring(0, 50) + '...');
55
+ console.log('Can redo:', engine.canRedo());
56
+ }
57
+
58
+ const undoResult2 = engine.undo();
59
+ if (undoResult2.success) {
60
+ console.log('✅ Second undo successful');
61
+ console.log('Restored to:', engine.getCurrentNode().text.substring(0, 50) + '...');
62
+ console.log('Undo count:', engine.getUndoCount());
63
+ console.log('Redo count:', engine.getRedoCount());
64
+ }
65
+
66
+ // Demonstrate redo
67
+ console.log('\n⏩ Testing redo...');
68
+ const redoResult = engine.redo();
69
+ if (redoResult.success) {
70
+ console.log('✅ Redo successful');
71
+ console.log('Restored to:', engine.getCurrentNode().text.substring(0, 50) + '...');
72
+ console.log('Final state - Undo:', engine.getUndoCount(), 'Redo:', engine.getRedoCount());
73
+ }
74
+
75
+ // Show history summary
76
+ const history = engine.getHistorySummary();
77
+ console.log('\n📊 History Summary:');
78
+ console.log(`- Undo entries: ${history.undoEntries.length}`);
79
+ console.log(`- Redo entries: ${history.redoEntries.length}`);
80
+
81
+ return engine;
82
+ }
83
+
84
+ async function demonstrateAutosave() {
85
+ console.log('\n💾 Demonstrating Autosave Functionality');
86
+ console.log('-'.repeat(40));
87
+
88
+ const engine = createQNCEEngine(DEMO_STORY);
89
+
90
+ // Configure autosave with custom settings
91
+ engine.configureAutosave({
92
+ enabled: true,
93
+ triggers: ['choice', 'flag-change'],
94
+ throttleMs: 50, // Very fast for demo
95
+ maxEntries: 5,
96
+ includeMetadata: true
97
+ });
98
+
99
+ console.log('Autosave configured with 50ms throttle');
100
+
101
+ // Track autosave events
102
+ let autosaveCount = 0;
103
+ const originalMethod = engine.manualAutosave.bind(engine);
104
+ engine.manualAutosave = async (metadata) => {
105
+ autosaveCount++;
106
+ console.log(`🔄 Autosave #${autosaveCount} triggered`);
107
+ return originalMethod(metadata);
108
+ };
109
+
110
+ // Make choices to trigger autosave
111
+ console.log('\n🎮 Making choices (autosave should trigger)...');
112
+
113
+ for (let i = 0; i < 3; i++) {
114
+ const choices = engine.getAvailableChoices();
115
+ if (choices.length > 0) {
116
+ console.log(`Choice ${i + 1}: "${choices[0].text}"`);
117
+ engine.selectChoice(choices[0]);
118
+ // Small delay to observe throttling
119
+ await new Promise(resolve => setTimeout(resolve, 25));
120
+ }
121
+ }
122
+
123
+ // Set some flags to trigger more autosaves
124
+ console.log('\n🏁 Setting flags (autosave should trigger)...');
125
+ engine.setFlag('demo_flag_1', true);
126
+ await new Promise(resolve => setTimeout(resolve, 60));
127
+ engine.setFlag('demo_flag_2', 'test_value');
128
+ await new Promise(resolve => setTimeout(resolve, 60));
129
+
130
+ // Manual autosave
131
+ console.log('\n💾 Triggering manual autosave...');
132
+ await engine.manualAutosave({ demo: 'manual_save' });
133
+
134
+ console.log(`\n📊 Total autosaves triggered: ${autosaveCount}`);
135
+
136
+ return engine;
137
+ }
138
+
139
+ async function demonstratePerformance() {
140
+ console.log('\n⚡ Performance Testing');
141
+ console.log('-'.repeat(40));
142
+
143
+ const engine = createQNCEEngine(DEMO_STORY);
144
+
145
+ // Configure for performance testing
146
+ engine.configureUndoRedo({
147
+ enabled: true,
148
+ maxUndoEntries: 100,
149
+ maxRedoEntries: 50
150
+ });
151
+
152
+ // Build up some history
153
+ console.log('Building up history for performance test...');
154
+ for (let i = 0; i < 20; i++) {
155
+ const choices = engine.getAvailableChoices();
156
+ if (choices.length > 0) {
157
+ engine.selectChoice(choices[0]);
158
+ }
159
+
160
+ // Set some flags
161
+ engine.setFlag(`test_flag_${i}`, i * 2);
162
+ }
163
+
164
+ console.log(`History built: ${engine.getUndoCount()} undo entries`);
165
+
166
+ // Performance test undo operations
167
+ console.log('\n⏪ Testing undo performance...');
168
+ const undoTimes: number[] = [];
169
+
170
+ for (let i = 0; i < 10; i++) {
171
+ const startTime = performance.now();
172
+ const result = engine.undo();
173
+ const endTime = performance.now();
174
+
175
+ if (result.success) {
176
+ undoTimes.push(endTime - startTime);
177
+ }
178
+ }
179
+
180
+ const avgUndoTime = undoTimes.reduce((a, b) => a + b, 0) / undoTimes.length;
181
+ const maxUndoTime = Math.max(...undoTimes);
182
+
183
+ console.log(`Average undo time: ${avgUndoTime.toFixed(3)}ms`);
184
+ console.log(`Maximum undo time: ${maxUndoTime.toFixed(3)}ms`);
185
+ console.log(`Target: <1ms ${avgUndoTime < 1 ? '✅' : '❌'}`);
186
+
187
+ // Performance test redo operations
188
+ console.log('\n⏩ Testing redo performance...');
189
+ const redoTimes: number[] = [];
190
+
191
+ for (let i = 0; i < Math.min(10, engine.getRedoCount()); i++) {
192
+ const startTime = performance.now();
193
+ const result = engine.redo();
194
+ const endTime = performance.now();
195
+
196
+ if (result.success) {
197
+ redoTimes.push(endTime - startTime);
198
+ }
199
+ }
200
+
201
+ if (redoTimes.length > 0) {
202
+ const avgRedoTime = redoTimes.reduce((a, b) => a + b, 0) / redoTimes.length;
203
+ const maxRedoTime = Math.max(...redoTimes);
204
+
205
+ console.log(`Average redo time: ${avgRedoTime.toFixed(3)}ms`);
206
+ console.log(`Maximum redo time: ${maxRedoTime.toFixed(3)}ms`);
207
+ console.log(`Target: <1ms ${avgRedoTime < 1 ? '✅' : '❌'}`);
208
+ }
209
+
210
+ // Test autosave performance
211
+ console.log('\n💾 Testing autosave performance...');
212
+ const autosaveTimes: number[] = [];
213
+
214
+ for (let i = 0; i < 5; i++) {
215
+ const startTime = performance.now();
216
+ await engine.manualAutosave({ test: `performance_${i}` });
217
+ const endTime = performance.now();
218
+
219
+ autosaveTimes.push(endTime - startTime);
220
+ }
221
+
222
+ const avgAutosaveTime = autosaveTimes.reduce((a, b) => a + b, 0) / autosaveTimes.length;
223
+ const maxAutosaveTime = Math.max(...autosaveTimes);
224
+
225
+ console.log(`Average autosave time: ${avgAutosaveTime.toFixed(3)}ms`);
226
+ console.log(`Maximum autosave time: ${maxAutosaveTime.toFixed(3)}ms`);
227
+ console.log(`Target: <1ms ${avgAutosaveTime < 1 ? '✅' : '❌'}`);
228
+ }
229
+
230
+ async function demonstrateIntegration() {
231
+ console.log('\n🔗 Integration with Existing Features');
232
+ console.log('-'.repeat(40));
233
+
234
+ const engine = createQNCEEngine(DEMO_STORY);
235
+
236
+ // Enable all features
237
+ engine.configureUndoRedo({ enabled: true, maxUndoEntries: 50, maxRedoEntries: 25 });
238
+ engine.configureAutosave({
239
+ enabled: true,
240
+ triggers: ['choice', 'flag-change', 'state-load'],
241
+ throttleMs: 100,
242
+ maxEntries: 10,
243
+ includeMetadata: true
244
+ });
245
+
246
+ console.log('✅ Undo/redo and autosave configured');
247
+
248
+ // Test with state persistence
249
+ console.log('\n💾 Testing state save/load with undo/redo...');
250
+
251
+ // Make some changes
252
+ const choices = engine.getAvailableChoices();
253
+ if (choices.length > 0) {
254
+ engine.selectChoice(choices[0]);
255
+ }
256
+ engine.setFlag('integration_test', true);
257
+
258
+ console.log(`State before save - Undo count: ${engine.getUndoCount()}`);
259
+
260
+ // Save state
261
+ const savedState = await engine.saveState();
262
+ console.log('✅ State saved successfully');
263
+
264
+ // Make more changes
265
+ const choices2 = engine.getAvailableChoices();
266
+ if (choices2.length > 0) {
267
+ engine.selectChoice(choices2[0]);
268
+ }
269
+ engine.setFlag('after_save', 'test');
270
+
271
+ console.log(`State after more changes - Undo count: ${engine.getUndoCount()}`);
272
+
273
+ // Load previous state
274
+ await engine.loadState(savedState);
275
+ console.log('✅ State loaded successfully');
276
+ console.log(`State after load - Undo count: ${engine.getUndoCount()}`);
277
+ console.log('Flags:', Object.keys(engine.getState().flags));
278
+
279
+ // Test undo after load
280
+ const undoAfterLoad = engine.undo();
281
+ console.log(`Undo after load: ${undoAfterLoad.success ? '✅ Success' : '❌ Failed'}`);
282
+ }
283
+
284
+ async function main() {
285
+ try {
286
+ await demonstrateUndoRedo();
287
+ await demonstrateAutosave();
288
+ await demonstratePerformance();
289
+ await demonstrateIntegration();
290
+
291
+ console.log('\n🎉 Demo completed successfully!');
292
+ console.log('\nSprint 3.5 Features Demonstrated:');
293
+ console.log('✅ Undo/Redo with configurable history limits');
294
+ console.log('✅ Autosave with throttling and event triggers');
295
+ console.log('✅ Sub-millisecond performance for operations');
296
+ console.log('✅ Integration with existing state persistence');
297
+ console.log('✅ Memory-efficient history management');
298
+
299
+ } catch (error) {
300
+ console.error('❌ Demo failed:', error);
301
+ process.exit(1);
302
+ }
303
+ }
304
+
305
+ // Run the demo
306
+ main();
File without changes
File without changes
@@ -0,0 +1,84 @@
1
+ import { createQNCEEngine, DEMO_STORY } from '../src';
2
+ import { Checkpoint } from '../src/engine/types';
3
+
4
+ /**
5
+ * Demonstrates the state persistence and checkpoint features of the QNCE Engine.
6
+ * This example covers:
7
+ * 1. Saving the complete narrative state.
8
+ * 2. Loading that state into a new engine instance.
9
+ * 3. Creating lightweight checkpoints for undo/redo functionality.
10
+ * 4. Restoring the state from a checkpoint.
11
+ */
12
+ async function runPersistenceDemo() {
13
+ console.log('🚀 Starting QNCE Engine Persistence Demo 🚀\n');
14
+
15
+ // 1. Initialize the engine and advance the story
16
+ const engine = createQNCEEngine(DEMO_STORY);
17
+ console.log('Initial Node:', engine.getCurrentNode().text);
18
+
19
+ let choices = engine.getAvailableChoices();
20
+ engine.selectChoice(choices[1]); // Choose "Examine the shimmering portal."
21
+ console.log('\nChoice Made. Current Node:', engine.getCurrentNode().text);
22
+
23
+ choices = engine.getAvailableChoices();
24
+ engine.selectChoice(choices[0]); // Choose "Step through the portal."
25
+ console.log('Choice Made. Current Node:', engine.getCurrentNode().text);
26
+ console.log('Current Flags:', engine.getFlags());
27
+
28
+ // 2. Create a checkpoint before making another choice
29
+ console.log('\n💾 Creating a checkpoint...');
30
+ const checkpoint = await engine.createCheckpoint('Before the final choice');
31
+ console.log(`Checkpoint '${checkpoint.name}' created with ID: ${checkpoint.id}`);
32
+
33
+ // 3. Save the complete engine state to a string
34
+ console.log('\n💾 Saving engine state to JSON...');
35
+ const savedState = await engine.saveState({ prettyPrint: true });
36
+ const savedStateJSON = JSON.stringify(savedState);
37
+ console.log('State saved successfully! Size:', savedStateJSON.length, 'bytes');
38
+ // In a real application, you would store this JSON string in localStorage,
39
+ // a file, or a remote database.
40
+
41
+ // 4. Continue the story
42
+ choices = engine.getAvailableChoices();
43
+ engine.selectChoice(choices[0]);
44
+ console.log('\nMade one more choice. Current Node:', engine.getCurrentNode().text);
45
+ console.log('Final Flags:', engine.getFlags());
46
+
47
+
48
+ // 5. Restore from the checkpoint to "undo" the last choice
49
+ console.log(`\n🔄 Restoring from checkpoint '${checkpoint.name}'...`);
50
+ await engine.restoreFromCheckpoint(checkpoint.id);
51
+ console.log('State restored from checkpoint!');
52
+ console.log('Current Node after restore:', engine.getCurrentNode().text);
53
+ console.log('Flags after restore:', engine.getFlags());
54
+
55
+
56
+ // 6. Create a new engine instance and load the saved state
57
+ console.log('\n🔄 Creating a new engine and loading the saved state...');
58
+ const newEngine = createQNCEEngine(DEMO_STORY);
59
+
60
+ // The state can be loaded from a JSON string or a parsed object
61
+ await newEngine.loadState(savedState);
62
+ console.log('State loaded into new engine instance!');
63
+
64
+ // 7. Verify that the state was restored correctly
65
+ console.log('\n🔍 Verifying restored state...');
66
+ console.log('Restored Node:', newEngine.getCurrentNode().text);
67
+ console.log('Restored Flags:', newEngine.getFlags());
68
+ console.log(
69
+ 'History length:',
70
+ newEngine.getHistory().length,
71
+ '| Expected:',
72
+ 2
73
+ );
74
+
75
+ const areFlagsEqual = JSON.stringify(engine.getFlags()) === JSON.stringify(newEngine.getFlags());
76
+ console.log('Verification successful:', areFlagsEqual);
77
+
78
+
79
+ console.log('\n✅ Persistence Demo Completed Successfully! ✅');
80
+ }
81
+
82
+ runPersistenceDemo().catch(error => {
83
+ console.error('An error occurred during the persistence demo:', error);
84
+ });
@@ -0,0 +1,13 @@
1
+ {
2
+ "extends": "../tsconfig.json",
3
+ "compilerOptions": {
4
+ "jsx": "react-jsx",
5
+ "esModuleInterop": true,
6
+ "allowSyntheticDefaultImports": true,
7
+ "noEmit": true
8
+ },
9
+ "include": [
10
+ "./**/*",
11
+ "../src/**/*"
12
+ ]
13
+ }