document-model 1.0.55 → 1.1.0-debug.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/browser/cjs/_virtual/_commonjsHelpers.js +7 -0
  3. package/dist/browser/cjs/_virtual/_commonjsHelpers.js.map +1 -0
  4. package/dist/browser/cjs/_virtual/browser.js +35 -0
  5. package/dist/browser/cjs/_virtual/browser.js.map +1 -0
  6. package/dist/browser/cjs/_virtual/index.js +5 -0
  7. package/dist/browser/cjs/_virtual/index.js.map +1 -0
  8. package/dist/browser/cjs/_virtual/index2.js +5 -0
  9. package/dist/browser/cjs/_virtual/index2.js.map +1 -0
  10. package/dist/browser/cjs/_virtual/index3.js +5 -0
  11. package/dist/browser/cjs/_virtual/index3.js.map +1 -0
  12. package/dist/browser/cjs/_virtual/index4.js +5 -0
  13. package/dist/browser/cjs/_virtual/index4.js.map +1 -0
  14. package/dist/browser/cjs/_virtual/index5.js +5 -0
  15. package/dist/browser/cjs/_virtual/index5.js.map +1 -0
  16. package/dist/browser/cjs/_virtual/inherits_browser.js +5 -0
  17. package/dist/browser/cjs/_virtual/inherits_browser.js.map +1 -0
  18. package/dist/browser/cjs/document-model.js +41 -1
  19. package/dist/browser/cjs/document-model.js.map +1 -0
  20. package/dist/browser/cjs/document.js +15 -1
  21. package/dist/browser/cjs/document.js.map +1 -0
  22. package/dist/browser/cjs/index.js +14 -1
  23. package/dist/browser/cjs/index.js.map +1 -0
  24. package/dist/browser/cjs/src/document/actions/creators.js +46 -0
  25. package/dist/browser/cjs/src/document/actions/creators.js.map +1 -0
  26. package/dist/browser/cjs/src/document/actions/index.js +173 -0
  27. package/dist/browser/cjs/src/document/actions/index.js.map +1 -0
  28. package/dist/browser/cjs/src/document/actions/types.js +15 -0
  29. package/dist/browser/cjs/src/document/actions/types.js.map +1 -0
  30. package/dist/browser/cjs/src/document/object.js +190 -0
  31. package/dist/browser/cjs/src/document/object.js.map +1 -0
  32. package/dist/browser/cjs/src/document/reducer.js +192 -0
  33. package/dist/browser/cjs/src/document/reducer.js.map +1 -0
  34. package/dist/browser/cjs/src/document/schema/zod.js +137 -0
  35. package/dist/browser/cjs/src/document/schema/zod.js.map +1 -0
  36. package/dist/browser/cjs/src/document/utils/base.js +220 -0
  37. package/dist/browser/cjs/src/document/utils/base.js.map +1 -0
  38. package/dist/browser/cjs/src/document/utils/document-helpers.js +324 -0
  39. package/dist/browser/cjs/src/document/utils/document-helpers.js.map +1 -0
  40. package/dist/browser/cjs/src/document/utils/file.js +135 -0
  41. package/dist/browser/cjs/src/document/utils/file.js.map +1 -0
  42. package/dist/browser/cjs/src/document/utils/index.js +33 -0
  43. package/dist/browser/cjs/src/document/utils/index.js.map +1 -0
  44. package/dist/browser/cjs/src/document/utils/validation.js +24 -0
  45. package/dist/browser/cjs/src/document/utils/validation.js.map +1 -0
  46. package/dist/browser/cjs/src/document-model/custom/reducers/header.js +26 -0
  47. package/dist/browser/cjs/src/document-model/custom/reducers/header.js.map +1 -0
  48. package/dist/browser/cjs/src/document-model/custom/reducers/module.js +46 -0
  49. package/dist/browser/cjs/src/document-model/custom/reducers/module.js.map +1 -0
  50. package/dist/browser/cjs/src/document-model/custom/reducers/operation-error.js +95 -0
  51. package/dist/browser/cjs/src/document-model/custom/reducers/operation-error.js.map +1 -0
  52. package/dist/browser/cjs/src/document-model/custom/reducers/operation-example.js +58 -0
  53. package/dist/browser/cjs/src/document-model/custom/reducers/operation-example.js.map +1 -0
  54. package/dist/browser/cjs/src/document-model/custom/reducers/operation.js +123 -0
  55. package/dist/browser/cjs/src/document-model/custom/reducers/operation.js.map +1 -0
  56. package/dist/browser/cjs/src/document-model/custom/reducers/state.js +66 -0
  57. package/dist/browser/cjs/src/document-model/custom/reducers/state.js.map +1 -0
  58. package/dist/browser/cjs/src/document-model/custom/reducers/versioning.js +31 -0
  59. package/dist/browser/cjs/src/document-model/custom/reducers/versioning.js.map +1 -0
  60. package/dist/browser/cjs/src/document-model/custom/utils.js +117 -0
  61. package/dist/browser/cjs/src/document-model/custom/utils.js.map +1 -0
  62. package/dist/browser/cjs/src/document-model/gen/creators.js +53 -0
  63. package/dist/browser/cjs/src/document-model/gen/creators.js.map +1 -0
  64. package/dist/browser/cjs/src/document-model/gen/document-model.js +545 -0
  65. package/dist/browser/cjs/src/document-model/gen/document-model.js.map +1 -0
  66. package/dist/browser/cjs/src/document-model/gen/header/creators.js +39 -0
  67. package/dist/browser/cjs/src/document-model/gen/header/creators.js.map +1 -0
  68. package/dist/browser/cjs/src/document-model/gen/header/object.js +26 -0
  69. package/dist/browser/cjs/src/document-model/gen/header/object.js.map +1 -0
  70. package/dist/browser/cjs/src/document-model/gen/module/creators.js +34 -0
  71. package/dist/browser/cjs/src/document-model/gen/module/creators.js.map +1 -0
  72. package/dist/browser/cjs/src/document-model/gen/module/object.js +23 -0
  73. package/dist/browser/cjs/src/document-model/gen/module/object.js.map +1 -0
  74. package/dist/browser/cjs/src/document-model/gen/object.js +47 -0
  75. package/dist/browser/cjs/src/document-model/gen/object.js.map +1 -0
  76. package/dist/browser/cjs/src/document-model/gen/operation/creators.js +59 -0
  77. package/dist/browser/cjs/src/document-model/gen/operation/creators.js.map +1 -0
  78. package/dist/browser/cjs/src/document-model/gen/operation/object.js +38 -0
  79. package/dist/browser/cjs/src/document-model/gen/operation/object.js.map +1 -0
  80. package/dist/browser/cjs/src/document-model/gen/operation-error/creators.js +44 -0
  81. package/dist/browser/cjs/src/document-model/gen/operation-error/creators.js.map +1 -0
  82. package/dist/browser/cjs/src/document-model/gen/operation-error/object.js +29 -0
  83. package/dist/browser/cjs/src/document-model/gen/operation-error/object.js.map +1 -0
  84. package/dist/browser/cjs/src/document-model/gen/operation-example/creators.js +29 -0
  85. package/dist/browser/cjs/src/document-model/gen/operation-example/creators.js.map +1 -0
  86. package/dist/browser/cjs/src/document-model/gen/operation-example/object.js +20 -0
  87. package/dist/browser/cjs/src/document-model/gen/operation-example/object.js.map +1 -0
  88. package/dist/browser/cjs/src/document-model/gen/reducer.js +255 -0
  89. package/dist/browser/cjs/src/document-model/gen/reducer.js.map +1 -0
  90. package/dist/browser/cjs/src/document-model/gen/schema/zod.js +449 -0
  91. package/dist/browser/cjs/src/document-model/gen/schema/zod.js.map +1 -0
  92. package/dist/browser/cjs/src/document-model/gen/state/creators.js +39 -0
  93. package/dist/browser/cjs/src/document-model/gen/state/creators.js.map +1 -0
  94. package/dist/browser/cjs/src/document-model/gen/state/object.js +26 -0
  95. package/dist/browser/cjs/src/document-model/gen/state/object.js.map +1 -0
  96. package/dist/browser/cjs/src/document-model/gen/utils.js +75 -0
  97. package/dist/browser/cjs/src/document-model/gen/utils.js.map +1 -0
  98. package/dist/browser/cjs/src/document-model/gen/versioning/creators.js +33 -0
  99. package/dist/browser/cjs/src/document-model/gen/versioning/creators.js.map +1 -0
  100. package/dist/browser/cjs/src/document-model/gen/versioning/object.js +23 -0
  101. package/dist/browser/cjs/src/document-model/gen/versioning/object.js.map +1 -0
  102. package/dist/browser/es/_virtual/_commonjsHelpers.js +7 -0
  103. package/dist/browser/es/_virtual/_commonjsHelpers.js.map +1 -0
  104. package/dist/browser/es/_virtual/browser.js +35 -0
  105. package/dist/browser/es/_virtual/browser.js.map +1 -0
  106. package/dist/browser/es/_virtual/index.js +5 -0
  107. package/dist/browser/es/_virtual/index.js.map +1 -0
  108. package/dist/browser/es/_virtual/index2.js +5 -0
  109. package/dist/browser/es/_virtual/index2.js.map +1 -0
  110. package/dist/browser/es/_virtual/index3.js +5 -0
  111. package/dist/browser/es/_virtual/index3.js.map +1 -0
  112. package/dist/browser/es/_virtual/index4.js +5 -0
  113. package/dist/browser/es/_virtual/index4.js.map +1 -0
  114. package/dist/browser/es/_virtual/index5.js +5 -0
  115. package/dist/browser/es/_virtual/index5.js.map +1 -0
  116. package/dist/browser/es/_virtual/inherits_browser.js +5 -0
  117. package/dist/browser/es/_virtual/inherits_browser.js.map +1 -0
  118. package/dist/browser/es/document-model.js +38 -16
  119. package/dist/browser/es/document-model.js.map +1 -0
  120. package/dist/browser/es/document.js +13 -12
  121. package/dist/browser/es/document.js.map +1 -0
  122. package/dist/browser/es/index.js +12 -14
  123. package/dist/browser/es/index.js.map +1 -0
  124. package/dist/browser/es/src/document/actions/creators.js +46 -0
  125. package/dist/browser/es/src/document/actions/creators.js.map +1 -0
  126. package/dist/browser/es/src/document/actions/index.js +174 -0
  127. package/dist/browser/es/src/document/actions/index.js.map +1 -0
  128. package/dist/browser/es/src/document/actions/types.js +15 -0
  129. package/dist/browser/es/src/document/actions/types.js.map +1 -0
  130. package/dist/browser/es/src/document/object.js +190 -0
  131. package/dist/browser/es/src/document/object.js.map +1 -0
  132. package/dist/browser/es/src/document/reducer.js +192 -0
  133. package/dist/browser/es/src/document/reducer.js.map +1 -0
  134. package/dist/browser/es/src/document/schema/zod.js +137 -0
  135. package/dist/browser/es/src/document/schema/zod.js.map +1 -0
  136. package/dist/browser/es/src/document/utils/base.js +220 -0
  137. package/dist/browser/es/src/document/utils/base.js.map +1 -0
  138. package/dist/browser/es/src/document/utils/document-helpers.js +324 -0
  139. package/dist/browser/es/src/document/utils/document-helpers.js.map +1 -0
  140. package/dist/browser/es/src/document/utils/file.js +135 -0
  141. package/dist/browser/es/src/document/utils/file.js.map +1 -0
  142. package/dist/browser/es/src/document/utils/index.js +33 -0
  143. package/dist/browser/es/src/document/utils/index.js.map +1 -0
  144. package/dist/browser/es/src/document/utils/validation.js +24 -0
  145. package/dist/browser/es/src/document/utils/validation.js.map +1 -0
  146. package/dist/browser/es/src/document-model/custom/reducers/header.js +26 -0
  147. package/dist/browser/es/src/document-model/custom/reducers/header.js.map +1 -0
  148. package/dist/browser/es/src/document-model/custom/reducers/module.js +46 -0
  149. package/dist/browser/es/src/document-model/custom/reducers/module.js.map +1 -0
  150. package/dist/browser/es/src/document-model/custom/reducers/operation-error.js +95 -0
  151. package/dist/browser/es/src/document-model/custom/reducers/operation-error.js.map +1 -0
  152. package/dist/browser/es/src/document-model/custom/reducers/operation-example.js +58 -0
  153. package/dist/browser/es/src/document-model/custom/reducers/operation-example.js.map +1 -0
  154. package/dist/browser/es/src/document-model/custom/reducers/operation.js +123 -0
  155. package/dist/browser/es/src/document-model/custom/reducers/operation.js.map +1 -0
  156. package/dist/browser/es/src/document-model/custom/reducers/state.js +66 -0
  157. package/dist/browser/es/src/document-model/custom/reducers/state.js.map +1 -0
  158. package/dist/browser/es/src/document-model/custom/reducers/versioning.js +31 -0
  159. package/dist/browser/es/src/document-model/custom/reducers/versioning.js.map +1 -0
  160. package/dist/browser/es/src/document-model/custom/utils.js +117 -0
  161. package/dist/browser/es/src/document-model/custom/utils.js.map +1 -0
  162. package/dist/browser/es/src/document-model/gen/creators.js +53 -0
  163. package/dist/browser/es/src/document-model/gen/creators.js.map +1 -0
  164. package/dist/browser/es/src/document-model/gen/document-model.js +545 -0
  165. package/dist/browser/es/src/document-model/gen/document-model.js.map +1 -0
  166. package/dist/browser/es/src/document-model/gen/header/creators.js +39 -0
  167. package/dist/browser/es/src/document-model/gen/header/creators.js.map +1 -0
  168. package/dist/browser/es/src/document-model/gen/header/object.js +26 -0
  169. package/dist/browser/es/src/document-model/gen/header/object.js.map +1 -0
  170. package/dist/browser/es/src/document-model/gen/module/creators.js +34 -0
  171. package/dist/browser/es/src/document-model/gen/module/creators.js.map +1 -0
  172. package/dist/browser/es/src/document-model/gen/module/object.js +23 -0
  173. package/dist/browser/es/src/document-model/gen/module/object.js.map +1 -0
  174. package/dist/browser/es/src/document-model/gen/object.js +47 -0
  175. package/dist/browser/es/src/document-model/gen/object.js.map +1 -0
  176. package/dist/browser/es/src/document-model/gen/operation/creators.js +59 -0
  177. package/dist/browser/es/src/document-model/gen/operation/creators.js.map +1 -0
  178. package/dist/browser/es/src/document-model/gen/operation/object.js +38 -0
  179. package/dist/browser/es/src/document-model/gen/operation/object.js.map +1 -0
  180. package/dist/browser/es/src/document-model/gen/operation-error/creators.js +44 -0
  181. package/dist/browser/es/src/document-model/gen/operation-error/creators.js.map +1 -0
  182. package/dist/browser/es/src/document-model/gen/operation-error/object.js +29 -0
  183. package/dist/browser/es/src/document-model/gen/operation-error/object.js.map +1 -0
  184. package/dist/browser/es/src/document-model/gen/operation-example/creators.js +29 -0
  185. package/dist/browser/es/src/document-model/gen/operation-example/creators.js.map +1 -0
  186. package/dist/browser/es/src/document-model/gen/operation-example/object.js +20 -0
  187. package/dist/browser/es/src/document-model/gen/operation-example/object.js.map +1 -0
  188. package/dist/browser/es/src/document-model/gen/reducer.js +255 -0
  189. package/dist/browser/es/src/document-model/gen/reducer.js.map +1 -0
  190. package/dist/browser/es/src/document-model/gen/schema/zod.js +449 -0
  191. package/dist/browser/es/src/document-model/gen/schema/zod.js.map +1 -0
  192. package/dist/browser/es/src/document-model/gen/state/creators.js +39 -0
  193. package/dist/browser/es/src/document-model/gen/state/creators.js.map +1 -0
  194. package/dist/browser/es/src/document-model/gen/state/object.js +26 -0
  195. package/dist/browser/es/src/document-model/gen/state/object.js.map +1 -0
  196. package/dist/browser/es/src/document-model/gen/utils.js +75 -0
  197. package/dist/browser/es/src/document-model/gen/utils.js.map +1 -0
  198. package/dist/browser/es/src/document-model/gen/versioning/creators.js +33 -0
  199. package/dist/browser/es/src/document-model/gen/versioning/creators.js.map +1 -0
  200. package/dist/browser/es/src/document-model/gen/versioning/object.js +23 -0
  201. package/dist/browser/es/src/document-model/gen/versioning/object.js.map +1 -0
  202. package/dist/browser/src/document/reducer.d.ts +13 -2
  203. package/dist/browser/src/document/utils/base.d.ts +1 -1
  204. package/dist/browser/src/document/utils/document-helpers.d.ts +53 -0
  205. package/dist/browser/src/document/utils/index.d.ts +1 -0
  206. package/dist/node/cjs/_virtual/_commonjsHelpers.js +7 -0
  207. package/dist/node/cjs/_virtual/_commonjsHelpers.js.map +1 -0
  208. package/dist/node/cjs/_virtual/index.js +5 -0
  209. package/dist/node/cjs/_virtual/index.js.map +1 -0
  210. package/dist/node/cjs/document-model.js +43 -1
  211. package/dist/node/cjs/document-model.js.map +1 -0
  212. package/dist/node/cjs/document.js +15 -1
  213. package/dist/node/cjs/document.js.map +1 -0
  214. package/dist/node/cjs/index.js +14 -1
  215. package/dist/node/cjs/index.js.map +1 -0
  216. package/dist/node/cjs/src/document/actions/creators.js +46 -0
  217. package/dist/node/cjs/src/document/actions/creators.js.map +1 -0
  218. package/dist/node/cjs/src/document/actions/index.js +173 -0
  219. package/dist/node/cjs/src/document/actions/index.js.map +1 -0
  220. package/dist/node/cjs/src/document/actions/types.js +15 -0
  221. package/dist/node/cjs/src/document/actions/types.js.map +1 -0
  222. package/dist/node/cjs/src/document/object.js +190 -0
  223. package/dist/node/cjs/src/document/object.js.map +1 -0
  224. package/dist/node/cjs/src/document/reducer.js +194 -0
  225. package/dist/node/cjs/src/document/reducer.js.map +1 -0
  226. package/dist/node/cjs/src/document/schema/zod.js +137 -0
  227. package/dist/node/cjs/src/document/schema/zod.js.map +1 -0
  228. package/dist/node/cjs/src/document/utils/base.js +220 -0
  229. package/dist/node/cjs/src/document/utils/base.js.map +1 -0
  230. package/dist/node/cjs/src/document/utils/document-helpers.js +324 -0
  231. package/dist/node/cjs/src/document/utils/document-helpers.js.map +1 -0
  232. package/dist/node/cjs/src/document/utils/file.js +136 -0
  233. package/dist/node/cjs/src/document/utils/file.js.map +1 -0
  234. package/dist/node/cjs/src/document/utils/index.js +33 -0
  235. package/dist/node/cjs/src/document/utils/index.js.map +1 -0
  236. package/dist/node/cjs/src/document/utils/node.js +54 -0
  237. package/dist/node/cjs/src/document/utils/node.js.map +1 -0
  238. package/dist/node/cjs/src/document/utils/validation.js +24 -0
  239. package/dist/node/cjs/src/document/utils/validation.js.map +1 -0
  240. package/dist/node/cjs/src/document-model/custom/reducers/header.js +26 -0
  241. package/dist/node/cjs/src/document-model/custom/reducers/header.js.map +1 -0
  242. package/dist/node/cjs/src/document-model/custom/reducers/module.js +46 -0
  243. package/dist/node/cjs/src/document-model/custom/reducers/module.js.map +1 -0
  244. package/dist/node/cjs/src/document-model/custom/reducers/operation-error.js +95 -0
  245. package/dist/node/cjs/src/document-model/custom/reducers/operation-error.js.map +1 -0
  246. package/dist/node/cjs/src/document-model/custom/reducers/operation-example.js +58 -0
  247. package/dist/node/cjs/src/document-model/custom/reducers/operation-example.js.map +1 -0
  248. package/dist/node/cjs/src/document-model/custom/reducers/operation.js +123 -0
  249. package/dist/node/cjs/src/document-model/custom/reducers/operation.js.map +1 -0
  250. package/dist/node/cjs/src/document-model/custom/reducers/state.js +66 -0
  251. package/dist/node/cjs/src/document-model/custom/reducers/state.js.map +1 -0
  252. package/dist/node/cjs/src/document-model/custom/reducers/versioning.js +31 -0
  253. package/dist/node/cjs/src/document-model/custom/reducers/versioning.js.map +1 -0
  254. package/dist/node/cjs/src/document-model/custom/utils.js +117 -0
  255. package/dist/node/cjs/src/document-model/custom/utils.js.map +1 -0
  256. package/dist/node/cjs/src/document-model/gen/creators.js +53 -0
  257. package/dist/node/cjs/src/document-model/gen/creators.js.map +1 -0
  258. package/dist/node/cjs/src/document-model/gen/document-model.js +545 -0
  259. package/dist/node/cjs/src/document-model/gen/document-model.js.map +1 -0
  260. package/dist/node/cjs/src/document-model/gen/header/creators.js +41 -0
  261. package/dist/node/cjs/src/document-model/gen/header/creators.js.map +1 -0
  262. package/dist/node/cjs/src/document-model/gen/header/object.js +26 -0
  263. package/dist/node/cjs/src/document-model/gen/header/object.js.map +1 -0
  264. package/dist/node/cjs/src/document-model/gen/module/creators.js +36 -0
  265. package/dist/node/cjs/src/document-model/gen/module/creators.js.map +1 -0
  266. package/dist/node/cjs/src/document-model/gen/module/object.js +23 -0
  267. package/dist/node/cjs/src/document-model/gen/module/object.js.map +1 -0
  268. package/dist/node/cjs/src/document-model/gen/object.js +47 -0
  269. package/dist/node/cjs/src/document-model/gen/object.js.map +1 -0
  270. package/dist/node/cjs/src/document-model/gen/operation/creators.js +61 -0
  271. package/dist/node/cjs/src/document-model/gen/operation/creators.js.map +1 -0
  272. package/dist/node/cjs/src/document-model/gen/operation/object.js +38 -0
  273. package/dist/node/cjs/src/document-model/gen/operation/object.js.map +1 -0
  274. package/dist/node/cjs/src/document-model/gen/operation-error/creators.js +46 -0
  275. package/dist/node/cjs/src/document-model/gen/operation-error/creators.js.map +1 -0
  276. package/dist/node/cjs/src/document-model/gen/operation-error/object.js +29 -0
  277. package/dist/node/cjs/src/document-model/gen/operation-error/object.js.map +1 -0
  278. package/dist/node/cjs/src/document-model/gen/operation-example/creators.js +31 -0
  279. package/dist/node/cjs/src/document-model/gen/operation-example/creators.js.map +1 -0
  280. package/dist/node/cjs/src/document-model/gen/operation-example/object.js +20 -0
  281. package/dist/node/cjs/src/document-model/gen/operation-example/object.js.map +1 -0
  282. package/dist/node/cjs/src/document-model/gen/reducer.js +257 -0
  283. package/dist/node/cjs/src/document-model/gen/reducer.js.map +1 -0
  284. package/dist/node/cjs/src/document-model/gen/schema/zod.js +449 -0
  285. package/dist/node/cjs/src/document-model/gen/schema/zod.js.map +1 -0
  286. package/dist/node/cjs/src/document-model/gen/state/creators.js +41 -0
  287. package/dist/node/cjs/src/document-model/gen/state/creators.js.map +1 -0
  288. package/dist/node/cjs/src/document-model/gen/state/object.js +26 -0
  289. package/dist/node/cjs/src/document-model/gen/state/object.js.map +1 -0
  290. package/dist/node/cjs/src/document-model/gen/utils.js +75 -0
  291. package/dist/node/cjs/src/document-model/gen/utils.js.map +1 -0
  292. package/dist/node/cjs/src/document-model/gen/versioning/creators.js +35 -0
  293. package/dist/node/cjs/src/document-model/gen/versioning/creators.js.map +1 -0
  294. package/dist/node/cjs/src/document-model/gen/versioning/object.js +23 -0
  295. package/dist/node/cjs/src/document-model/gen/versioning/object.js.map +1 -0
  296. package/dist/node/es/_virtual/_commonjsHelpers.js +7 -0
  297. package/dist/node/es/_virtual/_commonjsHelpers.js.map +1 -0
  298. package/dist/node/es/_virtual/index.js +5 -0
  299. package/dist/node/es/_virtual/index.js.map +1 -0
  300. package/dist/node/es/document-model.js +37 -17
  301. package/dist/node/es/document-model.js.map +1 -0
  302. package/dist/node/es/document.js +13 -16
  303. package/dist/node/es/document.js.map +1 -0
  304. package/dist/node/es/index.js +12 -18
  305. package/dist/node/es/index.js.map +1 -0
  306. package/dist/node/es/src/document/actions/creators.js +46 -0
  307. package/dist/node/es/src/document/actions/creators.js.map +1 -0
  308. package/dist/node/es/src/document/actions/index.js +174 -0
  309. package/dist/node/es/src/document/actions/index.js.map +1 -0
  310. package/dist/node/es/src/document/actions/types.js +15 -0
  311. package/dist/node/es/src/document/actions/types.js.map +1 -0
  312. package/dist/node/es/src/document/object.js +190 -0
  313. package/dist/node/es/src/document/object.js.map +1 -0
  314. package/dist/node/es/src/document/reducer.js +194 -0
  315. package/dist/node/es/src/document/reducer.js.map +1 -0
  316. package/dist/node/es/src/document/schema/zod.js +137 -0
  317. package/dist/node/es/src/document/schema/zod.js.map +1 -0
  318. package/dist/node/es/src/document/utils/base.js +220 -0
  319. package/dist/node/es/src/document/utils/base.js.map +1 -0
  320. package/dist/node/es/src/document/utils/document-helpers.js +324 -0
  321. package/dist/node/es/src/document/utils/document-helpers.js.map +1 -0
  322. package/dist/node/es/src/document/utils/file.js +136 -0
  323. package/dist/node/es/src/document/utils/file.js.map +1 -0
  324. package/dist/node/es/src/document/utils/index.js +33 -0
  325. package/dist/node/es/src/document/utils/index.js.map +1 -0
  326. package/dist/node/es/src/document/utils/node.js +54 -0
  327. package/dist/node/es/src/document/utils/node.js.map +1 -0
  328. package/dist/node/es/src/document/utils/validation.js +24 -0
  329. package/dist/node/es/src/document/utils/validation.js.map +1 -0
  330. package/dist/node/es/src/document-model/custom/reducers/header.js +26 -0
  331. package/dist/node/es/src/document-model/custom/reducers/header.js.map +1 -0
  332. package/dist/node/es/src/document-model/custom/reducers/module.js +46 -0
  333. package/dist/node/es/src/document-model/custom/reducers/module.js.map +1 -0
  334. package/dist/node/es/src/document-model/custom/reducers/operation-error.js +95 -0
  335. package/dist/node/es/src/document-model/custom/reducers/operation-error.js.map +1 -0
  336. package/dist/node/es/src/document-model/custom/reducers/operation-example.js +58 -0
  337. package/dist/node/es/src/document-model/custom/reducers/operation-example.js.map +1 -0
  338. package/dist/node/es/src/document-model/custom/reducers/operation.js +123 -0
  339. package/dist/node/es/src/document-model/custom/reducers/operation.js.map +1 -0
  340. package/dist/node/es/src/document-model/custom/reducers/state.js +66 -0
  341. package/dist/node/es/src/document-model/custom/reducers/state.js.map +1 -0
  342. package/dist/node/es/src/document-model/custom/reducers/versioning.js +31 -0
  343. package/dist/node/es/src/document-model/custom/reducers/versioning.js.map +1 -0
  344. package/dist/node/es/src/document-model/custom/utils.js +117 -0
  345. package/dist/node/es/src/document-model/custom/utils.js.map +1 -0
  346. package/dist/node/es/src/document-model/gen/creators.js +53 -0
  347. package/dist/node/es/src/document-model/gen/creators.js.map +1 -0
  348. package/dist/node/es/src/document-model/gen/document-model.js +545 -0
  349. package/dist/node/es/src/document-model/gen/document-model.js.map +1 -0
  350. package/dist/node/es/src/document-model/gen/header/creators.js +41 -0
  351. package/dist/node/es/src/document-model/gen/header/creators.js.map +1 -0
  352. package/dist/node/es/src/document-model/gen/header/object.js +26 -0
  353. package/dist/node/es/src/document-model/gen/header/object.js.map +1 -0
  354. package/dist/node/es/src/document-model/gen/module/creators.js +36 -0
  355. package/dist/node/es/src/document-model/gen/module/creators.js.map +1 -0
  356. package/dist/node/es/src/document-model/gen/module/object.js +23 -0
  357. package/dist/node/es/src/document-model/gen/module/object.js.map +1 -0
  358. package/dist/node/es/src/document-model/gen/object.js +47 -0
  359. package/dist/node/es/src/document-model/gen/object.js.map +1 -0
  360. package/dist/node/es/src/document-model/gen/operation/creators.js +61 -0
  361. package/dist/node/es/src/document-model/gen/operation/creators.js.map +1 -0
  362. package/dist/node/es/src/document-model/gen/operation/object.js +38 -0
  363. package/dist/node/es/src/document-model/gen/operation/object.js.map +1 -0
  364. package/dist/node/es/src/document-model/gen/operation-error/creators.js +46 -0
  365. package/dist/node/es/src/document-model/gen/operation-error/creators.js.map +1 -0
  366. package/dist/node/es/src/document-model/gen/operation-error/object.js +29 -0
  367. package/dist/node/es/src/document-model/gen/operation-error/object.js.map +1 -0
  368. package/dist/node/es/src/document-model/gen/operation-example/creators.js +31 -0
  369. package/dist/node/es/src/document-model/gen/operation-example/creators.js.map +1 -0
  370. package/dist/node/es/src/document-model/gen/operation-example/object.js +20 -0
  371. package/dist/node/es/src/document-model/gen/operation-example/object.js.map +1 -0
  372. package/dist/node/es/src/document-model/gen/reducer.js +257 -0
  373. package/dist/node/es/src/document-model/gen/reducer.js.map +1 -0
  374. package/dist/node/es/src/document-model/gen/schema/zod.js +449 -0
  375. package/dist/node/es/src/document-model/gen/schema/zod.js.map +1 -0
  376. package/dist/node/es/src/document-model/gen/state/creators.js +41 -0
  377. package/dist/node/es/src/document-model/gen/state/creators.js.map +1 -0
  378. package/dist/node/es/src/document-model/gen/state/object.js +26 -0
  379. package/dist/node/es/src/document-model/gen/state/object.js.map +1 -0
  380. package/dist/node/es/src/document-model/gen/utils.js +75 -0
  381. package/dist/node/es/src/document-model/gen/utils.js.map +1 -0
  382. package/dist/node/es/src/document-model/gen/versioning/creators.js +35 -0
  383. package/dist/node/es/src/document-model/gen/versioning/creators.js.map +1 -0
  384. package/dist/node/es/src/document-model/gen/versioning/object.js +23 -0
  385. package/dist/node/es/src/document-model/gen/versioning/object.js.map +1 -0
  386. package/dist/node/src/document/reducer.d.ts +13 -2
  387. package/dist/node/src/document/utils/base.d.ts +1 -1
  388. package/dist/node/src/document/utils/document-helpers.d.ts +53 -0
  389. package/dist/node/src/document/utils/index.d.ts +1 -0
  390. package/package.json +7 -2
  391. package/dist/browser/cjs/internal/index-C_OFq7P5.js +0 -22
  392. package/dist/browser/cjs/internal/index-Dwhv4k_6.js +0 -1
  393. package/dist/browser/cjs/internal/object-CeLE3akL.js +0 -25
  394. package/dist/browser/es/internal/index-DvHnaqeu.js +0 -2104
  395. package/dist/browser/es/internal/index-Xcvn-MUq.js +0 -42
  396. package/dist/browser/es/internal/object-BDWVt0Zy.js +0 -2504
  397. package/dist/node/cjs/internal/index-Bi9yeV3W.js +0 -1
  398. package/dist/node/cjs/internal/index-GZsLKtHl.js +0 -22
  399. package/dist/node/cjs/internal/object-CnhDksx1.js +0 -20
  400. package/dist/node/es/internal/index-B6iEYnbQ.js +0 -42
  401. package/dist/node/es/internal/index-Chx4C-Xl.js +0 -2108
  402. package/dist/node/es/internal/object-CnV5hY_A.js +0 -1402
