@fluidframework/tree 2.61.0-355651 → 2.61.0-355656

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/api-report/tree.alpha.api.md +0 -4
  2. package/dist/feature-libraries/flex-tree/index.d.ts +0 -1
  3. package/dist/feature-libraries/flex-tree/index.d.ts.map +1 -1
  4. package/dist/feature-libraries/flex-tree/index.js +1 -4
  5. package/dist/feature-libraries/flex-tree/index.js.map +1 -1
  6. package/dist/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
  7. package/dist/feature-libraries/flex-tree/lazyNode.js +8 -14
  8. package/dist/feature-libraries/flex-tree/lazyNode.js.map +1 -1
  9. package/dist/feature-libraries/index.d.ts +1 -1
  10. package/dist/feature-libraries/index.d.ts.map +1 -1
  11. package/dist/feature-libraries/index.js +1 -3
  12. package/dist/feature-libraries/index.js.map +1 -1
  13. package/dist/packageVersion.d.ts +1 -1
  14. package/dist/packageVersion.js +1 -1
  15. package/dist/packageVersion.js.map +1 -1
  16. package/dist/shared-tree/treeAlpha.d.ts +1 -8
  17. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  18. package/dist/shared-tree/treeAlpha.js +0 -38
  19. package/dist/shared-tree/treeAlpha.js.map +1 -1
  20. package/dist/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  21. package/dist/simple-tree/core/unhydratedFlexTree.js +1 -7
  22. package/dist/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  23. package/lib/feature-libraries/flex-tree/index.d.ts +0 -1
  24. package/lib/feature-libraries/flex-tree/index.d.ts.map +1 -1
  25. package/lib/feature-libraries/flex-tree/index.js +0 -1
  26. package/lib/feature-libraries/flex-tree/index.js.map +1 -1
  27. package/lib/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
  28. package/lib/feature-libraries/flex-tree/lazyNode.js +8 -14
  29. package/lib/feature-libraries/flex-tree/lazyNode.js.map +1 -1
  30. package/lib/feature-libraries/index.d.ts +1 -1
  31. package/lib/feature-libraries/index.d.ts.map +1 -1
  32. package/lib/feature-libraries/index.js +1 -1
  33. package/lib/feature-libraries/index.js.map +1 -1
  34. package/lib/packageVersion.d.ts +1 -1
  35. package/lib/packageVersion.js +1 -1
  36. package/lib/packageVersion.js.map +1 -1
  37. package/lib/shared-tree/treeAlpha.d.ts +1 -8
  38. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  39. package/lib/shared-tree/treeAlpha.js +2 -40
  40. package/lib/shared-tree/treeAlpha.js.map +1 -1
  41. package/lib/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  42. package/lib/simple-tree/core/unhydratedFlexTree.js +2 -8
  43. package/lib/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  44. package/package.json +20 -20
  45. package/src/feature-libraries/flex-tree/index.ts +0 -2
  46. package/src/feature-libraries/flex-tree/lazyNode.ts +3 -11
  47. package/src/feature-libraries/index.ts +0 -3
  48. package/src/packageVersion.ts +1 -1
  49. package/src/shared-tree/treeAlpha.ts +1 -56
  50. package/src/simple-tree/core/unhydratedFlexTree.ts +2 -10
  51. package/dist/feature-libraries/flex-tree/observer.d.ts +0 -17
  52. package/dist/feature-libraries/flex-tree/observer.d.ts.map +0 -1
  53. package/dist/feature-libraries/flex-tree/observer.js +0 -30
  54. package/dist/feature-libraries/flex-tree/observer.js.map +0 -1
  55. package/lib/feature-libraries/flex-tree/observer.d.ts +0 -17
  56. package/lib/feature-libraries/flex-tree/observer.d.ts.map +0 -1
  57. package/lib/feature-libraries/flex-tree/observer.js +0 -32
  58. package/lib/feature-libraries/flex-tree/observer.js.map +0 -1
  59. package/src/feature-libraries/flex-tree/observer.ts +0 -39
