@itwin/core-backend 5.13.0-dev.9 → 5.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/CHANGELOG.md +53 -1
  2. package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
  3. package/lib/cjs/BriefcaseManager.js +11 -5
  4. package/lib/cjs/BriefcaseManager.js.map +1 -1
  5. package/lib/cjs/Category.d.ts +4 -4
  6. package/lib/cjs/Category.js.map +1 -1
  7. package/lib/cjs/ChangesetECAdaptor.d.ts +5 -0
  8. package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
  9. package/lib/cjs/ChangesetECAdaptor.js +13 -3
  10. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  11. package/lib/cjs/CloudSqlite.d.ts.map +1 -1
  12. package/lib/cjs/CloudSqlite.js +9 -2
  13. package/lib/cjs/CloudSqlite.js.map +1 -1
  14. package/lib/cjs/CodeSpecs.d.ts +3 -3
  15. package/lib/cjs/CodeSpecs.js.map +1 -1
  16. package/lib/cjs/DisplayStyle.d.ts +2 -2
  17. package/lib/cjs/DisplayStyle.js.map +1 -1
  18. package/lib/cjs/ECDb.d.ts.map +1 -1
  19. package/lib/cjs/ECDb.js +1 -0
  20. package/lib/cjs/ECDb.js.map +1 -1
  21. package/lib/cjs/EditTxn.d.ts.map +1 -1
  22. package/lib/cjs/EditTxn.js +1 -0
  23. package/lib/cjs/EditTxn.js.map +1 -1
  24. package/lib/cjs/Element.d.ts +48 -12
  25. package/lib/cjs/Element.d.ts.map +1 -1
  26. package/lib/cjs/Element.js +120 -24
  27. package/lib/cjs/Element.js.map +1 -1
  28. package/lib/cjs/IModelDb.d.ts +72 -22
  29. package/lib/cjs/IModelDb.d.ts.map +1 -1
  30. package/lib/cjs/IModelDb.js +226 -89
  31. package/lib/cjs/IModelDb.js.map +1 -1
  32. package/lib/cjs/Model.d.ts +5 -5
  33. package/lib/cjs/Model.d.ts.map +1 -1
  34. package/lib/cjs/Model.js.map +1 -1
  35. package/lib/cjs/PropertyStore.js +1 -1
  36. package/lib/cjs/PropertyStore.js.map +1 -1
  37. package/lib/cjs/SchemaSync.d.ts +158 -22
  38. package/lib/cjs/SchemaSync.d.ts.map +1 -1
  39. package/lib/cjs/SchemaSync.js +417 -76
  40. package/lib/cjs/SchemaSync.js.map +1 -1
  41. package/lib/cjs/SynchronousChannel.d.ts +72 -0
  42. package/lib/cjs/SynchronousChannel.d.ts.map +1 -0
  43. package/lib/cjs/SynchronousChannel.js +11 -0
  44. package/lib/cjs/SynchronousChannel.js.map +1 -0
  45. package/lib/cjs/Texture.d.ts +1 -1
  46. package/lib/cjs/Texture.js.map +1 -1
  47. package/lib/cjs/TxnManager.d.ts +44 -4
  48. package/lib/cjs/TxnManager.d.ts.map +1 -1
  49. package/lib/cjs/TxnManager.js +80 -19
  50. package/lib/cjs/TxnManager.js.map +1 -1
  51. package/lib/cjs/ViewDefinition.d.ts +6 -6
  52. package/lib/cjs/ViewDefinition.d.ts.map +1 -1
  53. package/lib/cjs/ViewDefinition.js.map +1 -1
  54. package/lib/cjs/annotations/LeaderGeometry.d.ts +22 -7
  55. package/lib/cjs/annotations/LeaderGeometry.d.ts.map +1 -1
  56. package/lib/cjs/annotations/LeaderGeometry.js +104 -36
  57. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  58. package/lib/cjs/annotations/TextAnnotationElement.d.ts +1 -1
  59. package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
  60. package/lib/cjs/annotations/TextAnnotationElement.js +25 -10
  61. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  62. package/lib/cjs/core-backend.d.ts +1 -0
  63. package/lib/cjs/core-backend.d.ts.map +1 -1
  64. package/lib/cjs/core-backend.js +1 -0
  65. package/lib/cjs/core-backend.js.map +1 -1
  66. package/lib/cjs/internal/IntegrityCheck.d.ts +22 -0
  67. package/lib/cjs/internal/IntegrityCheck.d.ts.map +1 -1
  68. package/lib/cjs/internal/IntegrityCheck.js +13 -0
  69. package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
  70. package/lib/cjs/internal/NoReservations.d.ts +6 -0
  71. package/lib/cjs/internal/NoReservations.d.ts.map +1 -0
  72. package/lib/cjs/internal/NoReservations.js +21 -0
  73. package/lib/cjs/internal/NoReservations.js.map +1 -0
  74. package/lib/cjs/internal/SchemaSyncReservations.d.ts +4 -0
  75. package/lib/cjs/internal/SchemaSyncReservations.d.ts.map +1 -0
  76. package/lib/cjs/internal/SchemaSyncReservations.js +128 -0
  77. package/lib/cjs/internal/SchemaSyncReservations.js.map +1 -0
  78. package/lib/cjs/internal/Symbols.d.ts +1 -0
  79. package/lib/cjs/internal/Symbols.d.ts.map +1 -1
  80. package/lib/cjs/internal/Symbols.js +2 -1
  81. package/lib/cjs/internal/Symbols.js.map +1 -1
  82. package/lib/esm/BriefcaseManager.d.ts.map +1 -1
  83. package/lib/esm/BriefcaseManager.js +11 -5
  84. package/lib/esm/BriefcaseManager.js.map +1 -1
  85. package/lib/esm/Category.d.ts +4 -4
  86. package/lib/esm/Category.js.map +1 -1
  87. package/lib/esm/ChangesetECAdaptor.d.ts +5 -0
  88. package/lib/esm/ChangesetECAdaptor.d.ts.map +1 -1
  89. package/lib/esm/ChangesetECAdaptor.js +13 -3
  90. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  91. package/lib/esm/CloudSqlite.d.ts.map +1 -1
  92. package/lib/esm/CloudSqlite.js +10 -3
  93. package/lib/esm/CloudSqlite.js.map +1 -1
  94. package/lib/esm/CodeSpecs.d.ts +3 -3
  95. package/lib/esm/CodeSpecs.js.map +1 -1
  96. package/lib/esm/DisplayStyle.d.ts +2 -2
  97. package/lib/esm/DisplayStyle.js.map +1 -1
  98. package/lib/esm/ECDb.d.ts.map +1 -1
  99. package/lib/esm/ECDb.js +1 -0
  100. package/lib/esm/ECDb.js.map +1 -1
  101. package/lib/esm/EditTxn.d.ts.map +1 -1
  102. package/lib/esm/EditTxn.js +1 -0
  103. package/lib/esm/EditTxn.js.map +1 -1
  104. package/lib/esm/Element.d.ts +48 -12
  105. package/lib/esm/Element.d.ts.map +1 -1
  106. package/lib/esm/Element.js +121 -25
  107. package/lib/esm/Element.js.map +1 -1
  108. package/lib/esm/IModelDb.d.ts +72 -22
  109. package/lib/esm/IModelDb.d.ts.map +1 -1
  110. package/lib/esm/IModelDb.js +227 -90
  111. package/lib/esm/IModelDb.js.map +1 -1
  112. package/lib/esm/Model.d.ts +5 -5
  113. package/lib/esm/Model.d.ts.map +1 -1
  114. package/lib/esm/Model.js.map +1 -1
  115. package/lib/esm/PropertyStore.js +1 -1
  116. package/lib/esm/PropertyStore.js.map +1 -1
  117. package/lib/esm/SchemaSync.d.ts +158 -22
  118. package/lib/esm/SchemaSync.d.ts.map +1 -1
  119. package/lib/esm/SchemaSync.js +419 -78
  120. package/lib/esm/SchemaSync.js.map +1 -1
  121. package/lib/esm/SynchronousChannel.d.ts +72 -0
  122. package/lib/esm/SynchronousChannel.d.ts.map +1 -0
  123. package/lib/esm/SynchronousChannel.js +9 -0
  124. package/lib/esm/SynchronousChannel.js.map +1 -0
  125. package/lib/esm/Texture.d.ts +1 -1
  126. package/lib/esm/Texture.js.map +1 -1
  127. package/lib/esm/TxnManager.d.ts +44 -4
  128. package/lib/esm/TxnManager.d.ts.map +1 -1
  129. package/lib/esm/TxnManager.js +81 -20
  130. package/lib/esm/TxnManager.js.map +1 -1
  131. package/lib/esm/ViewDefinition.d.ts +6 -6
  132. package/lib/esm/ViewDefinition.d.ts.map +1 -1
  133. package/lib/esm/ViewDefinition.js.map +1 -1
  134. package/lib/esm/annotations/LeaderGeometry.d.ts +22 -7
  135. package/lib/esm/annotations/LeaderGeometry.d.ts.map +1 -1
  136. package/lib/esm/annotations/LeaderGeometry.js +104 -36
  137. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  138. package/lib/esm/annotations/TextAnnotationElement.d.ts +1 -1
  139. package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
  140. package/lib/esm/annotations/TextAnnotationElement.js +25 -10
  141. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  142. package/lib/esm/core-backend.d.ts +1 -0
  143. package/lib/esm/core-backend.d.ts.map +1 -1
  144. package/lib/esm/core-backend.js +1 -0
  145. package/lib/esm/core-backend.js.map +1 -1
  146. package/lib/esm/internal/IntegrityCheck.d.ts +22 -0
  147. package/lib/esm/internal/IntegrityCheck.d.ts.map +1 -1
  148. package/lib/esm/internal/IntegrityCheck.js +13 -0
  149. package/lib/esm/internal/IntegrityCheck.js.map +1 -1
  150. package/lib/esm/internal/NoReservations.d.ts +6 -0
  151. package/lib/esm/internal/NoReservations.d.ts.map +1 -0
  152. package/lib/esm/internal/NoReservations.js +18 -0
  153. package/lib/esm/internal/NoReservations.js.map +1 -0
  154. package/lib/esm/internal/SchemaSyncReservations.d.ts +4 -0
  155. package/lib/esm/internal/SchemaSyncReservations.d.ts.map +1 -0
  156. package/lib/esm/internal/SchemaSyncReservations.js +125 -0
  157. package/lib/esm/internal/SchemaSyncReservations.js.map +1 -0
  158. package/lib/esm/internal/Symbols.d.ts +1 -0
  159. package/lib/esm/internal/Symbols.d.ts.map +1 -1
  160. package/lib/esm/internal/Symbols.js +1 -0
  161. package/lib/esm/internal/Symbols.js.map +1 -1
  162. package/lib/esm/test/IModelTestUtils.d.ts +1 -1
  163. package/lib/esm/test/IModelTestUtils.d.ts.map +1 -1
  164. package/lib/esm/test/IModelTestUtils.js +8 -3
  165. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  166. package/lib/esm/test/annotations/LeaderGeometry.test.js +178 -2
  167. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  168. package/lib/esm/test/annotations/TextAnnotation.test.js +48 -18
  169. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  170. package/lib/esm/test/ecdb/ECSqlStatement.test.js +177 -0
  171. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  172. package/lib/esm/test/ecdb/QueryReaders.test.js +2 -16
  173. package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
  174. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +2 -2
  175. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  176. package/lib/esm/test/element/ElementRoundTrip.test.js +80 -2
  177. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  178. package/lib/esm/test/hubaccess/Rebase.test.js +3 -1
  179. package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
  180. package/lib/esm/test/hubaccess/SemanticRebase.test.js +29 -28
  181. package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
  182. package/lib/esm/test/hubaccess/SemanticRebaseTestUtils.d.ts +3 -0
  183. package/lib/esm/test/hubaccess/SemanticRebaseTestUtils.d.ts.map +1 -0
  184. package/lib/esm/test/hubaccess/SemanticRebaseTestUtils.js +15 -0
  185. package/lib/esm/test/hubaccess/SemanticRebaseTestUtils.js.map +1 -0
  186. package/lib/esm/test/imodel/IModelECSql.test.d.ts +2 -0
  187. package/lib/esm/test/imodel/IModelECSql.test.d.ts.map +1 -0
  188. package/lib/esm/test/imodel/IModelECSql.test.js +367 -0
  189. package/lib/esm/test/imodel/IModelECSql.test.js.map +1 -0
  190. package/lib/esm/test/imodel/IModelElements.test.d.ts +2 -0
  191. package/lib/esm/test/imodel/IModelElements.test.d.ts.map +1 -0
  192. package/lib/esm/test/imodel/IModelElements.test.js +969 -0
  193. package/lib/esm/test/imodel/IModelElements.test.js.map +1 -0
  194. package/lib/esm/test/imodel/IModelGeolocation.test.d.ts +2 -0
  195. package/lib/esm/test/imodel/IModelGeolocation.test.d.ts.map +1 -0
  196. package/lib/esm/test/imodel/IModelGeolocation.test.js +539 -0
  197. package/lib/esm/test/imodel/IModelGeolocation.test.js.map +1 -0
  198. package/lib/esm/test/imodel/IModelLifecycle.test.d.ts +2 -0
  199. package/lib/esm/test/imodel/IModelLifecycle.test.d.ts.map +1 -0
  200. package/lib/esm/test/imodel/IModelLifecycle.test.js +499 -0
  201. package/lib/esm/test/imodel/IModelLifecycle.test.js.map +1 -0
  202. package/lib/esm/test/imodel/IModelMetadata.test.d.ts +2 -0
  203. package/lib/esm/test/imodel/IModelMetadata.test.d.ts.map +1 -0
  204. package/lib/esm/test/imodel/IModelMetadata.test.js +274 -0
  205. package/lib/esm/test/imodel/IModelMetadata.test.js.map +1 -0
  206. package/lib/esm/test/imodel/IModelModels.test.d.ts +2 -0
  207. package/lib/esm/test/imodel/IModelModels.test.d.ts.map +1 -0
  208. package/lib/esm/test/imodel/IModelModels.test.js +357 -0
  209. package/lib/esm/test/imodel/IModelModels.test.js.map +1 -0
  210. package/lib/esm/test/imodel/IModelRelationships.test.d.ts +2 -0
  211. package/lib/esm/test/imodel/IModelRelationships.test.d.ts.map +1 -0
  212. package/lib/esm/test/imodel/IModelRelationships.test.js +407 -0
  213. package/lib/esm/test/imodel/IModelRelationships.test.js.map +1 -0
  214. package/lib/esm/test/imodel/IModelTestFixtures.d.ts +53 -0
  215. package/lib/esm/test/imodel/IModelTestFixtures.d.ts.map +1 -0
  216. package/lib/esm/test/imodel/IModelTestFixtures.js +107 -0
  217. package/lib/esm/test/imodel/IModelTestFixtures.js.map +1 -0
  218. package/lib/esm/test/imodel/IModelViews.test.d.ts +2 -0
  219. package/lib/esm/test/imodel/IModelViews.test.d.ts.map +1 -0
  220. package/lib/esm/test/imodel/IModelViews.test.js +199 -0
  221. package/lib/esm/test/imodel/IModelViews.test.js.map +1 -0
  222. package/lib/esm/test/index.d.ts +0 -1
  223. package/lib/esm/test/index.d.ts.map +1 -1
  224. package/lib/esm/test/index.js +0 -1
  225. package/lib/esm/test/index.js.map +1 -1
  226. package/lib/esm/test/standalone/ChangesetReader.test.js +8 -26
  227. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  228. package/lib/esm/test/standalone/DgnDomainMergeConflict.test.d.ts +2 -0
  229. package/lib/esm/test/standalone/DgnDomainMergeConflict.test.d.ts.map +1 -0
  230. package/lib/esm/test/standalone/DgnDomainMergeConflict.test.js +263 -0
  231. package/lib/esm/test/standalone/DgnDomainMergeConflict.test.js.map +1 -0
  232. package/lib/esm/test/standalone/GeometryStream.test.js +1 -3
  233. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  234. package/lib/esm/test/standalone/IModelWrite.test.d.ts.map +1 -1
  235. package/lib/esm/test/standalone/IModelWrite.test.js +78 -1
  236. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  237. package/lib/esm/test/standalone/IntegrityCheck.test.js +29 -10
  238. package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
  239. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js +23 -0
  240. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js.map +1 -1
  241. package/lib/esm/test/standalone/SchemaSyncDb.test.d.ts +2 -0
  242. package/lib/esm/test/standalone/SchemaSyncDb.test.d.ts.map +1 -0
  243. package/lib/esm/test/standalone/SchemaSyncDb.test.js +201 -0
  244. package/lib/esm/test/standalone/SchemaSyncDb.test.js.map +1 -0
  245. package/lib/esm/test/standalone/SchemaSyncElementReservation.test.d.ts +2 -0
  246. package/lib/esm/test/standalone/SchemaSyncElementReservation.test.d.ts.map +1 -0
  247. package/lib/esm/test/standalone/SchemaSyncElementReservation.test.js +460 -0
  248. package/lib/esm/test/standalone/SchemaSyncElementReservation.test.js.map +1 -0
  249. package/lib/esm/test/standalone/SnapshotDb.test.js +1 -0
  250. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  251. package/lib/esm/test/standalone/TxnManager.test.js +108 -8
  252. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  253. package/package.json +13 -16
  254. package/lib/esm/test/RevisionUtility.d.ts +0 -33
  255. package/lib/esm/test/RevisionUtility.d.ts.map +0 -1
  256. package/lib/esm/test/RevisionUtility.js +0 -52
  257. package/lib/esm/test/RevisionUtility.js.map +0 -1
  258. package/lib/esm/test/imodel/IModel.test.d.ts +0 -2
  259. package/lib/esm/test/imodel/IModel.test.d.ts.map +0 -1
  260. package/lib/esm/test/imodel/IModel.test.js +0 -3277
  261. package/lib/esm/test/imodel/IModel.test.js.map +0 -1
