@itwin/core-backend 5.2.0-dev.8 → 5.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 (506) hide show
  1. package/CHANGELOG.md +59 -1
  2. package/lib/cjs/BackendHubAccess.d.ts +2 -0
  3. package/lib/cjs/BackendHubAccess.d.ts.map +1 -1
  4. package/lib/cjs/BackendHubAccess.js.map +1 -1
  5. package/lib/cjs/BackendLoggerCategory.d.ts +6 -0
  6. package/lib/cjs/BackendLoggerCategory.d.ts.map +1 -1
  7. package/lib/cjs/BackendLoggerCategory.js +6 -0
  8. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  9. package/lib/cjs/BisCoreSchema.js.map +1 -1
  10. package/lib/cjs/BlobContainerService.js.map +1 -1
  11. package/lib/cjs/BriefcaseManager.d.ts +57 -3
  12. package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
  13. package/lib/cjs/BriefcaseManager.js +151 -42
  14. package/lib/cjs/BriefcaseManager.js.map +1 -1
  15. package/lib/cjs/CatalogDb.js.map +1 -1
  16. package/lib/cjs/Category.js.map +1 -1
  17. package/lib/cjs/ChangeSummaryManager.js +2 -2
  18. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  19. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  20. package/lib/cjs/ChangesetECAdaptor.js +248 -248
  21. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  22. package/lib/cjs/ChannelControl.js.map +1 -1
  23. package/lib/cjs/CheckpointManager.js.map +1 -1
  24. package/lib/cjs/ClassRegistry.js +5 -5
  25. package/lib/cjs/ClassRegistry.js.map +1 -1
  26. package/lib/cjs/CloudSqlite.d.ts +4 -0
  27. package/lib/cjs/CloudSqlite.d.ts.map +1 -1
  28. package/lib/cjs/CloudSqlite.js.map +1 -1
  29. package/lib/cjs/CodeService.js.map +1 -1
  30. package/lib/cjs/CodeSpecs.js.map +1 -1
  31. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  32. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  33. package/lib/cjs/DevTools.js.map +1 -1
  34. package/lib/cjs/DisplayStyle.js.map +1 -1
  35. package/lib/cjs/ECDb.d.ts +8 -0
  36. package/lib/cjs/ECDb.d.ts.map +1 -1
  37. package/lib/cjs/ECDb.js +22 -0
  38. package/lib/cjs/ECDb.js.map +1 -1
  39. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  40. package/lib/cjs/ECSqlStatement.js.map +1 -1
  41. package/lib/cjs/Element.js.map +1 -1
  42. package/lib/cjs/ElementAspect.js.map +1 -1
  43. package/lib/cjs/ElementGraphics.js.map +1 -1
  44. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  45. package/lib/cjs/Entity.js.map +1 -1
  46. package/lib/cjs/EntityReferences.js.map +1 -1
  47. package/lib/cjs/ExportGraphics.js.map +1 -1
  48. package/lib/cjs/ExternalSource.js.map +1 -1
  49. package/lib/cjs/FontFile.js.map +1 -1
  50. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  51. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  52. package/lib/cjs/GeometrySummary.js +47 -47
  53. package/lib/cjs/GeometrySummary.js.map +1 -1
  54. package/lib/cjs/IModelDb.d.ts +54 -3
  55. package/lib/cjs/IModelDb.d.ts.map +1 -1
  56. package/lib/cjs/IModelDb.js +96 -18
  57. package/lib/cjs/IModelDb.js.map +1 -1
  58. package/lib/cjs/IModelDbFonts.js.map +1 -1
  59. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  60. package/lib/cjs/IModelHost.d.ts +11 -1
  61. package/lib/cjs/IModelHost.d.ts.map +1 -1
  62. package/lib/cjs/IModelHost.js +5 -0
  63. package/lib/cjs/IModelHost.js.map +1 -1
  64. package/lib/cjs/IModelIncrementalSchemaLocater.d.ts +1 -5
  65. package/lib/cjs/IModelIncrementalSchemaLocater.d.ts.map +1 -1
  66. package/lib/cjs/IModelIncrementalSchemaLocater.js +0 -6
  67. package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
  68. package/lib/cjs/IModelJsFs.js.map +1 -1
  69. package/lib/cjs/ImageSourceConversion.js.map +1 -1
  70. package/lib/cjs/IpcHost.js.map +1 -1
  71. package/lib/cjs/LineStyle.js.map +1 -1
  72. package/lib/cjs/LocalHub.js +1 -1
  73. package/lib/cjs/LocalHub.js.map +1 -1
  74. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  75. package/lib/cjs/LockControl.js.map +1 -1
  76. package/lib/cjs/Material.js.map +1 -1
  77. package/lib/cjs/Model.js.map +1 -1
  78. package/lib/cjs/NativeAppStorage.js.map +1 -1
  79. package/lib/cjs/NativeHost.js.map +1 -1
  80. package/lib/cjs/NavigationRelationship.js.map +1 -1
  81. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  82. package/lib/cjs/PropertyStore.js.map +1 -1
  83. package/lib/cjs/Relationship.js.map +1 -1
  84. package/lib/cjs/RpcBackend.js.map +1 -1
  85. package/lib/cjs/SQLiteDb.js.map +1 -1
  86. package/lib/cjs/Schema.js.map +1 -1
  87. package/lib/cjs/SchemaSync.js.map +1 -1
  88. package/lib/cjs/SchemaUtils.js.map +1 -1
  89. package/lib/cjs/SheetIndex.js.map +1 -1
  90. package/lib/cjs/SqliteChangesetReader.d.ts +8 -0
  91. package/lib/cjs/SqliteChangesetReader.d.ts.map +1 -1
  92. package/lib/cjs/SqliteChangesetReader.js +11 -0
  93. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  94. package/lib/cjs/SqliteStatement.js.map +1 -1
  95. package/lib/cjs/StashManager.d.ts +175 -0
  96. package/lib/cjs/StashManager.d.ts.map +1 -0
  97. package/lib/cjs/StashManager.js +306 -0
  98. package/lib/cjs/StashManager.js.map +1 -0
  99. package/lib/cjs/Texture.js.map +1 -1
  100. package/lib/cjs/TileStorage.js.map +1 -1
  101. package/lib/cjs/TxnManager.d.ts +226 -15
  102. package/lib/cjs/TxnManager.d.ts.map +1 -1
  103. package/lib/cjs/TxnManager.js +249 -23
  104. package/lib/cjs/TxnManager.js.map +1 -1
  105. package/lib/cjs/ViewDefinition.js.map +1 -1
  106. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  107. package/lib/cjs/ViewStore.js.map +1 -1
  108. package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +17 -2
  109. package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
  110. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js +40 -6
  111. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  112. package/lib/cjs/annotations/FrameGeometry.js +6 -6
  113. package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
  114. package/lib/cjs/annotations/LeaderGeometry.d.ts +3 -2
  115. package/lib/cjs/annotations/LeaderGeometry.d.ts.map +1 -1
  116. package/lib/cjs/annotations/LeaderGeometry.js +8 -7
  117. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  118. package/lib/cjs/annotations/TextAnnotationElement.d.ts +164 -36
  119. package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
  120. package/lib/cjs/annotations/TextAnnotationElement.js +315 -105
  121. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  122. package/lib/cjs/annotations/TextAnnotationGeometry.d.ts +2 -0
  123. package/lib/cjs/annotations/TextAnnotationGeometry.d.ts.map +1 -1
  124. package/lib/cjs/annotations/TextAnnotationGeometry.js +26 -19
  125. package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
  126. package/lib/cjs/annotations/TextBlockGeometry.d.ts.map +1 -1
  127. package/lib/cjs/annotations/TextBlockGeometry.js +11 -3
  128. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
  129. package/lib/cjs/annotations/TextBlockLayout.d.ts +51 -38
  130. package/lib/cjs/annotations/TextBlockLayout.d.ts.map +1 -1
  131. package/lib/cjs/annotations/TextBlockLayout.js +252 -156
  132. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
  133. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  134. package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
  135. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
  136. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
  137. package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
  138. package/lib/cjs/core-backend.js.map +1 -1
  139. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  140. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  141. package/lib/cjs/domains/GenericElements.js.map +1 -1
  142. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  143. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
  144. package/lib/cjs/internal/ChannelAdmin.js +1 -1
  145. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  146. package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
  147. package/lib/cjs/internal/FontFileImpl.js.map +1 -1
  148. package/lib/cjs/internal/HubMock.js.map +1 -1
  149. package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
  150. package/lib/cjs/internal/NativePlatform.js.map +1 -1
  151. package/lib/cjs/internal/NoLocks.js.map +1 -1
  152. package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
  153. package/lib/cjs/internal/Symbols.d.ts +1 -0
  154. package/lib/cjs/internal/Symbols.d.ts.map +1 -1
  155. package/lib/cjs/internal/Symbols.js +2 -1
  156. package/lib/cjs/internal/Symbols.js.map +1 -1
  157. package/lib/cjs/internal/annotations/fields.d.ts +2 -12
  158. package/lib/cjs/internal/annotations/fields.d.ts.map +1 -1
  159. package/lib/cjs/internal/annotations/fields.js +50 -45
  160. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  161. package/lib/cjs/internal/cross-package.js.map +1 -1
  162. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  163. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  164. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  165. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  166. package/lib/cjs/rpc/multipart.js.map +1 -1
  167. package/lib/cjs/rpc/tracing.js.map +1 -1
  168. package/lib/cjs/rpc/web/logging.js.map +1 -1
  169. package/lib/cjs/rpc/web/request.js.map +1 -1
  170. package/lib/cjs/rpc/web/response.js.map +1 -1
  171. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  172. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  173. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  174. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  175. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  176. package/lib/cjs/workspace/Settings.js.map +1 -1
  177. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  178. package/lib/cjs/workspace/Workspace.d.ts +1 -1
  179. package/lib/cjs/workspace/Workspace.js.map +1 -1
  180. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  181. package/lib/esm/BackendHubAccess.d.ts +2 -0
  182. package/lib/esm/BackendHubAccess.d.ts.map +1 -1
  183. package/lib/esm/BackendHubAccess.js.map +1 -1
  184. package/lib/esm/BackendLoggerCategory.d.ts +6 -0
  185. package/lib/esm/BackendLoggerCategory.d.ts.map +1 -1
  186. package/lib/esm/BackendLoggerCategory.js +6 -0
  187. package/lib/esm/BackendLoggerCategory.js.map +1 -1
  188. package/lib/esm/BisCoreSchema.js.map +1 -1
  189. package/lib/esm/BlobContainerService.js.map +1 -1
  190. package/lib/esm/BriefcaseManager.d.ts +57 -3
  191. package/lib/esm/BriefcaseManager.d.ts.map +1 -1
  192. package/lib/esm/BriefcaseManager.js +152 -43
  193. package/lib/esm/BriefcaseManager.js.map +1 -1
  194. package/lib/esm/CatalogDb.js.map +1 -1
  195. package/lib/esm/Category.js.map +1 -1
  196. package/lib/esm/ChangeSummaryManager.js +2 -2
  197. package/lib/esm/ChangeSummaryManager.js.map +1 -1
  198. package/lib/esm/ChangedElementsDb.js.map +1 -1
  199. package/lib/esm/ChangesetECAdaptor.js +248 -248
  200. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  201. package/lib/esm/ChannelControl.js.map +1 -1
  202. package/lib/esm/CheckpointManager.js.map +1 -1
  203. package/lib/esm/ClassRegistry.js +5 -5
  204. package/lib/esm/ClassRegistry.js.map +1 -1
  205. package/lib/esm/CloudSqlite.d.ts +4 -0
  206. package/lib/esm/CloudSqlite.d.ts.map +1 -1
  207. package/lib/esm/CloudSqlite.js.map +1 -1
  208. package/lib/esm/CodeService.js.map +1 -1
  209. package/lib/esm/CodeSpecs.js.map +1 -1
  210. package/lib/esm/ConcurrentQuery.js.map +1 -1
  211. package/lib/esm/CustomViewState3dCreator.js.map +1 -1
  212. package/lib/esm/DevTools.js.map +1 -1
  213. package/lib/esm/DisplayStyle.js.map +1 -1
  214. package/lib/esm/ECDb.d.ts +8 -0
  215. package/lib/esm/ECDb.d.ts.map +1 -1
  216. package/lib/esm/ECDb.js +22 -0
  217. package/lib/esm/ECDb.js.map +1 -1
  218. package/lib/esm/ECSchemaXmlContext.js.map +1 -1
  219. package/lib/esm/ECSqlStatement.js.map +1 -1
  220. package/lib/esm/Element.js.map +1 -1
  221. package/lib/esm/ElementAspect.js.map +1 -1
  222. package/lib/esm/ElementGraphics.js.map +1 -1
  223. package/lib/esm/ElementTreeWalker.js.map +1 -1
  224. package/lib/esm/Entity.js.map +1 -1
  225. package/lib/esm/EntityReferences.js.map +1 -1
  226. package/lib/esm/ExportGraphics.js.map +1 -1
  227. package/lib/esm/ExternalSource.js.map +1 -1
  228. package/lib/esm/FontFile.js.map +1 -1
  229. package/lib/esm/GeoCoordConfig.js.map +1 -1
  230. package/lib/esm/GeographicCRSServices.js.map +1 -1
  231. package/lib/esm/GeometrySummary.js +47 -47
  232. package/lib/esm/GeometrySummary.js.map +1 -1
  233. package/lib/esm/IModelDb.d.ts +54 -3
  234. package/lib/esm/IModelDb.d.ts.map +1 -1
  235. package/lib/esm/IModelDb.js +97 -19
  236. package/lib/esm/IModelDb.js.map +1 -1
  237. package/lib/esm/IModelDbFonts.js.map +1 -1
  238. package/lib/esm/IModelElementCloneContext.js.map +1 -1
  239. package/lib/esm/IModelHost.d.ts +11 -1
  240. package/lib/esm/IModelHost.d.ts.map +1 -1
  241. package/lib/esm/IModelHost.js +5 -0
  242. package/lib/esm/IModelHost.js.map +1 -1
  243. package/lib/esm/IModelIncrementalSchemaLocater.d.ts +1 -5
  244. package/lib/esm/IModelIncrementalSchemaLocater.d.ts.map +1 -1
  245. package/lib/esm/IModelIncrementalSchemaLocater.js +0 -6
  246. package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
  247. package/lib/esm/IModelJsFs.js.map +1 -1
  248. package/lib/esm/ImageSourceConversion.js.map +1 -1
  249. package/lib/esm/IpcHost.js.map +1 -1
  250. package/lib/esm/LineStyle.js.map +1 -1
  251. package/lib/esm/LocalHub.js +1 -1
  252. package/lib/esm/LocalHub.js.map +1 -1
  253. package/lib/esm/LocalhostIpcHost.js.map +1 -1
  254. package/lib/esm/LockControl.js.map +1 -1
  255. package/lib/esm/Material.js.map +1 -1
  256. package/lib/esm/Model.js.map +1 -1
  257. package/lib/esm/NativeAppStorage.js.map +1 -1
  258. package/lib/esm/NativeHost.js.map +1 -1
  259. package/lib/esm/NavigationRelationship.js.map +1 -1
  260. package/lib/esm/PromiseMemoizer.js.map +1 -1
  261. package/lib/esm/PropertyStore.js.map +1 -1
  262. package/lib/esm/Relationship.js.map +1 -1
  263. package/lib/esm/RpcBackend.js.map +1 -1
  264. package/lib/esm/SQLiteDb.js.map +1 -1
  265. package/lib/esm/Schema.js.map +1 -1
  266. package/lib/esm/SchemaSync.js.map +1 -1
  267. package/lib/esm/SchemaUtils.js.map +1 -1
  268. package/lib/esm/SheetIndex.js.map +1 -1
  269. package/lib/esm/SqliteChangesetReader.d.ts +8 -0
  270. package/lib/esm/SqliteChangesetReader.d.ts.map +1 -1
  271. package/lib/esm/SqliteChangesetReader.js +11 -0
  272. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  273. package/lib/esm/SqliteStatement.js.map +1 -1
  274. package/lib/esm/StashManager.d.ts +175 -0
  275. package/lib/esm/StashManager.d.ts.map +1 -0
  276. package/lib/esm/StashManager.js +301 -0
  277. package/lib/esm/StashManager.js.map +1 -0
  278. package/lib/esm/Texture.js.map +1 -1
  279. package/lib/esm/TileStorage.js.map +1 -1
  280. package/lib/esm/TxnManager.d.ts +226 -15
  281. package/lib/esm/TxnManager.d.ts.map +1 -1
  282. package/lib/esm/TxnManager.js +247 -21
  283. package/lib/esm/TxnManager.js.map +1 -1
  284. package/lib/esm/ViewDefinition.js.map +1 -1
  285. package/lib/esm/ViewStateHydrator.js.map +1 -1
  286. package/lib/esm/ViewStore.js.map +1 -1
  287. package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +17 -2
  288. package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
  289. package/lib/esm/annotations/ElementDrivesTextAnnotation.js +38 -5
  290. package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  291. package/lib/esm/annotations/FrameGeometry.js +6 -6
  292. package/lib/esm/annotations/FrameGeometry.js.map +1 -1
  293. package/lib/esm/annotations/LeaderGeometry.d.ts +3 -2
  294. package/lib/esm/annotations/LeaderGeometry.d.ts.map +1 -1
  295. package/lib/esm/annotations/LeaderGeometry.js +8 -7
  296. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  297. package/lib/esm/annotations/TextAnnotationElement.d.ts +164 -36
  298. package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
  299. package/lib/esm/annotations/TextAnnotationElement.js +317 -108
  300. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  301. package/lib/esm/annotations/TextAnnotationGeometry.d.ts +2 -0
  302. package/lib/esm/annotations/TextAnnotationGeometry.d.ts.map +1 -1
  303. package/lib/esm/annotations/TextAnnotationGeometry.js +26 -19
  304. package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
  305. package/lib/esm/annotations/TextBlockGeometry.d.ts.map +1 -1
  306. package/lib/esm/annotations/TextBlockGeometry.js +11 -3
  307. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
  308. package/lib/esm/annotations/TextBlockLayout.d.ts +51 -38
  309. package/lib/esm/annotations/TextBlockLayout.d.ts.map +1 -1
  310. package/lib/esm/annotations/TextBlockLayout.js +253 -157
  311. package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
  312. package/lib/esm/core-backend.js.map +1 -1
  313. package/lib/esm/domains/FunctionalElements.js.map +1 -1
  314. package/lib/esm/domains/FunctionalSchema.js.map +1 -1
  315. package/lib/esm/domains/GenericElements.js.map +1 -1
  316. package/lib/esm/domains/GenericSchema.js.map +1 -1
  317. package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
  318. package/lib/esm/internal/ChannelAdmin.js +1 -1
  319. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  320. package/lib/esm/internal/ElementLRUCache.js.map +1 -1
  321. package/lib/esm/internal/FontFileImpl.js.map +1 -1
  322. package/lib/esm/internal/HubMock.js.map +1 -1
  323. package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
  324. package/lib/esm/internal/NativePlatform.js.map +1 -1
  325. package/lib/esm/internal/NoLocks.js.map +1 -1
  326. package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
  327. package/lib/esm/internal/Symbols.d.ts +1 -0
  328. package/lib/esm/internal/Symbols.d.ts.map +1 -1
  329. package/lib/esm/internal/Symbols.js +1 -0
  330. package/lib/esm/internal/Symbols.js.map +1 -1
  331. package/lib/esm/internal/annotations/fields.d.ts +2 -12
  332. package/lib/esm/internal/annotations/fields.d.ts.map +1 -1
  333. package/lib/esm/internal/annotations/fields.js +52 -47
  334. package/lib/esm/internal/annotations/fields.js.map +1 -1
  335. package/lib/esm/internal/cross-package.js.map +1 -1
  336. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  337. package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  338. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  339. package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  340. package/lib/esm/rpc/multipart.js.map +1 -1
  341. package/lib/esm/rpc/tracing.js.map +1 -1
  342. package/lib/esm/rpc/web/logging.js.map +1 -1
  343. package/lib/esm/rpc/web/request.js.map +1 -1
  344. package/lib/esm/rpc/web/response.js.map +1 -1
  345. package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  346. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  347. package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  348. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  349. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  350. package/lib/esm/test/AdvancedEqual.js.map +1 -1
  351. package/lib/esm/test/AnnotationTestUtils.d.ts +5 -1
  352. package/lib/esm/test/AnnotationTestUtils.d.ts.map +1 -1
  353. package/lib/esm/test/AnnotationTestUtils.js +7 -2
  354. package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
  355. package/lib/esm/test/AttachDb.test.js +11 -11
  356. package/lib/esm/test/AttachDb.test.js.map +1 -1
  357. package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
  358. package/lib/esm/test/GeometryTestUtil.js.map +1 -1
  359. package/lib/esm/test/IModelHost.test.js.map +1 -1
  360. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  361. package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
  362. package/lib/esm/test/IpcHost.test.js.map +1 -1
  363. package/lib/esm/test/KnownTestLocations.js.map +1 -1
  364. package/lib/esm/test/PrintElementTree.js.map +1 -1
  365. package/lib/esm/test/PropertyDb.test.js.map +1 -1
  366. package/lib/esm/test/RevisionUtility.js.map +1 -1
  367. package/lib/esm/test/SchemaUtils.test.js +25 -25
  368. package/lib/esm/test/SchemaUtils.test.js.map +1 -1
  369. package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
  370. package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
  371. package/lib/esm/test/TestUtils.js.map +1 -1
  372. package/lib/esm/test/annotations/Fields.test.js +338 -126
  373. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  374. package/lib/esm/test/annotations/FrameGeometry.test.js +4 -4
  375. package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
  376. package/lib/esm/test/annotations/LeaderGeometry.test.js +19 -17
  377. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  378. package/lib/esm/test/annotations/TextAnnotation.test.js +636 -60
  379. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  380. package/lib/esm/test/annotations/TextBlock.test.js +627 -193
  381. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
  382. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
  383. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.d.ts +46 -0
  384. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.d.ts.map +1 -1
  385. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js +20 -2
  386. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
  387. package/lib/esm/test/categories/Category.test.js.map +1 -1
  388. package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
  389. package/lib/esm/test/ecdb/CTE.test.js +88 -88
  390. package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
  391. package/lib/esm/test/ecdb/ConcurrentQuery.test.js +15 -15
  392. package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
  393. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
  394. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
  395. package/lib/esm/test/ecdb/ECDb.test.js +128 -58
  396. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  397. package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
  398. package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
  399. package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
  400. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  401. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  402. package/lib/esm/test/ecdb/ECSqlReader.test.js +16 -16
  403. package/lib/esm/test/ecdb/ECSqlReader.test.js.map +1 -1
  404. package/lib/esm/test/ecdb/ECSqlStatement.test.js +326 -326
  405. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  406. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  407. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  408. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
  409. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  410. package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
  411. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  412. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  413. package/lib/esm/test/element/ElementAspect.test.js +22 -22
  414. package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
  415. package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
  416. package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
  417. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  418. package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
  419. package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
  420. package/lib/esm/test/element/NullStructArray.test.js +13 -13
  421. package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
  422. package/lib/esm/test/element/UrlLink.test.js.map +1 -1
  423. package/lib/esm/test/font/FontFile.test.js.map +1 -1
  424. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  425. package/lib/esm/test/hubaccess/ApplyChangeset.test.js +32 -32
  426. package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
  427. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  428. package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
  429. package/lib/esm/test/hubaccess/Rebase.test.d.ts +2 -0
  430. package/lib/esm/test/hubaccess/Rebase.test.d.ts.map +1 -0
  431. package/lib/esm/test/hubaccess/Rebase.test.js +680 -0
  432. package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -0
  433. package/lib/esm/test/imageData.js.map +1 -1
  434. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  435. package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
  436. package/lib/esm/test/imodel/IModel.test.js +44 -44
  437. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  438. package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
  439. package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
  440. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js +20 -20
  441. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
  442. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js +3 -3
  443. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
  444. package/lib/esm/test/incrementalSchemaLocater/utils/IModelSchemaLocater.js.map +1 -1
  445. package/lib/esm/test/incrementalSchemaLocater/utils/IncrementalTestHelper.js.map +1 -1
  446. package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.d.ts +16 -1
  447. package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.d.ts.map +1 -1
  448. package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.js +47 -0
  449. package/lib/esm/test/incrementalSchemaLocater/utils/TestSqlSchemaLocater.js.map +1 -1
  450. package/lib/esm/test/index.js.map +1 -1
  451. package/lib/esm/test/misc/DevTools.test.js.map +1 -1
  452. package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
  453. package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
  454. package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
  455. package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
  456. package/lib/esm/test/rpc/response.test.js.map +1 -1
  457. package/lib/esm/test/schema/ClassRegistry.test.js +99 -99
  458. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  459. package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
  460. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  461. package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
  462. package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
  463. package/lib/esm/test/standalone/ChangeMerge.test.js +15 -19
  464. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  465. package/lib/esm/test/standalone/ChangesetReader.test.js +248 -118
  466. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  467. package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
  468. package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
  469. package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
  470. package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
  471. package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
  472. package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
  473. package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
  474. package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
  475. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  476. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  477. package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
  478. package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
  479. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  480. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
  481. package/lib/esm/test/standalone/MergeConflict.test.js +3 -3
  482. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  483. package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
  484. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  485. package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
  486. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  487. package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
  488. package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
  489. package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
  490. package/lib/esm/test/standalone/Setting.test.js.map +1 -1
  491. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  492. package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
  493. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  494. package/lib/esm/test/standalone/Texture.test.js.map +1 -1
  495. package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
  496. package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
  497. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  498. package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
  499. package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
  500. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  501. package/lib/esm/workspace/Settings.js.map +1 -1
  502. package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
  503. package/lib/esm/workspace/Workspace.d.ts +1 -1
  504. package/lib/esm/workspace/Workspace.js.map +1 -1
  505. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  506. package/package.json +14 -14
