@itwin/core-backend 5.3.0-dev.1 → 5.3.0-dev.12

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 (429) hide show
  1. package/CHANGELOG.md +21 -1
  2. package/lib/cjs/BackendHubAccess.js.map +1 -1
  3. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  4. package/lib/cjs/BisCoreSchema.js.map +1 -1
  5. package/lib/cjs/BlobContainerService.js.map +1 -1
  6. package/lib/cjs/BriefcaseManager.d.ts +2 -2
  7. package/lib/cjs/BriefcaseManager.js.map +1 -1
  8. package/lib/cjs/CatalogDb.js.map +1 -1
  9. package/lib/cjs/Category.js.map +1 -1
  10. package/lib/cjs/ChangeSummaryManager.js +2 -2
  11. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  12. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  13. package/lib/cjs/ChangesetECAdaptor.js +248 -248
  14. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  15. package/lib/cjs/ChannelControl.js.map +1 -1
  16. package/lib/cjs/CheckpointManager.js.map +1 -1
  17. package/lib/cjs/ClassRegistry.js +5 -5
  18. package/lib/cjs/ClassRegistry.js.map +1 -1
  19. package/lib/cjs/CloudSqlite.d.ts +10 -9
  20. package/lib/cjs/CloudSqlite.d.ts.map +1 -1
  21. package/lib/cjs/CloudSqlite.js.map +1 -1
  22. package/lib/cjs/CodeService.js.map +1 -1
  23. package/lib/cjs/CodeSpecs.js.map +1 -1
  24. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  25. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  26. package/lib/cjs/DevTools.js.map +1 -1
  27. package/lib/cjs/DisplayStyle.js.map +1 -1
  28. package/lib/cjs/ECDb.js.map +1 -1
  29. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  30. package/lib/cjs/ECSqlStatement.js.map +1 -1
  31. package/lib/cjs/Element.js.map +1 -1
  32. package/lib/cjs/ElementAspect.js.map +1 -1
  33. package/lib/cjs/ElementGraphics.js.map +1 -1
  34. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  35. package/lib/cjs/Entity.js.map +1 -1
  36. package/lib/cjs/EntityReferences.js.map +1 -1
  37. package/lib/cjs/ExportGraphics.js.map +1 -1
  38. package/lib/cjs/ExternalSource.js.map +1 -1
  39. package/lib/cjs/FontFile.js.map +1 -1
  40. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  41. package/lib/cjs/GeographicCRSServices.d.ts.map +1 -1
  42. package/lib/cjs/GeographicCRSServices.js +2 -0
  43. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  44. package/lib/cjs/GeometrySummary.js +47 -47
  45. package/lib/cjs/GeometrySummary.js.map +1 -1
  46. package/lib/cjs/IModelDb.js +9 -9
  47. package/lib/cjs/IModelDb.js.map +1 -1
  48. package/lib/cjs/IModelDbFonts.js.map +1 -1
  49. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  50. package/lib/cjs/IModelHost.d.ts +1 -2
  51. package/lib/cjs/IModelHost.d.ts.map +1 -1
  52. package/lib/cjs/IModelHost.js +9 -17
  53. package/lib/cjs/IModelHost.js.map +1 -1
  54. package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
  55. package/lib/cjs/IModelJsFs.js.map +1 -1
  56. package/lib/cjs/ImageSourceConversion.js.map +1 -1
  57. package/lib/cjs/IpcHost.js.map +1 -1
  58. package/lib/cjs/LineStyle.js.map +1 -1
  59. package/lib/cjs/LocalHub.js +1 -1
  60. package/lib/cjs/LocalHub.js.map +1 -1
  61. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  62. package/lib/cjs/LockControl.js.map +1 -1
  63. package/lib/cjs/Material.js.map +1 -1
  64. package/lib/cjs/Model.js.map +1 -1
  65. package/lib/cjs/NativeAppStorage.js.map +1 -1
  66. package/lib/cjs/NativeHost.js.map +1 -1
  67. package/lib/cjs/NavigationRelationship.js.map +1 -1
  68. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  69. package/lib/cjs/PropertyStore.js.map +1 -1
  70. package/lib/cjs/Relationship.js.map +1 -1
  71. package/lib/cjs/RpcBackend.js.map +1 -1
  72. package/lib/cjs/SQLiteDb.js.map +1 -1
  73. package/lib/cjs/Schema.js.map +1 -1
  74. package/lib/cjs/SchemaSync.js.map +1 -1
  75. package/lib/cjs/SchemaUtils.js.map +1 -1
  76. package/lib/cjs/SheetIndex.js.map +1 -1
  77. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  78. package/lib/cjs/SqliteStatement.js.map +1 -1
  79. package/lib/cjs/StashManager.js.map +1 -1
  80. package/lib/cjs/Texture.js.map +1 -1
  81. package/lib/cjs/TileStorage.d.ts +1 -1
  82. package/lib/cjs/TileStorage.d.ts.map +1 -1
  83. package/lib/cjs/TileStorage.js.map +1 -1
  84. package/lib/cjs/TxnManager.js.map +1 -1
  85. package/lib/cjs/ViewDefinition.js.map +1 -1
  86. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  87. package/lib/cjs/ViewStore.js.map +1 -1
  88. package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +7 -1
  89. package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
  90. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js +25 -0
  91. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  92. package/lib/cjs/annotations/FrameGeometry.js +6 -6
  93. package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
  94. package/lib/cjs/annotations/LeaderGeometry.js +4 -4
  95. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  96. package/lib/cjs/annotations/TextAnnotationElement.d.ts +121 -21
  97. package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
  98. package/lib/cjs/annotations/TextAnnotationElement.js +283 -63
  99. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  100. package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
  101. package/lib/cjs/annotations/TextBlockGeometry.js +3 -3
  102. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
  103. package/lib/cjs/annotations/TextBlockLayout.d.ts +2 -2
  104. package/lib/cjs/annotations/TextBlockLayout.d.ts.map +1 -1
  105. package/lib/cjs/annotations/TextBlockLayout.js +52 -25
  106. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
  107. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  108. package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
  109. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
  110. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
  111. package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
  112. package/lib/cjs/core-backend.js.map +1 -1
  113. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  114. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  115. package/lib/cjs/domains/GenericElements.js.map +1 -1
  116. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  117. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
  118. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  119. package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
  120. package/lib/cjs/internal/FontFileImpl.js.map +1 -1
  121. package/lib/cjs/internal/HubMock.js.map +1 -1
  122. package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
  123. package/lib/cjs/internal/NativePlatform.js.map +1 -1
  124. package/lib/cjs/internal/NoLocks.js.map +1 -1
  125. package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
  126. package/lib/cjs/internal/Symbols.js.map +1 -1
  127. package/lib/cjs/internal/annotations/fields.d.ts.map +1 -1
  128. package/lib/cjs/internal/annotations/fields.js +1 -0
  129. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  130. package/lib/cjs/internal/cross-package.js.map +1 -1
  131. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  132. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  133. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  134. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  135. package/lib/cjs/rpc/multipart.js.map +1 -1
  136. package/lib/cjs/rpc/tracing.js.map +1 -1
  137. package/lib/cjs/rpc/web/logging.js.map +1 -1
  138. package/lib/cjs/rpc/web/request.js.map +1 -1
  139. package/lib/cjs/rpc/web/response.js.map +1 -1
  140. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  141. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  142. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  143. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  144. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  145. package/lib/cjs/workspace/Settings.js.map +1 -1
  146. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  147. package/lib/cjs/workspace/Workspace.js.map +1 -1
  148. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  149. package/lib/esm/BackendHubAccess.js.map +1 -1
  150. package/lib/esm/BackendLoggerCategory.js.map +1 -1
  151. package/lib/esm/BisCoreSchema.js.map +1 -1
  152. package/lib/esm/BlobContainerService.js.map +1 -1
  153. package/lib/esm/BriefcaseManager.d.ts +2 -2
  154. package/lib/esm/BriefcaseManager.js.map +1 -1
  155. package/lib/esm/CatalogDb.js.map +1 -1
  156. package/lib/esm/Category.js.map +1 -1
  157. package/lib/esm/ChangeSummaryManager.js +2 -2
  158. package/lib/esm/ChangeSummaryManager.js.map +1 -1
  159. package/lib/esm/ChangedElementsDb.js.map +1 -1
  160. package/lib/esm/ChangesetECAdaptor.js +248 -248
  161. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  162. package/lib/esm/ChannelControl.js.map +1 -1
  163. package/lib/esm/CheckpointManager.js.map +1 -1
  164. package/lib/esm/ClassRegistry.js +5 -5
  165. package/lib/esm/ClassRegistry.js.map +1 -1
  166. package/lib/esm/CloudSqlite.d.ts +10 -9
  167. package/lib/esm/CloudSqlite.d.ts.map +1 -1
  168. package/lib/esm/CloudSqlite.js.map +1 -1
  169. package/lib/esm/CodeService.js.map +1 -1
  170. package/lib/esm/CodeSpecs.js.map +1 -1
  171. package/lib/esm/ConcurrentQuery.js.map +1 -1
  172. package/lib/esm/CustomViewState3dCreator.js.map +1 -1
  173. package/lib/esm/DevTools.js.map +1 -1
  174. package/lib/esm/DisplayStyle.js.map +1 -1
  175. package/lib/esm/ECDb.js.map +1 -1
  176. package/lib/esm/ECSchemaXmlContext.js.map +1 -1
  177. package/lib/esm/ECSqlStatement.js.map +1 -1
  178. package/lib/esm/Element.js.map +1 -1
  179. package/lib/esm/ElementAspect.js.map +1 -1
  180. package/lib/esm/ElementGraphics.js.map +1 -1
  181. package/lib/esm/ElementTreeWalker.js.map +1 -1
  182. package/lib/esm/Entity.js.map +1 -1
  183. package/lib/esm/EntityReferences.js.map +1 -1
  184. package/lib/esm/ExportGraphics.js.map +1 -1
  185. package/lib/esm/ExternalSource.js.map +1 -1
  186. package/lib/esm/FontFile.js.map +1 -1
  187. package/lib/esm/GeoCoordConfig.js.map +1 -1
  188. package/lib/esm/GeographicCRSServices.d.ts.map +1 -1
  189. package/lib/esm/GeographicCRSServices.js +2 -0
  190. package/lib/esm/GeographicCRSServices.js.map +1 -1
  191. package/lib/esm/GeometrySummary.js +47 -47
  192. package/lib/esm/GeometrySummary.js.map +1 -1
  193. package/lib/esm/IModelDb.js +9 -9
  194. package/lib/esm/IModelDb.js.map +1 -1
  195. package/lib/esm/IModelDbFonts.js.map +1 -1
  196. package/lib/esm/IModelElementCloneContext.js.map +1 -1
  197. package/lib/esm/IModelHost.d.ts +1 -2
  198. package/lib/esm/IModelHost.d.ts.map +1 -1
  199. package/lib/esm/IModelHost.js +10 -18
  200. package/lib/esm/IModelHost.js.map +1 -1
  201. package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
  202. package/lib/esm/IModelJsFs.js.map +1 -1
  203. package/lib/esm/ImageSourceConversion.js.map +1 -1
  204. package/lib/esm/IpcHost.js.map +1 -1
  205. package/lib/esm/LineStyle.js.map +1 -1
  206. package/lib/esm/LocalHub.js +1 -1
  207. package/lib/esm/LocalHub.js.map +1 -1
  208. package/lib/esm/LocalhostIpcHost.js.map +1 -1
  209. package/lib/esm/LockControl.js.map +1 -1
  210. package/lib/esm/Material.js.map +1 -1
  211. package/lib/esm/Model.js.map +1 -1
  212. package/lib/esm/NativeAppStorage.js.map +1 -1
  213. package/lib/esm/NativeHost.js.map +1 -1
  214. package/lib/esm/NavigationRelationship.js.map +1 -1
  215. package/lib/esm/PromiseMemoizer.js.map +1 -1
  216. package/lib/esm/PropertyStore.js.map +1 -1
  217. package/lib/esm/Relationship.js.map +1 -1
  218. package/lib/esm/RpcBackend.js.map +1 -1
  219. package/lib/esm/SQLiteDb.js.map +1 -1
  220. package/lib/esm/Schema.js.map +1 -1
  221. package/lib/esm/SchemaSync.js.map +1 -1
  222. package/lib/esm/SchemaUtils.js.map +1 -1
  223. package/lib/esm/SheetIndex.js.map +1 -1
  224. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  225. package/lib/esm/SqliteStatement.js.map +1 -1
  226. package/lib/esm/StashManager.js.map +1 -1
  227. package/lib/esm/Texture.js.map +1 -1
  228. package/lib/esm/TileStorage.d.ts +1 -1
  229. package/lib/esm/TileStorage.d.ts.map +1 -1
  230. package/lib/esm/TileStorage.js.map +1 -1
  231. package/lib/esm/TxnManager.js.map +1 -1
  232. package/lib/esm/ViewDefinition.js.map +1 -1
  233. package/lib/esm/ViewStateHydrator.js.map +1 -1
  234. package/lib/esm/ViewStore.js.map +1 -1
  235. package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +7 -1
  236. package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
  237. package/lib/esm/annotations/ElementDrivesTextAnnotation.js +25 -0
  238. package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  239. package/lib/esm/annotations/FrameGeometry.js +6 -6
  240. package/lib/esm/annotations/FrameGeometry.js.map +1 -1
  241. package/lib/esm/annotations/LeaderGeometry.js +4 -4
  242. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  243. package/lib/esm/annotations/TextAnnotationElement.d.ts +121 -21
  244. package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
  245. package/lib/esm/annotations/TextAnnotationElement.js +283 -64
  246. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  247. package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
  248. package/lib/esm/annotations/TextBlockGeometry.js +3 -3
  249. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
  250. package/lib/esm/annotations/TextBlockLayout.d.ts +2 -2
  251. package/lib/esm/annotations/TextBlockLayout.d.ts.map +1 -1
  252. package/lib/esm/annotations/TextBlockLayout.js +52 -25
  253. package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
  254. package/lib/esm/core-backend.js.map +1 -1
  255. package/lib/esm/domains/FunctionalElements.js.map +1 -1
  256. package/lib/esm/domains/FunctionalSchema.js.map +1 -1
  257. package/lib/esm/domains/GenericElements.js.map +1 -1
  258. package/lib/esm/domains/GenericSchema.js.map +1 -1
  259. package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
  260. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  261. package/lib/esm/internal/ElementLRUCache.js.map +1 -1
  262. package/lib/esm/internal/FontFileImpl.js.map +1 -1
  263. package/lib/esm/internal/HubMock.js.map +1 -1
  264. package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
  265. package/lib/esm/internal/NativePlatform.js.map +1 -1
  266. package/lib/esm/internal/NoLocks.js.map +1 -1
  267. package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
  268. package/lib/esm/internal/Symbols.js.map +1 -1
  269. package/lib/esm/internal/annotations/fields.d.ts.map +1 -1
  270. package/lib/esm/internal/annotations/fields.js +1 -0
  271. package/lib/esm/internal/annotations/fields.js.map +1 -1
  272. package/lib/esm/internal/cross-package.js.map +1 -1
  273. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  274. package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  275. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  276. package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  277. package/lib/esm/rpc/multipart.js.map +1 -1
  278. package/lib/esm/rpc/tracing.js.map +1 -1
  279. package/lib/esm/rpc/web/logging.js.map +1 -1
  280. package/lib/esm/rpc/web/request.js.map +1 -1
  281. package/lib/esm/rpc/web/response.js.map +1 -1
  282. package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  283. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  284. package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  285. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  286. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  287. package/lib/esm/test/AdvancedEqual.js.map +1 -1
  288. package/lib/esm/test/AnnotationTestUtils.js +1 -1
  289. package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
  290. package/lib/esm/test/AttachDb.test.js +11 -11
  291. package/lib/esm/test/AttachDb.test.js.map +1 -1
  292. package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
  293. package/lib/esm/test/GeometryTestUtil.js.map +1 -1
  294. package/lib/esm/test/IModelHost.test.js +17 -11
  295. package/lib/esm/test/IModelHost.test.js.map +1 -1
  296. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  297. package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
  298. package/lib/esm/test/IpcHost.test.js.map +1 -1
  299. package/lib/esm/test/KnownTestLocations.js.map +1 -1
  300. package/lib/esm/test/PrintElementTree.js.map +1 -1
  301. package/lib/esm/test/PropertyDb.test.js.map +1 -1
  302. package/lib/esm/test/RevisionUtility.js.map +1 -1
  303. package/lib/esm/test/SchemaUtils.test.js +25 -25
  304. package/lib/esm/test/SchemaUtils.test.js.map +1 -1
  305. package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
  306. package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
  307. package/lib/esm/test/TestUtils.js.map +1 -1
  308. package/lib/esm/test/annotations/Fields.test.js +185 -90
  309. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  310. package/lib/esm/test/annotations/FrameGeometry.test.js +4 -4
  311. package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
  312. package/lib/esm/test/annotations/LeaderGeometry.test.js +8 -8
  313. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  314. package/lib/esm/test/annotations/TextAnnotation.test.js +356 -36
  315. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  316. package/lib/esm/test/annotations/TextBlock.test.js +218 -151
  317. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
  318. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
  319. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
  320. package/lib/esm/test/categories/Category.test.js.map +1 -1
  321. package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
  322. package/lib/esm/test/ecdb/CTE.test.js +88 -88
  323. package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
  324. package/lib/esm/test/ecdb/ConcurrentQuery.test.js +15 -15
  325. package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
  326. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
  327. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
  328. package/lib/esm/test/ecdb/ECDb.test.js +72 -72
  329. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  330. package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
  331. package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
  332. package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
  333. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  334. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  335. package/lib/esm/test/ecdb/ECSqlReader.test.js +16 -16
  336. package/lib/esm/test/ecdb/ECSqlReader.test.js.map +1 -1
  337. package/lib/esm/test/ecdb/ECSqlStatement.test.js +326 -326
  338. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  339. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  340. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  341. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
  342. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  343. package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
  344. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  345. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  346. package/lib/esm/test/element/ElementAspect.test.js +22 -22
  347. package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
  348. package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
  349. package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
  350. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  351. package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
  352. package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
  353. package/lib/esm/test/element/NullStructArray.test.js +13 -13
  354. package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
  355. package/lib/esm/test/element/UrlLink.test.js.map +1 -1
  356. package/lib/esm/test/font/FontFile.test.js.map +1 -1
  357. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  358. package/lib/esm/test/hubaccess/ApplyChangeset.test.js +32 -32
  359. package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
  360. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  361. package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
  362. package/lib/esm/test/hubaccess/Rebase.test.js +74 -34
  363. package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
  364. package/lib/esm/test/imageData.js.map +1 -1
  365. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  366. package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
  367. package/lib/esm/test/imodel/IModel.test.js +62 -44
  368. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  369. package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
  370. package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
  371. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
  372. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
  373. package/lib/esm/test/incrementalSchemaLocater/utils/IModelSchemaLocater.js.map +1 -1
  374. package/lib/esm/test/incrementalSchemaLocater/utils/IncrementalTestHelper.js.map +1 -1
  375. package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.js.map +1 -1
  376. package/lib/esm/test/index.js.map +1 -1
  377. package/lib/esm/test/misc/DevTools.test.js.map +1 -1
  378. package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
  379. package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
  380. package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
  381. package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
  382. package/lib/esm/test/rpc/response.test.js.map +1 -1
  383. package/lib/esm/test/schema/ClassRegistry.test.js +99 -99
  384. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  385. package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
  386. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  387. package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
  388. package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
  389. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  390. package/lib/esm/test/standalone/ChangesetReader.test.js +124 -124
  391. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  392. package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
  393. package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
  394. package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
  395. package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
  396. package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
  397. package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
  398. package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
  399. package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
  400. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  401. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  402. package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
  403. package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
  404. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  405. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
  406. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  407. package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
  408. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  409. package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
  410. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  411. package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
  412. package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
  413. package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
  414. package/lib/esm/test/standalone/Setting.test.js.map +1 -1
  415. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  416. package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
  417. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  418. package/lib/esm/test/standalone/Texture.test.js.map +1 -1
  419. package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
  420. package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
  421. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  422. package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
  423. package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
  424. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  425. package/lib/esm/workspace/Settings.js.map +1 -1
  426. package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
  427. package/lib/esm/workspace/Workspace.js.map +1 -1
  428. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  429. package/package.json +16 -18
