@fluidframework/map 2.0.0-rc.1.0.6 → 2.0.0-rc.2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{.eslintrc.js → .eslintrc.cjs} +10 -1
- package/{.mocharc.js → .mocharc.cjs} +1 -1
- package/CHANGELOG.md +11 -0
- package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -1
- package/api-extractor-lint.json +1 -1
- package/api-extractor.json +1 -1
- package/api-report/map.api.md +14 -57
- package/dist/directory.d.ts +10 -50
- package/dist/directory.d.ts.map +1 -1
- package/dist/directory.js +76 -164
- package/dist/directory.js.map +1 -1
- package/dist/index.d.ts +45 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +43 -8
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/internalInterfaces.d.ts +2 -2
- package/dist/internalInterfaces.d.ts.map +1 -1
- package/dist/internalInterfaces.js.map +1 -1
- package/dist/localValues.d.ts +3 -5
- package/dist/localValues.d.ts.map +1 -1
- package/dist/localValues.js +9 -8
- package/dist/localValues.js.map +1 -1
- package/dist/map-alpha.d.ts +31 -116
- package/dist/map-beta.d.ts +24 -105
- package/dist/map-public.d.ts +24 -105
- package/dist/map-untrimmed.d.ts +31 -116
- package/dist/map.d.ts +4 -23
- package/dist/map.d.ts.map +1 -1
- package/dist/map.js +6 -29
- package/dist/map.js.map +1 -1
- package/dist/mapKernel.d.ts +3 -4
- package/dist/mapKernel.d.ts.map +1 -1
- package/dist/mapKernel.js +30 -35
- package/dist/mapKernel.js.map +1 -1
- package/dist/package.json +3 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/lib/{directory.d.mts → directory.d.ts} +11 -51
- package/lib/directory.d.ts.map +1 -0
- package/lib/{directory.mjs → directory.js} +77 -165
- package/lib/directory.js.map +1 -0
- package/lib/index.d.ts +61 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +55 -0
- package/lib/index.js.map +1 -0
- package/lib/{interfaces.d.mts → interfaces.d.ts} +1 -1
- package/lib/interfaces.d.ts.map +1 -0
- package/lib/{interfaces.mjs → interfaces.js} +1 -1
- package/lib/interfaces.js.map +1 -0
- package/lib/{internalInterfaces.d.mts → internalInterfaces.d.ts} +3 -3
- package/lib/internalInterfaces.d.ts.map +1 -0
- package/lib/{internalInterfaces.mjs → internalInterfaces.js} +1 -1
- package/lib/internalInterfaces.js.map +1 -0
- package/lib/{localValues.d.mts → localValues.d.ts} +4 -6
- package/lib/localValues.d.ts.map +1 -0
- package/lib/{localValues.mjs → localValues.js} +10 -9
- package/lib/localValues.js.map +1 -0
- package/lib/{map-alpha.d.mts → map-alpha.d.ts} +43 -116
- package/lib/{map-beta.d.mts → map-beta.d.ts} +36 -105
- package/lib/{map-public.d.mts → map-public.d.ts} +36 -105
- package/lib/{map-untrimmed.d.mts → map-untrimmed.d.ts} +43 -116
- package/lib/{map.d.mts → map.d.ts} +5 -24
- package/lib/map.d.ts.map +1 -0
- package/lib/{map.mjs → map.js} +5 -28
- package/lib/map.js.map +1 -0
- package/lib/{mapKernel.d.mts → mapKernel.d.ts} +4 -5
- package/lib/mapKernel.d.ts.map +1 -0
- package/lib/{mapKernel.mjs → mapKernel.js} +32 -37
- package/lib/mapKernel.js.map +1 -0
- package/lib/{packageVersion.d.mts → packageVersion.d.ts} +2 -2
- package/lib/packageVersion.d.ts.map +1 -0
- package/lib/{packageVersion.mjs → packageVersion.js} +2 -2
- package/lib/packageVersion.js.map +1 -0
- package/lib/test/memory/directory.spec.js +71 -0
- package/lib/test/memory/directory.spec.js.map +1 -0
- package/lib/test/memory/map.spec.js +71 -0
- package/lib/test/memory/map.spec.js.map +1 -0
- package/lib/test/mocha/directory.order.spec.js +422 -0
- package/lib/test/mocha/directory.order.spec.js.map +1 -0
- package/lib/test/mocha/directory.snapshot.spec.js +111 -0
- package/lib/test/mocha/directory.snapshot.spec.js.map +1 -0
- package/lib/test/mocha/directory.spec.js +1406 -0
- package/lib/test/mocha/directory.spec.js.map +1 -0
- package/lib/test/mocha/directoryEquivalenceUtils.js +36 -0
- package/lib/test/mocha/directoryEquivalenceUtils.js.map +1 -0
- package/lib/test/mocha/directoryFuzzTests.spec.js +337 -0
- package/lib/test/mocha/directoryFuzzTests.spec.js.map +1 -0
- package/lib/test/mocha/dirname.cjs +16 -0
- package/lib/test/mocha/dirname.cjs.map +1 -0
- package/lib/test/mocha/map.fuzz.spec.js +114 -0
- package/lib/test/mocha/map.fuzz.spec.js.map +1 -0
- package/lib/test/mocha/map.spec.js +685 -0
- package/lib/test/mocha/map.spec.js.map +1 -0
- package/lib/test/mocha/rebasing.spec.js +158 -0
- package/lib/test/mocha/rebasing.spec.js.map +1 -0
- package/lib/test/mocha/reconnection.spec.js +327 -0
- package/lib/test/mocha/reconnection.spec.js.map +1 -0
- package/lib/test/types/validateMapPrevious.generated.js +66 -0
- package/lib/test/types/validateMapPrevious.generated.js.map +1 -0
- package/package.json +55 -52
- package/src/directory.ts +122 -217
- package/src/index.ts +57 -4
- package/src/interfaces.ts +2 -2
- package/src/internalInterfaces.ts +2 -2
- package/src/localValues.ts +14 -9
- package/src/map.ts +7 -32
- package/src/mapKernel.ts +40 -42
- package/src/packageVersion.ts +1 -1
- package/tsconfig.cjs.json +7 -0
- package/tsconfig.json +2 -5
- package/lib/directory.d.mts.map +0 -1
- package/lib/directory.mjs.map +0 -1
- package/lib/index.d.mts +0 -9
- package/lib/index.d.mts.map +0 -1
- package/lib/index.mjs +0 -8
- package/lib/index.mjs.map +0 -1
- package/lib/interfaces.d.mts.map +0 -1
- package/lib/interfaces.mjs.map +0 -1
- package/lib/internalInterfaces.d.mts.map +0 -1
- package/lib/internalInterfaces.mjs.map +0 -1
- package/lib/localValues.d.mts.map +0 -1
- package/lib/localValues.mjs.map +0 -1
- package/lib/map.d.mts.map +0 -1
- package/lib/map.mjs.map +0 -1
- package/lib/mapKernel.d.mts.map +0 -1
- package/lib/mapKernel.mjs.map +0 -1
- package/lib/packageVersion.d.mts.map +0 -1
- package/lib/packageVersion.mjs.map +0 -1
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { strict as assert } from "node:assert";
|
|
6
|
+
import { MockFluidDataStoreRuntime, MockContainerRuntimeFactoryForReconnection, MockStorage, } from "@fluidframework/test-runtime-utils";
|
|
7
|
+
import { DirectoryFactory, SharedDirectory } from "../../directory.js";
|
|
8
|
+
import { MapFactory, SharedMap } from "../../map.js";
|
|
9
|
+
import { assertEquivalentDirectories } from "./directoryEquivalenceUtils.js";
|
|
10
|
+
describe("Reconnection", () => {
|
|
11
|
+
describe("SharedMap", () => {
|
|
12
|
+
let containerRuntimeFactory;
|
|
13
|
+
let containerRuntime1;
|
|
14
|
+
let containerRuntime2;
|
|
15
|
+
let map1;
|
|
16
|
+
let map2;
|
|
17
|
+
beforeEach("createMaps", async () => {
|
|
18
|
+
containerRuntimeFactory = new MockContainerRuntimeFactoryForReconnection();
|
|
19
|
+
// Create the first SharedMap.
|
|
20
|
+
const dataStoreRuntime1 = new MockFluidDataStoreRuntime();
|
|
21
|
+
containerRuntime1 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime1);
|
|
22
|
+
const services1 = {
|
|
23
|
+
deltaConnection: dataStoreRuntime1.createDeltaConnection(),
|
|
24
|
+
objectStorage: new MockStorage(),
|
|
25
|
+
};
|
|
26
|
+
map1 = new SharedMap("shared-map-1", dataStoreRuntime1, MapFactory.Attributes);
|
|
27
|
+
map1.connect(services1);
|
|
28
|
+
// Create the second SharedMap.
|
|
29
|
+
const dataStoreRuntime2 = new MockFluidDataStoreRuntime();
|
|
30
|
+
containerRuntime2 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);
|
|
31
|
+
const services2 = {
|
|
32
|
+
deltaConnection: dataStoreRuntime2.createDeltaConnection(),
|
|
33
|
+
objectStorage: new MockStorage(),
|
|
34
|
+
};
|
|
35
|
+
map2 = new SharedMap("shared-map-2", dataStoreRuntime2, MapFactory.Attributes);
|
|
36
|
+
map2.connect(services2);
|
|
37
|
+
});
|
|
38
|
+
it("can resend unacked ops on reconnection", async () => {
|
|
39
|
+
const key = "testKey";
|
|
40
|
+
const value = "testValue";
|
|
41
|
+
// Set a value on the first SharedMap.
|
|
42
|
+
map1.set(key, value);
|
|
43
|
+
// Disconnect and reconnect the first client.
|
|
44
|
+
containerRuntime1.connected = false;
|
|
45
|
+
containerRuntime1.connected = true;
|
|
46
|
+
// Process the messages.
|
|
47
|
+
containerRuntimeFactory.processAllMessages();
|
|
48
|
+
// Verify that the set value is processed by both clients.
|
|
49
|
+
assert.equal(map1.get(key), value, "The local client did not process the set");
|
|
50
|
+
assert.equal(map2.get(key), value, "The remote client did not process the set");
|
|
51
|
+
// Delete the value from the second SharedMap.
|
|
52
|
+
map2.delete(key);
|
|
53
|
+
// Disconnect and reconnect the second client.
|
|
54
|
+
containerRuntime2.connected = false;
|
|
55
|
+
containerRuntime2.connected = true;
|
|
56
|
+
// Process the messages.
|
|
57
|
+
containerRuntimeFactory.processAllMessages();
|
|
58
|
+
// Verify that the deleted value is processed by both clients.
|
|
59
|
+
assert.equal(map1.get(key), undefined, "The local client did not process the delete");
|
|
60
|
+
assert.equal(map2.get(key), undefined, "The remote client did not process the delete");
|
|
61
|
+
});
|
|
62
|
+
it("can store ops in disconnected state and resend them on reconnection", async () => {
|
|
63
|
+
const key = "testKey";
|
|
64
|
+
const value = "testValue";
|
|
65
|
+
// Disconnect the first client.
|
|
66
|
+
containerRuntime1.connected = false;
|
|
67
|
+
// Set a value on the first SharedMap.
|
|
68
|
+
map1.set(key, value);
|
|
69
|
+
// Reconnect the first client.
|
|
70
|
+
containerRuntime1.connected = true;
|
|
71
|
+
// Process the messages.
|
|
72
|
+
containerRuntimeFactory.processAllMessages();
|
|
73
|
+
// Verify that the set value is processed by both clients.
|
|
74
|
+
assert.equal(map1.get(key), value, "The local client did not process the set");
|
|
75
|
+
assert.equal(map2.get(key), value, "The remote client did not process the set");
|
|
76
|
+
// Disconnect the second client.
|
|
77
|
+
containerRuntime2.connected = false;
|
|
78
|
+
// Delete the value from the second SharedMap.
|
|
79
|
+
map2.delete(key);
|
|
80
|
+
// Reconnect the second client.
|
|
81
|
+
containerRuntime2.connected = true;
|
|
82
|
+
// Process the messages.
|
|
83
|
+
containerRuntimeFactory.processAllMessages();
|
|
84
|
+
// Verify that the deleted value is processed by both clients.
|
|
85
|
+
assert.equal(map1.get(key), undefined, "The local client did not process the delete");
|
|
86
|
+
assert.equal(map2.get(key), undefined, "The remote client did not process the delete");
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe("SharedDirectory", () => {
|
|
90
|
+
let containerRuntimeFactory;
|
|
91
|
+
let containerRuntime1;
|
|
92
|
+
let containerRuntime2;
|
|
93
|
+
let directory1;
|
|
94
|
+
let directory2;
|
|
95
|
+
beforeEach("createDirectories", async () => {
|
|
96
|
+
containerRuntimeFactory = new MockContainerRuntimeFactoryForReconnection();
|
|
97
|
+
// Create the first SharedDirectory.
|
|
98
|
+
const dataStoreRuntime1 = new MockFluidDataStoreRuntime();
|
|
99
|
+
containerRuntime1 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime1);
|
|
100
|
+
const services1 = {
|
|
101
|
+
deltaConnection: dataStoreRuntime1.createDeltaConnection(),
|
|
102
|
+
objectStorage: new MockStorage(),
|
|
103
|
+
};
|
|
104
|
+
directory1 = new SharedDirectory("shared-directory-1", dataStoreRuntime1, DirectoryFactory.Attributes);
|
|
105
|
+
directory1.connect(services1);
|
|
106
|
+
// Create the second SharedDirectory.
|
|
107
|
+
const dataStoreRuntime2 = new MockFluidDataStoreRuntime();
|
|
108
|
+
containerRuntime2 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);
|
|
109
|
+
const services2 = {
|
|
110
|
+
deltaConnection: dataStoreRuntime2.createDeltaConnection(),
|
|
111
|
+
objectStorage: new MockStorage(),
|
|
112
|
+
};
|
|
113
|
+
directory2 = new SharedDirectory("shared-directory-2", dataStoreRuntime2, DirectoryFactory.Attributes);
|
|
114
|
+
directory2.connect(services2);
|
|
115
|
+
});
|
|
116
|
+
it("can resend unacked ops on reconnection", async () => {
|
|
117
|
+
const key = "testKey";
|
|
118
|
+
const value = "testValue";
|
|
119
|
+
const subDirName = "subDir";
|
|
120
|
+
const subDirKey = "testSubDirKey";
|
|
121
|
+
const subDirValue = "testSubDirValue";
|
|
122
|
+
// Set a value on the first SharedDirectory.
|
|
123
|
+
directory1.set(key, value);
|
|
124
|
+
// Create a subdirectory and set a value on it.
|
|
125
|
+
const subDir = directory1.createSubDirectory(subDirName);
|
|
126
|
+
subDir.set(subDirKey, subDirValue);
|
|
127
|
+
// Disconnect and reconnect the first client.
|
|
128
|
+
containerRuntime1.connected = false;
|
|
129
|
+
containerRuntime1.connected = true;
|
|
130
|
+
// Process the messages.
|
|
131
|
+
containerRuntimeFactory.processAllMessages();
|
|
132
|
+
// Verify that the ops are processed by both clients.
|
|
133
|
+
assert.equal(directory1.get(key), value, "The local client did not process the set");
|
|
134
|
+
assert.equal(directory2.get(key), value, "The remote client did not process the set");
|
|
135
|
+
const subDir1 = directory1.getSubDirectory(subDirName);
|
|
136
|
+
assert.ok(subDir1);
|
|
137
|
+
assert.equal(subDir1.get(subDirKey), subDirValue);
|
|
138
|
+
const subDir2 = directory2.getSubDirectory(subDirName);
|
|
139
|
+
assert.ok(subDir2);
|
|
140
|
+
assert.equal(subDir2.get(subDirKey), subDirValue);
|
|
141
|
+
// Delete the sub directory from the second SharedDirectory.
|
|
142
|
+
directory2.deleteSubDirectory(subDirName);
|
|
143
|
+
// Disconnect and reconnect the second client.
|
|
144
|
+
containerRuntime2.connected = false;
|
|
145
|
+
containerRuntime2.connected = true;
|
|
146
|
+
// Process the messages.
|
|
147
|
+
containerRuntimeFactory.processAllMessages();
|
|
148
|
+
// Verify that the delete is processed by both clients.
|
|
149
|
+
assert.equal(directory1.getSubDirectory(subDirName), undefined, "The local client did not delete sub directory");
|
|
150
|
+
assert.equal(directory2.getSubDirectory(subDirName), undefined, "The remote client did not delete sub directory");
|
|
151
|
+
});
|
|
152
|
+
it("can store ops in disconnected state and resend them on reconnection", async () => {
|
|
153
|
+
const key = "testKey";
|
|
154
|
+
const value = "testValue";
|
|
155
|
+
const subDirName = "subDir";
|
|
156
|
+
const subDirKey = "testSubDirKey";
|
|
157
|
+
const subDirValue = "testSubDirValue";
|
|
158
|
+
// Disconnect the first client.
|
|
159
|
+
containerRuntime1.connected = false;
|
|
160
|
+
// Set a value on the first SharedDirectory.
|
|
161
|
+
directory1.set(key, value);
|
|
162
|
+
// Create a subdirectory and set a value on it.
|
|
163
|
+
const subDir = directory1.createSubDirectory(subDirName);
|
|
164
|
+
subDir.set(subDirKey, subDirValue);
|
|
165
|
+
// Reconnect the first client.
|
|
166
|
+
containerRuntime1.connected = true;
|
|
167
|
+
// Process the messages.
|
|
168
|
+
containerRuntimeFactory.processAllMessages();
|
|
169
|
+
// Verify that the ops are processed by both clients.
|
|
170
|
+
assert.equal(directory1.get(key), value, "The local client did not process the set");
|
|
171
|
+
assert.equal(directory2.get(key), value, "The remote client did not process the set");
|
|
172
|
+
const subDir1 = directory1.getSubDirectory(subDirName);
|
|
173
|
+
assert.ok(subDir1);
|
|
174
|
+
assert.equal(subDir1.get(subDirKey), subDirValue);
|
|
175
|
+
const subDir2 = directory2.getSubDirectory(subDirName);
|
|
176
|
+
assert.ok(subDir2);
|
|
177
|
+
assert.equal(subDir2.get(subDirKey), subDirValue);
|
|
178
|
+
// Disconnect the second client.
|
|
179
|
+
containerRuntime2.connected = false;
|
|
180
|
+
// Delete the sub directory from the second SharedDirectory.
|
|
181
|
+
directory2.deleteSubDirectory(subDirName);
|
|
182
|
+
// Reconnect the second client.
|
|
183
|
+
containerRuntime2.connected = true;
|
|
184
|
+
// Process the messages.
|
|
185
|
+
containerRuntimeFactory.processAllMessages();
|
|
186
|
+
// Verify that the delete is processed by both clients.
|
|
187
|
+
assert.equal(directory1.getSubDirectory(subDirName), undefined, "The local client did not delete sub directory");
|
|
188
|
+
assert.equal(directory2.getSubDirectory(subDirName), undefined, "The remote client did not delete sub directory");
|
|
189
|
+
});
|
|
190
|
+
it("avoids resending createSubDirectory ops on recreated directories", async () => {
|
|
191
|
+
const subDirName = "subDir";
|
|
192
|
+
const subDir1 = directory1.createSubDirectory(subDirName);
|
|
193
|
+
containerRuntimeFactory.processAllMessages();
|
|
194
|
+
// This op will not be submitted first as we are going to disconnect the client.
|
|
195
|
+
subDir1.createSubDirectory(subDirName);
|
|
196
|
+
containerRuntime1.connected = false;
|
|
197
|
+
directory2.deleteSubDirectory(subDirName);
|
|
198
|
+
directory2.createSubDirectory(subDirName);
|
|
199
|
+
containerRuntimeFactory.processAllMessages();
|
|
200
|
+
// Now client1 reconnects causing it to delete the /subDir, so that the create /subDir/subDir will not be submitted
|
|
201
|
+
containerRuntime1.connected = true;
|
|
202
|
+
containerRuntimeFactory.processAllMessages();
|
|
203
|
+
assert(directory1.getSubDirectory(subDirName) !== undefined, "/subDir should exist");
|
|
204
|
+
assert(directory1.getSubDirectory(subDirName)?.getSubDirectory(subDirName) === undefined, "/subDir/subDir should not exist");
|
|
205
|
+
assertEquivalentDirectories(directory1, directory2);
|
|
206
|
+
});
|
|
207
|
+
it("avoids sending setValue ops on recreated directories", async () => {
|
|
208
|
+
const subDirName = "subDir";
|
|
209
|
+
const subDirKey = "testSubDirKey";
|
|
210
|
+
const subDirValue = "testSubDirValue";
|
|
211
|
+
const subDir1 = directory1.createSubDirectory(subDirName);
|
|
212
|
+
containerRuntimeFactory.processAllMessages();
|
|
213
|
+
// This op will not be submitted first as we are going to disconnect the client.
|
|
214
|
+
subDir1.set(subDirKey, subDirValue);
|
|
215
|
+
containerRuntime1.connected = false;
|
|
216
|
+
directory2.deleteSubDirectory(subDirName);
|
|
217
|
+
directory2.createSubDirectory(subDirName);
|
|
218
|
+
containerRuntimeFactory.processAllMessages();
|
|
219
|
+
// Now client1 reconnects causing it to delete the /subDir, so that the set /subDir/testSubDirKey will not be submitted.
|
|
220
|
+
containerRuntime1.connected = true;
|
|
221
|
+
containerRuntimeFactory.processAllMessages();
|
|
222
|
+
assert(directory1.getSubDirectory(subDirName) !== undefined, "/subDir should exist");
|
|
223
|
+
assert(directory1.getSubDirectory(subDirName)?.get(subDirKey) === undefined, "/subDir(testSubDirKey) should not exist");
|
|
224
|
+
assertEquivalentDirectories(directory1, directory2);
|
|
225
|
+
});
|
|
226
|
+
it("does not delete pending create subDirs on reconnection", async () => {
|
|
227
|
+
const subDirName1 = "subDir";
|
|
228
|
+
const subDirName2 = "subDir2";
|
|
229
|
+
containerRuntime1.connected = false;
|
|
230
|
+
// These ops will not be sent initially as we are in disconnected state.
|
|
231
|
+
const subDir = directory1.createSubDirectory(subDirName1);
|
|
232
|
+
subDir.createSubDirectory(subDirName1);
|
|
233
|
+
const subDir1 = directory2.createSubDirectory(subDirName1);
|
|
234
|
+
subDir1.createSubDirectory(subDirName2);
|
|
235
|
+
// /subDir deleted by other connected client.
|
|
236
|
+
directory2.deleteSubDirectory(subDirName1);
|
|
237
|
+
containerRuntimeFactory.processAllMessages();
|
|
238
|
+
containerRuntime1.connected = true;
|
|
239
|
+
// When op for deleting /subDir comes, it will not delete subdirectories who are created locally and
|
|
240
|
+
// ack is pending as they will recreated again. Both directories will contain /subDir/subDir but
|
|
241
|
+
// no /subDir/subDir2.
|
|
242
|
+
containerRuntimeFactory.processAllMessages();
|
|
243
|
+
assert(directory1.getSubDirectory(subDirName1) !== undefined, "/subDir should exist");
|
|
244
|
+
assert(directory1.getSubDirectory(subDirName1)?.getSubDirectory(subDirName1) !== undefined, "/subDir/subDir should exist");
|
|
245
|
+
assert(directory1.getSubDirectory(subDirName1)?.getSubDirectory(subDirName2) === undefined, "/subDir/subDir2 should not exist");
|
|
246
|
+
assertEquivalentDirectories(directory1, directory2);
|
|
247
|
+
});
|
|
248
|
+
it("does not delete pending keys within pending subDirs on reconnection", async () => {
|
|
249
|
+
const subDirName = "subDir";
|
|
250
|
+
const subDirKey = "testSubDirKey";
|
|
251
|
+
const subDirValue = "testSubDirValue";
|
|
252
|
+
containerRuntime1.connected = false;
|
|
253
|
+
const subDir = directory1.createSubDirectory(subDirName);
|
|
254
|
+
const subDir2 = subDir.createSubDirectory(subDirName);
|
|
255
|
+
subDir2.set(subDirKey, subDirValue);
|
|
256
|
+
directory2.createSubDirectory(subDirName);
|
|
257
|
+
directory2.deleteSubDirectory(subDirName);
|
|
258
|
+
containerRuntimeFactory.processAllMessages();
|
|
259
|
+
containerRuntime1.connected = true;
|
|
260
|
+
// When op for deleting /subDir comes, it will not delete subdirectories who are created locally and
|
|
261
|
+
// ack is pending as they will recreated again. Both directories will contain /subDir/subDir but
|
|
262
|
+
// no /subDir/subDir2. It will also not delete pending keys in pending subDirs.
|
|
263
|
+
containerRuntimeFactory.processAllMessages();
|
|
264
|
+
assert(directory1.getSubDirectory(subDirName) !== undefined, "/subDir should exist");
|
|
265
|
+
assert(directory1.getSubDirectory(subDirName)?.getSubDirectory(subDirName) !== undefined, "/subDir/subDir should exist");
|
|
266
|
+
assert(directory1
|
|
267
|
+
.getSubDirectory(subDirName)
|
|
268
|
+
?.getSubDirectory(subDirName)
|
|
269
|
+
?.get(subDirKey) === subDirValue, "/subDir/subDir(subDirKey) should exist");
|
|
270
|
+
assertEquivalentDirectories(directory1, directory2);
|
|
271
|
+
});
|
|
272
|
+
it("multiple create/delete subDirs on disconnection/reconnection 1", async () => {
|
|
273
|
+
const subDirName1 = "subDir";
|
|
274
|
+
const subDir = directory1.createSubDirectory(subDirName1);
|
|
275
|
+
containerRuntimeFactory.processAllMessages();
|
|
276
|
+
containerRuntime1.connected = false;
|
|
277
|
+
// These ops will not be sent initially as we are in disconnected state.
|
|
278
|
+
subDir.createSubDirectory(subDirName1);
|
|
279
|
+
subDir.deleteSubDirectory(subDirName1);
|
|
280
|
+
subDir.createSubDirectory(subDirName1);
|
|
281
|
+
subDir.deleteSubDirectory(subDirName1);
|
|
282
|
+
subDir.createSubDirectory(subDirName1);
|
|
283
|
+
containerRuntimeFactory.processAllMessages();
|
|
284
|
+
containerRuntime1.connected = true;
|
|
285
|
+
// /subDir/subDir should exist in the end
|
|
286
|
+
containerRuntimeFactory.processAllMessages();
|
|
287
|
+
assert(directory1.getSubDirectory(subDirName1) !== undefined, "/subDir should exist");
|
|
288
|
+
assert(directory1.getSubDirectory(subDirName1)?.getSubDirectory(subDirName1) !== undefined, "/subDir/subDir should exist");
|
|
289
|
+
assertEquivalentDirectories(directory1, directory2);
|
|
290
|
+
});
|
|
291
|
+
it("multiple create/delete subDirs on disconnection/reconnection 2", async () => {
|
|
292
|
+
const subDirName1 = "subDir";
|
|
293
|
+
containerRuntime1.connected = false;
|
|
294
|
+
// These ops will not be sent initially as we are in disconnected state.
|
|
295
|
+
const subDir = directory1.createSubDirectory(subDirName1);
|
|
296
|
+
subDir.createSubDirectory(subDirName1);
|
|
297
|
+
subDir.deleteSubDirectory(subDirName1);
|
|
298
|
+
subDir.createSubDirectory(subDirName1);
|
|
299
|
+
directory1.deleteSubDirectory(subDirName1);
|
|
300
|
+
directory1.createSubDirectory(subDirName1);
|
|
301
|
+
containerRuntimeFactory.processAllMessages();
|
|
302
|
+
containerRuntime1.connected = true;
|
|
303
|
+
// /subDir/subDir should not exist in the end as /subDir was deleted after it was created
|
|
304
|
+
containerRuntimeFactory.processAllMessages();
|
|
305
|
+
assert(directory1.getSubDirectory(subDirName1) !== undefined, "/subDir should exist");
|
|
306
|
+
assert(directory1.getSubDirectory(subDirName1)?.getSubDirectory(subDirName1) === undefined, "/subDir/subDir should not exist");
|
|
307
|
+
assertEquivalentDirectories(directory1, directory2);
|
|
308
|
+
});
|
|
309
|
+
it("multiple create/delete subDirs on disconnection/reconnection 3", async () => {
|
|
310
|
+
const subDirName1 = "subDir";
|
|
311
|
+
containerRuntime1.connected = false;
|
|
312
|
+
// These ops will not be sent initially as we are in disconnected state.
|
|
313
|
+
const subDir = directory1.createSubDirectory(subDirName1);
|
|
314
|
+
subDir.createSubDirectory(subDirName1);
|
|
315
|
+
directory1.deleteSubDirectory(subDirName1);
|
|
316
|
+
directory1.createSubDirectory(subDirName1);
|
|
317
|
+
containerRuntimeFactory.processAllMessages();
|
|
318
|
+
containerRuntime1.connected = true;
|
|
319
|
+
// /subDir/subDir should not exist in the end as /subDir was deleted after it was created
|
|
320
|
+
containerRuntimeFactory.processAllMessages();
|
|
321
|
+
assert(directory1.getSubDirectory(subDirName1) !== undefined, "/subDir should exist");
|
|
322
|
+
assert(directory1.getSubDirectory(subDirName1)?.getSubDirectory(subDirName1) === undefined, "/subDir/subDir should not exist");
|
|
323
|
+
assertEquivalentDirectories(directory1, directory2);
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
//# sourceMappingURL=reconnection.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconnection.spec.js","sourceRoot":"","sources":["../../../src/test/mocha/reconnection.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EACN,yBAAyB,EACzB,0CAA0C,EAE1C,WAAW,GACX,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAE7E,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC7B,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QAC1B,IAAI,uBAAmE,CAAC;QACxE,IAAI,iBAAsD,CAAC;QAC3D,IAAI,iBAAsD,CAAC;QAC3D,IAAI,IAAe,CAAC;QACpB,IAAI,IAAe,CAAC;QAEpB,UAAU,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;YACnC,uBAAuB,GAAG,IAAI,0CAA0C,EAAE,CAAC;YAE3E,8BAA8B;YAC9B,MAAM,iBAAiB,GAAG,IAAI,yBAAyB,EAAE,CAAC;YAC1D,iBAAiB,GAAG,uBAAuB,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;YACtF,MAAM,SAAS,GAAG;gBACjB,eAAe,EAAE,iBAAiB,CAAC,qBAAqB,EAAE;gBAC1D,aAAa,EAAE,IAAI,WAAW,EAAE;aAChC,CAAC;YACF,IAAI,GAAG,IAAI,SAAS,CAAC,cAAc,EAAE,iBAAiB,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;YAC/E,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAExB,+BAA+B;YAC/B,MAAM,iBAAiB,GAAG,IAAI,yBAAyB,EAAE,CAAC;YAC1D,iBAAiB,GAAG,uBAAuB,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;YACtF,MAAM,SAAS,GAAG;gBACjB,eAAe,EAAE,iBAAiB,CAAC,qBAAqB,EAAE;gBAC1D,aAAa,EAAE,IAAI,WAAW,EAAE;aAChC,CAAC;YACF,IAAI,GAAG,IAAI,SAAS,CAAC,cAAc,EAAE,iBAAiB,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;YAC/E,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,GAAG,GAAG,SAAS,CAAC;YACtB,MAAM,KAAK,GAAG,WAAW,CAAC;YAE1B,sCAAsC;YACtC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAErB,6CAA6C;YAC7C,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;YACpC,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;YAEnC,wBAAwB;YACxB,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,0DAA0D;YAC1D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,0CAA0C,CAAC,CAAC;YAC/E,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,2CAA2C,CAAC,CAAC;YAEhF,8CAA8C;YAC9C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAEjB,8CAA8C;YAC9C,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;YACpC,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;YAEnC,wBAAwB;YACxB,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,8DAA8D;YAC9D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,6CAA6C,CAAC,CAAC;YACtF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,8CAA8C,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACpF,MAAM,GAAG,GAAG,SAAS,CAAC;YACtB,MAAM,KAAK,GAAG,WAAW,CAAC;YAE1B,+BAA+B;YAC/B,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;YAEpC,sCAAsC;YACtC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAErB,8BAA8B;YAC9B,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;YAEnC,wBAAwB;YACxB,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,0DAA0D;YAC1D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,0CAA0C,CAAC,CAAC;YAC/E,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,2CAA2C,CAAC,CAAC;YAEhF,gCAAgC;YAChC,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;YAEpC,8CAA8C;YAC9C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAEjB,+BAA+B;YAC/B,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;YAEnC,wBAAwB;YACxB,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,8DAA8D;YAC9D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,6CAA6C,CAAC,CAAC;YACtF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,8CAA8C,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAChC,IAAI,uBAAmE,CAAC;QACxE,IAAI,iBAAsD,CAAC;QAC3D,IAAI,iBAAsD,CAAC;QAC3D,IAAI,UAA2B,CAAC;QAChC,IAAI,UAA2B,CAAC;QAEhC,UAAU,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;YAC1C,uBAAuB,GAAG,IAAI,0CAA0C,EAAE,CAAC;YAE3E,oCAAoC;YACpC,MAAM,iBAAiB,GAAG,IAAI,yBAAyB,EAAE,CAAC;YAC1D,iBAAiB,GAAG,uBAAuB,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;YACtF,MAAM,SAAS,GAAG;gBACjB,eAAe,EAAE,iBAAiB,CAAC,qBAAqB,EAAE;gBAC1D,aAAa,EAAE,IAAI,WAAW,EAAE;aAChC,CAAC;YACF,UAAU,GAAG,IAAI,eAAe,CAC/B,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,CAAC,UAAU,CAC3B,CAAC;YACF,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAE9B,qCAAqC;YACrC,MAAM,iBAAiB,GAAG,IAAI,yBAAyB,EAAE,CAAC;YAC1D,iBAAiB,GAAG,uBAAuB,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;YACtF,MAAM,SAAS,GAAG;gBACjB,eAAe,EAAE,iBAAiB,CAAC,qBAAqB,EAAE;gBAC1D,aAAa,EAAE,IAAI,WAAW,EAAE;aAChC,CAAC;YACF,UAAU,GAAG,IAAI,eAAe,CAC/B,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,CAAC,UAAU,CAC3B,CAAC;YACF,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,GAAG,GAAG,SAAS,CAAC;YACtB,MAAM,KAAK,GAAG,WAAW,CAAC;YAC1B,MAAM,UAAU,GAAG,QAAQ,CAAC;YAC5B,MAAM,SAAS,GAAG,eAAe,CAAC;YAClC,MAAM,WAAW,GAAG,iBAAiB,CAAC;YAEtC,4CAA4C;YAC5C,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC3B,+CAA+C;YAC/C,MAAM,MAAM,GAAG,UAAU,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAEnC,6CAA6C;YAC7C,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;YACpC,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;YAEnC,wBAAwB;YACxB,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,qDAAqD;YACrD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,0CAA0C,CAAC,CAAC;YACrF,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,2CAA2C,CAAC,CAAC;YAEtF,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YACvD,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;YAElD,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YACvD,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;YAElD,4DAA4D;YAC5D,UAAU,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAE1C,8CAA8C;YAC9C,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;YACpC,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;YAEnC,wBAAwB;YACxB,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,uDAAuD;YACvD,MAAM,CAAC,KAAK,CACX,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,EACtC,SAAS,EACT,+CAA+C,CAC/C,CAAC;YACF,MAAM,CAAC,KAAK,CACX,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,EACtC,SAAS,EACT,gDAAgD,CAChD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACpF,MAAM,GAAG,GAAG,SAAS,CAAC;YACtB,MAAM,KAAK,GAAG,WAAW,CAAC;YAC1B,MAAM,UAAU,GAAG,QAAQ,CAAC;YAC5B,MAAM,SAAS,GAAG,eAAe,CAAC;YAClC,MAAM,WAAW,GAAG,iBAAiB,CAAC;YAEtC,+BAA+B;YAC/B,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;YAEpC,4CAA4C;YAC5C,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC3B,+CAA+C;YAC/C,MAAM,MAAM,GAAG,UAAU,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAEnC,8BAA8B;YAC9B,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;YAEnC,wBAAwB;YACxB,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,qDAAqD;YACrD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,0CAA0C,CAAC,CAAC;YACrF,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,2CAA2C,CAAC,CAAC;YAEtF,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YACvD,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;YAElD,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YACvD,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;YAElD,gCAAgC;YAChC,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;YAEpC,4DAA4D;YAC5D,UAAU,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAE1C,+BAA+B;YAC/B,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;YAEnC,wBAAwB;YACxB,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,uDAAuD;YACvD,MAAM,CAAC,KAAK,CACX,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,EACtC,SAAS,EACT,+CAA+C,CAC/C,CAAC;YACF,MAAM,CAAC,KAAK,CACX,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,EACtC,SAAS,EACT,gDAAgD,CAChD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;YACjF,MAAM,UAAU,GAAG,QAAQ,CAAC;YAE5B,MAAM,OAAO,GAAG,UAAU,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAC1D,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,gFAAgF;YAChF,OAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YACvC,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;YAEpC,UAAU,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAC1C,UAAU,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAC1C,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,mHAAmH;YACnH,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;YAEnC,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE,sBAAsB,CAAC,CAAC;YACrF,MAAM,CACL,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC,UAAU,CAAC,KAAK,SAAS,EACjF,iCAAiC,CACjC,CAAC;YACF,2BAA2B,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACrE,MAAM,UAAU,GAAG,QAAQ,CAAC;YAC5B,MAAM,SAAS,GAAG,eAAe,CAAC;YAClC,MAAM,WAAW,GAAG,iBAAiB,CAAC;YAEtC,MAAM,OAAO,GAAG,UAAU,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAC1D,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,gFAAgF;YAChF,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACpC,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;YAEpC,UAAU,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAC1C,UAAU,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAC1C,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,wHAAwH;YACxH,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;YAEnC,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE,sBAAsB,CAAC,CAAC;YACrF,MAAM,CACL,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,KAAK,SAAS,EACpE,yCAAyC,CACzC,CAAC;YACF,2BAA2B,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,WAAW,GAAG,QAAQ,CAAC;YAC7B,MAAM,WAAW,GAAG,SAAS,CAAC;YAE9B,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;YACpC,wEAAwE;YACxE,MAAM,MAAM,GAAG,UAAU,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAC1D,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAEvC,MAAM,OAAO,GAAG,UAAU,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAC3D,OAAO,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YACxC,6CAA6C;YAC7C,UAAU,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAC3C,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;YAEnC,oGAAoG;YACpG,gGAAgG;YAChG,sBAAsB;YACtB,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,WAAW,CAAC,KAAK,SAAS,EAAE,sBAAsB,CAAC,CAAC;YACtF,MAAM,CACL,UAAU,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,WAAW,CAAC,KAAK,SAAS,EACnF,6BAA6B,CAC7B,CAAC;YACF,MAAM,CACL,UAAU,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,WAAW,CAAC,KAAK,SAAS,EACnF,kCAAkC,CAClC,CAAC;YAEF,2BAA2B,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACpF,MAAM,UAAU,GAAG,QAAQ,CAAC;YAC5B,MAAM,SAAS,GAAG,eAAe,CAAC;YAClC,MAAM,WAAW,GAAG,iBAAiB,CAAC;YAEtC,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;YACpC,MAAM,MAAM,GAAG,UAAU,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAEpC,UAAU,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAC1C,UAAU,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAC1C,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;YAEnC,oGAAoG;YACpG,gGAAgG;YAChG,+EAA+E;YAC/E,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE,sBAAsB,CAAC,CAAC;YACrF,MAAM,CACL,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC,UAAU,CAAC,KAAK,SAAS,EACjF,6BAA6B,CAC7B,CAAC;YACF,MAAM,CACL,UAAU;iBACR,eAAe,CAAC,UAAU,CAAC;gBAC5B,EAAE,eAAe,CAAC,UAAU,CAAC;gBAC7B,EAAE,GAAG,CAAC,SAAS,CAAC,KAAK,WAAW,EACjC,wCAAwC,CACxC,CAAC;YACF,2BAA2B,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAC/E,MAAM,WAAW,GAAG,QAAQ,CAAC;YAE7B,MAAM,MAAM,GAAG,UAAU,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAC1D,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;YACpC,wEAAwE;YACxE,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YACvC,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YACvC,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YACvC,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YACvC,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAEvC,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;YAEnC,yCAAyC;YACzC,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,WAAW,CAAC,KAAK,SAAS,EAAE,sBAAsB,CAAC,CAAC;YACtF,MAAM,CACL,UAAU,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,WAAW,CAAC,KAAK,SAAS,EACnF,6BAA6B,CAC7B,CAAC;YACF,2BAA2B,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAC/E,MAAM,WAAW,GAAG,QAAQ,CAAC;YAE7B,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;YACpC,wEAAwE;YACxE,MAAM,MAAM,GAAG,UAAU,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAC1D,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YACvC,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YACvC,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YACvC,UAAU,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAC3C,UAAU,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAE3C,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;YAEnC,yFAAyF;YACzF,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,WAAW,CAAC,KAAK,SAAS,EAAE,sBAAsB,CAAC,CAAC;YACtF,MAAM,CACL,UAAU,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,WAAW,CAAC,KAAK,SAAS,EACnF,iCAAiC,CACjC,CAAC;YACF,2BAA2B,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAC/E,MAAM,WAAW,GAAG,QAAQ,CAAC;YAE7B,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;YACpC,wEAAwE;YACxE,MAAM,MAAM,GAAG,UAAU,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAC1D,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YACvC,UAAU,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAC3C,UAAU,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAE3C,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;YAEnC,yFAAyF;YACzF,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,WAAW,CAAC,KAAK,SAAS,EAAE,sBAAsB,CAAC,CAAC;YACtF,MAAM,CACL,UAAU,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,WAAW,CAAC,KAAK,SAAS,EACnF,iCAAiC,CACjC,CAAC;YACF,2BAA2B,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport {\n\tMockFluidDataStoreRuntime,\n\tMockContainerRuntimeFactoryForReconnection,\n\tMockContainerRuntimeForReconnection,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { DirectoryFactory, SharedDirectory } from \"../../directory.js\";\nimport { MapFactory, SharedMap } from \"../../map.js\";\nimport { assertEquivalentDirectories } from \"./directoryEquivalenceUtils.js\";\n\ndescribe(\"Reconnection\", () => {\n\tdescribe(\"SharedMap\", () => {\n\t\tlet containerRuntimeFactory: MockContainerRuntimeFactoryForReconnection;\n\t\tlet containerRuntime1: MockContainerRuntimeForReconnection;\n\t\tlet containerRuntime2: MockContainerRuntimeForReconnection;\n\t\tlet map1: SharedMap;\n\t\tlet map2: SharedMap;\n\n\t\tbeforeEach(\"createMaps\", async () => {\n\t\t\tcontainerRuntimeFactory = new MockContainerRuntimeFactoryForReconnection();\n\n\t\t\t// Create the first SharedMap.\n\t\t\tconst dataStoreRuntime1 = new MockFluidDataStoreRuntime();\n\t\t\tcontainerRuntime1 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime1);\n\t\t\tconst services1 = {\n\t\t\t\tdeltaConnection: dataStoreRuntime1.createDeltaConnection(),\n\t\t\t\tobjectStorage: new MockStorage(),\n\t\t\t};\n\t\t\tmap1 = new SharedMap(\"shared-map-1\", dataStoreRuntime1, MapFactory.Attributes);\n\t\t\tmap1.connect(services1);\n\n\t\t\t// Create the second SharedMap.\n\t\t\tconst dataStoreRuntime2 = new MockFluidDataStoreRuntime();\n\t\t\tcontainerRuntime2 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);\n\t\t\tconst services2 = {\n\t\t\t\tdeltaConnection: dataStoreRuntime2.createDeltaConnection(),\n\t\t\t\tobjectStorage: new MockStorage(),\n\t\t\t};\n\t\t\tmap2 = new SharedMap(\"shared-map-2\", dataStoreRuntime2, MapFactory.Attributes);\n\t\t\tmap2.connect(services2);\n\t\t});\n\n\t\tit(\"can resend unacked ops on reconnection\", async () => {\n\t\t\tconst key = \"testKey\";\n\t\t\tconst value = \"testValue\";\n\n\t\t\t// Set a value on the first SharedMap.\n\t\t\tmap1.set(key, value);\n\n\t\t\t// Disconnect and reconnect the first client.\n\t\t\tcontainerRuntime1.connected = false;\n\t\t\tcontainerRuntime1.connected = true;\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify that the set value is processed by both clients.\n\t\t\tassert.equal(map1.get(key), value, \"The local client did not process the set\");\n\t\t\tassert.equal(map2.get(key), value, \"The remote client did not process the set\");\n\n\t\t\t// Delete the value from the second SharedMap.\n\t\t\tmap2.delete(key);\n\n\t\t\t// Disconnect and reconnect the second client.\n\t\t\tcontainerRuntime2.connected = false;\n\t\t\tcontainerRuntime2.connected = true;\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify that the deleted value is processed by both clients.\n\t\t\tassert.equal(map1.get(key), undefined, \"The local client did not process the delete\");\n\t\t\tassert.equal(map2.get(key), undefined, \"The remote client did not process the delete\");\n\t\t});\n\n\t\tit(\"can store ops in disconnected state and resend them on reconnection\", async () => {\n\t\t\tconst key = \"testKey\";\n\t\t\tconst value = \"testValue\";\n\n\t\t\t// Disconnect the first client.\n\t\t\tcontainerRuntime1.connected = false;\n\n\t\t\t// Set a value on the first SharedMap.\n\t\t\tmap1.set(key, value);\n\n\t\t\t// Reconnect the first client.\n\t\t\tcontainerRuntime1.connected = true;\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify that the set value is processed by both clients.\n\t\t\tassert.equal(map1.get(key), value, \"The local client did not process the set\");\n\t\t\tassert.equal(map2.get(key), value, \"The remote client did not process the set\");\n\n\t\t\t// Disconnect the second client.\n\t\t\tcontainerRuntime2.connected = false;\n\n\t\t\t// Delete the value from the second SharedMap.\n\t\t\tmap2.delete(key);\n\n\t\t\t// Reconnect the second client.\n\t\t\tcontainerRuntime2.connected = true;\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify that the deleted value is processed by both clients.\n\t\t\tassert.equal(map1.get(key), undefined, \"The local client did not process the delete\");\n\t\t\tassert.equal(map2.get(key), undefined, \"The remote client did not process the delete\");\n\t\t});\n\t});\n\n\tdescribe(\"SharedDirectory\", () => {\n\t\tlet containerRuntimeFactory: MockContainerRuntimeFactoryForReconnection;\n\t\tlet containerRuntime1: MockContainerRuntimeForReconnection;\n\t\tlet containerRuntime2: MockContainerRuntimeForReconnection;\n\t\tlet directory1: SharedDirectory;\n\t\tlet directory2: SharedDirectory;\n\n\t\tbeforeEach(\"createDirectories\", async () => {\n\t\t\tcontainerRuntimeFactory = new MockContainerRuntimeFactoryForReconnection();\n\n\t\t\t// Create the first SharedDirectory.\n\t\t\tconst dataStoreRuntime1 = new MockFluidDataStoreRuntime();\n\t\t\tcontainerRuntime1 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime1);\n\t\t\tconst services1 = {\n\t\t\t\tdeltaConnection: dataStoreRuntime1.createDeltaConnection(),\n\t\t\t\tobjectStorage: new MockStorage(),\n\t\t\t};\n\t\t\tdirectory1 = new SharedDirectory(\n\t\t\t\t\"shared-directory-1\",\n\t\t\t\tdataStoreRuntime1,\n\t\t\t\tDirectoryFactory.Attributes,\n\t\t\t);\n\t\t\tdirectory1.connect(services1);\n\n\t\t\t// Create the second SharedDirectory.\n\t\t\tconst dataStoreRuntime2 = new MockFluidDataStoreRuntime();\n\t\t\tcontainerRuntime2 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);\n\t\t\tconst services2 = {\n\t\t\t\tdeltaConnection: dataStoreRuntime2.createDeltaConnection(),\n\t\t\t\tobjectStorage: new MockStorage(),\n\t\t\t};\n\t\t\tdirectory2 = new SharedDirectory(\n\t\t\t\t\"shared-directory-2\",\n\t\t\t\tdataStoreRuntime2,\n\t\t\t\tDirectoryFactory.Attributes,\n\t\t\t);\n\t\t\tdirectory2.connect(services2);\n\t\t});\n\n\t\tit(\"can resend unacked ops on reconnection\", async () => {\n\t\t\tconst key = \"testKey\";\n\t\t\tconst value = \"testValue\";\n\t\t\tconst subDirName = \"subDir\";\n\t\t\tconst subDirKey = \"testSubDirKey\";\n\t\t\tconst subDirValue = \"testSubDirValue\";\n\n\t\t\t// Set a value on the first SharedDirectory.\n\t\t\tdirectory1.set(key, value);\n\t\t\t// Create a subdirectory and set a value on it.\n\t\t\tconst subDir = directory1.createSubDirectory(subDirName);\n\t\t\tsubDir.set(subDirKey, subDirValue);\n\n\t\t\t// Disconnect and reconnect the first client.\n\t\t\tcontainerRuntime1.connected = false;\n\t\t\tcontainerRuntime1.connected = true;\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify that the ops are processed by both clients.\n\t\t\tassert.equal(directory1.get(key), value, \"The local client did not process the set\");\n\t\t\tassert.equal(directory2.get(key), value, \"The remote client did not process the set\");\n\n\t\t\tconst subDir1 = directory1.getSubDirectory(subDirName);\n\t\t\tassert.ok(subDir1);\n\t\t\tassert.equal(subDir1.get(subDirKey), subDirValue);\n\n\t\t\tconst subDir2 = directory2.getSubDirectory(subDirName);\n\t\t\tassert.ok(subDir2);\n\t\t\tassert.equal(subDir2.get(subDirKey), subDirValue);\n\n\t\t\t// Delete the sub directory from the second SharedDirectory.\n\t\t\tdirectory2.deleteSubDirectory(subDirName);\n\n\t\t\t// Disconnect and reconnect the second client.\n\t\t\tcontainerRuntime2.connected = false;\n\t\t\tcontainerRuntime2.connected = true;\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify that the delete is processed by both clients.\n\t\t\tassert.equal(\n\t\t\t\tdirectory1.getSubDirectory(subDirName),\n\t\t\t\tundefined,\n\t\t\t\t\"The local client did not delete sub directory\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tdirectory2.getSubDirectory(subDirName),\n\t\t\t\tundefined,\n\t\t\t\t\"The remote client did not delete sub directory\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can store ops in disconnected state and resend them on reconnection\", async () => {\n\t\t\tconst key = \"testKey\";\n\t\t\tconst value = \"testValue\";\n\t\t\tconst subDirName = \"subDir\";\n\t\t\tconst subDirKey = \"testSubDirKey\";\n\t\t\tconst subDirValue = \"testSubDirValue\";\n\n\t\t\t// Disconnect the first client.\n\t\t\tcontainerRuntime1.connected = false;\n\n\t\t\t// Set a value on the first SharedDirectory.\n\t\t\tdirectory1.set(key, value);\n\t\t\t// Create a subdirectory and set a value on it.\n\t\t\tconst subDir = directory1.createSubDirectory(subDirName);\n\t\t\tsubDir.set(subDirKey, subDirValue);\n\n\t\t\t// Reconnect the first client.\n\t\t\tcontainerRuntime1.connected = true;\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify that the ops are processed by both clients.\n\t\t\tassert.equal(directory1.get(key), value, \"The local client did not process the set\");\n\t\t\tassert.equal(directory2.get(key), value, \"The remote client did not process the set\");\n\n\t\t\tconst subDir1 = directory1.getSubDirectory(subDirName);\n\t\t\tassert.ok(subDir1);\n\t\t\tassert.equal(subDir1.get(subDirKey), subDirValue);\n\n\t\t\tconst subDir2 = directory2.getSubDirectory(subDirName);\n\t\t\tassert.ok(subDir2);\n\t\t\tassert.equal(subDir2.get(subDirKey), subDirValue);\n\n\t\t\t// Disconnect the second client.\n\t\t\tcontainerRuntime2.connected = false;\n\n\t\t\t// Delete the sub directory from the second SharedDirectory.\n\t\t\tdirectory2.deleteSubDirectory(subDirName);\n\n\t\t\t// Reconnect the second client.\n\t\t\tcontainerRuntime2.connected = true;\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify that the delete is processed by both clients.\n\t\t\tassert.equal(\n\t\t\t\tdirectory1.getSubDirectory(subDirName),\n\t\t\t\tundefined,\n\t\t\t\t\"The local client did not delete sub directory\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tdirectory2.getSubDirectory(subDirName),\n\t\t\t\tundefined,\n\t\t\t\t\"The remote client did not delete sub directory\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"avoids resending createSubDirectory ops on recreated directories\", async () => {\n\t\t\tconst subDirName = \"subDir\";\n\n\t\t\tconst subDir1 = directory1.createSubDirectory(subDirName);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// This op will not be submitted first as we are going to disconnect the client.\n\t\t\tsubDir1.createSubDirectory(subDirName);\n\t\t\tcontainerRuntime1.connected = false;\n\n\t\t\tdirectory2.deleteSubDirectory(subDirName);\n\t\t\tdirectory2.createSubDirectory(subDirName);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t// Now client1 reconnects causing it to delete the /subDir, so that the create /subDir/subDir will not be submitted\n\t\t\tcontainerRuntime1.connected = true;\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassert(directory1.getSubDirectory(subDirName) !== undefined, \"/subDir should exist\");\n\t\t\tassert(\n\t\t\t\tdirectory1.getSubDirectory(subDirName)?.getSubDirectory(subDirName) === undefined,\n\t\t\t\t\"/subDir/subDir should not exist\",\n\t\t\t);\n\t\t\tassertEquivalentDirectories(directory1, directory2);\n\t\t});\n\n\t\tit(\"avoids sending setValue ops on recreated directories\", async () => {\n\t\t\tconst subDirName = \"subDir\";\n\t\t\tconst subDirKey = \"testSubDirKey\";\n\t\t\tconst subDirValue = \"testSubDirValue\";\n\n\t\t\tconst subDir1 = directory1.createSubDirectory(subDirName);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// This op will not be submitted first as we are going to disconnect the client.\n\t\t\tsubDir1.set(subDirKey, subDirValue);\n\t\t\tcontainerRuntime1.connected = false;\n\n\t\t\tdirectory2.deleteSubDirectory(subDirName);\n\t\t\tdirectory2.createSubDirectory(subDirName);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t// Now client1 reconnects causing it to delete the /subDir, so that the set /subDir/testSubDirKey will not be submitted.\n\t\t\tcontainerRuntime1.connected = true;\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassert(directory1.getSubDirectory(subDirName) !== undefined, \"/subDir should exist\");\n\t\t\tassert(\n\t\t\t\tdirectory1.getSubDirectory(subDirName)?.get(subDirKey) === undefined,\n\t\t\t\t\"/subDir(testSubDirKey) should not exist\",\n\t\t\t);\n\t\t\tassertEquivalentDirectories(directory1, directory2);\n\t\t});\n\n\t\tit(\"does not delete pending create subDirs on reconnection\", async () => {\n\t\t\tconst subDirName1 = \"subDir\";\n\t\t\tconst subDirName2 = \"subDir2\";\n\n\t\t\tcontainerRuntime1.connected = false;\n\t\t\t// These ops will not be sent initially as we are in disconnected state.\n\t\t\tconst subDir = directory1.createSubDirectory(subDirName1);\n\t\t\tsubDir.createSubDirectory(subDirName1);\n\n\t\t\tconst subDir1 = directory2.createSubDirectory(subDirName1);\n\t\t\tsubDir1.createSubDirectory(subDirName2);\n\t\t\t// /subDir deleted by other connected client.\n\t\t\tdirectory2.deleteSubDirectory(subDirName1);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tcontainerRuntime1.connected = true;\n\n\t\t\t// When op for deleting /subDir comes, it will not delete subdirectories who are created locally and\n\t\t\t// ack is pending as they will recreated again. Both directories will contain /subDir/subDir but\n\t\t\t// no /subDir/subDir2.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassert(directory1.getSubDirectory(subDirName1) !== undefined, \"/subDir should exist\");\n\t\t\tassert(\n\t\t\t\tdirectory1.getSubDirectory(subDirName1)?.getSubDirectory(subDirName1) !== undefined,\n\t\t\t\t\"/subDir/subDir should exist\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tdirectory1.getSubDirectory(subDirName1)?.getSubDirectory(subDirName2) === undefined,\n\t\t\t\t\"/subDir/subDir2 should not exist\",\n\t\t\t);\n\n\t\t\tassertEquivalentDirectories(directory1, directory2);\n\t\t});\n\n\t\tit(\"does not delete pending keys within pending subDirs on reconnection\", async () => {\n\t\t\tconst subDirName = \"subDir\";\n\t\t\tconst subDirKey = \"testSubDirKey\";\n\t\t\tconst subDirValue = \"testSubDirValue\";\n\n\t\t\tcontainerRuntime1.connected = false;\n\t\t\tconst subDir = directory1.createSubDirectory(subDirName);\n\t\t\tconst subDir2 = subDir.createSubDirectory(subDirName);\n\t\t\tsubDir2.set(subDirKey, subDirValue);\n\n\t\t\tdirectory2.createSubDirectory(subDirName);\n\t\t\tdirectory2.deleteSubDirectory(subDirName);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tcontainerRuntime1.connected = true;\n\n\t\t\t// When op for deleting /subDir comes, it will not delete subdirectories who are created locally and\n\t\t\t// ack is pending as they will recreated again. Both directories will contain /subDir/subDir but\n\t\t\t// no /subDir/subDir2. It will also not delete pending keys in pending subDirs.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tassert(directory1.getSubDirectory(subDirName) !== undefined, \"/subDir should exist\");\n\t\t\tassert(\n\t\t\t\tdirectory1.getSubDirectory(subDirName)?.getSubDirectory(subDirName) !== undefined,\n\t\t\t\t\"/subDir/subDir should exist\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tdirectory1\n\t\t\t\t\t.getSubDirectory(subDirName)\n\t\t\t\t\t?.getSubDirectory(subDirName)\n\t\t\t\t\t?.get(subDirKey) === subDirValue,\n\t\t\t\t\"/subDir/subDir(subDirKey) should exist\",\n\t\t\t);\n\t\t\tassertEquivalentDirectories(directory1, directory2);\n\t\t});\n\n\t\tit(\"multiple create/delete subDirs on disconnection/reconnection 1\", async () => {\n\t\t\tconst subDirName1 = \"subDir\";\n\n\t\t\tconst subDir = directory1.createSubDirectory(subDirName1);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tcontainerRuntime1.connected = false;\n\t\t\t// These ops will not be sent initially as we are in disconnected state.\n\t\t\tsubDir.createSubDirectory(subDirName1);\n\t\t\tsubDir.deleteSubDirectory(subDirName1);\n\t\t\tsubDir.createSubDirectory(subDirName1);\n\t\t\tsubDir.deleteSubDirectory(subDirName1);\n\t\t\tsubDir.createSubDirectory(subDirName1);\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tcontainerRuntime1.connected = true;\n\n\t\t\t// /subDir/subDir should exist in the end\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassert(directory1.getSubDirectory(subDirName1) !== undefined, \"/subDir should exist\");\n\t\t\tassert(\n\t\t\t\tdirectory1.getSubDirectory(subDirName1)?.getSubDirectory(subDirName1) !== undefined,\n\t\t\t\t\"/subDir/subDir should exist\",\n\t\t\t);\n\t\t\tassertEquivalentDirectories(directory1, directory2);\n\t\t});\n\n\t\tit(\"multiple create/delete subDirs on disconnection/reconnection 2\", async () => {\n\t\t\tconst subDirName1 = \"subDir\";\n\n\t\t\tcontainerRuntime1.connected = false;\n\t\t\t// These ops will not be sent initially as we are in disconnected state.\n\t\t\tconst subDir = directory1.createSubDirectory(subDirName1);\n\t\t\tsubDir.createSubDirectory(subDirName1);\n\t\t\tsubDir.deleteSubDirectory(subDirName1);\n\t\t\tsubDir.createSubDirectory(subDirName1);\n\t\t\tdirectory1.deleteSubDirectory(subDirName1);\n\t\t\tdirectory1.createSubDirectory(subDirName1);\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tcontainerRuntime1.connected = true;\n\n\t\t\t// /subDir/subDir should not exist in the end as /subDir was deleted after it was created\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassert(directory1.getSubDirectory(subDirName1) !== undefined, \"/subDir should exist\");\n\t\t\tassert(\n\t\t\t\tdirectory1.getSubDirectory(subDirName1)?.getSubDirectory(subDirName1) === undefined,\n\t\t\t\t\"/subDir/subDir should not exist\",\n\t\t\t);\n\t\t\tassertEquivalentDirectories(directory1, directory2);\n\t\t});\n\n\t\tit(\"multiple create/delete subDirs on disconnection/reconnection 3\", async () => {\n\t\t\tconst subDirName1 = \"subDir\";\n\n\t\t\tcontainerRuntime1.connected = false;\n\t\t\t// These ops will not be sent initially as we are in disconnected state.\n\t\t\tconst subDir = directory1.createSubDirectory(subDirName1);\n\t\t\tsubDir.createSubDirectory(subDirName1);\n\t\t\tdirectory1.deleteSubDirectory(subDirName1);\n\t\t\tdirectory1.createSubDirectory(subDirName1);\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tcontainerRuntime1.connected = true;\n\n\t\t\t// /subDir/subDir should not exist in the end as /subDir was deleted after it was created\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassert(directory1.getSubDirectory(subDirName1) !== undefined, \"/subDir should exist\");\n\t\t\tassert(\n\t\t\t\tdirectory1.getSubDirectory(subDirName1)?.getSubDirectory(subDirName1) === undefined,\n\t\t\t\t\"/subDir/subDir should not exist\",\n\t\t\t);\n\t\t\tassertEquivalentDirectories(directory1, directory2);\n\t\t});\n\t});\n});\n"]}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
use_current_ClassDeclaration_DirectoryFactory(get_old_ClassDeclaration_DirectoryFactory());
|
|
2
|
+
use_old_ClassDeclaration_DirectoryFactory(get_current_ClassDeclaration_DirectoryFactory());
|
|
3
|
+
use_current_InterfaceDeclaration_ICreateInfo(get_old_InterfaceDeclaration_ICreateInfo());
|
|
4
|
+
use_old_InterfaceDeclaration_ICreateInfo(get_current_InterfaceDeclaration_ICreateInfo());
|
|
5
|
+
use_current_InterfaceDeclaration_IDirectory(get_old_InterfaceDeclaration_IDirectory());
|
|
6
|
+
use_old_InterfaceDeclaration_IDirectory(get_current_InterfaceDeclaration_IDirectory());
|
|
7
|
+
use_current_InterfaceDeclaration_IDirectoryClearOperation(get_old_InterfaceDeclaration_IDirectoryClearOperation());
|
|
8
|
+
use_old_InterfaceDeclaration_IDirectoryClearOperation(get_current_InterfaceDeclaration_IDirectoryClearOperation());
|
|
9
|
+
use_current_InterfaceDeclaration_IDirectoryCreateSubDirectoryOperation(get_old_InterfaceDeclaration_IDirectoryCreateSubDirectoryOperation());
|
|
10
|
+
use_old_InterfaceDeclaration_IDirectoryCreateSubDirectoryOperation(get_current_InterfaceDeclaration_IDirectoryCreateSubDirectoryOperation());
|
|
11
|
+
use_current_InterfaceDeclaration_IDirectoryDataObject(get_old_InterfaceDeclaration_IDirectoryDataObject());
|
|
12
|
+
use_old_InterfaceDeclaration_IDirectoryDataObject(get_current_InterfaceDeclaration_IDirectoryDataObject());
|
|
13
|
+
use_current_InterfaceDeclaration_IDirectoryDeleteOperation(get_old_InterfaceDeclaration_IDirectoryDeleteOperation());
|
|
14
|
+
use_old_InterfaceDeclaration_IDirectoryDeleteOperation(get_current_InterfaceDeclaration_IDirectoryDeleteOperation());
|
|
15
|
+
use_current_InterfaceDeclaration_IDirectoryDeleteSubDirectoryOperation(get_old_InterfaceDeclaration_IDirectoryDeleteSubDirectoryOperation());
|
|
16
|
+
use_old_InterfaceDeclaration_IDirectoryDeleteSubDirectoryOperation(get_current_InterfaceDeclaration_IDirectoryDeleteSubDirectoryOperation());
|
|
17
|
+
use_current_InterfaceDeclaration_IDirectoryEvents(get_old_InterfaceDeclaration_IDirectoryEvents());
|
|
18
|
+
use_old_InterfaceDeclaration_IDirectoryEvents(get_current_InterfaceDeclaration_IDirectoryEvents());
|
|
19
|
+
use_current_TypeAliasDeclaration_IDirectoryKeyOperation(get_old_TypeAliasDeclaration_IDirectoryKeyOperation());
|
|
20
|
+
use_old_TypeAliasDeclaration_IDirectoryKeyOperation(get_current_TypeAliasDeclaration_IDirectoryKeyOperation());
|
|
21
|
+
use_current_InterfaceDeclaration_IDirectoryNewStorageFormat(get_old_InterfaceDeclaration_IDirectoryNewStorageFormat());
|
|
22
|
+
use_old_InterfaceDeclaration_IDirectoryNewStorageFormat(get_current_InterfaceDeclaration_IDirectoryNewStorageFormat());
|
|
23
|
+
use_current_TypeAliasDeclaration_IDirectoryOperation(get_old_TypeAliasDeclaration_IDirectoryOperation());
|
|
24
|
+
use_old_TypeAliasDeclaration_IDirectoryOperation(get_current_TypeAliasDeclaration_IDirectoryOperation());
|
|
25
|
+
use_current_InterfaceDeclaration_IDirectorySetOperation(get_old_InterfaceDeclaration_IDirectorySetOperation());
|
|
26
|
+
use_old_InterfaceDeclaration_IDirectorySetOperation(get_current_InterfaceDeclaration_IDirectorySetOperation());
|
|
27
|
+
use_current_TypeAliasDeclaration_IDirectoryStorageOperation(get_old_TypeAliasDeclaration_IDirectoryStorageOperation());
|
|
28
|
+
use_old_TypeAliasDeclaration_IDirectoryStorageOperation(get_current_TypeAliasDeclaration_IDirectoryStorageOperation());
|
|
29
|
+
use_current_TypeAliasDeclaration_IDirectorySubDirectoryOperation(get_old_TypeAliasDeclaration_IDirectorySubDirectoryOperation());
|
|
30
|
+
use_old_TypeAliasDeclaration_IDirectorySubDirectoryOperation(get_current_TypeAliasDeclaration_IDirectorySubDirectoryOperation());
|
|
31
|
+
use_current_InterfaceDeclaration_IDirectoryValueChanged(get_old_InterfaceDeclaration_IDirectoryValueChanged());
|
|
32
|
+
use_old_InterfaceDeclaration_IDirectoryValueChanged(get_current_InterfaceDeclaration_IDirectoryValueChanged());
|
|
33
|
+
use_current_InterfaceDeclaration_ILocalValue(get_old_InterfaceDeclaration_ILocalValue());
|
|
34
|
+
use_old_InterfaceDeclaration_ILocalValue(get_current_InterfaceDeclaration_ILocalValue());
|
|
35
|
+
use_current_InterfaceDeclaration_ISerializableValue(get_old_InterfaceDeclaration_ISerializableValue());
|
|
36
|
+
use_old_InterfaceDeclaration_ISerializableValue(get_current_InterfaceDeclaration_ISerializableValue());
|
|
37
|
+
use_current_InterfaceDeclaration_ISerializedValue(get_old_InterfaceDeclaration_ISerializedValue());
|
|
38
|
+
use_old_InterfaceDeclaration_ISerializedValue(get_current_InterfaceDeclaration_ISerializedValue());
|
|
39
|
+
use_current_InterfaceDeclaration_ISharedDirectory(get_old_InterfaceDeclaration_ISharedDirectory());
|
|
40
|
+
use_old_InterfaceDeclaration_ISharedDirectory(get_current_InterfaceDeclaration_ISharedDirectory());
|
|
41
|
+
use_current_InterfaceDeclaration_ISharedDirectoryEvents(get_old_InterfaceDeclaration_ISharedDirectoryEvents());
|
|
42
|
+
use_old_InterfaceDeclaration_ISharedDirectoryEvents(get_current_InterfaceDeclaration_ISharedDirectoryEvents());
|
|
43
|
+
use_current_InterfaceDeclaration_ISharedMap(get_old_InterfaceDeclaration_ISharedMap());
|
|
44
|
+
use_old_InterfaceDeclaration_ISharedMap(get_current_InterfaceDeclaration_ISharedMap());
|
|
45
|
+
use_current_InterfaceDeclaration_ISharedMapEvents(get_old_InterfaceDeclaration_ISharedMapEvents());
|
|
46
|
+
use_old_InterfaceDeclaration_ISharedMapEvents(get_current_InterfaceDeclaration_ISharedMapEvents());
|
|
47
|
+
use_current_InterfaceDeclaration_IValueChanged(get_old_InterfaceDeclaration_IValueChanged());
|
|
48
|
+
use_old_InterfaceDeclaration_IValueChanged(get_current_InterfaceDeclaration_IValueChanged());
|
|
49
|
+
use_current_ClassDeclaration_LocalValueMaker(get_old_ClassDeclaration_LocalValueMaker());
|
|
50
|
+
use_old_ClassDeclaration_LocalValueMaker(get_current_ClassDeclaration_LocalValueMaker());
|
|
51
|
+
use_current_ClassDeclaration_MapFactory(get_old_ClassDeclaration_MapFactory());
|
|
52
|
+
use_old_ClassDeclaration_MapFactory(get_current_ClassDeclaration_MapFactory());
|
|
53
|
+
use_current_ClassDeclaration_SharedDirectory(get_old_ClassDeclaration_SharedDirectory());
|
|
54
|
+
use_old_ClassDeclaration_SharedDirectory(get_current_ClassDeclaration_SharedDirectory());
|
|
55
|
+
export {};
|
|
56
|
+
/*
|
|
57
|
+
* Validate forward compat by using old type in place of current type
|
|
58
|
+
* If breaking change required, add in package.json under typeValidation.broken:
|
|
59
|
+
* "RemovedClassDeclaration_SharedMap": {"forwardCompat": false}
|
|
60
|
+
*/
|
|
61
|
+
/*
|
|
62
|
+
* Validate back compat by using current type in place of old type
|
|
63
|
+
* If breaking change required, add in package.json under typeValidation.broken:
|
|
64
|
+
* "RemovedClassDeclaration_SharedMap": {"backCompat": false}
|
|
65
|
+
*/
|
|
66
|
+
//# sourceMappingURL=validateMapPrevious.generated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateMapPrevious.generated.js","sourceRoot":"","sources":["../../../src/test/types/validateMapPrevious.generated.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n/*\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n * Generated by fluid-type-test-generator in @fluidframework/build-tools.\n */\nimport type * as old from \"@fluidframework/map-previous\";\nimport type * as current from \"../../index.js\";\n\n\n// See 'build-tools/src/type-test-generator/compatibility.ts' for more information.\ntype TypeOnly<T> = T extends number\n\t? number\n\t: T extends string\n\t? string\n\t: T extends boolean | bigint | symbol\n\t? T\n\t: {\n\t\t\t[P in keyof T]: TypeOnly<T[P]>;\n\t };\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"ClassDeclaration_DirectoryFactory\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_ClassDeclaration_DirectoryFactory():\n TypeOnly<old.DirectoryFactory>;\ndeclare function use_current_ClassDeclaration_DirectoryFactory(\n use: TypeOnly<current.DirectoryFactory>): void;\nuse_current_ClassDeclaration_DirectoryFactory(\n get_old_ClassDeclaration_DirectoryFactory());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"ClassDeclaration_DirectoryFactory\": {\"backCompat\": false}\n*/\ndeclare function get_current_ClassDeclaration_DirectoryFactory():\n TypeOnly<current.DirectoryFactory>;\ndeclare function use_old_ClassDeclaration_DirectoryFactory(\n use: TypeOnly<old.DirectoryFactory>): void;\nuse_old_ClassDeclaration_DirectoryFactory(\n get_current_ClassDeclaration_DirectoryFactory());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_ICreateInfo\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_ICreateInfo():\n TypeOnly<old.ICreateInfo>;\ndeclare function use_current_InterfaceDeclaration_ICreateInfo(\n use: TypeOnly<current.ICreateInfo>): void;\nuse_current_InterfaceDeclaration_ICreateInfo(\n get_old_InterfaceDeclaration_ICreateInfo());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_ICreateInfo\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_ICreateInfo():\n TypeOnly<current.ICreateInfo>;\ndeclare function use_old_InterfaceDeclaration_ICreateInfo(\n use: TypeOnly<old.ICreateInfo>): void;\nuse_old_InterfaceDeclaration_ICreateInfo(\n get_current_InterfaceDeclaration_ICreateInfo());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IDirectory\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_IDirectory():\n TypeOnly<old.IDirectory>;\ndeclare function use_current_InterfaceDeclaration_IDirectory(\n use: TypeOnly<current.IDirectory>): void;\nuse_current_InterfaceDeclaration_IDirectory(\n get_old_InterfaceDeclaration_IDirectory());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IDirectory\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_IDirectory():\n TypeOnly<current.IDirectory>;\ndeclare function use_old_InterfaceDeclaration_IDirectory(\n use: TypeOnly<old.IDirectory>): void;\nuse_old_InterfaceDeclaration_IDirectory(\n get_current_InterfaceDeclaration_IDirectory());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IDirectoryClearOperation\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_IDirectoryClearOperation():\n TypeOnly<old.IDirectoryClearOperation>;\ndeclare function use_current_InterfaceDeclaration_IDirectoryClearOperation(\n use: TypeOnly<current.IDirectoryClearOperation>): void;\nuse_current_InterfaceDeclaration_IDirectoryClearOperation(\n get_old_InterfaceDeclaration_IDirectoryClearOperation());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IDirectoryClearOperation\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_IDirectoryClearOperation():\n TypeOnly<current.IDirectoryClearOperation>;\ndeclare function use_old_InterfaceDeclaration_IDirectoryClearOperation(\n use: TypeOnly<old.IDirectoryClearOperation>): void;\nuse_old_InterfaceDeclaration_IDirectoryClearOperation(\n get_current_InterfaceDeclaration_IDirectoryClearOperation());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IDirectoryCreateSubDirectoryOperation\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_IDirectoryCreateSubDirectoryOperation():\n TypeOnly<old.IDirectoryCreateSubDirectoryOperation>;\ndeclare function use_current_InterfaceDeclaration_IDirectoryCreateSubDirectoryOperation(\n use: TypeOnly<current.IDirectoryCreateSubDirectoryOperation>): void;\nuse_current_InterfaceDeclaration_IDirectoryCreateSubDirectoryOperation(\n get_old_InterfaceDeclaration_IDirectoryCreateSubDirectoryOperation());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IDirectoryCreateSubDirectoryOperation\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_IDirectoryCreateSubDirectoryOperation():\n TypeOnly<current.IDirectoryCreateSubDirectoryOperation>;\ndeclare function use_old_InterfaceDeclaration_IDirectoryCreateSubDirectoryOperation(\n use: TypeOnly<old.IDirectoryCreateSubDirectoryOperation>): void;\nuse_old_InterfaceDeclaration_IDirectoryCreateSubDirectoryOperation(\n get_current_InterfaceDeclaration_IDirectoryCreateSubDirectoryOperation());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IDirectoryDataObject\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_IDirectoryDataObject():\n TypeOnly<old.IDirectoryDataObject>;\ndeclare function use_current_InterfaceDeclaration_IDirectoryDataObject(\n use: TypeOnly<current.IDirectoryDataObject>): void;\nuse_current_InterfaceDeclaration_IDirectoryDataObject(\n get_old_InterfaceDeclaration_IDirectoryDataObject());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IDirectoryDataObject\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_IDirectoryDataObject():\n TypeOnly<current.IDirectoryDataObject>;\ndeclare function use_old_InterfaceDeclaration_IDirectoryDataObject(\n use: TypeOnly<old.IDirectoryDataObject>): void;\nuse_old_InterfaceDeclaration_IDirectoryDataObject(\n get_current_InterfaceDeclaration_IDirectoryDataObject());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IDirectoryDeleteOperation\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_IDirectoryDeleteOperation():\n TypeOnly<old.IDirectoryDeleteOperation>;\ndeclare function use_current_InterfaceDeclaration_IDirectoryDeleteOperation(\n use: TypeOnly<current.IDirectoryDeleteOperation>): void;\nuse_current_InterfaceDeclaration_IDirectoryDeleteOperation(\n get_old_InterfaceDeclaration_IDirectoryDeleteOperation());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IDirectoryDeleteOperation\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_IDirectoryDeleteOperation():\n TypeOnly<current.IDirectoryDeleteOperation>;\ndeclare function use_old_InterfaceDeclaration_IDirectoryDeleteOperation(\n use: TypeOnly<old.IDirectoryDeleteOperation>): void;\nuse_old_InterfaceDeclaration_IDirectoryDeleteOperation(\n get_current_InterfaceDeclaration_IDirectoryDeleteOperation());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IDirectoryDeleteSubDirectoryOperation\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_IDirectoryDeleteSubDirectoryOperation():\n TypeOnly<old.IDirectoryDeleteSubDirectoryOperation>;\ndeclare function use_current_InterfaceDeclaration_IDirectoryDeleteSubDirectoryOperation(\n use: TypeOnly<current.IDirectoryDeleteSubDirectoryOperation>): void;\nuse_current_InterfaceDeclaration_IDirectoryDeleteSubDirectoryOperation(\n get_old_InterfaceDeclaration_IDirectoryDeleteSubDirectoryOperation());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IDirectoryDeleteSubDirectoryOperation\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_IDirectoryDeleteSubDirectoryOperation():\n TypeOnly<current.IDirectoryDeleteSubDirectoryOperation>;\ndeclare function use_old_InterfaceDeclaration_IDirectoryDeleteSubDirectoryOperation(\n use: TypeOnly<old.IDirectoryDeleteSubDirectoryOperation>): void;\nuse_old_InterfaceDeclaration_IDirectoryDeleteSubDirectoryOperation(\n get_current_InterfaceDeclaration_IDirectoryDeleteSubDirectoryOperation());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IDirectoryEvents\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_IDirectoryEvents():\n TypeOnly<old.IDirectoryEvents>;\ndeclare function use_current_InterfaceDeclaration_IDirectoryEvents(\n use: TypeOnly<current.IDirectoryEvents>): void;\nuse_current_InterfaceDeclaration_IDirectoryEvents(\n get_old_InterfaceDeclaration_IDirectoryEvents());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IDirectoryEvents\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_IDirectoryEvents():\n TypeOnly<current.IDirectoryEvents>;\ndeclare function use_old_InterfaceDeclaration_IDirectoryEvents(\n use: TypeOnly<old.IDirectoryEvents>): void;\nuse_old_InterfaceDeclaration_IDirectoryEvents(\n get_current_InterfaceDeclaration_IDirectoryEvents());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"TypeAliasDeclaration_IDirectoryKeyOperation\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_TypeAliasDeclaration_IDirectoryKeyOperation():\n TypeOnly<old.IDirectoryKeyOperation>;\ndeclare function use_current_TypeAliasDeclaration_IDirectoryKeyOperation(\n use: TypeOnly<current.IDirectoryKeyOperation>): void;\nuse_current_TypeAliasDeclaration_IDirectoryKeyOperation(\n get_old_TypeAliasDeclaration_IDirectoryKeyOperation());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"TypeAliasDeclaration_IDirectoryKeyOperation\": {\"backCompat\": false}\n*/\ndeclare function get_current_TypeAliasDeclaration_IDirectoryKeyOperation():\n TypeOnly<current.IDirectoryKeyOperation>;\ndeclare function use_old_TypeAliasDeclaration_IDirectoryKeyOperation(\n use: TypeOnly<old.IDirectoryKeyOperation>): void;\nuse_old_TypeAliasDeclaration_IDirectoryKeyOperation(\n get_current_TypeAliasDeclaration_IDirectoryKeyOperation());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IDirectoryNewStorageFormat\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_IDirectoryNewStorageFormat():\n TypeOnly<old.IDirectoryNewStorageFormat>;\ndeclare function use_current_InterfaceDeclaration_IDirectoryNewStorageFormat(\n use: TypeOnly<current.IDirectoryNewStorageFormat>): void;\nuse_current_InterfaceDeclaration_IDirectoryNewStorageFormat(\n get_old_InterfaceDeclaration_IDirectoryNewStorageFormat());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IDirectoryNewStorageFormat\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_IDirectoryNewStorageFormat():\n TypeOnly<current.IDirectoryNewStorageFormat>;\ndeclare function use_old_InterfaceDeclaration_IDirectoryNewStorageFormat(\n use: TypeOnly<old.IDirectoryNewStorageFormat>): void;\nuse_old_InterfaceDeclaration_IDirectoryNewStorageFormat(\n get_current_InterfaceDeclaration_IDirectoryNewStorageFormat());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"TypeAliasDeclaration_IDirectoryOperation\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_TypeAliasDeclaration_IDirectoryOperation():\n TypeOnly<old.IDirectoryOperation>;\ndeclare function use_current_TypeAliasDeclaration_IDirectoryOperation(\n use: TypeOnly<current.IDirectoryOperation>): void;\nuse_current_TypeAliasDeclaration_IDirectoryOperation(\n get_old_TypeAliasDeclaration_IDirectoryOperation());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"TypeAliasDeclaration_IDirectoryOperation\": {\"backCompat\": false}\n*/\ndeclare function get_current_TypeAliasDeclaration_IDirectoryOperation():\n TypeOnly<current.IDirectoryOperation>;\ndeclare function use_old_TypeAliasDeclaration_IDirectoryOperation(\n use: TypeOnly<old.IDirectoryOperation>): void;\nuse_old_TypeAliasDeclaration_IDirectoryOperation(\n get_current_TypeAliasDeclaration_IDirectoryOperation());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IDirectorySetOperation\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_IDirectorySetOperation():\n TypeOnly<old.IDirectorySetOperation>;\ndeclare function use_current_InterfaceDeclaration_IDirectorySetOperation(\n use: TypeOnly<current.IDirectorySetOperation>): void;\nuse_current_InterfaceDeclaration_IDirectorySetOperation(\n get_old_InterfaceDeclaration_IDirectorySetOperation());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IDirectorySetOperation\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_IDirectorySetOperation():\n TypeOnly<current.IDirectorySetOperation>;\ndeclare function use_old_InterfaceDeclaration_IDirectorySetOperation(\n use: TypeOnly<old.IDirectorySetOperation>): void;\nuse_old_InterfaceDeclaration_IDirectorySetOperation(\n get_current_InterfaceDeclaration_IDirectorySetOperation());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"TypeAliasDeclaration_IDirectoryStorageOperation\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_TypeAliasDeclaration_IDirectoryStorageOperation():\n TypeOnly<old.IDirectoryStorageOperation>;\ndeclare function use_current_TypeAliasDeclaration_IDirectoryStorageOperation(\n use: TypeOnly<current.IDirectoryStorageOperation>): void;\nuse_current_TypeAliasDeclaration_IDirectoryStorageOperation(\n get_old_TypeAliasDeclaration_IDirectoryStorageOperation());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"TypeAliasDeclaration_IDirectoryStorageOperation\": {\"backCompat\": false}\n*/\ndeclare function get_current_TypeAliasDeclaration_IDirectoryStorageOperation():\n TypeOnly<current.IDirectoryStorageOperation>;\ndeclare function use_old_TypeAliasDeclaration_IDirectoryStorageOperation(\n use: TypeOnly<old.IDirectoryStorageOperation>): void;\nuse_old_TypeAliasDeclaration_IDirectoryStorageOperation(\n get_current_TypeAliasDeclaration_IDirectoryStorageOperation());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"TypeAliasDeclaration_IDirectorySubDirectoryOperation\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_TypeAliasDeclaration_IDirectorySubDirectoryOperation():\n TypeOnly<old.IDirectorySubDirectoryOperation>;\ndeclare function use_current_TypeAliasDeclaration_IDirectorySubDirectoryOperation(\n use: TypeOnly<current.IDirectorySubDirectoryOperation>): void;\nuse_current_TypeAliasDeclaration_IDirectorySubDirectoryOperation(\n get_old_TypeAliasDeclaration_IDirectorySubDirectoryOperation());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"TypeAliasDeclaration_IDirectorySubDirectoryOperation\": {\"backCompat\": false}\n*/\ndeclare function get_current_TypeAliasDeclaration_IDirectorySubDirectoryOperation():\n TypeOnly<current.IDirectorySubDirectoryOperation>;\ndeclare function use_old_TypeAliasDeclaration_IDirectorySubDirectoryOperation(\n use: TypeOnly<old.IDirectorySubDirectoryOperation>): void;\nuse_old_TypeAliasDeclaration_IDirectorySubDirectoryOperation(\n get_current_TypeAliasDeclaration_IDirectorySubDirectoryOperation());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IDirectoryValueChanged\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_IDirectoryValueChanged():\n TypeOnly<old.IDirectoryValueChanged>;\ndeclare function use_current_InterfaceDeclaration_IDirectoryValueChanged(\n use: TypeOnly<current.IDirectoryValueChanged>): void;\nuse_current_InterfaceDeclaration_IDirectoryValueChanged(\n get_old_InterfaceDeclaration_IDirectoryValueChanged());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IDirectoryValueChanged\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_IDirectoryValueChanged():\n TypeOnly<current.IDirectoryValueChanged>;\ndeclare function use_old_InterfaceDeclaration_IDirectoryValueChanged(\n use: TypeOnly<old.IDirectoryValueChanged>): void;\nuse_old_InterfaceDeclaration_IDirectoryValueChanged(\n get_current_InterfaceDeclaration_IDirectoryValueChanged());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_ILocalValue\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_ILocalValue():\n TypeOnly<old.ILocalValue>;\ndeclare function use_current_InterfaceDeclaration_ILocalValue(\n use: TypeOnly<current.ILocalValue>): void;\nuse_current_InterfaceDeclaration_ILocalValue(\n get_old_InterfaceDeclaration_ILocalValue());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_ILocalValue\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_ILocalValue():\n TypeOnly<current.ILocalValue>;\ndeclare function use_old_InterfaceDeclaration_ILocalValue(\n use: TypeOnly<old.ILocalValue>): void;\nuse_old_InterfaceDeclaration_ILocalValue(\n get_current_InterfaceDeclaration_ILocalValue());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_ISerializableValue\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_ISerializableValue():\n TypeOnly<old.ISerializableValue>;\ndeclare function use_current_InterfaceDeclaration_ISerializableValue(\n use: TypeOnly<current.ISerializableValue>): void;\nuse_current_InterfaceDeclaration_ISerializableValue(\n get_old_InterfaceDeclaration_ISerializableValue());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_ISerializableValue\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_ISerializableValue():\n TypeOnly<current.ISerializableValue>;\ndeclare function use_old_InterfaceDeclaration_ISerializableValue(\n use: TypeOnly<old.ISerializableValue>): void;\nuse_old_InterfaceDeclaration_ISerializableValue(\n get_current_InterfaceDeclaration_ISerializableValue());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_ISerializedValue\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_ISerializedValue():\n TypeOnly<old.ISerializedValue>;\ndeclare function use_current_InterfaceDeclaration_ISerializedValue(\n use: TypeOnly<current.ISerializedValue>): void;\nuse_current_InterfaceDeclaration_ISerializedValue(\n get_old_InterfaceDeclaration_ISerializedValue());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_ISerializedValue\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_ISerializedValue():\n TypeOnly<current.ISerializedValue>;\ndeclare function use_old_InterfaceDeclaration_ISerializedValue(\n use: TypeOnly<old.ISerializedValue>): void;\nuse_old_InterfaceDeclaration_ISerializedValue(\n get_current_InterfaceDeclaration_ISerializedValue());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_ISharedDirectory\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_ISharedDirectory():\n TypeOnly<old.ISharedDirectory>;\ndeclare function use_current_InterfaceDeclaration_ISharedDirectory(\n use: TypeOnly<current.ISharedDirectory>): void;\nuse_current_InterfaceDeclaration_ISharedDirectory(\n get_old_InterfaceDeclaration_ISharedDirectory());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_ISharedDirectory\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_ISharedDirectory():\n TypeOnly<current.ISharedDirectory>;\ndeclare function use_old_InterfaceDeclaration_ISharedDirectory(\n use: TypeOnly<old.ISharedDirectory>): void;\nuse_old_InterfaceDeclaration_ISharedDirectory(\n get_current_InterfaceDeclaration_ISharedDirectory());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_ISharedDirectoryEvents\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_ISharedDirectoryEvents():\n TypeOnly<old.ISharedDirectoryEvents>;\ndeclare function use_current_InterfaceDeclaration_ISharedDirectoryEvents(\n use: TypeOnly<current.ISharedDirectoryEvents>): void;\nuse_current_InterfaceDeclaration_ISharedDirectoryEvents(\n get_old_InterfaceDeclaration_ISharedDirectoryEvents());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_ISharedDirectoryEvents\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_ISharedDirectoryEvents():\n TypeOnly<current.ISharedDirectoryEvents>;\ndeclare function use_old_InterfaceDeclaration_ISharedDirectoryEvents(\n use: TypeOnly<old.ISharedDirectoryEvents>): void;\nuse_old_InterfaceDeclaration_ISharedDirectoryEvents(\n get_current_InterfaceDeclaration_ISharedDirectoryEvents());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_ISharedMap\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_ISharedMap():\n TypeOnly<old.ISharedMap>;\ndeclare function use_current_InterfaceDeclaration_ISharedMap(\n use: TypeOnly<current.ISharedMap>): void;\nuse_current_InterfaceDeclaration_ISharedMap(\n get_old_InterfaceDeclaration_ISharedMap());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_ISharedMap\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_ISharedMap():\n TypeOnly<current.ISharedMap>;\ndeclare function use_old_InterfaceDeclaration_ISharedMap(\n use: TypeOnly<old.ISharedMap>): void;\nuse_old_InterfaceDeclaration_ISharedMap(\n get_current_InterfaceDeclaration_ISharedMap());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_ISharedMapEvents\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_ISharedMapEvents():\n TypeOnly<old.ISharedMapEvents>;\ndeclare function use_current_InterfaceDeclaration_ISharedMapEvents(\n use: TypeOnly<current.ISharedMapEvents>): void;\nuse_current_InterfaceDeclaration_ISharedMapEvents(\n get_old_InterfaceDeclaration_ISharedMapEvents());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_ISharedMapEvents\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_ISharedMapEvents():\n TypeOnly<current.ISharedMapEvents>;\ndeclare function use_old_InterfaceDeclaration_ISharedMapEvents(\n use: TypeOnly<old.ISharedMapEvents>): void;\nuse_old_InterfaceDeclaration_ISharedMapEvents(\n get_current_InterfaceDeclaration_ISharedMapEvents());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IValueChanged\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_InterfaceDeclaration_IValueChanged():\n TypeOnly<old.IValueChanged>;\ndeclare function use_current_InterfaceDeclaration_IValueChanged(\n use: TypeOnly<current.IValueChanged>): void;\nuse_current_InterfaceDeclaration_IValueChanged(\n get_old_InterfaceDeclaration_IValueChanged());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"InterfaceDeclaration_IValueChanged\": {\"backCompat\": false}\n*/\ndeclare function get_current_InterfaceDeclaration_IValueChanged():\n TypeOnly<current.IValueChanged>;\ndeclare function use_old_InterfaceDeclaration_IValueChanged(\n use: TypeOnly<old.IValueChanged>): void;\nuse_old_InterfaceDeclaration_IValueChanged(\n get_current_InterfaceDeclaration_IValueChanged());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"ClassDeclaration_LocalValueMaker\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_ClassDeclaration_LocalValueMaker():\n TypeOnly<old.LocalValueMaker>;\ndeclare function use_current_ClassDeclaration_LocalValueMaker(\n use: TypeOnly<current.LocalValueMaker>): void;\nuse_current_ClassDeclaration_LocalValueMaker(\n get_old_ClassDeclaration_LocalValueMaker());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"ClassDeclaration_LocalValueMaker\": {\"backCompat\": false}\n*/\ndeclare function get_current_ClassDeclaration_LocalValueMaker():\n TypeOnly<current.LocalValueMaker>;\ndeclare function use_old_ClassDeclaration_LocalValueMaker(\n use: TypeOnly<old.LocalValueMaker>): void;\nuse_old_ClassDeclaration_LocalValueMaker(\n get_current_ClassDeclaration_LocalValueMaker());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"ClassDeclaration_MapFactory\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_ClassDeclaration_MapFactory():\n TypeOnly<old.MapFactory>;\ndeclare function use_current_ClassDeclaration_MapFactory(\n use: TypeOnly<current.MapFactory>): void;\nuse_current_ClassDeclaration_MapFactory(\n get_old_ClassDeclaration_MapFactory());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"ClassDeclaration_MapFactory\": {\"backCompat\": false}\n*/\ndeclare function get_current_ClassDeclaration_MapFactory():\n TypeOnly<current.MapFactory>;\ndeclare function use_old_ClassDeclaration_MapFactory(\n use: TypeOnly<old.MapFactory>): void;\nuse_old_ClassDeclaration_MapFactory(\n get_current_ClassDeclaration_MapFactory());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"ClassDeclaration_SharedDirectory\": {\"forwardCompat\": false}\n*/\ndeclare function get_old_ClassDeclaration_SharedDirectory():\n TypeOnly<old.SharedDirectory>;\ndeclare function use_current_ClassDeclaration_SharedDirectory(\n use: TypeOnly<current.SharedDirectory>): void;\nuse_current_ClassDeclaration_SharedDirectory(\n get_old_ClassDeclaration_SharedDirectory());\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"ClassDeclaration_SharedDirectory\": {\"backCompat\": false}\n*/\ndeclare function get_current_ClassDeclaration_SharedDirectory():\n TypeOnly<current.SharedDirectory>;\ndeclare function use_old_ClassDeclaration_SharedDirectory(\n use: TypeOnly<old.SharedDirectory>): void;\nuse_old_ClassDeclaration_SharedDirectory(\n get_current_ClassDeclaration_SharedDirectory());\n\n/*\n* Validate forward compat by using old type in place of current type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"RemovedClassDeclaration_SharedMap\": {\"forwardCompat\": false}\n*/\n\n/*\n* Validate back compat by using current type in place of old type\n* If breaking change required, add in package.json under typeValidation.broken:\n* \"RemovedClassDeclaration_SharedMap\": {\"backCompat\": false}\n*/\n"]}
|