@ifc-lite/ids-authoring 0.0.0-stage → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (447) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +469 -2
  3. package/dist/bsdd/cache.d.ts +37 -0
  4. package/dist/bsdd/cache.d.ts.map +1 -0
  5. package/dist/bsdd/cache.js +116 -0
  6. package/dist/bsdd/cache.js.map +1 -0
  7. package/dist/bsdd/contract.d.ts +31 -0
  8. package/dist/bsdd/contract.d.ts.map +1 -0
  9. package/dist/bsdd/contract.js +185 -0
  10. package/dist/bsdd/contract.js.map +1 -0
  11. package/dist/bsdd/dictionary.d.ts +42 -0
  12. package/dist/bsdd/dictionary.d.ts.map +1 -0
  13. package/dist/bsdd/dictionary.js +115 -0
  14. package/dist/bsdd/dictionary.js.map +1 -0
  15. package/dist/bsdd/generator.d.ts +82 -0
  16. package/dist/bsdd/generator.d.ts.map +1 -0
  17. package/dist/bsdd/generator.js +155 -0
  18. package/dist/bsdd/generator.js.map +1 -0
  19. package/dist/bsdd/http-source.d.ts +15 -0
  20. package/dist/bsdd/http-source.d.ts.map +1 -0
  21. package/dist/bsdd/http-source.js +196 -0
  22. package/dist/bsdd/http-source.js.map +1 -0
  23. package/dist/bsdd/idb-store.d.ts +16 -0
  24. package/dist/bsdd/idb-store.d.ts.map +1 -0
  25. package/dist/bsdd/idb-store.js +58 -0
  26. package/dist/bsdd/idb-store.js.map +1 -0
  27. package/dist/bsdd/insert.d.ts +55 -0
  28. package/dist/bsdd/insert.d.ts.map +1 -0
  29. package/dist/bsdd/insert.js +105 -0
  30. package/dist/bsdd/insert.js.map +1 -0
  31. package/dist/bsdd/mapping.d.ts +62 -0
  32. package/dist/bsdd/mapping.d.ts.map +1 -0
  33. package/dist/bsdd/mapping.js +163 -0
  34. package/dist/bsdd/mapping.js.map +1 -0
  35. package/dist/bsdd/picker.d.ts +91 -0
  36. package/dist/bsdd/picker.d.ts.map +1 -0
  37. package/dist/bsdd/picker.js +151 -0
  38. package/dist/bsdd/picker.js.map +1 -0
  39. package/dist/bsdd/types.d.ts +162 -0
  40. package/dist/bsdd/types.d.ts.map +1 -0
  41. package/dist/bsdd/types.js +26 -0
  42. package/dist/bsdd/types.js.map +1 -0
  43. package/dist/bsdd/uri-health.d.ts +65 -0
  44. package/dist/bsdd/uri-health.d.ts.map +1 -0
  45. package/dist/bsdd/uri-health.js +110 -0
  46. package/dist/bsdd/uri-health.js.map +1 -0
  47. package/dist/canonical-json.d.ts +7 -0
  48. package/dist/canonical-json.d.ts.map +1 -0
  49. package/dist/canonical-json.js +20 -0
  50. package/dist/canonical-json.js.map +1 -0
  51. package/dist/comments/view.d.ts +37 -0
  52. package/dist/comments/view.d.ts.map +1 -0
  53. package/dist/comments/view.js +61 -0
  54. package/dist/comments/view.js.map +1 -0
  55. package/dist/compound/expand.d.ts +5 -0
  56. package/dist/compound/expand.d.ts.map +1 -0
  57. package/dist/compound/expand.js +135 -0
  58. package/dist/compound/expand.js.map +1 -0
  59. package/dist/compound/from-bsdd.d.ts +9 -0
  60. package/dist/compound/from-bsdd.d.ts.map +1 -0
  61. package/dist/compound/from-bsdd.js +166 -0
  62. package/dist/compound/from-bsdd.js.map +1 -0
  63. package/dist/diff/align.d.ts +42 -0
  64. package/dist/diff/align.d.ts.map +1 -0
  65. package/dist/diff/align.js +78 -0
  66. package/dist/diff/align.js.map +1 -0
  67. package/dist/diff/changelog-text.d.ts +39 -0
  68. package/dist/diff/changelog-text.d.ts.map +1 -0
  69. package/dist/diff/changelog-text.js +120 -0
  70. package/dist/diff/changelog-text.js.map +1 -0
  71. package/dist/diff/changelog.d.ts +28 -0
  72. package/dist/diff/changelog.d.ts.map +1 -0
  73. package/dist/diff/changelog.js +173 -0
  74. package/dist/diff/changelog.js.map +1 -0
  75. package/dist/diff/compare.d.ts +25 -0
  76. package/dist/diff/compare.d.ts.map +1 -0
  77. package/dist/diff/compare.js +150 -0
  78. package/dist/diff/compare.js.map +1 -0
  79. package/dist/diff/diff.d.ts +13 -0
  80. package/dist/diff/diff.d.ts.map +1 -0
  81. package/dist/diff/diff.js +140 -0
  82. package/dist/diff/diff.js.map +1 -0
  83. package/dist/diff/index.d.ts +5 -0
  84. package/dist/diff/index.d.ts.map +1 -0
  85. package/dist/diff/index.js +7 -0
  86. package/dist/diff/index.js.map +1 -0
  87. package/dist/diff/patch.d.ts +10 -0
  88. package/dist/diff/patch.d.ts.map +1 -0
  89. package/dist/diff/patch.js +177 -0
  90. package/dist/diff/patch.js.map +1 -0
  91. package/dist/diff/types.d.ts +201 -0
  92. package/dist/diff/types.d.ts.map +1 -0
  93. package/dist/diff/types.js +5 -0
  94. package/dist/diff/types.js.map +1 -0
  95. package/dist/document/fields.d.ts +33 -0
  96. package/dist/document/fields.d.ts.map +1 -0
  97. package/dist/document/fields.js +117 -0
  98. package/dist/document/fields.js.map +1 -0
  99. package/dist/document/from-ids.d.ts +32 -0
  100. package/dist/document/from-ids.d.ts.map +1 -0
  101. package/dist/document/from-ids.js +47 -0
  102. package/dist/document/from-ids.js.map +1 -0
  103. package/dist/document/node-index.d.ts +32 -0
  104. package/dist/document/node-index.d.ts.map +1 -0
  105. package/dist/document/node-index.js +127 -0
  106. package/dist/document/node-index.js.map +1 -0
  107. package/dist/document/types.d.ts +170 -0
  108. package/dist/document/types.d.ts.map +1 -0
  109. package/dist/document/types.js +19 -0
  110. package/dist/document/types.js.map +1 -0
  111. package/dist/gate/bsdd.d.ts +12 -0
  112. package/dist/gate/bsdd.d.ts.map +1 -0
  113. package/dist/gate/bsdd.js +17 -0
  114. package/dist/gate/bsdd.js.map +1 -0
  115. package/dist/gate/check.d.ts +6 -0
  116. package/dist/gate/check.d.ts.map +1 -0
  117. package/dist/gate/check.js +125 -0
  118. package/dist/gate/check.js.map +1 -0
  119. package/dist/gate/context.d.ts +51 -0
  120. package/dist/gate/context.d.ts.map +1 -0
  121. package/dist/gate/context.js +74 -0
  122. package/dist/gate/context.js.map +1 -0
  123. package/dist/gate/grounding-pset.d.ts +5 -0
  124. package/dist/gate/grounding-pset.d.ts.map +1 -0
  125. package/dist/gate/grounding-pset.js +179 -0
  126. package/dist/gate/grounding-pset.js.map +1 -0
  127. package/dist/gate/grounding.d.ts +48 -0
  128. package/dist/gate/grounding.d.ts.map +1 -0
  129. package/dist/gate/grounding.js +146 -0
  130. package/dist/gate/grounding.js.map +1 -0
  131. package/dist/gate/rank.d.ts +28 -0
  132. package/dist/gate/rank.d.ts.map +1 -0
  133. package/dist/gate/rank.js +68 -0
  134. package/dist/gate/rank.js.map +1 -0
  135. package/dist/gate/structural.d.ts +43 -0
  136. package/dist/gate/structural.d.ts.map +1 -0
  137. package/dist/gate/structural.js +175 -0
  138. package/dist/gate/structural.js.map +1 -0
  139. package/dist/gate/types.d.ts +45 -0
  140. package/dist/gate/types.d.ts.map +1 -0
  141. package/dist/gate/types.js +5 -0
  142. package/dist/gate/types.js.map +1 -0
  143. package/dist/gate/values.d.ts +19 -0
  144. package/dist/gate/values.d.ts.map +1 -0
  145. package/dist/gate/values.js +124 -0
  146. package/dist/gate/values.js.map +1 -0
  147. package/dist/headless/apply-gated.d.ts +32 -0
  148. package/dist/headless/apply-gated.d.ts.map +1 -0
  149. package/dist/headless/apply-gated.js +26 -0
  150. package/dist/headless/apply-gated.js.map +1 -0
  151. package/dist/headless/diff.d.ts +41 -0
  152. package/dist/headless/diff.d.ts.map +1 -0
  153. package/dist/headless/diff.js +116 -0
  154. package/dist/headless/diff.js.map +1 -0
  155. package/dist/headless/node-path.d.ts +10 -0
  156. package/dist/headless/node-path.d.ts.map +1 -0
  157. package/dist/headless/node-path.js +24 -0
  158. package/dist/headless/node-path.js.map +1 -0
  159. package/dist/headless/read.d.ts +26 -0
  160. package/dist/headless/read.d.ts.map +1 -0
  161. package/dist/headless/read.js +78 -0
  162. package/dist/headless/read.js.map +1 -0
  163. package/dist/headless/schema-lookup.d.ts +52 -0
  164. package/dist/headless/schema-lookup.d.ts.map +1 -0
  165. package/dist/headless/schema-lookup.js +77 -0
  166. package/dist/headless/schema-lookup.js.map +1 -0
  167. package/dist/headless/write.d.ts +46 -0
  168. package/dist/headless/write.d.ts.map +1 -0
  169. package/dist/headless/write.js +103 -0
  170. package/dist/headless/write.js.map +1 -0
  171. package/dist/history/history.d.ts +90 -0
  172. package/dist/history/history.d.ts.map +1 -0
  173. package/dist/history/history.js +86 -0
  174. package/dist/history/history.js.map +1 -0
  175. package/dist/history/persistence.d.ts +33 -0
  176. package/dist/history/persistence.d.ts.map +1 -0
  177. package/dist/history/persistence.js +71 -0
  178. package/dist/history/persistence.js.map +1 -0
  179. package/dist/index.d.ts +55 -0
  180. package/dist/index.d.ts.map +1 -0
  181. package/dist/index.js +75 -0
  182. package/dist/index.js.map +1 -0
  183. package/dist/lint/context.d.ts +15 -0
  184. package/dist/lint/context.d.ts.map +1 -0
  185. package/dist/lint/context.js +24 -0
  186. package/dist/lint/context.js.map +1 -0
  187. package/dist/lint/docs.d.ts +18 -0
  188. package/dist/lint/docs.d.ts.map +1 -0
  189. package/dist/lint/docs.js +117 -0
  190. package/dist/lint/docs.js.map +1 -0
  191. package/dist/lint/engine.d.ts +21 -0
  192. package/dist/lint/engine.d.ts.map +1 -0
  193. package/dist/lint/engine.js +123 -0
  194. package/dist/lint/engine.js.map +1 -0
  195. package/dist/lint/fix.d.ts +27 -0
  196. package/dist/lint/fix.d.ts.map +1 -0
  197. package/dist/lint/fix.js +22 -0
  198. package/dist/lint/fix.js.map +1 -0
  199. package/dist/lint/precision.d.ts +51 -0
  200. package/dist/lint/precision.d.ts.map +1 -0
  201. package/dist/lint/precision.js +64 -0
  202. package/dist/lint/precision.js.map +1 -0
  203. package/dist/lint/rules/bsdd.d.ts +5 -0
  204. package/dist/lint/rules/bsdd.d.ts.map +1 -0
  205. package/dist/lint/rules/bsdd.js +123 -0
  206. package/dist/lint/rules/bsdd.js.map +1 -0
  207. package/dist/lint/rules/card.d.ts +10 -0
  208. package/dist/lint/rules/card.d.ts.map +1 -0
  209. package/dist/lint/rules/card.js +140 -0
  210. package/dist/lint/rules/card.js.map +1 -0
  211. package/dist/lint/rules/doc-ver-part.d.ts +7 -0
  212. package/dist/lint/rules/doc-ver-part.d.ts.map +1 -0
  213. package/dist/lint/rules/doc-ver-part.js +155 -0
  214. package/dist/lint/rules/doc-ver-part.js.map +1 -0
  215. package/dist/lint/rules/entity.d.ts +12 -0
  216. package/dist/lint/rules/entity.d.ts.map +1 -0
  217. package/dist/lint/rules/entity.js +215 -0
  218. package/dist/lint/rules/entity.js.map +1 -0
  219. package/dist/lint/rules/index.d.ts +4 -0
  220. package/dist/lint/rules/index.d.ts.map +1 -0
  221. package/dist/lint/rules/index.js +63 -0
  222. package/dist/lint/rules/index.js.map +1 -0
  223. package/dist/lint/rules/pdt-att.d.ts +7 -0
  224. package/dist/lint/rules/pdt-att.d.ts.map +1 -0
  225. package/dist/lint/rules/pdt-att.js +209 -0
  226. package/dist/lint/rules/pdt-att.js.map +1 -0
  227. package/dist/lint/rules/pset.d.ts +12 -0
  228. package/dist/lint/rules/pset.d.ts.map +1 -0
  229. package/dist/lint/rules/pset.js +263 -0
  230. package/dist/lint/rules/pset.js.map +1 -0
  231. package/dist/lint/rules/regex.d.ts +6 -0
  232. package/dist/lint/rules/regex.d.ts.map +1 -0
  233. package/dist/lint/rules/regex.js +184 -0
  234. package/dist/lint/rules/regex.js.map +1 -0
  235. package/dist/lint/rules/spec-doc.d.ts +5 -0
  236. package/dist/lint/rules/spec-doc.d.ts.map +1 -0
  237. package/dist/lint/rules/spec-doc.js +132 -0
  238. package/dist/lint/rules/spec-doc.js.map +1 -0
  239. package/dist/lint/rules/spec.d.ts +24 -0
  240. package/dist/lint/rules/spec.d.ts.map +1 -0
  241. package/dist/lint/rules/spec.js +162 -0
  242. package/dist/lint/rules/spec.js.map +1 -0
  243. package/dist/lint/rules/units.d.ts +4 -0
  244. package/dist/lint/rules/units.d.ts.map +1 -0
  245. package/dist/lint/rules/units.js +101 -0
  246. package/dist/lint/rules/units.js.map +1 -0
  247. package/dist/lint/rules/util.d.ts +37 -0
  248. package/dist/lint/rules/util.d.ts.map +1 -0
  249. package/dist/lint/rules/util.js +117 -0
  250. package/dist/lint/rules/util.js.map +1 -0
  251. package/dist/lint/rules/value-sites.d.ts +28 -0
  252. package/dist/lint/rules/value-sites.d.ts.map +1 -0
  253. package/dist/lint/rules/value-sites.js +81 -0
  254. package/dist/lint/rules/value-sites.js.map +1 -0
  255. package/dist/lint/rules/values.d.ts +22 -0
  256. package/dist/lint/rules/values.d.ts.map +1 -0
  257. package/dist/lint/rules/values.js +237 -0
  258. package/dist/lint/rules/values.js.map +1 -0
  259. package/dist/lint/rules/xsd-regex.d.ts +34 -0
  260. package/dist/lint/rules/xsd-regex.d.ts.map +1 -0
  261. package/dist/lint/rules/xsd-regex.js +149 -0
  262. package/dist/lint/rules/xsd-regex.js.map +1 -0
  263. package/dist/lint/solver/sample.d.ts +3 -0
  264. package/dist/lint/solver/sample.d.ts.map +1 -0
  265. package/dist/lint/solver/sample.js +134 -0
  266. package/dist/lint/solver/sample.js.map +1 -0
  267. package/dist/lint/solver/solver.d.ts +39 -0
  268. package/dist/lint/solver/solver.d.ts.map +1 -0
  269. package/dist/lint/solver/solver.js +126 -0
  270. package/dist/lint/solver/solver.js.map +1 -0
  271. package/dist/lint/suppress.d.ts +12 -0
  272. package/dist/lint/suppress.d.ts.map +1 -0
  273. package/dist/lint/suppress.js +56 -0
  274. package/dist/lint/suppress.js.map +1 -0
  275. package/dist/lint/types.d.ts +162 -0
  276. package/dist/lint/types.d.ts.map +1 -0
  277. package/dist/lint/types.js +5 -0
  278. package/dist/lint/types.js.map +1 -0
  279. package/dist/lint/walk.d.ts +20 -0
  280. package/dist/lint/walk.d.ts.map +1 -0
  281. package/dist/lint/walk.js +47 -0
  282. package/dist/lint/walk.js.map +1 -0
  283. package/dist/match/cascade.d.ts +53 -0
  284. package/dist/match/cascade.d.ts.map +1 -0
  285. package/dist/match/cascade.js +135 -0
  286. package/dist/match/cascade.js.map +1 -0
  287. package/dist/match/reidentify.d.ts +46 -0
  288. package/dist/match/reidentify.d.ts.map +1 -0
  289. package/dist/match/reidentify.js +67 -0
  290. package/dist/match/reidentify.js.map +1 -0
  291. package/dist/merge/comments.d.ts +13 -0
  292. package/dist/merge/comments.d.ts.map +1 -0
  293. package/dist/merge/comments.js +61 -0
  294. package/dist/merge/comments.js.map +1 -0
  295. package/dist/merge/index.d.ts +4 -0
  296. package/dist/merge/index.d.ts.map +1 -0
  297. package/dist/merge/index.js +6 -0
  298. package/dist/merge/index.js.map +1 -0
  299. package/dist/merge/keys.d.ts +22 -0
  300. package/dist/merge/keys.d.ts.map +1 -0
  301. package/dist/merge/keys.js +54 -0
  302. package/dist/merge/keys.js.map +1 -0
  303. package/dist/merge/merge.d.ts +8 -0
  304. package/dist/merge/merge.d.ts.map +1 -0
  305. package/dist/merge/merge.js +206 -0
  306. package/dist/merge/merge.js.map +1 -0
  307. package/dist/merge/order.d.ts +11 -0
  308. package/dist/merge/order.d.ts.map +1 -0
  309. package/dist/merge/order.js +117 -0
  310. package/dist/merge/order.js.map +1 -0
  311. package/dist/merge/sidecar.d.ts +12 -0
  312. package/dist/merge/sidecar.d.ts.map +1 -0
  313. package/dist/merge/sidecar.js +64 -0
  314. package/dist/merge/sidecar.js.map +1 -0
  315. package/dist/merge/types.d.ts +50 -0
  316. package/dist/merge/types.d.ts.map +1 -0
  317. package/dist/merge/types.js +5 -0
  318. package/dist/merge/types.js.map +1 -0
  319. package/dist/merge/view.d.ts +28 -0
  320. package/dist/merge/view.d.ts.map +1 -0
  321. package/dist/merge/view.js +35 -0
  322. package/dist/merge/view.js.map +1 -0
  323. package/dist/ops/draft.d.ts +33 -0
  324. package/dist/ops/draft.d.ts.map +1 -0
  325. package/dist/ops/draft.js +253 -0
  326. package/dist/ops/draft.js.map +1 -0
  327. package/dist/ops/json-schema-lite.d.ts +41 -0
  328. package/dist/ops/json-schema-lite.d.ts.map +1 -0
  329. package/dist/ops/json-schema-lite.js +119 -0
  330. package/dist/ops/json-schema-lite.js.map +1 -0
  331. package/dist/ops/schema-values.d.ts +5 -0
  332. package/dist/ops/schema-values.d.ts.map +1 -0
  333. package/dist/ops/schema-values.js +233 -0
  334. package/dist/ops/schema-values.js.map +1 -0
  335. package/dist/ops/schema.d.ts +27 -0
  336. package/dist/ops/schema.d.ts.map +1 -0
  337. package/dist/ops/schema.js +258 -0
  338. package/dist/ops/schema.js.map +1 -0
  339. package/dist/ops/sidecar-ops.d.ts +85 -0
  340. package/dist/ops/sidecar-ops.d.ts.map +1 -0
  341. package/dist/ops/sidecar-ops.js +5 -0
  342. package/dist/ops/sidecar-ops.js.map +1 -0
  343. package/dist/ops/types.d.ts +400 -0
  344. package/dist/ops/types.d.ts.map +1 -0
  345. package/dist/ops/types.js +5 -0
  346. package/dist/ops/types.js.map +1 -0
  347. package/dist/ops/units.d.ts +4 -0
  348. package/dist/ops/units.d.ts.map +1 -0
  349. package/dist/ops/units.js +75 -0
  350. package/dist/ops/units.js.map +1 -0
  351. package/dist/reducer/apply.d.ts +33 -0
  352. package/dist/reducer/apply.d.ts.map +1 -0
  353. package/dist/reducer/apply.js +123 -0
  354. package/dist/reducer/apply.js.map +1 -0
  355. package/dist/reducer/comment-ops.d.ts +18 -0
  356. package/dist/reducer/comment-ops.d.ts.map +1 -0
  357. package/dist/reducer/comment-ops.js +104 -0
  358. package/dist/reducer/comment-ops.js.map +1 -0
  359. package/dist/reducer/edit.d.ts +38 -0
  360. package/dist/reducer/edit.d.ts.map +1 -0
  361. package/dist/reducer/edit.js +126 -0
  362. package/dist/reducer/edit.js.map +1 -0
  363. package/dist/reducer/facet-ops.d.ts +20 -0
  364. package/dist/reducer/facet-ops.d.ts.map +1 -0
  365. package/dist/reducer/facet-ops.js +184 -0
  366. package/dist/reducer/facet-ops.js.map +1 -0
  367. package/dist/reducer/meta-ops.d.ts +20 -0
  368. package/dist/reducer/meta-ops.d.ts.map +1 -0
  369. package/dist/reducer/meta-ops.js +52 -0
  370. package/dist/reducer/meta-ops.js.map +1 -0
  371. package/dist/reducer/spec-ops.d.ts +29 -0
  372. package/dist/reducer/spec-ops.d.ts.map +1 -0
  373. package/dist/reducer/spec-ops.js +181 -0
  374. package/dist/reducer/spec-ops.js.map +1 -0
  375. package/dist/reducer/test-ops.d.ts +15 -0
  376. package/dist/reducer/test-ops.d.ts.map +1 -0
  377. package/dist/reducer/test-ops.js +90 -0
  378. package/dist/reducer/test-ops.js.map +1 -0
  379. package/dist/reducer/value-ops.d.ts +26 -0
  380. package/dist/reducer/value-ops.d.ts.map +1 -0
  381. package/dist/reducer/value-ops.js +173 -0
  382. package/dist/reducer/value-ops.js.map +1 -0
  383. package/dist/render/describe.d.ts +20 -0
  384. package/dist/render/describe.d.ts.map +1 -0
  385. package/dist/render/describe.js +47 -0
  386. package/dist/render/describe.js.map +1 -0
  387. package/dist/revision/index.d.ts +4 -0
  388. package/dist/revision/index.d.ts.map +1 -0
  389. package/dist/revision/index.js +7 -0
  390. package/dist/revision/index.js.map +1 -0
  391. package/dist/revision/revision.d.ts +79 -0
  392. package/dist/revision/revision.d.ts.map +1 -0
  393. package/dist/revision/revision.js +120 -0
  394. package/dist/revision/revision.js.map +1 -0
  395. package/dist/revision/sha256.d.ts +3 -0
  396. package/dist/revision/sha256.d.ts.map +1 -0
  397. package/dist/revision/sha256.js +69 -0
  398. package/dist/revision/sha256.js.map +1 -0
  399. package/dist/revision/verify.d.ts +21 -0
  400. package/dist/revision/verify.d.ts.map +1 -0
  401. package/dist/revision/verify.js +51 -0
  402. package/dist/revision/verify.js.map +1 -0
  403. package/dist/revision/view.d.ts +36 -0
  404. package/dist/revision/view.d.ts.map +1 -0
  405. package/dist/revision/view.js +32 -0
  406. package/dist/revision/view.js.map +1 -0
  407. package/dist/sidecar/idsz.d.ts +14 -0
  408. package/dist/sidecar/idsz.d.ts.map +1 -0
  409. package/dist/sidecar/idsz.js +58 -0
  410. package/dist/sidecar/idsz.js.map +1 -0
  411. package/dist/sidecar/sidecar-schema.d.ts +4 -0
  412. package/dist/sidecar/sidecar-schema.d.ts.map +1 -0
  413. package/dist/sidecar/sidecar-schema.js +69 -0
  414. package/dist/sidecar/sidecar-schema.js.map +1 -0
  415. package/dist/sidecar/sidecar.d.ts +102 -0
  416. package/dist/sidecar/sidecar.d.ts.map +1 -0
  417. package/dist/sidecar/sidecar.js +160 -0
  418. package/dist/sidecar/sidecar.js.map +1 -0
  419. package/dist/testing/index.d.ts +6 -0
  420. package/dist/testing/index.d.ts.map +1 -0
  421. package/dist/testing/index.js +8 -0
  422. package/dist/testing/index.js.map +1 -0
  423. package/dist/testing/junit.d.ts +10 -0
  424. package/dist/testing/junit.d.ts.map +1 -0
  425. package/dist/testing/junit.js +51 -0
  426. package/dist/testing/junit.js.map +1 -0
  427. package/dist/testing/outcome.d.ts +10 -0
  428. package/dist/testing/outcome.d.ts.map +1 -0
  429. package/dist/testing/outcome.js +22 -0
  430. package/dist/testing/outcome.js.map +1 -0
  431. package/dist/testing/runner.d.ts +72 -0
  432. package/dist/testing/runner.d.ts.map +1 -0
  433. package/dist/testing/runner.js +60 -0
  434. package/dist/testing/runner.js.map +1 -0
  435. package/dist/testing/types.d.ts +60 -0
  436. package/dist/testing/types.d.ts.map +1 -0
  437. package/dist/testing/types.js +5 -0
  438. package/dist/testing/types.js.map +1 -0
  439. package/dist/testing/view.d.ts +31 -0
  440. package/dist/testing/view.d.ts.map +1 -0
  441. package/dist/testing/view.js +30 -0
  442. package/dist/testing/view.js.map +1 -0
  443. package/dist/uuid.d.ts +39 -0
  444. package/dist/uuid.d.ts.map +1 -0
  445. package/dist/uuid.js +84 -0
  446. package/dist/uuid.js.map +1 -0
  447. package/package.json +56 -3