@@ -0,0 +1,220 @@
1
+ import "../../../node_modules/.pnpm/safe-stable-stringify@2.4.3/node_modules/safe-stable-stringify/esm/wrapper.js";
2
+ import { baseReducer } from "../reducer.js";
3
+ import { hash } from "../../../_virtual/browser.js";
4
+ import { NOOP, UNDO, REDO, SET_NAME, PRUNE, LOAD_STATE } from "../actions/types.js";
5
+ import { castImmutable, freeze } from "immer";
6
+ import cjsModule from "../../../node_modules/.pnpm/safe-stable-stringify@2.4.3/node_modules/safe-stable-stringify/index.js";
7
+ function isNoopOperation(op) {
8
+ return op.type === NOOP && op.skip !== void 0 && op.skip > 0 && op.hash !== void 0;
9
+ }
10
+ function isUndoRedo(action) {
11
+ return [UNDO, REDO].includes(action.type);
12
+ }
13
+ function isBaseAction(action) {
14
+ return [SET_NAME, UNDO, REDO, PRUNE, LOAD_STATE].includes(action.type);
15
+ }
16
+ function createAction(type, input, attachments, validator, scope = "global") {
17
+ if (!type) {
18
+ throw new Error("Empty action type");
19
+ }
20
+ if (typeof type !== "string") {
21
+ throw new Error(`Invalid action type: ${JSON.stringify(type)}`);
22
+ }
23
+ const action = { type, input, scope };
24
+ if (attachments) {
25
+ action.attachments = attachments;
26
+ }
27
+ try {
28
+ validator == null ? void 0 : validator().parse(action.input);
29
+ } catch (error) {
30
+ throw new Error(`Invalid action input: ${error}`);
31
+ }
32
+ return action;
33
+ }
34
+ function createReducer(reducer, documentReducer = baseReducer) {
35
+ return (document, action, dispatch, options) => {
36
+ return documentReducer(document, action, reducer, dispatch, options);
37
+ };
38
+ }
39
+ const createExtendedState = (initialState, createState) => {
40
+ return {
41
+ name: "",
42
+ documentType: "",
43
+ revision: {
44
+ global: 0,
45
+ local: 0
46
+ },
47
+ created: (/* @__PURE__ */ new Date()).toISOString(),
48
+ lastModified: (/* @__PURE__ */ new Date()).toISOString(),
49
+ attachments: {},
50
+ ...initialState,
51
+ state: (createState == null ? void 0 : createState(initialState == null ? void 0 : initialState.state)) ?? ((initialState == null ? void 0 : initialState.state) ?? { global: {}, local: {} })
52
+ };
53
+ };
54
+ const createDocument = (initialState, createState) => {
55
+ const state = createExtendedState(
56
+ initialState,
57
+ createState
58
+ );
59
+ return {
60
+ ...state,
61
+ initialState: state,
62
+ operations: { global: [], local: [] },
63
+ clipboard: []
64
+ };
65
+ };
66
+ const hashDocument = (document, scope = "global") => {
67
+ return hash(cjsModule(document.state[scope] || ""));
68
+ };
69
+ const hashKey = (date, randomLimit = 1e3) => {
70
+ const random = Math.random() * randomLimit;
71
+ return hash(`${(date ?? /* @__PURE__ */ new Date()).toISOString()}${random}`);
72
+ };
73
+ function readOnly(value) {
74
+ return castImmutable(freeze(value, true));
75
+ }
76
+ function mapSkippedOperations(operations, skippedHeadOperations) {
77
+ const ops = [...operations];
78
+ let skipped = skippedHeadOperations || 0;
79
+ let latestOpIndex = ops.length > 0 ? ops[ops.length - 1].index : 0;
80
+ const scopeOpsWithIgnore = [];
81
+ for (const operation of ops.reverse()) {
82
+ if (skipped > 0) {
83
+ const operationsDiff = latestOpIndex - operation.index;
84
+ skipped -= operationsDiff;
85
+ }
86
+ if (skipped < 0) {
87
+ throw new Error("Invalid operation index, missing operations");
88
+ }
89
+ const mappedOp = {
90
+ ignore: skipped > 0,
91
+ operation
92
+ };
93
+ const operationSkip = operation.skip > 0 ? operation.skip + 1 : 0;
94
+ if (operationSkip > 0 && operationSkip > skipped) {
95
+ const skipDiff = operationSkip - skipped;
96
+ skipped = skipped + skipDiff;
97
+ }
98
+ latestOpIndex = operation.index;
99
+ scopeOpsWithIgnore.push(mappedOp);
100
+ }
101
+ return scopeOpsWithIgnore.reverse();
102
+ }
103
+ function calculateSkipsLeft(operations, currentIndex, skip) {
104
+ const sortedOperations = operations.slice().sort((a, b) => a.skip - b.skip).sort((a, b) => a.index - b.index);
105
+ let skipsLeft = skip;
106
+ let skipsToPerform = 0;
107
+ let lastIndex = currentIndex;
108
+ for (const operation of sortedOperations.reverse()) {
109
+ const distance = lastIndex - operation.index;
110
+ skipsLeft = skipsLeft - distance;
111
+ if (skipsLeft > -1) {
112
+ skipsToPerform++;
113
+ lastIndex = operation.index;
114
+ } else {
115
+ break;
116
+ }
117
+ }
118
+ return skipsToPerform;
119
+ }
120
+ function sortOperations(operations) {
121
+ return Object.values(operations).flatMap((array) => array).sort(
122
+ (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()
123
+ );
124
+ }
125
+ function sortMappedOperations(operations) {
126
+ return Object.values(operations).flatMap((array) => array).sort(
127
+ (a, b) => new Date(a.operation.timestamp).getTime() - new Date(b.operation.timestamp).getTime()
128
+ );
129
+ }
130
+ function replayOperations(initialState, clearedOperations, reducer, dispatch, header, documentReducer = baseReducer, skipHeaderOperations = {}, options) {
131
+ const wrappedReducer = createReducer(reducer, documentReducer);
132
+ return replayDocument(
133
+ initialState,
134
+ clearedOperations,
135
+ wrappedReducer,
136
+ dispatch,
137
+ header,
138
+ skipHeaderOperations,
139
+ options
140
+ );
141
+ }
142
+ function replayDocument(initialState, operations, reducer, dispatch, header, skipHeaderOperations = {}, options) {
143
+ const checkHashes = (options == null ? void 0 : options.checkHashes) ?? true;
144
+ const document = createDocument(initialState);
145
+ const flatOperations = Object.values(operations).flat();
146
+ const result = flatOperations.reduce((document2, operation) => {
147
+ const doc = reducer(document2, operation, dispatch, {
148
+ skip: operation.skip,
149
+ ignoreSkipOperations: true,
150
+ reuseHash: !checkHashes
151
+ });
152
+ return doc;
153
+ }, document);
154
+ if (!checkHashes) {
155
+ for (const scope of Object.keys(result.state)) {
156
+ for (let i = flatOperations.length - 1; i >= 0; i--) {
157
+ const operation = flatOperations[i];
158
+ if (operation.scope !== scope) {
159
+ continue;
160
+ }
161
+ if (operation.hash !== hashDocument(result, scope)) {
162
+ throw new Error(`Hash mismatch for scope ${scope}`);
163
+ } else {
164
+ break;
165
+ }
166
+ }
167
+ }
168
+ }
169
+ const resultOperations = Object.keys(
170
+ result.operations
171
+ ).reduce(
172
+ (acc, key) => {
173
+ const scope = key;
174
+ return {
175
+ ...acc,
176
+ [scope]: [
177
+ ...result.operations[scope].map((operation, index) => {
178
+ var _a;
179
+ return {
180
+ ...operation,
181
+ timestamp: ((_a = operations[scope][index]) == null ? void 0 : _a.timestamp) ?? operation.timestamp
182
+ };
183
+ })
184
+ ]
185
+ };
186
+ },
187
+ { global: [], local: [] }
188
+ );
189
+ const lastModified = Object.values(resultOperations).reduce((acc, curr) => {
190
+ const operation = curr[curr.length - 1];
191
+ if ((operation == null ? void 0 : operation.timestamp) > acc) {
192
+ acc = operation.timestamp;
193
+ }
194
+ return acc;
195
+ }, initialState.lastModified);
196
+ return { ...result, operations: resultOperations, lastModified };
197
+ }
198
+ function isSameDocument(documentA, documentB) {
199
+ return cjsModule(documentA) === cjsModule(documentB);
200
+ }
201
+ export {
202
+ calculateSkipsLeft,
203
+ createAction,
204
+ createDocument,
205
+ createExtendedState,
206
+ createReducer,
207
+ hashDocument,
208
+ hashKey,
209
+ isBaseAction,
210
+ isNoopOperation,
211
+ isSameDocument,
212
+ isUndoRedo,
213
+ mapSkippedOperations,
214
+ readOnly,
215
+ replayDocument,
216
+ replayOperations,
217
+ sortMappedOperations,
218
+ sortOperations
219
+ };
220
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sources":["../../../../../../src/document/utils/base.ts"],"sourcesContent":["import stringifyJson from 'safe-stable-stringify';\nimport { baseReducer } from '../reducer';\nimport {\n Action,\n BaseAction,\n UndoRedoAction,\n Document,\n ExtendedState,\n ImmutableStateReducer,\n Reducer,\n Immutable,\n OperationScope,\n State,\n CreateState,\n PartialState,\n DocumentOperations,\n DocumentHeader,\n DocumentOperationsIgnoreMap,\n Operation,\n MappedOperation,\n} from '../types';\nimport { hash } from './node';\nimport {\n LOAD_STATE,\n PRUNE,\n REDO,\n SET_NAME,\n UNDO,\n NOOP,\n} from '../actions/types';\nimport { castImmutable, freeze } from 'immer';\nimport { SignalDispatch } from '../signal';\n\nexport function isNoopOperation(op: Partial<Operation>): boolean {\n return (\n op.type === NOOP &&\n op.skip !== undefined &&\n op.skip > 0 &&\n op.hash !== undefined\n );\n}\n\nexport function isUndoRedo(action: Action): action is UndoRedoAction {\n return [UNDO, REDO].includes(action.type);\n}\n\nexport function isBaseAction(action: Action): action is BaseAction {\n return [SET_NAME, UNDO, REDO, PRUNE, LOAD_STATE].includes(action.type);\n}\n\n/**\n * Helper function to be used by action creators.\n *\n * @remarks\n * Creates an action with the given type and input properties. The input\n * properties default to an empty object.\n *\n * @typeParam A - Type of the action to be returned.\n *\n * @param type - The type of the action.\n * @param input - The input properties of the action.\n * @param attachments - The attachments included in the action.\n * @param validator - The validator to use for the input properties.\n * @param scope - The scope of the action, can either be 'global' or 'local'.\n * @param skip - The number of operations to skip before this new action is applied.\n *\n * @throws Error if the type is empty or not a string.\n *\n * @returns The new action.\n */\nexport function createAction<A extends Action>(\n type: A['type'],\n input?: A['input'],\n attachments?: Action['attachments'],\n validator?: () => { parse(v: unknown): A['input'] },\n scope: OperationScope = 'global',\n): A {\n if (!type) {\n throw new Error('Empty action type');\n }\n\n if (typeof type !== 'string') {\n throw new Error(`Invalid action type: ${JSON.stringify(type)}`);\n }\n\n const action: Action = { type, input, scope };\n\n if (attachments) {\n action.attachments = attachments;\n }\n\n try {\n validator?.().parse(action.input);\n } catch (error) {\n throw new Error(`Invalid action input: ${error}`);\n }\n\n return action as A;\n}\n\n/**\n * Helper function to create a document model reducer.\n *\n * @remarks\n * This function creates a new reducer that wraps the provided `reducer` with\n * `documentReducer`, adding support for document actions:\n * - `SET_NAME`\n * - `UNDO`\n * - `REDO`\n * - `PRUNE`\n *\n * It also updates the document-related attributes on every operation.\n *\n * @param reducer - The custom reducer to wrap.\n * @param documentReducer - The document reducer to use.\n *\n * @returns The new reducer.\n */\nexport function createReducer<\n S = unknown,\n A extends Action = Action,\n L = unknown,\n>(\n reducer: ImmutableStateReducer<S, A, L>,\n documentReducer = baseReducer,\n): Reducer<S, A, L> {\n return (document, action, dispatch, options) => {\n return documentReducer(document, action, reducer, dispatch, options);\n };\n}\n\nexport const createExtendedState = <S, L>(\n initialState?: Partial<ExtendedState<PartialState<S>, PartialState<L>>>,\n createState?: CreateState<S, L>,\n): ExtendedState<S, L> => {\n return {\n name: '',\n documentType: '',\n revision: {\n global: 0,\n local: 0,\n },\n created: new Date().toISOString(),\n lastModified: new Date().toISOString(),\n attachments: {},\n ...initialState,\n state:\n createState?.(initialState?.state) ??\n ((initialState?.state ?? { global: {}, local: {} }) as State<S, L>),\n };\n};\n\n/**\n * Builds the initial document state from the provided data.\n *\n * @typeParam T - The type of the data.\n * @typeParam A - The type of the actions.\n *\n * @param initialState - The initial state of the document. The `data` property\n * is required, but all other properties are optional.\n *\n * @returns The new document state.\n */\nexport const createDocument = <S, A extends Action, L = unknown>(\n initialState?: Partial<ExtendedState<PartialState<S>, PartialState<L>>>,\n createState?: (\n state?: Partial<State<PartialState<S>, PartialState<L>>>,\n ) => State<S, L>,\n): Document<S, A, L> => {\n const state: ExtendedState<S, L> = createExtendedState(\n initialState,\n createState,\n );\n return {\n ...state,\n initialState: state,\n operations: { global: [], local: [] },\n clipboard: [],\n };\n};\n\nexport const hashDocument = (\n document: Pick<Document, 'state'>,\n scope: OperationScope = 'global',\n) => {\n return hash(stringifyJson(document.state[scope] || ''));\n};\n\nexport const hashKey = (date?: Date, randomLimit = 1000) => {\n const random = Math.random() * randomLimit;\n return hash(`${(date ?? new Date()).toISOString()}${random}`);\n};\n\nexport function readOnly<T>(value: T): Immutable<T> {\n return castImmutable(freeze(value, true));\n}\n\n/**\n * Maps skipped operations in an array of operations.\n * Skipped operations are operations that are ignored during processing.\n * @param operations - The array of operations to map.\n * @param skippedHeadOperations - The number of operations to skip at the head of the array of operations.\n * @returns An array of mapped operations with ignore flag indicating if the operation is skipped.\n * @throws Error if the operation index is invalid and there are missing operations.\n */\nexport function mapSkippedOperations<A extends Action>(\n operations: Operation<BaseAction | A>[],\n skippedHeadOperations?: number,\n): MappedOperation<A>[] {\n const ops = [...operations];\n\n let skipped = skippedHeadOperations || 0;\n let latestOpIndex = ops.length > 0 ? ops[ops.length - 1].index : 0;\n\n const scopeOpsWithIgnore = [] as MappedOperation<A>[];\n\n for (const operation of ops.reverse()) {\n if (skipped > 0) {\n const operationsDiff = latestOpIndex - operation.index;\n skipped -= operationsDiff;\n }\n\n if (skipped < 0) {\n throw new Error('Invalid operation index, missing operations');\n }\n\n const mappedOp = {\n ignore: skipped > 0,\n operation,\n };\n\n // here we add 1 to the skip number because we want to get the number of\n // operations that we want to move the pointer back to get the latest valid operation\n // operation.skip = 1 means that we want to move the pointer back 2 operations to get to the latest valid operation\n const operationSkip = operation.skip > 0 ? operation.skip + 1 : 0;\n\n if (operationSkip > 0 && operationSkip > skipped) {\n const skipDiff = operationSkip - skipped;\n skipped = skipped + skipDiff;\n }\n\n latestOpIndex = operation.index;\n scopeOpsWithIgnore.push(mappedOp);\n }\n\n return scopeOpsWithIgnore.reverse();\n}\n\nexport function calculateSkipsLeft<A extends Action>(\n operations: Operation<BaseAction | A>[],\n currentIndex: number,\n skip: number,\n): number {\n const sortedOperations = operations\n .slice()\n .sort((a, b) => a.skip - b.skip)\n .sort((a, b) => a.index - b.index);\n\n let skipsLeft = skip;\n let skipsToPerform = 0;\n let lastIndex = currentIndex;\n\n for (const operation of sortedOperations.reverse()) {\n const distance = lastIndex - operation.index;\n\n skipsLeft = skipsLeft - distance;\n\n if (skipsLeft > -1) {\n skipsToPerform++;\n lastIndex = operation.index;\n } else {\n break;\n }\n }\n\n return skipsToPerform;\n}\n\n// Flattens the operations from all scopes into\n// a single array and sorts them by timestamp\nexport function sortOperations<A extends Action>(\n operations: DocumentOperations<A>,\n) {\n return Object.values(operations)\n .flatMap(array => array)\n .sort(\n (a, b) =>\n new Date(a.timestamp).getTime() -\n new Date(b.timestamp).getTime(),\n );\n}\n\n// Flattens the mapped operations (with ignore flag) from all scopes into\n// a single array and sorts them by timestamp\nexport function sortMappedOperations<A extends Action>(\n operations: DocumentOperationsIgnoreMap<A>,\n) {\n return Object.values(operations)\n .flatMap(array => array)\n .sort(\n (a, b) =>\n new Date(a.operation.timestamp).getTime() -\n new Date(b.operation.timestamp).getTime(),\n );\n}\n\n// Runs the operations on the initial data using the\n// provided reducer, wrapped with the document reducer.\n// This rebuilds the document according to the provided actions.\nexport function replayOperations<T, A extends Action, L>(\n initialState: ExtendedState<T, L>,\n clearedOperations: DocumentOperations<A>,\n reducer: ImmutableStateReducer<T, A, L>,\n dispatch?: SignalDispatch,\n header?: DocumentHeader,\n documentReducer = baseReducer,\n skipHeaderOperations: SkipHeaderOperations = {},\n options?: {\n checkHashes?: boolean;\n },\n): Document<T, A, L> {\n // wraps the provided custom reducer with the\n // base document reducer\n const wrappedReducer = createReducer(reducer, documentReducer);\n\n return replayDocument(\n initialState,\n clearedOperations,\n wrappedReducer,\n dispatch,\n header,\n skipHeaderOperations,\n options,\n );\n}\n\nexport type SkipHeaderOperations = Partial<Record<OperationScope, number>>;\n\nexport type ReplayDocumentOptions = {\n // if false then reuses the hash from the operations\n // and only checks the final hash of each scope\n checkHashes?: boolean;\n};\n\n// Runs the operations on the initial data using the\n// provided document reducer.\n// This rebuilds the document according to the provided actions.\nexport function replayDocument<T, A extends Action, L>(\n initialState: ExtendedState<T, L>,\n operations: DocumentOperations<A>,\n reducer: Reducer<T, A, L>,\n dispatch?: SignalDispatch,\n header?: DocumentHeader,\n skipHeaderOperations: SkipHeaderOperations = {},\n options?: ReplayDocumentOptions,\n): Document<T, A, L> {\n const checkHashes = options?.checkHashes ?? true;\n\n // builds a new document from the initial data\n const document = createDocument<T, A, L>(initialState);\n\n const flatOperations = Object.values(operations).flat();\n\n const result = flatOperations.reduce((document, operation) => {\n const doc = reducer(document, operation, dispatch, {\n skip: operation.skip,\n ignoreSkipOperations: true,\n reuseHash: !checkHashes,\n });\n\n return doc;\n }, document);\n\n // if hash generation was skipped then checks if the hash\n // of each scope matches the hash of last operation\n if (!checkHashes) {\n for (const scope of Object.keys(result.state)) {\n for (let i = flatOperations.length - 1; i >= 0; i--) {\n const operation = flatOperations[i];\n\n if (operation.scope !== scope) {\n continue;\n }\n if (operation.hash !== hashDocument(result, scope)) {\n throw new Error(`Hash mismatch for scope ${scope}`);\n } else {\n break;\n }\n }\n }\n }\n\n // reuses operation timestamp if provided\n const resultOperations: DocumentOperations<A> = Object.keys(\n result.operations,\n ).reduce(\n (acc, key) => {\n const scope = key as keyof DocumentOperations<A>;\n return {\n ...acc,\n [scope]: [\n ...result.operations[scope].map((operation, index) => {\n return {\n ...operation,\n timestamp:\n operations[scope][index]?.timestamp ??\n operation.timestamp,\n };\n }),\n ],\n };\n },\n { global: [], local: [] },\n );\n // gets the last modified timestamp from the latest operation\n const lastModified = Object.values(resultOperations).reduce((acc, curr) => {\n const operation = curr[curr.length - 1];\n if (operation?.timestamp > acc) {\n acc = operation.timestamp;\n }\n return acc;\n }, initialState.lastModified);\n\n return { ...result, operations: resultOperations, lastModified };\n}\n\nexport function isSameDocument(documentA: Document, documentB: Document) {\n return stringifyJson(documentA) === stringifyJson(documentB);\n}\n"],"names":["stringifyJson","document"],"mappings":"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"}
@@ -0,0 +1,324 @@
1
+ import "../../../node_modules/.pnpm/safe-stable-stringify@2.4.3/node_modules/safe-stable-stringify/esm/wrapper.js";
2
+ import cjsModule from "../../../node_modules/.pnpm/safe-stable-stringify@2.4.3/node_modules/safe-stable-stringify/index.js";
3
+ var IntegrityIssueType = /* @__PURE__ */ ((IntegrityIssueType2) => {
4
+ IntegrityIssueType2["UNEXPECTED_INDEX"] = "UNEXPECTED_INDEX";
5
+ return IntegrityIssueType2;
6
+ })(IntegrityIssueType || {});
7
+ var IntegrityIssueSubType = /* @__PURE__ */ ((IntegrityIssueSubType2) => {
8
+ IntegrityIssueSubType2["DUPLICATED_INDEX"] = "DUPLICATED_INDEX";
9
+ IntegrityIssueSubType2["MISSING_INDEX"] = "MISSING_INDEX";
10
+ return IntegrityIssueSubType2;
11
+ })(IntegrityIssueSubType || {});
12
+ function checkCleanedOperationsIntegrity(sortedOperations) {
13
+ const result = [];
14
+ let currentIndex = -1;
15
+ for (const nextOperation of sortedOperations) {
16
+ const nextIndex = nextOperation.index - nextOperation.skip;
17
+ if (nextIndex !== currentIndex + 1) {
18
+ result.push({
19
+ operation: {
20
+ index: nextOperation.index,
21
+ skip: nextOperation.skip
22
+ },
23
+ issue: "UNEXPECTED_INDEX",
24
+ category: nextIndex > currentIndex + 1 ? "MISSING_INDEX" : "DUPLICATED_INDEX",
25
+ message: `Expected index ${currentIndex + 1} with skip 0 or equivalent, got index ${nextOperation.index} with skip ${nextOperation.skip}`
26
+ });
27
+ }
28
+ currentIndex = nextOperation.index;
29
+ }
30
+ return result;
31
+ }
32
+ function garbageCollect(sortedOperations) {
33
+ var _a, _b, _c;
34
+ const result = [];
35
+ let i = sortedOperations.length - 1;
36
+ while (i > -1) {
37
+ result.unshift(sortedOperations[i]);
38
+ const skipUntil = (((_a = sortedOperations[i]) == null ? void 0 : _a.index) || 0) - (((_b = sortedOperations[i]) == null ? void 0 : _b.skip) || 0) - 1;
39
+ let j = i - 1;
40
+ while (j > -1 && (((_c = sortedOperations[j]) == null ? void 0 : _c.index) || 0) > skipUntil) {
41
+ j--;
42
+ }
43
+ i = j;
44
+ }
45
+ return result;
46
+ }
47
+ function addUndo(sortedOperations) {
48
+ const operationsCopy = [...sortedOperations];
49
+ const latestOperation = operationsCopy[operationsCopy.length - 1];
50
+ if (!latestOperation)
51
+ return operationsCopy;
52
+ if (latestOperation.type === "NOOP") {
53
+ operationsCopy.push({
54
+ ...latestOperation,
55
+ index: latestOperation.index,
56
+ type: "NOOP",
57
+ skip: nextSkipNumber(sortedOperations)
58
+ });
59
+ } else {
60
+ operationsCopy.push({
61
+ type: "NOOP",
62
+ index: latestOperation.index + 1,
63
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
64
+ input: {},
65
+ skip: 1,
66
+ scope: latestOperation.scope,
67
+ hash: latestOperation.hash
68
+ });
69
+ }
70
+ return operationsCopy;
71
+ }
72
+ function sortOperations(operations) {
73
+ return operations.slice().sort((a, b) => a.skip - b.skip).sort((a, b) => a.index - b.index);
74
+ }
75
+ const reshuffleByTimestamp = (startIndex, opsA, opsB) => {
76
+ return [...opsA, ...opsB].sort(
77
+ (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()
78
+ ).map((op, i) => ({
79
+ ...op,
80
+ index: startIndex.index + i,
81
+ skip: i === 0 ? startIndex.skip : 0
82
+ }));
83
+ };
84
+ const reshuffleByTimestampAndIndex = (startIndex, opsA, opsB) => {
85
+ return [...opsA, ...opsB].sort(
86
+ (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()
87
+ ).sort((a, b) => a.index - b.index).map((op, i) => ({
88
+ ...op,
89
+ index: startIndex.index + i,
90
+ skip: i === 0 ? startIndex.skip : 0
91
+ }));
92
+ };
93
+ function operationsAreEqual(op1, op2) {
94
+ return cjsModule(op1) === cjsModule(op2);
95
+ }
96
+ function attachBranch(trunk, newBranch) {
97
+ const trunkCopy = garbageCollect(sortOperations(trunk.slice()));
98
+ const newOperations = garbageCollect(sortOperations(newBranch.slice()));
99
+ if (trunkCopy.length < 1) {
100
+ return [newOperations, []];
101
+ }
102
+ const result = [];
103
+ let enteredBranch = false;
104
+ while (newOperations.length > 0) {
105
+ const newOperationCandidate = newOperations[0];
106
+ let nextTrunkOperation = trunkCopy.shift();
107
+ while (nextTrunkOperation && precedes(nextTrunkOperation, newOperationCandidate)) {
108
+ result.push(nextTrunkOperation);
109
+ nextTrunkOperation = trunkCopy.shift();
110
+ }
111
+ if (!nextTrunkOperation) {
112
+ enteredBranch = true;
113
+ } else if (!enteredBranch) {
114
+ if (operationsAreEqual(nextTrunkOperation, newOperationCandidate)) {
115
+ newOperations.shift();
116
+ result.push(nextTrunkOperation);
117
+ } else {
118
+ trunkCopy.unshift(nextTrunkOperation);
119
+ enteredBranch = true;
120
+ }
121
+ }
122
+ if (enteredBranch) {
123
+ let nextAppend = newOperations.shift();
124
+ while (nextAppend) {
125
+ result.push(nextAppend);
126
+ nextAppend = newOperations.shift();
127
+ }
128
+ }
129
+ }
130
+ if (!enteredBranch) {
131
+ let nextAppend = trunkCopy.shift();
132
+ while (nextAppend) {
133
+ result.push(nextAppend);
134
+ nextAppend = trunkCopy.shift();
135
+ }
136
+ }
137
+ return [garbageCollect(result), trunkCopy];
138
+ }
139
+ function precedes(op1, op2) {
140
+ return op1.index < op2.index || op1.index === op2.index && op1.skip < op2.skip;
141
+ }
142
+ function split(sortedTargetOperations, sortedMergeOperations) {
143
+ const commonOperations = [];
144
+ const targetDiffOperations = [];
145
+ const mergeDiffOperations = [];
146
+ const maxLength = Math.max(
147
+ sortedTargetOperations.length,
148
+ sortedMergeOperations.length
149
+ );
150
+ let splitHappened = false;
151
+ for (let i = 0; i < maxLength; i++) {
152
+ const targetOperation = sortedTargetOperations[i];
153
+ const mergeOperation = sortedMergeOperations[i];
154
+ if (targetOperation && mergeOperation) {
155
+ if (!splitHappened && operationsAreEqual(targetOperation, mergeOperation)) {
156
+ commonOperations.push(targetOperation);
157
+ } else {
158
+ splitHappened = true;
159
+ targetDiffOperations.push(targetOperation);
160
+ mergeDiffOperations.push(mergeOperation);
161
+ }
162
+ } else if (targetOperation) {
163
+ targetDiffOperations.push(targetOperation);
164
+ } else if (mergeOperation) {
165
+ mergeDiffOperations.push(mergeOperation);
166
+ }
167
+ }
168
+ return [commonOperations, targetDiffOperations, mergeDiffOperations];
169
+ }
170
+ function merge(sortedTargetOperations, sortedMergeOperations, reshuffle) {
171
+ const [_commonOperations, _targetOperations, _mergeOperations] = split(
172
+ garbageCollect(sortedTargetOperations),
173
+ garbageCollect(sortedMergeOperations)
174
+ );
175
+ const maxCommonIndex = getMaxIndex(_commonOperations);
176
+ const nextIndex = 1 + Math.max(
177
+ maxCommonIndex,
178
+ getMaxIndex(_targetOperations),
179
+ getMaxIndex(_mergeOperations)
180
+ );
181
+ const newOperationHistory = reshuffle(
182
+ {
183
+ index: nextIndex,
184
+ skip: nextIndex - (maxCommonIndex + 1)
185
+ },
186
+ _targetOperations,
187
+ _mergeOperations
188
+ );
189
+ return _commonOperations.concat(newOperationHistory);
190
+ }
191
+ function getMaxIndex(sortedOperations) {
192
+ const lastElement = sortedOperations[sortedOperations.length - 1];
193
+ if (!lastElement) {
194
+ return -1;
195
+ }
196
+ return lastElement.index;
197
+ }
198
+ function nextSkipNumber(sortedOperations) {
199
+ var _a, _b, _c;
200
+ if (sortedOperations.length < 1) {
201
+ return -1;
202
+ }
203
+ const cleanedOperations = garbageCollect(sortedOperations);
204
+ let nextSkip = (((_a = cleanedOperations[cleanedOperations.length - 1]) == null ? void 0 : _a.skip) || 0) + 1;
205
+ if (cleanedOperations.length > 1) {
206
+ nextSkip += ((_b = cleanedOperations[cleanedOperations.length - 2]) == null ? void 0 : _b.skip) || 0;
207
+ }
208
+ return (((_c = cleanedOperations[cleanedOperations.length - 1]) == null ? void 0 : _c.index) || -1) < nextSkip ? -1 : nextSkip;
209
+ }
210
+ const checkOperationsIntegrity = (operations) => {
211
+ return checkCleanedOperationsIntegrity(
212
+ garbageCollect(sortOperations(operations))
213
+ );
214
+ };
215
+ const groupOperationsByScope = (operations) => {
216
+ const result = operations.reduce((acc, operation) => {
217
+ var _a;
218
+ if (!acc[operation.scope]) {
219
+ acc[operation.scope] = [];
220
+ }
221
+ (_a = acc[operation.scope]) == null ? void 0 : _a.push(operation);
222
+ return acc;
223
+ }, {});
224
+ return result;
225
+ };
226
+ const prepareOperations = (operationsHistory, newOperations) => {
227
+ var _a;
228
+ const result = {
229
+ integrityIssues: [],
230
+ validOperations: [],
231
+ invalidOperations: [],
232
+ duplicatedOperations: []
233
+ };
234
+ const sortedOperationsHistory = sortOperations(operationsHistory);
235
+ const sortedOperations = sortOperations(newOperations);
236
+ const integrityErrors = checkCleanedOperationsIntegrity([
237
+ ...sortedOperationsHistory,
238
+ ...sortedOperations
239
+ ]);
240
+ const missingIndexErrors = integrityErrors.filter(
241
+ (integrityIssue) => integrityIssue.category === "MISSING_INDEX"
242
+ /* MISSING_INDEX */
243
+ );
244
+ const firstMissingIndexOperation = (_a = [...missingIndexErrors].sort((a, b) => b.operation.index - a.operation.index).pop()) == null ? void 0 : _a.operation;
245
+ for (const newOperation of sortedOperations) {
246
+ if (firstMissingIndexOperation && newOperation.index >= firstMissingIndexOperation.index) {
247
+ result.invalidOperations.push(newOperation);
248
+ continue;
249
+ }
250
+ const isDuplicatedOperation = integrityErrors.some((integrityError) => {
251
+ return integrityError.operation.index === newOperation.index && integrityError.operation.skip === newOperation.skip && integrityError.category === "DUPLICATED_INDEX";
252
+ });
253
+ if (isDuplicatedOperation) {
254
+ result.duplicatedOperations.push(newOperation);
255
+ continue;
256
+ }
257
+ result.validOperations.push(newOperation);
258
+ }
259
+ result.integrityIssues.push(...integrityErrors);
260
+ return result;
261
+ };
262
+ function removeExistingOperations(newOperations, operationsHistory) {
263
+ return newOperations.filter((newOperation) => {
264
+ return !operationsHistory.some((historyOperation) => {
265
+ return newOperation.type === "NOOP" && newOperation.skip === 0 && newOperation.index === historyOperation.index || newOperation.index === historyOperation.index && newOperation.skip === historyOperation.skip && newOperation.scope === historyOperation.scope && newOperation.hash === historyOperation.hash && newOperation.type === historyOperation.type;
266
+ });
267
+ });
268
+ }
269
+ function skipHeaderOperations(operations, skipHeaderOperation) {
270
+ const [lastOperation] = sortOperations(operations).slice(-1);
271
+ const lastIndex = (lastOperation == null ? void 0 : lastOperation.index) ?? -1;
272
+ const nextIndex = lastIndex + 1;
273
+ const skipOperationIndex = {
274
+ ...skipHeaderOperation,
275
+ index: skipHeaderOperation.index ?? nextIndex
276
+ };
277
+ if (skipOperationIndex.index < lastIndex) {
278
+ throw new Error(
279
+ `The skip header operation index must be greater than or equal to ${lastIndex}`
280
+ );
281
+ }
282
+ const clearedOperations = garbageCollect(
283
+ sortOperations([...operations, skipOperationIndex])
284
+ );
285
+ return (clearedOperations || []).slice(0, -1);
286
+ }
287
+ function grabageCollectDocumentOperations(documentOperations) {
288
+ const clearedOperations = Object.entries(documentOperations).reduce(
289
+ (acc, entry) => {
290
+ const [scope, ops] = entry;
291
+ return {
292
+ ...acc,
293
+ [scope]: garbageCollect(sortOperations(ops))
294
+ };
295
+ },
296
+ {}
297
+ );
298
+ return {
299
+ ...clearedOperations
300
+ };
301
+ }
302
+ export {
303
+ IntegrityIssueSubType,
304
+ IntegrityIssueType,
305
+ addUndo,
306
+ attachBranch,
307
+ checkCleanedOperationsIntegrity,
308
+ checkOperationsIntegrity,
309
+ garbageCollect,
310
+ grabageCollectDocumentOperations,
311
+ groupOperationsByScope,
312
+ merge,
313
+ nextSkipNumber,
314
+ operationsAreEqual,
315
+ precedes,
316
+ prepareOperations,
317
+ removeExistingOperations,
318
+ reshuffleByTimestamp,
319
+ reshuffleByTimestampAndIndex,
320
+ skipHeaderOperations,
321
+ sortOperations,
322
+ split
323
+ };
324
+ //# sourceMappingURL=document-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-helpers.js","sources":["../../../../../../src/document/utils/document-helpers.ts"],"sourcesContent":["import {\n Operation,\n OperationScope,\n Action,\n DocumentOperations,\n} from '../types';\nimport stringify from 'safe-stable-stringify';\n\nexport type OperationIndex = {\n index: number;\n skip: number;\n};\n\nexport enum IntegrityIssueType {\n UNEXPECTED_INDEX = 'UNEXPECTED_INDEX',\n}\n\nexport enum IntegrityIssueSubType {\n DUPLICATED_INDEX = 'DUPLICATED_INDEX',\n MISSING_INDEX = 'MISSING_INDEX',\n}\n\ntype IntegrityIssue = {\n operation: OperationIndex;\n issue: IntegrityIssueType;\n category: IntegrityIssueSubType;\n message: string;\n};\n\ntype Reshuffle = (\n startIndex: OperationIndex,\n opsA: Operation[],\n opsB: Operation[],\n) => Operation[];\n\nexport function checkCleanedOperationsIntegrity(\n sortedOperations: Operation[],\n): IntegrityIssue[] {\n const result: IntegrityIssue[] = [];\n\n // 1:1 1\n // 0:0 0 -> 1:0 1 -> 2:0 -> 3:0 -> 4:0 -> 5:0\n // 0:0 0 -> 2:1 1 -> 3:0 -> 4:0 -> 5:0\n // 0:0 0 -> 3:2 1 -> 4:0 -> 5:0\n // 0:0 0 -> 3:2 1 -> 5:1\n\n // 0:3 (expected 0, got -3)\n // 1:2 (expected 0, got -1)\n // 0:0 -> 1:1\n // 0:0 -> 2:2\n // 0:0 -> 3:2 -> 5:2\n\n let currentIndex = -1;\n for (const nextOperation of sortedOperations) {\n const nextIndex = nextOperation.index - nextOperation.skip;\n\n if (nextIndex !== currentIndex + 1) {\n result.push({\n operation: {\n index: nextOperation.index,\n skip: nextOperation.skip,\n },\n issue: IntegrityIssueType.UNEXPECTED_INDEX,\n category:\n nextIndex > currentIndex + 1\n ? IntegrityIssueSubType.MISSING_INDEX\n : IntegrityIssueSubType.DUPLICATED_INDEX,\n message: `Expected index ${currentIndex + 1} with skip 0 or equivalent, got index ${nextOperation.index} with skip ${nextOperation.skip}`,\n });\n }\n\n currentIndex = nextOperation.index;\n }\n\n return result;\n}\n\n// [] -> []\n// [0:0] -> [0:0]\n\n// 0:0 1:0 2:0 => 0:0 1:0 2:0, removals 0, no issues\n// 0:0 1:1 2:0 => 1:1 2:0, removals 1, no issues\n\n// 0:0 1:1 2:0 3:1 => 1:1 3:1, removals 2, no issues\n// 0:0 1:1 2:0 3:3 => 3:3\n\n// 1:1 2:0 3:0 => 1:1 2:0 3:0, removals 0, no issues\n// 1:0 0:0 2:0 => 2:0, removals 2, issues [UNEXPECTED_INDEX, INDEX_OUT_OF_ORDER]\n// 0:0 1:0 2:0 => 0:0 1:0 2:0, removals 0, no issues\n// 0:0 1:0 2:0 => 0:0 1:0 2:0, removals 0, no issues\n// 0:0 1:0 2:0 => 0:0 1:0 2:0, removals 0, no issues\n\nexport function garbageCollect<A extends OperationIndex>(\n sortedOperations: A[],\n): A[] {\n const result: A[] = [];\n\n let i = sortedOperations.length - 1;\n\n while (i > -1) {\n result.unshift(sortedOperations[i]);\n const skipUntil =\n (sortedOperations[i]?.index || 0) -\n (sortedOperations[i]?.skip || 0) -\n 1;\n\n let j = i - 1;\n while (j > -1 && (sortedOperations[j]?.index || 0) > skipUntil) {\n j--;\n }\n\n i = j;\n }\n\n return result;\n}\n\nexport function addUndo(sortedOperations: Operation[]): Operation[] {\n const operationsCopy = [...sortedOperations];\n const latestOperation = operationsCopy[operationsCopy.length - 1];\n\n if (!latestOperation) return operationsCopy;\n\n if (latestOperation.type === 'NOOP') {\n operationsCopy.push({\n ...latestOperation,\n index: latestOperation.index,\n type: 'NOOP',\n skip: nextSkipNumber(sortedOperations),\n });\n } else {\n operationsCopy.push({\n type: 'NOOP',\n index: latestOperation.index + 1,\n timestamp: new Date().toISOString(),\n input: {},\n skip: 1,\n scope: latestOperation.scope,\n hash: latestOperation.hash,\n });\n }\n\n return operationsCopy;\n}\n\n// [0:0 2:0 1:0 3:3 3:1] => [0:0 1:0 2:0 3:1 3:3]\n// Sort by index _and_ skip number\nexport function sortOperations<A extends OperationIndex>(operations: A[]): A[] {\n return operations\n .slice()\n .sort((a, b) => a.skip - b.skip)\n .sort((a, b) => a.index - b.index);\n}\n\n// [0:0, 1:0, 2:0, A3:0, A4:0, A5:0] + [0:0, 1:0, 2:0, B3:0, B4:2, B5:0]\n// GC => [0:0, 1:0, 2:0, A3:0, A4:0, A5:0] + [0:0, 1:0, B4:2, B5:0]\n// Split => [0:0, 1:0] + [2:0, A3:0, A4:0, A5:0] + [B4:2, B5:0]\n// Reshuffle(6:4) => [6:4, 7:0, 8:0, 9:0, 10:0, 11:0]\n// merge => [0:0, 1:0, 6:4, 7:0, 8:0, 9:0, 10:0, 11:0]\nexport const reshuffleByTimestamp: Reshuffle = (startIndex, opsA, opsB) => {\n return [...opsA, ...opsB]\n .sort(\n (a, b) =>\n new Date(a.timestamp).getTime() -\n new Date(b.timestamp).getTime(),\n )\n .map((op, i) => ({\n ...op,\n index: startIndex.index + i,\n skip: i === 0 ? startIndex.skip : 0,\n }));\n};\n\nexport const reshuffleByTimestampAndIndex: Reshuffle = (\n startIndex,\n opsA,\n opsB,\n) => {\n return [...opsA, ...opsB]\n .sort(\n (a, b) =>\n new Date(a.timestamp).getTime() -\n new Date(b.timestamp).getTime(),\n )\n .sort((a, b) => a.index - b.index)\n .map((op, i) => ({\n ...op,\n index: startIndex.index + i,\n skip: i === 0 ? startIndex.skip : 0,\n }));\n};\n\n// TODO: implement better operation equality function\nexport function operationsAreEqual(op1: Operation, op2: Operation) {\n return stringify(op1) === stringify(op2);\n}\n\n// [T0:0 T1:0 T2:0 T3:0] + [B4:0 B5:0] = [T0:0 T1:0 T2:0 T3:0 B4:0 B5:0]\n// [T0:0 T1:0 T2:0 T3:0] + [B3:0 B4:0] = [T0:0 T1:0 T2:0 B3:0 B4:0]\n// [T0:0 T1:0 T2:0 T3:0] + [B2:0 B3:0] = [T0:0 T1:0 B2:0 B3:0]\n\n// [T0:0 T1:0 T2:0 T3:0] + [B4:0 B4:2] = [T0:0 T1:0 T2:0 T3:0 B4:0 B4:2]\n// [T0:0 T1:0 T2:0 T3:0] + [B3:0 B3:2] = [T0:0 T1:0 T2:0 B3:0 B3:2]\n// [T0:0 T1:0 T2:0 T3:0] + [B2:3 B3:0] = [T0:0 T1:0 B2:3 B3:0]\n\nexport function attachBranch(\n trunk: Operation[],\n newBranch: Operation[],\n): [Operation[], Operation[]] {\n const trunkCopy = garbageCollect(sortOperations(trunk.slice()));\n const newOperations = garbageCollect(sortOperations(newBranch.slice()));\n if (trunkCopy.length < 1) {\n return [newOperations, []];\n }\n\n const result: Operation[] = [];\n let enteredBranch = false;\n\n while (newOperations.length > 0) {\n const newOperationCandidate = newOperations[0];\n\n let nextTrunkOperation = trunkCopy.shift();\n while (\n nextTrunkOperation &&\n precedes(nextTrunkOperation, newOperationCandidate)\n ) {\n result.push(nextTrunkOperation);\n nextTrunkOperation = trunkCopy.shift();\n }\n\n if (!nextTrunkOperation) {\n enteredBranch = true;\n } else if (!enteredBranch) {\n if (operationsAreEqual(nextTrunkOperation, newOperationCandidate)) {\n newOperations.shift();\n result.push(nextTrunkOperation);\n } else {\n trunkCopy.unshift(nextTrunkOperation);\n enteredBranch = true;\n }\n }\n\n if (enteredBranch) {\n let nextAppend = newOperations.shift();\n while (nextAppend) {\n result.push(nextAppend);\n nextAppend = newOperations.shift();\n }\n }\n }\n\n if (!enteredBranch) {\n let nextAppend = trunkCopy.shift();\n while (nextAppend) {\n result.push(nextAppend);\n nextAppend = trunkCopy.shift();\n }\n }\n\n return [garbageCollect(result), trunkCopy];\n}\n\nexport function precedes(op1: Operation, op2: Operation) {\n return (\n op1.index < op2.index ||\n (op1.index === op2.index && op1.skip < op2.skip)\n );\n}\n\nexport function split(\n sortedTargetOperations: Operation[],\n sortedMergeOperations: Operation[],\n): [Operation[], Operation[], Operation[]] {\n const commonOperations: Operation[] = [];\n const targetDiffOperations: Operation[] = [];\n const mergeDiffOperations: Operation[] = [];\n\n // get bigger array length\n const maxLength = Math.max(\n sortedTargetOperations.length,\n sortedMergeOperations.length,\n );\n\n let splitHappened = false;\n for (let i = 0; i < maxLength; i++) {\n const targetOperation = sortedTargetOperations[i];\n const mergeOperation = sortedMergeOperations[i];\n\n if (targetOperation && mergeOperation) {\n if (\n !splitHappened &&\n operationsAreEqual(targetOperation, mergeOperation)\n ) {\n commonOperations.push(targetOperation);\n } else {\n splitHappened = true;\n targetDiffOperations.push(targetOperation);\n mergeDiffOperations.push(mergeOperation);\n }\n } else if (targetOperation) {\n targetDiffOperations.push(targetOperation);\n } else if (mergeOperation) {\n mergeDiffOperations.push(mergeOperation);\n }\n }\n\n return [commonOperations, targetDiffOperations, mergeDiffOperations];\n}\n\n// [0:0, 1:0, 2:0, A3:0, A4:0, A5:0] + [0:0, 1:0, 2:0, B3:0, B4:2, B5:0]\n// GC => [0:0, 1:0, 2:0, A3:0, A4:0, A5:0] + [0:0, 1:0, B4:2, B5:0]\n// Split => [0:0, 1:0] + [2:0, A3:0, A4:0, A5:0] + [B4:2, B5:0]\n// Reshuffle(6:4) => [6:4, 7:0, 8:0, 9:0, 10:0, 11:0]\n// merge => [0:0, 1:0, 6:4, 7:0, 8:0, 9:0, 10:0, 11:0]\nexport function merge(\n sortedTargetOperations: Operation[],\n sortedMergeOperations: Operation[],\n reshuffle: Reshuffle,\n): Operation[] {\n const [_commonOperations, _targetOperations, _mergeOperations] = split(\n garbageCollect(sortedTargetOperations),\n garbageCollect(sortedMergeOperations),\n );\n\n const maxCommonIndex = getMaxIndex(_commonOperations);\n const nextIndex =\n 1 +\n Math.max(\n maxCommonIndex,\n getMaxIndex(_targetOperations),\n getMaxIndex(_mergeOperations),\n );\n\n const newOperationHistory = reshuffle(\n {\n index: nextIndex,\n skip: nextIndex - (maxCommonIndex + 1),\n },\n _targetOperations,\n _mergeOperations,\n );\n\n return _commonOperations.concat(newOperationHistory);\n}\n\nfunction getMaxIndex(sortedOperations: Operation[]) {\n const lastElement = sortedOperations[sortedOperations.length - 1];\n if (!lastElement) {\n return -1;\n }\n\n return lastElement.index;\n}\n\n// [] => -1\n// [0:0] => -1\n// [0:0 1:0] => 1\n// [0:0 1:1] => -1\n// [1:1] => -1\n// [0:0 1:0 2:0] => 1\n// [0:0 1:0 2:0 2:1] => 2\n// [0:0 1:0 2:0 2:1 2:2] => -1\n// [0:0 1:1 2:0] => 2\n// [0:0 1:1 2:2] => -1\n// [0:0 1:1 2:0 3:0] => 1\n// [0:0 1:1 2:0 3:1] => 3\n// [0:0 1:1 2:0 3:3] => -1\n// [50:50 100:50 150:50 151:0 152:0 153:0 154:3] => 53\n\nexport function nextSkipNumber<A extends OperationIndex>(\n sortedOperations: A[],\n): number {\n if (sortedOperations.length < 1) {\n return -1;\n }\n\n const cleanedOperations = garbageCollect(sortedOperations);\n\n let nextSkip =\n (cleanedOperations[cleanedOperations.length - 1]?.skip || 0) + 1;\n\n if (cleanedOperations.length > 1) {\n nextSkip += cleanedOperations[cleanedOperations.length - 2]?.skip || 0;\n }\n\n return (cleanedOperations[cleanedOperations.length - 1]?.index || -1) <\n nextSkip\n ? -1\n : nextSkip;\n}\n\nexport const checkOperationsIntegrity = (\n operations: Operation[],\n): IntegrityIssue[] => {\n return checkCleanedOperationsIntegrity(\n garbageCollect(sortOperations(operations)),\n );\n};\n\nexport type OperationsByScope = Partial<Record<OperationScope, Operation[]>>;\n\nexport const groupOperationsByScope = (\n operations: Operation[],\n): OperationsByScope => {\n const result = operations.reduce<OperationsByScope>((acc, operation) => {\n if (!acc[operation.scope]) {\n acc[operation.scope] = [];\n }\n\n acc[operation.scope]?.push(operation);\n\n return acc;\n }, {});\n\n return result;\n};\n\ntype PrepareOperationsResult = {\n validOperations: Operation[];\n invalidOperations: Operation[];\n duplicatedOperations: Operation[];\n integrityIssues: IntegrityIssue[];\n};\n\nexport const prepareOperations = (\n operationsHistory: Operation[],\n newOperations: Operation[],\n): PrepareOperationsResult => {\n const result: PrepareOperationsResult = {\n integrityIssues: [],\n validOperations: [],\n invalidOperations: [],\n duplicatedOperations: [],\n };\n\n const sortedOperationsHistory = sortOperations(operationsHistory);\n const sortedOperations = sortOperations(newOperations);\n\n const integrityErrors = checkCleanedOperationsIntegrity([\n ...sortedOperationsHistory,\n ...sortedOperations,\n ]);\n\n const missingIndexErrors = integrityErrors.filter(\n integrityIssue =>\n integrityIssue.category === IntegrityIssueSubType.MISSING_INDEX,\n );\n\n // get the integrity error with the lowest index operation\n const firstMissingIndexOperation = [...missingIndexErrors]\n .sort((a, b) => b.operation.index - a.operation.index)\n .pop()?.operation;\n\n for (const newOperation of sortedOperations) {\n // Operation is missing index or it follows an operation that is missing index\n if (\n firstMissingIndexOperation &&\n newOperation.index >= firstMissingIndexOperation.index\n ) {\n result.invalidOperations.push(newOperation);\n continue;\n }\n\n // check if operation is duplicated\n const isDuplicatedOperation = integrityErrors.some(integrityError => {\n return (\n integrityError.operation.index === newOperation.index &&\n integrityError.operation.skip === newOperation.skip &&\n integrityError.category ===\n IntegrityIssueSubType.DUPLICATED_INDEX\n );\n });\n\n // add to duplicated operations if it is duplicated\n if (isDuplicatedOperation) {\n result.duplicatedOperations.push(newOperation);\n continue;\n }\n\n // otherwise, add to valid operations\n result.validOperations.push(newOperation);\n }\n\n result.integrityIssues.push(...integrityErrors);\n return result;\n};\n\nexport function removeExistingOperations(\n newOperations: Operation[],\n operationsHistory: Operation[],\n): Operation[] {\n return newOperations.filter(newOperation => {\n return !operationsHistory.some(historyOperation => {\n return (\n (newOperation.type === 'NOOP' &&\n newOperation.skip === 0 &&\n newOperation.index === historyOperation.index) ||\n (newOperation.index === historyOperation.index &&\n newOperation.skip === historyOperation.skip &&\n newOperation.scope === historyOperation.scope &&\n newOperation.hash === historyOperation.hash &&\n newOperation.type === historyOperation.type)\n );\n });\n });\n}\n\nexport type SkipHeaderOperationIndex = Partial<Pick<OperationIndex, 'index'>> &\n Pick<OperationIndex, 'skip'>;\n\n/**\n * Skips header operations and returns the remaining operations.\n *\n * @param operations - The array of operations.\n * @param skipHeaderOperation - The skip header operation index.\n * @returns The remaining operations after skipping header operations.\n */\nexport function skipHeaderOperations<A extends OperationIndex>(\n operations: A[],\n skipHeaderOperation: SkipHeaderOperationIndex,\n): A[] {\n const [lastOperation] = sortOperations(operations).slice(-1);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const lastIndex = lastOperation?.index ?? -1;\n const nextIndex = lastIndex + 1;\n\n const skipOperationIndex = {\n ...skipHeaderOperation,\n index: skipHeaderOperation.index ?? nextIndex,\n };\n\n if (skipOperationIndex.index < lastIndex) {\n throw new Error(\n `The skip header operation index must be greater than or equal to ${lastIndex}`,\n );\n }\n\n const clearedOperations = garbageCollect(\n sortOperations([...operations, skipOperationIndex]),\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return (clearedOperations || []).slice(0, -1) as A[];\n}\n\nexport function grabageCollectDocumentOperations<A extends Action>(\n documentOperations: DocumentOperations<A>,\n): DocumentOperations<A> {\n const clearedOperations = Object.entries(documentOperations).reduce(\n (acc, entry) => {\n const [scope, ops] = entry;\n\n return {\n ...acc,\n [scope as OperationScope]: garbageCollect(sortOperations(ops)),\n };\n },\n {} as DocumentOperations<A>,\n );\n\n return {\n ...clearedOperations,\n };\n}\n"],"names":["IntegrityIssueType","IntegrityIssueSubType","stringify"],"mappings":"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"}