@fluidframework/tree 2.10.0-305357 → 2.10.0-307060

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 (292) hide show
  1. package/.eslintrc.cjs +56 -25
  2. package/api-report/tree.alpha.api.md +14 -11
  3. package/api-report/tree.beta.api.md +5 -2
  4. package/api-report/tree.legacy.alpha.api.md +5 -2
  5. package/api-report/tree.legacy.public.api.md +5 -2
  6. package/api-report/tree.public.api.md +5 -2
  7. package/dist/core/forest/forest.d.ts +5 -1
  8. package/dist/core/forest/forest.d.ts.map +1 -1
  9. package/dist/core/forest/forest.js.map +1 -1
  10. package/dist/core/index.d.ts +1 -1
  11. package/dist/core/index.d.ts.map +1 -1
  12. package/dist/core/index.js.map +1 -1
  13. package/dist/core/schema-stored/storedSchemaRepository.d.ts +7 -3
  14. package/dist/core/schema-stored/storedSchemaRepository.d.ts.map +1 -1
  15. package/dist/core/schema-stored/storedSchemaRepository.js +4 -6
  16. package/dist/core/schema-stored/storedSchemaRepository.js.map +1 -1
  17. package/dist/core/tree/anchorSet.d.ts +8 -5
  18. package/dist/core/tree/anchorSet.d.ts.map +1 -1
  19. package/dist/core/tree/anchorSet.js +12 -11
  20. package/dist/core/tree/anchorSet.js.map +1 -1
  21. package/dist/events/emitter.d.ts +21 -9
  22. package/dist/events/emitter.d.ts.map +1 -1
  23. package/dist/events/emitter.js +36 -21
  24. package/dist/events/emitter.js.map +1 -1
  25. package/dist/events/listeners.d.ts +16 -5
  26. package/dist/events/listeners.d.ts.map +1 -1
  27. package/dist/events/listeners.js.map +1 -1
  28. package/dist/feature-libraries/chunked-forest/basicChunk.d.ts +26 -5
  29. package/dist/feature-libraries/chunked-forest/basicChunk.d.ts.map +1 -1
  30. package/dist/feature-libraries/chunked-forest/basicChunk.js +15 -5
  31. package/dist/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
  32. package/dist/feature-libraries/chunked-forest/chunkTree.js +1 -1
  33. package/dist/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  34. package/dist/feature-libraries/chunked-forest/chunkedForest.d.ts +3 -2
  35. package/dist/feature-libraries/chunked-forest/chunkedForest.d.ts.map +1 -1
  36. package/dist/feature-libraries/chunked-forest/chunkedForest.js +19 -9
  37. package/dist/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
  38. package/dist/feature-libraries/flex-tree/context.d.ts +3 -2
  39. package/dist/feature-libraries/flex-tree/context.d.ts.map +1 -1
  40. package/dist/feature-libraries/flex-tree/context.js +3 -3
  41. package/dist/feature-libraries/flex-tree/context.js.map +1 -1
  42. package/dist/feature-libraries/flex-tree/lazyField.js +1 -1
  43. package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
  44. package/dist/feature-libraries/flex-tree/lazyNode.js +1 -1
  45. package/dist/feature-libraries/flex-tree/lazyNode.js.map +1 -1
  46. package/dist/feature-libraries/flex-tree/utilities.js +1 -1
  47. package/dist/feature-libraries/flex-tree/utilities.js.map +1 -1
  48. package/dist/feature-libraries/index.d.ts +1 -1
  49. package/dist/feature-libraries/index.d.ts.map +1 -1
  50. package/dist/feature-libraries/index.js +2 -2
  51. package/dist/feature-libraries/index.js.map +1 -1
  52. package/dist/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
  53. package/dist/feature-libraries/modular-schema/comparison.js +3 -0
  54. package/dist/feature-libraries/modular-schema/comparison.js.map +1 -1
  55. package/dist/feature-libraries/modular-schema/discrepancies.d.ts +29 -29
  56. package/dist/feature-libraries/modular-schema/discrepancies.d.ts.map +1 -1
  57. package/dist/feature-libraries/modular-schema/discrepancies.js +121 -75
  58. package/dist/feature-libraries/modular-schema/discrepancies.js.map +1 -1
  59. package/dist/feature-libraries/modular-schema/genericFieldKind.js +2 -2
  60. package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  61. package/dist/feature-libraries/modular-schema/index.d.ts +1 -1
  62. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  63. package/dist/feature-libraries/modular-schema/index.js +2 -2
  64. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  65. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +1 -1
  66. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  67. package/dist/feature-libraries/object-forest/objectForest.d.ts +2 -2
  68. package/dist/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
  69. package/dist/feature-libraries/object-forest/objectForest.js +6 -8
  70. package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
  71. package/dist/feature-libraries/schema-index/schemaSummarizer.js +1 -1
  72. package/dist/feature-libraries/schema-index/schemaSummarizer.js.map +1 -1
  73. package/dist/feature-libraries/sequence-field/compose.js +2 -2
  74. package/dist/feature-libraries/sequence-field/compose.js.map +1 -1
  75. package/dist/feature-libraries/sequence-field/markListFactory.js +1 -1
  76. package/dist/feature-libraries/sequence-field/markListFactory.js.map +1 -1
  77. package/dist/packageVersion.d.ts +1 -1
  78. package/dist/packageVersion.js +1 -1
  79. package/dist/packageVersion.js.map +1 -1
  80. package/dist/shared-tree/schematizingTreeView.js +2 -2
  81. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  82. package/dist/shared-tree/treeApi.js +6 -3
  83. package/dist/shared-tree/treeApi.js.map +1 -1
  84. package/dist/shared-tree/treeCheckout.js +7 -7
  85. package/dist/shared-tree/treeCheckout.js.map +1 -1
  86. package/dist/shared-tree-core/branch.d.ts +7 -7
  87. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  88. package/dist/shared-tree-core/branch.js +35 -25
  89. package/dist/shared-tree-core/branch.js.map +1 -1
  90. package/dist/shared-tree-core/editManager.js +4 -4
  91. package/dist/shared-tree-core/editManager.js.map +1 -1
  92. package/dist/shared-tree-core/sharedTreeCore.js +5 -5
  93. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  94. package/dist/simple-tree/api/schemaCreationUtilities.d.ts +12 -14
  95. package/dist/simple-tree/api/schemaCreationUtilities.d.ts.map +1 -1
  96. package/dist/simple-tree/api/schemaCreationUtilities.js +9 -7
  97. package/dist/simple-tree/api/schemaCreationUtilities.js.map +1 -1
  98. package/dist/simple-tree/api/schemaFactory.d.ts +68 -10
  99. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  100. package/dist/simple-tree/api/schemaFactory.js +38 -10
  101. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  102. package/dist/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  103. package/dist/simple-tree/api/treeNodeApi.js +4 -4
  104. package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
  105. package/dist/simple-tree/arrayNode.js +1 -1
  106. package/dist/simple-tree/arrayNode.js.map +1 -1
  107. package/dist/simple-tree/core/treeNodeKernel.d.ts +7 -8
  108. package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  109. package/dist/simple-tree/core/treeNodeKernel.js +68 -73
  110. package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
  111. package/dist/simple-tree/objectNode.d.ts +1 -1
  112. package/dist/simple-tree/objectNode.js.map +1 -1
  113. package/dist/simple-tree/objectNodeTypes.d.ts +3 -0
  114. package/dist/simple-tree/objectNodeTypes.d.ts.map +1 -1
  115. package/dist/simple-tree/objectNodeTypes.js +3 -1
  116. package/dist/simple-tree/objectNodeTypes.js.map +1 -1
  117. package/dist/simple-tree/proxies.js +1 -1
  118. package/dist/simple-tree/proxies.js.map +1 -1
  119. package/dist/simple-tree/schemaTypes.d.ts +26 -1
  120. package/dist/simple-tree/schemaTypes.d.ts.map +1 -1
  121. package/dist/simple-tree/schemaTypes.js.map +1 -1
  122. package/dist/simple-tree/treeNodeValid.js +2 -2
  123. package/dist/simple-tree/treeNodeValid.js.map +1 -1
  124. package/dist/util/nestedMap.d.ts.map +1 -1
  125. package/dist/util/nestedMap.js.map +1 -1
  126. package/docs/.attachments/object-merge-semantics.drawio +145 -0
  127. package/docs/user-facing/array-merge-semantics.md +344 -0
  128. package/docs/user-facing/map-merge-semantics.md +128 -0
  129. package/docs/user-facing/merge-semantics.md +7 -3
  130. package/docs/user-facing/object-merge-semantics.md +77 -0
  131. package/lib/core/forest/forest.d.ts +5 -1
  132. package/lib/core/forest/forest.d.ts.map +1 -1
  133. package/lib/core/forest/forest.js.map +1 -1
  134. package/lib/core/index.d.ts +1 -1
  135. package/lib/core/index.d.ts.map +1 -1
  136. package/lib/core/index.js.map +1 -1
  137. package/lib/core/schema-stored/storedSchemaRepository.d.ts +7 -3
  138. package/lib/core/schema-stored/storedSchemaRepository.d.ts.map +1 -1
  139. package/lib/core/schema-stored/storedSchemaRepository.js +4 -6
  140. package/lib/core/schema-stored/storedSchemaRepository.js.map +1 -1
  141. package/lib/core/tree/anchorSet.d.ts +8 -5
  142. package/lib/core/tree/anchorSet.d.ts.map +1 -1
  143. package/lib/core/tree/anchorSet.js +12 -11
  144. package/lib/core/tree/anchorSet.js.map +1 -1
  145. package/lib/events/emitter.d.ts +21 -9
  146. package/lib/events/emitter.d.ts.map +1 -1
  147. package/lib/events/emitter.js +37 -22
  148. package/lib/events/emitter.js.map +1 -1
  149. package/lib/events/listeners.d.ts +16 -5
  150. package/lib/events/listeners.d.ts.map +1 -1
  151. package/lib/events/listeners.js.map +1 -1
  152. package/lib/feature-libraries/chunked-forest/basicChunk.d.ts +26 -5
  153. package/lib/feature-libraries/chunked-forest/basicChunk.d.ts.map +1 -1
  154. package/lib/feature-libraries/chunked-forest/basicChunk.js +15 -5
  155. package/lib/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
  156. package/lib/feature-libraries/chunked-forest/chunkTree.js +1 -1
  157. package/lib/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  158. package/lib/feature-libraries/chunked-forest/chunkedForest.d.ts +3 -2
  159. package/lib/feature-libraries/chunked-forest/chunkedForest.d.ts.map +1 -1
  160. package/lib/feature-libraries/chunked-forest/chunkedForest.js +19 -9
  161. package/lib/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
  162. package/lib/feature-libraries/flex-tree/context.d.ts +3 -2
  163. package/lib/feature-libraries/flex-tree/context.d.ts.map +1 -1
  164. package/lib/feature-libraries/flex-tree/context.js +3 -3
  165. package/lib/feature-libraries/flex-tree/context.js.map +1 -1
  166. package/lib/feature-libraries/flex-tree/lazyField.js +1 -1
  167. package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
  168. package/lib/feature-libraries/flex-tree/lazyNode.js +1 -1
  169. package/lib/feature-libraries/flex-tree/lazyNode.js.map +1 -1
  170. package/lib/feature-libraries/flex-tree/utilities.js +1 -1
  171. package/lib/feature-libraries/flex-tree/utilities.js.map +1 -1
  172. package/lib/feature-libraries/index.d.ts +1 -1
  173. package/lib/feature-libraries/index.d.ts.map +1 -1
  174. package/lib/feature-libraries/index.js +1 -1
  175. package/lib/feature-libraries/index.js.map +1 -1
  176. package/lib/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
  177. package/lib/feature-libraries/modular-schema/comparison.js +3 -0
  178. package/lib/feature-libraries/modular-schema/comparison.js.map +1 -1
  179. package/lib/feature-libraries/modular-schema/discrepancies.d.ts +29 -29
  180. package/lib/feature-libraries/modular-schema/discrepancies.d.ts.map +1 -1
  181. package/lib/feature-libraries/modular-schema/discrepancies.js +120 -74
  182. package/lib/feature-libraries/modular-schema/discrepancies.js.map +1 -1
  183. package/lib/feature-libraries/modular-schema/genericFieldKind.js +2 -2
  184. package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  185. package/lib/feature-libraries/modular-schema/index.d.ts +1 -1
  186. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  187. package/lib/feature-libraries/modular-schema/index.js +1 -1
  188. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  189. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +1 -1
  190. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  191. package/lib/feature-libraries/object-forest/objectForest.d.ts +2 -2
  192. package/lib/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
  193. package/lib/feature-libraries/object-forest/objectForest.js +6 -8
  194. package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
  195. package/lib/feature-libraries/schema-index/schemaSummarizer.js +1 -1
  196. package/lib/feature-libraries/schema-index/schemaSummarizer.js.map +1 -1
  197. package/lib/feature-libraries/sequence-field/compose.js +2 -2
  198. package/lib/feature-libraries/sequence-field/compose.js.map +1 -1
  199. package/lib/feature-libraries/sequence-field/markListFactory.js +1 -1
  200. package/lib/feature-libraries/sequence-field/markListFactory.js.map +1 -1
  201. package/lib/packageVersion.d.ts +1 -1
  202. package/lib/packageVersion.js +1 -1
  203. package/lib/packageVersion.js.map +1 -1
  204. package/lib/shared-tree/schematizingTreeView.js +2 -2
  205. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  206. package/lib/shared-tree/treeApi.js +7 -4
  207. package/lib/shared-tree/treeApi.js.map +1 -1
  208. package/lib/shared-tree/treeCheckout.js +7 -7
  209. package/lib/shared-tree/treeCheckout.js.map +1 -1
  210. package/lib/shared-tree-core/branch.d.ts +7 -7
  211. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  212. package/lib/shared-tree-core/branch.js +36 -26
  213. package/lib/shared-tree-core/branch.js.map +1 -1
  214. package/lib/shared-tree-core/editManager.js +4 -4
  215. package/lib/shared-tree-core/editManager.js.map +1 -1
  216. package/lib/shared-tree-core/sharedTreeCore.js +5 -5
  217. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  218. package/lib/simple-tree/api/schemaCreationUtilities.d.ts +12 -14
  219. package/lib/simple-tree/api/schemaCreationUtilities.d.ts.map +1 -1
  220. package/lib/simple-tree/api/schemaCreationUtilities.js +9 -7
  221. package/lib/simple-tree/api/schemaCreationUtilities.js.map +1 -1
  222. package/lib/simple-tree/api/schemaFactory.d.ts +68 -10
  223. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  224. package/lib/simple-tree/api/schemaFactory.js +38 -10
  225. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  226. package/lib/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
  227. package/lib/simple-tree/api/treeNodeApi.js +4 -4
  228. package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
  229. package/lib/simple-tree/arrayNode.js +1 -1
  230. package/lib/simple-tree/arrayNode.js.map +1 -1
  231. package/lib/simple-tree/core/treeNodeKernel.d.ts +7 -8
  232. package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  233. package/lib/simple-tree/core/treeNodeKernel.js +69 -74
  234. package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
  235. package/lib/simple-tree/objectNode.d.ts +1 -1
  236. package/lib/simple-tree/objectNode.js.map +1 -1
  237. package/lib/simple-tree/objectNodeTypes.d.ts +3 -0
  238. package/lib/simple-tree/objectNodeTypes.d.ts.map +1 -1
  239. package/lib/simple-tree/objectNodeTypes.js +3 -1
  240. package/lib/simple-tree/objectNodeTypes.js.map +1 -1
  241. package/lib/simple-tree/proxies.js +1 -1
  242. package/lib/simple-tree/proxies.js.map +1 -1
  243. package/lib/simple-tree/schemaTypes.d.ts +26 -1
  244. package/lib/simple-tree/schemaTypes.d.ts.map +1 -1
  245. package/lib/simple-tree/schemaTypes.js.map +1 -1
  246. package/lib/simple-tree/treeNodeValid.js +2 -2
  247. package/lib/simple-tree/treeNodeValid.js.map +1 -1
  248. package/lib/util/nestedMap.d.ts.map +1 -1
  249. package/lib/util/nestedMap.js.map +1 -1
  250. package/package.json +20 -20
  251. package/src/core/forest/forest.ts +6 -1
  252. package/src/core/index.ts +1 -1
  253. package/src/core/schema-stored/storedSchemaRepository.ts +10 -13
  254. package/src/core/tree/anchorSet.ts +13 -20
  255. package/src/events/emitter.ts +45 -24
  256. package/src/events/listeners.ts +17 -5
  257. package/src/feature-libraries/chunked-forest/basicChunk.ts +12 -4
  258. package/src/feature-libraries/chunked-forest/chunkTree.ts +1 -1
  259. package/src/feature-libraries/chunked-forest/chunkedForest.ts +13 -14
  260. package/src/feature-libraries/flex-tree/context.ts +5 -7
  261. package/src/feature-libraries/flex-tree/lazyField.ts +1 -1
  262. package/src/feature-libraries/flex-tree/lazyNode.ts +1 -1
  263. package/src/feature-libraries/flex-tree/utilities.ts +1 -1
  264. package/src/feature-libraries/index.ts +1 -1
  265. package/src/feature-libraries/modular-schema/comparison.ts +4 -0
  266. package/src/feature-libraries/modular-schema/discrepancies.ts +188 -124
  267. package/src/feature-libraries/modular-schema/genericFieldKind.ts +2 -2
  268. package/src/feature-libraries/modular-schema/index.ts +4 -1
  269. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +1 -1
  270. package/src/feature-libraries/object-forest/objectForest.ts +5 -11
  271. package/src/feature-libraries/schema-index/schemaSummarizer.ts +1 -1
  272. package/src/feature-libraries/sequence-field/compose.ts +2 -2
  273. package/src/feature-libraries/sequence-field/markListFactory.ts +1 -1
  274. package/src/packageVersion.ts +1 -1
  275. package/src/shared-tree/schematizingTreeView.ts +2 -2
  276. package/src/shared-tree/treeApi.ts +9 -7
  277. package/src/shared-tree/treeCheckout.ts +7 -7
  278. package/src/shared-tree-core/branch.ts +30 -30
  279. package/src/shared-tree-core/editManager.ts +4 -4
  280. package/src/shared-tree-core/sharedTreeCore.ts +5 -5
  281. package/src/simple-tree/api/schemaCreationUtilities.ts +29 -17
  282. package/src/simple-tree/api/schemaFactory.ts +62 -29
  283. package/src/simple-tree/api/schemaFactoryRecursive.ts +1 -1
  284. package/src/simple-tree/api/treeNodeApi.ts +4 -4
  285. package/src/simple-tree/arrayNode.ts +1 -1
  286. package/src/simple-tree/core/treeNodeKernel.ts +68 -72
  287. package/src/simple-tree/objectNode.ts +1 -1
  288. package/src/simple-tree/objectNodeTypes.ts +3 -1
  289. package/src/simple-tree/proxies.ts +1 -1
  290. package/src/simple-tree/schemaTypes.ts +26 -1
  291. package/src/simple-tree/treeNodeValid.ts +2 -2
  292. package/src/util/nestedMap.ts +1 -0