@@ -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";
@@ -15,7 +15,11 @@ import { DrawingCategory, SpatialCategory } from "../../Category";
15
15
  import { DisplayStyle2d, DisplayStyle3d } from "../../DisplayStyle";
16
16
  import { CategorySelector, DrawingViewDefinition, ModelSelector, SpatialViewDefinition } from "../../ViewDefinition";
17
17
  import { FontFile } from "../../FontFile";
18
- import { computeTextRangeAsStringLength } from "../AnnotationTestUtils";
18
+ import { computeTextRangeAsStringLength, MockBuilder } from "../AnnotationTestUtils";
19
+ import { TextAnnotationUsesTextStyleByDefault } from "../../annotations/ElementDrivesTextAnnotation";
20
+ import { layoutTextBlock, TextStyleResolver } from "../../annotations/TextBlockLayout";
21
+ import { appendTextAnnotationGeometry } from "../../annotations/TextAnnotationGeometry";
22
+ import { IModelElementCloneContext } from "../../IModelElementCloneContext";
19
23
  function mockIModel() {
20
24
  const iModel = {
21
25
  fonts: {
@@ -26,13 +30,14 @@ function mockIModel() {
26
30
  };
27
31
  return iModel;
28
32
  }
29
- function createAnnotation(styleId) {
30
- const styleOverrides = { fontName: "Karla" };
31
- const block = TextBlock.create({ styleId: styleId ?? "0x42", styleOverrides });
32
- block.appendRun(TextRun.create({ content: "Run, Barry,", styleOverrides }));
33
- block.appendRun(TextRun.create({ content: " RUN!!! ", styleOverrides }));
34
- block.appendRun(FractionRun.create({ numerator: "Harrison", denominator: "Wells", styleOverrides }));
35
- block.margins = { left: 0, right: 1, top: 2, bottom: 3 };
33
+ function createAnnotation(textBlock) {
34
+ const styleOverrides = { font: { name: "Karla" }, margins: { left: 0, right: 1, top: 2, bottom: 3 } };
35
+ const block = textBlock ?? TextBlock.create({ styleOverrides });
36
+ if (!textBlock) {
37
+ block.appendRun(TextRun.create({ content: "Run, Barry,", styleOverrides }));
38
+ block.appendRun(TextRun.create({ content: " RUN!!! ", styleOverrides }));
39
+ block.appendRun(FractionRun.create({ numerator: "Harrison", denominator: "Wells", styleOverrides }));
40
+ }
36
41
  const annotation = TextAnnotation.fromJSON({ textBlock: block.toJSON() });
37
42
  annotation.anchor = { vertical: "middle", horizontal: "right" };
38
43
  annotation.orientation = YawPitchRollAngles.createDegrees(1, 0, -1);
@@ -78,9 +83,34 @@ const createIModel = async (name) => {
78
83
  });
79
84
  return iModel;
80
85
  };
81
- const createAnnotationTextStyle = (iModel, definitionModel, name, settings = TextStyleSettings.defaultProps) => {
82
- 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
+ });
83
93
  };