@@ -12,7 +12,7 @@ import { Entity } from "./Entity";
12
12
  import { EditTxn } from "./EditTxn";
13
13
  import { DefinitionModel, DrawingModel, PhysicalModel, SectionDrawingModel } from "./Model";
14
14
  import { SubjectOwnsProjectInformationRecord, SubjectOwnsSubjects } from "./NavigationRelationship";
15
- import { _cache, _elementWasCreated, _implicitTxn, _nativeDb, _verifyChannel } from "./internal/Symbols";
15
+ import { _cache, _elementWasCreated, _implicitTxn, _nativeDb, _onReservedElementInsert, _verifyChannel } from "./internal/Symbols";
16
16
  import { ECVersion, EntityClass } from "@itwin/ecschema-metadata";
17
17
  /** The smallest individually identifiable building block for modeling the real world in an iModel.
18
18
  * Each element represents an [[Entity]] in the real world. Sets of Elements (contained in [[Model]]s) are used to model
@@ -122,6 +122,10 @@ export class Element extends Entity {
122
122
  if (props.parent) // inserting requires shared lock on parent, if present
123
123
  iModel.locks.checkSharedLock(props.parent.id, "parent", operation);
124
124
  iModel.codeService?.verifyCode(arg);
125
+ // Any element inserted with an explicitly-set federationGuid must first be reserved (when SchemaSync is enabled),
126
+ // unless the caller explicitly opts out. See [[SynchronousChannel.Reservations]].
127
+ if (props.federationGuid !== undefined && !arg.options?.skipReservationCheck)
128
+ iModel.reservations[_onReservedElementInsert](arg);
125
129
  }
126
130
  /** Called after a new Element was inserted.
127
131
  * @note If you override this method, you must call super.
@@ -337,7 +341,7 @@ export class Element extends Entity {
337
341
  * * none of the element's outputs have been processed.
338
342
  * @see [[ElementDrivesElement]] for more on element dependency graphs.
339
343
  * @beta
340
- * @deprecated in 5.9.0 - will not be removed until after 2026-08-04. Use onBeforeOutputsHandledArg instead.
344
+ * @deprecated in 5.9.0 - might be removed in next major version. Use onBeforeOutputsHandledArg instead.
341
345
  */