@@ -4,30 +4,31 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.isRepoSuperset = exports.getAllowedContentIncompatibilities = void 0;
7
+ exports.isRepoSuperset = exports.getAllowedContentDiscrepancies = void 0;
8
8
  const internal_1 = require("@fluidframework/core-utils/internal");
9
9
  const index_js_1 = require("../../core/index.js");
10
+ const index_js_2 = require("../../util/index.js");
10
11
  /**
11
- * @remarks
12
+ * Finds and reports discrepancies between a view schema and a stored schema.
12
13
  *
13
14
  * The workflow for finding schema incompatibilities:
14
- * 1. Compare the two root schemas to identify any `FieldIncompatibility`.
15
+ * 1. Compare the two root schemas to identify any `FieldDiscrepancy`.
15
16
  *
16
17
  * 2. For each node schema in the `view`:
17
18
  * - Verify if the node schema exists in the stored. If it does, ensure that the `SchemaFactoryNodeKind` are
18
- * consistent. Otherwise this difference is treated as `NodeKindIncompatibility`
19
+ * consistent. Otherwise this difference is treated as `NodeKindDiscrepancy`
19
20
  * - If a node schema with the same identifier exists in both view and stored, and their `SchemaFactoryNodeKind`
20
- * are consistent, perform a exhaustive validation to identify all `FieldIncompatibility`.
21
+ * are consistent, perform a exhaustive validation to identify all `FieldDiscrepancy`.
21
22
  *
22
23
  * 3. For each node schema in the stored, verify if it exists in the view. The overlapping parts were already
23
24
  * addressed in the previous step.
24
25
  *
25
26
  * @returns the discrepancies between two TreeStoredSchema objects
26
27
  */