@@ -4,9 +4,9 @@
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import { expect } from "chai";
6
6
  import { Angle, Point3d, Range2d, Range3d, YawPitchRollAngles } from "@itwin/core-geometry";
7
- import { FractionRun, SubCategoryAppearance, TextAnnotation, TextBlock, TextRun, TextStyleSettings } from "@itwin/core-common";
7
+ import { FieldRun, FractionRun, SubCategoryAppearance, TextAnnotation, TextBlock, TextRun, TextStyleSettings } from "@itwin/core-common";
8
8
  import { StandaloneDb } from "../../IModelDb";
9
- import { AnnotationTextStyle, TextAnnotation2d, TextAnnotation3d } from "../../annotations/TextAnnotationElement";
9
+ import { AnnotationTextStyle, parseTextAnnotationData, TEXT_ANNOTATION_JSON_VERSION, TEXT_STYLE_SETTINGS_JSON_VERSION, TextAnnotation2d, TextAnnotation3d } from "../../annotations/TextAnnotationElement";
10
10
  import { IModelTestUtils } from "../IModelTestUtils";
11
11
  import { Subject } from "../../Element";
12
12
  import { Guid, Id64 } from "@itwin/core-bentley";
@@ -19,6 +19,7 @@ import { computeTextRangeAsStringLength, MockBuilder } from "../AnnotationTestUt
19
19
  import { TextAnnotationUsesTextStyleByDefault } from "../../annotations/ElementDrivesTextAnnotation";