@@ -1 +1 @@
1
- {"version":3,"file":"unhydratedFlexTree.js","sourceRoot":"","sources":["../../../src/simple-tree/core/unhydratedFlexTree.ts"],"names":[],"mappings":"AAAA;;;GAGG;;;;;;;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAEtE,OAAO,EAEN,SAAS,GAYT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEN,kBAAkB,EAQlB,cAAc,EACd,UAAU,EAGV,UAAU,EAEV,oBAAoB,EASpB,qBAAqB,EAErB,eAAe,GACf,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAiBtF;;GAEG;AACH,MAAM,OAAO,sBAAsB;IAG3B,UAAU;QAChB,OAAO,KAAK,CAAC;IACd,CAAC;IAID,IAAW,YAAY;QACtB,OAAO,CACN,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CACtF,CAAC;IACH,CAAC;IAeD,IAAW,MAAM;QAEhB,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED,IAAW,OAAO;QACjB,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;IACvC,CAAC;IAED;;OAEG;IACH;IACC;;OAEG;IACa,IAAc;IAC9B;;;;OAIG;IACc,SAAiD;IAClE;;;;;OAKG;IACa,aAAsB;;QAbtB,SAAI,GAAJ,IAAI,CAAU;QAMb,cAAS,GAAT,SAAS,CAAwC;QAOlD,kBAAa,GAAb,aAAa,CAAS;QAlD/B,aAAQ,GAAG,kBAAkB,CAAC;QAkBtB,QAAgB,GAAG,kBAAkB,CAAC,IAAa,CAAC;QAEnD,YAAO,GAAG,aAAa,EAAgC,CAAC;QAqCzE;;;;;;WAMG;QACa,WAAM,GAA6C;YAClE,GAAG,EAAE,CAAC,GAAa,EAAuC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;YAClF,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,GAA0D,EAAE;gBAC9E,eAAe,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBAC1C,OAAO,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACxE,CAAC;SACD,CAAC;QAlBD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5C,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACF,CAAC;IAiBM,0DAtDU,cAAc,EAsDvB,MAAM,CAAC,QAAQ,EAAC;QACvB,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC1E,CAAC;IAED;;;;OAIG;IACH,IAAW,aAAa;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAED,IAAW,IAAI;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACvB,CAAC;IAEO,gBAAgB,CAAC,GAAa;QACrC,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YAC1D,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YACzD,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;YACpB,OAAO,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;IACJ,CAAC;IAWM,OAAO,CAAC,MAA2C,EAAE,KAAc;QACzE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACxD,IAAI,IAAI,CAAC,QAAQ,KAAK,kBAAkB,EAAE,CAAC;gBAC1C,MAAM,IAAI,UAAU,CAAC,sDAAsD,CAAC,CAAC;YAC9E,CAAC;YACD,IAAI,cAAc,GAAuC,MAAM,CAAC,MAAM,CAAC;YACvE,OAAO,cAAc,KAAK,SAAS,EAAE,CAAC;gBACrC,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;oBAC7B,MAAM,IAAI,UAAU,CACnB,iEAAiE,CACjE,CAAC;gBACH,CAAC;gBACD,MAAM,UAAU,GAA6B,cAAc,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;gBACtF,MAAM,CACL,UAAU,KAAK,SAAS,IAAI,UAAU,YAAY,EAAsB,EACxE,KAAK,CAAC,2DAA2D,CACjE,CAAC;gBACF,cAAc,GAAG,UAAU,CAAC;YAC7B,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACnC,CAAC;aAAM,CAAC;YACP,MAAM,CACL,IAAI,CAAC,QAAQ,KAAK,kBAAkB,EACpC,KAAK,CAAC,6DAA6D,CACnE,CAAC;YACF,IAAI,CAAC,QAAQ,GAAG,kBAAkB,CAAC;QACpC,CAAC;IACF,CAAC;IAED;;;OAGG;IACH,IAAW,WAAW;QACrB,eAAe,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAEM,YAAY;QAClB,OAAO,oBAAoB,CAAiD,IAAI,CAAC,CAAC;IACnF,CAAC;IAEM,WAAW,CAAC,GAAa;QAC/B,eAAe,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAE1C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,+FAA+F;QAC/F,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAEM,QAAQ,CAAC,GAAW;QAC1B,eAAe,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAE1C,MAAM,QAAQ,GAAa,KAAK,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAEM,IAAI;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IACnE,CAAC;IAED,IAAW,KAAK;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACxB,CAAC;IAEM,gBAAgB,CAAC,GAAa;QACpC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,aAAa,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAElF,mEAAmE;QACnE,uBAAA,IAAI,2FAA0B,MAA9B,IAAI,CAA4B,CAAC;IAClC,CAAC;CAiBD;;IAXC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAE9C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;IAC9C,MAAM,CACL,MAAM,KAAK,SAAS,IAAI,MAAM,YAAY,EAAsB,EAChE,KAAK,CAAC,2DAA2D,CACjE,CAAC;IACF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1B,uBAAA,MAAM,2FAA0B,MAAhC,MAAM,CAA4B,CAAC;IACpC,CAAC;AACF,CAAC;AAGF;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAC7B;;OAEG;IACH,YACiB,YAA0B,EAC1B,MAAwB;QADxB,iBAAY,GAAZ,YAAY,CAAc;QAC1B,WAAM,GAAN,MAAM,CAAkB;IACtC,CAAC;IAEG,UAAU;QAChB,OAAO,KAAK,CAAC;IACd,CAAC;IAEM,UAAU;QAChB,OAAO,KAAK,CAAC;IACd,CAAC;CACD;AAED,iBAAiB;AAEjB;;;;;;;;;GASG;AACH,MAAM,kBAAkB,GAAoB;IAC3C,MAAM,EAAE;QACP,GAAG,EAAE,SAAS;QACd,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;KAC7C;IACD,KAAK,EAAE,CAAC;CACR,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,uBAAuB;IAOnC,YACiB,OAAwB,EACxB,MAA2B,EAC3B,GAAa;IAC7B;;;;;;OAMG;IACK,YAAgE;QAVxD,YAAO,GAAP,OAAO,CAAiB;QACxB,WAAM,GAAN,MAAM,CAAqB;QAC3B,QAAG,GAAH,GAAG,CAAU;QAQrB,iBAAY,GAAZ,YAAY,CAAoD;QAflE,QAAgB,GAAG,kBAAkB,CAAC,KAAc,CAAC;QAErD,WAAM,GAAuC,SAAS,CAAC;QAe7D,uIAAuI;QACvI,gFAAgF;QAChF,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;gBACjD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACxB,CAAC;QACF,CAAC;IACF,CAAC;IAEM,YAAY;QAClB,OAAO,qBAAqB,CAC3B,IAAI,CAAC,QAAQ,CACb,CAAC;IACH,CAAC;IAEO,iBAAiB;QACxB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,CAAC;IAED;;;;;OAKG;IACI,mBAAmB,CAAC,OAAuC;QACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAC7B,CAAC;IACF,CAAC;IAED;;OAEG;IACH,IAAW,cAAc;QACxB,OAAO,IAAI,CAAC,iBAAiB,EAAE,KAAK,SAAS,CAAC;IAC/C,CAAC;IAED,IAAW,QAAQ;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YAC7C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAC7B,CAAC;QACD,OAAO,IAAI,CAAC,YAAwC,CAAC;IACtD,CAAC;IAED,IAAW,MAAM;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC7B,CAAC;IAEM,EAAE,CAA+B,IAAY;QACnD,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,UAAU,CAAC;IACxC,CAAC;IAEM,OAAO,CAAC,KAAa;QAC3B,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACrB,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC;IACV,CAAC;IAEM,OAnFC,cAAc,EAmFd,MAAM,CAAC,QAAQ,EAAC;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IACzC,CAAC;IAED;;;;;;;OAOG;IACO,IAAI,CACb,IAA6E;QAE7E,uCAAuC;QACvC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC;QAEzD,qCAAqC;QACrC,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YACrD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IAEM,YAAY;QAClB,MAAM,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;IACjD,CAAC;IAED,yCAAyC;IAC/B,OAAO,CAAC,KAAa;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;CACD;AAED;;GAEG;AACH,MAAM,OAAO,uBACZ,SAAQ,uBAAuB;IADhC;;QAIiB,WAAM,GAAG;YACxB,GAAG,EAAE,CAAC,UAA2C,EAAQ,EAAE;gBAC1D,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;oBAC9B,MAAM,CACL,UAAU,YAAY,sBAAsB,EAC5C,KAAK,CAAC,8BAA8B,CACpC,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACtB,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;wBAC9B,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;oBAC1B,CAAC;yBAAM,CAAC;wBACP,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;oBACrB,CAAC;gBACF,CAAC,CAAC,CAAC;YACJ,CAAC;SAEyC,CAAC;IAU7C,CAAC;IARA,IAAW,OAAO;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;CACD;AAED,MAAM,uBACL,SAAQ,uBAAuB;IAG/B,IAAoB,OAAO;QAC1B,uDAAuD;QACvD,MAAM,CACL,KAAK,CAAC,OAAO,KAAK,SAAS,EAC3B,KAAK,CAAC,0DAA0D,CAChE,CAAC;QACF,OAAO,KAAK,CAAC,OAAO,CAAC;IACtB,CAAC;CACD;AAED;;GAEG;AACH,MAAM,OAAO,uBACZ,SAAQ,uBAAuB;IADhC;;QAIiB,WAAM,GAAG;YACxB,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,EAAQ,EAAE;gBACnC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;oBAC5B,MAAM,CAAC,CAAC,KAAK,SAAS,EAAE,KAAK,CAAC,qCAAqC,CAAC,CAAC;oBACrE,MAAM,CAAC,CAAC,YAAY,sBAAsB,EAAE,KAAK,CAAC,8BAA8B,CAAC,CAAC;gBACnF,CAAC;gBACD,MAAM,iBAAiB,GAAG,UAA+C,CAAC;gBAC1E,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACtB,IAAI,UAAU,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;wBAC9B,qGAAqG;wBACrG,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,iBAAiB,CAAC,CAAC;oBACjD,CAAC;yBAAM,CAAC;wBACP,oKAAoK;wBACpK,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,iBAAiB,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;oBAClF,CAAC;gBACF,CAAC,CAAC,CAAC;YACJ,CAAC;YACD,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAA4B,EAAE;gBAClD,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAC3B,MAAM,CAAC,CAAC,KAAK,SAAS,EAAE,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBAC9D,CAAC;gBACD,IAAI,OAA6C,CAAC;gBAClD,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACtB,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACzC,CAAC,CAAC,CAAC;gBACH,OAAO,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACxE,CAAC;SACgD,CAAC;IAYpD,CAAC;IAVO,EAAE,CAAC,KAAa;QACtB,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACrB,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IACM,GAAG,CAAI,UAA+D;QAC5E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACrC,CAAC;CACD;AAED,oBAAoB;AAEpB,gDAAgD;AAChD,MAAM,UAAU,WAAW,CAC1B,GAAG,IAA2D;IAE9D,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACjB,KAAK,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;QACpC,KAAK,UAAU,CAAC,UAAU,CAAC,UAAU;YACpC,OAAO,IAAI,uBAAuB,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7C,KAAK,UAAU,CAAC,QAAQ,CAAC,UAAU;YAClC,OAAO,IAAI,uBAAuB,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7C,KAAK,UAAU,CAAC,QAAQ,CAAC,UAAU;YAClC,OAAO,IAAI,uBAAuB,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7C,KAAK,UAAU,CAAC,SAAS,CAAC,UAAU;YACnC,mHAAmH;YACnH,OAAO,IAAI,uBAAuB,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7C;YACC,OAAO,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAClD,CAAC;AACF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACrD,OAAO,IAAI,UAAU,CACpB,GACC,OAAO,IAAI,WACZ,4EAA4E,CAC5E,CAAC;AACH,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { createEmitter } from \"@fluid-internal/client-utils\";\nimport type { HasListeners, Listenable } from \"@fluidframework/core-interfaces/internal\";\nimport { assert, oob, fail } from \"@fluidframework/core-utils/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\n\nimport {\n\ttype AnchorEvents,\n\tdummyRoot,\n\ttype FieldKey,\n\ttype FieldKindIdentifier,\n\ttype ITreeCursorSynchronous,\n\ttype NodeData,\n\ttype NormalizedFieldUpPath,\n\ttype SchemaPolicy,\n\ttype TreeNodeSchemaIdentifier,\n\ttype TreeNodeStoredSchema,\n\ttype TreeStoredSchema,\n\ttype TreeValue,\n\ttype Value,\n} from \"../../core/index.js\";\nimport {\n\ttype FlexTreeContext,\n\tFlexTreeEntityKind,\n\ttype FlexTreeField,\n\ttype FlexTreeNode,\n\ttype FlexTreeOptionalField,\n\ttype FlexTreeRequiredField,\n\ttype FlexTreeSequenceField,\n\ttype FlexTreeTypedField,\n\ttype FlexTreeUnknownUnboxed,\n\tflexTreeMarker,\n\tindexForAt,\n\ttype FlexTreeHydratedContext,\n\ttype FlexFieldKind,\n\tFieldKinds,\n\ttype SequenceFieldEditBuilder,\n\tcursorForMapTreeNode,\n\ttype OptionalFieldEditBuilder,\n\ttype ValueFieldEditBuilder,\n\ttype FlexibleNodeContent,\n\ttype FlexTreeHydratedContextMinimal,\n\ttype FlexibleFieldContent,\n\ttype MapTreeFieldViewGeneric,\n\ttype MapTreeNodeViewGeneric,\n\ttype HydratedFlexTreeNode,\n\tcursorForMapTreeField,\n\ttype MinimalFieldMap,\n\tcurrentObserver,\n} from \"../../feature-libraries/index.js\";\nimport { brand, filterIterable, getOrCreate, mapIterable } from \"../../util/index.js\";\n\nimport type { Context } from \"./context.js\";\nimport type { ContextualFieldProvider } from \"../fieldSchema.js\";\nimport type { TreeNode } from \"./treeNode.js\";\n\ninterface UnhydratedTreeSequenceFieldEditBuilder\n\textends SequenceFieldEditBuilder<FlexibleFieldContent, UnhydratedFlexTreeNode[]> {}\n\ntype UnhydratedFlexTreeNodeEvents = Pick<\n\tAnchorEvents,\n\t\"childrenChangedAfterBatch\" | \"subtreeChangedAfterBatch\"\n>;\n\n/** A node's parent field and its index in that field */\ntype LocationInField = FlexTreeNode[\"parentField\"];\n\n/**\n * The {@link Unhydrated} implementation of {@link FlexTreeNode}.\n */\nexport class UnhydratedFlexTreeNode\n\timplements FlexTreeNode, MapTreeNodeViewGeneric<UnhydratedFlexTreeNode>\n{\n\tpublic isHydrated(): this is HydratedFlexTreeNode {\n\t\treturn false;\n\t}\n\n\tprivate location = unparentedLocation;\n\n\tpublic get storedSchema(): TreeNodeStoredSchema {\n\t\treturn (\n\t\t\tthis.context.schema.nodeSchema.get(this.data.type) ?? fail(0xb46 /* missing schema */)\n\t\t);\n\t}\n\n\t/**\n\t * Cache storing the {@link TreeNode} for this inner node.\n\t * @remarks\n\t * When creating a `TreeNode` for this `UnhydratedFlexTreeNode`, cache the `TreeNode` in this property.\n\t * Currently this is done by {@link TreeNodeKernel}.\n\t *\n\t * See {@link getOrCreateNodeFromInnerNode} how to get the `TreeNode`, even if not already created, regardless of hydration status.\n\t */\n\tpublic treeNode: TreeNode | undefined;\n\n\tpublic readonly [flexTreeMarker] = FlexTreeEntityKind.Node as const;\n\n\tprivate readonly _events = createEmitter<UnhydratedFlexTreeNodeEvents>();\n\tpublic get events(): Listenable<UnhydratedFlexTreeNodeEvents> &\n\t\tHasListeners<UnhydratedFlexTreeNodeEvents> {\n\t\treturn this._events;\n\t}\n\n\tpublic get context(): FlexTreeContext {\n\t\treturn this.simpleContext.flexContext;\n\t}\n\n\t/**\n\t * Create a new UnhydratedFlexTreeNode.\n\t */\n\tpublic constructor(\n\t\t/**\n\t\t * The {@link NodeData} for this node.\n\t\t */\n\t\tpublic readonly data: NodeData,\n\t\t/**\n\t\t * All {@link UnhydratedFlexTreeField} for this node that have been created so far.\n\t\t * @remarks\n\t\t * This includes all non-empty fields, but also any empty fields which have been previously requested.\n\t\t */\n\t\tprivate readonly fieldsAll: Map<FieldKey, UnhydratedFlexTreeField>,\n\t\t/**\n\t\t * The {@link Context} for this node.\n\t\t * @remarks\n\t\t * Provides access to all schema reachable from this node.\n\t\t * See {@link getUnhydratedContext}.\n\t\t */\n\t\tpublic readonly simpleContext: Context,\n\t) {\n\t\tfor (const [_key, field] of this.fieldsAll) {\n\t\t\tfield.parent = this;\n\t\t}\n\t}\n\n\t/**\n\t * The non-empty fields on this node.\n\t * @remarks\n\t * This is needed to implement {@link MapTreeNodeViewGeneric.fields}, which must omit empty fields.\n\t * Due to having to detect if a field is empty, this forces the evaluation of any pending defaults in the fields.\n\t * Use {@link allFieldsLazy} to avoid evaluating pending defaults.\n\t */\n\tpublic readonly fields: MinimalFieldMap<UnhydratedFlexTreeField> = {\n\t\tget: (key: FieldKey): UnhydratedFlexTreeField | undefined => this.tryGetField(key),\n\t\t[Symbol.iterator]: (): IterableIterator<[FieldKey, UnhydratedFlexTreeField]> => {\n\t\t\tcurrentObserver?.observeNodeContent(this);\n\t\t\treturn filterIterable(this.fieldsAll, ([, field]) => field.length > 0);\n\t\t},\n\t};\n\n\tpublic [Symbol.iterator](): IterableIterator<UnhydratedFlexTreeField> {\n\t\treturn mapIterable(this.fields, ([, field]) => field)[Symbol.iterator]();\n\t}\n\n\t/**\n\t * Gets all fields, without filtering out empty ones.\n\t * @remarks\n\t * This avoids forcing the evaluating of pending defaults in the fields, and also saves a copy on access.\n\t */\n\tpublic get allFieldsLazy(): ReadonlyMap<FieldKey, UnhydratedFlexTreeField> {\n\t\treturn this.fieldsAll;\n\t}\n\n\tpublic get type(): TreeNodeSchemaIdentifier {\n\t\treturn this.data.type;\n\t}\n\n\tprivate getOrCreateField(key: FieldKey): UnhydratedFlexTreeField {\n\t\treturn getOrCreate(this.fieldsAll, key, () => {\n\t\t\tconst stored = this.storedSchema.getFieldSchema(key).kind;\n\t\t\tconst field = createField(this.context, stored, key, []);\n\t\t\tfield.parent = this;\n\t\t\treturn field;\n\t\t});\n\t}\n\n\t/**\n\t * Set this node's parentage (see {@link FlexTreeNode.parentField}).\n\t * @remarks The node may be given a parent if it has none, or may have its parent removed (by passing `undefined`).\n\t * However, a node with a parent may not be directly re-assigned a different parent.\n\t * That likely indicates either an attempted multi-parenting or an attempt to \"move\" the node, neither of which are supported.\n\t * Removing a node's parent twice in a row is also not supported, as it likely indicates a bug.\n\t */\n\tpublic adoptBy(parent: undefined): void;\n\tpublic adoptBy(parent: UnhydratedFlexTreeField, index: number): void;\n\tpublic adoptBy(parent: UnhydratedFlexTreeField | undefined, index?: number): void {\n\t\tif (parent !== undefined) {\n\t\t\tassert(index !== undefined, 0xa08 /* Expected index */);\n\t\t\tif (this.location !== unparentedLocation) {\n\t\t\t\tthrow new UsageError(\"A node may not be in more than one place in the tree\");\n\t\t\t}\n\t\t\tlet unhydratedNode: UnhydratedFlexTreeNode | undefined = parent.parent;\n\t\t\twhile (unhydratedNode !== undefined) {\n\t\t\t\tif (unhydratedNode === this) {\n\t\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\t\"A node may not be inserted into a location that is under itself\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst parentNode: FlexTreeNode | undefined = unhydratedNode.parentField.parent.parent;\n\t\t\t\tassert(\n\t\t\t\t\tparentNode === undefined || parentNode instanceof UnhydratedFlexTreeNode,\n\t\t\t\t\t0xb77 /* Unhydrated node's parent should be an unhydrated node */,\n\t\t\t\t);\n\t\t\t\tunhydratedNode = parentNode;\n\t\t\t}\n\t\t\tthis.location = { parent, index };\n\t\t} else {\n\t\t\tassert(\n\t\t\t\tthis.location !== unparentedLocation,\n\t\t\t\t0xa09 /* Node may not be un-adopted if it does not have a parent */,\n\t\t\t);\n\t\t\tthis.location = unparentedLocation;\n\t\t}\n\t}\n\n\t/**\n\t * The field this tree is in, and the index within that field.\n\t * @remarks If this node is unparented, this method will return the special {@link unparentedLocation} as the parent.\n\t */\n\tpublic get parentField(): LocationInField {\n\t\tcurrentObserver?.observeParentOf(this);\n\t\treturn this.location;\n\t}\n\n\tpublic borrowCursor(): ITreeCursorSynchronous {\n\t\treturn cursorForMapTreeNode<MapTreeNodeViewGeneric<UnhydratedFlexTreeNode>>(this);\n\t}\n\n\tpublic tryGetField(key: FieldKey): UnhydratedFlexTreeField | undefined {\n\t\tcurrentObserver?.observeNodeContent(this);\n\n\t\tconst field = this.fieldsAll.get(key);\n\t\t// Only return the field if it is not empty, in order to fulfill the contract of `tryGetField`.\n\t\tif (field !== undefined && field.length > 0) {\n\t\t\treturn field;\n\t\t}\n\t}\n\n\tpublic getBoxed(key: string): UnhydratedFlexTreeField {\n\t\tcurrentObserver?.observeNodeContent(this);\n\n\t\tconst fieldKey: FieldKey = brand(key);\n\t\treturn this.getOrCreateField(fieldKey);\n\t}\n\n\tpublic keys(): IterableIterator<FieldKey> {\n\t\treturn Array.from(this.fields, ([key]) => key)[Symbol.iterator]();\n\t}\n\n\tpublic get value(): Value {\n\t\treturn this.data.value;\n\t}\n\n\tpublic emitChangedEvent(key: FieldKey): void {\n\t\tthis._events.emit(\"childrenChangedAfterBatch\", { changedFields: new Set([key]) });\n\n\t\t// Also emit subtree changed event for this node and all ancestors.\n\t\tthis.#emitSubtreeChangedEvents();\n\t}\n\n\t/**\n\t * Emit subtree changed events for this node and all ancestors.\n\t */\n\t#emitSubtreeChangedEvents(): void {\n\t\tthis._events.emit(\"subtreeChangedAfterBatch\");\n\n\t\tconst parent = this.parentField.parent.parent;\n\t\tassert(\n\t\t\tparent === undefined || parent instanceof UnhydratedFlexTreeNode,\n\t\t\t0xb76 /* Unhydrated node's parent should be an unhydrated node */,\n\t\t);\n\t\tif (parent !== undefined) {\n\t\t\tparent.#emitSubtreeChangedEvents();\n\t\t}\n\t}\n}\n\n/**\n * Implementation of `FlexTreeContext`.\n *\n * @remarks An editor is required to edit the FlexTree.\n */\nexport class UnhydratedContext implements FlexTreeContext {\n\t/**\n\t * @param flexSchema - Schema to use when working with the tree.\n\t */\n\tpublic constructor(\n\t\tpublic readonly schemaPolicy: SchemaPolicy,\n\t\tpublic readonly schema: TreeStoredSchema,\n\t) {}\n\n\tpublic isDisposed(): boolean {\n\t\treturn false;\n\t}\n\n\tpublic isHydrated(): this is FlexTreeHydratedContext {\n\t\treturn false;\n\t}\n}\n\n// #region Fields\n\n/**\n * A special singleton that is the implicit {@link LocationInField} of all un-parented {@link UnhydratedFlexTreeNode}s.\n * @remarks This exists because {@link UnhydratedFlexTreeNode.parentField} must return a field.\n * If a {@link UnhydratedFlexTreeNode} is created without a parent, its {@link UnhydratedFlexTreeNode.parentField} property will point to this object.\n * However, this field cannot be used in any practical way because it is empty, i.e. it does not actually contain the children that claim to be parented under it.\n * It has the \"empty\" schema and it will always contain zero children if queried.\n * Any nodes with this location will have a dummy parent index of `-1`.\n *\n * TODO: make this make sense.\n */\nconst unparentedLocation: LocationInField = {\n\tparent: {\n\t\tkey: dummyRoot,\n\t\tparent: undefined,\n\t\tschema: brand(FieldKinds.optional.identifier),\n\t},\n\tindex: 0,\n};\n\n/**\n * The {@link Unhydrated} implementation of {@link FlexTreeField}.\n */\nexport class UnhydratedFlexTreeField\n\timplements FlexTreeField, MapTreeFieldViewGeneric<UnhydratedFlexTreeNode>\n{\n\tpublic [flexTreeMarker] = FlexTreeEntityKind.Field as const;\n\n\tpublic parent: UnhydratedFlexTreeNode | undefined = undefined;\n\n\tpublic constructor(\n\t\tpublic readonly context: FlexTreeContext,\n\t\tpublic readonly schema: FieldKindIdentifier,\n\t\tpublic readonly key: FieldKey,\n\t\t/**\n\t\t * The children of this field.\n\t\t * @remarks\n\t\t * This is either an array of {@link UnhydratedFlexTreeNode}s or a {@link ContextualFieldProvider} that will be used to populate the children lazily (after which it will become an array).\n\t\t * See {@link fillPendingDefaults}.\n\t\t * Note that any fields using a {@link ConstantFieldProvider} should be evaluated before constructing the UnhydratedFlexTreeField.\n\t\t */\n\t\tprivate lazyChildren: UnhydratedFlexTreeNode[] | ContextualFieldProvider,\n\t) {\n\t\t// When this field is created (which only happens one time, because it is cached), all the children become parented for the first time.\n\t\t// \"Adopt\" each child by updating its parent information to point to this field.\n\t\tif (Array.isArray(lazyChildren)) {\n\t\t\tfor (const [i, child] of lazyChildren.entries()) {\n\t\t\t\tchild.adoptBy(this, i);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic borrowCursor(): ITreeCursorSynchronous {\n\t\treturn cursorForMapTreeField<MapTreeNodeViewGeneric<UnhydratedFlexTreeNode>>(\n\t\t\tthis.children,\n\t\t);\n\t}\n\n\tprivate getPendingDefault(): ContextualFieldProvider | undefined {\n\t\treturn !Array.isArray(this.lazyChildren) ? this.lazyChildren : undefined;\n\t}\n\n\t/**\n\t * Populate pending default (if present) using the provided context.\n\t * @remarks\n\t * This apply to just this field: caller will likely want to recursively walk the tree.\n\t * @see {@link pendingDefault}.\n\t */\n\tpublic fillPendingDefaults(context: FlexTreeHydratedContextMinimal): void {\n\t\tconst provider = this.getPendingDefault();\n\t\tif (provider) {\n\t\t\tconst content = provider(context);\n\t\t\tthis.lazyChildren = content;\n\t\t}\n\t}\n\n\t/**\n\t * Returns true if this field has a pending default due to defined defined using a {@link ContextualFieldProvider}.\n\t */\n\tpublic get pendingDefault(): boolean {\n\t\treturn this.getPendingDefault() !== undefined;\n\t}\n\n\tpublic get children(): UnhydratedFlexTreeNode[] {\n\t\tconst provider = this.getPendingDefault();\n\t\tif (provider) {\n\t\t\tconst content = provider(\"UseGlobalContext\");\n\t\t\tthis.lazyChildren = content;\n\t\t}\n\t\treturn this.lazyChildren as UnhydratedFlexTreeNode[];\n\t}\n\n\tpublic get length(): number {\n\t\treturn this.children.length;\n\t}\n\n\tpublic is<TKind2 extends FlexFieldKind>(kind: TKind2): this is FlexTreeTypedField<TKind2> {\n\t\treturn this.schema === kind.identifier;\n\t}\n\n\tpublic boxedAt(index: number): FlexTreeNode | undefined {\n\t\tconst i = indexForAt(index, this.length);\n\t\tif (i === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst m = this.children[i];\n\t\treturn m;\n\t}\n\n\tpublic [Symbol.iterator](): IterableIterator<UnhydratedFlexTreeNode> {\n\t\treturn this.children[Symbol.iterator]();\n\t}\n\n\t/**\n\t * Mutate this field.\n\t * @param edit - A function which receives the current `MapTree`s that comprise the contents of the field so that it may be mutated.\n\t * The function may mutate the array in place or return a new array.\n\t * If a new array is returned then it will be used as the new contents of the field, otherwise the original array will be continue to be used.\n\t * @remarks All edits to the field (i.e. mutations of the field's MapTrees) should be directed through this function.\n\t * This function ensures that the parent MapTree has no empty fields (which is an invariant of `MapTree`) after the mutation.\n\t */\n\tprotected edit(\n\t\tedit: (mapTrees: UnhydratedFlexTreeNode[]) => void | UnhydratedFlexTreeNode[],\n\t): void {\n\t\t// Clear parents for all old map trees.\n\t\tfor (const tree of this.children) {\n\t\t\ttree.adoptBy(undefined);\n\t\t}\n\n\t\tthis.lazyChildren = edit(this.children) ?? this.children;\n\n\t\t// Set parents for all new map trees.\n\t\tfor (const [index, tree] of this.children.entries()) {\n\t\t\ttree.adoptBy(this, index);\n\t\t}\n\n\t\tthis.parent?.emitChangedEvent(this.key);\n\t}\n\n\tpublic getFieldPath(): NormalizedFieldUpPath {\n\t\tthrow unsupportedUsageError(\"Editing an array\");\n\t}\n\n\t/** Unboxes leaf nodes to their values */\n\tprotected unboxed(index: number): TreeValue | UnhydratedFlexTreeNode {\n\t\tconst child = this.children[index] ?? oob();\n\t\tconst value = child.value;\n\t\tif (value !== undefined) {\n\t\t\treturn value;\n\t\t}\n\t\treturn child;\n\t}\n}\n\n/**\n * The {@link Unhydrated} implementation of {@link FlexTreeOptionalField}.\n */\nexport class UnhydratedOptionalField\n\textends UnhydratedFlexTreeField\n\timplements FlexTreeOptionalField\n{\n\tpublic readonly editor = {\n\t\tset: (newContent: FlexibleNodeContent | undefined): void => {\n\t\t\tif (newContent !== undefined) {\n\t\t\t\tassert(\n\t\t\t\t\tnewContent instanceof UnhydratedFlexTreeNode,\n\t\t\t\t\t0xbb7 /* Expected unhydrated node */,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.edit((mapTrees) => {\n\t\t\t\tif (newContent !== undefined) {\n\t\t\t\t\tmapTrees[0] = newContent;\n\t\t\t\t} else {\n\t\t\t\t\tmapTrees.length = 0;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t} satisfies OptionalFieldEditBuilder<FlexibleNodeContent> &\n\t\tValueFieldEditBuilder<FlexibleNodeContent>;\n\n\tpublic get content(): FlexTreeUnknownUnboxed | undefined {\n\t\tconst value = this.children[0];\n\t\tif (value !== undefined) {\n\t\t\treturn this.unboxed(0);\n\t\t}\n\n\t\treturn undefined;\n\t}\n}\n\nclass UnhydratedRequiredField\n\textends UnhydratedOptionalField\n\timplements FlexTreeRequiredField\n{\n\tpublic override get content(): FlexTreeUnknownUnboxed {\n\t\t// This cannot use ?? since null is a legal value here.\n\t\tassert(\n\t\t\tsuper.content !== undefined,\n\t\t\t0xa57 /* Expected EagerMapTree required field to have a value */,\n\t\t);\n\t\treturn super.content;\n\t}\n}\n\n/**\n * The {@link Unhydrated} implementation of {@link FlexTreeSequenceField}.\n */\nexport class UnhydratedSequenceField\n\textends UnhydratedFlexTreeField\n\timplements FlexTreeSequenceField\n{\n\tpublic readonly editor = {\n\t\tinsert: (index, newContent): void => {\n\t\t\tfor (const c of newContent) {\n\t\t\t\tassert(c !== undefined, 0xa0a /* Unexpected sparse array content */);\n\t\t\t\tassert(c instanceof UnhydratedFlexTreeNode, 0xbb8 /* Expected unhydrated node */);\n\t\t\t}\n\t\t\tconst newContentChecked = newContent as readonly UnhydratedFlexTreeNode[];\n\t\t\tthis.edit((mapTrees) => {\n\t\t\t\tif (newContent.length < 1000) {\n\t\t\t\t\t// For \"smallish arrays\" (`1000` is not empirically derived), the `splice` function is appropriate...\n\t\t\t\t\tmapTrees.splice(index, 0, ...newContentChecked);\n\t\t\t\t} else {\n\t\t\t\t\t// ...but we avoid using `splice` + spread for very large input arrays since there is a limit on how many elements can be spread (too many will overflow the stack).\n\t\t\t\t\treturn mapTrees.slice(0, index).concat(newContentChecked, mapTrees.slice(index));\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tremove: (index, count): UnhydratedFlexTreeNode[] => {\n\t\t\tfor (let i = index; i < index + count; i++) {\n\t\t\t\tconst c = this.children[i];\n\t\t\t\tassert(c !== undefined, 0xa0b /* Unexpected sparse array */);\n\t\t\t}\n\t\t\tlet removed: UnhydratedFlexTreeNode[] | undefined;\n\t\t\tthis.edit((mapTrees) => {\n\t\t\t\tremoved = mapTrees.splice(index, count);\n\t\t\t});\n\t\t\treturn removed ?? fail(0xb4a /* Expected removed to be set by edit */);\n\t\t},\n\t} satisfies UnhydratedTreeSequenceFieldEditBuilder;\n\n\tpublic at(index: number): FlexTreeUnknownUnboxed | undefined {\n\t\tconst i = indexForAt(index, this.length);\n\t\tif (i === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn this.unboxed(i);\n\t}\n\tpublic map<U>(callbackfn: (value: FlexTreeUnknownUnboxed, index: number) => U): U[] {\n\t\treturn Array.from(this, callbackfn);\n\t}\n}\n\n// #endregion Fields\n\n/** Creates a field with the given attributes */\nexport function createField(\n\t...args: ConstructorParameters<typeof UnhydratedFlexTreeField>\n): UnhydratedFlexTreeField {\n\tswitch (args[1]) {\n\t\tcase FieldKinds.required.identifier:\n\t\tcase FieldKinds.identifier.identifier:\n\t\t\treturn new UnhydratedRequiredField(...args);\n\t\tcase FieldKinds.optional.identifier:\n\t\t\treturn new UnhydratedOptionalField(...args);\n\t\tcase FieldKinds.sequence.identifier:\n\t\t\treturn new UnhydratedSequenceField(...args);\n\t\tcase FieldKinds.forbidden.identifier:\n\t\t\t// TODO: this seems to used by unknown optional fields. They should probably use \"optional\" not \"Forbidden\" schema.\n\t\t\treturn new UnhydratedFlexTreeField(...args);\n\t\tdefault:\n\t\t\treturn fail(0xb9d /* unsupported field kind */);\n\t}\n}\n\nexport function unsupportedUsageError(message?: string): Error {\n\treturn new UsageError(\n\t\t`${\n\t\t\tmessage ?? \"Operation\"\n\t\t} is not supported for content that has not yet been inserted into the tree`,\n\t);\n}\n"]}
1
+ {"version":3,"file":"unhydratedFlexTree.js","sourceRoot":"","sources":["../../../src/simple-tree/core/unhydratedFlexTree.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\nimport { createEmitter } from \"@fluid-internal/client-utils\";\nimport type { HasListeners, Listenable } from \"@fluidframework/core-interfaces/internal\";\nimport { assert, oob, fail } from \"@fluidframework/core-utils/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\n\nimport {\n\ttype AnchorEvents,\n\tdummyRoot,\n\ttype FieldKey,\n\ttype FieldKindIdentifier,\n\ttype ITreeCursorSynchronous,\n\ttype NodeData,\n\ttype NormalizedFieldUpPath,\n\ttype SchemaPolicy,\n\ttype TreeNodeSchemaIdentifier,\n\ttype TreeNodeStoredSchema,\n\ttype TreeStoredSchema,\n\ttype TreeValue,\n\ttype Value,\n} from \"../../core/index.js\";\nimport {\n\ttype FlexTreeContext,\n\tFlexTreeEntityKind,\n\ttype FlexTreeField,\n\ttype FlexTreeNode,\n\ttype FlexTreeOptionalField,\n\ttype FlexTreeRequiredField,\n\ttype FlexTreeSequenceField,\n\ttype FlexTreeTypedField,\n\ttype FlexTreeUnknownUnboxed,\n\tflexTreeMarker,\n\tindexForAt,\n\ttype FlexTreeHydratedContext,\n\ttype FlexFieldKind,\n\tFieldKinds,\n\ttype SequenceFieldEditBuilder,\n\tcursorForMapTreeNode,\n\ttype OptionalFieldEditBuilder,\n\ttype ValueFieldEditBuilder,\n\ttype FlexibleNodeContent,\n\ttype FlexTreeHydratedContextMinimal,\n\ttype FlexibleFieldContent,\n\ttype MapTreeFieldViewGeneric,\n\ttype MapTreeNodeViewGeneric,\n\ttype HydratedFlexTreeNode,\n\tcursorForMapTreeField,\n\ttype MinimalFieldMap,\n} from \"../../feature-libraries/index.js\";\nimport { brand, filterIterable, getOrCreate, mapIterable } from \"../../util/index.js\";\n\nimport type { Context } from \"./context.js\";\nimport type { ContextualFieldProvider } from \"../fieldSchema.js\";\nimport type { TreeNode } from \"./treeNode.js\";\n\ninterface UnhydratedTreeSequenceFieldEditBuilder\n\textends SequenceFieldEditBuilder<FlexibleFieldContent, UnhydratedFlexTreeNode[]> {}\n\ntype UnhydratedFlexTreeNodeEvents = Pick<\n\tAnchorEvents,\n\t\"childrenChangedAfterBatch\" | \"subtreeChangedAfterBatch\"\n>;\n\n/** A node's parent field and its index in that field */\ntype LocationInField = FlexTreeNode[\"parentField\"];\n\n/**\n * The {@link Unhydrated} implementation of {@link FlexTreeNode}.\n */\nexport class UnhydratedFlexTreeNode\n\timplements FlexTreeNode, MapTreeNodeViewGeneric<UnhydratedFlexTreeNode>\n{\n\tpublic isHydrated(): this is HydratedFlexTreeNode {\n\t\treturn false;\n\t}\n\n\tprivate location = unparentedLocation;\n\n\tpublic get storedSchema(): TreeNodeStoredSchema {\n\t\treturn (\n\t\t\tthis.context.schema.nodeSchema.get(this.data.type) ?? fail(0xb46 /* missing schema */)\n\t\t);\n\t}\n\n\t/**\n\t * Cache storing the {@link TreeNode} for this inner node.\n\t * @remarks\n\t * When creating a `TreeNode` for this `UnhydratedFlexTreeNode`, cache the `TreeNode` in this property.\n\t * Currently this is done by {@link TreeNodeKernel}.\n\t *\n\t * See {@link getOrCreateNodeFromInnerNode} how to get the `TreeNode`, even if not already created, regardless of hydration status.\n\t */\n\tpublic treeNode: TreeNode | undefined;\n\n\tpublic readonly [flexTreeMarker] = FlexTreeEntityKind.Node as const;\n\n\tprivate readonly _events = createEmitter<UnhydratedFlexTreeNodeEvents>();\n\tpublic get events(): Listenable<UnhydratedFlexTreeNodeEvents> &\n\t\tHasListeners<UnhydratedFlexTreeNodeEvents> {\n\t\treturn this._events;\n\t}\n\n\tpublic get context(): FlexTreeContext {\n\t\treturn this.simpleContext.flexContext;\n\t}\n\n\t/**\n\t * Create a new UnhydratedFlexTreeNode.\n\t */\n\tpublic constructor(\n\t\t/**\n\t\t * The {@link NodeData} for this node.\n\t\t */\n\t\tpublic readonly data: NodeData,\n\t\t/**\n\t\t * All {@link UnhydratedFlexTreeField} for this node that have been created so far.\n\t\t * @remarks\n\t\t * This includes all non-empty fields, but also any empty fields which have been previously requested.\n\t\t */\n\t\tprivate readonly fieldsAll: Map<FieldKey, UnhydratedFlexTreeField>,\n\t\t/**\n\t\t * The {@link Context} for this node.\n\t\t * @remarks\n\t\t * Provides access to all schema reachable from this node.\n\t\t * See {@link getUnhydratedContext}.\n\t\t */\n\t\tpublic readonly simpleContext: Context,\n\t) {\n\t\tfor (const [_key, field] of this.fieldsAll) {\n\t\t\tfield.parent = this;\n\t\t}\n\t}\n\n\t/**\n\t * The non-empty fields on this node.\n\t * @remarks\n\t * This is needed to implement {@link MapTreeNodeViewGeneric.fields}, which must omit empty fields.\n\t * Due to having to detect if a field is empty, this forces the evaluation of any pending defaults in the fields.\n\t * Use {@link allFieldsLazy} to avoid evaluating pending defaults.\n\t */\n\tpublic readonly fields: MinimalFieldMap<UnhydratedFlexTreeField> = {\n\t\tget: (key: FieldKey): UnhydratedFlexTreeField | undefined => this.tryGetField(key),\n\t\t[Symbol.iterator]: (): IterableIterator<[FieldKey, UnhydratedFlexTreeField]> =>\n\t\t\tfilterIterable(this.fieldsAll, ([, field]) => field.length > 0),\n\t};\n\n\tpublic [Symbol.iterator](): IterableIterator<UnhydratedFlexTreeField> {\n\t\treturn mapIterable(this.fields, ([, field]) => field)[Symbol.iterator]();\n\t}\n\n\t/**\n\t * Gets all fields, without filtering out empty ones.\n\t * @remarks\n\t * This avoids forcing the evaluating of pending defaults in the fields, and also saves a copy on access.\n\t */\n\tpublic get allFieldsLazy(): ReadonlyMap<FieldKey, UnhydratedFlexTreeField> {\n\t\treturn this.fieldsAll;\n\t}\n\n\tpublic get type(): TreeNodeSchemaIdentifier {\n\t\treturn this.data.type;\n\t}\n\n\tprivate getOrCreateField(key: FieldKey): UnhydratedFlexTreeField {\n\t\treturn getOrCreate(this.fieldsAll, key, () => {\n\t\t\tconst stored = this.storedSchema.getFieldSchema(key).kind;\n\t\t\tconst field = createField(this.context, stored, key, []);\n\t\t\tfield.parent = this;\n\t\t\treturn field;\n\t\t});\n\t}\n\n\t/**\n\t * Set this node's parentage (see {@link FlexTreeNode.parentField}).\n\t * @remarks The node may be given a parent if it has none, or may have its parent removed (by passing `undefined`).\n\t * However, a node with a parent may not be directly re-assigned a different parent.\n\t * That likely indicates either an attempted multi-parenting or an attempt to \"move\" the node, neither of which are supported.\n\t * Removing a node's parent twice in a row is also not supported, as it likely indicates a bug.\n\t */\n\tpublic adoptBy(parent: undefined): void;\n\tpublic adoptBy(parent: UnhydratedFlexTreeField, index: number): void;\n\tpublic adoptBy(parent: UnhydratedFlexTreeField | undefined, index?: number): void {\n\t\tif (parent !== undefined) {\n\t\t\tassert(index !== undefined, 0xa08 /* Expected index */);\n\t\t\tif (this.location !== unparentedLocation) {\n\t\t\t\tthrow new UsageError(\"A node may not be in more than one place in the tree\");\n\t\t\t}\n\t\t\tlet unhydratedNode: UnhydratedFlexTreeNode | undefined = parent.parent;\n\t\t\twhile (unhydratedNode !== undefined) {\n\t\t\t\tif (unhydratedNode === this) {\n\t\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\t\"A node may not be inserted into a location that is under itself\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst parentNode: FlexTreeNode | undefined = unhydratedNode.parentField.parent.parent;\n\t\t\t\tassert(\n\t\t\t\t\tparentNode === undefined || parentNode instanceof UnhydratedFlexTreeNode,\n\t\t\t\t\t0xb77 /* Unhydrated node's parent should be an unhydrated node */,\n\t\t\t\t);\n\t\t\t\tunhydratedNode = parentNode;\n\t\t\t}\n\t\t\tthis.location = { parent, index };\n\t\t} else {\n\t\t\tassert(\n\t\t\t\tthis.location !== unparentedLocation,\n\t\t\t\t0xa09 /* Node may not be un-adopted if it does not have a parent */,\n\t\t\t);\n\t\t\tthis.location = unparentedLocation;\n\t\t}\n\t}\n\n\t/**\n\t * The field this tree is in, and the index within that field.\n\t * @remarks If this node is unparented, this method will return the special {@link unparentedLocation} as the parent.\n\t */\n\tpublic get parentField(): LocationInField {\n\t\treturn this.location;\n\t}\n\n\tpublic borrowCursor(): ITreeCursorSynchronous {\n\t\treturn cursorForMapTreeNode<MapTreeNodeViewGeneric<UnhydratedFlexTreeNode>>(this);\n\t}\n\n\tpublic tryGetField(key: FieldKey): UnhydratedFlexTreeField | undefined {\n\t\tconst field = this.fieldsAll.get(key);\n\t\t// Only return the field if it is not empty, in order to fulfill the contract of `tryGetField`.\n\t\tif (field !== undefined && field.length > 0) {\n\t\t\treturn field;\n\t\t}\n\t}\n\n\tpublic getBoxed(key: string): UnhydratedFlexTreeField {\n\t\tconst fieldKey: FieldKey = brand(key);\n\t\treturn this.getOrCreateField(fieldKey);\n\t}\n\n\tpublic keys(): IterableIterator<FieldKey> {\n\t\treturn Array.from(this.fields, ([key]) => key)[Symbol.iterator]();\n\t}\n\n\tpublic get value(): Value {\n\t\treturn this.data.value;\n\t}\n\n\tpublic emitChangedEvent(key: FieldKey): void {\n\t\tthis._events.emit(\"childrenChangedAfterBatch\", { changedFields: new Set([key]) });\n\n\t\t// Also emit subtree changed event for this node and all ancestors.\n\t\tthis.#emitSubtreeChangedEvents();\n\t}\n\n\t/**\n\t * Emit subtree changed events for this node and all ancestors.\n\t */\n\t#emitSubtreeChangedEvents(): void {\n\t\tthis._events.emit(\"subtreeChangedAfterBatch\");\n\n\t\tconst parent = this.parentField.parent.parent;\n\t\tassert(\n\t\t\tparent === undefined || parent instanceof UnhydratedFlexTreeNode,\n\t\t\t0xb76 /* Unhydrated node's parent should be an unhydrated node */,\n\t\t);\n\t\tif (parent !== undefined) {\n\t\t\tparent.#emitSubtreeChangedEvents();\n\t\t}\n\t}\n}\n\n/**\n * Implementation of `FlexTreeContext`.\n *\n * @remarks An editor is required to edit the FlexTree.\n */\nexport class UnhydratedContext implements FlexTreeContext {\n\t/**\n\t * @param flexSchema - Schema to use when working with the tree.\n\t */\n\tpublic constructor(\n\t\tpublic readonly schemaPolicy: SchemaPolicy,\n\t\tpublic readonly schema: TreeStoredSchema,\n\t) {}\n\n\tpublic isDisposed(): boolean {\n\t\treturn false;\n\t}\n\n\tpublic isHydrated(): this is FlexTreeHydratedContext {\n\t\treturn false;\n\t}\n}\n\n// #region Fields\n\n/**\n * A special singleton that is the implicit {@link LocationInField} of all un-parented {@link UnhydratedFlexTreeNode}s.\n * @remarks This exists because {@link UnhydratedFlexTreeNode.parentField} must return a field.\n * If a {@link UnhydratedFlexTreeNode} is created without a parent, its {@link UnhydratedFlexTreeNode.parentField} property will point to this object.\n * However, this field cannot be used in any practical way because it is empty, i.e. it does not actually contain the children that claim to be parented under it.\n * It has the \"empty\" schema and it will always contain zero children if queried.\n * Any nodes with this location will have a dummy parent index of `-1`.\n *\n * TODO: make this make sense.\n */\nconst unparentedLocation: LocationInField = {\n\tparent: {\n\t\tkey: dummyRoot,\n\t\tparent: undefined,\n\t\tschema: brand(FieldKinds.optional.identifier),\n\t},\n\tindex: 0,\n};\n\n/**\n * The {@link Unhydrated} implementation of {@link FlexTreeField}.\n */\nexport class UnhydratedFlexTreeField\n\timplements FlexTreeField, MapTreeFieldViewGeneric<UnhydratedFlexTreeNode>\n{\n\tpublic [flexTreeMarker] = FlexTreeEntityKind.Field as const;\n\n\tpublic parent: UnhydratedFlexTreeNode | undefined = undefined;\n\n\tpublic constructor(\n\t\tpublic readonly context: FlexTreeContext,\n\t\tpublic readonly schema: FieldKindIdentifier,\n\t\tpublic readonly key: FieldKey,\n\t\t/**\n\t\t * The children of this field.\n\t\t * @remarks\n\t\t * This is either an array of {@link UnhydratedFlexTreeNode}s or a {@link ContextualFieldProvider} that will be used to populate the children lazily (after which it will become an array).\n\t\t * See {@link fillPendingDefaults}.\n\t\t * Note that any fields using a {@link ConstantFieldProvider} should be evaluated before constructing the UnhydratedFlexTreeField.\n\t\t */\n\t\tprivate lazyChildren: UnhydratedFlexTreeNode[] | ContextualFieldProvider,\n\t) {\n\t\t// When this field is created (which only happens one time, because it is cached), all the children become parented for the first time.\n\t\t// \"Adopt\" each child by updating its parent information to point to this field.\n\t\tif (Array.isArray(lazyChildren)) {\n\t\t\tfor (const [i, child] of lazyChildren.entries()) {\n\t\t\t\tchild.adoptBy(this, i);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic borrowCursor(): ITreeCursorSynchronous {\n\t\treturn cursorForMapTreeField<MapTreeNodeViewGeneric<UnhydratedFlexTreeNode>>(\n\t\t\tthis.children,\n\t\t);\n\t}\n\n\tprivate getPendingDefault(): ContextualFieldProvider | undefined {\n\t\treturn !Array.isArray(this.lazyChildren) ? this.lazyChildren : undefined;\n\t}\n\n\t/**\n\t * Populate pending default (if present) using the provided context.\n\t * @remarks\n\t * This apply to just this field: caller will likely want to recursively walk the tree.\n\t * @see {@link pendingDefault}.\n\t */\n\tpublic fillPendingDefaults(context: FlexTreeHydratedContextMinimal): void {\n\t\tconst provider = this.getPendingDefault();\n\t\tif (provider) {\n\t\t\tconst content = provider(context);\n\t\t\tthis.lazyChildren = content;\n\t\t}\n\t}\n\n\t/**\n\t * Returns true if this field has a pending default due to defined defined using a {@link ContextualFieldProvider}.\n\t */\n\tpublic get pendingDefault(): boolean {\n\t\treturn this.getPendingDefault() !== undefined;\n\t}\n\n\tpublic get children(): UnhydratedFlexTreeNode[] {\n\t\tconst provider = this.getPendingDefault();\n\t\tif (provider) {\n\t\t\tconst content = provider(\"UseGlobalContext\");\n\t\t\tthis.lazyChildren = content;\n\t\t}\n\t\treturn this.lazyChildren as UnhydratedFlexTreeNode[];\n\t}\n\n\tpublic get length(): number {\n\t\treturn this.children.length;\n\t}\n\n\tpublic is<TKind2 extends FlexFieldKind>(kind: TKind2): this is FlexTreeTypedField<TKind2> {\n\t\treturn this.schema === kind.identifier;\n\t}\n\n\tpublic boxedAt(index: number): FlexTreeNode | undefined {\n\t\tconst i = indexForAt(index, this.length);\n\t\tif (i === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst m = this.children[i];\n\t\treturn m;\n\t}\n\n\tpublic [Symbol.iterator](): IterableIterator<UnhydratedFlexTreeNode> {\n\t\treturn this.children[Symbol.iterator]();\n\t}\n\n\t/**\n\t * Mutate this field.\n\t * @param edit - A function which receives the current `MapTree`s that comprise the contents of the field so that it may be mutated.\n\t * The function may mutate the array in place or return a new array.\n\t * If a new array is returned then it will be used as the new contents of the field, otherwise the original array will be continue to be used.\n\t * @remarks All edits to the field (i.e. mutations of the field's MapTrees) should be directed through this function.\n\t * This function ensures that the parent MapTree has no empty fields (which is an invariant of `MapTree`) after the mutation.\n\t */\n\tprotected edit(\n\t\tedit: (mapTrees: UnhydratedFlexTreeNode[]) => void | UnhydratedFlexTreeNode[],\n\t): void {\n\t\t// Clear parents for all old map trees.\n\t\tfor (const tree of this.children) {\n\t\t\ttree.adoptBy(undefined);\n\t\t}\n\n\t\tthis.lazyChildren = edit(this.children) ?? this.children;\n\n\t\t// Set parents for all new map trees.\n\t\tfor (const [index, tree] of this.children.entries()) {\n\t\t\ttree.adoptBy(this, index);\n\t\t}\n\n\t\tthis.parent?.emitChangedEvent(this.key);\n\t}\n\n\tpublic getFieldPath(): NormalizedFieldUpPath {\n\t\tthrow unsupportedUsageError(\"Editing an array\");\n\t}\n\n\t/** Unboxes leaf nodes to their values */\n\tprotected unboxed(index: number): TreeValue | UnhydratedFlexTreeNode {\n\t\tconst child = this.children[index] ?? oob();\n\t\tconst value = child.value;\n\t\tif (value !== undefined) {\n\t\t\treturn value;\n\t\t}\n\t\treturn child;\n\t}\n}\n\n/**\n * The {@link Unhydrated} implementation of {@link FlexTreeOptionalField}.\n */\nexport class UnhydratedOptionalField\n\textends UnhydratedFlexTreeField\n\timplements FlexTreeOptionalField\n{\n\tpublic readonly editor = {\n\t\tset: (newContent: FlexibleNodeContent | undefined): void => {\n\t\t\tif (newContent !== undefined) {\n\t\t\t\tassert(\n\t\t\t\t\tnewContent instanceof UnhydratedFlexTreeNode,\n\t\t\t\t\t0xbb7 /* Expected unhydrated node */,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.edit((mapTrees) => {\n\t\t\t\tif (newContent !== undefined) {\n\t\t\t\t\tmapTrees[0] = newContent;\n\t\t\t\t} else {\n\t\t\t\t\tmapTrees.length = 0;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t} satisfies OptionalFieldEditBuilder<FlexibleNodeContent> &\n\t\tValueFieldEditBuilder<FlexibleNodeContent>;\n\n\tpublic get content(): FlexTreeUnknownUnboxed | undefined {\n\t\tconst value = this.children[0];\n\t\tif (value !== undefined) {\n\t\t\treturn this.unboxed(0);\n\t\t}\n\n\t\treturn undefined;\n\t}\n}\n\nclass UnhydratedRequiredField\n\textends UnhydratedOptionalField\n\timplements FlexTreeRequiredField\n{\n\tpublic override get content(): FlexTreeUnknownUnboxed {\n\t\t// This cannot use ?? since null is a legal value here.\n\t\tassert(\n\t\t\tsuper.content !== undefined,\n\t\t\t0xa57 /* Expected EagerMapTree required field to have a value */,\n\t\t);\n\t\treturn super.content;\n\t}\n}\n\n/**\n * The {@link Unhydrated} implementation of {@link FlexTreeSequenceField}.\n */\nexport class UnhydratedSequenceField\n\textends UnhydratedFlexTreeField\n\timplements FlexTreeSequenceField\n{\n\tpublic readonly editor = {\n\t\tinsert: (index, newContent): void => {\n\t\t\tfor (const c of newContent) {\n\t\t\t\tassert(c !== undefined, 0xa0a /* Unexpected sparse array content */);\n\t\t\t\tassert(c instanceof UnhydratedFlexTreeNode, 0xbb8 /* Expected unhydrated node */);\n\t\t\t}\n\t\t\tconst newContentChecked = newContent as readonly UnhydratedFlexTreeNode[];\n\t\t\tthis.edit((mapTrees) => {\n\t\t\t\tif (newContent.length < 1000) {\n\t\t\t\t\t// For \"smallish arrays\" (`1000` is not empirically derived), the `splice` function is appropriate...\n\t\t\t\t\tmapTrees.splice(index, 0, ...newContentChecked);\n\t\t\t\t} else {\n\t\t\t\t\t// ...but we avoid using `splice` + spread for very large input arrays since there is a limit on how many elements can be spread (too many will overflow the stack).\n\t\t\t\t\treturn mapTrees.slice(0, index).concat(newContentChecked, mapTrees.slice(index));\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tremove: (index, count): UnhydratedFlexTreeNode[] => {\n\t\t\tfor (let i = index; i < index + count; i++) {\n\t\t\t\tconst c = this.children[i];\n\t\t\t\tassert(c !== undefined, 0xa0b /* Unexpected sparse array */);\n\t\t\t}\n\t\t\tlet removed: UnhydratedFlexTreeNode[] | undefined;\n\t\t\tthis.edit((mapTrees) => {\n\t\t\t\tremoved = mapTrees.splice(index, count);\n\t\t\t});\n\t\t\treturn removed ?? fail(0xb4a /* Expected removed to be set by edit */);\n\t\t},\n\t} satisfies UnhydratedTreeSequenceFieldEditBuilder;\n\n\tpublic at(index: number): FlexTreeUnknownUnboxed | undefined {\n\t\tconst i = indexForAt(index, this.length);\n\t\tif (i === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn this.unboxed(i);\n\t}\n\tpublic map<U>(callbackfn: (value: FlexTreeUnknownUnboxed, index: number) => U): U[] {\n\t\treturn Array.from(this, callbackfn);\n\t}\n}\n\n// #endregion Fields\n\n/** Creates a field with the given attributes */\nexport function createField(\n\t...args: ConstructorParameters<typeof UnhydratedFlexTreeField>\n): UnhydratedFlexTreeField {\n\tswitch (args[1]) {\n\t\tcase FieldKinds.required.identifier:\n\t\tcase FieldKinds.identifier.identifier:\n\t\t\treturn new UnhydratedRequiredField(...args);\n\t\tcase FieldKinds.optional.identifier:\n\t\t\treturn new UnhydratedOptionalField(...args);\n\t\tcase FieldKinds.sequence.identifier:\n\t\t\treturn new UnhydratedSequenceField(...args);\n\t\tcase FieldKinds.forbidden.identifier:\n\t\t\t// TODO: this seems to used by unknown optional fields. They should probably use \"optional\" not \"Forbidden\" schema.\n\t\t\treturn new UnhydratedFlexTreeField(...args);\n\t\tdefault:\n\t\t\treturn fail(0xb9d /* unsupported field kind */);\n\t}\n}\n\nexport function unsupportedUsageError(message?: string): Error {\n\treturn new UsageError(\n\t\t`${\n\t\t\tmessage ?? \"Operation\"\n\t\t} is not supported for content that has not yet been inserted into the tree`,\n\t);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/tree",
3
- "version": "2.61.0-355651",
3
+ "version": "2.61.0-355656",
4
4
  "description": "Distributed tree",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -101,17 +101,17 @@
101
101
  "temp-directory": "nyc/.nyc_output"
102
102
  },
103
103
  "dependencies": {
104
- "@fluid-internal/client-utils": "2.61.0-355651",
105
- "@fluidframework/container-runtime": "2.61.0-355651",
106
- "@fluidframework/core-interfaces": "2.61.0-355651",
107
- "@fluidframework/core-utils": "2.61.0-355651",
108
- "@fluidframework/datastore-definitions": "2.61.0-355651",
109
- "@fluidframework/driver-definitions": "2.61.0-355651",
110
- "@fluidframework/id-compressor": "2.61.0-355651",
111
- "@fluidframework/runtime-definitions": "2.61.0-355651",
112
- "@fluidframework/runtime-utils": "2.61.0-355651",
113
- "@fluidframework/shared-object-base": "2.61.0-355651",
114
- "@fluidframework/telemetry-utils": "2.61.0-355651",
104
+ "@fluid-internal/client-utils": "2.61.0-355656",
105
+ "@fluidframework/container-runtime": "2.61.0-355656",
106
+ "@fluidframework/core-interfaces": "2.61.0-355656",
107
+ "@fluidframework/core-utils": "2.61.0-355656",
108
+ "@fluidframework/datastore-definitions": "2.61.0-355656",
109
+ "@fluidframework/driver-definitions": "2.61.0-355656",
110
+ "@fluidframework/id-compressor": "2.61.0-355656",
111
+ "@fluidframework/runtime-definitions": "2.61.0-355656",
112
+ "@fluidframework/runtime-utils": "2.61.0-355656",
113
+ "@fluidframework/shared-object-base": "2.61.0-355656",
114
+ "@fluidframework/telemetry-utils": "2.61.0-355656",
115
115
  "@sinclair/typebox": "^0.34.13",
116
116
  "@tylerbu/sorted-btree-es6": "^1.8.0",
117
117
  "@types/ungap__structured-clone": "^1.2.0",
@@ -121,19 +121,19 @@
121
121
  "devDependencies": {
122
122
  "@arethetypeswrong/cli": "^0.17.1",
123
123
  "@biomejs/biome": "~1.9.3",
124
- "@fluid-internal/mocha-test-setup": "2.61.0-355651",
125
- "@fluid-private/stochastic-test-utils": "2.61.0-355651",
126
- "@fluid-private/test-dds-utils": "2.61.0-355651",
127
- "@fluid-private/test-drivers": "2.61.0-355651",
124
+ "@fluid-internal/mocha-test-setup": "2.61.0-355656",
125
+ "@fluid-private/stochastic-test-utils": "2.61.0-355656",
126
+ "@fluid-private/test-dds-utils": "2.61.0-355656",
127
+ "@fluid-private/test-drivers": "2.61.0-355656",
128
128
  "@fluid-tools/benchmark": "^0.51.0",
129
129
  "@fluid-tools/build-cli": "^0.58.1",
130
130
  "@fluidframework/build-common": "^2.0.3",
131
131
  "@fluidframework/build-tools": "^0.58.1",
132
- "@fluidframework/container-definitions": "2.61.0-355651",
133
- "@fluidframework/container-loader": "2.61.0-355651",
132
+ "@fluidframework/container-definitions": "2.61.0-355656",
133
+ "@fluidframework/container-loader": "2.61.0-355656",
134
134
  "@fluidframework/eslint-config-fluid": "^6.0.0",
135
- "@fluidframework/test-runtime-utils": "2.61.0-355651",
136
- "@fluidframework/test-utils": "2.61.0-355651",
135
+ "@fluidframework/test-runtime-utils": "2.61.0-355656",
136
+ "@fluidframework/test-utils": "2.61.0-355656",
137
137
  "@fluidframework/tree-previous": "npm:@fluidframework/tree@2.60.0",
138
138
  "@microsoft/api-extractor": "7.52.11",
139
139
  "@types/diff": "^3.5.1",
@@ -42,5 +42,3 @@ export { getOrCreateHydratedFlexTreeNode } from "./lazyNode.js";
42
42
  export { getSchemaAndPolicy, indexForAt } from "./utilities.js";
43
43
 
44
44
  export { treeStatusFromAnchorCache } from "./utilities.js";
45
-
46
- export { currentObserver, withObservation, type Observer } from "./observer.js";
@@ -33,7 +33,6 @@ import {
33
33
  } from "./flexTreeTypes.js";
34
34
  import { LazyEntity } from "./lazyEntity.js";
35
35
  import { makeField } from "./lazyField.js";
36
- import { currentObserver } from "./observer.js";
37
36
 
38
37
  /**
39
38
  * Get or create a {@link HydratedFlexTreeNode} for the given context at node indicated by the cursor.
@@ -119,23 +118,18 @@ export class LazyTreeNode extends LazyEntity<Anchor> implements HydratedFlexTree
119
118
  public readonly fields: Pick<Map<FieldKey, FlexTreeField>, typeof Symbol.iterator | "get"> =
120
119
  {
121
120
  get: (key: FieldKey): FlexTreeField | undefined => this.tryGetField(key),
122
- [Symbol.iterator]: (): IterableIterator<[FieldKey, FlexTreeField]> => {
123
- currentObserver?.observeNodeContent(this);
124
-
125
- return mapCursorFields(this.cursor, (cursor) => {
121
+ [Symbol.iterator]: (): IterableIterator<[FieldKey, FlexTreeField]> =>
122
+ mapCursorFields(this.cursor, (cursor) => {
126
123
  const key: FieldKey = cursor.getFieldKey();
127
124
  const pair: [FieldKey, FlexTreeField] = [
128
125
  key,
129
126
  makeField(this.context, this.storedSchema.getFieldSchema(key).kind, cursor),
130
127
  ];
131
128
  return pair;
132
- }).values();
133
- },
129
+ }).values(),
134
130
  };
135
131
 
136
132
  public tryGetField(fieldKey: FieldKey): FlexTreeField | undefined {
137
- currentObserver?.observeNodeContent(this);
138
-
139
133
  const schema = this.storedSchema.getFieldSchema(fieldKey);
140
134
  return inCursorField(this.cursor, fieldKey, (cursor) => {
141
135
  if (cursor.getFieldLength() === 0) {
@@ -146,8 +140,6 @@ export class LazyTreeNode extends LazyEntity<Anchor> implements HydratedFlexTree
146
140
  }
147
141
 
148
142
  public getBoxed(key: FieldKey): FlexTreeField {
149
- currentObserver?.observeNodeContent(this);
150
-
151
143
  const fieldSchema = this.storedSchema.getFieldSchema(key);
152
144
  return inCursorField(this.cursor, key, (cursor) => {
153
145
  return makeField(this.context, fieldSchema.kind, cursor);
@@ -171,9 +171,6 @@ export {
171
171
  type FlexTreeHydratedContextMinimal,
172
172
  type HydratedFlexTreeNode,
173
173
  getOrCreateHydratedFlexTreeNode,
174
- currentObserver,
175
- withObservation,
176
- type Observer,
177
174
  } from "./flex-tree/index.js";
178
175
 
179
176
  export {
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/tree";
9
- export const pkgVersion = "2.61.0-355651";
9
+ export const pkgVersion = "2.61.0-355656";
@@ -17,13 +17,13 @@ import type { IIdCompressor } from "@fluidframework/id-compressor";
17
17
  import {
18
18
  asIndex,
19
19
  getKernel,
20
+ type TreeNode,
20
21
  type Unhydrated,
21
22
  TreeBeta,
22
23
  tryGetSchema,
23
24
  createFromCursor,
24
25
  FieldKind,
25
26
  normalizeFieldSchema,
26
- TreeNode,
27
27
  type ImplicitFieldSchema,
28
28
  type InsertableField,
29
29
  type TreeFieldFromImplicitField,
@@ -76,9 +76,6 @@ import {
76
76
  fluidVersionToFieldBatchCodecWriteVersion,
77
77
  type LocalNodeIdentifier,
78
78
  type FlexTreeSequenceField,
79
- type FlexTreeNode,
80
- type Observer,
81
- withObservation,
82
79
  } from "../feature-libraries/index.js";
83
80
  import { independentInitializedView, type ViewContent } from "./independentView.js";
84
81
  import { SchematizingSimpleTreeView, ViewSlot } from "./schematizingTreeView.js";
@@ -422,14 +419,6 @@ export interface TreeAlpha {
422
419
  children(
423
420
  node: TreeNode,
424
421
  ): Iterable<[propertyKey: string | number, child: TreeNode | TreeLeafValue]>;
425
-
426
- /**
427
- * Track observations of any TreeNode content.
428
- */
429
- trackObservations<TResult>(
430
- onInvalidation: () => void,
431
- trackDuring: () => TResult,
432
- ): { result: TResult; unsubscribe: () => void };
433
422
  }
434
423
 
435
424
  /**
@@ -438,50 +427,6 @@ export interface TreeAlpha {
438
427
  * @alpha
439
428
  */
440
429
  export const TreeAlpha: TreeAlpha = {
441
- trackObservations<TResult>(
442
- onInvalidation: () => void,
443
- trackDuring: () => TResult,
444
- ): { result: TResult; unsubscribe: () => void } {
445
- const subscriptions = new Map<FlexTreeNode | TreeBranch, () => void>();
446
- const observer: Observer = {
447
- observeNodeContent(flexNode: FlexTreeNode): void {
448
- if (flexNode.value !== undefined) {
449
- // Leaf value, nothing to observe.
450
- return;
451
- }
452
- if (!subscriptions.has(flexNode)) {
453
- const node = getOrCreateNodeFromInnerNode(flexNode);
454
- assert(node instanceof TreeNode, "Unexpected leaf value");
455
- const unsubscribe = treeNodeApi.on(node, "nodeChanged", () => {
456
- onInvalidation();
457
- });
458
- subscriptions.set(flexNode, unsubscribe);
459
- }
460
- },
461
- observeParentOf(node: FlexTreeNode): void {
462
- throw new UsageError("Observation tracking for parents is currently not supported.");
463
- // This is conservatively correct, but could be optimized.
464
- // observer.observeNodeContent(parent);
465
- },
466
- };
467
- const result = withObservation(observer, trackDuring);
468
-
469
- let subscribed = true;
470
-
471
- return {
472
- result,
473
- unsubscribe: () => {
474
- if (!subscribed) {
475
- throw new UsageError("Already unsubscribed");
476
- }
477
- subscribed = false;
478
- for (const unsubscribe of subscriptions.values()) {
479
- unsubscribe();
480
- }
481
- },
482
- };
483
- },
484
-
485
430
  branch(node: TreeNode): TreeBranch | undefined {
486
431
  const kernel = getKernel(node);
487
432
  if (!kernel.isHydrated()) {
@@ -50,7 +50,6 @@ import {
50
50
  type HydratedFlexTreeNode,
51
51
  cursorForMapTreeField,
52
52
  type MinimalFieldMap,
53
- currentObserver,
54
53
  } from "../../feature-libraries/index.js";
55
54
  import { brand, filterIterable, getOrCreate, mapIterable } from "../../util/index.js";
56
55
 
@@ -145,10 +144,8 @@ export class UnhydratedFlexTreeNode
145
144
  */
146
145
  public readonly fields: MinimalFieldMap<UnhydratedFlexTreeField> = {
147
146
  get: (key: FieldKey): UnhydratedFlexTreeField | undefined => this.tryGetField(key),
148
- [Symbol.iterator]: (): IterableIterator<[FieldKey, UnhydratedFlexTreeField]> => {
149
- currentObserver?.observeNodeContent(this);
150
- return filterIterable(this.fieldsAll, ([, field]) => field.length > 0);
151
- },
147
+ [Symbol.iterator]: (): IterableIterator<[FieldKey, UnhydratedFlexTreeField]> =>
148
+ filterIterable(this.fieldsAll, ([, field]) => field.length > 0),
152
149
  };
153
150
 
154
151
  public [Symbol.iterator](): IterableIterator<UnhydratedFlexTreeField> {
@@ -221,7 +218,6 @@ export class UnhydratedFlexTreeNode
221
218
  * @remarks If this node is unparented, this method will return the special {@link unparentedLocation} as the parent.
222
219
  */
223
220
  public get parentField(): LocationInField {
224
- currentObserver?.observeParentOf(this);
225
221
  return this.location;
226
222
  }
227
223
 
@@ -230,8 +226,6 @@ export class UnhydratedFlexTreeNode
230
226
  }
231
227
 
232
228
  public tryGetField(key: FieldKey): UnhydratedFlexTreeField | undefined {
233
- currentObserver?.observeNodeContent(this);
234
-
235
229
  const field = this.fieldsAll.get(key);
236
230
  // Only return the field if it is not empty, in order to fulfill the contract of `tryGetField`.
237
231
  if (field !== undefined && field.length > 0) {
@@ -240,8 +234,6 @@ export class UnhydratedFlexTreeNode
240
234
  }
241
235
 
242
236
  public getBoxed(key: string): UnhydratedFlexTreeField {
243
- currentObserver?.observeNodeContent(this);
244
-
245
237
  const fieldKey: FieldKey = brand(key);
246
238
  return this.getOrCreateField(fieldKey);
247
239
  }
@@ -1,17 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import type { FlexTreeNode } from "./flexTreeTypes.js";
6
- export interface Observer {
7
- observeNodeContent(node: FlexTreeNode): void;
8
- observeParentOf(node: FlexTreeNode): void;
9
- }
10
- /**
11
- * The current observer, if any.
12
- * @remarks
13
- * Set via {@link setObserver} as used by {@link withObservation}.
14
- */
15
- export declare let currentObserver: Observer | undefined;
16
- export declare function withObservation<T>(newObserver: Observer, f: () => T): T;
17
- //# sourceMappingURL=observer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observer.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/flex-tree/observer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,QAAQ;IACxB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7C,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;CAC1C;AACD;;;;GAIG;AAEH,eAAO,IAAI,eAAe,EAAE,QAAQ,GAAG,SAAS,CAAC;AAajD,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAOvE"}
@@ -1,30 +0,0 @@
1
- "use strict";
2
- /*!
3
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
- * Licensed under the MIT License.
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.withObservation = exports.currentObserver = void 0;
8
- const internal_1 = require("@fluidframework/core-utils/internal");
9
- const observerStack = [];
10
- function setObserver(newObserver) {
11
- observerStack.push(newObserver);
12
- exports.currentObserver = newObserver;
13
- }
14
- function clearObserver() {
15
- (0, internal_1.debugAssert)(() => observerStack.length > 0 || "Empty Observer stack on clear");
16
- const popped = observerStack.pop();
17
- (0, internal_1.debugAssert)(() => popped === exports.currentObserver || "Mismatched observer stack");
18
- exports.currentObserver = observerStack[observerStack.length - 1];
19
- }
20
- function withObservation(newObserver, f) {
21
- setObserver(newObserver);
22
- try {
23
- return f();
24
- }
25
- finally {
26
- clearObserver();
27
- }
28
- }
29
- exports.withObservation = withObservation;
30
- //# sourceMappingURL=observer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observer.js","sourceRoot":"","sources":["../../../src/feature-libraries/flex-tree/observer.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAAkE;AAclE,MAAM,aAAa,GAAe,EAAE,CAAC;AACrC,SAAS,WAAW,CAAC,WAAqB;IACzC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChC,uBAAe,GAAG,WAAW,CAAC;AAC/B,CAAC;AACD,SAAS,aAAa;IACrB,IAAA,sBAAW,EAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,+BAA+B,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC;IACnC,IAAA,sBAAW,EAAC,GAAG,EAAE,CAAC,MAAM,KAAK,uBAAe,IAAI,2BAA2B,CAAC,CAAC;IAC7E,uBAAe,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAgB,eAAe,CAAI,WAAqB,EAAE,CAAU;IACnE,WAAW,CAAC,WAAW,CAAC,CAAC;IACzB,IAAI,CAAC;QACJ,OAAO,CAAC,EAAE,CAAC;IACZ,CAAC;YAAS,CAAC;QACV,aAAa,EAAE,CAAC;IACjB,CAAC;AACF,CAAC;AAPD,0CAOC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { debugAssert } from \"@fluidframework/core-utils/internal\";\nimport type { FlexTreeNode } from \"./flexTreeTypes.js\";\n\nexport interface Observer {\n\tobserveNodeContent(node: FlexTreeNode): void;\n\tobserveParentOf(node: FlexTreeNode): void;\n}\n/**\n * The current observer, if any.\n * @remarks\n * Set via {@link setObserver} as used by {@link withObservation}.\n */\n\nexport let currentObserver: Observer | undefined;\nconst observerStack: Observer[] = [];\nfunction setObserver(newObserver: Observer): void {\n\tobserverStack.push(newObserver);\n\tcurrentObserver = newObserver;\n}\nfunction clearObserver(): void {\n\tdebugAssert(() => observerStack.length > 0 || \"Empty Observer stack on clear\");\n\tconst popped = observerStack.pop();\n\tdebugAssert(() => popped === currentObserver || \"Mismatched observer stack\");\n\tcurrentObserver = observerStack[observerStack.length - 1];\n}\n\nexport function withObservation<T>(newObserver: Observer, f: () => T): T {\n\tsetObserver(newObserver);\n\ttry {\n\t\treturn f();\n\t} finally {\n\t\tclearObserver();\n\t}\n}\n"]}
@@ -1,17 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import type { FlexTreeNode } from "./flexTreeTypes.js";
6
- export interface Observer {
7
- observeNodeContent(node: FlexTreeNode): void;
8
- observeParentOf(node: FlexTreeNode): void;
9
- }
10
- /**
11
- * The current observer, if any.
12
- * @remarks
13
- * Set via {@link setObserver} as used by {@link withObservation}.
14
- */
15
- export declare let currentObserver: Observer | undefined;
16
- export declare function withObservation<T>(newObserver: Observer, f: () => T): T;
17
- //# sourceMappingURL=observer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observer.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/flex-tree/observer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,QAAQ;IACxB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7C,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;CAC1C;AACD;;;;GAIG;AAEH,eAAO,IAAI,eAAe,EAAE,QAAQ,GAAG,SAAS,CAAC;AAajD,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAOvE"}
@@ -1,32 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { debugAssert } from "@fluidframework/core-utils/internal";
6
- /**
7
- * The current observer, if any.
8
- * @remarks
9
- * Set via {@link setObserver} as used by {@link withObservation}.
10
- */
11
- export let currentObserver;
12
- const observerStack = [];
13
- function setObserver(newObserver) {
14
- observerStack.push(newObserver);
15
- currentObserver = newObserver;
16
- }
17
- function clearObserver() {
18
- debugAssert(() => observerStack.length > 0 || "Empty Observer stack on clear");
19
- const popped = observerStack.pop();
20
- debugAssert(() => popped === currentObserver || "Mismatched observer stack");
21
- currentObserver = observerStack[observerStack.length - 1];
22
- }
23
- export function withObservation(newObserver, f) {
24
- setObserver(newObserver);
25
- try {
26
- return f();
27
- }
28
- finally {
29
- clearObserver();
30
- }
31
- }
32
- //# sourceMappingURL=observer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observer.js","sourceRoot":"","sources":["../../../src/feature-libraries/flex-tree/observer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAOlE;;;;GAIG;AAEH,MAAM,CAAC,IAAI,eAAqC,CAAC;AACjD,MAAM,aAAa,GAAe,EAAE,CAAC;AACrC,SAAS,WAAW,CAAC,WAAqB;IACzC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChC,eAAe,GAAG,WAAW,CAAC;AAC/B,CAAC;AACD,SAAS,aAAa;IACrB,WAAW,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,+BAA+B,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC;IACnC,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,KAAK,eAAe,IAAI,2BAA2B,CAAC,CAAC;IAC7E,eAAe,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,eAAe,CAAI,WAAqB,EAAE,CAAU;IACnE,WAAW,CAAC,WAAW,CAAC,CAAC;IACzB,IAAI,CAAC;QACJ,OAAO,CAAC,EAAE,CAAC;IACZ,CAAC;YAAS,CAAC;QACV,aAAa,EAAE,CAAC;IACjB,CAAC;AACF,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { debugAssert } from \"@fluidframework/core-utils/internal\";\nimport type { FlexTreeNode } from \"./flexTreeTypes.js\";\n\nexport interface Observer {\n\tobserveNodeContent(node: FlexTreeNode): void;\n\tobserveParentOf(node: FlexTreeNode): void;\n}\n/**\n * The current observer, if any.\n * @remarks\n * Set via {@link setObserver} as used by {@link withObservation}.\n */\n\nexport let currentObserver: Observer | undefined;\nconst observerStack: Observer[] = [];\nfunction setObserver(newObserver: Observer): void {\n\tobserverStack.push(newObserver);\n\tcurrentObserver = newObserver;\n}\nfunction clearObserver(): void {\n\tdebugAssert(() => observerStack.length > 0 || \"Empty Observer stack on clear\");\n\tconst popped = observerStack.pop();\n\tdebugAssert(() => popped === currentObserver || \"Mismatched observer stack\");\n\tcurrentObserver = observerStack[observerStack.length - 1];\n}\n\nexport function withObservation<T>(newObserver: Observer, f: () => T): T {\n\tsetObserver(newObserver);\n\ttry {\n\t\treturn f();\n\t} finally {\n\t\tclearObserver();\n\t}\n}\n"]}
@@ -1,39 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- import { debugAssert } from "@fluidframework/core-utils/internal";
7
- import type { FlexTreeNode } from "./flexTreeTypes.js";
8
-
9
- export interface Observer {
10
- observeNodeContent(node: FlexTreeNode): void;
11
- observeParentOf(node: FlexTreeNode): void;
12
- }
13
- /**
14
- * The current observer, if any.
15
- * @remarks
16
- * Set via {@link setObserver} as used by {@link withObservation}.
17
- */
18
-
19
- export let currentObserver: Observer | undefined;
20
- const observerStack: Observer[] = [];
21
- function setObserver(newObserver: Observer): void {
22
- observerStack.push(newObserver);
23
- currentObserver = newObserver;
24
- }
25
- function clearObserver(): void {
26
- debugAssert(() => observerStack.length > 0 || "Empty Observer stack on clear");
27
- const popped = observerStack.pop();
28
- debugAssert(() => popped === currentObserver || "Mismatched observer stack");
29
- currentObserver = observerStack[observerStack.length - 1];
30
- }
31
-
32
- export function withObservation<T>(newObserver: Observer, f: () => T): T {
33
- setObserver(newObserver);
34
- try {
35
- return f();
36
- } finally {
37
- clearObserver();
38
- }
39
- }