27
- function getAllowedContentIncompatibilities(view, stored) {
28
- const incompatibilities = [];
28
+ function getAllowedContentDiscrepancies(view, stored) {
29
+ const discrepancies = [];
29
30
  // check root schema discrepancies
30
- incompatibilities.push(...trackFieldDiscrepancies(view.rootFieldSchema, stored.rootFieldSchema));
31
+ discrepancies.push(...trackFieldDiscrepancies(view.rootFieldSchema, stored.rootFieldSchema));
31
32
  // Verify the existence and type of a node schema given its identifier (key), then determine if
32
33
  // an exhaustive search is necessary.
33
34
  const viewNodeKeys = new Set();
@@ -35,7 +36,7 @@ function getAllowedContentIncompatibilities(view, stored) {
35
36
  viewNodeKeys.add(key);
36
37
  if (viewNodeSchema instanceof index_js_1.ObjectNodeStoredSchema) {
37
38
  if (!stored.nodeSchema.has(key)) {
38
- incompatibilities.push({
39
+ discrepancies.push({
39
40
  identifier: key,
40
41
  mismatch: "nodeKind",
41
42
  view: "object",
@@ -46,7 +47,7 @@ function getAllowedContentIncompatibilities(view, stored) {
46
47
  const storedNodeSchema = stored.nodeSchema.get(key);
47
48
  (0, internal_1.assert)(storedNodeSchema !== undefined, 0x9be /* The storedNodeSchema in stored.nodeSchema should not be undefined */);
48
49
  if (storedNodeSchema instanceof index_js_1.MapNodeStoredSchema) {
49
- incompatibilities.push({
50
+ discrepancies.push({
50
51
  identifier: key,
51
52
  mismatch: "nodeKind",
52
53
  view: "object",
@@ -54,7 +55,7 @@ function getAllowedContentIncompatibilities(view, stored) {
54
55
  });
55
56
  }
56
57
  else if (storedNodeSchema instanceof index_js_1.LeafNodeStoredSchema) {
57
- incompatibilities.push({
58
+ discrepancies.push({
58
59
  identifier: key,
59
60
  mismatch: "nodeKind",
60
61
  view: "object",
@@ -64,7 +65,7 @@ function getAllowedContentIncompatibilities(view, stored) {
64
65
  else if (storedNodeSchema instanceof index_js_1.ObjectNodeStoredSchema) {
65
66
  const differences = trackObjectNodeDiscrepancies(viewNodeSchema, storedNodeSchema);
66
67
  if (differences.length > 0) {
67
- incompatibilities.push({
68
+ discrepancies.push({
68
69
  identifier: key,
69
70
  mismatch: "fields",
70
71
  differences,
@@ -78,7 +79,7 @@ function getAllowedContentIncompatibilities(view, stored) {
78
79
  }
79
80
  else if (viewNodeSchema instanceof index_js_1.MapNodeStoredSchema) {
80
81
  if (!stored.nodeSchema.has(key)) {
81
- incompatibilities.push({
82
+ discrepancies.push({
82
83
  identifier: key,
83
84
  mismatch: "nodeKind",
84
85
  view: "map",
@@ -89,7 +90,7 @@ function getAllowedContentIncompatibilities(view, stored) {
89
90
  const storedNodeSchema = stored.nodeSchema.get(key);
90
91
  (0, internal_1.assert)(storedNodeSchema !== undefined, 0x9bf /* The storedNodeSchema in stored.nodeSchema should not be undefined */);
91
92
  if (storedNodeSchema instanceof index_js_1.ObjectNodeStoredSchema) {
92
- incompatibilities.push({
93
+ discrepancies.push({
93
94
  identifier: key,
94
95
  mismatch: "nodeKind",
95
96
  view: "map",
@@ -97,7 +98,7 @@ function getAllowedContentIncompatibilities(view, stored) {
97
98
  });
98
99
  }
99
100
  else if (storedNodeSchema instanceof index_js_1.LeafNodeStoredSchema) {
100
- incompatibilities.push({
101
+ discrepancies.push({
101
102
  identifier: key,
102
103
  mismatch: "nodeKind",
103
104
  view: "map",
@@ -105,7 +106,7 @@ function getAllowedContentIncompatibilities(view, stored) {
105
106
  });
106
107
  }
107
108
  else if (storedNodeSchema instanceof index_js_1.MapNodeStoredSchema) {
108
- incompatibilities.push(...trackFieldDiscrepancies(viewNodeSchema.mapFields, storedNodeSchema.mapFields, key));
109
+ discrepancies.push(...trackFieldDiscrepancies(viewNodeSchema.mapFields, storedNodeSchema.mapFields, key));
109
110
  }
110
111
  else {
111
112
  throwUnsupportedNodeType(storedNodeSchema.constructor.name);
@@ -114,7 +115,7 @@ function getAllowedContentIncompatibilities(view, stored) {
114
115
  }
115
116
  else if (viewNodeSchema instanceof index_js_1.LeafNodeStoredSchema) {
116
117
  if (!stored.nodeSchema.has(key)) {
117
- incompatibilities.push({
118
+ discrepancies.push({
118
119
  identifier: key,
119
120
  mismatch: "nodeKind",
120
121
  view: "leaf",
@@ -125,7 +126,7 @@ function getAllowedContentIncompatibilities(view, stored) {
125
126
  const storedNodeSchema = stored.nodeSchema.get(key);
126
127
  (0, internal_1.assert)(storedNodeSchema !== undefined, 0x9c0 /* The storedNodeSchema in stored.nodeSchema should not be undefined */);
127
128
  if (storedNodeSchema instanceof index_js_1.MapNodeStoredSchema) {
128
- incompatibilities.push({
129
+ discrepancies.push({
129
130
  identifier: key,
130
131
  mismatch: "nodeKind",
131
132
  view: "leaf",
@@ -133,7 +134,7 @@ function getAllowedContentIncompatibilities(view, stored) {
133
134
  });
134
135
  }
135
136
  else if (storedNodeSchema instanceof index_js_1.ObjectNodeStoredSchema) {
136
- incompatibilities.push({
137
+ discrepancies.push({
137
138
  identifier: key,
138
139
  mismatch: "nodeKind",
139
140
  view: "leaf",
@@ -142,7 +143,7 @@ function getAllowedContentIncompatibilities(view, stored) {
142
143
  }
143
144
  else if (storedNodeSchema instanceof index_js_1.LeafNodeStoredSchema) {
144
145
  if (viewNodeSchema.leafValue !== storedNodeSchema.leafValue) {
145
- incompatibilities.push({
146
+ discrepancies.push({
146
147
  identifier: key,
147
148
  mismatch: "valueSchema",
148
149
  view: viewNodeSchema.leafValue,
@@ -161,7 +162,7 @@ function getAllowedContentIncompatibilities(view, stored) {
161
162
  }
162
163
  for (const [key, storedNodeSchema] of stored.nodeSchema) {
163
164
  if (!viewNodeKeys.has(key)) {
164
- incompatibilities.push({
165
+ discrepancies.push({
165
166
  identifier: key,
166
167
  mismatch: "nodeKind",
167
168
  view: undefined,
@@ -173,9 +174,9 @@ function getAllowedContentIncompatibilities(view, stored) {
173
174
  });
174
175
  }
175
176
  }
176
- return incompatibilities;
177
+ return discrepancies;
177
178
  }
178
- exports.getAllowedContentIncompatibilities = getAllowedContentIncompatibilities;
179
+ exports.getAllowedContentDiscrepancies = getAllowedContentDiscrepancies;
179
180
  /**
180
181
  * The function to track the discrepancies between two field stored schemas.
181
182
  *
@@ -223,12 +224,13 @@ function trackObjectNodeDiscrepancies(view, stored) {
223
224
  */
224
225
  for (const [fieldKey, fieldStoredSchema] of view.objectNodeFields) {
225
226
  viewFieldKeys.add(fieldKey);
226
- if (!stored.objectNodeFields.has(fieldKey)) {
227
+ if (!stored.objectNodeFields.has(fieldKey) &&
228
+ fieldStoredSchema.kind !== index_js_1.storedEmptyFieldSchema.kind) {
227
229
  differences.push({
228
230
  identifier: fieldKey,
229
231
  mismatch: "fieldKind",
230
232
  view: fieldStoredSchema.kind,
231
- stored: undefined,
233
+ stored: index_js_1.storedEmptyFieldSchema.kind,
232
234
  });
233
235
  }
234
236
  else {
@@ -239,12 +241,14 @@ function trackObjectNodeDiscrepancies(view, stored) {
239
241
  if (viewFieldKeys.has(fieldKey)) {
240
242
  continue;
241
243
  }
242
- differences.push({
243
- identifier: fieldKey,
244
- mismatch: "fieldKind",
245
- view: undefined,
246
- stored: fieldStoredSchema.kind,
247
- });
244
+ if (fieldStoredSchema.kind !== index_js_1.storedEmptyFieldSchema.kind) {
245
+ differences.push({
246
+ identifier: fieldKey,
247
+ mismatch: "fieldKind",
248
+ view: index_js_1.storedEmptyFieldSchema.kind,
249
+ stored: fieldStoredSchema.kind,
250
+ });
251
+ }
248
252
  }
249
253
  return differences;
250
254
  }
@@ -266,22 +270,26 @@ function trackObjectNodeDiscrepancies(view, stored) {
266
270
  * validating internal fields.
267
271
  */
268
272
  function isRepoSuperset(view, stored) {
269
- const incompatibilities = getAllowedContentIncompatibilities(view, stored);
270
- for (const incompatibility of incompatibilities) {
271
- switch (incompatibility.mismatch) {
273
+ const discrepancies = getAllowedContentDiscrepancies(view, stored);
274
+ for (const discrepancy of discrepancies) {
275
+ switch (discrepancy.mismatch) {
272
276
  case "nodeKind": {
273
- return false;
277
+ if (discrepancy.stored !== undefined) {
278
+ // It's fine for the view schema to know of a node type that the stored schema doesn't know about.
279
+ return false;
280
+ }
281
+ break;
274
282
  }
275
283
  case "valueSchema":
276
284
  case "allowedTypes":
277
285
  case "fieldKind": {
278
- if (!validateFieldIncompatibility(incompatibility)) {
286
+ if (!validateFieldIncompatibility(discrepancy)) {
279
287
  return false;
280
288
  }
281
289
  break;
282
290
  }
283
291
  case "fields": {
284
- if (incompatibility.differences.some((difference) => !validateFieldIncompatibility(difference))) {
292
+ if (discrepancy.differences.some((difference) => !validateFieldIncompatibility(difference))) {
285
293
  return false;
286
294
  }
287
295
  break;
@@ -292,26 +300,16 @@ function isRepoSuperset(view, stored) {
292
300
  return true;
293
301
  }
294
302
  exports.isRepoSuperset = isRepoSuperset;
295
- function validateFieldIncompatibility(incompatibility) {
296
- switch (incompatibility.mismatch) {
303
+ function validateFieldIncompatibility(discrepancy) {
304
+ switch (discrepancy.mismatch) {
297
305
  case "allowedTypes": {
298
306
  // Since we only track the symmetric difference between the allowed types in the view and
299
307
  // stored schemas, it's sufficient to check if any extra allowed types still exist in the
300
308
  // stored schema.
301
- return incompatibility.stored.length === 0;
309
+ return discrepancy.stored.length === 0;
302
310
  }
303
311
  case "fieldKind": {
304
- if (incompatibility.stored === undefined) {
305
- // Add an optional field
306
- if (incompatibility.view === "Optional") {
307
- return true;
308
- }
309
- }
310
- else {
311
- // Relax the field to make it more general
312
- return compareFieldKind(incompatibility.stored, incompatibility.view);
313
- }
314
- break;
312
+ return posetLte(discrepancy.stored, discrepancy.view, fieldRealizer);
315
313
  }
316
314
  case "valueSchema": {
317
315
  return false;
@@ -321,35 +319,83 @@ function validateFieldIncompatibility(incompatibility) {
321
319
  return false;
322
320
  }
323
321
  /**
324
- * A mapping that defines the order of field kinds for comparison purposes.
325
- * The numeric values indicate the hierarchy or "strength" of each field kind, where lower numbers are more restrictive.
326
- * This is used to determine if one field kind can be considered a superset of another.
327
- *
328
- * - "Forbidden": The most restrictive, represented by 1. Indicates a forbidden field.
329
- * - "Value": Represented by 2. Indicates a required field with a specific value.
330
- * - "Optional": Represented by 3. Indicates an optional field.
322
+ * @privateRemarks
323
+ * TODO: Knowledge of specific field kinds is not appropriate for modular schema.
324
+ * This bit of field comparison should be dependency injected by default-schema if this comparison logic remains in modular-schema
325
+ * (this is analogous to what is done in comparison.ts).
326
+ */
327
+ const FieldKindIdentifiers = {
328
+ forbidden: (0, index_js_2.brand)("Forbidden"),
329
+ required: (0, index_js_2.brand)("Value"),
330
+ identifier: (0, index_js_2.brand)("Identifier"),
331
+ optional: (0, index_js_2.brand)("Optional"),
332
+ sequence: (0, index_js_2.brand)("Sequence"),
333
+ };
334
+ /**
335
+ * A realizer for the partial order of field kind relaxability.
331
336
  *
332
- * Note:
333
- * - "Sequence": (Currently commented out) was intended to represent a sequence field kind with a value of 4.
334
- * Relaxing non-sequence fields to sequences is not currently supported but may be considered in the future.
337
+ * It seems extremely likely that this partial order will remain dimension 2 over time (i.e. the set of allowed relaxations can be visualized
338
+ * with a [dominance drawing](https://en.wikipedia.org/wiki/Dominance_drawing)), so this strategy allows efficient comarison between field kinds
339
+ * without excessive casework.
335
340
  *
336
- * TODO: We may need more coverage in realm to prove the correctness of the Forbidden -\> Value transaction
341
+ * Hasse diagram for the partial order is shown below (lower fields can be relaxed to higher fields):
342
+ * ```
343
+ * sequence
344
+ * |
345
+ * optional
346
+ * | \
347
+ * required forbidden
348
+ * |
349
+ * identifier
350
+ * ```
337
351
  */
338
- const fieldKindOrder = {
339
- "Forbidden": 1,
340
- "Value": 2,
341
- "Optional": 3,
342
- // "Sequence": 4, // Relaxing non-sequence fields to sequences is not currently supported, though we could consider doing so in the future.
352
+ const fieldRealizer = [
353
+ [
354
+ FieldKindIdentifiers.forbidden,
355
+ FieldKindIdentifiers.identifier,
356
+ FieldKindIdentifiers.required,
357
+ FieldKindIdentifiers.optional,
358
+ FieldKindIdentifiers.sequence,
359
+ ],
360
+ [
361
+ FieldKindIdentifiers.identifier,
362
+ FieldKindIdentifiers.required,
363
+ FieldKindIdentifiers.forbidden,
364
+ FieldKindIdentifiers.optional,
365
+ FieldKindIdentifiers.sequence,
366
+ ],
367
+ ].map((extension) => new Map(extension.map((identifier, index) => [identifier, index])));
368
+ const PosetComparisonResult = {
369
+ Less: "<",
370
+ Greater: ">",
371
+ Equal: "=",
372
+ Incomparable: "||",
343
373
  };
344
- function compareFieldKind(aKind, bKind) {
345
- if (aKind === undefined || bKind === undefined) {
346
- return false;
347
- }
348
- if (!(aKind in fieldKindOrder) || !(bKind in fieldKindOrder)) {
349
- return false;
374
+ function comparePosetElements(a, b, realizer) {
375
+ let hasLessThanResult = false;
376
+ let hasGreaterThanResult = false;
377
+ for (const extension of realizer) {
378
+ const aIndex = extension.get(a);
379
+ const bIndex = extension.get(b);
380
+ (0, internal_1.assert)(aIndex !== undefined && bIndex !== undefined, "Invalid realizer");
381
+ if (aIndex < bIndex) {
382
+ hasLessThanResult = true;
383
+ }
384
+ else if (aIndex > bIndex) {
385
+ hasGreaterThanResult = true;
386
+ }
350
387
  }
351
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
352
- return fieldKindOrder[aKind] <= fieldKindOrder[bKind];
388
+ return hasLessThanResult
389
+ ? hasGreaterThanResult
390
+ ? PosetComparisonResult.Incomparable
391
+ : PosetComparisonResult.Less
392
+ : hasGreaterThanResult
393
+ ? PosetComparisonResult.Greater
394
+ : PosetComparisonResult.Equal;
395
+ }
396
+ function posetLte(a, b, realizer) {
397
+ const comparison = comparePosetElements(a, b, realizer);
398
+ return (comparison === PosetComparisonResult.Less || comparison === PosetComparisonResult.Equal);
353
399
  }
354
400
  function throwUnsupportedNodeType(type) {
355
401
  throw new TypeError(`Unsupported node stored schema type: ${type}`);
@@ -1 +1 @@
1
- {"version":3,"file":"discrepancies.js","sourceRoot":"","sources":["../../../src/feature-libraries/modular-schema/discrepancies.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 { assert } from \"@fluidframework/core-utils/internal\";\n\nimport {\n\ttype FieldKey,\n\ttype FieldKindIdentifier,\n\tLeafNodeStoredSchema,\n\tMapNodeStoredSchema,\n\tObjectNodeStoredSchema,\n\ttype TreeFieldStoredSchema,\n\ttype TreeNodeSchemaIdentifier,\n\ttype TreeStoredSchema,\n\ttype TreeTypeSet,\n\ttype ValueSchema,\n} from \"../../core/index.js\";\n\n// TODO:\n// The comparisons in this file seem redundant with those in comparison.ts.\n// Rather than both existing, one of which just returns boolean and the other which returns additional details, a simple comparison which returns everything needed should be used.\n\n/**\n * @remarks\n *\n * 1. FieldIncompatibility\n *\n * `FieldIncompatibility` represents the differences between two `TreeFieldStoredSchema` objects. It consists of\n * three types of incompatibilities:\n *\n * - FieldKindIncompatibility: Indicates the differences in `FieldKindIdentifier` between two `TreeFieldStoredSchema`\n * objects (e.g., optional, required, sequence, etc.).\n * - AllowedTypesIncompatibility: Indicates the differences in the allowed child types between the two schemas.\n * - ValueSchemaIncompatibility: Specifically indicates the differences in the `ValueSchema` of two\n * `LeafNodeStoredSchema` objects.\n *\n * 2. NodeIncompatibility\n *\n * `NodeIncompatibility` represents the differences between two `TreeNodeStoredSchema` objects and includes:\n *\n * - NodeKindIncompatibility: Indicates the differences in the types of `TreeNodeStoredSchema` (currently supports\n * `ObjectNodeStoredSchema`, `MapNodeStoredSchema`, and `LeafNodeStoredSchema`).\n * - NodeFieldsIncompatibility: Indicates the `FieldIncompatibility` of `TreeFieldStoredSchema` within two\n * `TreeNodeStoredSchema`. It includes an array of `FieldIncompatibility` instances in the `differences` field.\n *\n * When comparing two nodes for compatibility, it only makes sense to compare their fields if the nodes are of\n * the same kind (map, object, leaf).\n *\n * 3. Incompatibility\n *\n * Incompatibility consists of both `NodeIncompatibility` and `FieldIncompatibility`, representing any kind of\n * schema differences. See {@link getAllowedContentIncompatibilities} for more details about how we process it\n * and the ordering.\n */\nexport type Incompatibility = FieldIncompatibility | NodeIncompatibility;\n\nexport type NodeIncompatibility = NodeKindIncompatibility | NodeFieldsIncompatibility;\n\nexport type FieldIncompatibility =\n\t| AllowedTypeIncompatibility\n\t| FieldKindIncompatibility\n\t| ValueSchemaIncompatibility;\n\nexport interface AllowedTypeIncompatibility {\n\tidentifier: string | undefined; // undefined indicates root field schema\n\tmismatch: \"allowedTypes\";\n\t/**\n\t * List of allowed type identifiers in viewed schema\n\t */\n\tview: string[];\n\t/**\n\t * List of allowed type identifiers in stored schema\n\t */\n\tstored: string[];\n}\n\nexport interface FieldKindIncompatibility {\n\tidentifier: string | undefined; // undefined indicates root field schema\n\tmismatch: \"fieldKind\";\n\tview: FieldKindIdentifier | undefined;\n\tstored: FieldKindIdentifier | undefined;\n}\n\nexport interface ValueSchemaIncompatibility {\n\tidentifier: string;\n\tmismatch: \"valueSchema\";\n\tview: ValueSchema | undefined;\n\tstored: ValueSchema | undefined;\n}\n\nexport interface NodeKindIncompatibility {\n\tidentifier: string;\n\tmismatch: \"nodeKind\";\n\tview: SchemaFactoryNodeKind | undefined;\n\tstored: SchemaFactoryNodeKind | undefined;\n}\n\nexport interface NodeFieldsIncompatibility {\n\tidentifier: string;\n\tmismatch: \"fields\";\n\tdifferences: FieldIncompatibility[];\n}\n\ntype SchemaFactoryNodeKind = \"object\" | \"leaf\" | \"map\";\n\n/**\n * @remarks\n *\n * The workflow for finding schema incompatibilities:\n * 1. Compare the two root schemas to identify any `FieldIncompatibility`.\n *\n * 2. For each node schema in the `view`:\n * - Verify if the node schema exists in the stored. If it does, ensure that the `SchemaFactoryNodeKind` are\n * consistent. Otherwise this difference is treated as `NodeKindIncompatibility`\n * - If a node schema with the same identifier exists in both view and stored, and their `SchemaFactoryNodeKind`\n * are consistent, perform a exhaustive validation to identify all `FieldIncompatibility`.\n *\n * 3. For each node schema in the stored, verify if it exists in the view. The overlapping parts were already\n * addressed in the previous step.\n *\n * @returns the discrepancies between two TreeStoredSchema objects\n */\nexport function getAllowedContentIncompatibilities(\n\tview: TreeStoredSchema,\n\tstored: TreeStoredSchema,\n): Incompatibility[] {\n\tconst incompatibilities: Incompatibility[] = [];\n\n\t// check root schema discrepancies\n\tincompatibilities.push(\n\t\t...trackFieldDiscrepancies(view.rootFieldSchema, stored.rootFieldSchema),\n\t);\n\n\t// Verify the existence and type of a node schema given its identifier (key), then determine if\n\t// an exhaustive search is necessary.\n\tconst viewNodeKeys = new Set<TreeNodeSchemaIdentifier>();\n\tfor (const [key, viewNodeSchema] of view.nodeSchema) {\n\t\tviewNodeKeys.add(key);\n\n\t\tif (viewNodeSchema instanceof ObjectNodeStoredSchema) {\n\t\t\tif (!stored.nodeSchema.has(key)) {\n\t\t\t\tincompatibilities.push({\n\t\t\t\t\tidentifier: key,\n\t\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\t\tview: \"object\",\n\t\t\t\t\tstored: undefined,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst storedNodeSchema = stored.nodeSchema.get(key);\n\t\t\t\tassert(\n\t\t\t\t\tstoredNodeSchema !== undefined,\n\t\t\t\t\t0x9be /* The storedNodeSchema in stored.nodeSchema should not be undefined */,\n\t\t\t\t);\n\t\t\t\tif (storedNodeSchema instanceof MapNodeStoredSchema) {\n\t\t\t\t\tincompatibilities.push({\n\t\t\t\t\t\tidentifier: key,\n\t\t\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\t\t\tview: \"object\",\n\t\t\t\t\t\tstored: \"map\",\n\t\t\t\t\t} satisfies NodeKindIncompatibility);\n\t\t\t\t} else if (storedNodeSchema instanceof LeafNodeStoredSchema) {\n\t\t\t\t\tincompatibilities.push({\n\t\t\t\t\t\tidentifier: key,\n\t\t\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\t\t\tview: \"object\",\n\t\t\t\t\t\tstored: \"leaf\",\n\t\t\t\t\t} satisfies NodeKindIncompatibility);\n\t\t\t\t} else if (storedNodeSchema instanceof ObjectNodeStoredSchema) {\n\t\t\t\t\tconst differences = trackObjectNodeDiscrepancies(viewNodeSchema, storedNodeSchema);\n\t\t\t\t\tif (differences.length > 0) {\n\t\t\t\t\t\tincompatibilities.push({\n\t\t\t\t\t\t\tidentifier: key,\n\t\t\t\t\t\t\tmismatch: \"fields\",\n\t\t\t\t\t\t\tdifferences,\n\t\t\t\t\t\t} satisfies NodeFieldsIncompatibility);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrowUnsupportedNodeType(storedNodeSchema.constructor.name);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (viewNodeSchema instanceof MapNodeStoredSchema) {\n\t\t\tif (!stored.nodeSchema.has(key)) {\n\t\t\t\tincompatibilities.push({\n\t\t\t\t\tidentifier: key,\n\t\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\t\tview: \"map\",\n\t\t\t\t\tstored: undefined,\n\t\t\t\t} satisfies NodeKindIncompatibility);\n\t\t\t} else {\n\t\t\t\tconst storedNodeSchema = stored.nodeSchema.get(key);\n\t\t\t\tassert(\n\t\t\t\t\tstoredNodeSchema !== undefined,\n\t\t\t\t\t0x9bf /* The storedNodeSchema in stored.nodeSchema should not be undefined */,\n\t\t\t\t);\n\t\t\t\tif (storedNodeSchema instanceof ObjectNodeStoredSchema) {\n\t\t\t\t\tincompatibilities.push({\n\t\t\t\t\t\tidentifier: key,\n\t\t\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\t\t\tview: \"map\",\n\t\t\t\t\t\tstored: \"object\",\n\t\t\t\t\t} satisfies NodeKindIncompatibility);\n\t\t\t\t} else if (storedNodeSchema instanceof LeafNodeStoredSchema) {\n\t\t\t\t\tincompatibilities.push({\n\t\t\t\t\t\tidentifier: key,\n\t\t\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\t\t\tview: \"map\",\n\t\t\t\t\t\tstored: \"leaf\",\n\t\t\t\t\t} satisfies NodeKindIncompatibility);\n\t\t\t\t} else if (storedNodeSchema instanceof MapNodeStoredSchema) {\n\t\t\t\t\tincompatibilities.push(\n\t\t\t\t\t\t...trackFieldDiscrepancies(\n\t\t\t\t\t\t\tviewNodeSchema.mapFields,\n\t\t\t\t\t\t\tstoredNodeSchema.mapFields,\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthrowUnsupportedNodeType(storedNodeSchema.constructor.name);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (viewNodeSchema instanceof LeafNodeStoredSchema) {\n\t\t\tif (!stored.nodeSchema.has(key)) {\n\t\t\t\tincompatibilities.push({\n\t\t\t\t\tidentifier: key,\n\t\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\t\tview: \"leaf\",\n\t\t\t\t\tstored: undefined,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst storedNodeSchema = stored.nodeSchema.get(key);\n\t\t\t\tassert(\n\t\t\t\t\tstoredNodeSchema !== undefined,\n\t\t\t\t\t0x9c0 /* The storedNodeSchema in stored.nodeSchema should not be undefined */,\n\t\t\t\t);\n\t\t\t\tif (storedNodeSchema instanceof MapNodeStoredSchema) {\n\t\t\t\t\tincompatibilities.push({\n\t\t\t\t\t\tidentifier: key,\n\t\t\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\t\t\tview: \"leaf\",\n\t\t\t\t\t\tstored: \"map\",\n\t\t\t\t\t} satisfies NodeKindIncompatibility);\n\t\t\t\t} else if (storedNodeSchema instanceof ObjectNodeStoredSchema) {\n\t\t\t\t\tincompatibilities.push({\n\t\t\t\t\t\tidentifier: key,\n\t\t\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\t\t\tview: \"leaf\",\n\t\t\t\t\t\tstored: \"object\",\n\t\t\t\t\t} satisfies NodeKindIncompatibility);\n\t\t\t\t} else if (storedNodeSchema instanceof LeafNodeStoredSchema) {\n\t\t\t\t\tif (viewNodeSchema.leafValue !== storedNodeSchema.leafValue) {\n\t\t\t\t\t\tincompatibilities.push({\n\t\t\t\t\t\t\tidentifier: key,\n\t\t\t\t\t\t\tmismatch: \"valueSchema\",\n\t\t\t\t\t\t\tview: viewNodeSchema.leafValue,\n\t\t\t\t\t\t\tstored: storedNodeSchema.leafValue,\n\t\t\t\t\t\t} satisfies ValueSchemaIncompatibility);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrowUnsupportedNodeType(storedNodeSchema.constructor.name);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrowUnsupportedNodeType(viewNodeSchema.constructor.name);\n\t\t}\n\t}\n\n\tfor (const [key, storedNodeSchema] of stored.nodeSchema) {\n\t\tif (!viewNodeKeys.has(key)) {\n\t\t\tincompatibilities.push({\n\t\t\t\tidentifier: key,\n\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\tview: undefined,\n\t\t\t\tstored:\n\t\t\t\t\tstoredNodeSchema instanceof MapNodeStoredSchema\n\t\t\t\t\t\t? \"map\"\n\t\t\t\t\t\t: storedNodeSchema instanceof ObjectNodeStoredSchema\n\t\t\t\t\t\t\t? \"object\"\n\t\t\t\t\t\t\t: \"leaf\",\n\t\t\t} satisfies NodeKindIncompatibility);\n\t\t}\n\t}\n\n\treturn incompatibilities;\n}\n\n/**\n * The function to track the discrepancies between two field stored schemas.\n *\n * @param keyOrRoot - If the key is missing, it indicates that this is the root field schema.\n */\nfunction trackFieldDiscrepancies(\n\tview: TreeFieldStoredSchema,\n\tstored: TreeFieldStoredSchema,\n\tkeyOrRoot?: string,\n): FieldIncompatibility[] {\n\tconst differences: FieldIncompatibility[] = [];\n\n\t// Only track the symmetric differences of two sets.\n\tconst findSetDiscrepancies = (\n\t\ta: TreeTypeSet,\n\t\tb: TreeTypeSet,\n\t): [TreeNodeSchemaIdentifier[], TreeNodeSchemaIdentifier[]] => {\n\t\tconst aDiff = [...a].filter((value) => !b.has(value));\n\t\tconst bDiff = [...b].filter((value) => !a.has(value));\n\t\treturn [aDiff, bDiff];\n\t};\n\n\tconst allowedTypesDiscrepancies = findSetDiscrepancies(view.types, stored.types);\n\tif (allowedTypesDiscrepancies[0].length > 0 || allowedTypesDiscrepancies[1].length > 0) {\n\t\tdifferences.push({\n\t\t\tidentifier: keyOrRoot,\n\t\t\tmismatch: \"allowedTypes\",\n\t\t\tview: allowedTypesDiscrepancies[0],\n\t\t\tstored: allowedTypesDiscrepancies[1],\n\t\t} satisfies AllowedTypeIncompatibility);\n\t}\n\n\tif (view.kind !== stored.kind) {\n\t\tdifferences.push({\n\t\t\tidentifier: keyOrRoot,\n\t\t\tmismatch: \"fieldKind\",\n\t\t\tview: view.kind,\n\t\t\tstored: stored.kind,\n\t\t} satisfies FieldKindIncompatibility);\n\t}\n\n\treturn differences;\n}\n\nfunction trackObjectNodeDiscrepancies(\n\tview: ObjectNodeStoredSchema,\n\tstored: ObjectNodeStoredSchema,\n): FieldIncompatibility[] {\n\tconst differences: FieldIncompatibility[] = [];\n\tconst viewFieldKeys = new Set<FieldKey>();\n\t/**\n\t * Similar to the logic used for tracking discrepancies between two node schemas, we will identify\n\t * three types of differences:\n\t * 1. Fields that exist in the view schema but not in the stored schema.\n\t * 2. Fields that exist in both schemas but have different contents.\n\t * 3. Fields that exist in the stored schema but not in the view schema.\n\t *\n\t * First, the view schema is iterated to track the first two types of differences.\n\t * Then, the stored schema is iterated to find the third type.\n\t */\n\n\tfor (const [fieldKey, fieldStoredSchema] of view.objectNodeFields) {\n\t\tviewFieldKeys.add(fieldKey);\n\t\tif (!stored.objectNodeFields.has(fieldKey)) {\n\t\t\tdifferences.push({\n\t\t\t\tidentifier: fieldKey,\n\t\t\t\tmismatch: \"fieldKind\",\n\t\t\t\tview: fieldStoredSchema.kind,\n\t\t\t\tstored: undefined,\n\t\t\t} satisfies FieldKindIncompatibility);\n\t\t} else {\n\t\t\tdifferences.push(\n\t\t\t\t...trackFieldDiscrepancies(\n\t\t\t\t\tview.objectNodeFields.get(fieldKey) as TreeFieldStoredSchema,\n\t\t\t\t\tstored.objectNodeFields.get(fieldKey) as TreeFieldStoredSchema,\n\t\t\t\t\tfieldKey,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tfor (const [fieldKey, fieldStoredSchema] of stored.objectNodeFields) {\n\t\tif (viewFieldKeys.has(fieldKey)) {\n\t\t\tcontinue;\n\t\t}\n\t\tdifferences.push({\n\t\t\tidentifier: fieldKey,\n\t\t\tmismatch: \"fieldKind\",\n\t\t\tview: undefined,\n\t\t\tstored: fieldStoredSchema.kind,\n\t\t} satisfies FieldKindIncompatibility);\n\t}\n\n\treturn differences;\n}\n\n/**\n * @remarks\n *\n * This function uses incompatibilities to determine if changes to a document schema are backward-compatible, i.e., it determines\n * whether the `view` schema allows a superset of the documents that the `stored` schema allows.\n * According to the policy of schema evolution, `isRepoSuperset` supports three types of changes:\n * 1. Adding an optional field to an object node.\n * 2. Expanding the set of allowed types for a field.\n * 3. Relaxing a field kind to a more general field kind.\n *\n * Notes: We expect isRepoSuperset to return consistent results with allowsRepoSuperset. However, currently there are some scenarios\n * where the inconsistency will occur:\n *\n * - Different Node Kinds: If a and b have different node kinds (e.g., a is an objectNodeSchema and b is a mapNodeSchema),\n * `isRepoSuperset` will determine that a can never be the superset of b. In contrast, `allowsRepoSuperset` will continue\n * validating internal fields.\n */\nexport function isRepoSuperset(view: TreeStoredSchema, stored: TreeStoredSchema): boolean {\n\tconst incompatibilities = getAllowedContentIncompatibilities(view, stored);\n\n\tfor (const incompatibility of incompatibilities) {\n\t\tswitch (incompatibility.mismatch) {\n\t\t\tcase \"nodeKind\": {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tcase \"valueSchema\":\n\t\t\tcase \"allowedTypes\":\n\t\t\tcase \"fieldKind\": {\n\t\t\t\tif (!validateFieldIncompatibility(incompatibility)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"fields\": {\n\t\t\t\tif (\n\t\t\t\t\tincompatibility.differences.some(\n\t\t\t\t\t\t(difference) => !validateFieldIncompatibility(difference),\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// No default\n\t\t}\n\t}\n\treturn true;\n}\n\nfunction validateFieldIncompatibility(incompatibility: FieldIncompatibility): boolean {\n\tswitch (incompatibility.mismatch) {\n\t\tcase \"allowedTypes\": {\n\t\t\t// Since we only track the symmetric difference between the allowed types in the view and\n\t\t\t// stored schemas, it's sufficient to check if any extra allowed types still exist in the\n\t\t\t// stored schema.\n\t\t\treturn incompatibility.stored.length === 0;\n\t\t}\n\t\tcase \"fieldKind\": {\n\t\t\tif (incompatibility.stored === undefined) {\n\t\t\t\t// Add an optional field\n\t\t\t\tif (incompatibility.view === \"Optional\") {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Relax the field to make it more general\n\t\t\t\treturn compareFieldKind(incompatibility.stored, incompatibility.view);\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t\tcase \"valueSchema\": {\n\t\t\treturn false;\n\t\t}\n\t\t// No default\n\t}\n\treturn false;\n}\n\n/**\n * A mapping that defines the order of field kinds for comparison purposes.\n * The numeric values indicate the hierarchy or \"strength\" of each field kind, where lower numbers are more restrictive.\n * This is used to determine if one field kind can be considered a superset of another.\n *\n * - \"Forbidden\": The most restrictive, represented by 1. Indicates a forbidden field.\n * - \"Value\": Represented by 2. Indicates a required field with a specific value.\n * - \"Optional\": Represented by 3. Indicates an optional field.\n *\n * Note:\n * - \"Sequence\": (Currently commented out) was intended to represent a sequence field kind with a value of 4.\n * Relaxing non-sequence fields to sequences is not currently supported but may be considered in the future.\n *\n * TODO: We may need more coverage in realm to prove the correctness of the Forbidden -\\> Value transaction\n */\nconst fieldKindOrder: { [key: string]: number } = {\n\t\"Forbidden\": 1,\n\t\"Value\": 2,\n\t\"Optional\": 3,\n\t// \"Sequence\": 4, // Relaxing non-sequence fields to sequences is not currently supported, though we could consider doing so in the future.\n};\n\nfunction compareFieldKind(\n\taKind: FieldKindIdentifier | undefined,\n\tbKind: FieldKindIdentifier | undefined,\n): boolean {\n\tif (aKind === undefined || bKind === undefined) {\n\t\treturn false;\n\t}\n\n\tif (!(aKind in fieldKindOrder) || !(bKind in fieldKindOrder)) {\n\t\treturn false;\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\treturn fieldKindOrder[aKind]! <= fieldKindOrder[bKind]!;\n}\n\nfunction throwUnsupportedNodeType(type: string): never {\n\tthrow new TypeError(`Unsupported node stored schema type: ${type}`);\n}\n"]}
1
+ {"version":3,"file":"discrepancies.js","sourceRoot":"","sources":["../../../src/feature-libraries/modular-schema/discrepancies.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 { assert } from \"@fluidframework/core-utils/internal\";\n\nimport {\n\ttype FieldKey,\n\ttype FieldKindIdentifier,\n\tLeafNodeStoredSchema,\n\tMapNodeStoredSchema,\n\tObjectNodeStoredSchema,\n\tstoredEmptyFieldSchema,\n\ttype TreeFieldStoredSchema,\n\ttype TreeNodeSchemaIdentifier,\n\ttype TreeStoredSchema,\n\ttype TreeTypeSet,\n\ttype ValueSchema,\n} from \"../../core/index.js\";\nimport { brand } from \"../../util/index.js\";\n\n// TODO:\n// The comparisons in this file seem redundant with those in comparison.ts.\n// Rather than both existing, one of which just returns boolean and the other which returns additional details, a simple comparison which returns everything needed should be used.\n\n/**\n * @remarks\n *\n * 1. FieldDiscrepancy\n *\n * `FieldDiscrepancy` represents the differences between two `TreeFieldStoredSchema` objects. It consists of\n * three types of incompatibilities:\n *\n * - FieldKindDiscrepancy: Indicates the differences in `FieldKindIdentifier` between two `TreeFieldStoredSchema`\n * objects (e.g., optional, required, sequence, etc.).\n * - AllowedTypesDiscrepancy: Indicates the differences in the allowed child types between the two schemas.\n * - ValueSchemaDiscrepancy: Specifically indicates the differences in the `ValueSchema` of two\n * `LeafNodeStoredSchema` objects.\n *\n * 2. NodeDiscrepancy\n *\n * `NodeDiscrepancy` represents the differences between two `TreeNodeStoredSchema` objects and includes:\n *\n * - NodeKindDiscrepancy: Indicates the differences in the types of `TreeNodeStoredSchema` (currently supports\n * `ObjectNodeStoredSchema`, `MapNodeStoredSchema`, and `LeafNodeStoredSchema`).\n * - NodeFieldsDiscrepancy: Indicates the `FieldDiscrepancy` of `TreeFieldStoredSchema` within two\n * `TreeNodeStoredSchema`. It includes an array of `FieldDiscrepancy` instances in the `differences` field.\n *\n * When comparing two nodes for compatibility, it only makes sense to compare their fields if the nodes are of\n * the same kind (map, object, leaf).\n *\n * 3. Discrepancy\n *\n * Discrepancy consists of both `NodeDiscrepancy` and `FieldDiscrepancy`, representing any kind of\n * schema differences. See {@link getAllowedContentDiscrepancies} for more details about how we process it\n * and the ordering.\n */\nexport type Discrepancy = FieldDiscrepancy | NodeDiscrepancy;\n\nexport type NodeDiscrepancy = NodeKindDiscrepancy | NodeFieldsDiscrepancy;\n\nexport type FieldDiscrepancy =\n\t| AllowedTypeDiscrepancy\n\t| FieldKindDiscrepancy\n\t| ValueSchemaDiscrepancy;\n\nexport interface AllowedTypeDiscrepancy {\n\tidentifier: string | undefined; // undefined indicates root field schema\n\tmismatch: \"allowedTypes\";\n\t/**\n\t * List of allowed type identifiers in viewed schema\n\t */\n\tview: string[];\n\t/**\n\t * List of allowed type identifiers in stored schema\n\t */\n\tstored: string[];\n}\n\nexport interface FieldKindDiscrepancy {\n\tidentifier: string | undefined; // undefined indicates root field schema\n\tmismatch: \"fieldKind\";\n\tview: FieldKindIdentifier;\n\tstored: FieldKindIdentifier;\n}\n\nexport interface ValueSchemaDiscrepancy {\n\tidentifier: string;\n\tmismatch: \"valueSchema\";\n\tview: ValueSchema | undefined;\n\tstored: ValueSchema | undefined;\n}\n\nexport interface NodeKindDiscrepancy {\n\tidentifier: string;\n\tmismatch: \"nodeKind\";\n\tview: SchemaFactoryNodeKind | undefined;\n\tstored: SchemaFactoryNodeKind | undefined;\n}\n\nexport interface NodeFieldsDiscrepancy {\n\tidentifier: string;\n\tmismatch: \"fields\";\n\tdifferences: FieldDiscrepancy[];\n}\n\ntype SchemaFactoryNodeKind = \"object\" | \"leaf\" | \"map\";\n\n/**\n * Finds and reports discrepancies between a view schema and a stored schema.\n *\n * The workflow for finding schema incompatibilities:\n * 1. Compare the two root schemas to identify any `FieldDiscrepancy`.\n *\n * 2. For each node schema in the `view`:\n * - Verify if the node schema exists in the stored. If it does, ensure that the `SchemaFactoryNodeKind` are\n * consistent. Otherwise this difference is treated as `NodeKindDiscrepancy`\n * - If a node schema with the same identifier exists in both view and stored, and their `SchemaFactoryNodeKind`\n * are consistent, perform a exhaustive validation to identify all `FieldDiscrepancy`.\n *\n * 3. For each node schema in the stored, verify if it exists in the view. The overlapping parts were already\n * addressed in the previous step.\n *\n * @returns the discrepancies between two TreeStoredSchema objects\n */\nexport function getAllowedContentDiscrepancies(\n\tview: TreeStoredSchema,\n\tstored: TreeStoredSchema,\n): Discrepancy[] {\n\tconst discrepancies: Discrepancy[] = [];\n\n\t// check root schema discrepancies\n\tdiscrepancies.push(...trackFieldDiscrepancies(view.rootFieldSchema, stored.rootFieldSchema));\n\n\t// Verify the existence and type of a node schema given its identifier (key), then determine if\n\t// an exhaustive search is necessary.\n\tconst viewNodeKeys = new Set<TreeNodeSchemaIdentifier>();\n\tfor (const [key, viewNodeSchema] of view.nodeSchema) {\n\t\tviewNodeKeys.add(key);\n\n\t\tif (viewNodeSchema instanceof ObjectNodeStoredSchema) {\n\t\t\tif (!stored.nodeSchema.has(key)) {\n\t\t\t\tdiscrepancies.push({\n\t\t\t\t\tidentifier: key,\n\t\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\t\tview: \"object\",\n\t\t\t\t\tstored: undefined,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst storedNodeSchema = stored.nodeSchema.get(key);\n\t\t\t\tassert(\n\t\t\t\t\tstoredNodeSchema !== undefined,\n\t\t\t\t\t0x9be /* The storedNodeSchema in stored.nodeSchema should not be undefined */,\n\t\t\t\t);\n\t\t\t\tif (storedNodeSchema instanceof MapNodeStoredSchema) {\n\t\t\t\t\tdiscrepancies.push({\n\t\t\t\t\t\tidentifier: key,\n\t\t\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\t\t\tview: \"object\",\n\t\t\t\t\t\tstored: \"map\",\n\t\t\t\t\t} satisfies NodeKindDiscrepancy);\n\t\t\t\t} else if (storedNodeSchema instanceof LeafNodeStoredSchema) {\n\t\t\t\t\tdiscrepancies.push({\n\t\t\t\t\t\tidentifier: key,\n\t\t\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\t\t\tview: \"object\",\n\t\t\t\t\t\tstored: \"leaf\",\n\t\t\t\t\t} satisfies NodeKindDiscrepancy);\n\t\t\t\t} else if (storedNodeSchema instanceof ObjectNodeStoredSchema) {\n\t\t\t\t\tconst differences = trackObjectNodeDiscrepancies(viewNodeSchema, storedNodeSchema);\n\t\t\t\t\tif (differences.length > 0) {\n\t\t\t\t\t\tdiscrepancies.push({\n\t\t\t\t\t\t\tidentifier: key,\n\t\t\t\t\t\t\tmismatch: \"fields\",\n\t\t\t\t\t\t\tdifferences,\n\t\t\t\t\t\t} satisfies NodeFieldsDiscrepancy);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrowUnsupportedNodeType(storedNodeSchema.constructor.name);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (viewNodeSchema instanceof MapNodeStoredSchema) {\n\t\t\tif (!stored.nodeSchema.has(key)) {\n\t\t\t\tdiscrepancies.push({\n\t\t\t\t\tidentifier: key,\n\t\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\t\tview: \"map\",\n\t\t\t\t\tstored: undefined,\n\t\t\t\t} satisfies NodeKindDiscrepancy);\n\t\t\t} else {\n\t\t\t\tconst storedNodeSchema = stored.nodeSchema.get(key);\n\t\t\t\tassert(\n\t\t\t\t\tstoredNodeSchema !== undefined,\n\t\t\t\t\t0x9bf /* The storedNodeSchema in stored.nodeSchema should not be undefined */,\n\t\t\t\t);\n\t\t\t\tif (storedNodeSchema instanceof ObjectNodeStoredSchema) {\n\t\t\t\t\tdiscrepancies.push({\n\t\t\t\t\t\tidentifier: key,\n\t\t\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\t\t\tview: \"map\",\n\t\t\t\t\t\tstored: \"object\",\n\t\t\t\t\t} satisfies NodeKindDiscrepancy);\n\t\t\t\t} else if (storedNodeSchema instanceof LeafNodeStoredSchema) {\n\t\t\t\t\tdiscrepancies.push({\n\t\t\t\t\t\tidentifier: key,\n\t\t\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\t\t\tview: \"map\",\n\t\t\t\t\t\tstored: \"leaf\",\n\t\t\t\t\t} satisfies NodeKindDiscrepancy);\n\t\t\t\t} else if (storedNodeSchema instanceof MapNodeStoredSchema) {\n\t\t\t\t\tdiscrepancies.push(\n\t\t\t\t\t\t...trackFieldDiscrepancies(\n\t\t\t\t\t\t\tviewNodeSchema.mapFields,\n\t\t\t\t\t\t\tstoredNodeSchema.mapFields,\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthrowUnsupportedNodeType(storedNodeSchema.constructor.name);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (viewNodeSchema instanceof LeafNodeStoredSchema) {\n\t\t\tif (!stored.nodeSchema.has(key)) {\n\t\t\t\tdiscrepancies.push({\n\t\t\t\t\tidentifier: key,\n\t\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\t\tview: \"leaf\",\n\t\t\t\t\tstored: undefined,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst storedNodeSchema = stored.nodeSchema.get(key);\n\t\t\t\tassert(\n\t\t\t\t\tstoredNodeSchema !== undefined,\n\t\t\t\t\t0x9c0 /* The storedNodeSchema in stored.nodeSchema should not be undefined */,\n\t\t\t\t);\n\t\t\t\tif (storedNodeSchema instanceof MapNodeStoredSchema) {\n\t\t\t\t\tdiscrepancies.push({\n\t\t\t\t\t\tidentifier: key,\n\t\t\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\t\t\tview: \"leaf\",\n\t\t\t\t\t\tstored: \"map\",\n\t\t\t\t\t} satisfies NodeKindDiscrepancy);\n\t\t\t\t} else if (storedNodeSchema instanceof ObjectNodeStoredSchema) {\n\t\t\t\t\tdiscrepancies.push({\n\t\t\t\t\t\tidentifier: key,\n\t\t\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\t\t\tview: \"leaf\",\n\t\t\t\t\t\tstored: \"object\",\n\t\t\t\t\t} satisfies NodeKindDiscrepancy);\n\t\t\t\t} else if (storedNodeSchema instanceof LeafNodeStoredSchema) {\n\t\t\t\t\tif (viewNodeSchema.leafValue !== storedNodeSchema.leafValue) {\n\t\t\t\t\t\tdiscrepancies.push({\n\t\t\t\t\t\t\tidentifier: key,\n\t\t\t\t\t\t\tmismatch: \"valueSchema\",\n\t\t\t\t\t\t\tview: viewNodeSchema.leafValue,\n\t\t\t\t\t\t\tstored: storedNodeSchema.leafValue,\n\t\t\t\t\t\t} satisfies ValueSchemaDiscrepancy);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrowUnsupportedNodeType(storedNodeSchema.constructor.name);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrowUnsupportedNodeType(viewNodeSchema.constructor.name);\n\t\t}\n\t}\n\n\tfor (const [key, storedNodeSchema] of stored.nodeSchema) {\n\t\tif (!viewNodeKeys.has(key)) {\n\t\t\tdiscrepancies.push({\n\t\t\t\tidentifier: key,\n\t\t\t\tmismatch: \"nodeKind\",\n\t\t\t\tview: undefined,\n\t\t\t\tstored:\n\t\t\t\t\tstoredNodeSchema instanceof MapNodeStoredSchema\n\t\t\t\t\t\t? \"map\"\n\t\t\t\t\t\t: storedNodeSchema instanceof ObjectNodeStoredSchema\n\t\t\t\t\t\t\t? \"object\"\n\t\t\t\t\t\t\t: \"leaf\",\n\t\t\t} satisfies NodeKindDiscrepancy);\n\t\t}\n\t}\n\n\treturn discrepancies;\n}\n\n/**\n * The function to track the discrepancies between two field stored schemas.\n *\n * @param keyOrRoot - If the key is missing, it indicates that this is the root field schema.\n */\nfunction trackFieldDiscrepancies(\n\tview: TreeFieldStoredSchema,\n\tstored: TreeFieldStoredSchema,\n\tkeyOrRoot?: string,\n): FieldDiscrepancy[] {\n\tconst differences: FieldDiscrepancy[] = [];\n\n\t// Only track the symmetric differences of two sets.\n\tconst findSetDiscrepancies = (\n\t\ta: TreeTypeSet,\n\t\tb: TreeTypeSet,\n\t): [TreeNodeSchemaIdentifier[], TreeNodeSchemaIdentifier[]] => {\n\t\tconst aDiff = [...a].filter((value) => !b.has(value));\n\t\tconst bDiff = [...b].filter((value) => !a.has(value));\n\t\treturn [aDiff, bDiff];\n\t};\n\n\tconst allowedTypesDiscrepancies = findSetDiscrepancies(view.types, stored.types);\n\tif (allowedTypesDiscrepancies[0].length > 0 || allowedTypesDiscrepancies[1].length > 0) {\n\t\tdifferences.push({\n\t\t\tidentifier: keyOrRoot,\n\t\t\tmismatch: \"allowedTypes\",\n\t\t\tview: allowedTypesDiscrepancies[0],\n\t\t\tstored: allowedTypesDiscrepancies[1],\n\t\t} satisfies AllowedTypeDiscrepancy);\n\t}\n\n\tif (view.kind !== stored.kind) {\n\t\tdifferences.push({\n\t\t\tidentifier: keyOrRoot,\n\t\t\tmismatch: \"fieldKind\",\n\t\t\tview: view.kind,\n\t\t\tstored: stored.kind,\n\t\t} satisfies FieldKindDiscrepancy);\n\t}\n\n\treturn differences;\n}\n\nfunction trackObjectNodeDiscrepancies(\n\tview: ObjectNodeStoredSchema,\n\tstored: ObjectNodeStoredSchema,\n): FieldDiscrepancy[] {\n\tconst differences: FieldDiscrepancy[] = [];\n\tconst viewFieldKeys = new Set<FieldKey>();\n\t/**\n\t * Similar to the logic used for tracking discrepancies between two node schemas, we will identify\n\t * three types of differences:\n\t * 1. Fields that exist in the view schema but not in the stored schema.\n\t * 2. Fields that exist in both schemas but have different contents.\n\t * 3. Fields that exist in the stored schema but not in the view schema.\n\t *\n\t * First, the view schema is iterated to track the first two types of differences.\n\t * Then, the stored schema is iterated to find the third type.\n\t */\n\n\tfor (const [fieldKey, fieldStoredSchema] of view.objectNodeFields) {\n\t\tviewFieldKeys.add(fieldKey);\n\t\tif (\n\t\t\t!stored.objectNodeFields.has(fieldKey) &&\n\t\t\tfieldStoredSchema.kind !== storedEmptyFieldSchema.kind\n\t\t) {\n\t\t\tdifferences.push({\n\t\t\t\tidentifier: fieldKey,\n\t\t\t\tmismatch: \"fieldKind\",\n\t\t\t\tview: fieldStoredSchema.kind,\n\t\t\t\tstored: storedEmptyFieldSchema.kind,\n\t\t\t} satisfies FieldKindDiscrepancy);\n\t\t} else {\n\t\t\tdifferences.push(\n\t\t\t\t...trackFieldDiscrepancies(\n\t\t\t\t\tview.objectNodeFields.get(fieldKey) as TreeFieldStoredSchema,\n\t\t\t\t\tstored.objectNodeFields.get(fieldKey) as TreeFieldStoredSchema,\n\t\t\t\t\tfieldKey,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tfor (const [fieldKey, fieldStoredSchema] of stored.objectNodeFields) {\n\t\tif (viewFieldKeys.has(fieldKey)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (fieldStoredSchema.kind !== storedEmptyFieldSchema.kind) {\n\t\t\tdifferences.push({\n\t\t\t\tidentifier: fieldKey,\n\t\t\t\tmismatch: \"fieldKind\",\n\t\t\t\tview: storedEmptyFieldSchema.kind,\n\t\t\t\tstored: fieldStoredSchema.kind,\n\t\t\t} satisfies FieldKindDiscrepancy);\n\t\t}\n\t}\n\n\treturn differences;\n}\n\n/**\n * @remarks\n *\n * This function uses incompatibilities to determine if changes to a document schema are backward-compatible, i.e., it determines\n * whether the `view` schema allows a superset of the documents that the `stored` schema allows.\n * According to the policy of schema evolution, `isRepoSuperset` supports three types of changes:\n * 1. Adding an optional field to an object node.\n * 2. Expanding the set of allowed types for a field.\n * 3. Relaxing a field kind to a more general field kind.\n *\n * Notes: We expect isRepoSuperset to return consistent results with allowsRepoSuperset. However, currently there are some scenarios\n * where the inconsistency will occur:\n *\n * - Different Node Kinds: If a and b have different node kinds (e.g., a is an objectNodeSchema and b is a mapNodeSchema),\n * `isRepoSuperset` will determine that a can never be the superset of b. In contrast, `allowsRepoSuperset` will continue\n * validating internal fields.\n */\nexport function isRepoSuperset(view: TreeStoredSchema, stored: TreeStoredSchema): boolean {\n\tconst discrepancies = getAllowedContentDiscrepancies(view, stored);\n\n\tfor (const discrepancy of discrepancies) {\n\t\tswitch (discrepancy.mismatch) {\n\t\t\tcase \"nodeKind\": {\n\t\t\t\tif (discrepancy.stored !== undefined) {\n\t\t\t\t\t// It's fine for the view schema to know of a node type that the stored schema doesn't know about.\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"valueSchema\":\n\t\t\tcase \"allowedTypes\":\n\t\t\tcase \"fieldKind\": {\n\t\t\t\tif (!validateFieldIncompatibility(discrepancy)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"fields\": {\n\t\t\t\tif (\n\t\t\t\t\tdiscrepancy.differences.some(\n\t\t\t\t\t\t(difference) => !validateFieldIncompatibility(difference),\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// No default\n\t\t}\n\t}\n\treturn true;\n}\n\nfunction validateFieldIncompatibility(discrepancy: FieldDiscrepancy): boolean {\n\tswitch (discrepancy.mismatch) {\n\t\tcase \"allowedTypes\": {\n\t\t\t// Since we only track the symmetric difference between the allowed types in the view and\n\t\t\t// stored schemas, it's sufficient to check if any extra allowed types still exist in the\n\t\t\t// stored schema.\n\t\t\treturn discrepancy.stored.length === 0;\n\t\t}\n\t\tcase \"fieldKind\": {\n\t\t\treturn posetLte(discrepancy.stored, discrepancy.view, fieldRealizer);\n\t\t}\n\t\tcase \"valueSchema\": {\n\t\t\treturn false;\n\t\t}\n\t\t// No default\n\t}\n\treturn false;\n}\n\n/**\n * A linear extension of a partially-ordered set of `T`s. See:\n * https://en.wikipedia.org/wiki/Linear_extension\n *\n * The linear extension is represented as a lookup from each poset element to its index in the linear extension.\n */\ntype LinearExtension<T> = Map<T, number>;\n\n/**\n * A realizer for a partially-ordered set. See:\n * https://en.wikipedia.org/wiki/Order_dimension\n */\ntype Realizer<T> = LinearExtension<T>[];\n\n/**\n * @privateRemarks\n * TODO: Knowledge of specific field kinds is not appropriate for modular schema.\n * This bit of field comparison should be dependency injected by default-schema if this comparison logic remains in modular-schema\n * (this is analogous to what is done in comparison.ts).\n */\nconst FieldKindIdentifiers = {\n\tforbidden: brand<FieldKindIdentifier>(\"Forbidden\"),\n\trequired: brand<FieldKindIdentifier>(\"Value\"),\n\tidentifier: brand<FieldKindIdentifier>(\"Identifier\"),\n\toptional: brand<FieldKindIdentifier>(\"Optional\"),\n\tsequence: brand<FieldKindIdentifier>(\"Sequence\"),\n};\n\n/**\n * A realizer for the partial order of field kind relaxability.\n *\n * It seems extremely likely that this partial order will remain dimension 2 over time (i.e. the set of allowed relaxations can be visualized\n * with a [dominance drawing](https://en.wikipedia.org/wiki/Dominance_drawing)), so this strategy allows efficient comarison between field kinds\n * without excessive casework.\n *\n * Hasse diagram for the partial order is shown below (lower fields can be relaxed to higher fields):\n * ```\n * sequence\n * |\n * optional\n * | \\\n * required forbidden\n * |\n * identifier\n * ```\n */\nconst fieldRealizer: Realizer<FieldKindIdentifier> = [\n\t[\n\t\tFieldKindIdentifiers.forbidden,\n\t\tFieldKindIdentifiers.identifier,\n\t\tFieldKindIdentifiers.required,\n\t\tFieldKindIdentifiers.optional,\n\t\tFieldKindIdentifiers.sequence,\n\t],\n\t[\n\t\tFieldKindIdentifiers.identifier,\n\t\tFieldKindIdentifiers.required,\n\t\tFieldKindIdentifiers.forbidden,\n\t\tFieldKindIdentifiers.optional,\n\t\tFieldKindIdentifiers.sequence,\n\t],\n].map((extension) => new Map(extension.map((identifier, index) => [identifier, index])));\n\nconst PosetComparisonResult = {\n\tLess: \"<\",\n\tGreater: \">\",\n\tEqual: \"=\",\n\tIncomparable: \"||\",\n} as const;\ntype PosetComparisonResult =\n\t(typeof PosetComparisonResult)[keyof typeof PosetComparisonResult];\n\nfunction comparePosetElements<T>(a: T, b: T, realizer: Realizer<T>): PosetComparisonResult {\n\tlet hasLessThanResult = false;\n\tlet hasGreaterThanResult = false;\n\tfor (const extension of realizer) {\n\t\tconst aIndex = extension.get(a);\n\t\tconst bIndex = extension.get(b);\n\t\tassert(aIndex !== undefined && bIndex !== undefined, \"Invalid realizer\");\n\t\tif (aIndex < bIndex) {\n\t\t\thasLessThanResult = true;\n\t\t} else if (aIndex > bIndex) {\n\t\t\thasGreaterThanResult = true;\n\t\t}\n\t}\n\n\treturn hasLessThanResult\n\t\t? hasGreaterThanResult\n\t\t\t? PosetComparisonResult.Incomparable\n\t\t\t: PosetComparisonResult.Less\n\t\t: hasGreaterThanResult\n\t\t\t? PosetComparisonResult.Greater\n\t\t\t: PosetComparisonResult.Equal;\n}\n\nfunction posetLte<T>(a: T, b: T, realizer: Realizer<T>): boolean {\n\tconst comparison = comparePosetElements(a, b, realizer);\n\treturn (\n\t\tcomparison === PosetComparisonResult.Less || comparison === PosetComparisonResult.Equal\n\t);\n}\n\nfunction throwUnsupportedNodeType(type: string): never {\n\tthrow new TypeError(`Unsupported node stored schema type: ${type}`);\n}\n"]}
@@ -71,8 +71,8 @@ function rebaseGenericChange(change, over, rebaseChild) {
71
71
  if (baseEntry === undefined && newEntry === undefined) {
72
72
  break;
73
73
  }
74
- const newIndex = newEntry?.[0] ?? Infinity;
75
- const baseIndex = baseEntry?.[0] ?? Infinity;
74
+ const newIndex = newEntry?.[0] ?? Number.POSITIVE_INFINITY;
75
+ const baseIndex = baseEntry?.[0] ?? Number.POSITIVE_INFINITY;
76
76
  let newNodeChange;
77
77
  let baseNodeChange;
78
78
  let index;
@@ -1 +1 @@
1
- {"version":3,"file":"genericFieldKind.js","sourceRoot":"","sources":["../../../src/feature-libraries/modular-schema/genericFieldKind.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 {\n\ttype DeltaDetachedNodeId,\n\ttype DeltaFieldChanges,\n\ttype DeltaMark,\n\ttype RevisionMetadataSource,\n\tMultiplicity,\n\ttype RevisionTag,\n\treplaceAtomRevisions,\n} from \"../../core/index.js\";\nimport { type IdAllocator, fail } from \"../../util/index.js\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport type { CrossFieldManager } from \"./crossFieldQueries.js\";\nimport type {\n\tFieldChangeHandler,\n\tNodeChangeComposer,\n\tNodeChangePruner,\n\tNodeChangeRebaser,\n\tRelevantRemovedRootsFromChild,\n\tToDelta,\n} from \"./fieldChangeHandler.js\";\nimport { FieldKindWithEditor } from \"./fieldKindWithEditor.js\";\nimport { makeGenericChangeCodec } from \"./genericFieldKindCodecs.js\";\nimport { newGenericChangeset, type GenericChangeset } from \"./genericFieldKindTypes.js\";\nimport type { NodeId } from \"./modularChangeTypes.js\";\nimport { BTree } from \"@tylerbu/sorted-btree-es6\";\n\n/**\n * {@link FieldChangeHandler} implementation for {@link GenericChangeset}.\n */\nexport const genericChangeHandler: FieldChangeHandler<GenericChangeset> = {\n\trebaser: {\n\t\tcompose,\n\t\tinvert: (change: GenericChangeset): GenericChangeset => change,\n\t\trebase: rebaseGenericChange,\n\t\tprune: pruneGenericChange,\n\t\treplaceRevisions,\n\t},\n\tcodecsFactory: makeGenericChangeCodec,\n\teditor: {\n\t\tbuildChildChange(index, change): GenericChangeset {\n\t\t\treturn newGenericChangeset([[index, change]]);\n\t\t},\n\t},\n\tintoDelta: (change: GenericChangeset, deltaFromChild: ToDelta): DeltaFieldChanges => {\n\t\tlet nodeIndex = 0;\n\t\tconst markList: DeltaMark[] = [];\n\t\tfor (const [index, nodeChange] of change.entries()) {\n\t\t\tif (nodeIndex < index) {\n\t\t\t\tconst offset = index - nodeIndex;\n\t\t\t\tmarkList.push({ count: offset });\n\t\t\t\tnodeIndex = index;\n\t\t\t}\n\t\t\tmarkList.push({ count: 1, fields: deltaFromChild(nodeChange) });\n\t\t\tnodeIndex += 1;\n\t\t}\n\t\treturn { local: markList };\n\t},\n\trelevantRemovedRoots,\n\tisEmpty: (change: GenericChangeset): boolean => change.length === 0,\n\tgetNestedChanges,\n\tcreateEmpty: newGenericChangeset,\n\tgetCrossFieldKeys: (_change) => [],\n};\n\nfunction compose(\n\tchange1: GenericChangeset,\n\tchange2: GenericChangeset,\n\tcomposeChildren: NodeChangeComposer,\n): GenericChangeset {\n\tconst composed = change1.clone();\n\tfor (const [index, id2] of change2.entries()) {\n\t\tconst id1 = composed.get(index);\n\t\tconst idComposed = id1 !== undefined ? composeChildren(id1, id2) : id2;\n\t\tcomposed.set(index, idComposed);\n\t}\n\n\treturn composed;\n}\n\nfunction getNestedChanges(change: GenericChangeset): [NodeId, number | undefined][] {\n\treturn change.toArray().map(([index, nodeChange]) => [nodeChange, index]);\n}\n\nfunction rebaseGenericChange(\n\tchange: GenericChangeset,\n\tover: GenericChangeset,\n\trebaseChild: NodeChangeRebaser,\n): GenericChangeset {\n\tconst rebased: GenericChangeset = new BTree();\n\tlet nextIndex = 0;\n\n\t// eslint-disable-next-line no-constant-condition\n\twhile (true) {\n\t\tconst newEntry = change.getPairOrNextHigher(nextIndex);\n\t\tconst baseEntry = over.getPairOrNextHigher(nextIndex);\n\n\t\tif (baseEntry === undefined && newEntry === undefined) {\n\t\t\tbreak;\n\t\t}\n\n\t\tconst newIndex = newEntry?.[0] ?? Infinity;\n\t\tconst baseIndex = baseEntry?.[0] ?? Infinity;\n\t\tlet newNodeChange: NodeId | undefined;\n\t\tlet baseNodeChange: NodeId | undefined;\n\t\tlet index: number;\n\t\tif (newIndex === baseIndex) {\n\t\t\tassert(\n\t\t\t\tnewEntry !== undefined && baseEntry !== undefined,\n\t\t\t\t0xa0d /* Entries should be defined */,\n\t\t\t);\n\t\t\tindex = newIndex;\n\t\t\tnewNodeChange = newEntry[1];\n\t\t\tbaseNodeChange = baseEntry[1];\n\t\t} else if (newIndex < baseIndex) {\n\t\t\tassert(newEntry !== undefined, 0xa0e /* Entry should be defined */);\n\t\t\tindex = newIndex;\n\t\t\tnewNodeChange = newEntry[1];\n\t\t} else {\n\t\t\tassert(baseEntry !== undefined, 0xa0f /* Entry should be defined */);\n\t\t\tindex = baseIndex;\n\t\t\tbaseNodeChange = baseEntry[1];\n\t\t}\n\n\t\tconst nodeChange = rebaseChild(newNodeChange, baseNodeChange);\n\t\tif (nodeChange !== undefined) {\n\t\t\trebased.set(index, nodeChange);\n\t\t}\n\n\t\tnextIndex = index + 1;\n\t}\n\n\treturn rebased;\n}\n\nfunction pruneGenericChange(\n\tchangeset: GenericChangeset,\n\tpruneChild: NodeChangePruner,\n): GenericChangeset {\n\tconst pruned: GenericChangeset = new BTree();\n\tfor (const [index, node] of changeset.entries()) {\n\t\tconst prunedNode = pruneChild(node);\n\t\tif (prunedNode !== undefined) {\n\t\t\tpruned.set(index, node);\n\t\t}\n\t}\n\treturn pruned;\n}\n\nfunction replaceRevisions(\n\tchangeset: GenericChangeset,\n\toldRevisions: Set<RevisionTag | undefined>,\n\tnewRevision: RevisionTag | undefined,\n): GenericChangeset {\n\treturn changeset.mapValues((node) => replaceAtomRevisions(node, oldRevisions, newRevision));\n}\n\n/**\n * {@link FieldKind} used to represent changes to elements of a field in a field-kind-agnostic format.\n */\nexport const genericFieldKind: FieldKindWithEditor = new FieldKindWithEditor(\n\t\"ModularEditBuilder.Generic\",\n\tMultiplicity.Sequence,\n\tgenericChangeHandler,\n\t(types, other) => false,\n\tnew Set(),\n);\n\n/**\n * Converts a {@link GenericChangeset} into a field-kind-specific `TChange`.\n * @param changeset - The generic changeset to convert.\n * @param target - The {@link FieldChangeHandler} for the `FieldKind` that the returned change should target.\n * @param composeChild - A delegate to compose {@link NodeChangeset}s.\n * @returns An equivalent changeset as represented by the `target` field-kind.\n */\nexport function convertGenericChange<TChange>(\n\tchangeset: GenericChangeset,\n\ttarget: FieldChangeHandler<TChange>,\n\tcomposeChild: NodeChangeComposer,\n\tgenId: IdAllocator,\n\trevisionMetadata: RevisionMetadataSource,\n): TChange {\n\tconst perIndex: TChange[] = [];\n\tfor (const [index, nodeChange] of changeset.entries()) {\n\t\tperIndex.push(target.editor.buildChildChange(index, nodeChange));\n\t}\n\n\tif (perIndex.length === 0) {\n\t\treturn target.createEmpty();\n\t}\n\n\treturn perIndex.reduce((a, b) =>\n\t\ttarget.rebaser.compose(\n\t\t\ta,\n\t\t\tb,\n\t\t\tcomposeChild,\n\t\t\tgenId,\n\t\t\tinvalidCrossFieldManager,\n\t\t\trevisionMetadata,\n\t\t),\n\t);\n}\n\nconst invalidFunc = (): never => fail(\"Should not be called when converting generic changes\");\nconst invalidCrossFieldManager: CrossFieldManager = {\n\tset: invalidFunc,\n\tget: invalidFunc,\n\tonMoveIn: invalidFunc,\n\tmoveKey: invalidFunc,\n};\n\nfunction* relevantRemovedRoots(\n\tchange: GenericChangeset,\n\trelevantRemovedRootsFromChild: RelevantRemovedRootsFromChild,\n): Iterable<DeltaDetachedNodeId> {\n\tfor (const nodeChange of change.values()) {\n\t\tyield* relevantRemovedRootsFromChild(nodeChange);\n\t}\n}\n"]}
1
+ {"version":3,"file":"genericFieldKind.js","sourceRoot":"","sources":["../../../src/feature-libraries/modular-schema/genericFieldKind.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 {\n\ttype DeltaDetachedNodeId,\n\ttype DeltaFieldChanges,\n\ttype DeltaMark,\n\ttype RevisionMetadataSource,\n\tMultiplicity,\n\ttype RevisionTag,\n\treplaceAtomRevisions,\n} from \"../../core/index.js\";\nimport { type IdAllocator, fail } from \"../../util/index.js\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport type { CrossFieldManager } from \"./crossFieldQueries.js\";\nimport type {\n\tFieldChangeHandler,\n\tNodeChangeComposer,\n\tNodeChangePruner,\n\tNodeChangeRebaser,\n\tRelevantRemovedRootsFromChild,\n\tToDelta,\n} from \"./fieldChangeHandler.js\";\nimport { FieldKindWithEditor } from \"./fieldKindWithEditor.js\";\nimport { makeGenericChangeCodec } from \"./genericFieldKindCodecs.js\";\nimport { newGenericChangeset, type GenericChangeset } from \"./genericFieldKindTypes.js\";\nimport type { NodeId } from \"./modularChangeTypes.js\";\nimport { BTree } from \"@tylerbu/sorted-btree-es6\";\n\n/**\n * {@link FieldChangeHandler} implementation for {@link GenericChangeset}.\n */\nexport const genericChangeHandler: FieldChangeHandler<GenericChangeset> = {\n\trebaser: {\n\t\tcompose,\n\t\tinvert: (change: GenericChangeset): GenericChangeset => change,\n\t\trebase: rebaseGenericChange,\n\t\tprune: pruneGenericChange,\n\t\treplaceRevisions,\n\t},\n\tcodecsFactory: makeGenericChangeCodec,\n\teditor: {\n\t\tbuildChildChange(index, change): GenericChangeset {\n\t\t\treturn newGenericChangeset([[index, change]]);\n\t\t},\n\t},\n\tintoDelta: (change: GenericChangeset, deltaFromChild: ToDelta): DeltaFieldChanges => {\n\t\tlet nodeIndex = 0;\n\t\tconst markList: DeltaMark[] = [];\n\t\tfor (const [index, nodeChange] of change.entries()) {\n\t\t\tif (nodeIndex < index) {\n\t\t\t\tconst offset = index - nodeIndex;\n\t\t\t\tmarkList.push({ count: offset });\n\t\t\t\tnodeIndex = index;\n\t\t\t}\n\t\t\tmarkList.push({ count: 1, fields: deltaFromChild(nodeChange) });\n\t\t\tnodeIndex += 1;\n\t\t}\n\t\treturn { local: markList };\n\t},\n\trelevantRemovedRoots,\n\tisEmpty: (change: GenericChangeset): boolean => change.length === 0,\n\tgetNestedChanges,\n\tcreateEmpty: newGenericChangeset,\n\tgetCrossFieldKeys: (_change) => [],\n};\n\nfunction compose(\n\tchange1: GenericChangeset,\n\tchange2: GenericChangeset,\n\tcomposeChildren: NodeChangeComposer,\n): GenericChangeset {\n\tconst composed = change1.clone();\n\tfor (const [index, id2] of change2.entries()) {\n\t\tconst id1 = composed.get(index);\n\t\tconst idComposed = id1 !== undefined ? composeChildren(id1, id2) : id2;\n\t\tcomposed.set(index, idComposed);\n\t}\n\n\treturn composed;\n}\n\nfunction getNestedChanges(change: GenericChangeset): [NodeId, number | undefined][] {\n\treturn change.toArray().map(([index, nodeChange]) => [nodeChange, index]);\n}\n\nfunction rebaseGenericChange(\n\tchange: GenericChangeset,\n\tover: GenericChangeset,\n\trebaseChild: NodeChangeRebaser,\n): GenericChangeset {\n\tconst rebased: GenericChangeset = new BTree();\n\tlet nextIndex = 0;\n\n\t// eslint-disable-next-line no-constant-condition\n\twhile (true) {\n\t\tconst newEntry = change.getPairOrNextHigher(nextIndex);\n\t\tconst baseEntry = over.getPairOrNextHigher(nextIndex);\n\n\t\tif (baseEntry === undefined && newEntry === undefined) {\n\t\t\tbreak;\n\t\t}\n\n\t\tconst newIndex = newEntry?.[0] ?? Number.POSITIVE_INFINITY;\n\t\tconst baseIndex = baseEntry?.[0] ?? Number.POSITIVE_INFINITY;\n\t\tlet newNodeChange: NodeId | undefined;\n\t\tlet baseNodeChange: NodeId | undefined;\n\t\tlet index: number;\n\t\tif (newIndex === baseIndex) {\n\t\t\tassert(\n\t\t\t\tnewEntry !== undefined && baseEntry !== undefined,\n\t\t\t\t0xa0d /* Entries should be defined */,\n\t\t\t);\n\t\t\tindex = newIndex;\n\t\t\tnewNodeChange = newEntry[1];\n\t\t\tbaseNodeChange = baseEntry[1];\n\t\t} else if (newIndex < baseIndex) {\n\t\t\tassert(newEntry !== undefined, 0xa0e /* Entry should be defined */);\n\t\t\tindex = newIndex;\n\t\t\tnewNodeChange = newEntry[1];\n\t\t} else {\n\t\t\tassert(baseEntry !== undefined, 0xa0f /* Entry should be defined */);\n\t\t\tindex = baseIndex;\n\t\t\tbaseNodeChange = baseEntry[1];\n\t\t}\n\n\t\tconst nodeChange = rebaseChild(newNodeChange, baseNodeChange);\n\t\tif (nodeChange !== undefined) {\n\t\t\trebased.set(index, nodeChange);\n\t\t}\n\n\t\tnextIndex = index + 1;\n\t}\n\n\treturn rebased;\n}\n\nfunction pruneGenericChange(\n\tchangeset: GenericChangeset,\n\tpruneChild: NodeChangePruner,\n): GenericChangeset {\n\tconst pruned: GenericChangeset = new BTree();\n\tfor (const [index, node] of changeset.entries()) {\n\t\tconst prunedNode = pruneChild(node);\n\t\tif (prunedNode !== undefined) {\n\t\t\tpruned.set(index, node);\n\t\t}\n\t}\n\treturn pruned;\n}\n\nfunction replaceRevisions(\n\tchangeset: GenericChangeset,\n\toldRevisions: Set<RevisionTag | undefined>,\n\tnewRevision: RevisionTag | undefined,\n): GenericChangeset {\n\treturn changeset.mapValues((node) => replaceAtomRevisions(node, oldRevisions, newRevision));\n}\n\n/**\n * {@link FieldKind} used to represent changes to elements of a field in a field-kind-agnostic format.\n */\nexport const genericFieldKind: FieldKindWithEditor = new FieldKindWithEditor(\n\t\"ModularEditBuilder.Generic\",\n\tMultiplicity.Sequence,\n\tgenericChangeHandler,\n\t(types, other) => false,\n\tnew Set(),\n);\n\n/**\n * Converts a {@link GenericChangeset} into a field-kind-specific `TChange`.\n * @param changeset - The generic changeset to convert.\n * @param target - The {@link FieldChangeHandler} for the `FieldKind` that the returned change should target.\n * @param composeChild - A delegate to compose {@link NodeChangeset}s.\n * @returns An equivalent changeset as represented by the `target` field-kind.\n */\nexport function convertGenericChange<TChange>(\n\tchangeset: GenericChangeset,\n\ttarget: FieldChangeHandler<TChange>,\n\tcomposeChild: NodeChangeComposer,\n\tgenId: IdAllocator,\n\trevisionMetadata: RevisionMetadataSource,\n): TChange {\n\tconst perIndex: TChange[] = [];\n\tfor (const [index, nodeChange] of changeset.entries()) {\n\t\tperIndex.push(target.editor.buildChildChange(index, nodeChange));\n\t}\n\n\tif (perIndex.length === 0) {\n\t\treturn target.createEmpty();\n\t}\n\n\treturn perIndex.reduce((a, b) =>\n\t\ttarget.rebaser.compose(\n\t\t\ta,\n\t\t\tb,\n\t\t\tcomposeChild,\n\t\t\tgenId,\n\t\t\tinvalidCrossFieldManager,\n\t\t\trevisionMetadata,\n\t\t),\n\t);\n}\n\nconst invalidFunc = (): never => fail(\"Should not be called when converting generic changes\");\nconst invalidCrossFieldManager: CrossFieldManager = {\n\tset: invalidFunc,\n\tget: invalidFunc,\n\tonMoveIn: invalidFunc,\n\tmoveKey: invalidFunc,\n};\n\nfunction* relevantRemovedRoots(\n\tchange: GenericChangeset,\n\trelevantRemovedRootsFromChild: RelevantRemovedRootsFromChild,\n): Iterable<DeltaDetachedNodeId> {\n\tfor (const nodeChange of change.values()) {\n\t\tyield* relevantRemovedRootsFromChild(nodeChange);\n\t}\n}\n"]}
@@ -15,5 +15,5 @@ export type { GenericChangeset } from "./genericFieldKindTypes.js";
15
15
  export { ModularChangeFamily, ModularEditBuilder, type EditDescription, type GlobalEditDescription, type FieldEditDescription, rebaseRevisionMetadataFromInfo, intoDelta, relevantRemovedRoots, updateRefreshers, } from "./modularChangeFamily.js";
16
16
  export { makeModularChangeCodecFamily } from "./modularChangeCodecs.js";
17
17
  export type { FieldKindConfiguration, FieldKindConfigurationEntry, } from "./fieldKindConfiguration.js";
18
- export { getAllowedContentIncompatibilities, isRepoSuperset } from "./discrepancies.js";
18
+ export { getAllowedContentDiscrepancies, isRepoSuperset, } from "./discrepancies.js";
19
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/modular-schema/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,kBAAkB,EAClB,kCAAkC,EAClC,mBAAmB,EACnB,kBAAkB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EACN,kBAAkB,EAClB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,gBAAgB,EAChB,kBAAkB,GAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACN,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,+BAA+B,EAC/B,KAAK,sBAAsB,EAC3B,KAAK,6BAA6B,EAClC,KAAK,OAAO,EACZ,eAAe,EACf,KAAK,0BAA0B,GAC/B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACX,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,MAAM,GACN,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACN,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,GAChB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EACN,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,8BAA8B,EAC9B,SAAS,EACT,oBAAoB,EACpB,gBAAgB,GAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,YAAY,EACX,sBAAsB,EACtB,2BAA2B,GAC3B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,kCAAkC,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/modular-schema/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,kBAAkB,EAClB,kCAAkC,EAClC,mBAAmB,EACnB,kBAAkB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EACN,kBAAkB,EAClB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,gBAAgB,EAChB,kBAAkB,GAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACN,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,+BAA+B,EAC/B,KAAK,sBAAsB,EAC3B,KAAK,6BAA6B,EAClC,KAAK,OAAO,EACZ,eAAe,EACf,KAAK,0BAA0B,GAC/B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACX,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,MAAM,GACN,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACN,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,GAChB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EACN,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,8BAA8B,EAC9B,SAAS,EACT,oBAAoB,EACpB,gBAAgB,GAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,YAAY,EACX,sBAAsB,EACtB,2BAA2B,GAC3B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACN,8BAA8B,EAC9B,cAAc,GACd,MAAM,oBAAoB,CAAC"}
@@ -4,7 +4,7 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.isRepoSuperset = exports.getAllowedContentIncompatibilities = exports.makeModularChangeCodecFamily = exports.updateRefreshers = exports.relevantRemovedRoots = exports.intoDelta = exports.rebaseRevisionMetadataFromInfo = exports.ModularEditBuilder = exports.ModularChangeFamily = exports.genericFieldKind = exports.genericChangeHandler = exports.convertGenericChange = exports.NodeAttachState = exports.referenceFreeFieldChangeRebaser = exports.FieldKindWithEditor = exports.FlexFieldKind = exports.EncodedNodeChangeset = exports.EncodedModularChangeset = exports.EncodedRevisionInfo = exports.EncodedChangeAtomId = exports.ChangesetLocalIdSchema = exports.setInCrossFieldMap = exports.CrossFieldTarget = exports.addCrossFieldQuery = exports.isNeverTree = exports.isNeverField = exports.allowsTreeSuperset = exports.allowsFieldSuperset = exports.allowsTreeSchemaIdentifierSuperset = exports.allowsRepoSuperset = void 0;
7
+ exports.isRepoSuperset = exports.getAllowedContentDiscrepancies = exports.makeModularChangeCodecFamily = exports.updateRefreshers = exports.relevantRemovedRoots = exports.intoDelta = exports.rebaseRevisionMetadataFromInfo = exports.ModularEditBuilder = exports.ModularChangeFamily = exports.genericFieldKind = exports.genericChangeHandler = exports.convertGenericChange = exports.NodeAttachState = exports.referenceFreeFieldChangeRebaser = exports.FieldKindWithEditor = exports.FlexFieldKind = exports.EncodedNodeChangeset = exports.EncodedModularChangeset = exports.EncodedRevisionInfo = exports.EncodedChangeAtomId = exports.ChangesetLocalIdSchema = exports.setInCrossFieldMap = exports.CrossFieldTarget = exports.addCrossFieldQuery = exports.isNeverTree = exports.isNeverField = exports.allowsTreeSuperset = exports.allowsFieldSuperset = exports.allowsTreeSchemaIdentifierSuperset = exports.allowsRepoSuperset = void 0;
8
8
  var comparison_js_1 = require("./comparison.js");
9
9
  Object.defineProperty(exports, "allowsRepoSuperset", { enumerable: true, get: function () { return comparison_js_1.allowsRepoSuperset; } });
10
10
  Object.defineProperty(exports, "allowsTreeSchemaIdentifierSuperset", { enumerable: true, get: function () { return comparison_js_1.allowsTreeSchemaIdentifierSuperset; } });
@@ -44,6 +44,6 @@ Object.defineProperty(exports, "updateRefreshers", { enumerable: true, get: func
44
44
  var modularChangeCodecs_js_1 = require("./modularChangeCodecs.js");
45
45
  Object.defineProperty(exports, "makeModularChangeCodecFamily", { enumerable: true, get: function () { return modularChangeCodecs_js_1.makeModularChangeCodecFamily; } });
46
46
  var discrepancies_js_1 = require("./discrepancies.js");
47
- Object.defineProperty(exports, "getAllowedContentIncompatibilities", { enumerable: true, get: function () { return discrepancies_js_1.getAllowedContentIncompatibilities; } });
47
+ Object.defineProperty(exports, "getAllowedContentDiscrepancies", { enumerable: true, get: function () { return discrepancies_js_1.getAllowedContentDiscrepancies; } });
48
48
  Object.defineProperty(exports, "isRepoSuperset", { enumerable: true, get: function () { return discrepancies_js_1.isRepoSuperset; } });
49
49
  //# sourceMappingURL=index.js.map