20
20
  import { layoutTextBlock, TextStyleResolver } from "../../annotations/TextBlockLayout";
21
21
  import { appendTextAnnotationGeometry } from "../../annotations/TextAnnotationGeometry";
22
+ import { IModelElementCloneContext } from "../../IModelElementCloneContext";
22
23
  function mockIModel() {
23
24
  const iModel = {
24
25
  fonts: {
@@ -30,13 +31,12 @@ function mockIModel() {
30
31
  return iModel;
31
32
  }
32
33
  function createAnnotation(textBlock) {
33
- const styleOverrides = { fontName: "Karla" };
34
+ const styleOverrides = { font: { name: "Karla" }, margins: { left: 0, right: 1, top: 2, bottom: 3 } };
34
35
  const block = textBlock ?? TextBlock.create({ styleOverrides });
35
36
  if (!textBlock) {
36
37
  block.appendRun(TextRun.create({ content: "Run, Barry,", styleOverrides }));
37
38
  block.appendRun(TextRun.create({ content: " RUN!!! ", styleOverrides }));
38
39
  block.appendRun(FractionRun.create({ numerator: "Harrison", denominator: "Wells", styleOverrides }));
39
- block.margins = { left: 0, right: 1, top: 2, bottom: 3 };
40
40
  }
41
41
  const annotation = TextAnnotation.fromJSON({ textBlock: block.toJSON() });
42
42
  annotation.anchor = { vertical: "middle", horizontal: "right" };
@@ -83,8 +83,13 @@ const createIModel = async (name) => {
83
83
  });
84
84
  return iModel;
85
85
  };
86
- const createAnnotationTextStyle = (iModel, definitionModel, name, settings = TextStyleSettings.defaultProps) => {
87
- return AnnotationTextStyle.create(iModel, definitionModel, name, settings, "description");
86
+ const createAnnotationTextStyle = (iModel, definitionModelId, name, settings = TextStyleSettings.defaultProps) => {
87
+ return AnnotationTextStyle.create(iModel, {
88
+ definitionModelId,
89
+ name,
90
+ settings,
91
+ description: "description",
92
+ });
88
93
  };
89
94
  function createElement2d(imodel, createArgs) {
90
95
  const placement = {
@@ -124,13 +129,56 @@ describe("TextAnnotation element", () => {
124
129
  ...props,
125
130
  }, mockIModel());
126
131
  }
132
+ describe("versioning", () => {
133
+ it("throws if the JSON has no version", () => {
134
+ expect(() => makeElement({
135
+ textAnnotationData: JSON.stringify({
136
+ data: {
137
+ textBlock: TextBlock.create().toJSON()
138
+ }
139
+ }),
140
+ })).to.throw("JSON version is missing or invalid.");
141
+ });
142
+ it("throws if the JSON has no data", () => {
143
+ expect(() => makeElement({
144
+ textAnnotationData: JSON.stringify({
145
+ version: TEXT_ANNOTATION_JSON_VERSION,
146
+ }),
147
+ })).to.throw("JSON data is missing or invalid.");
148
+ });
149
+ it("throws if the JSON version is too new", () => {
150
+ expect(() => makeElement({
151
+ textAnnotationData: JSON.stringify({
152
+ version: "999.999.999",
153
+ data: {
154
+ textBlock: TextBlock.create().toJSON()
155
+ }
156
+ }),
157
+ })).to.throw(`JSON version 999.999.999 is newer than supported version ${TEXT_ANNOTATION_JSON_VERSION}. Application update required to understand data.`);
158
+ });
159
+ it("throws if the JSON version is old and cannot be migrated", () => {
160
+ expect(() => makeElement({
161
+ textAnnotationData: JSON.stringify({
162
+ version: "0.0.1",
163
+ data: {
164
+ textBlock: TextBlock.create().toJSON()
165
+ }
166
+ }),
167
+ })).to.throw(`Migration for textAnnotationData from version 0.0.1 to ${TEXT_ANNOTATION_JSON_VERSION} failed.`);
168
+ });
169
+ });
127
170
  describe("getAnnotation", () => {
128
171
  it("returns undefined if not provided", () => {
129
172
  expect(makeElement().getAnnotation()).to.be.undefined;
130
173
  });
131
174
  it("converts JSON string to class instance", () => {
132
175
  const elem = makeElement({
133
- textAnnotationData: JSON.stringify({ textBlock: TextBlock.create().toJSON() }),
176
+ textAnnotationData: JSON.stringify({
177
+ version: TEXT_ANNOTATION_JSON_VERSION,
178
+ data: {
179
+ textBlock: TextBlock.create().toJSON()
180
+ }
181
+ }),
134
182
  defaultTextStyle: new TextAnnotationUsesTextStyleByDefault("0x42").toJSON()
135
183
  });
136
184
  const anno = elem.getAnnotation();
@@ -141,7 +189,12 @@ describe("TextAnnotation element", () => {
141
189
  });
142
190
  it("produces a new object each time it is called", () => {
143
191
  const elem = makeElement({
144
- textAnnotationData: JSON.stringify({ textBlock: TextBlock.create().toJSON() })
192
+ textAnnotationData: JSON.stringify({
193
+ version: TEXT_ANNOTATION_JSON_VERSION,
194
+ data: {
195
+ textBlock: TextBlock.create().toJSON()
196
+ }
197
+ }),
145
198
  });
146
199
  const anno1 = elem.getAnnotation();
147
200
  const anno2 = elem.getAnnotation();
@@ -160,6 +213,58 @@ describe("TextAnnotation element", () => {
160
213
  expect(elem.getAnnotation().toJSON()).not.to.equal(annotation.toJSON());
161
214
  });
162
215
  });
216
+ describe("getReferenceIds", () => {
217
+ function expectReferenceIds(expected, element) {
218
+ const actual = Array.from(element.getReferenceIds()).sort();
219
+ // reference Ids get a prefix indicating their type ('e' for 'element')
220
+ expected = expected.map((id) => `e${id}`);
221
+ // the superclasses provide some reference Ids (code spec, model, category)
222
+ const baseIds = ["e0x12", "e0x78", "m0x34"];
223
+ expected.push(...baseIds);
224
+ expected = expected.sort();
225
+ expect(actual).to.deep.equal(expected);
226
+ }
227
+ it("reports default text style and field hosts", () => {
228
+ // makeElement sets defaultTextStyle to "0x21"
229
+ const elem = makeElement();
230
+ expectReferenceIds(["0x21"], elem);
231
+ elem.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault("0x123");
232
+ expectReferenceIds(["0x123"], elem);
233
+ const textBlock = TextBlock.create();
234
+ textBlock.appendRun(FieldRun.create({
235
+ propertyHost: { elementId: "0x456", schemaName: "BisCore", className: "GeometricElement3d" },
236
+ propertyPath: { propertyName: "CodeValue" },
237
+ }));
238
+ textBlock.appendRun(FieldRun.create({
239
+ propertyHost: { elementId: "0x789", schemaName: "BisCore", className: "GeometricElement3d" },
240
+ propertyPath: { propertyName: "LastMod" },
241
+ }));
242
+ elem.setAnnotation(TextAnnotation.create({ textBlock }));
243
+ expectReferenceIds(["0x123", "0x456", "0x789"], elem);
244
+ elem.defaultTextStyle = undefined;
245
+ expectReferenceIds(["0x456", "0x789"], elem);
246
+ elem.setAnnotation(TextAnnotation.create());
247
+ expectReferenceIds([], elem);
248
+ });
249
+ it("does not report invalid Ids", () => {
250
+ const elem = makeElement();
251
+ elem.defaultTextStyle = undefined;
252
+ expectReferenceIds([], elem);
253
+ elem.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault("0");
254
+ expectReferenceIds([], elem);
255
+ const textBlock = TextBlock.create();
256
+ textBlock.appendRun(FieldRun.create({
257
+ propertyHost: { elementId: "0", schemaName: "BisCore", className: "GeometricElement3d" },
258
+ propertyPath: { propertyName: "CodeValue" },
259
+ }));
260
+ textBlock.appendRun(FieldRun.create({
261
+ propertyHost: { elementId: "0x123", schemaName: "BisCore", className: "GeometricElement3d" },
262
+ propertyPath: { propertyName: "LastMod" },
263
+ }));
264
+ elem.setAnnotation(TextAnnotation.create({ textBlock }));
265
+ expectReferenceIds(["0x123"], elem);
266
+ });
267
+ });
163
268
  describe("TextAnnotation3d Persistence", () => {
164
269
  let imodel;
165
270
  let createElement3dArgs;
@@ -168,7 +273,7 @@ describe("TextAnnotation element", () => {
168
273
  const jobSubjectId = createJobSubjectElement(imodel, "Job").insert();
169
274
  const definitionModel = DefinitionModel.insert(imodel, jobSubjectId, "Definition");
170
275
  const { category, model } = insertSpatialModel(imodel, jobSubjectId, definitionModel);
171
- const styleId = createAnnotationTextStyle(imodel, definitionModel, "test", { fontName: "Totally Real Font", lineHeight: 0.25, isItalic: true }).insert();
276
+ const styleId = createAnnotationTextStyle(imodel, definitionModel, "test", { font: { name: "Totally Real Font" }, textHeight: 0.25, isItalic: true }).insert();
172
277
  expect(jobSubjectId).not.to.be.undefined;
173
278
  expect(category).not.to.be.undefined;
174
279
  expect(model).not.to.be.undefined;
@@ -178,7 +283,7 @@ describe("TextAnnotation element", () => {
178
283
  after(() => imodel.close());
179
284
  it("creating element does not automatically compute the geometry", () => {
180
285
  const annotation = createAnnotation();
181
- const args = { ...createElement3dArgs, textAnnotationData: annotation.toJSON() };
286
+ const args = { ...createElement3dArgs, textAnnotationProps: annotation.toJSON() };
182
287
  const el = createElement3d(imodel, args);
183
288
  expect(el.getAnnotation().equals(annotation)).to.be.true;
184
289
  expect(el.geom).to.be.undefined;
@@ -239,7 +344,7 @@ describe("TextAnnotation element", () => {
239
344
  });
240
345
  it("creating element does not automatically compute the geometry", () => {
241
346
  const annotation = createAnnotation();
242
- const args = { ...createElement2dArgs, textAnnotationData: annotation.toJSON() };
347
+ const args = { ...createElement2dArgs, textAnnotationProps: annotation.toJSON() };
243
348
  const el = createElement2d(imodel, args);
244
349
  expect(el.getAnnotation().equals(annotation)).to.be.true;
245
350
  expect(el.geom).to.be.undefined;
@@ -289,8 +394,8 @@ describe("TextAnnotation element", () => {
289
394
  imodel = await createIModel("DefaultTextStyle");
290
395
  const jobSubjectId = createJobSubjectElement(imodel, "Job").insert();
291
396
  const definitionModel = DefinitionModel.insert(imodel, jobSubjectId, "Definition");
292
- const styleId = createAnnotationTextStyle(imodel, definitionModel, "test", { fontName: "Totally Real Font", lineHeight: 0.25, isItalic: true }).insert();
293
- const differentStyleId = createAnnotationTextStyle(imodel, definitionModel, "alt", { fontName: "Karla", lineHeight: 0.5, isBold: true }).insert();
397
+ const styleId = createAnnotationTextStyle(imodel, definitionModel, "test", { font: { name: "Totally Real Font" }, textHeight: 0.25, isItalic: true }).insert();
398
+ const differentStyleId = createAnnotationTextStyle(imodel, definitionModel, "alt", { font: { name: "Karla" }, textHeight: 0.5, isBold: true }).insert();
294
399
  expect(jobSubjectId).not.to.be.undefined;
295
400
  expect(definitionModel).not.to.be.undefined;
296
401
  expect(styleId).not.to.be.undefined;
@@ -314,7 +419,7 @@ describe("TextAnnotation element", () => {
314
419
  });
315
420
  it("preserves defaultTextStyle after round trip", () => {
316
421
  const annotation = createAnnotation();
317
- const args = { ...createElement2dArgs, textAnnotationData: annotation.toJSON(), defaultTextStyleId: seedStyleId };
422
+ const args = { ...createElement2dArgs, textAnnotationProps: annotation.toJSON(), defaultTextStyleId: seedStyleId };
318
423
  const el0 = createElement2d(imodel, args);
319
424
  expect(el0.defaultTextStyle).not.to.be.undefined;
320
425
  expect(el0.defaultTextStyle.id).to.equal(seedStyleId);
@@ -327,7 +432,7 @@ describe("TextAnnotation element", () => {
327
432
  });
328
433
  it("produces different geometry when defaultTextStyle changes", () => {
329
434
  const annotation = createAnnotation();
330
- const args = { ...createElement2dArgs, textAnnotationData: annotation.toJSON() };
435
+ const args = { ...createElement2dArgs, textAnnotationProps: annotation.toJSON() };
331
436
  const el0 = createElement2d(imodel, args);
332
437
  el0.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault(seedStyleId);
333
438
  const geom1 = el0.toJSON().elementGeometryBuilderParams;
@@ -337,7 +442,7 @@ describe("TextAnnotation element", () => {
337
442
  });
338
443
  it("allows defaultTextStyle to be undefined", () => {
339
444
  const annotation = createAnnotation();
340
- const args = { ...createElement2dArgs, textAnnotationData: annotation.toJSON() };
445
+ const args = { ...createElement2dArgs, textAnnotationProps: annotation.toJSON() };
341
446
  const el0 = createElement2d(imodel, args);
342
447
  el0.defaultTextStyle = undefined;
343
448
  const elId = el0.insert();
@@ -347,6 +452,178 @@ describe("TextAnnotation element", () => {
347
452
  expect(el1 instanceof TextAnnotation2d).to.be.true;
348
453
  expect(el1.defaultTextStyle).to.be.undefined;
349
454
  });
455
+ describe("onCloned", () => {
456
+ function insertStyledElement(styleId, db) {
457
+ const args = { ...createElement2dArgs, defaultTextStyleId: styleId };
458
+ const elem = createElement2d(db, args);
459
+ elem.insert();
460
+ imodel.saveChanges();
461
+ return elem;
462
+ }
463
+ describe("within a single iModel", () => {
464
+ it("leaves property hosts intact", () => {
465
+ const textBlock = TextBlock.create({
466
+ children: [{
467
+ children: [{
468
+ type: "field",
469
+ propertyHost: {
470
+ elementId: "0x123",
471
+ schemaName: "Fields",
472
+ className: "TestElement",
473
+ },
474
+ propertyPath: { propertyName: "intProp" },
475
+ }, {
476
+ type: "field",
477
+ propertyHost: {
478
+ elementId: "0xabc",
479
+ schemaName: "BisCore",
480
+ className: "Element",
481
+ },
482
+ propertyPath: { propertyName: "CodeValue" },
483
+ }],
484
+ }],
485
+ });
486
+ const annotation = TextAnnotation.create({ textBlock });
487
+ const elem = createElement2d(imodel, { ...createElement2dArgs, textAnnotationProps: annotation.toJSON() });
488
+ elem.insert();
489
+ imodel.saveChanges();
490
+ const context = new IModelElementCloneContext(imodel);
491
+ context.remapElement("0x123", "0x456");
492
+ context.remapElement("0xabc", "0xdef");
493
+ context.remapElement(createElement2dArgs.model, createElement2dArgs.model);
494
+ const props = context.cloneElement(elem);
495
+ expect(props.textAnnotationData).not.to.be.undefined;
496
+ const anno = TextAnnotation.fromJSON(parseTextAnnotationData(props.textAnnotationData)?.data);
497
+ const para = anno.textBlock.children[0];
498
+ expect(para.children[0].propertyHost.elementId).to.equal("0x123");
499
+ expect(para.children[1].propertyHost.elementId).to.equal("0xabc");
500
+ });
501
+ it("leaves default text style intact", () => {
502
+ function clone(styleId, expectedStyleId) {
503
+ const elem = insertStyledElement(styleId, imodel);
504
+ const context = new IModelElementCloneContext(imodel);
505
+ context.remapElement(createElement2dArgs.model, createElement2dArgs.model);
506
+ const props = context.cloneElement(elem);
507
+ expect(props.defaultTextStyle?.id).to.equal(expectedStyleId);
508
+ if (styleId) {
509
+ // Even an explicit remapping is ignored when cloning within a single iModel
510
+ // (per the examples set by most other elements, excluding RenderMaterial).
511
+ context.remapElement(styleId, "0x99887");
512
+ const props2 = context.cloneElement(elem);
513
+ expect(props2.defaultTextStyle?.id).to.equal(expectedStyleId);
514
+ }
515
+ }
516
+ clone(seedStyleId, seedStyleId);
517
+ clone(undefined, undefined);
518
+ clone("0x12345", "0x12345");
519
+ clone(Id64.invalid, undefined);
520
+ });
521
+ });
522
+ describe("between iModels", () => {
523
+ let dstDb;
524
+ let dstDefModel;
525
+ let dstElemArgs;
526
+ before(async () => {
527
+ dstDb = await createIModel("CloneTarget");
528
+ const jobSubjectId = createJobSubjectElement(dstDb, "Job").insert();
529
+ dstDefModel = DefinitionModel.insert(dstDb, jobSubjectId, "Definition");
530
+ const { category, model } = insertDrawingModel(dstDb, jobSubjectId, dstDefModel);
531
+ expect(category).not.to.equal(createElement2dArgs.category);
532
+ expect(model).not.to.equal(createElement2dArgs.model);
533
+ dstElemArgs = { category, model };
534
+ });
535
+ after(() => dstDb.close());
536
+ it("remaps property hosts", () => {
537
+ const textBlock = TextBlock.create({
538
+ children: [{
539
+ children: [{
540
+ type: "field",
541
+ propertyHost: {
542
+ elementId: "0x123",
543
+ schemaName: "Fields",
544
+ className: "TestElement",
545
+ },
546
+ propertyPath: { propertyName: "intProp" },
547
+ }, {
548
+ type: "field",
549
+ propertyHost: {
550
+ elementId: "0xabc",
551
+ schemaName: "BisCore",
552
+ className: "Element",
553
+ },
554
+ propertyPath: { propertyName: "CodeValue" },
555
+ }],
556
+ }],
557
+ });
558
+ const annotation = TextAnnotation.create({ textBlock });
559
+ const elem = createElement2d(imodel, { ...createElement2dArgs, textAnnotationProps: annotation.toJSON() });
560
+ elem.insert();
561
+ imodel.saveChanges();
562
+ const context = new IModelElementCloneContext(imodel, dstDb);
563
+ context.remapElement("0x123", "0x456");
564
+ context.remapElement("0xabc", "0xdef");
565
+ context.remapElement(createElement2dArgs.model, dstElemArgs.model);
566
+ const props = context.cloneElement(elem);
567
+ expect(props.textAnnotationData).not.to.be.undefined;
568
+ const anno = TextAnnotation.fromJSON(parseTextAnnotationData(props.textAnnotationData)?.data);
569
+ const para = anno.textBlock.children[0];
570
+ expect(para.children[0].propertyHost.elementId).to.equal("0x456");
571
+ expect(para.children[1].propertyHost.elementId).to.equal("0xdef");
572
+ });
573
+ it("sets default text style to undefined if source style does not exist", () => {
574
+ const elem = insertStyledElement("0x12345", imodel);
575
+ const context = new IModelElementCloneContext(imodel, dstDb);
576
+ context.remapElement(createElement2dArgs.model, dstElemArgs.model);
577
+ const props = context.cloneElement(elem);
578
+ expect(props.defaultTextStyle).to.be.undefined;
579
+ });
580
+ it("remaps to an existing text style with the same code if present", () => {
581
+ const dstStyleId = createAnnotationTextStyle(dstDb, dstDefModel, "test", { font: { name: "Karla" } }).insert();
582
+ expect(dstStyleId).not.to.equal(seedStyleId);
583
+ const srcElem = insertStyledElement(seedStyleId, imodel);
584
+ const context = new IModelElementCloneContext(imodel, dstDb);
585
+ context.remapElement(createElement2dArgs.model, dstElemArgs.model);
586
+ const props = context.cloneElement(srcElem);
587
+ expect(props.defaultTextStyle?.id).to.equal(dstStyleId);
588
+ });
589
+ it("throws an error if definition model is not remapped", () => {
590
+ const srcElem = insertStyledElement(seedStyleId2, imodel);
591
+ const context = new IModelElementCloneContext(imodel, dstDb);
592
+ context.remapElement(createElement2dArgs.model, dstElemArgs.model);
593
+ expect(() => context.cloneElement(srcElem)).to.throw("Invalid target model");
594
+ });
595
+ it("imports default text style if necessary", () => {
596
+ const srcElem = insertStyledElement(seedStyleId2, imodel);
597
+ const context = new IModelElementCloneContext(imodel, dstDb);
598
+ context.remapElement(createElement2dArgs.model, dstElemArgs.model);
599
+ context.remapElement(seedDefinitionModelId, dstDefModel);
600
+ const props = context.cloneElement(srcElem);
601
+ const dstStyleId = props.defaultTextStyle.id;
602
+ expect(dstStyleId).not.to.be.undefined;
603
+ expect(dstStyleId).not.to.equal(seedStyleId2);
604
+ expect(dstDb.elements.tryGetElement(dstStyleId)).not.to.be.undefined;
605
+ });
606
+ it("remaps multiple occurrences of same style to same Id", () => {
607
+ const srcStyleId = createAnnotationTextStyle(imodel, seedDefinitionModelId, "styyyle", { font: { name: "Karla" } }).insert();
608
+ const srcElem1 = insertStyledElement(srcStyleId, imodel);
609
+ const srcElem2 = insertStyledElement(srcStyleId, imodel);
610
+ const srcElem3 = insertStyledElement(srcStyleId, imodel);
611
+ const context = new IModelElementCloneContext(imodel, dstDb);
612
+ context.remapElement(createElement2dArgs.model, dstElemArgs.model);
613
+ context.remapElement(seedDefinitionModelId, dstDefModel);
614
+ const props1 = context.cloneElement(srcElem1);
615
+ const props2 = context.cloneElement(srcElem2);
616
+ expect(props1.defaultTextStyle).not.to.be.undefined;
617
+ expect(props1.defaultTextStyle?.id).not.to.equal(srcStyleId);
618
+ expect(props2.defaultTextStyle?.id).to.equal(props1.defaultTextStyle?.id);
619
+ const context2 = new IModelElementCloneContext(imodel, dstDb);
620
+ context2.remapElement(createElement2dArgs.model, dstElemArgs.model);
621
+ context2.remapElement(seedDefinitionModelId, dstDefModel);
622
+ const props3 = context2.cloneElement(srcElem3);
623
+ expect(props3.defaultTextStyle?.id).to.equal(props1.defaultTextStyle?.id);
624
+ });
625
+ });
626
+ });
350
627
  });
351
628
  describe("TextAnnotation3d", () => {
352
629
  let createElement3dArgs;
@@ -358,7 +635,7 @@ describe("TextAnnotation element", () => {
358
635
  });
359
636
  it("preserves defaultTextStyle after round trip", () => {
360
637
  const annotation = createAnnotation();
361
- const args = { ...createElement3dArgs, textAnnotationData: annotation.toJSON(), defaultTextStyleId: seedStyleId };
638
+ const args = { ...createElement3dArgs, textAnnotationProps: annotation.toJSON(), defaultTextStyleId: seedStyleId };
362
639
  const el0 = createElement3d(imodel, args);
363
640
  expect(el0.defaultTextStyle).not.to.be.undefined;
364
641
  expect(el0.defaultTextStyle.id).to.equal(seedStyleId);
@@ -371,7 +648,7 @@ describe("TextAnnotation element", () => {
371
648
  });
372
649
  it("produces different geometry when defaultTextStyle changes", () => {
373
650
  const annotation = createAnnotation();
374
- const args = { ...createElement3dArgs, textAnnotationData: annotation.toJSON() };
651
+ const args = { ...createElement3dArgs, textAnnotationProps: annotation.toJSON() };
375
652
  const el0 = createElement3d(imodel, args);
376
653
  el0.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault(seedStyleId);
377
654
  const geom1 = el0.toJSON().elementGeometryBuilderParams;
@@ -381,7 +658,7 @@ describe("TextAnnotation element", () => {
381
658
  });
382
659
  it("allows defaultTextStyle to be undefined", () => {
383
660
  const annotation = createAnnotation();
384
- const args = { ...createElement3dArgs, textAnnotationData: annotation.toJSON() };
661
+ const args = { ...createElement3dArgs, textAnnotationProps: annotation.toJSON() };
385
662
  const el0 = createElement3d(imodel, args);
386
663
  el0.defaultTextStyle = undefined;
387
664
  const elId = el0.insert();
@@ -412,9 +689,9 @@ describe("AnnotationTextStyle", () => {
412
689
  });
413
690
  it("inserts a style and round-trips through JSON", async () => {
414
691
  const textStyle = TextStyleSettings.fromJSON({
415
- fontName: "Totally Real Font",
692
+ font: { name: "Totally Real Font" },
416
693
  isUnderlined: true,
417
- lineHeight: 0.5
694
+ textHeight: 0.5
418
695
  });
419
696
  const el0 = createAnnotationTextStyle(imodel, seedDefinitionModel, "round-trip", textStyle.toJSON());
420
697
  const elId = el0.insert();
@@ -431,27 +708,27 @@ describe("AnnotationTextStyle", () => {
431
708
  let annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "default");
432
709
  expect(() => annotationTextStyle.insert()).to.throw();
433
710
  // font is required
434
- annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "no font", { fontName: "" });
711
+ annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "no font", { font: { name: "" } });
435
712
  expect(() => annotationTextStyle.insert()).to.throw();
436
- // lineHeight should be positive
437
- annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "invalid lineHeight", { fontName: "Totally Real Font", lineHeight: 0 });
713
+ // textHeight should be positive
714
+ annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "invalid textHeight", { font: { name: "Totally Real Font" }, textHeight: 0 });
438
715
  expect(() => annotationTextStyle.insert()).to.throw();
439
716
  // stackedFractionScale should be positive
440
- annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "invalid stackedFractionScale", { fontName: "Totally Real Font", stackedFractionScale: 0 });
717
+ annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "invalid stackedFractionScale", { font: { name: "Totally Real Font" }, stackedFractionScale: 0 });
441
718
  expect(() => annotationTextStyle.insert()).to.throw();
442
719
  });
443
720
  it("does not allow updating of elements to invalid styles", async () => {
444
- const annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "valid style", { fontName: "Totally Real Font" });
721
+ const annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "valid style", { font: { name: "Totally Real Font" } });
445
722
  const elId = annotationTextStyle.insert();
446
723
  expect(Id64.isValidId64(elId)).to.be.true;
447
724
  const el1 = imodel.elements.getElement(elId);
448
725
  expect(el1).not.to.be.undefined;
449
726
  expect(el1 instanceof AnnotationTextStyle).to.be.true;
450
- el1.settings = el1.settings.clone({ fontName: "" });
727
+ el1.settings = el1.settings.clone({ font: { name: "" } });
451
728
  expect(() => el1.update()).to.throw();
452
- el1.settings = el1.settings.clone({ fontName: "Totally Real Font", lineHeight: 0 });
729
+ el1.settings = el1.settings.clone({ font: { name: "Totally Real Font" }, textHeight: 0 });
453
730
  expect(() => el1.update()).to.throw();
454
- el1.settings = el1.settings.clone({ lineHeight: 2, stackedFractionScale: 0 });
731
+ el1.settings = el1.settings.clone({ textHeight: 2, stackedFractionScale: 0 });
455
732
  expect(() => el1.update()).to.throw();
456
733
  el1.settings = el1.settings.clone({ stackedFractionScale: 0.45 });
457
734
  el1.update();
@@ -468,12 +745,56 @@ describe("AnnotationTextStyle", () => {
468
745
  expect(el0.settings.toJSON()).to.deep.equal(TextStyleSettings.defaultProps);
469
746
  });
470
747
  it("can update style via cloning", async () => {
471
- const el0 = createAnnotationTextStyle(imodel, seedDefinitionModel, "cloning", { fontName: "Totally Real Font" });
748
+ const el0 = createAnnotationTextStyle(imodel, seedDefinitionModel, "cloning", { font: { name: "Totally Real Font" } });
472
749
  const newStyle = el0.settings.clone({ isBold: true, lineSpacingFactor: 3 });
473
750
  expect(el0.settings.toJSON()).to.not.deep.equal(newStyle.toJSON());
474
751
  el0.settings = newStyle;
475
752
  expect(el0.settings.toJSON()).to.deep.equal(newStyle.toJSON());
476
753
  });
754
+ describe("versioning", () => {
755
+ function makeStyle(props) {
756
+ return AnnotationTextStyle.fromJSON({
757
+ model: "0x34",
758
+ code: {
759
+ spec: "0x56",
760
+ scope: "0x78",
761
+ value: "style"
762
+ },
763
+ classFullName: AnnotationTextStyle.classFullName,
764
+ ...props,
765
+ }, mockIModel());
766
+ }
767
+ it("throws if the JSON has no version", () => {
768
+ expect(() => makeStyle({
769
+ settings: JSON.stringify({
770
+ data: TextStyleSettings.defaultProps
771
+ }),
772
+ })).to.throw("JSON version is missing or invalid.");
773
+ });
774
+ it("throws if the JSON has no data", () => {
775
+ expect(() => makeStyle({
776
+ settings: JSON.stringify({
777
+ version: TEXT_STYLE_SETTINGS_JSON_VERSION,
778
+ }),
779
+ })).to.throw("JSON data is missing or invalid.");
780
+ });
781
+ it("throws if the JSON version is too new", () => {
782
+ expect(() => makeStyle({
783
+ settings: JSON.stringify({
784
+ version: "999.999.999",
785
+ data: TextStyleSettings.defaultProps
786
+ }),
787
+ })).to.throw(`JSON version 999.999.999 is newer than supported version ${TEXT_STYLE_SETTINGS_JSON_VERSION}. Application update required to understand data.`);
788
+ });
789
+ it("throws if the JSON version is old and cannot be migrated", () => {
790
+ expect(() => makeStyle({
791
+ settings: JSON.stringify({
792
+ version: "0.0.1",
793
+ data: TextStyleSettings.defaultProps
794
+ }),
795
+ })).to.throw(`Migration for settings from version 0.0.1 to ${TEXT_STYLE_SETTINGS_JSON_VERSION} failed.`);
796
+ });
797
+ });
477
798
  });
478
799
  describe("appendTextAnnotationGeometry", () => {
479
800
  let imodel;
@@ -486,8 +807,8 @@ describe("appendTextAnnotationGeometry", () => {
486
807
  const jobSubjectId = createJobSubjectElement(imodel, "Job").insert();
487
808
  const definitionModel = DefinitionModel.insert(imodel, jobSubjectId, "Definition");
488
809
  const { category, model } = insertDrawingModel(imodel, jobSubjectId, definitionModel);
489
- const styleId = createAnnotationTextStyle(imodel, definitionModel, "test", { fontName: "Totally Real Font", lineHeight: 0.25, isItalic: true }).insert();
490
- const differentStyleId = createAnnotationTextStyle(imodel, definitionModel, "alt", { fontName: "Karla", lineHeight: 0.5, isBold: true }).insert();
810
+ const styleId = createAnnotationTextStyle(imodel, definitionModel, "test", { font: { name: "Totally Real Font" }, textHeight: 0.25, isItalic: true }).insert();
811
+ const differentStyleId = createAnnotationTextStyle(imodel, definitionModel, "alt", { font: { name: "Karla" }, textHeight: 0.5, isBold: true }).insert();
491
812
  expect(jobSubjectId).not.to.be.undefined;
492
813
  expect(definitionModel).not.to.be.undefined;
493
814
  expect(category).not.to.be.undefined;
@@ -541,7 +862,7 @@ describe("appendTextAnnotationGeometry", () => {
541
862
  const block = TextBlock.create();
542
863
  const annotation = TextAnnotation.fromJSON({ textBlock: block.toJSON() });
543
864
  const styleId = createAnnotationTextStyle(imodel, seedDefinitionModelId, "empty anno style", {
544
- fontName: "Totally Real Font",
865
+ font: { name: "Totally Real Font" },
545
866
  frame: {
546
867
  shape: "rectangle",
547
868
  }
@@ -554,7 +875,7 @@ describe("appendTextAnnotationGeometry", () => {
554
875
  it("produces different geometry when given different text-content in annotations", () => {
555
876
  const anno1 = createAnnotation();
556
877
  const anno2 = createAnnotation();
557
- anno2.textBlock.appendRun(TextRun.create({ content: "extra", styleOverrides: { fontName: "Totally Real Font" } }));
878
+ anno2.textBlock.appendRun(TextRun.create({ content: "extra", styleOverrides: { font: { name: "Totally Real Font" } } }));
558
879
  const builder1 = runAppendTextAnnotationGeometry(anno1, seedStyleId);
559
880
  const builder2 = runAppendTextAnnotationGeometry(anno2, seedStyleId);
560
881
  expect(builder1.geometries).to.not.deep.equal(builder2.geometries);
@@ -569,12 +890,12 @@ describe("appendTextAnnotationGeometry", () => {
569
890
  });
570
891
  it("accounts for style overrides in the text", () => {
571
892
  const block = TextBlock.create();
893
+ block.styleOverrides = { margins: { left: 0, right: 1, top: 2, bottom: 3 } };
572
894
  block.appendParagraph();
573
895
  block.children[0].styleOverrides = { isBold: true };
574
896
  block.appendRun(TextRun.create({ content: "Run, Barry," }));
575
897
  block.appendParagraph();
576
898
  block.appendRun(TextRun.create({ content: " RUN!!! ", styleOverrides: { isItalic: false } }));
577
- block.margins = { left: 0, right: 1, top: 2, bottom: 3 };
578
899
  const annotation = createAnnotation(block);
579
900
  const builder = runAppendTextAnnotationGeometry(annotation, seedStyleId);
580
901
  expect(builder.textStrings.length).to.equal(2);
@@ -592,7 +913,6 @@ describe("appendTextAnnotationGeometry", () => {
592
913
  it("uses TextStyleSettings.defaults when no default style is provided", () => {
593
914
  const block = TextBlock.create();
594
915
  block.appendRun(TextRun.create({ content: "Run, Barry," }));
595
- block.margins = { left: 0, right: 1, top: 2, bottom: 3 };
596
916
  const annotation = createAnnotation(block);
597
917
  const builder = runAppendTextAnnotationGeometry(annotation, "");
598
918
  expect(builder.textStrings.length).to.equal(1);