mobx-keystone-yjs 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -28,37 +28,38 @@
28
28
  function failure(msg) {
29
29
  return new MobxKeystoneYjsError(msg);
30
30
  }
31
- function isJSONPrimitive(v) {
31
+ function isJsonPrimitive(v) {
32
32
  const t = typeof v;
33
33
  return t === "string" || t === "number" || t === "boolean" || v === null;
34
34
  }
35
- function isJSONArray(v) {
35
+ function isJsonArray(v) {
36
36
  return Array.isArray(v);
37
37
  }
38
- function isJSONObject(v) {
39
- return !isJSONArray(v) && typeof v === "object";
38
+ function isJsonObject(v) {
39
+ return !isJsonArray(v) && typeof v === "object";
40
40
  }
41
- function toYDataType(v) {
42
- if (isJSONPrimitive(v)) {
41
+ function convertJsonToYjsData(v) {
42
+ if (v === void 0 || isJsonPrimitive(v)) {
43
43
  return v;
44
- } else if (isJSONArray(v)) {
44
+ }
45
+ if (isJsonArray(v)) {
45
46
  const arr = new Y__namespace.Array();
46
- applyJsonArray(arr, v);
47
+ applyJsonArrayYArray(arr, v);
47
48
  return arr;
48
- } else if (isJSONObject(v)) {
49
+ }
50
+ if (isJsonObject(v)) {
49
51
  const map = new Y__namespace.Map();
50
- applyJsonObject(map, v);
52
+ applyJsonObjectToYMap(map, v);
51
53
  return map;
52
- } else {
53
- return void 0;
54
54
  }
55
+ throw new Error(`unsupported value type: ${v}`);
55
56
  }
56
- function applyJsonArray(dest, source) {
57
- dest.push(source.map(toYDataType));
57
+ function applyJsonArrayYArray(dest, source) {
58
+ dest.push(source.map(convertJsonToYjsData));
58
59
  }
59
- function applyJsonObject(dest, source) {
60
+ function applyJsonObjectToYMap(dest, source) {
60
61
  Object.entries(source).forEach(([k, v]) => {
61
- dest.set(k, toYDataType(v));
62
+ dest.set(k, convertJsonToYjsData(v));
62
63
  });
63
64
  }
64
65
  function applyMobxKeystonePatchToYjsObject(patch, yjs) {
@@ -85,7 +86,7 @@
85
86
  switch (patch.op) {
86
87
  case "add":
87
88
  case "replace": {
88
- yjs.set(key, toYDataType(patch.value));
89
+ yjs.set(key, convertJsonToYjsData(patch.value));
89
90
  break;
90
91
  }
91
92
  case "remove": {
@@ -110,12 +111,12 @@
110
111
  }
111
112
  } else {
112
113
  yjs.delete(Number(key));
113
- yjs.insert(Number(key), [toYDataType(patch.value)]);
114
+ yjs.insert(Number(key), [convertJsonToYjsData(patch.value)]);
114
115
  }
115
116
  break;
116
117
  }
117
118
  case "add": {
118
- yjs.insert(Number(key), [toYDataType(patch.value)]);
119
+ yjs.insert(Number(key), [convertJsonToYjsData(patch.value)]);
119
120
  break;
120
121
  }
121
122
  case "remove": {
@@ -202,7 +203,15 @@
202
203
  return v;
203
204
  }
204
205
  }
206
+ const yjsBindingContext = mobxKeystone.createContext(void 0);
205
207
  function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
208
+ const yjsOrigin = Symbol("bindYjsToMobxKeystoneTransactionOrigin");
209
+ const bindingContext = {
210
+ yjsDoc,
211
+ yjsObject,
212
+ mobxKeystoneType,
213
+ yjsOrigin
214
+ };
206
215
  const yjsJson = yjsObject.toJSON();
207
216
  const initializationGlobalPatches = [];
208
217
  const createBoundObject = () => {
@@ -210,14 +219,15 @@
210
219
  initializationGlobalPatches.push({ target, patches });
211
220
  });
212
221
  try {
213
- return mobxKeystone.fromSnapshot(mobxKeystoneType, yjsJson);
222
+ const boundObject2 = yjsBindingContext.apply(() => mobxKeystone.fromSnapshot(mobxKeystoneType, yjsJson), bindingContext);
223
+ yjsBindingContext.set(boundObject2, bindingContext);
224
+ return boundObject2;
214
225
  } finally {
215
226
  disposeOnGlobalPatches();
216
227
  }
217
228
  };
218
229
  const boundObject = createBoundObject();
219
230
  let applyingMobxKeystoneChanges = 0;
220
- const yjsOrigin = Symbol("bindYjsToMobxKeystoneTransactionOrigin");
221
231
  const observeDeepCb = (events) => {
222
232
  const patches = [];
223
233
  events.forEach((event) => {
@@ -285,7 +295,11 @@
285
295
  };
286
296
  }
287
297
  exports2.MobxKeystoneYjsError = MobxKeystoneYjsError;
298
+ exports2.applyJsonArrayYArray = applyJsonArrayYArray;
299
+ exports2.applyJsonObjectToYMap = applyJsonObjectToYMap;
288
300
  exports2.bindYjsToMobxKeystone = bindYjsToMobxKeystone;
301
+ exports2.convertJsonToYjsData = convertJsonToYjsData;
302
+ exports2.yjsBindingContext = yjsBindingContext;
289
303
  Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
290
304
  });
291
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvZXJyb3IudHMiLCIuLi9zcmMvYmluZGluZy90b1lEYXRhVHlwZS50cyIsIi4uL3NyYy9iaW5kaW5nL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdC50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlcy50cyIsIi4uL3NyYy9iaW5kaW5nL2JpbmRZanNUb01vYnhLZXlzdG9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSBtb2J4LWtleXN0b25lLXlqcyBlcnJvci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNb2J4S2V5c3RvbmVZanNFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xyXG4gICAgc3VwZXIobXNnKVxyXG5cclxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTW9ieEtleXN0b25lWWpzRXJyb3IucHJvdG90eXBlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobXNnOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IE1vYnhLZXlzdG9uZVlqc0Vycm9yKG1zZylcclxufVxyXG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5pbXBvcnQgeyBKU09OVmFsdWUsIEpTT05BcnJheSwgSlNPTk9iamVjdCwgSlNPTlByaW1pdGl2ZSB9IGZyb20gXCIuLi9qc29uVHlwZXNcIlxyXG5cclxuZnVuY3Rpb24gaXNKU09OUHJpbWl0aXZlKHY6IEpTT05WYWx1ZSk6IHYgaXMgSlNPTlByaW1pdGl2ZSB7XHJcbiAgY29uc3QgdCA9IHR5cGVvZiB2XHJcbiAgcmV0dXJuIHQgPT09IFwic3RyaW5nXCIgfHwgdCA9PT0gXCJudW1iZXJcIiB8fCB0ID09PSBcImJvb2xlYW5cIiB8fCB2ID09PSBudWxsXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzSlNPTkFycmF5KHY6IEpTT05WYWx1ZSk6IHYgaXMgSlNPTkFycmF5IHtcclxuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2KVxyXG59XHJcblxyXG5mdW5jdGlvbiBpc0pTT05PYmplY3QodjogSlNPTlZhbHVlKTogdiBpcyBKU09OT2JqZWN0IHtcclxuICByZXR1cm4gIWlzSlNPTkFycmF5KHYpICYmIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0b1lEYXRhVHlwZSh2OiBKU09OVmFsdWUpIHtcclxuICBpZiAoaXNKU09OUHJpbWl0aXZlKHYpKSB7XHJcbiAgICByZXR1cm4gdlxyXG4gIH0gZWxzZSBpZiAoaXNKU09OQXJyYXkodikpIHtcclxuICAgIGNvbnN0IGFyciA9IG5ldyBZLkFycmF5KClcclxuICAgIGFwcGx5SnNvbkFycmF5KGFyciwgdilcclxuICAgIHJldHVybiBhcnJcclxuICB9IGVsc2UgaWYgKGlzSlNPTk9iamVjdCh2KSkge1xyXG4gICAgY29uc3QgbWFwID0gbmV3IFkuTWFwKClcclxuICAgIGFwcGx5SnNvbk9iamVjdChtYXAsIHYpXHJcbiAgICByZXR1cm4gbWFwXHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiB1bmRlZmluZWRcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFwcGx5SnNvbkFycmF5KGRlc3Q6IFkuQXJyYXk8dW5rbm93bj4sIHNvdXJjZTogSlNPTkFycmF5KSB7XHJcbiAgZGVzdC5wdXNoKHNvdXJjZS5tYXAodG9ZRGF0YVR5cGUpKVxyXG59XHJcblxyXG5mdW5jdGlvbiBhcHBseUpzb25PYmplY3QoZGVzdDogWS5NYXA8dW5rbm93bj4sIHNvdXJjZTogSlNPTk9iamVjdCkge1xyXG4gIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XHJcbiAgICBkZXN0LnNldChrLCB0b1lEYXRhVHlwZSh2KSlcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxyXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcclxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgdG9ZRGF0YVR5cGUgfSBmcm9tIFwiLi90b1lEYXRhVHlwZVwiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoOiBQYXRjaCwgeWpzOiB1bmtub3duKTogdm9pZCB7XHJcbiAgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID4gMSkge1xyXG4gICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRjaC5wYXRoXHJcblxyXG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChTdHJpbmcoa2V5KSlcclxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIFlqcyBtYXAgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShwYXRjaCl9YFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoeyAuLi5wYXRjaCwgcGF0aDogcmVzdCB9LCBjaGlsZClcclxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoTnVtYmVyKGtleSkpXHJcbiAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcclxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgYXJyYXkgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcclxuICAgICAgICAgICAgcGF0Y2hcclxuICAgICAgICAgICl9YFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoeyAuLi5wYXRjaCwgcGF0aDogcmVzdCB9LCBjaGlsZClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IGZhaWx1cmUoXHJcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIHVua25vd24gWWpzIG9iamVjdCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KFxyXG4gICAgICAgICAgcGF0Y2hcclxuICAgICAgICApfWBcclxuICAgICAgKVxyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAocGF0Y2gucGF0aC5sZW5ndGggPT09IDEpIHtcclxuICAgIGlmICh5anMgaW5zdGFuY2VvZiBZLk1hcCkge1xyXG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcocGF0Y2gucGF0aFswXSlcclxuXHJcbiAgICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcclxuICAgICAgICBjYXNlIFwiYWRkXCI6XHJcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xyXG4gICAgICAgICAgeWpzLnNldChrZXksIHRvWURhdGFUeXBlKHBhdGNoLnZhbHVlKSlcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xyXG4gICAgICAgICAgeWpzLmRlbGV0ZShrZXkpXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgbWFwYClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgICBjb25zdCBrZXkgPSBwYXRjaC5wYXRoWzBdXHJcblxyXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XHJcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xyXG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJsZW5ndGhcIikge1xyXG4gICAgICAgICAgICBpZiAoeWpzLmxlbmd0aCA+IHBhdGNoLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdG9EZWxldGUgPSB5anMubGVuZ3RoIC0gcGF0Y2gudmFsdWVcclxuICAgICAgICAgICAgICB5anMuZGVsZXRlKHBhdGNoLnZhbHVlLCB0b0RlbGV0ZSlcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh5anMubGVuZ3RoIDwgcGF0Y2gudmFsdWUpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0b0luc2VydCA9IHBhdGNoLnZhbHVlIC0geWpzLmxlbmd0aFxyXG4gICAgICAgICAgICAgIHlqcy5pbnNlcnQoeWpzLmxlbmd0aCwgQXJyYXkodG9JbnNlcnQpLmZpbGwodW5kZWZpbmVkKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcclxuICAgICAgICAgICAgeWpzLmluc2VydChOdW1iZXIoa2V5KSwgW3RvWURhdGFUeXBlKHBhdGNoLnZhbHVlKV0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXNlIFwiYWRkXCI6IHtcclxuICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFt0b1lEYXRhVHlwZShwYXRjaC52YWx1ZSldKVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XHJcbiAgICAgICAgICB5anMuZGVsZXRlKE51bWJlcihrZXkpKVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIGFycmF5YClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IGZhaWx1cmUoXHJcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwgdGhlIFlqcyBvYmplY3QgaXMgb2YgYW4gdW5rb3duIHR5cGUsIHNvIGtleSBcIiR7cGF0Y2gucGF0aFswXX1cIiBjYW5ub3QgYmUgZm91bmQgaW4gaXRgXHJcbiAgICAgIClcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBwYXRoLCBpdCBjYW5ub3QgYmUgZW1wdHlgKVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcclxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgSlNPTkFycmF5LCBKU09OT2JqZWN0LCBKU09OVmFsdWUgfSBmcm9tIFwiLi4vanNvblR5cGVzXCJcclxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50OiBZLllFdmVudDxhbnk+KTogUGF0Y2hbXSB7XHJcbiAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXHJcblxyXG4gIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWU1hcEV2ZW50KSB7XHJcbiAgICBjb25zdCBzb3VyY2UgPSBldmVudC50YXJnZXQgYXMgWS5NYXA8YW55PlxyXG5cclxuICAgIGV2ZW50LmNoYW5nZXMua2V5cy5mb3JFYWNoKChjaGFuZ2UsIGtleSkgPT4ge1xyXG4gICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIGtleV1cclxuXHJcbiAgICAgIHN3aXRjaCAoY2hhbmdlLmFjdGlvbikge1xyXG4gICAgICAgIGNhc2UgXCJhZGRcIjpcclxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgY2FzZSBcInVwZGF0ZVwiOlxyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgY2FzZSBcImRlbGV0ZVwiOlxyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXHJcbiAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHRocm93IGZhaWx1cmUoYHVuc3VwcG9ydGVkIFlqcyBtYXAgZXZlbnQgYWN0aW9uOiAke2NoYW5nZS5hY3Rpb259YClcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZQXJyYXlFdmVudCkge1xyXG4gICAgbGV0IHJldGFpbiA9IDBcclxuICAgIGV2ZW50LmNoYW5nZXMuZGVsdGEuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XHJcbiAgICAgIGlmIChjaGFuZ2UucmV0YWluKSB7XHJcbiAgICAgICAgcmV0YWluICs9IGNoYW5nZS5yZXRhaW5cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNoYW5nZS5kZWxldGUpIHtcclxuICAgICAgICAvLyByZW1vdmUgWCBpdGVtcyBhdCByZXRhaW4gcG9zaXRpb25cclxuICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZS5kZWxldGU7IGkrKykge1xyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXHJcbiAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNoYW5nZS5pbnNlcnQpIHtcclxuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGNoYW5nZS5pbnNlcnQpID8gY2hhbmdlLmluc2VydCA6IFtjaGFuZ2UuaW5zZXJ0XVxyXG4gICAgICAgIG5ld1ZhbHVlcy5mb3JFYWNoKCh2KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cclxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHYpLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHJldGFpbisrXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHJldHVybiBwYXRjaGVzXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRvUGxhaW5WYWx1ZSh2OiBZLk1hcDxhbnk+IHwgWS5BcnJheTxhbnk+IHwgSlNPTlZhbHVlKSB7XHJcbiAgaWYgKHYgaW5zdGFuY2VvZiBZLk1hcCB8fCB2IGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgcmV0dXJuIHYudG9KU09OKCkgYXMgSlNPTk9iamVjdCB8IEpTT05BcnJheVxyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gdlxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQge1xyXG4gIEFueURhdGFNb2RlbCxcclxuICBBbnlNb2RlbCxcclxuICBBbnlTdGFuZGFyZFR5cGUsXHJcbiAgTW9kZWxDbGFzcyxcclxuICBQYXRjaCxcclxuICBUeXBlVG9EYXRhLFxyXG4gIGFwcGx5UGF0Y2hlcyxcclxuICBmcm9tU25hcHNob3QsXHJcbiAgZ2V0UGFyZW50VG9DaGlsZFBhdGgsXHJcbiAgb25HbG9iYWxQYXRjaGVzLFxyXG4gIG9uUGF0Y2hlcyxcclxuICBvblNuYXBzaG90LFxyXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcclxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0IH0gZnJvbSBcIi4vYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0XCJcclxuaW1wb3J0IHsgY29udmVydFlqc0V2ZW50VG9QYXRjaGVzIH0gZnJvbSBcIi4vY29udmVydFlqc0V2ZW50VG9QYXRjaGVzXCJcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBiaW5kWWpzVG9Nb2J4S2V5c3RvbmU8XHJcbiAgVFR5cGUgZXh0ZW5kcyBBbnlTdGFuZGFyZFR5cGUgfCBNb2RlbENsYXNzPEFueU1vZGVsPiB8IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPixcclxuPih7XHJcbiAgeWpzRG9jLFxyXG4gIHlqc09iamVjdCxcclxuICBtb2J4S2V5c3RvbmVUeXBlLFxyXG59OiB7XHJcbiAgeWpzRG9jOiBZLkRvY1xyXG4gIHlqc09iamVjdDogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+XHJcbiAgbW9ieEtleXN0b25lVHlwZTogVFR5cGVcclxufSk6IHtcclxuICBib3VuZE9iamVjdDogVHlwZVRvRGF0YTxUVHlwZT5cclxuICBkaXNwb3NlKCk6IHZvaWRcclxuICB5anNPcmlnaW46IHN5bWJvbFxyXG59IHtcclxuICBjb25zdCB5anNKc29uID0geWpzT2JqZWN0LnRvSlNPTigpXHJcblxyXG4gIGNvbnN0IGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlczogeyB0YXJnZXQ6IG9iamVjdDsgcGF0Y2hlczogUGF0Y2hbXSB9W10gPSBbXVxyXG5cclxuICBjb25zdCBjcmVhdGVCb3VuZE9iamVjdCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMgPSBvbkdsb2JhbFBhdGNoZXMoKHRhcmdldCwgcGF0Y2hlcykgPT4ge1xyXG4gICAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMucHVzaCh7IHRhcmdldCwgcGF0Y2hlcyB9KVxyXG4gICAgfSlcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gZnJvbVNuYXBzaG90KG1vYnhLZXlzdG9uZVR5cGUsIHlqc0pzb24gYXMgYW55KVxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgZGlzcG9zZU9uR2xvYmFsUGF0Y2hlcygpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdCBib3VuZE9iamVjdCA9IGNyZWF0ZUJvdW5kT2JqZWN0KClcclxuXHJcbiAgbGV0IGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcyA9IDBcclxuICBjb25zdCB5anNPcmlnaW4gPSBTeW1ib2woXCJiaW5kWWpzVG9Nb2J4S2V5c3RvbmVUcmFuc2FjdGlvbk9yaWdpblwiKVxyXG5cclxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20geWpzIHRvIG1vYngta2V5c3RvbmVcclxuICBjb25zdCBvYnNlcnZlRGVlcENiID0gKGV2ZW50czogWS5ZRXZlbnQ8YW55PltdKSA9PiB7XHJcbiAgICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cclxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQudHJhbnNhY3Rpb24ub3JpZ2luICE9PSB5anNPcmlnaW4pIHtcclxuICAgICAgICBwYXRjaGVzLnB1c2goLi4uY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50KSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICBpZiAocGF0Y2hlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcysrXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXBwbHlQYXRjaGVzKGJvdW5kT2JqZWN0LCBwYXRjaGVzKVxyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcy0tXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHlqc09iamVjdC5vYnNlcnZlRGVlcChvYnNlcnZlRGVlcENiKVxyXG5cclxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20gbW9ieC1rZXlzdG9uZSB0byB5anNcclxuICBsZXQgcGVuZGluZ1BhdGNoZXM6IFBhdGNoW10gPSBbXVxyXG4gIGNvbnN0IGRpc3Bvc2VPblBhdGNoZXMgPSBvblBhdGNoZXMoYm91bmRPYmplY3QsIChwYXRjaGVzKSA9PiB7XHJcbiAgICBpZiAoYXBwbHlpbmdNb2J4S2V5c3RvbmVDaGFuZ2VzID4gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBwZW5kaW5nUGF0Y2hlcy5wdXNoKC4uLnBhdGNoZXMpXHJcbiAgfSlcclxuXHJcbiAgLy8gdGhpcyBpcyBvbmx5IHVzZWQgc28gd2UgY2FuIHRyYW5zYWN0IGFsbCBwYXRjaGVzIHRvIHRoZSBzbmFwc2hvdCBib3VuZGFyeVxyXG4gIGNvbnN0IGRpc3Bvc2VPblNuYXBzaG90ID0gb25TbmFwc2hvdChib3VuZE9iamVjdCwgKCkgPT4ge1xyXG4gICAgaWYgKHBlbmRpbmdQYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwYXRjaGVzID0gcGVuZGluZ1BhdGNoZXNcclxuICAgIHBlbmRpbmdQYXRjaGVzID0gW11cclxuXHJcbiAgICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xyXG4gICAgICBwYXRjaGVzLmZvckVhY2goKHBhdGNoKSA9PiB7XHJcbiAgICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoLCB5anNPYmplY3QpXHJcbiAgICAgIH0pXHJcbiAgICB9LCB5anNPcmlnaW4pXHJcbiAgfSlcclxuXHJcbiAgLy8gc3luYyBpbml0aWFsIHBhdGNoZXMsIHRoYXQgbWlnaHQgaW5jbHVkZSBzZXR0aW5nIGRlZmF1bHRzLCBJRHMsIGV0Y1xyXG4gIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XHJcbiAgICAvLyB3ZSBuZWVkIHRvIHNraXAgaW5pdGlhbGl6YXRpb25zIHVudGlsIHdlIGhpdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGJvdW5kIG9iamVjdFxyXG4gICAgLy8gdGhpcyBpcyBiZWNhdXNlIGRlZmF1bHQgb2JqZWN0cyBtaWdodCBiZSBjcmVhdGVkIGFuZCBpbml0aWFsaXplZCBiZWZvcmUgdGhlIG1haW4gb2JqZWN0XHJcbiAgICAvLyBidXQgd2UganVzdCBuZWVkIHRvIGNhdGNoIHdoZW4gdGhvc2UgYXJlIGFjdHVhbGx5IGFzc2lnbmVkIHRvIHRoZSBib3VuZCBvYmplY3RcclxuICAgIGxldCBib3VuZE9iamVjdEZvdW5kID0gZmFsc2VcclxuXHJcbiAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMuZm9yRWFjaCgoeyB0YXJnZXQsIHBhdGNoZXMgfSkgPT4ge1xyXG4gICAgICBpZiAoIWJvdW5kT2JqZWN0Rm91bmQpIHtcclxuICAgICAgICBpZiAodGFyZ2V0ICE9PSBib3VuZE9iamVjdCkge1xyXG4gICAgICAgICAgcmV0dXJuIC8vIHNraXBcclxuICAgICAgICB9XHJcbiAgICAgICAgYm91bmRPYmplY3RGb3VuZCA9IHRydWVcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcGFyZW50VG9DaGlsZFBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChib3VuZE9iamVjdCwgdGFyZ2V0KVxyXG4gICAgICAvLyB0aGlzIGlzIHVuZGVmaW5lZCBvbmx5IGlmIHRhcmdldCBpcyBub3QgYSBjaGlsZCBvZiBib3VuZE1vZGVsXHJcbiAgICAgIGlmIChwYXJlbnRUb0NoaWxkUGF0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xyXG4gICAgICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgLi4ucGF0Y2gsXHJcbiAgICAgICAgICAgICAgcGF0aDogWy4uLnBhcmVudFRvQ2hpbGRQYXRoLCAuLi5wYXRjaC5wYXRoXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgeWpzT2JqZWN0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9LCB5anNPcmlnaW4pXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBib3VuZE9iamVjdCxcclxuICAgIGRpc3Bvc2U6ICgpID0+IHtcclxuICAgICAgZGlzcG9zZU9uUGF0Y2hlcygpXHJcbiAgICAgIGRpc3Bvc2VPblNuYXBzaG90KClcclxuICAgICAgeWpzT2JqZWN0LnVub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcclxuICAgIH0sXHJcbiAgICB5anNPcmlnaW4sXHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6WyJZIiwib25HbG9iYWxQYXRjaGVzIiwiZnJvbVNuYXBzaG90IiwiYXBwbHlQYXRjaGVzIiwib25QYXRjaGVzIiwib25TbmFwc2hvdCIsImdldFBhcmVudFRvQ2hpbGRQYXRoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFHTSxNQUFPLDZCQUE2QixNQUFLO0FBQUEsSUFDN0MsWUFBWSxL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
305
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvZXJyb3IudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0SnNvblRvWWpzRGF0YS50cyIsIi4uL3NyYy9iaW5kaW5nL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdC50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlcy50cyIsIi4uL3NyYy9iaW5kaW5nL3lqc0JpbmRpbmdDb250ZXh0LnRzIiwiLi4vc3JjL2JpbmRpbmcvYmluZFlqc1RvTW9ieEtleXN0b25lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBBIG1vYngta2V5c3RvbmUteWpzIGVycm9yLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1vYnhLZXlzdG9uZVlqc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nKSB7XHJcbiAgICBzdXBlcihtc2cpXHJcblxyXG4gICAgLy8gU2V0IHRoZSBwcm90b3R5cGUgZXhwbGljaXRseS5cclxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBNb2J4S2V5c3RvbmVZanNFcnJvci5wcm90b3R5cGUpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmFpbHVyZShtc2c6IHN0cmluZykge1xyXG4gIHJldHVybiBuZXcgTW9ieEtleXN0b25lWWpzRXJyb3IobXNnKVxyXG59XHJcbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBKc29uVmFsdWUsIEpzb25BcnJheSwgSnNvbk9iamVjdCwgSnNvblByaW1pdGl2ZSB9IGZyb20gXCIuLi9qc29uVHlwZXNcIlxuXG5mdW5jdGlvbiBpc0pzb25QcmltaXRpdmUodjogSnNvblZhbHVlKTogdiBpcyBKc29uUHJpbWl0aXZlIHtcbiAgY29uc3QgdCA9IHR5cGVvZiB2XG4gIHJldHVybiB0ID09PSBcInN0cmluZ1wiIHx8IHQgPT09IFwibnVtYmVyXCIgfHwgdCA9PT0gXCJib29sZWFuXCIgfHwgdiA9PT0gbnVsbFxufVxuXG5mdW5jdGlvbiBpc0pzb25BcnJheSh2OiBKc29uVmFsdWUpOiB2IGlzIEpzb25BcnJheSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHYpXG59XG5cbmZ1bmN0aW9uIGlzSnNvbk9iamVjdCh2OiBKc29uVmFsdWUpOiB2IGlzIEpzb25PYmplY3Qge1xuICByZXR1cm4gIWlzSnNvbkFycmF5KHYpICYmIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0SnNvblRvWWpzRGF0YSh2OiBKc29uVmFsdWUpIHtcbiAgaWYgKHYgPT09IHVuZGVmaW5lZCB8fCBpc0pzb25QcmltaXRpdmUodikpIHtcbiAgICByZXR1cm4gdlxuICB9XG5cbiAgaWYgKGlzSnNvbkFycmF5KHYpKSB7XG4gICAgY29uc3QgYXJyID0gbmV3IFkuQXJyYXkoKVxuICAgIGFwcGx5SnNvbkFycmF5WUFycmF5KGFyciwgdilcbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICBpZiAoaXNKc29uT2JqZWN0KHYpKSB7XG4gICAgY29uc3QgbWFwID0gbmV3IFkuTWFwKClcbiAgICBhcHBseUpzb25PYmplY3RUb1lNYXAobWFwLCB2KVxuICAgIHJldHVybiBtYXBcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgdmFsdWUgdHlwZTogJHt2fWApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUpzb25BcnJheVlBcnJheShkZXN0OiBZLkFycmF5PHVua25vd24+LCBzb3VyY2U6IEpzb25BcnJheSkge1xuICBkZXN0LnB1c2goc291cmNlLm1hcChjb252ZXJ0SnNvblRvWWpzRGF0YSkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUpzb25PYmplY3RUb1lNYXAoZGVzdDogWS5NYXA8dW5rbm93bj4sIHNvdXJjZTogSnNvbk9iamVjdCkge1xuICBPYmplY3QuZW50cmllcyhzb3VyY2UpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgIGRlc3Quc2V0KGssIGNvbnZlcnRKc29uVG9ZanNEYXRhKHYpKVxuICB9KVxufVxuIiwiaW1wb3J0IHsgUGF0Y2ggfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBjb252ZXJ0SnNvblRvWWpzRGF0YSB9IGZyb20gXCIuL2NvbnZlcnRKc29uVG9ZanNEYXRhXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaDogUGF0Y2gsIHlqczogdW5rbm93bik6IHZvaWQge1xuICBpZiAocGF0Y2gucGF0aC5sZW5ndGggPiAxKSB7XG4gICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRjaC5wYXRoXG5cbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChTdHJpbmcoa2V5KSlcbiAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIFlqcyBtYXAgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShwYXRjaCl9YFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoeyAuLi5wYXRjaCwgcGF0aDogcmVzdCB9LCBjaGlsZClcbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChOdW1iZXIoa2V5KSlcbiAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIFlqcyBhcnJheSAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgcGF0Y2hcbiAgICAgICAgICApfWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiB1bmtub3duIFlqcyBvYmplY3QgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBwYXRjaFxuICAgICAgICApfWBcbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSBpZiAocGF0Y2gucGF0aC5sZW5ndGggPT09IDEpIHtcbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwYXRjaC5wYXRoWzBdKVxuXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XG4gICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xuICAgICAgICAgIHlqcy5zZXQoa2V5LCBjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICB5anMuZGVsZXRlKGtleSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgbWFwYClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgY29uc3Qga2V5ID0gcGF0Y2gucGF0aFswXVxuXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSBcImxlbmd0aFwiKSB7XG4gICAgICAgICAgICBpZiAoeWpzLmxlbmd0aCA+IHBhdGNoLnZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvRGVsZXRlID0geWpzLmxlbmd0aCAtIHBhdGNoLnZhbHVlXG4gICAgICAgICAgICAgIHlqcy5kZWxldGUocGF0Y2gudmFsdWUsIHRvRGVsZXRlKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh5anMubGVuZ3RoIDwgcGF0Y2gudmFsdWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgdG9JbnNlcnQgPSBwYXRjaC52YWx1ZSAtIHlqcy5sZW5ndGhcbiAgICAgICAgICAgICAgeWpzLmluc2VydCh5anMubGVuZ3RoLCBBcnJheSh0b0luc2VydCkuZmlsbCh1bmRlZmluZWQpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB5anMuZGVsZXRlKE51bWJlcihrZXkpKVxuICAgICAgICAgICAgeWpzLmluc2VydChOdW1iZXIoa2V5KSwgW2NvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlKV0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImFkZFwiOiB7XG4gICAgICAgICAgeWpzLmluc2VydChOdW1iZXIoa2V5KSwgW2NvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlKV0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICB5anMuZGVsZXRlKE51bWJlcihrZXkpKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBhcnJheWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwgdGhlIFlqcyBvYmplY3QgaXMgb2YgYW4gdW5rb3duIHR5cGUsIHNvIGtleSBcIiR7cGF0Y2gucGF0aFswXX1cIiBjYW5ub3QgYmUgZm91bmQgaW4gaXRgXG4gICAgICApXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggcGF0aCwgaXQgY2Fubm90IGJlIGVtcHR5YClcbiAgfVxufVxuIiwiaW1wb3J0IHsgUGF0Y2ggfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgSnNvbkFycmF5LCBKc29uT2JqZWN0LCBKc29uVmFsdWUgfSBmcm9tIFwiLi4vanNvblR5cGVzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50OiBZLllFdmVudDxhbnk+KTogUGF0Y2hbXSB7XG4gIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuXG4gIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWU1hcEV2ZW50KSB7XG4gICAgY29uc3Qgc291cmNlID0gZXZlbnQudGFyZ2V0IGFzIFkuTWFwPGFueT5cblxuICAgIGV2ZW50LmNoYW5nZXMua2V5cy5mb3JFYWNoKChjaGFuZ2UsIGtleSkgPT4ge1xuICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCBrZXldXG5cbiAgICAgIHN3aXRjaCAoY2hhbmdlLmFjdGlvbikge1xuICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUoc291cmNlLmdldChrZXkpKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBcInVwZGF0ZVwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZXBsYWNlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZShzb3VyY2UuZ2V0KGtleSkpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIFwiZGVsZXRlXCI6XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBZanMgbWFwIGV2ZW50IGFjdGlvbjogJHtjaGFuZ2UuYWN0aW9ufWApXG4gICAgICB9XG4gICAgfSlcbiAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWUFycmF5RXZlbnQpIHtcbiAgICBsZXQgcmV0YWluID0gMFxuICAgIGV2ZW50LmNoYW5nZXMuZGVsdGEuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XG4gICAgICBpZiAoY2hhbmdlLnJldGFpbikge1xuICAgICAgICByZXRhaW4gKz0gY2hhbmdlLnJldGFpblxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlLmRlbGV0ZSkge1xuICAgICAgICAvLyByZW1vdmUgWCBpdGVtcyBhdCByZXRhaW4gcG9zaXRpb25cbiAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCByZXRhaW5dXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlLmRlbGV0ZTsgaSsrKSB7XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2UuaW5zZXJ0KSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IEFycmF5LmlzQXJyYXkoY2hhbmdlLmluc2VydCkgPyBjaGFuZ2UuaW5zZXJ0IDogW2NoYW5nZS5pbnNlcnRdXG4gICAgICAgIG5ld1ZhbHVlcy5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCByZXRhaW5dXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUodiksXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXRhaW4rK1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gcGF0Y2hlc1xufVxuXG5mdW5jdGlvbiB0b1BsYWluVmFsdWUodjogWS5NYXA8YW55PiB8IFkuQXJyYXk8YW55PiB8IEpzb25WYWx1ZSkge1xuICBpZiAodiBpbnN0YW5jZW9mIFkuTWFwIHx8IHYgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgcmV0dXJuIHYudG9KU09OKCkgYXMgSnNvbk9iamVjdCB8IEpzb25BcnJheVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB2XG4gIH1cbn1cbiIsImltcG9ydCB7IEFueVR5cGUsIGNyZWF0ZUNvbnRleHQgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFlqc0JpbmRpbmdDb250ZXh0IHtcbiAgeWpzRG9jOiBZLkRvY1xuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxuICBtb2J4S2V5c3RvbmVUeXBlOiBBbnlUeXBlXG4gIHlqc09yaWdpbjogc3ltYm9sXG59XG5cbmV4cG9ydCBjb25zdCB5anNCaW5kaW5nQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8WWpzQmluZGluZ0NvbnRleHQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbiIsImltcG9ydCB7XG4gIEFueURhdGFNb2RlbCxcbiAgQW55TW9kZWwsXG4gIEFueVN0YW5kYXJkVHlwZSxcbiAgTW9kZWxDbGFzcyxcbiAgUGF0Y2gsXG4gIFR5cGVUb0RhdGEsXG4gIGFwcGx5UGF0Y2hlcyxcbiAgZnJvbVNuYXBzaG90LFxuICBnZXRQYXJlbnRUb0NoaWxkUGF0aCxcbiAgb25HbG9iYWxQYXRjaGVzLFxuICBvblBhdGNoZXMsXG4gIG9uU25hcHNob3QsXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QgfSBmcm9tIFwiLi9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3RcIlxuaW1wb3J0IHsgY29udmVydFlqc0V2ZW50VG9QYXRjaGVzIH0gZnJvbSBcIi4vY29udmVydFlqc0V2ZW50VG9QYXRjaGVzXCJcbmltcG9ydCB7IFlqc0JpbmRpbmdDb250ZXh0LCB5anNCaW5kaW5nQ29udGV4dCB9IGZyb20gXCIuL3lqc0JpbmRpbmdDb250ZXh0XCJcblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRZanNUb01vYnhLZXlzdG9uZTxcbiAgVFR5cGUgZXh0ZW5kcyBBbnlTdGFuZGFyZFR5cGUgfCBNb2RlbENsYXNzPEFueU1vZGVsPiB8IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPixcbj4oe1xuICB5anNEb2MsXG4gIHlqc09iamVjdCxcbiAgbW9ieEtleXN0b25lVHlwZSxcbn06IHtcbiAgeWpzRG9jOiBZLkRvY1xuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxuICBtb2J4S2V5c3RvbmVUeXBlOiBUVHlwZVxufSk6IHtcbiAgYm91bmRPYmplY3Q6IFR5cGVUb0RhdGE8VFR5cGU+XG4gIGRpc3Bvc2UoKTogdm9pZFxuICB5anNPcmlnaW46IHN5bWJvbFxufSB7XG4gIGNvbnN0IHlqc09yaWdpbiA9IFN5bWJvbChcImJpbmRZanNUb01vYnhLZXlzdG9uZVRyYW5zYWN0aW9uT3JpZ2luXCIpXG5cbiAgY29uc3QgYmluZGluZ0NvbnRleHQ6IFlqc0JpbmRpbmdDb250ZXh0ID0ge1xuICAgIHlqc0RvYyxcbiAgICB5anNPYmplY3QsXG4gICAgbW9ieEtleXN0b25lVHlwZSxcbiAgICB5anNPcmlnaW4sXG4gIH1cblxuICBjb25zdCB5anNKc29uID0geWpzT2JqZWN0LnRvSlNPTigpXG5cbiAgY29uc3QgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzOiB7IHRhcmdldDogb2JqZWN0OyBwYXRjaGVzOiBQYXRjaFtdIH1bXSA9IFtdXG5cbiAgY29uc3QgY3JlYXRlQm91bmRPYmplY3QgPSAoKSA9PiB7XG4gICAgY29uc3QgZGlzcG9zZU9uR2xvYmFsUGF0Y2hlcyA9IG9uR2xvYmFsUGF0Y2hlcygodGFyZ2V0LCBwYXRjaGVzKSA9PiB7XG4gICAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMucHVzaCh7IHRhcmdldCwgcGF0Y2hlcyB9KVxuICAgIH0pXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYm91bmRPYmplY3QgPSB5anNCaW5kaW5nQ29udGV4dC5hcHBseShcbiAgICAgICAgKCkgPT4gZnJvbVNuYXBzaG90KG1vYnhLZXlzdG9uZVR5cGUsIHlqc0pzb24gYXMgYW55KSxcbiAgICAgICAgYmluZGluZ0NvbnRleHRcbiAgICAgIClcbiAgICAgIHlqc0JpbmRpbmdDb250ZXh0LnNldChib3VuZE9iamVjdCwgYmluZGluZ0NvbnRleHQpXG4gICAgICByZXR1cm4gYm91bmRPYmplY3RcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZGlzcG9zZU9uR2xvYmFsUGF0Y2hlcygpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYm91bmRPYmplY3QgPSBjcmVhdGVCb3VuZE9iamVjdCgpXG5cbiAgbGV0IGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcyA9IDBcblxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20geWpzIHRvIG1vYngta2V5c3RvbmVcbiAgY29uc3Qgb2JzZXJ2ZURlZXBDYiA9IChldmVudHM6IFkuWUV2ZW50PGFueT5bXSkgPT4ge1xuICAgIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRyYW5zYWN0aW9uLm9yaWdpbiAhPT0geWpzT3JpZ2luKSB7XG4gICAgICAgIHBhdGNoZXMucHVzaCguLi5jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMoZXZlbnQpKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAocGF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICBhcHBseWluZ01vYnhLZXlzdG9uZUNoYW5nZXMrK1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXBwbHlQYXRjaGVzKGJvdW5kT2JqZWN0LCBwYXRjaGVzKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXBwbHlpbmdNb2J4S2V5c3RvbmVDaGFuZ2VzLS1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB5anNPYmplY3Qub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcblxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20gbW9ieC1rZXlzdG9uZSB0byB5anNcbiAgbGV0IHBlbmRpbmdQYXRjaGVzOiBQYXRjaFtdID0gW11cbiAgY29uc3QgZGlzcG9zZU9uUGF0Y2hlcyA9IG9uUGF0Y2hlcyhib3VuZE9iamVjdCwgKHBhdGNoZXMpID0+IHtcbiAgICBpZiAoYXBwbHlpbmdNb2J4S2V5c3RvbmVDaGFuZ2VzID4gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcGVuZGluZ1BhdGNoZXMucHVzaCguLi5wYXRjaGVzKVxuICB9KVxuXG4gIC8vIHRoaXMgaXMgb25seSB1c2VkIHNvIHdlIGNhbiB0cmFuc2FjdCBhbGwgcGF0Y2hlcyB0byB0aGUgc25hcHNob3QgYm91bmRhcnlcbiAgY29uc3QgZGlzcG9zZU9uU25hcHNob3QgPSBvblNuYXBzaG90KGJvdW5kT2JqZWN0LCAoKSA9PiB7XG4gICAgaWYgKHBlbmRpbmdQYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcGF0Y2hlcyA9IHBlbmRpbmdQYXRjaGVzXG4gICAgcGVuZGluZ1BhdGNoZXMgPSBbXVxuXG4gICAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgIHBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoLCB5anNPYmplY3QpXG4gICAgICB9KVxuICAgIH0sIHlqc09yaWdpbilcbiAgfSlcblxuICAvLyBzeW5jIGluaXRpYWwgcGF0Y2hlcywgdGhhdCBtaWdodCBpbmNsdWRlIHNldHRpbmcgZGVmYXVsdHMsIElEcywgZXRjXG4gIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgLy8gd2UgbmVlZCB0byBza2lwIGluaXRpYWxpemF0aW9ucyB1bnRpbCB3ZSBoaXQgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBib3VuZCBvYmplY3RcbiAgICAvLyB0aGlzIGlzIGJlY2F1c2UgZGVmYXVsdCBvYmplY3RzIG1pZ2h0IGJlIGNyZWF0ZWQgYW5kIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgbWFpbiBvYmplY3RcbiAgICAvLyBidXQgd2UganVzdCBuZWVkIHRvIGNhdGNoIHdoZW4gdGhvc2UgYXJlIGFjdHVhbGx5IGFzc2lnbmVkIHRvIHRoZSBib3VuZCBvYmplY3RcbiAgICBsZXQgYm91bmRPYmplY3RGb3VuZCA9IGZhbHNlXG5cbiAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMuZm9yRWFjaCgoeyB0YXJnZXQsIHBhdGNoZXMgfSkgPT4ge1xuICAgICAgaWYgKCFib3VuZE9iamVjdEZvdW5kKSB7XG4gICAgICAgIGlmICh0YXJnZXQgIT09IGJvdW5kT2JqZWN0KSB7XG4gICAgICAgICAgcmV0dXJuIC8vIHNraXBcbiAgICAgICAgfVxuICAgICAgICBib3VuZE9iamVjdEZvdW5kID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnRUb0NoaWxkUGF0aCA9IGdldFBhcmVudFRvQ2hpbGRQYXRoKGJvdW5kT2JqZWN0LCB0YXJnZXQpXG4gICAgICAvLyB0aGlzIGlzIHVuZGVmaW5lZCBvbmx5IGlmIHRhcmdldCBpcyBub3QgYSBjaGlsZCBvZiBib3VuZE1vZGVsXG4gICAgICBpZiAocGFyZW50VG9DaGlsZFBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXRjaGVzLmZvckVhY2goKHBhdGNoKSA9PiB7XG4gICAgICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAuLi5wYXRjaCxcbiAgICAgICAgICAgICAgcGF0aDogWy4uLnBhcmVudFRvQ2hpbGRQYXRoLCAuLi5wYXRjaC5wYXRoXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB5anNPYmplY3RcbiAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfSwgeWpzT3JpZ2luKVxuXG4gIHJldHVybiB7XG4gICAgYm91bmRPYmplY3QsXG4gICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgZGlzcG9zZU9uUGF0Y2hlcygpXG4gICAgICBkaXNwb3NlT25TbmFwc2hvdCgpXG4gICAgICB5anNPYmplY3QudW5vYnNlcnZlRGVlcChvYnNlcnZlRGVlcENiKVxuICAgIH0sXG4gICAgeWpzT3JpZ2luLFxuICB9XG59XG4iXSwibmFtZXMiOlsiWSIsImNyZWF0ZUNvbnRleHQiLCJvbkdsb2JhbFBhdGNoZXMiLCJib3VuZE9iamVjdCIsImZyb21TbmFwc2hvdCIsImFwcGx5UGF0Y2hlcyIsIm9uUGF0Y2hlcyIsIm9uU25hcHNob3QiLCJnZXRQYXJlbnRUb0NoaWxkUGF0aCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBR00sTUFBTyw2QkFBNkIsTUFBSztBQUFBLElBQzdDLFlBQVksS0FBVztBQUNyQixZQUFNLEdBQUc7QUFHRixhQUFBLGVBQWUsTUFBTSxxQkFBcUIsU0FBUztBQUFBLElBQzVEO0FBQUEsRUFDRDtBQUtLLFdBQVUsUUFBUSxLQUFXO0FBQzFCLFdBQUEsSUFBSSxxQkFBcUIsR0FBRztBQUFBLEVBQ3JDO0FDZEEsV0FBUyxnQkFBZ0IsR0FBWTtBQUNuQyxVQUFNLElBQUksT0FBTztBQUNqQixXQUFPLE1BQU0sWUFBWSxNQUFNLFlBQVksTUFBTSxhQUFhLE1BQU07QUFBQSxFQUN0RTtBQUVBLFdBQVMsWUFBWSxHQUFZO0FBQ3hCLFdBQUEsTUFBTSxRQUFRLENBQUM7QUFBQSxFQUN4QjtBQUVBLFdBQVMsYUFBYSxHQUFZO0FBQ2hDLFdBQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxPQUFPLE1BQU07QUFBQSxFQUN6QztBQUVNLFdBQVUscUJBQXFCLEdBQVk7QUFDL0MsUUFBSSxNQUFNLFVBQWEsZ0JBQWdCLENBQUMsR0FBRztBQUNsQyxhQUFBO0FBQUEsSUFDVDtBQUVJLFFBQUEsWUFBWSxDQUFDLEdBQUc7QUFDWixZQUFBLE1BQU0sSUFBSUEsYUFBRTtBQUNsQiwyQkFBcUIsS0FBSyxDQUFDO0FBQ3BCLGFBQUE7QUFBQSxJQUNUO0FBRUksUUFBQSxhQUFhLENBQUMsR0FBRztBQUNiLFlBQUEsTUFBTSxJQUFJQSxhQUFFO0FBQ2xCLDRCQUFzQixLQUFLLENBQUM7QUFDckIsYUFBQTtBQUFBLElBQ1Q7QUFFQSxVQUFNLElBQUksTUFBTSwyQkFBMkIsQ0FBQyxFQUFFO0FBQUEsRUFDaEQ7QUFFZ0IsV0FBQSxxQkFBcUIsTUFBd0IsUUFBaUI7QUFDNUUsU0FBSyxLQUFLLE9BQU8sSUFBSSxvQkFBb0IsQ0FBQztBQUFBLEVBQzVDO0FBRWdCLFdBQUEsc0JBQXNCLE1BQXNCLFFBQWtCO0FBQ3JFLFdBQUEsUUFBUSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQUs7QUFDeEMsV0FBSyxJQUFJLEdBQUcscUJBQXFCLENBQUMsQ0FBQztBQUFBLElBQUEsQ0FDcEM7QUFBQSxFQUNIO0FDdkNnQixXQUFBLGtDQUFrQyxPQUFjLEtBQVk7QUFDdEUsUUFBQSxNQUFNLEtBQUssU0FBUyxHQUFHO0FBQ3pCLFlBQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLE1BQU07QUFFekIsVUFBQSxlQUFlQSxhQUFFLEtBQUs7QUFDeEIsY0FBTSxRQUFRLElBQUksSUFBSSxPQUFPLEdBQUcsQ0FBQztBQUNqQyxZQUFJLFVBQVUsUUFBVztBQUNqQixnQkFBQSxRQUNKLDRCQUE0QixHQUFHLG1DQUFtQyxLQUFLLFVBQVUsS0FBSyxDQUFDLEVBQUU7QUFBQSxRQUU3RjtBQUNBLDBDQUFrQyxFQUFFLEdBQUcsT0FBTyxNQUFNLEtBQUEsR0FBUSxLQUFLO0FBQUEsTUFBQSxXQUN4RCxlQUFlQSxhQUFFLE9BQU87QUFDakMsY0FBTSxRQUFRLElBQUksSUFBSSxPQUFPLEdBQUcsQ0FBQztBQUNqQyxZQUFJLFVBQVUsUUFBVztBQUNqQixnQkFBQSxRQUNKLDRCQUE0QixHQUFHLHFDQUFxQyxLQUFLLFVBQ3ZFLEtBQUssQ0FDTixFQUFFO0FBQUEsUUFFUDtBQUNBLDBDQUFrQyxFQUFFLEdBQUcsT0FBTyxNQUFNLEtBQUEsR0FBUSxLQUFLO0FBQUEsTUFBQSxPQUM1RDtBQUNDLGNBQUEsUUFDSiw0QkFBNEIsR0FBRyw4Q0FBOEMsS0FBSyxVQUNoRixLQUFLLENBQ04sRUFBRTtBQUFBLE1BRVA7QUFBQSxJQUNTLFdBQUEsTUFBTSxLQUFLLFdBQVcsR0FBRztBQUM5QixVQUFBLGVBQWVBLGFBQUUsS0FBSztBQUN4QixjQUFNLE1BQU0sT0FBTyxNQUFNLEtBQUssQ0FBQyxDQUFDO0FBRWhDLGdCQUFRLE1BQU0sSUFBSTtBQUFBLFVBQ2hCLEtBQUs7QUFBQSxVQUNMLEtBQUssV0FBVztBQUNkLGdCQUFJLElBQUksS0FBSyxxQkFBcUIsTUFBTSxLQUFLLENBQUM7QUFDOUM7QUFBQSxVQUNGO0FBQUEsVUFDQSxLQUFLLFVBQVU7QUFDYixnQkFBSSxPQUFPLEdBQUc7QUFDZDtBQUFBLFVBQ0Y7QUFBQSxVQUNBLFNBQVM7QUFDUCxrQkFBTSxRQUFRLGlDQUFpQztBQUFBLFVBQ2pEO0FBQUEsUUFDRjtBQUFBLE1BQUEsV0FDUyxlQUFlQSxhQUFFLE9BQU87QUFDM0IsY0FBQSxNQUFNLE1BQU0sS0FBSyxDQUFDO0FBRXhCLGdCQUFRLE1BQU0sSUFBSTtBQUFBLFVBQ2hCLEtBQUssV0FBVztBQUNkLGdCQUFJLFFBQVEsVUFBVTtBQUNoQixrQkFBQSxJQUFJLFNBQVMsTUFBTSxPQUFPO0FBQ3RCLHNCQUFBLFdBQVcsSUFBSSxTQUFTLE1BQU07QUFDaEMsb0JBQUEsT0FBTyxNQUFNLE9BQU8sUUFBUTtBQUFBLGNBQ3ZCLFdBQUEsSUFBSSxTQUFTLE1BQU0sT0FBTztBQUM3QixzQkFBQSxXQUFXLE1BQU0sUUFBUSxJQUFJO0FBQy9CLG9CQUFBLE9BQU8sSUFBSSxRQUFRLE1BQU0sUUFBUSxFQUFFLEtBQUssTUFBUyxDQUFDO0FBQUEsY0FDeEQ7QUFBQSxZQUFBLE9BQ0s7QUFDRCxrQkFBQSxPQUFPLE9BQU8sR0FBRyxDQUFDO0FBQ2xCLGtCQUFBLE9BQU8sT0FBTyxHQUFHLEdBQUcsQ0FBQyxxQkFBcUIsTUFBTSxLQUFLLENBQUMsQ0FBQztBQUFBLFlBQzdEO0FBQ0E7QUFBQSxVQUNGO0FBQUEsVUFDQSxLQUFLLE9BQU87QUFDTixnQkFBQSxPQUFPLE9BQU8sR0FBRyxHQUFHLENBQUMscUJBQXFCLE1BQU0sS0FBSyxDQUFDLENBQUM7QUFDM0Q7QUFBQSxVQUNGO0FBQUEsVUFDQSxLQUFLLFVBQVU7QUFDVCxnQkFBQSxPQUFPLE9BQU8sR0FBRyxDQUFDO0FBQ3RCO0FBQUEsVUFDRjtBQUFBLFVBQ0EsU0FBUztBQUNQLGtCQUFNLFFBQVEsbUNBQW1DO0FBQUEsVUFDbkQ7QUFBQSxRQUNGO0FBQUEsTUFBQSxPQUNLO0FBQ0wsY0FBTSxRQUNKLG9FQUFvRSxNQUFNLEtBQUssQ0FBQyxDQUFDLHlCQUF5QjtBQUFBLE1BRTlHO0FBQUEsSUFBQSxPQUNLO0FBQ0wsWUFBTSxRQUFRLHdDQUF3QztBQUFBLElBQ3hEO0FBQUEsRUFDRjtBQ3RGTSxXQUFVLHlCQUF5QixPQUFvQjtBQUMzRCxVQUFNLFVBQW1CLENBQUE7QUFFckIsUUFBQSxpQkFBaUJBLGFBQUUsV0FBVztBQUNoQyxZQUFNLFNBQVMsTUFBTTtBQUVyQixZQUFNLFFBQVEsS0FBSyxRQUFRLENBQUMsUUFBUSxRQUFPO0FBQ3pDLGNBQU0sT0FBTyxDQUFDLEdBQUcsTUFBTSxNQUFNLEdBQUc7QUFFaEMsZ0JBQVEsT0FBTyxRQUFRO0FBQUEsVUFDckIsS0FBSztBQUNILG9CQUFRLEtBQUs7QUFBQSxjQUNYLElBQUk7QUFBQSxjQUNKO0FBQUEsY0FDQSxPQUFPLGFBQWEsT0FBTyxJQUFJLEdBQUcsQ0FBQztBQUFBLFlBQUEsQ0FDcEM7QUFDRDtBQUFBLFVBRUYsS0FBSztBQUNILG9CQUFRLEtBQUs7QUFBQSxjQUNYLElBQUk7QUFBQSxjQUNKO0FBQUEsY0FDQSxPQUFPLGFBQWEsT0FBTyxJQUFJLEdBQUcsQ0FBQztBQUFBLFlBQUEsQ0FDcEM7QUFDRDtBQUFBLFVBRUYsS0FBSztBQUNILG9CQUFRLEtBQUs7QUFBQSxjQUNYLElBQUk7QUFBQSxjQUNKO0FBQUEsWUFBQSxDQUNEO0FBQ0Q7QUFBQSxVQUVGO0FBQ0Usa0JBQU0sUUFBUSxxQ0FBcUMsT0FBTyxNQUFNLEVBQUU7QUFBQSxRQUN0RTtBQUFBLE1BQUEsQ0FDRDtBQUFBLElBQUEsV0FDUSxpQkFBaUJBLGFBQUUsYUFBYTtBQUN6QyxVQUFJLFNBQVM7QUFDYixZQUFNLFFBQVEsTUFBTSxRQUFRLENBQUMsV0FBVTtBQUNyQyxZQUFJLE9BQU8sUUFBUTtBQUNqQixvQkFBVSxPQUFPO0FBQUEsUUFDbkI7QUFFQSxZQUFJLE9BQU8sUUFBUTtBQUVqQixnQkFBTSxPQUFPLENBQUMsR0FBRyxNQUFNLE1BQU0sTUFBTTtBQUNuQyxtQkFBUyxJQUFJLEdBQUcsSUFBSSxPQUFPLFFBQVEsS0FBSztBQUN0QyxvQkFBUSxLQUFLO0FBQUEsY0FDWCxJQUFJO0FBQUEsY0FDSjtBQUFBLFlBQUEsQ0FDRDtBQUFBLFVBQ0g7QUFBQSxRQUNGO0FBRUEsWUFBSSxPQUFPLFFBQVE7QUFDWCxnQkFBQSxZQUFZLE1BQU0sUUFBUSxPQUFPLE1BQU0sSUFBSSxPQUFPLFNBQVMsQ0FBQyxPQUFPLE1BQU07QUFDckUsb0JBQUEsUUFBUSxDQUFDLE1BQUs7QUFDdEIsa0JBQU0sT0FBTyxDQUFDLEdBQUcsTUFBTSxNQUFNLE1BQU07QUFDbkMsb0JBQVEsS0FBSztBQUFBLGNBQ1gsSUFBSTtBQUFBLGNBQ0o7QUFBQSxjQUNBLE9BQU8sYUFBYSxDQUFDO0FBQUEsWUFBQSxDQUN0QjtBQUNEO0FBQUEsVUFBQSxDQUNEO0FBQUEsUUFDSDtBQUFBLE1BQUEsQ0FDRDtBQUFBLElBQ0g7QUFFTyxXQUFBO0FBQUEsRUFDVDtBQUVBLFdBQVMsYUFBYSxHQUF3QztBQUM1RCxRQUFJLGFBQWFBLGFBQUUsT0FBTyxhQUFhQSxhQUFFLE9BQU87QUFDOUMsYUFBTyxFQUFFO0lBQU0sT0FDVjtBQUNFLGFBQUE7QUFBQSxJQUNUO0FBQUEsRUFDRjtBQzFFYSxRQUFBLG9CQUFvQkMsMkJBQTZDLE1BQVM7QUNTakYsV0FBVSxzQkFFZCxFQUNBLFFBQ0EsV0FDQSxvQkFLRDtBQUtPLFVBQUEsWUFBWSxPQUFPLHdDQUF3QztBQUVqRSxVQUFNLGlCQUFvQztBQUFBLE1BQ3hDO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFBQTtBQUdJLFVBQUEsVUFBVSxVQUFVO0FBRTFCLFVBQU0sOEJBQXNFLENBQUE7QUFFNUUsVUFBTSxvQkFBb0IsTUFBSztBQUM3QixZQUFNLHlCQUF5QkMsYUFBQUEsZ0JBQWdCLENBQUMsUUFBUSxZQUFXO0FBQ2pFLG9DQUE0QixLQUFLLEVBQUUsUUFBUSxRQUFTLENBQUE7QUFBQSxNQUFBLENBQ3JEO0FBRUcsVUFBQTtBQUNJQyxjQUFBQSxlQUFjLGtCQUFrQixNQUNwQyxNQUFNQywwQkFBYSxrQkFBa0IsT0FBYyxHQUNuRCxjQUFjO0FBRUUsMEJBQUEsSUFBSUQsY0FBYSxjQUFjO0FBQzFDQSxlQUFBQTtBQUFBQSxNQUFBOztNQUdUO0FBQUEsSUFBQTtBQUdGLFVBQU0sY0FBYztBQUVwQixRQUFJLDhCQUE4QjtBQUc1QixVQUFBLGdCQUFnQixDQUFDLFdBQTJCO0FBQ2hELFlBQU0sVUFBbUIsQ0FBQTtBQUNsQixhQUFBLFFBQVEsQ0FBQyxVQUFTO0FBQ25CLFlBQUEsTUFBTSxZQUFZLFdBQVcsV0FBVztBQUMxQyxrQkFBUSxLQUFLLEdBQUcseUJBQXlCLEtBQUssQ0FBQztBQUFBLFFBQ2pEO0FBQUEsTUFBQSxDQUNEO0FBRUcsVUFBQSxRQUFRLFNBQVMsR0FBRztBQUN0QjtBQUNJLFlBQUE7QUFDRkUsb0NBQWEsYUFBYSxPQUFPO0FBQUEsUUFBQTtBQUVqQztBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFBQTtBQUdGLGNBQVUsWUFBWSxhQUFhO0FBR25DLFFBQUksaUJBQTBCLENBQUE7QUFDOUIsVUFBTSxtQkFBbUJDLGFBQUFBLFVBQVUsYUFBYSxDQUFDLFlBQVc7QUFDMUQsVUFBSSw4QkFBOEIsR0FBRztBQUNuQztBQUFBLE1BQ0Y7QUFFZSxxQkFBQSxLQUFLLEdBQUcsT0FBTztBQUFBLElBQUEsQ0FDL0I7QUFHSyxVQUFBLG9CQUFvQkMsd0JBQVcsYUFBYSxNQUFLO0FBQ2pELFVBQUEsZUFBZSxXQUFXLEdBQUc7QUFDL0I7QUFBQSxNQUNGO0FBRUEsWUFBTSxVQUFVO0FBQ2hCLHVCQUFpQixDQUFBO0FBRWpCLGFBQU8sU0FBUyxNQUFLO0FBQ1gsZ0JBQUEsUUFBUSxDQUFDLFVBQVM7QUFDeEIsNENBQWtDLE9BQU8sU0FBUztBQUFBLFFBQUEsQ0FDbkQ7QUFBQSxTQUNBLFNBQVM7QUFBQSxJQUFBLENBQ2I7QUFHRCxXQUFPLFNBQVMsTUFBSztBQUluQixVQUFJLG1CQUFtQjtBQUV2QixrQ0FBNEIsUUFBUSxDQUFDLEVBQUUsUUFBUSxjQUFhO0FBQzFELFlBQUksQ0FBQyxrQkFBa0I7QUFDckIsY0FBSSxXQUFXLGFBQWE7QUFDMUI7QUFBQSxVQUNGO0FBQ21CLDZCQUFBO0FBQUEsUUFDckI7QUFFTSxjQUFBLG9CQUFvQkMsYUFBQUEscUJBQXFCLGFBQWEsTUFBTTtBQUVsRSxZQUFJLHNCQUFzQixRQUFXO0FBQzNCLGtCQUFBLFFBQVEsQ0FBQyxVQUFTO0FBRXRCLDhDQUFBO0FBQUEsY0FDRSxHQUFHO0FBQUEsY0FDSCxNQUFNLENBQUMsR0FBRyxtQkFBbUIsR0FBRyxNQUFNLElBQUk7QUFBQSxlQUU1QyxTQUFTO0FBQUEsVUFBQSxDQUVaO0FBQUEsUUFDSDtBQUFBLE1BQUEsQ0FDRDtBQUFBLE9BQ0EsU0FBUztBQUVMLFdBQUE7QUFBQSxNQUNMO0FBQUEsTUFDQSxTQUFTLE1BQUs7OztBQUdaLGtCQUFVLGNBQWMsYUFBYTtBQUFBLE1BQ3ZDO0FBQUEsTUFDQTtBQUFBLElBQUE7QUFBQSxFQUVKOzs7Ozs7Ozs7In0=
@@ -0,0 +1,5 @@
1
+ import * as Y from "yjs";
2
+ import { JsonValue, JsonArray, JsonObject, JsonPrimitive } from "../jsonTypes";
3
+ export declare function convertJsonToYjsData(v: JsonValue): JsonPrimitive | Y.Array<unknown> | Y.Map<unknown>;
4
+ export declare function applyJsonArrayYArray(dest: Y.Array<unknown>, source: JsonArray): void;
5
+ export declare function applyJsonObjectToYMap(dest: Y.Map<unknown>, source: JsonObject): void;
@@ -0,0 +1,9 @@
1
+ import { AnyType } from "mobx-keystone";
2
+ import * as Y from "yjs";
3
+ export interface YjsBindingContext {
4
+ yjsDoc: Y.Doc;
5
+ yjsObject: Y.Map<unknown> | Y.Array<unknown>;
6
+ mobxKeystoneType: AnyType;
7
+ yjsOrigin: symbol;
8
+ }
9
+ export declare const yjsBindingContext: import("mobx-keystone").Context<YjsBindingContext | undefined>;
@@ -1,2 +1,5 @@
1
- export { MobxKeystoneYjsError } from "./utils/error";
2
1
  export { bindYjsToMobxKeystone } from "./binding/bindYjsToMobxKeystone";
2
+ export { applyJsonArrayYArray, applyJsonObjectToYMap, convertJsonToYjsData, } from "./binding/convertJsonToYjsData";
3
+ export { yjsBindingContext } from "./binding/yjsBindingContext";
4
+ export type { YjsBindingContext } from "./binding/yjsBindingContext";
5
+ export { MobxKeystoneYjsError } from "./utils/error";
@@ -1,7 +1,7 @@
1
- export type JSONPrimitive = string | number | boolean | null;
2
- export type JSONValue = JSONPrimitive | JSONObject | JSONArray;
3
- export type JSONObject = {
4
- [key: string]: JSONValue;
1
+ export type JsonPrimitive = string | number | boolean | null;
2
+ export type JsonValue = JsonPrimitive | JsonObject | JsonArray;
3
+ export type JsonObject = {
4
+ [key: string]: JsonValue;
5
5
  };
6
- export interface JSONArray extends Array<JSONValue> {
6
+ export interface JsonArray extends Array<JsonValue> {
7
7
  }
package/package.json CHANGED
@@ -1,87 +1,87 @@
1
- {
2
- "name": "mobx-keystone-yjs",
3
- "version": "1.0.0",
4
- "description": "Yjs bindings for mobx-keystone",
5
- "keywords": [
6
- "mobx",
7
- "mobx-keystone",
8
- "yjs",
9
- "crdt",
10
- "state management"
11
- ],
12
- "repository": {
13
- "type": "git",
14
- "url": "https://github.com/xaviergonz/mobx-keystone.git"
15
- },
16
- "bugs": {
17
- "url": "https://github.com/xaviergonz/mobx-keystone/issues"
18
- },
19
- "homepage": "https://mobx-keystone.js.org",
20
- "license": "MIT",
21
- "author": "Javier González Garcés",
22
- "source": "./src/index.ts",
23
- "exports": {
24
- "./package.json": "./package.json",
25
- ".": {
26
- "import": "./dist/mobx-keystone-yjs.esm.mjs",
27
- "require": "./dist/mobx-keystone-yjs.umd.js",
28
- "script": "./dist/mobx-keystone-yjs.umd.js",
29
- "default": "./dist/mobx-keystone-yjs.esm.mjs",
30
- "types": "./dist/types/index.d.ts"
31
- }
32
- },
33
- "esmodule": "./dist/mobx-keystone-yjs.esm.js",
34
- "module": "./dist/mobx-keystone-yjs.esm.js",
35
- "jsnext:main": "./dist/mobx-keystone-yjs.esm.js",
36
- "react-native": "./dist/mobx-keystone-yjs.umd.js",
37
- "umd:main": "./dist/mobx-keystone-yjs.umd.js",
38
- "unpkg": "./dist/mobx-keystone-yjs.umd.js",
39
- "jsdelivr": "./dist/mobx-keystone-yjs.umd.js",
40
- "main": "./dist/mobx-keystone-yjs.umd.js",
41
- "types": "./dist/types/index.d.ts",
42
- "typings": "./dist/types/index.d.ts",
43
- "sideEffects": false,
44
- "files": [
45
- "src",
46
- "dist",
47
- "LICENSE",
48
- "CHANGELOG.md",
49
- "README.md"
50
- ],
51
- "scripts": {
52
- "quick-build": "tsc",
53
- "quick-build-tests": "tsc -p test",
54
- "copy-root-files": "shx cp ../../LICENSE .",
55
- "build": "yarn quick-build && yarn copy-root-files && shx rm -rf dist && vite build && shx cp dist/mobx-keystone-yjs.esm.mjs dist/mobx-keystone-yjs.esm.js",
56
- "test": "jest",
57
- "test:ci": "yarn test -i",
58
- "test:perf": "yarn build && yarn test:perf:run",
59
- "lint": "cd ../.. && yarn eslint \"packages/mobx-keystone-yjs/src/**/*.ts\" \"packages/mobx-keystone-yjs/test/**/*.ts\""
60
- },
61
- "peerDependencies": {
62
- "mobx": "^6.0.0 || ^5.0.0 || ^4.0.0",
63
- "mobx-keystone": "^1.8.1",
64
- "yjs": "^13.0.0"
65
- },
66
- "devDependencies": {
67
- "@types/jest": "^29.5.11",
68
- "@types/node": "^20.10.5",
69
- "babel-jest": "^29.7.0",
70
- "jest": "^29.7.0",
71
- "mobx": "^6.12.0",
72
- "mobx-keystone": "workspace:packages/lib",
73
- "rollup-plugin-typescript2": "^0.36.0",
74
- "shx": "^0.3.4",
75
- "spec.ts": "^1.1.3",
76
- "ts-jest": "^29.1.1",
77
- "ts-node": "^10.9.2",
78
- "typescript": "^5.3.3",
79
- "vite": "^5.0.10"
80
- },
81
- "dependencies": {
82
- "tslib": "^2.6.2"
83
- },
84
- "directories": {
85
- "test": "test"
86
- }
87
- }
1
+ {
2
+ "name": "mobx-keystone-yjs",
3
+ "version": "1.2.0",
4
+ "description": "Yjs bindings for mobx-keystone",
5
+ "keywords": [
6
+ "mobx",
7
+ "mobx-keystone",
8
+ "yjs",
9
+ "crdt",
10
+ "state management"
11
+ ],
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://github.com/xaviergonz/mobx-keystone.git"
15
+ },
16
+ "bugs": {
17
+ "url": "https://github.com/xaviergonz/mobx-keystone/issues"
18
+ },
19
+ "homepage": "https://mobx-keystone.js.org",
20
+ "license": "MIT",
21
+ "author": "Javier González Garcés",
22
+ "source": "./src/index.ts",
23
+ "exports": {
24
+ "./package.json": "./package.json",
25
+ ".": {
26
+ "import": "./dist/mobx-keystone-yjs.esm.mjs",
27
+ "require": "./dist/mobx-keystone-yjs.umd.js",
28
+ "script": "./dist/mobx-keystone-yjs.umd.js",
29
+ "default": "./dist/mobx-keystone-yjs.esm.mjs",
30
+ "types": "./dist/types/index.d.ts"
31
+ }
32
+ },
33
+ "esmodule": "./dist/mobx-keystone-yjs.esm.js",
34
+ "module": "./dist/mobx-keystone-yjs.esm.js",
35
+ "jsnext:main": "./dist/mobx-keystone-yjs.esm.js",
36
+ "react-native": "./dist/mobx-keystone-yjs.umd.js",
37
+ "umd:main": "./dist/mobx-keystone-yjs.umd.js",
38
+ "unpkg": "./dist/mobx-keystone-yjs.umd.js",
39
+ "jsdelivr": "./dist/mobx-keystone-yjs.umd.js",
40
+ "main": "./dist/mobx-keystone-yjs.umd.js",
41
+ "types": "./dist/types/index.d.ts",
42
+ "typings": "./dist/types/index.d.ts",
43
+ "sideEffects": false,
44
+ "files": [
45
+ "src",
46
+ "dist",
47
+ "LICENSE",
48
+ "CHANGELOG.md",
49
+ "README.md"
50
+ ],
51
+ "scripts": {
52
+ "quick-build": "tsc",
53
+ "quick-build-tests": "tsc -p test",
54
+ "copy-root-files": "shx cp ../../LICENSE .",
55
+ "build": "yarn quick-build && yarn copy-root-files && shx rm -rf dist && vite build && shx cp dist/mobx-keystone-yjs.esm.mjs dist/mobx-keystone-yjs.esm.js",
56
+ "test": "jest",
57
+ "test:ci": "yarn test -i",
58
+ "test:perf": "yarn build && yarn test:perf:run",
59
+ "lint": "cd ../.. && yarn eslint \"packages/mobx-keystone-yjs/src/**/*.ts\" \"packages/mobx-keystone-yjs/test/**/*.ts\""
60
+ },
61
+ "peerDependencies": {
62
+ "mobx": "^6.0.0 || ^5.0.0 || ^4.0.0",
63
+ "mobx-keystone": "^1.8.1",
64
+ "yjs": "^13.0.0"
65
+ },
66
+ "devDependencies": {
67
+ "@types/jest": "^29.5.11",
68
+ "@types/node": "^20.10.5",
69
+ "babel-jest": "^29.7.0",
70
+ "jest": "^29.7.0",
71
+ "mobx": "^6.12.0",
72
+ "mobx-keystone": "workspace:packages/lib",
73
+ "rollup-plugin-typescript2": "^0.36.0",
74
+ "shx": "^0.3.4",
75
+ "spec.ts": "^1.1.3",
76
+ "ts-jest": "^29.1.1",
77
+ "ts-node": "^10.9.2",
78
+ "typescript": "^5.3.3",
79
+ "vite": "^5.0.10"
80
+ },
81
+ "dependencies": {
82
+ "tslib": "^2.6.2"
83
+ },
84
+ "directories": {
85
+ "test": "test"
86
+ }
87
+ }
@@ -1,92 +1,92 @@
1
- import { Patch } from "mobx-keystone"
2
- import { failure } from "../utils/error"
3
- import * as Y from "yjs"
4
- import { toYDataType } from "./toYDataType"
5
-
6
- export function applyMobxKeystonePatchToYjsObject(patch: Patch, yjs: unknown): void {
7
- if (patch.path.length > 1) {
8
- const [key, ...rest] = patch.path
9
-
10
- if (yjs instanceof Y.Map) {
11
- const child = yjs.get(String(key))
12
- if (child === undefined) {
13
- throw failure(
14
- `invalid patch path, key "${key}" not found in Yjs map - patch: ${JSON.stringify(patch)}`
15
- )
16
- }
17
- applyMobxKeystonePatchToYjsObject({ ...patch, path: rest }, child)
18
- } else if (yjs instanceof Y.Array) {
19
- const child = yjs.get(Number(key))
20
- if (child === undefined) {
21
- throw failure(
22
- `invalid patch path, key "${key}" not found in Yjs array - patch: ${JSON.stringify(
23
- patch
24
- )}`
25
- )
26
- }
27
- applyMobxKeystonePatchToYjsObject({ ...patch, path: rest }, child)
28
- } else {
29
- throw failure(
30
- `invalid patch path, key "${key}" not found in unknown Yjs object - patch: ${JSON.stringify(
31
- patch
32
- )}`
33
- )
34
- }
35
- } else if (patch.path.length === 1) {
36
- if (yjs instanceof Y.Map) {
37
- const key = String(patch.path[0])
38
-
39
- switch (patch.op) {
40
- case "add":
41
- case "replace": {
42
- yjs.set(key, toYDataType(patch.value))
43
- break
44
- }
45
- case "remove": {
46
- yjs.delete(key)
47
- break
48
- }
49
- default: {
50
- throw failure(`invalid patch operation for map`)
51
- }
52
- }
53
- } else if (yjs instanceof Y.Array) {
54
- const key = patch.path[0]
55
-
56
- switch (patch.op) {
57
- case "replace": {
58
- if (key === "length") {
59
- if (yjs.length > patch.value) {
60
- const toDelete = yjs.length - patch.value
61
- yjs.delete(patch.value, toDelete)
62
- } else if (yjs.length < patch.value) {
63
- const toInsert = patch.value - yjs.length
64
- yjs.insert(yjs.length, Array(toInsert).fill(undefined))
65
- }
66
- } else {
67
- yjs.delete(Number(key))
68
- yjs.insert(Number(key), [toYDataType(patch.value)])
69
- }
70
- break
71
- }
72
- case "add": {
73
- yjs.insert(Number(key), [toYDataType(patch.value)])
74
- break
75
- }
76
- case "remove": {
77
- yjs.delete(Number(key))
78
- break
79
- }
80
- default: {
81
- throw failure(`invalid patch operation for array`)
82
- }
83
- }
84
- } else {
85
- throw failure(
86
- `invalid patch path, the Yjs object is of an unkown type, so key "${patch.path[0]}" cannot be found in it`
87
- )
88
- }
89
- } else {
90
- throw failure(`invalid patch path, it cannot be empty`)
91
- }
92
- }
1
+ import { Patch } from "mobx-keystone"
2
+ import * as Y from "yjs"
3
+ import { failure } from "../utils/error"
4
+ import { convertJsonToYjsData } from "./convertJsonToYjsData"
5
+
6
+ export function applyMobxKeystonePatchToYjsObject(patch: Patch, yjs: unknown): void {
7
+ if (patch.path.length > 1) {
8
+ const [key, ...rest] = patch.path
9
+
10
+ if (yjs instanceof Y.Map) {
11
+ const child = yjs.get(String(key))
12
+ if (child === undefined) {
13
+ throw failure(
14
+ `invalid patch path, key "${key}" not found in Yjs map - patch: ${JSON.stringify(patch)}`
15
+ )
16
+ }
17
+ applyMobxKeystonePatchToYjsObject({ ...patch, path: rest }, child)
18
+ } else if (yjs instanceof Y.Array) {
19
+ const child = yjs.get(Number(key))
20
+ if (child === undefined) {
21
+ throw failure(
22
+ `invalid patch path, key "${key}" not found in Yjs array - patch: ${JSON.stringify(
23
+ patch
24
+ )}`
25
+ )
26
+ }
27
+ applyMobxKeystonePatchToYjsObject({ ...patch, path: rest }, child)
28
+ } else {
29
+ throw failure(
30
+ `invalid patch path, key "${key}" not found in unknown Yjs object - patch: ${JSON.stringify(
31
+ patch
32
+ )}`
33
+ )
34
+ }
35
+ } else if (patch.path.length === 1) {
36
+ if (yjs instanceof Y.Map) {
37
+ const key = String(patch.path[0])
38
+
39
+ switch (patch.op) {
40
+ case "add":
41
+ case "replace": {
42
+ yjs.set(key, convertJsonToYjsData(patch.value))
43
+ break
44
+ }
45
+ case "remove": {
46
+ yjs.delete(key)
47
+ break
48
+ }
49
+ default: {
50
+ throw failure(`invalid patch operation for map`)
51
+ }
52
+ }
53
+ } else if (yjs instanceof Y.Array) {
54
+ const key = patch.path[0]
55
+
56
+ switch (patch.op) {
57
+ case "replace": {
58
+ if (key === "length") {
59
+ if (yjs.length > patch.value) {
60
+ const toDelete = yjs.length - patch.value
61
+ yjs.delete(patch.value, toDelete)
62
+ } else if (yjs.length < patch.value) {
63
+ const toInsert = patch.value - yjs.length
64
+ yjs.insert(yjs.length, Array(toInsert).fill(undefined))
65
+ }
66
+ } else {
67
+ yjs.delete(Number(key))
68
+ yjs.insert(Number(key), [convertJsonToYjsData(patch.value)])
69
+ }
70
+ break
71
+ }
72
+ case "add": {
73
+ yjs.insert(Number(key), [convertJsonToYjsData(patch.value)])
74
+ break
75
+ }
76
+ case "remove": {
77
+ yjs.delete(Number(key))
78
+ break
79
+ }
80
+ default: {
81
+ throw failure(`invalid patch operation for array`)
82
+ }
83
+ }
84
+ } else {
85
+ throw failure(
86
+ `invalid patch path, the Yjs object is of an unkown type, so key "${patch.path[0]}" cannot be found in it`
87
+ )
88
+ }
89
+ } else {
90
+ throw failure(`invalid patch path, it cannot be empty`)
91
+ }
92
+ }