94
+ function createElement2d(imodel, createArgs) {
95
+ const placement = {
96
+ origin: { x: 0, y: 0 },
97
+ angle: Angle.createDegrees(0).toJSON(),
98
+ };
99
+ return TextAnnotation2d.create(imodel, {
100
+ ...createArgs,
101
+ placement,
102
+ });
103
+ }
104
+ function createElement3d(imodel, createArgs) {
105
+ const placement = {
106
+ origin: { x: 0, y: 0, z: 0 },
107
+ angles: YawPitchRollAngles.createDegrees(0, 0, 0).toJSON(),
108
+ };
109
+ return TextAnnotation3d.create(imodel, {
110
+ ...createArgs,
111
+ placement,
112
+ });
113
+ }
84
114
  describe("TextAnnotation element", () => {
85
115
  function makeElement(props) {
86
116
  return TextAnnotation2d.fromJSON({
@@ -95,25 +125,76 @@ describe("TextAnnotation element", () => {
95
125
  origin: { x: 0, y: 0 },
96
126
  angle: 0,
97
127
  },
128
+ defaultTextStyle: new TextAnnotationUsesTextStyleByDefault("0x21").toJSON(),
98
129
  ...props,
99
130
  }, mockIModel());
100
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
+ });
101
170
  describe("getAnnotation", () => {
102
171
  it("returns undefined if not provided", () => {
103
172
  expect(makeElement().getAnnotation()).to.be.undefined;
104
173
  });
105
174
  it("converts JSON string to class instance", () => {
106
175
  const elem = makeElement({
107
- textAnnotationData: JSON.stringify({ textBlock: TextBlock.create({ styleId: "0x42" }).toJSON() })
176
+ textAnnotationData: JSON.stringify({
177
+ version: TEXT_ANNOTATION_JSON_VERSION,
178
+ data: {
179
+ textBlock: TextBlock.create().toJSON()
180
+ }
181
+ }),
182
+ defaultTextStyle: new TextAnnotationUsesTextStyleByDefault("0x42").toJSON()
108
183
  });
109
184
  const anno = elem.getAnnotation();
110
185
  expect(anno).not.to.be.undefined;
111
186
  expect(anno.textBlock.isEmpty).to.be.true;
112
- expect(anno.textBlock.styleId).to.equal("0x42");
187
+ expect(elem.defaultTextStyle).not.to.be.undefined;
188
+ expect(elem.defaultTextStyle.id).to.equal("0x42");
113
189
  });
114
190
  it("produces a new object each time it is called", () => {
115
191
  const elem = makeElement({
116
- textAnnotationData: JSON.stringify({ textBlock: TextBlock.create({ styleId: "0x42" }).toJSON() })
192
+ textAnnotationData: JSON.stringify({
193
+ version: TEXT_ANNOTATION_JSON_VERSION,
194
+ data: {
195
+ textBlock: TextBlock.create().toJSON()
196
+ }
197
+ }),
117
198
  });
118
199
  const anno1 = elem.getAnnotation();
119
200
  const anno2 = elem.getAnnotation();
@@ -124,7 +205,7 @@ describe("TextAnnotation element", () => {
124
205
  describe("setAnnotation", () => {
125
206
  it("updates properties", () => {
126
207
  const elem = makeElement();
127
- const textBlock = TextBlock.create({ styleId: "0x42" });
208
+ const textBlock = TextBlock.create();
128
209
  textBlock.appendRun(TextRun.create({ content: "text" }));
129
210
  const annotation = TextAnnotation.fromJSON({ textBlock: textBlock.toJSON() });
130
211
  elem.setAnnotation(annotation);
@@ -132,35 +213,78 @@ describe("TextAnnotation element", () => {
132
213
  expect(elem.getAnnotation().toJSON()).not.to.equal(annotation.toJSON());
133
214
  });
134
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
+ });
135
268
  describe("TextAnnotation3d Persistence", () => {
136
269
  let imodel;
137
- let seedCategoryId;
138
- let seedModelId;
139
- let seedStyleId;
270
+ let createElement3dArgs;
140
271
  before(async () => {
141
272
  imodel = await createIModel("TextAnnotation3d");
142
273
  const jobSubjectId = createJobSubjectElement(imodel, "Job").insert();
143
274
  const definitionModel = DefinitionModel.insert(imodel, jobSubjectId, "Definition");
144
275
  const { category, model } = insertSpatialModel(imodel, jobSubjectId, definitionModel);
145
- 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();
146
277
  expect(jobSubjectId).not.to.be.undefined;
147
278
  expect(category).not.to.be.undefined;
148
279
  expect(model).not.to.be.undefined;
149
280
  expect(styleId).not.to.be.undefined;
150
- seedCategoryId = category;
151
- seedModelId = model;
152
- seedStyleId = styleId;
281
+ createElement3dArgs = { category, model };
153
282
  });
154
283
  after(() => imodel.close());
155
- function createElement3d(createArgs) {
156
- return TextAnnotation3d.create(imodel, seedCategoryId, seedModelId, {
157
- origin: { x: 0, y: 0, z: 0 },
158
- angles: YawPitchRollAngles.createDegrees(0, 0, 0).toJSON(),
159
- }, createArgs?.textAnnotationData);
160
- }
161
284
  it("creating element does not automatically compute the geometry", () => {
162
285
  const annotation = createAnnotation();
163
- const el = createElement3d({ textAnnotationData: annotation.toJSON() });
286
+ const args = { ...createElement3dArgs, textAnnotationProps: annotation.toJSON() };
287
+ const el = createElement3d(imodel, args);
164
288
  expect(el.getAnnotation().equals(annotation)).to.be.true;
165
289
  expect(el.geom).to.be.undefined;
166
290
  });
@@ -175,7 +299,7 @@ describe("TextAnnotation element", () => {
175
299
  }
176
300
  describe("inserts 3d element and round-trips through JSON", async () => {
177
301
  async function test(annotation) {
178
- const el0 = createElement3d();
302
+ const el0 = createElement3d(imodel, { ...createElement3dArgs });
179
303
  if (annotation) {
180
304
  el0.setAnnotation(annotation);
181
305
  }
@@ -198,42 +322,30 @@ describe("TextAnnotation element", () => {
198
322
  }
199
323
  }
200
324
  it("roundtrips an empty annotation", async () => { await test(); });
201
- it("roundtrips an annotation with a style", async () => { await test(TextAnnotation.fromJSON({ textBlock: { styleId: seedStyleId } })); });
202
325
  it("roundtrips an annotation with a textBlock", async () => { await test(createAnnotation()); });
203
326
  });
204
327
  });
205
328
  describe("TextAnnotation2d Persistence", () => {
206
329
  let imodel;
207
- let seedCategoryId;
208
- let seedModelId;
209
- let seedStyleId;
330
+ let createElement2dArgs;
210
331
  before(async () => {
211
332
  imodel = await createIModel("TextAnnotation2d");
212
333
  const jobSubjectId = createJobSubjectElement(imodel, "Job").insert();
213
334
  const definitionModel = DefinitionModel.insert(imodel, jobSubjectId, "Definition");
214
335
  const { category, model } = insertDrawingModel(imodel, jobSubjectId, definitionModel);
215
- const styleId = createAnnotationTextStyle(imodel, definitionModel, "test", { fontName: "Totally Real Font", lineHeight: 0.25, isItalic: true }).insert();
216
336
  expect(jobSubjectId).not.to.be.undefined;
217
337
  expect(category).not.to.be.undefined;
218
338
  expect(model).not.to.be.undefined;
219
- expect(styleId).not.to.be.undefined;
220
- seedCategoryId = category;
221
- seedModelId = model;
222
- seedStyleId = styleId;
339
+ createElement2dArgs = { category, model };
223
340
  });
224
341
  after(() => {
225
342
  imodel.saveChanges("tests");
226
343
  imodel.close();
227
344
  });
228
- function createElement2d(createArgs) {
229
- return TextAnnotation2d.create(imodel, seedCategoryId, seedModelId, {
230
- origin: { x: 0, y: 0 },
231
- angle: Angle.createDegrees(0).toJSON(),
232
- }, createArgs?.textAnnotationData);
233
- }
234
345
  it("creating element does not automatically compute the geometry", () => {
235
346
  const annotation = createAnnotation();
236
- const el = createElement2d({ textAnnotationData: annotation.toJSON() });
347
+ const args = { ...createElement2dArgs, textAnnotationProps: annotation.toJSON() };
348
+ const el = createElement2d(imodel, args);
237
349
  expect(el.getAnnotation().equals(annotation)).to.be.true;
238
350
  expect(el.geom).to.be.undefined;
239
351
  });
@@ -245,7 +357,7 @@ describe("TextAnnotation element", () => {
245
357
  }
246
358
  describe("inserts 2d element and round-trips through JSON", async () => {
247
359
  async function test(annotation) {
248
- const el0 = createElement2d();
360
+ const el0 = createElement2d(imodel, createElement2dArgs);
249
361
  if (annotation) {
250
362
  el0.setAnnotation(annotation);
251
363
  }
@@ -265,13 +377,299 @@ describe("TextAnnotation element", () => {
265
377
  expect(anno).not.to.be.undefined;
266
378
  expect(anno.equals(annotation)).to.be.true;
267
379
  expect(el0.toJSON().elementGeometryBuilderParams).not.to.be.undefined;
380
+ expect(el0.toJSON().elementGeometryBuilderParams).to.deep.equal(el1.toJSON().elementGeometryBuilderParams);
268
381
  }
269
382
  }
270
383
  it("roundtrips an empty annotation", async () => { await test(); });
271
- it("roundtrips an annotation with a style", async () => { await test(TextAnnotation.fromJSON({ textBlock: { styleId: seedStyleId } })); });
272
384
  it("roundtrips an annotation with a textBlock", async () => { await test(createAnnotation()); });
273
385
  });
274
386
  });
387
+ describe("defaultTextStyle", () => {
388
+ let imodel;
389
+ let seedSubjectId;
390
+ let seedDefinitionModelId;
391
+ let seedStyleId;
392
+ let seedStyleId2;
393
+ before(async () => {
394
+ imodel = await createIModel("DefaultTextStyle");
395
+ const jobSubjectId = createJobSubjectElement(imodel, "Job").insert();
396
+ const definitionModel = DefinitionModel.insert(imodel, jobSubjectId, "Definition");
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();
399
+ expect(jobSubjectId).not.to.be.undefined;
400
+ expect(definitionModel).not.to.be.undefined;
401
+ expect(styleId).not.to.be.undefined;
402
+ expect(differentStyleId).not.to.be.undefined;
403
+ seedSubjectId = jobSubjectId;
404
+ seedDefinitionModelId = definitionModel;
405
+ seedStyleId = styleId;
406
+ seedStyleId2 = differentStyleId;
407
+ });
408
+ after(() => {
409
+ imodel.saveChanges("tests");
410
+ imodel.close();
411
+ });
412
+ describe("TextAnnotation2d", () => {
413
+ let createElement2dArgs;
414
+ before(() => {
415
+ const { category, model } = insertDrawingModel(imodel, seedSubjectId, seedDefinitionModelId);
416
+ expect(category).not.to.be.undefined;
417
+ expect(model).not.to.be.undefined;
418
+ createElement2dArgs = { category, model };
419
+ });
420
+ it("preserves defaultTextStyle after round trip", () => {
421
+ const annotation = createAnnotation();
422
+ const args = { ...createElement2dArgs, textAnnotationProps: annotation.toJSON(), defaultTextStyleId: seedStyleId };
423
+ const el0 = createElement2d(imodel, args);
424
+ expect(el0.defaultTextStyle).not.to.be.undefined;
425
+ expect(el0.defaultTextStyle.id).to.equal(seedStyleId);
426
+ el0.insert();
427
+ const el1 = imodel.elements.getElement(el0.id);
428
+ expect(el1).not.to.be.undefined;
429
+ expect(el1.defaultTextStyle).not.to.be.undefined;
430
+ expect(el1.defaultTextStyle.id).to.equal(seedStyleId);
431
+ expect(el0.toJSON().elementGeometryBuilderParams).to.deep.equal(el1.toJSON().elementGeometryBuilderParams);
432
+ });
433
+ it("produces different geometry when defaultTextStyle changes", () => {
434
+ const annotation = createAnnotation();
435
+ const args = { ...createElement2dArgs, textAnnotationProps: annotation.toJSON() };
436
+ const el0 = createElement2d(imodel, args);
437
+ el0.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault(seedStyleId);
438
+ const geom1 = el0.toJSON().elementGeometryBuilderParams;
439
+ el0.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault(seedStyleId2);
440
+ const geom2 = el0.toJSON().elementGeometryBuilderParams;
441
+ expect(geom1).not.to.deep.equal(geom2);
442
+ });
443
+ it("allows defaultTextStyle to be undefined", () => {
444
+ const annotation = createAnnotation();
445
+ const args = { ...createElement2dArgs, textAnnotationProps: annotation.toJSON() };
446
+ const el0 = createElement2d(imodel, args);
447
+ el0.defaultTextStyle = undefined;
448
+ const elId = el0.insert();
449
+ expect(Id64.isValidId64(elId)).to.be.true;
450
+ const el1 = imodel.elements.getElement(elId);
451
+ expect(el1).not.to.be.undefined;
452
+ expect(el1 instanceof TextAnnotation2d).to.be.true;
453
+ expect(el1.defaultTextStyle).to.be.undefined;
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
+ });
627
+ });
628
+ describe("TextAnnotation3d", () => {
629
+ let createElement3dArgs;
630
+ before(() => {
631
+ const { category, model } = insertSpatialModel(imodel, seedSubjectId, seedDefinitionModelId);
632
+ expect(category).not.to.be.undefined;
633
+ expect(model).not.to.be.undefined;
634
+ createElement3dArgs = { category, model };
635
+ });
636
+ it("preserves defaultTextStyle after round trip", () => {
637
+ const annotation = createAnnotation();
638
+ const args = { ...createElement3dArgs, textAnnotationProps: annotation.toJSON(), defaultTextStyleId: seedStyleId };
639
+ const el0 = createElement3d(imodel, args);
640
+ expect(el0.defaultTextStyle).not.to.be.undefined;
641
+ expect(el0.defaultTextStyle.id).to.equal(seedStyleId);
642
+ el0.insert();
643
+ const el1 = imodel.elements.getElement(el0.id);
644
+ expect(el1).not.to.be.undefined;
645
+ expect(el1.defaultTextStyle).not.to.be.undefined;
646
+ expect(el1.defaultTextStyle.id).to.equal(seedStyleId);
647
+ expect(el0.toJSON().elementGeometryBuilderParams).to.deep.equal(el1.toJSON().elementGeometryBuilderParams);
648
+ });
649
+ it("produces different geometry when defaultTextStyle changes", () => {
650
+ const annotation = createAnnotation();
651
+ const args = { ...createElement3dArgs, textAnnotationProps: annotation.toJSON() };
652
+ const el0 = createElement3d(imodel, args);
653
+ el0.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault(seedStyleId);
654
+ const geom1 = el0.toJSON().elementGeometryBuilderParams;
655
+ el0.defaultTextStyle = new TextAnnotationUsesTextStyleByDefault(seedStyleId2);
656
+ const geom2 = el0.toJSON().elementGeometryBuilderParams;
657
+ expect(geom1).not.to.deep.equal(geom2);
658
+ });
659
+ it("allows defaultTextStyle to be undefined", () => {
660
+ const annotation = createAnnotation();
661
+ const args = { ...createElement3dArgs, textAnnotationProps: annotation.toJSON() };
662
+ const el0 = createElement3d(imodel, args);
663
+ el0.defaultTextStyle = undefined;
664
+ const elId = el0.insert();
665
+ expect(Id64.isValidId64(elId)).to.be.true;
666
+ const el1 = imodel.elements.getElement(elId);
667
+ expect(el1).not.to.be.undefined;
668
+ expect(el1 instanceof TextAnnotation3d).to.be.true;
669
+ expect(el1.defaultTextStyle).to.be.undefined;
670
+ });
671
+ });
672
+ });
275
673
  });
276
674
  describe("AnnotationTextStyle", () => {
277
675
  let imodel;
@@ -291,9 +689,9 @@ describe("AnnotationTextStyle", () => {
291
689
  });
292
690
  it("inserts a style and round-trips through JSON", async () => {
293
691
  const textStyle = TextStyleSettings.fromJSON({
294
- fontName: "Totally Real Font",
692
+ font: { name: "Totally Real Font" },
295
693
  isUnderlined: true,
296
- lineHeight: 0.5
694
+ textHeight: 0.5
297
695
  });
298
696
  const el0 = createAnnotationTextStyle(imodel, seedDefinitionModel, "round-trip", textStyle.toJSON());
299
697
  const elId = el0.insert();
@@ -310,27 +708,27 @@ describe("AnnotationTextStyle", () => {
310
708
  let annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "default");
311
709
  expect(() => annotationTextStyle.insert()).to.throw();
312
710
  // font is required
313
- annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "no font", { fontName: "" });
711
+ annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "no font", { font: { name: "" } });
314
712
  expect(() => annotationTextStyle.insert()).to.throw();
315
- // lineHeight should be positive
316
- 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 });
317
715
  expect(() => annotationTextStyle.insert()).to.throw();
318
716
  // stackedFractionScale should be positive
319
- 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 });
320
718
  expect(() => annotationTextStyle.insert()).to.throw();
321
719
  });
322
720
  it("does not allow updating of elements to invalid styles", async () => {
323
- const annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "valid style", { fontName: "Totally Real Font" });
721
+ const annotationTextStyle = createAnnotationTextStyle(imodel, seedDefinitionModel, "valid style", { font: { name: "Totally Real Font" } });
324
722
  const elId = annotationTextStyle.insert();
325
723
  expect(Id64.isValidId64(elId)).to.be.true;
326
724
  const el1 = imodel.elements.getElement(elId);
327
725
  expect(el1).not.to.be.undefined;
328
726
  expect(el1 instanceof AnnotationTextStyle).to.be.true;
329
- el1.settings = el1.settings.clone({ fontName: "" });
727
+ el1.settings = el1.settings.clone({ font: { name: "" } });
330
728
  expect(() => el1.update()).to.throw();
331
- el1.settings = el1.settings.clone({ fontName: "Totally Real Font", lineHeight: 0 });
729
+ el1.settings = el1.settings.clone({ font: { name: "Totally Real Font" }, textHeight: 0 });
332
730
  expect(() => el1.update()).to.throw();
333
- el1.settings = el1.settings.clone({ lineHeight: 2, stackedFractionScale: 0 });
731
+ el1.settings = el1.settings.clone({ textHeight: 2, stackedFractionScale: 0 });
334
732
  expect(() => el1.update()).to.throw();
335
733
  el1.settings = el1.settings.clone({ stackedFractionScale: 0.45 });
336
734
  el1.update();
@@ -347,11 +745,189 @@ describe("AnnotationTextStyle", () => {
347
745
  expect(el0.settings.toJSON()).to.deep.equal(TextStyleSettings.defaultProps);
348
746
  });
349
747
  it("can update style via cloning", async () => {
350
- const el0 = createAnnotationTextStyle(imodel, seedDefinitionModel, "cloning", { fontName: "Totally Real Font" });
748
+ const el0 = createAnnotationTextStyle(imodel, seedDefinitionModel, "cloning", { font: { name: "Totally Real Font" } });
351
749
  const newStyle = el0.settings.clone({ isBold: true, lineSpacingFactor: 3 });
352
750
  expect(el0.settings.toJSON()).to.not.deep.equal(newStyle.toJSON());
353
751
  el0.settings = newStyle;
354
752
  expect(el0.settings.toJSON()).to.deep.equal(newStyle.toJSON());
355
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
+ });
798
+ });
799
+ describe("appendTextAnnotationGeometry", () => {
800
+ let imodel;
801
+ let seedDefinitionModelId;
802
+ let seedCategoryId;
803
+ let seedStyleId;
804
+ let seedStyleId2;
805
+ before(async () => {
806
+ imodel = await createIModel("DefaultTextStyle");
807
+ const jobSubjectId = createJobSubjectElement(imodel, "Job").insert();
808
+ const definitionModel = DefinitionModel.insert(imodel, jobSubjectId, "Definition");
809
+ const { category, model } = insertDrawingModel(imodel, jobSubjectId, definitionModel);
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();
812
+ expect(jobSubjectId).not.to.be.undefined;
813
+ expect(definitionModel).not.to.be.undefined;
814
+ expect(category).not.to.be.undefined;
815
+ expect(model).not.to.be.undefined;
816
+ expect(styleId).not.to.be.undefined;
817
+ expect(differentStyleId).not.to.be.undefined;
818
+ seedDefinitionModelId = definitionModel;
819
+ seedCategoryId = category;
820
+ seedStyleId = styleId;
821
+ seedStyleId2 = differentStyleId;
822
+ });
823
+ function runAppendTextAnnotationGeometry(annotation, styleId, scaleFactor = 1) {
824
+ const builder = new MockBuilder();
825
+ const resolver = new TextStyleResolver({
826
+ textBlock: annotation.textBlock,
827
+ textStyleId: styleId,
828
+ iModel: imodel,
829
+ });
830
+ const layout = layoutTextBlock({
831
+ textBlock: annotation.textBlock,
832
+ iModel: imodel,
833
+ textStyleResolver: resolver,
834
+ });
835
+ const result = appendTextAnnotationGeometry({
836
+ annotationProps: annotation.toJSON(),
837
+ layout,
838
+ textStyleResolver: resolver,
839
+ scaleFactor,
840
+ builder,
841
+ categoryId: seedCategoryId,
842
+ });
843
+ expect(result).to.be.true;
844
+ return builder;
845
+ }
846
+ it("produces the same geometry when given the same inputs", () => {
847
+ const builder1 = runAppendTextAnnotationGeometry(createAnnotation(), seedStyleId);
848
+ const builder2 = runAppendTextAnnotationGeometry(createAnnotation(), seedStyleId);
849
+ expect(builder1.geometries).to.deep.equal(builder2.geometries);
850
+ expect(builder1.params).to.deep.equal(builder2.params);
851
+ expect(builder1.textStrings).to.deep.equal(builder2.textStrings);
852
+ });
853
+ it("produces no geometry when given an empty annotation", () => {
854
+ const block = TextBlock.create();
855
+ const annotation = TextAnnotation.fromJSON({ textBlock: block.toJSON() });
856
+ const builder = runAppendTextAnnotationGeometry(annotation, seedStyleId);
857
+ expect(builder.geometries).to.be.empty;
858
+ expect(builder.params).to.be.empty;
859
+ expect(builder.textStrings).to.be.empty;
860
+ });
861
+ it("produces geometry when given an empty annotation with frame styling", () => {
862
+ const block = TextBlock.create();
863
+ const annotation = TextAnnotation.fromJSON({ textBlock: block.toJSON() });
864
+ const styleId = createAnnotationTextStyle(imodel, seedDefinitionModelId, "empty anno style", {
865
+ font: { name: "Totally Real Font" },
866
+ frame: {
867
+ shape: "rectangle",
868
+ }
869
+ }).insert();
870
+ const builder = runAppendTextAnnotationGeometry(annotation, styleId);
871
+ expect(builder.geometries).not.to.be.empty;
872
+ expect(builder.params).not.to.be.empty;
873
+ expect(builder.textStrings).to.be.empty;
874
+ });
875
+ it("produces different geometry when given different text-content in annotations", () => {
876
+ const anno1 = createAnnotation();
877
+ const anno2 = createAnnotation();
878
+ anno2.textBlock.appendRun(TextRun.create({ content: "extra", styleOverrides: { font: { name: "Totally Real Font" } } }));
879
+ const builder1 = runAppendTextAnnotationGeometry(anno1, seedStyleId);
880
+ const builder2 = runAppendTextAnnotationGeometry(anno2, seedStyleId);
881
+ expect(builder1.geometries).to.not.deep.equal(builder2.geometries);
882
+ expect(builder1.params).to.deep.equal(builder2.params);
883
+ expect(builder1.textStrings).to.not.deep.equal(builder2.textStrings);
884
+ });
885
+ it("produces different geometry when given different default styles", () => {
886
+ const builder1 = runAppendTextAnnotationGeometry(createAnnotation(), seedStyleId);
887
+ const builder2 = runAppendTextAnnotationGeometry(createAnnotation(), seedStyleId2);
888
+ expect(builder1.geometries).to.not.deep.equal(builder2.geometries);
889
+ expect(builder1.textStrings).to.not.deep.equal(builder2.textStrings);
890
+ });
891
+ it("accounts for style overrides in the text", () => {
892
+ const block = TextBlock.create();
893
+ block.styleOverrides = { margins: { left: 0, right: 1, top: 2, bottom: 3 } };
894
+ block.appendParagraph();
895
+ block.children[0].styleOverrides = { isBold: true };
896
+ block.appendRun(TextRun.create({ content: "Run, Barry," }));
897
+ block.appendParagraph();
898
+ block.appendRun(TextRun.create({ content: " RUN!!! ", styleOverrides: { isItalic: false } }));
899
+ const annotation = createAnnotation(block);
900
+ const builder = runAppendTextAnnotationGeometry(annotation, seedStyleId);
901
+ expect(builder.textStrings.length).to.equal(2);
902
+ expect(builder.textStrings[0].text).to.equal("Run, Barry,");
903
+ // From override on paragraph
904
+ expect(builder.textStrings[0].bold).to.be.true;
905
+ // From default style
906
+ expect(builder.textStrings[0].italic).to.be.true;
907
+ expect(builder.textStrings[1].text).to.equal(" RUN!!! ");
908
+ // From default style
909
+ expect(builder.textStrings[1].bold).to.be.false;
910
+ // From override on run
911
+ expect(builder.textStrings[1].italic).to.be.false;
912
+ });
913
+ it("uses TextStyleSettings.defaults when no default style is provided", () => {
914
+ const block = TextBlock.create();
915
+ block.appendRun(TextRun.create({ content: "Run, Barry," }));
916
+ const annotation = createAnnotation(block);
917
+ const builder = runAppendTextAnnotationGeometry(annotation, "");
918
+ expect(builder.textStrings.length).to.equal(1);
919
+ expect(builder.textStrings[0].text).to.equal("Run, Barry,");
920
+ expect(builder.textStrings[0].font).to.equal(0); // Font ID 0 is the "missing" font in the default text style
921
+ expect(builder.textStrings[0].bold).to.equal(TextStyleSettings.defaultProps.isBold);
922
+ expect(builder.textStrings[0].italic).to.equal(TextStyleSettings.defaultProps.isItalic);
923
+ expect(builder.textStrings[0].underline).to.equal(TextStyleSettings.defaultProps.isUnderlined);
924
+ });
925
+ it("scales geometry correctly", () => {
926
+ const annotation = createAnnotation();
927
+ const builder1 = runAppendTextAnnotationGeometry(annotation, seedStyleId, 1);
928
+ const builder2 = runAppendTextAnnotationGeometry(annotation, seedStyleId, 2);
929
+ expect(builder1.textStrings[0].height * 2).to.equal(builder2.textStrings[0].height);
930
+ expect(builder1.textStrings[0].width * 2).to.equal(builder2.textStrings[0].width);
931
+ });
356
932
  });
357
933
  //# sourceMappingURL=TextAnnotation.test.js.map