@@ -0,0 +1,206 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * Three-way merge at the op level (02-document-model-and-ops.md §6).
6
+ *
7
+ * `base`, `ours` and `theirs` are revisions of one Studio document. Each
8
+ * side's change set is its semantic diff from `base`; every diff entry is
9
+ * one change unit with a key (`scopeOf`). Changes on keys only one side
10
+ * touched merge automatically, identical changes merge once, and the rest
11
+ * become conflicts:
12
+ *
13
+ * - `field`: both sides changed one key differently;
14
+ * - `deleteEdit`: one side removed a node (or replaced a facet) that the
15
+ * other side changed.
16
+ *
17
+ * A conflict is resolved by choosing a side (`options.resolutions`); an
18
+ * unresolved one keeps the base. Order is settled per list (`order.ts`).
19
+ * The merged change set is turned into primitive ops with `diffToOps`, so
20
+ * the result is reachable through ops, and those ops can be re-checked by
21
+ * the grounding gate (`options.gate`). Comment threads merge additively
22
+ * (`comments.ts`); lint suppressions and test suites merge per record,
23
+ * the side that changed a record winning (`sidecar.ts`).
24
+ */
25
+ import { diffDocuments } from '../diff/diff.js';
26
+ import { diffToOps } from '../diff/patch.js';
27
+ import { checkOps } from '../gate/check.js';
28
+ import { canonical } from '../match/cascade.js';
29
+ import { apply } from '../reducer/apply.js';
30
+ import { commentMergeOps } from './comments.js';
31
+ import { sidecarMergeOps } from './sidecar.js';
32
+ import { contentKeyOf, isOrderKey, scopeOf } from './keys.js';
33
+ import { mergeOrder } from './order.js';
34
+ function group(entries) {
35
+ const out = new Map();
36
+ for (const e of entries) {
37
+ const { key } = scopeOf(e);
38
+ const list = out.get(key) ?? [];
39
+ list.push(e);
40
+ out.set(key, list);
41
+ }
42
+ return out;
43
+ }
44
+ /** What a change sets, without rendering context (names, indices, sibling fields). */
45
+ function payload(e) {
46
+ switch (e.kind) {
47
+ case 'info.changed':
48
+ case 'spec.changed':
49
+ case 'requirement.changed':
50
+ return [e.kind, e.field, e.new];
51
+ case 'facet.valueChanged':
52
+ return [e.kind, e.field, e.new];
53
+ case 'facet.relationChanged':
54
+ case 'facet.uriChanged':
55
+ return [e.kind, e.new];
56
+ case 'facet.moved':
57
+ return [e.kind, e.to.specId, e.to.section];
58
+ case 'spec.moved':
59
+ return [e.kind];
60
+ case 'facet.added':
61
+ return [e.kind, e.facet, e.requirement, e.specId, e.section];
62
+ case 'facet.replaced':
63
+ return [e.kind, e.facet, e.requirement];
64
+ case 'spec.added':
65
+ return [e.kind, e.spec];
66
+ default:
67
+ return [e.kind, 'decl' in e ? e.decl : e.specId];
68
+ }
69
+ }
70
+ function sameChange(a, b) {
71
+ return canonical((a ?? []).map(payload)) === canonical((b ?? []).map(payload));
72
+ }
73
+ /** Union-find over conflict keys, so overlapping conflicts become one. */
74
+ class Groups {
75
+ parent = new Map();
76
+ find(k) {
77
+ let r = k;
78
+ while (this.parent.has(r) && this.parent.get(r) !== r)
79
+ r = this.parent.get(r);
80
+ return r;
81
+ }
82
+ union(a, b) {
83
+ if (!this.parent.has(a))
84
+ this.parent.set(a, a);
85
+ if (!this.parent.has(b))
86
+ this.parent.set(b, b);
87
+ const ra = this.find(a);
88
+ const rb = this.find(b);
89
+ if (ra !== rb)
90
+ this.parent.set(rb, ra);
91
+ }
92
+ has(k) {
93
+ return this.parent.has(k);
94
+ }
95
+ }
96
+ function conflicting(ours, theirs) {
97
+ const groups = new Groups();
98
+ for (const [key, list] of ours) {
99
+ if (isOrderKey(key) || !theirs.has(key))
100
+ continue;
101
+ if (!sameChange(list, theirs.get(key)))
102
+ groups.union(key, key);
103
+ }
104
+ // Node-wide changes (removal, facet replacement) against any other change of that node.
105
+ const nodeWide = (side, other) => {
106
+ for (const [key, list] of side) {
107
+ for (const e of list) {
108
+ const scope = scopeOf(e);
109
+ const node = scope.deletes ?? (e.kind === 'facet.replaced' ? e.facetId : undefined);
110
+ if (!node)
111
+ continue;
112
+ for (const [otherKey, otherList] of other) {
113
+ if (isOrderKey(otherKey) || (otherKey === key && sameChange(list, otherList)))
114
+ continue;
115
+ const touches = otherList.some((x) => scopeOf(x).nodes.includes(node));
116
+ const sameFacet = e.kind === 'facet.replaced' && contentKeyOf(otherKey) === key;
117
+ if (touches || sameFacet)
118
+ groups.union(key, otherKey);
119
+ }
120
+ }
121
+ }
122
+ };
123
+ nodeWide(ours, theirs);
124
+ nodeWide(theirs, ours);
125
+ return groups;
126
+ }
127
+ function conflictOf(id, keys, ours, theirs, resolution) {
128
+ const o = keys.flatMap((k) => ours.get(k) ?? []);
129
+ const t = keys.flatMap((k) => theirs.get(k) ?? []);
130
+ const all = [...o, ...t];
131
+ const deleting = all.find((e) => scopeOf(e).deletes || e.kind === 'facet.replaced');
132
+ const facet = all.find((e) => 'facetId' in e);
133
+ const spec = all.find((e) => 'specId' in e);
134
+ return {
135
+ id,
136
+ kind: deleting ? 'deleteEdit' : 'field',
137
+ ...(spec ? { specId: spec.specId } : {}),
138
+ ...(facet ? { facetId: facet.facetId } : {}),
139
+ ours: o,
140
+ theirs: t,
141
+ ...(resolution ? { resolution } : {}),
142
+ };
143
+ }
144
+ /** Merge `ours` and `theirs`, two revisions derived from `base`. */
145
+ export function mergeDocuments(base, ours, theirs, options = {}) {
146
+ const dOurs = diffDocuments(base, ours, { byNodeId: true });
147
+ const dTheirs = diffDocuments(base, theirs, { byNodeId: true });
148
+ const gOurs = group(dOurs.entries);
149
+ const gTheirs = group(dTheirs.entries);
150
+ const groups = conflicting(gOurs, gTheirs);
151
+ const members = new Map();
152
+ for (const key of new Set([...gOurs.keys(), ...gTheirs.keys()])) {
153
+ if (!groups.has(key))
154
+ continue;
155
+ const root = groups.find(key);
156
+ members.set(root, [...(members.get(root) ?? []), key]);
157
+ }
158
+ const conflicts = [];
159
+ const decided = new Map();
160
+ for (const keys of members.values()) {
161
+ keys.sort();
162
+ const id = keys.length === 1 ? keys[0] : `node:${keys[0]}`;
163
+ const resolution = options.resolutions?.[id];
164
+ conflicts.push(conflictOf(id, keys, gOurs, gTheirs, resolution));
165
+ for (const k of keys)
166
+ decided.set(k, resolution);
167
+ }
168
+ const chosen = [];
169
+ for (const key of new Set([...gOurs.keys(), ...gTheirs.keys()])) {
170
+ if (decided.has(key)) {
171
+ const side = decided.get(key);
172
+ if (side)
173
+ chosen.push(...((side === 'ours' ? gOurs : gTheirs).get(key) ?? []));
174
+ continue;
175
+ }
176
+ chosen.push(...(gOurs.get(key) ?? gTheirs.get(key) ?? []));
177
+ }
178
+ const diagnostics = [];
179
+ const merged = {
180
+ identical: chosen.length === 0,
181
+ byNodeId: true,
182
+ entries: chosen,
183
+ specs: [],
184
+ order: mergeOrder(base, dOurs, dTheirs, chosen, diagnostics),
185
+ };
186
+ const seed = options.seed ?? `merge:${base.docId}`;
187
+ const contentOps = diffToOps(base, merged, { seed });
188
+ if (options.gate) {
189
+ const gate = checkOps(contentOps, base, options.gate);
190
+ for (const issue of gate.issues)
191
+ diagnostics.push({ code: 'MERGE-GATE-001', message: issue.message, issue });
192
+ }
193
+ const content = apply(base, contentOps).doc;
194
+ const commentOps = commentMergeOps(base, ours, theirs, content, seed);
195
+ const withComments = apply(content, commentOps).doc;
196
+ const sidecarOps = sidecarMergeOps(base, ours, theirs, withComments, seed);
197
+ const ops = [...contentOps, ...commentOps, ...sidecarOps];
198
+ const doc = apply(withComments, sidecarOps).doc;
199
+ const unresolved = conflicts.some((c) => !c.resolution);
200
+ return { doc, ops, conflicts, diagnostics, clean: !unresolved && !diagnostics.some((d) => d.code === 'MERGE-GATE-001') };
201
+ }
202
+ /** Merge two op sequences applied to `base` (e.g. two offline edit sessions). */
203
+ export function mergeOps(base, ours, theirs, options = {}) {
204
+ return mergeDocuments(base, apply(base, ours).doc, apply(base, theirs).doc, options);
205
+ }
206
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/merge/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { DiffEntry, DiffOrder, DocumentDiff } from '../diff/types.js';
2
+ import type { StudioDocument } from '../document/types.js';
3
+ import type { Uuid } from '../uuid.js';
4
+ import type { MergeDiagnostic } from './types.js';
5
+ /** Common elements of `side`, in `side` order, differ from `base` order. */
6
+ export declare function reordered(base: readonly Uuid[], side: readonly Uuid[]): boolean;
7
+ /** `primary` filtered to `members`, plus members only `secondary` holds, placed after their predecessor there. */
8
+ export declare function mergeList(primary: readonly Uuid[], secondary: readonly Uuid[], members: ReadonlySet<Uuid>): Uuid[];
9
+ /** The target order of the merged document, given the entries the merge applies. */
10
+ export declare function mergeOrder(base: StudioDocument, ours: DocumentDiff, theirs: DocumentDiff, chosen: readonly DiffEntry[], diagnostics: MergeDiagnostic[]): DiffOrder;
11
+ //# sourceMappingURL=order.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order.d.ts","sourceRoot":"","sources":["../../src/merge/order.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,KAAK,EAAW,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,4EAA4E;AAC5E,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,IAAI,EAAE,GAAG,OAAO,CAM/E;AAED,kHAAkH;AAClH,wBAAgB,SAAS,CAAC,OAAO,EAAE,SAAS,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAkBlH;AAwCD,oFAAoF;AACpF,wBAAgB,UAAU,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,SAAS,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,SAAS,CA6ClK"}
@@ -0,0 +1,117 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * Order and placement for the merged document. Order is not a field two
6
+ * sides can agree on piecewise, so it is settled per list: the side that
7
+ * reordered the list wins; when both reordered it differently, theirs
8
+ * wins (last writer) and the merge reports MERGE-ORDER-001. Nodes the
9
+ * winning list does not hold (added on the other side) are inserted after
10
+ * their nearest predecessor in the other side's list.
11
+ */
12
+ import { SECTIONS } from '../diff/align.js';
13
+ /** Common elements of `side`, in `side` order, differ from `base` order. */
14
+ export function reordered(base, side) {
15
+ const inSide = new Set(side);
16
+ const inBase = new Set(base);
17
+ const b = base.filter((x) => inSide.has(x));
18
+ const s = side.filter((x) => inBase.has(x));
19
+ return b.some((x, i) => s[i] !== x);
20
+ }
21
+ /** `primary` filtered to `members`, plus members only `secondary` holds, placed after their predecessor there. */
22
+ export function mergeList(primary, secondary, members) {
23
+ const out = primary.filter((x) => members.has(x));
24
+ const placed = new Set(out);
25
+ secondary.forEach((id, i) => {
26
+ if (!members.has(id) || placed.has(id))
27
+ return;
28
+ let at = 0;
29
+ for (let k = i - 1; k >= 0; k--) {
30
+ const pos = out.indexOf(secondary[k]);
31
+ if (pos >= 0) {
32
+ at = pos + 1;
33
+ break;
34
+ }
35
+ }
36
+ out.splice(at, 0, id);
37
+ placed.add(id);
38
+ });
39
+ for (const id of members)
40
+ if (!placed.has(id))
41
+ out.push(id);
42
+ return out;
43
+ }
44
+ function pickList(base, ours, theirs, members, diagnose) {
45
+ const o = reordered(base, ours);
46
+ const t = reordered(base, theirs);
47
+ if (o && t) {
48
+ const common = (l) => l.filter((x) => members.has(x) && ours.includes(x) && theirs.includes(x));
49
+ if (common(ours).join() !== common(theirs).join())
50
+ diagnose();
51
+ return mergeList(theirs, ours, members);
52
+ }
53
+ return o ? mergeList(ours, theirs, members) : mergeList(theirs, ours, members);
54
+ }
55
+ function basePlaces(doc) {
56
+ const places = new Map();
57
+ doc.nodes.specs.forEach((spec) => {
58
+ for (const section of SECTIONS) {
59
+ for (const f of section === 'applicability' ? spec.applicability : spec.requirements)
60
+ places.set(f.id, { specId: spec.id, section });
61
+ }
62
+ });
63
+ return places;
64
+ }
65
+ function baseOrder(doc) {
66
+ const order = { specs: [], sections: {} };
67
+ doc.nodes.specs.forEach((spec) => {
68
+ order.specs.push(spec.id);
69
+ order.sections[spec.id] = { applicability: spec.applicability.map((f) => f.id), requirements: spec.requirements.map((f) => f.id) };
70
+ });
71
+ return order;
72
+ }
73
+ /** The target order of the merged document, given the entries the merge applies. */
74
+ export function mergeOrder(base, ours, theirs, chosen, diagnostics) {
75
+ const specs = new Set(base.nodes.specs.map((s) => s.id));
76
+ const places = basePlaces(base);
77
+ for (const e of chosen) {
78
+ if (e.kind === 'spec.added') {
79
+ specs.add(e.specId);
80
+ e.nodes.applicability.forEach((f) => places.set(f.id, { specId: e.specId, section: 'applicability' }));
81
+ e.nodes.requirements.forEach((f) => places.set(f.id, { specId: e.specId, section: 'requirements' }));
82
+ }
83
+ }
84
+ for (const e of chosen) {
85
+ if (e.kind === 'facet.added')
86
+ places.set(e.facetId, { specId: e.specId, section: e.section });
87
+ if (e.kind === 'facet.moved')
88
+ places.set(e.facetId, { specId: e.to.specId, section: e.to.section });
89
+ if (e.kind === 'facet.removed')
90
+ places.delete(e.facetId);
91
+ }
92
+ for (const e of chosen) {
93
+ if (e.kind !== 'spec.removed')
94
+ continue;
95
+ specs.delete(e.specId);
96
+ for (const [id, p] of places)
97
+ if (p.specId === e.specId)
98
+ places.delete(id);
99
+ }
100
+ const b = baseOrder(base);
101
+ const order = { specs: [], sections: {} };
102
+ order.specs = pickList(b.specs, ours.order.specs, theirs.order.specs, specs, () => diagnostics.push({ code: 'MERGE-ORDER-001', message: 'Both sides reordered the specifications; their order was kept.' }));
103
+ for (const specId of order.specs) {
104
+ const lists = { applicability: [], requirements: [] };
105
+ for (const section of SECTIONS) {
106
+ const members = new Set([...places].filter(([, p]) => p.specId === specId && p.section === section).map(([id]) => id));
107
+ lists[section] = pickList(b.sections[specId]?.[section] ?? [], ours.order.sections[specId]?.[section] ?? [], theirs.order.sections[specId]?.[section] ?? [], members, () => diagnostics.push({
108
+ code: 'MERGE-ORDER-001',
109
+ message: `Both sides reordered the ${section} of a specification; their order was kept.`,
110
+ specId,
111
+ }));
112
+ }
113
+ order.sections[specId] = lists;
114
+ }
115
+ return order;
116
+ }
117
+ //# sourceMappingURL=order.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order.js","sourceRoot":"","sources":["../../src/merge/order.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Lint suppressions and test suites in a three-way merge. Both are sidecar
3
+ * records with a natural key: a suppression is keyed by node and rule, a
4
+ * test case by its id. Per key, the side that changed it relative to the
5
+ * base wins (theirs when both did, like a reorder); an unchanged key keeps
6
+ * the base. They never raise content conflicts.
7
+ */
8
+ import type { StudioDocument } from '../document/types.js';
9
+ import type { PrimitiveOp } from '../ops/types.js';
10
+ /** Ops that bring both sides' suppression and test-suite changes into `merged` (which carries the base records). */
11
+ export declare function sidecarMergeOps(base: StudioDocument, ours: StudioDocument, theirs: StudioDocument, merged: StudioDocument, seed: string): PrimitiveOp[];
12
+ //# sourceMappingURL=sidecar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidecar.d.ts","sourceRoot":"","sources":["../../src/merge/sidecar.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAe,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAExE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAmCnD,oHAAoH;AACpH,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAgCvJ"}
@@ -0,0 +1,64 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { canonical } from '../match/cascade.js';
5
+ import { applyPrimitive } from '../reducer/apply.js';
6
+ import { findTestCase } from '../reducer/test-ops.js';
7
+ import { deriveId } from '../uuid.js';
8
+ function suppressions(doc) {
9
+ const out = new Map();
10
+ for (const [nodeId, list] of Object.entries(doc.meta.suppressions)) {
11
+ for (const suppression of list)
12
+ out.set(`${nodeId}\u0000${suppression.rule}`, { nodeId, suppression });
13
+ }
14
+ return out;
15
+ }
16
+ function cases(doc) {
17
+ const out = new Map();
18
+ for (const [specId, suite] of Object.entries(doc.meta.tests))
19
+ for (const testCase of suite.cases)
20
+ out.set(testCase.id, { specId, testCase });
21
+ return out;
22
+ }
23
+ /** The value a key takes: theirs if theirs changed it, else ours. */
24
+ function pick(b, o, t) {
25
+ return canonical(t ?? null) !== canonical(b ?? null) ? t : o;
26
+ }
27
+ /** Ops that bring both sides' suppression and test-suite changes into `merged` (which carries the base records). */
28
+ export function sidecarMergeOps(base, ours, theirs, merged, seed) {
29
+ const ops = [];
30
+ let doc = merged;
31
+ const push = (kind, payload) => {
32
+ const op = { kind, opId: deriveId(seed, `sidecar:${ops.length}`), payload };
33
+ doc = applyPrimitive(doc, op).doc;
34
+ ops.push(op);
35
+ };
36
+ const [bs, os, ts] = [suppressions(base), suppressions(ours), suppressions(theirs)];
37
+ for (const key of new Set([...bs.keys(), ...os.keys(), ...ts.keys()])) {
38
+ const want = pick(bs.get(key), os.get(key), ts.get(key));
39
+ const have = suppressions(doc).get(key);
40
+ if (canonical(want ?? null) === canonical(have ?? null))
41
+ continue;
42
+ if (want)
43
+ push('meta.suppress', { nodeId: want.nodeId, suppression: want.suppression });
44
+ else if (have)
45
+ push('meta.unsuppress', { nodeId: have.nodeId, rule: have.suppression.rule });
46
+ }
47
+ const [bc, oc, tc] = [cases(base), cases(ours), cases(theirs)];
48
+ for (const id of new Set([...bc.keys(), ...oc.keys(), ...tc.keys()])) {
49
+ const want = pick(bc.get(id), oc.get(id), tc.get(id));
50
+ const have = findTestCase(doc, id);
51
+ if (canonical(want ?? null) === canonical(have ? { specId: have.specId, testCase: have.testCase } : null))
52
+ continue;
53
+ if (have)
54
+ push('meta.test.remove', { testId: id });
55
+ if (want) {
56
+ // Keep the case's place when it stays in its suite; otherwise append. Suites outlive their specification.
57
+ const length = doc.meta.tests[want.specId]?.cases.length ?? 0;
58
+ const index = have && have.specId === want.specId ? Math.min(have.index, length) : length;
59
+ push('meta.test.restore', { specId: want.specId, index, testCase: want.testCase });
60
+ }
61
+ }
62
+ return ops;
63
+ }
64
+ //# sourceMappingURL=sidecar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidecar.js","sourceRoot":"","sources":["../../src/merge/sidecar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /** Three-way merge data model (02-document-model-and-ops.md §6). */
2
+ import type { DiffEntry } from '../diff/types.js';
3
+ import type { StudioDocument } from '../document/types.js';
4
+ import type { GateContext } from '../gate/context.js';
5
+ import type { GateIssue } from '../gate/types.js';
6
+ import type { PrimitiveOp } from '../ops/types.js';
7
+ import type { Uuid } from '../uuid.js';
8
+ export type MergeSide = 'ours' | 'theirs';
9
+ export interface MergeConflict {
10
+ /** Stable id: the conflicting key (`facet:<id>:property.value`, …). */
11
+ id: string;
12
+ /**
13
+ * `field`: both sides set one field differently.
14
+ * `deleteEdit`: one side removed a node the other changed.
15
+ */
16
+ kind: 'field' | 'deleteEdit';
17
+ /** The node the conflict is about. */
18
+ specId?: Uuid;
19
+ facetId?: Uuid;
20
+ ours: DiffEntry[];
21
+ theirs: DiffEntry[];
22
+ /** The side applied, or `undefined` when unresolved (base kept). */
23
+ resolution?: MergeSide;
24
+ }
25
+ export interface MergeDiagnostic {
26
+ code: 'MERGE-ORDER-001' | 'MERGE-GATE-001';
27
+ message: string;
28
+ /** For MERGE-ORDER-001: the specification whose order was decided (absent = specification order). */
29
+ specId?: Uuid;
30
+ /** For MERGE-GATE-001: the gate's issue on the merged ops. */
31
+ issue?: GateIssue;
32
+ }
33
+ export interface MergeOptions {
34
+ /** Conflict id → the side to apply. Unresolved conflicts keep the base value. */
35
+ resolutions?: Readonly<Record<string, MergeSide>>;
36
+ /** Re-check the merged ops with the grounding gate. */
37
+ gate?: GateContext;
38
+ /** Seed for deterministic op ids. */
39
+ seed?: string;
40
+ }
41
+ export interface MergeResult {
42
+ doc: StudioDocument;
43
+ /** Primitive ops that turn `base` into `doc`. */
44
+ ops: PrimitiveOp[];
45
+ conflicts: MergeConflict[];
46
+ diagnostics: MergeDiagnostic[];
47
+ /** No unresolved conflict and no gate issue. */
48
+ clean: boolean;
49
+ }
50
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/merge/types.ts"],"names":[],"mappings":"AAIA,oEAAoE;AAEpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE1C,MAAM,WAAW,aAAa;IAC5B,uEAAuE;IACvE,EAAE,EAAE,MAAM,CAAC;IACX;;;OAGG;IACH,IAAI,EAAE,OAAO,GAAG,YAAY,CAAC;IAC7B,sCAAsC;IACtC,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,oEAAoE;IACpE,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,iBAAiB,GAAG,gBAAgB,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,qGAAqG;IACrG,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,8DAA8D;IAC9D,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,iFAAiF;IACjF,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IAClD,uDAAuD;IACvD,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,cAAc,CAAC;IACpB,iDAAiD;IACjD,GAAG,EAAE,WAAW,EAAE,CAAC;IACnB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,gDAAgD;IAChD,KAAK,EAAE,OAAO,CAAC;CAChB"}
@@ -0,0 +1,5 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/merge/types.ts"],"names":[],"mappings":"AAAA;;+DAE+D"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Framework-free view model for the conflict UI ("accept ours / theirs"
3
+ * per conflict). A host renders `cards`, collects choices into
4
+ * `resolutions` and calls `mergeDocuments` again with them.
5
+ */
6
+ import type { SupportedLocale } from '@ifc-lite/ids';
7
+ import type { MergeConflict, MergeResult, MergeSide } from './types.js';
8
+ export interface ConflictCard {
9
+ id: string;
10
+ kind: MergeConflict['kind'];
11
+ /** The specification the conflict is about, by name. */
12
+ title: string;
13
+ ours: string[];
14
+ theirs: string[];
15
+ resolution?: MergeSide;
16
+ }
17
+ export interface ConflictView {
18
+ cards: ConflictCard[];
19
+ unresolved: number;
20
+ /** Order and gate notices, as sentences. */
21
+ notices: string[];
22
+ /** Resolutions as chosen so far (feed back into `mergeDocuments`). */
23
+ resolutions: Record<string, MergeSide>;
24
+ }
25
+ export declare function conflictView(result: MergeResult, locale?: SupportedLocale): ConflictView;
26
+ /** Choose a side for one conflict; returns the next resolutions record. */
27
+ export declare function resolveConflict(resolutions: Readonly<Record<string, MergeSide>>, id: string, side: MergeSide): Record<string, MergeSide>;
28
+ //# sourceMappingURL=view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/merge/view.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAExE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5B,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACxC;AAOD,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,GAAE,eAAsB,GAAG,YAAY,CAiB9F;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAExI"}
@@ -0,0 +1,35 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { describeChange } from '../diff/changelog.js';
5
+ function title(c) {
6
+ for (const e of [...c.ours, ...c.theirs])
7
+ if ('specName' in e)
8
+ return e.specName;
9
+ return 'Document';
10
+ }
11
+ export function conflictView(result, locale = 'en') {
12
+ const cards = result.conflicts.map((c) => ({
13
+ id: c.id,
14
+ kind: c.kind,
15
+ title: title(c),
16
+ ours: c.ours.map((e) => describeChange(e, locale)),
17
+ theirs: c.theirs.map((e) => describeChange(e, locale)),
18
+ ...(c.resolution ? { resolution: c.resolution } : {}),
19
+ }));
20
+ const resolutions = {};
21
+ for (const c of result.conflicts)
22
+ if (c.resolution)
23
+ resolutions[c.id] = c.resolution;
24
+ return {
25
+ cards,
26
+ unresolved: cards.filter((c) => !c.resolution).length,
27
+ notices: result.diagnostics.map((d) => d.message),
28
+ resolutions,
29
+ };
30
+ }
31
+ /** Choose a side for one conflict; returns the next resolutions record. */
32
+ export function resolveConflict(resolutions, id, side) {
33
+ return { ...resolutions, [id]: side };
34
+ }
35
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/merge/view.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAS/D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAsBtD,SAAS,KAAK,CAAC,CAAgB;IAC7B,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;QAAE,IAAI,UAAU,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC,QAAQ,CAAC;IACjF,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAmB,EAAE,SAA0B,IAAI;IAC9E,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACf,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACtD,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC,CAAC,CAAC;IACJ,MAAM,WAAW,GAA8B,EAAE,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS;QAAE,IAAI,CAAC,CAAC,UAAU;YAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC;IACrF,OAAO;QACL,KAAK;QACL,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM;QACrD,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACjD,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,eAAe,CAAC,WAAgD,EAAE,EAAU,EAAE,IAAe;IAC3G,OAAO,EAAE,GAAG,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;AACxC,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * `ConstraintDraft` → `IDSConstraint` normalisation (§3.4) and
3
+ * `FacetDraft` → `IDSFacet`.
4
+ *
5
+ * Rules:
6
+ * - `any` means "no value check": the field is removed (IDS expresses "any
7
+ * value" by omitting the constraint). Required fields cannot be `any`.
8
+ * - `equals` → `simpleValue`; booleans become `true`/`false`.
9
+ * - `oneOf` → `enumeration`; an all-number list gets base `xs:double`, an
10
+ * all-boolean list `xs:boolean`, unless `base` is given.
11
+ * - `range` → `bounds` (in/exclusive per flag, inclusive by default), the
12
+ * unit converted to SI.
13
+ * - `length` / `digits` → `bounds` length / digit facets.
14
+ * - `all` → one restriction: bounds merge into one family, the first family
15
+ * is primary and the rest hang off `and` (the `@ifc-lite/ids` shape).
16
+ * - Literal entity names and dataTypes are stored UPPERCASE, as in IDS XML.
17
+ */
18
+ import type { IDSConstraint, IDSFacet } from '@ifc-lite/ids';
19
+ import type { FacetFieldName } from '../document/fields.js';
20
+ import type { FacetDraft, ValueInput } from './types.js';
21
+ /** A draft that cannot be normalised. Surfaces as gate code `GATE-VAL-001`. */
22
+ export declare class DraftError extends Error {
23
+ readonly code = "GATE-VAL-001";
24
+ constructor(message: string);
25
+ }
26
+ /**
27
+ * Normalise a value input for `field`. Returns `undefined` for `any`
28
+ * (remove the constraint). Raw constraints pass through unchanged.
29
+ */
30
+ export declare function normaliseValue(input: ValueInput, field?: FacetFieldName): IDSConstraint | undefined;
31
+ /** Build the IDS facet a draft describes. Throws `DraftError`. */
32
+ export declare function facetFromDraft(draft: FacetDraft): IDSFacet;
33
+ //# sourceMappingURL=draft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft.d.ts","sourceRoot":"","sources":["../../src/ops/draft.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAuB,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAmB,UAAU,EAAU,UAAU,EAAE,MAAM,YAAY,CAAC;AAGlF,+EAA+E;AAC/E,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,IAAI,kBAAkB;gBACnB,OAAO,EAAE,MAAM;CAI5B;AAuJD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,cAAc,GAAG,aAAa,GAAG,SAAS,CAInG;AAqBD,kEAAkE;AAClE,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,QAAQ,CA6C1D"}