342
346
  static onBeforeOutputsHandled(_id, _iModel) { }
343
347
  /** Called on an element in a graph after all of its inputs have been processed and before its outputs are processed.
@@ -363,7 +367,7 @@ export class Element extends Entity {
363
367
  * This method is not called if none of the element's inputs were changed.
364
368
  * @see [[ElementDrivesElement]] for more on element dependency graphs.
365
369
  * @beta
366
- * @deprecated in 5.9.0 - will not be removed until after 2026-08-04. Use onAllInputsHandledArg instead.
370
+ * @deprecated in 5.9.0 - might be removed in next major version. Use onAllInputsHandledArg instead.
367
371
  */
368
372
  static onAllInputsHandled(_id, _iModel) { }
369
373
  toJSON() {
@@ -545,17 +549,40 @@ export class GeometricElement extends Element {
545
549
  */
546
550
  export class GeometricElement3d extends GeometricElement {
547
551
  static get className() { return "GeometricElement3d"; }
548
- placement;
552
+ _placement;
553
+ // Snapshot the default placement so nested mutations remain serializable without serializing an untouched absent placement.
554
+ _initialPlacement;
555
+ _hasPlacement;
549
556
  typeDefinition;
550
557
  constructor(props, iModel) {
551
558
  super(props, iModel);
552
- this.placement = Placement3d.fromJSON(props.placement);
559
+ this._placement = Placement3d.fromJSON(props.placement);
560
+ this._initialPlacement = Placement3d.fromJSON(props.placement);
561
+ this._hasPlacement = props.placement !== undefined;
553
562
  if (props.typeDefinition)
554
563
  this.typeDefinition = TypeDefinition.fromJSON(props.typeDefinition);
555
564
  }
565
+ get placement() { return this._placement; }
566
+ set placement(value) {
567
+ this._placement = value;
568
+ this._hasPlacement = true;
569
+ }
556
570
  toJSON() {
557
571
  const val = super.toJSON();
558
- val.placement = this.placement;
572
+ const placementChanged = this._placement.origin.x !== this._initialPlacement.origin.x
573
+ || this._placement.origin.y !== this._initialPlacement.origin.y
574
+ || this._placement.origin.z !== this._initialPlacement.origin.z
575
+ || this._placement.angles.yaw.radians !== this._initialPlacement.angles.yaw.radians
576
+ || this._placement.angles.pitch.radians !== this._initialPlacement.angles.pitch.radians
577
+ || this._placement.angles.roll.radians !== this._initialPlacement.angles.roll.radians
578
+ || this._placement.bbox.low.x !== this._initialPlacement.bbox.low.x
579
+ || this._placement.bbox.low.y !== this._initialPlacement.bbox.low.y
580
+ || this._placement.bbox.low.z !== this._initialPlacement.bbox.low.z
581
+ || this._placement.bbox.high.x !== this._initialPlacement.bbox.high.x
582
+ || this._placement.bbox.high.y !== this._initialPlacement.bbox.high.y
583
+ || this._placement.bbox.high.z !== this._initialPlacement.bbox.high.z;
584
+ if (this._hasPlacement || placementChanged)
585
+ val.placement = this._placement;
559
586
  if (undefined !== this.typeDefinition)
560
587
  val.typeDefinition = this.typeDefinition;
561
588
  return val;
@@ -592,26 +619,31 @@ export class GeometricElement3d extends GeometricElement {
592
619
  const elProps = super.deserialize(props);
593
620
  const instance = props.row;
594
621
  elProps.category = instance.category.id;
595
- const origin = instance.origin ? [instance.origin.x, instance.origin.y, instance.origin.z] : [0, 0, 0];
596
622
  let bbox;
597
- if ("bBoxHigh" in instance && instance.bBoxHigh !== undefined && "bBoxLow" in instance && instance.bBoxLow !== undefined) {
623
+ if ("bBoxHigh" in instance && instance.bBoxHigh !== undefined && instance.bBoxHigh !== null && "bBoxLow" in instance && instance.bBoxLow !== undefined && instance.bBoxLow !== null) {
598
624
  bbox = {
599
625
  low: [instance.bBoxLow.x, instance.bBoxLow.y, instance.bBoxLow.z],
600
626
  high: [instance.bBoxHigh.x, instance.bBoxHigh.y, instance.bBoxHigh.z],
601
627
  };
602
628
  }
603
- elProps.placement = {
604
- origin,
605
- angles: YawPitchRollAngles.createDegrees(instance.yaw ?? 0, instance.pitch ?? 0, instance.roll ?? 0).toJSON(),
606
- bbox
607
- };
629
+ if (instance.origin !== undefined && instance.origin !== null) {
630
+ elProps.placement = {
631
+ origin: [instance.origin.x, instance.origin.y, instance.origin.z],
632
+ angles: YawPitchRollAngles.createDegrees(instance.yaw ?? 0, instance.pitch ?? 0, instance.roll ?? 0).toJSON(),
633
+ bbox
634
+ };
635
+ }
608
636
  if (instance.geometryStream) {
609
- elProps.geom = props.iModel[_nativeDb].convertOrUpdateGeometrySource({
637
+ const source = props.iModel[_nativeDb].convertOrUpdateGeometrySource({
610
638
  is2d: false,
611
639
  geom: instance.geometryStream,
612
640
  placement: elProps.placement,
613
641
  categoryId: elProps.category
614
- }, "GeometryStreamProps", props.options?.element ?? {}).geom;
642
+ }, "GeometryStreamProps", props.options?.element ?? {});
643
+ elProps.geom = source.geom;
644
+ if (source.placement) {
645
+ elProps.placement = source.placement;
646
+ }
615
647
  }
616
648
  if (instance.typeDefinition) {
617
649
  elProps.typeDefinition = instance.typeDefinition;
@@ -695,17 +727,35 @@ export class GraphicalElement3d extends GeometricElement3d {
695
727
  */
696
728
  export class GeometricElement2d extends GeometricElement {
697
729
  static get className() { return "GeometricElement2d"; }
698
- placement;
730
+ _placement;
731
+ // Snapshot the default placement so nested mutations remain serializable without serializing an untouched absent placement.
732
+ _initialPlacement;
733
+ _hasPlacement;
699
734
  typeDefinition;
700
735
  constructor(props, iModel) {
701
736
  super(props, iModel);
702
- this.placement = Placement2d.fromJSON(props.placement);
737
+ this._placement = Placement2d.fromJSON(props.placement);
738
+ this._initialPlacement = Placement2d.fromJSON(props.placement);
739
+ this._hasPlacement = props.placement !== undefined;
703
740
  if (props.typeDefinition)
704
741
  this.typeDefinition = TypeDefinition.fromJSON(props.typeDefinition);
705
742
  }
743
+ get placement() { return this._placement; }
744
+ set placement(value) {
745
+ this._placement = value;
746
+ this._hasPlacement = true;
747
+ }
706
748
  toJSON() {
707
749
  const val = super.toJSON();
708
- val.placement = this.placement;
750
+ const placementChanged = this._placement.origin.x !== this._initialPlacement.origin.x
751
+ || this._placement.origin.y !== this._initialPlacement.origin.y
752
+ || this._placement.angle.radians !== this._initialPlacement.angle.radians
753
+ || this._placement.bbox.low.x !== this._initialPlacement.bbox.low.x
754
+ || this._placement.bbox.low.y !== this._initialPlacement.bbox.low.y
755
+ || this._placement.bbox.high.x !== this._initialPlacement.bbox.high.x
756
+ || this._placement.bbox.high.y !== this._initialPlacement.bbox.high.y;
757
+ if (this._hasPlacement || placementChanged)
758
+ val.placement = this._placement;
709
759
  if (undefined !== this.typeDefinition)
710
760
  val.typeDefinition = this.typeDefinition;
711
761
  return val;
@@ -735,19 +785,20 @@ export class GeometricElement2d extends GeometricElement {
735
785
  const elProps = super.deserialize(props);
736
786
  const instance = props.row;
737
787
  elProps.category = instance.category.id;
738
- const origin = instance.origin ? [instance.origin.x, instance.origin.y] : [0, 0];
739
788
  let bbox;
740
- if ("bBoxHigh" in instance && instance.bBoxHigh !== undefined && "bBoxLow" in instance && instance.bBoxLow !== undefined) {
789
+ if ("bBoxHigh" in instance && instance.bBoxHigh !== undefined && instance.bBoxHigh !== null && "bBoxLow" in instance && instance.bBoxLow !== undefined && instance.bBoxLow !== null) {
741
790
  bbox = {
742
791
  low: [instance.bBoxLow.x, instance.bBoxLow.y],
743
792
  high: [instance.bBoxHigh.x, instance.bBoxHigh.y],
744
793
  };
745
794
  }
746
- elProps.placement = {
747
- origin,
748
- angle: instance.rotation,
749
- bbox,
750
- };
795
+ if (instance.origin !== undefined && instance.origin !== null) {
796
+ elProps.placement = {
797
+ origin: [instance.origin.x, instance.origin.y],
798
+ angle: instance.rotation,
799
+ bbox,
800
+ };
801
+ }
751
802
  if (instance.geometryStream) {
752
803
  const source = props.iModel[_nativeDb].convertOrUpdateGeometrySource({
753
804
  is2d: true,
@@ -1240,6 +1291,51 @@ export class DefinitionElement extends InformationContentElement {
1240
1291
  */
1241
1292
  export class DefinitionSet extends DefinitionElement {
1242
1293
  static get className() { return "DefinitionSet"; }
1294
+ /** The Rank of a DefinitionSet indicates how it was created, who is aware of it and where it can be used.
1295
+ * @beta
1296
+ */
1297
+ rank;
1298
+ constructor(props, iModel) {
1299
+ super(props, iModel);
1300
+ this.rank = props.rank;
1301
+ }
1302
+ /**
1303
+ * DefinitionSet custom HandledProps include 'rank'.
1304
+ * @inheritdoc
1305
+ * @beta
1306
+ */
1307
+ static _customHandledProps = [
1308
+ { propertyName: "rank", source: "Class" },
1309
+ ];
1310
+ /**
1311
+ * DefinitionSet deserializes 'rank'.
1312
+ * @inheritdoc
1313
+ * @beta
1314
+ */
1315
+ static deserialize(props) {
1316
+ const elProps = super.deserialize(props);
1317
+ if (props.row.rank !== undefined)
1318
+ elProps.rank = JsonUtils.asInt(props.row.rank);
1319
+ return elProps;
1320
+ }
1321
+ /**
1322
+ * DefinitionSet serializes 'rank'.
1323
+ * @inheritdoc
1324
+ * @beta
1325
+ */
1326
+ static serialize(props, iModel) {
1327
+ const inst = super.serialize(props, iModel);
1328
+ if (undefined !== props.rank) {
1329
+ inst.rank = props.rank;
1330
+ }
1331
+ return inst;
1332
+ }
1333
+ toJSON() {
1334
+ const val = super.toJSON();
1335
+ if (undefined !== this.rank)
1336
+ val.rank = this.rank;
1337
+ return val;
1338
+ }
1243
1339
  }
1244
1340
  /** A DefinitionContainer exclusively owns a set of DefinitionElements contained within its sub-model (of type DefinitionModel).
1245
1341
  * @note The associated ECClass was added to the BisCore schema in version 1.0.10