@itwin/core-backend 5.15.0-dev.2 → 5.15.0-dev.20

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 (272) hide show
  1. package/CHANGELOG.md +52 -1
  2. package/lib/cjs/BlobContainerService.d.ts +2 -0
  3. package/lib/cjs/BlobContainerService.d.ts.map +1 -1
  4. package/lib/cjs/BlobContainerService.js.map +1 -1
  5. package/lib/cjs/BriefcaseManager.d.ts +4 -3
  6. package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
  7. package/lib/cjs/BriefcaseManager.js +39 -9
  8. package/lib/cjs/BriefcaseManager.js.map +1 -1
  9. package/lib/cjs/ChangeUnifier.d.ts +82 -0
  10. package/lib/cjs/ChangeUnifier.d.ts.map +1 -0
  11. package/lib/cjs/ChangeUnifier.js +163 -0
  12. package/lib/cjs/ChangeUnifier.js.map +1 -0
  13. package/lib/cjs/ChangesetReader.d.ts +21 -2
  14. package/lib/cjs/ChangesetReader.d.ts.map +1 -1
  15. package/lib/cjs/ChangesetReader.js +37 -1
  16. package/lib/cjs/ChangesetReader.js.map +1 -1
  17. package/lib/cjs/ChangesetReaderTypes.d.ts +1 -1
  18. package/lib/cjs/ChangesetReaderTypes.js.map +1 -1
  19. package/lib/cjs/CloudSqlite.d.ts +15 -0
  20. package/lib/cjs/CloudSqlite.d.ts.map +1 -1
  21. package/lib/cjs/CloudSqlite.js.map +1 -1
  22. package/lib/cjs/ECDb.d.ts +1 -0
  23. package/lib/cjs/ECDb.d.ts.map +1 -1
  24. package/lib/cjs/ECDb.js +4 -1
  25. package/lib/cjs/ECDb.js.map +1 -1
  26. package/lib/cjs/ECSqlRowExecutor.d.ts +3 -3
  27. package/lib/cjs/ECSqlRowExecutor.d.ts.map +1 -1
  28. package/lib/cjs/ECSqlRowExecutor.js +2 -2
  29. package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
  30. package/lib/cjs/ECSqlStatement.d.ts +5 -0
  31. package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
  32. package/lib/cjs/ECSqlStatement.js +15 -2
  33. package/lib/cjs/ECSqlStatement.js.map +1 -1
  34. package/lib/cjs/ECSqlSyncReader.d.ts.map +1 -1
  35. package/lib/cjs/ECSqlSyncReader.js +2 -2
  36. package/lib/cjs/ECSqlSyncReader.js.map +1 -1
  37. package/lib/cjs/EditTxn.d.ts +61 -19
  38. package/lib/cjs/EditTxn.d.ts.map +1 -1
  39. package/lib/cjs/EditTxn.js +84 -29
  40. package/lib/cjs/EditTxn.js.map +1 -1
  41. package/lib/cjs/Element.d.ts +29 -2
  42. package/lib/cjs/Element.d.ts.map +1 -1
  43. package/lib/cjs/Element.js +38 -2
  44. package/lib/cjs/Element.js.map +1 -1
  45. package/lib/cjs/GeoCoordConfig.d.ts +1 -0
  46. package/lib/cjs/GeoCoordConfig.d.ts.map +1 -1
  47. package/lib/cjs/GeoCoordConfig.js +12 -8
  48. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  49. package/lib/cjs/GeographicCRSServices.d.ts +50 -2
  50. package/lib/cjs/GeographicCRSServices.d.ts.map +1 -1
  51. package/lib/cjs/GeographicCRSServices.js +11 -1
  52. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  53. package/lib/cjs/IModelDb.d.ts +22 -9
  54. package/lib/cjs/IModelDb.d.ts.map +1 -1
  55. package/lib/cjs/IModelDb.js +54 -12
  56. package/lib/cjs/IModelDb.js.map +1 -1
  57. package/lib/cjs/NativeHost.d.ts.map +1 -1
  58. package/lib/cjs/NativeHost.js +5 -1
  59. package/lib/cjs/NativeHost.js.map +1 -1
  60. package/lib/cjs/Relationship.d.ts +28 -0
  61. package/lib/cjs/Relationship.d.ts.map +1 -1
  62. package/lib/cjs/Relationship.js +78 -0
  63. package/lib/cjs/Relationship.js.map +1 -1
  64. package/lib/cjs/SchemaSync.d.ts.map +1 -1
  65. package/lib/cjs/SchemaSync.js +1 -0
  66. package/lib/cjs/SchemaSync.js.map +1 -1
  67. package/lib/cjs/TxnManager.d.ts +126 -89
  68. package/lib/cjs/TxnManager.d.ts.map +1 -1
  69. package/lib/cjs/TxnManager.js +114 -76
  70. package/lib/cjs/TxnManager.js.map +1 -1
  71. package/lib/cjs/ViewStateHydrator.d.ts.map +1 -1
  72. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  73. package/lib/cjs/ViewStore.d.ts.map +1 -1
  74. package/lib/cjs/ViewStore.js +62 -19
  75. package/lib/cjs/ViewStore.js.map +1 -1
  76. package/lib/cjs/annotations/LeaderGeometry.d.ts.map +1 -1
  77. package/lib/cjs/annotations/LeaderGeometry.js +3 -0
  78. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  79. package/lib/cjs/core-backend.d.ts +1 -0
  80. package/lib/cjs/core-backend.d.ts.map +1 -1
  81. package/lib/cjs/core-backend.js +1 -0
  82. package/lib/cjs/core-backend.js.map +1 -1
  83. package/lib/cjs/internal/BriefcaseUtils.d.ts +19 -0
  84. package/lib/cjs/internal/BriefcaseUtils.d.ts.map +1 -0
  85. package/lib/cjs/internal/BriefcaseUtils.js +65 -0
  86. package/lib/cjs/internal/BriefcaseUtils.js.map +1 -0
  87. package/lib/cjs/internal/QueryMetadataCache.d.ts +44 -0
  88. package/lib/cjs/internal/QueryMetadataCache.d.ts.map +1 -0
  89. package/lib/cjs/internal/QueryMetadataCache.js +107 -0
  90. package/lib/cjs/internal/QueryMetadataCache.js.map +1 -0
  91. package/lib/cjs/internal/Symbols.d.ts +9 -0
  92. package/lib/cjs/internal/Symbols.d.ts.map +1 -1
  93. package/lib/cjs/internal/Symbols.js +10 -1
  94. package/lib/cjs/internal/Symbols.js.map +1 -1
  95. package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  96. package/lib/cjs/internal/workspace/WorkspaceImpl.js +20 -6
  97. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  98. package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts +6 -6
  99. package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
  100. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  101. package/lib/cjs/workspace/SettingsEditor.d.ts +4 -3
  102. package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -1
  103. package/lib/cjs/workspace/SettingsEditor.js +7 -5
  104. package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
  105. package/lib/esm/BlobContainerService.d.ts +2 -0
  106. package/lib/esm/BlobContainerService.d.ts.map +1 -1
  107. package/lib/esm/BlobContainerService.js.map +1 -1
  108. package/lib/esm/BriefcaseManager.d.ts +4 -3
  109. package/lib/esm/BriefcaseManager.d.ts.map +1 -1
  110. package/lib/esm/BriefcaseManager.js +40 -10
  111. package/lib/esm/BriefcaseManager.js.map +1 -1
  112. package/lib/esm/ChangeUnifier.d.ts +82 -0
  113. package/lib/esm/ChangeUnifier.d.ts.map +1 -0
  114. package/lib/esm/ChangeUnifier.js +159 -0
  115. package/lib/esm/ChangeUnifier.js.map +1 -0
  116. package/lib/esm/ChangesetReader.d.ts +21 -2
  117. package/lib/esm/ChangesetReader.d.ts.map +1 -1
  118. package/lib/esm/ChangesetReader.js +38 -2
  119. package/lib/esm/ChangesetReader.js.map +1 -1
  120. package/lib/esm/ChangesetReaderTypes.d.ts +1 -1
  121. package/lib/esm/ChangesetReaderTypes.js.map +1 -1
  122. package/lib/esm/CloudSqlite.d.ts +15 -0
  123. package/lib/esm/CloudSqlite.d.ts.map +1 -1
  124. package/lib/esm/CloudSqlite.js.map +1 -1
  125. package/lib/esm/ECDb.d.ts +1 -0
  126. package/lib/esm/ECDb.d.ts.map +1 -1
  127. package/lib/esm/ECDb.js +4 -1
  128. package/lib/esm/ECDb.js.map +1 -1
  129. package/lib/esm/ECSqlRowExecutor.d.ts +3 -3
  130. package/lib/esm/ECSqlRowExecutor.d.ts.map +1 -1
  131. package/lib/esm/ECSqlRowExecutor.js +2 -2
  132. package/lib/esm/ECSqlRowExecutor.js.map +1 -1
  133. package/lib/esm/ECSqlStatement.d.ts +5 -0
  134. package/lib/esm/ECSqlStatement.d.ts.map +1 -1
  135. package/lib/esm/ECSqlStatement.js +15 -2
  136. package/lib/esm/ECSqlStatement.js.map +1 -1
  137. package/lib/esm/ECSqlSyncReader.d.ts.map +1 -1
  138. package/lib/esm/ECSqlSyncReader.js +3 -3
  139. package/lib/esm/ECSqlSyncReader.js.map +1 -1
  140. package/lib/esm/EditTxn.d.ts +61 -19
  141. package/lib/esm/EditTxn.d.ts.map +1 -1
  142. package/lib/esm/EditTxn.js +85 -30
  143. package/lib/esm/EditTxn.js.map +1 -1
  144. package/lib/esm/Element.d.ts +29 -2
  145. package/lib/esm/Element.d.ts.map +1 -1
  146. package/lib/esm/Element.js +41 -5
  147. package/lib/esm/Element.js.map +1 -1
  148. package/lib/esm/GeoCoordConfig.d.ts +1 -0
  149. package/lib/esm/GeoCoordConfig.d.ts.map +1 -1
  150. package/lib/esm/GeoCoordConfig.js +12 -8
  151. package/lib/esm/GeoCoordConfig.js.map +1 -1
  152. package/lib/esm/GeographicCRSServices.d.ts +50 -2
  153. package/lib/esm/GeographicCRSServices.d.ts.map +1 -1
  154. package/lib/esm/GeographicCRSServices.js +10 -1
  155. package/lib/esm/GeographicCRSServices.js.map +1 -1
  156. package/lib/esm/IModelDb.d.ts +22 -9
  157. package/lib/esm/IModelDb.d.ts.map +1 -1
  158. package/lib/esm/IModelDb.js +56 -14
  159. package/lib/esm/IModelDb.js.map +1 -1
  160. package/lib/esm/NativeHost.d.ts.map +1 -1
  161. package/lib/esm/NativeHost.js +5 -1
  162. package/lib/esm/NativeHost.js.map +1 -1
  163. package/lib/esm/Relationship.d.ts +28 -0
  164. package/lib/esm/Relationship.d.ts.map +1 -1
  165. package/lib/esm/Relationship.js +78 -0
  166. package/lib/esm/Relationship.js.map +1 -1
  167. package/lib/esm/SchemaSync.d.ts.map +1 -1
  168. package/lib/esm/SchemaSync.js +1 -0
  169. package/lib/esm/SchemaSync.js.map +1 -1
  170. package/lib/esm/TxnManager.d.ts +126 -89
  171. package/lib/esm/TxnManager.d.ts.map +1 -1
  172. package/lib/esm/TxnManager.js +116 -78
  173. package/lib/esm/TxnManager.js.map +1 -1
  174. package/lib/esm/ViewStateHydrator.d.ts.map +1 -1
  175. package/lib/esm/ViewStateHydrator.js.map +1 -1
  176. package/lib/esm/ViewStore.d.ts.map +1 -1
  177. package/lib/esm/ViewStore.js +62 -19
  178. package/lib/esm/ViewStore.js.map +1 -1
  179. package/lib/esm/annotations/LeaderGeometry.d.ts.map +1 -1
  180. package/lib/esm/annotations/LeaderGeometry.js +3 -0
  181. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  182. package/lib/esm/core-backend.d.ts +1 -0
  183. package/lib/esm/core-backend.d.ts.map +1 -1
  184. package/lib/esm/core-backend.js +1 -0
  185. package/lib/esm/core-backend.js.map +1 -1
  186. package/lib/esm/internal/BriefcaseUtils.d.ts +19 -0
  187. package/lib/esm/internal/BriefcaseUtils.d.ts.map +1 -0
  188. package/lib/esm/internal/BriefcaseUtils.js +61 -0
  189. package/lib/esm/internal/BriefcaseUtils.js.map +1 -0
  190. package/lib/esm/internal/QueryMetadataCache.d.ts +44 -0
  191. package/lib/esm/internal/QueryMetadataCache.d.ts.map +1 -0
  192. package/lib/esm/internal/QueryMetadataCache.js +103 -0
  193. package/lib/esm/internal/QueryMetadataCache.js.map +1 -0
  194. package/lib/esm/internal/Symbols.d.ts +9 -0
  195. package/lib/esm/internal/Symbols.d.ts.map +1 -1
  196. package/lib/esm/internal/Symbols.js +9 -0
  197. package/lib/esm/internal/Symbols.js.map +1 -1
  198. package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  199. package/lib/esm/internal/workspace/WorkspaceImpl.js +20 -6
  200. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  201. package/lib/esm/rpc-impl/IModelReadRpcImpl.d.ts +6 -6
  202. package/lib/esm/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
  203. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  204. package/lib/esm/test/annotations/LeaderGeometry.test.js +15 -1
  205. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  206. package/lib/esm/test/ecdb/ConcurrentQuery.test.js +144 -30
  207. package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
  208. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js +140 -0
  209. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
  210. package/lib/esm/test/ecdb/QueryMetadataCache.test.d.ts +2 -0
  211. package/lib/esm/test/ecdb/QueryMetadataCache.test.d.ts.map +1 -0
  212. package/lib/esm/test/ecdb/QueryMetadataCache.test.js +630 -0
  213. package/lib/esm/test/ecdb/QueryMetadataCache.test.js.map +1 -0
  214. package/lib/esm/test/element/DeleteDefinitionElements.test.js +403 -249
  215. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  216. package/lib/esm/test/element/ElementSubModelInsert.test.d.ts +2 -0
  217. package/lib/esm/test/element/ElementSubModelInsert.test.d.ts.map +1 -0
  218. package/lib/esm/test/element/ElementSubModelInsert.test.js +183 -0
  219. package/lib/esm/test/element/ElementSubModelInsert.test.js.map +1 -0
  220. package/lib/esm/test/element/RelationshipBatchLookup.test.d.ts +2 -0
  221. package/lib/esm/test/element/RelationshipBatchLookup.test.d.ts.map +1 -0
  222. package/lib/esm/test/element/RelationshipBatchLookup.test.js +202 -0
  223. package/lib/esm/test/element/RelationshipBatchLookup.test.js.map +1 -0
  224. package/lib/esm/test/hubaccess/BriefcaseManager.test.js +187 -1
  225. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  226. package/lib/esm/test/hubaccess/SchemaImportOrphanColumns.test.d.ts +2 -0
  227. package/lib/esm/test/hubaccess/SchemaImportOrphanColumns.test.d.ts.map +1 -0
  228. package/lib/esm/test/hubaccess/SchemaImportOrphanColumns.test.js +142 -0
  229. package/lib/esm/test/hubaccess/SchemaImportOrphanColumns.test.js.map +1 -0
  230. package/lib/esm/test/imodel/IModelGeolocation.test.js +13 -11
  231. package/lib/esm/test/imodel/IModelGeolocation.test.js.map +1 -1
  232. package/lib/esm/test/imodel/IModelProps.test.d.ts +2 -0
  233. package/lib/esm/test/imodel/IModelProps.test.d.ts.map +1 -0
  234. package/lib/esm/test/imodel/IModelProps.test.js +411 -0
  235. package/lib/esm/test/imodel/IModelProps.test.js.map +1 -0
  236. package/lib/esm/test/schema/SchemaViewPropertyOverrides.test.d.ts +2 -0
  237. package/lib/esm/test/schema/SchemaViewPropertyOverrides.test.d.ts.map +1 -0
  238. package/lib/esm/test/schema/SchemaViewPropertyOverrides.test.js +240 -0
  239. package/lib/esm/test/schema/SchemaViewPropertyOverrides.test.js.map +1 -0
  240. package/lib/esm/test/schema/SchemaViewValidation.test.js +2 -8
  241. package/lib/esm/test/schema/SchemaViewValidation.test.js.map +1 -1
  242. package/lib/esm/test/standalone/BriefcaseManagerDelete.test.d.ts +2 -0
  243. package/lib/esm/test/standalone/BriefcaseManagerDelete.test.d.ts.map +1 -0
  244. package/lib/esm/test/standalone/BriefcaseManagerDelete.test.js +159 -0
  245. package/lib/esm/test/standalone/BriefcaseManagerDelete.test.js.map +1 -0
  246. package/lib/esm/test/standalone/ChangeUnifier.test.d.ts +2 -0
  247. package/lib/esm/test/standalone/ChangeUnifier.test.d.ts.map +1 -0
  248. package/lib/esm/test/standalone/ChangeUnifier.test.js +732 -0
  249. package/lib/esm/test/standalone/ChangeUnifier.test.js.map +1 -0
  250. package/lib/esm/test/standalone/DeleteElements.test.js +962 -83
  251. package/lib/esm/test/standalone/DeleteElements.test.js.map +1 -1
  252. package/lib/esm/test/standalone/EditTxn.test.js +72 -1
  253. package/lib/esm/test/standalone/EditTxn.test.js.map +1 -1
  254. package/lib/esm/test/standalone/GeoCoordConfig.test.d.ts +2 -0
  255. package/lib/esm/test/standalone/GeoCoordConfig.test.d.ts.map +1 -0
  256. package/lib/esm/test/standalone/GeoCoordConfig.test.js +158 -0
  257. package/lib/esm/test/standalone/GeoCoordConfig.test.js.map +1 -0
  258. package/lib/esm/test/standalone/SessionApplyIndirect.test.d.ts +2 -0
  259. package/lib/esm/test/standalone/SessionApplyIndirect.test.d.ts.map +1 -0
  260. package/lib/esm/test/standalone/SessionApplyIndirect.test.js +211 -0
  261. package/lib/esm/test/standalone/SessionApplyIndirect.test.js.map +1 -0
  262. package/lib/esm/test/standalone/ViewStoreDb.test.js +53 -0
  263. package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
  264. package/lib/esm/test/workspace/SettingsContainers.test.d.ts +2 -0
  265. package/lib/esm/test/workspace/SettingsContainers.test.d.ts.map +1 -0
  266. package/lib/esm/test/workspace/SettingsContainers.test.js +95 -0
  267. package/lib/esm/test/workspace/SettingsContainers.test.js.map +1 -0
  268. package/lib/esm/workspace/SettingsEditor.d.ts +4 -3
  269. package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -1
  270. package/lib/esm/workspace/SettingsEditor.js +7 -5
  271. package/lib/esm/workspace/SettingsEditor.js.map +1 -1
  272. package/package.json +18 -18
@@ -0,0 +1,159 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { expect } from "chai";
6
+ import * as path from "node:path";
7
+ import * as sinon from "sinon";
8
+ import { Guid, IModelStatus, OpenMode } from "@itwin/core-bentley";
9
+ import { IModelError } from "@itwin/core-common";
10
+ import { BriefcaseManager } from "../../BriefcaseManager";
11
+ import { StandaloneDb } from "../../IModelDb";
12
+ import { IModelJsFs } from "../../IModelJsFs";
13
+ import { checkFrontendBriefcaseDelete, isBriefcaseSidecar } from "../../internal/BriefcaseUtils";
14
+ import { IModelNative } from "../../internal/NativePlatform";
15
+ import { KnownTestLocations } from "../KnownTestLocations";
16
+ describe("Deleting briefcase files", () => {
17
+ let outsideDir;
18
+ let insideDir;
19
+ const writeFile = (fileName, content = "test content") => {
20
+ IModelJsFs.writeFileSync(fileName, content);
21
+ return fileName;
22
+ };
23
+ const createIModel = (fileName) => {
24
+ const db = StandaloneDb.createEmpty(fileName, { rootSubject: { name: "DeleteBriefcaseFiles" } });
25
+ const pathName = db.pathName; // native appends ".bim" if fileName has no extension
26
+ db.close();
27
+ return pathName;
28
+ };
29
+ beforeEach(() => {
30
+ outsideDir = path.join(KnownTestLocations.outputDir, "DeleteBriefcaseFiles", Guid.createValue());
31
+ insideDir = path.join(BriefcaseManager.cacheDir, Guid.createValue(), "briefcases");
32
+ IModelJsFs.recursiveMkDirSync(outsideDir);
33
+ IModelJsFs.recursiveMkDirSync(insideDir);
34
+ const cacheRoot = path.resolve(BriefcaseManager.cacheDir) + path.sep;
35
+ expect(path.resolve(outsideDir).startsWith(cacheRoot)).to.be.false;
36
+ expect(path.resolve(insideDir).startsWith(cacheRoot)).to.be.true;
37
+ });
38
+ afterEach(() => {
39
+ sinon.restore();
40
+ IModelJsFs.removeSync(outsideDir);
41
+ IModelJsFs.removeSync(path.dirname(insideDir));
42
+ });
43
+ describe("BriefcaseManager.deleteBriefcaseFiles", () => {
44
+ /** Create an iModel with an assigned (valid) briefcaseId, so deleteBriefcaseFiles tries to clean up rebase folders and release it. */
45
+ const createAssignedBriefcase = (fileName) => {
46
+ const pathName = createIModel(fileName);
47
+ const nativeDb = new IModelNative.platform.DgnDb();
48
+ nativeDb.openIModel(pathName, OpenMode.ReadWrite);
49
+ nativeDb.resetBriefcaseId(2);
50
+ nativeDb.saveChanges();
51
+ nativeDb.closeFile();
52
+ return pathName;
53
+ };
54
+ it("releases the briefcaseId and deletes the file even if cleaning up rebase folders fails", async () => {
55
+ const bim = createAssignedBriefcase(path.join(insideDir, "5.bim"));
56
+ sinon.stub(BriefcaseManager, "cleanupRebaseFolders").throws(new Error("EBUSY"));
57
+ const release = sinon.stub(BriefcaseManager, "releaseBriefcase").resolves();
58
+ await BriefcaseManager.deleteBriefcaseFiles(bim, "access token");
59
+ expect(release.calledOnce).to.be.true;
60
+ expect(release.firstCall.args[1].briefcaseId).equal(2);
61
+ expect(IModelJsFs.existsSync(bim)).to.be.false;
62
+ });
63
+ it("cleans up rebase folders and deletes the file even if releasing the briefcaseId fails", async () => {
64
+ const bim = createAssignedBriefcase(path.join(insideDir, "6.bim"));
65
+ const rebaseDir = path.join(insideDir, ".rebasing", "2");
66
+ IModelJsFs.recursiveMkDirSync(rebaseDir);
67
+ sinon.stub(BriefcaseManager, "releaseBriefcase").rejects(new Error("hub unavailable"));
68
+ await BriefcaseManager.deleteBriefcaseFiles(bim, "access token");
69
+ expect(IModelJsFs.existsSync(rebaseDir)).to.be.false;
70
+ expect(IModelJsFs.existsSync(bim)).to.be.false;
71
+ });
72
+ it("deletes a briefcase along with its associated files, but not other files", async () => {
73
+ const bim = createIModel(path.join(insideDir, "1.bim"));
74
+ const sidecars = ["-wal", "-shm", "-journal", "-locks", "-locks-wal", "-locks-shm", ".Tiles", ".Tiles-journal", "-hierarchies", ".HierarchyCache.db", ".keep.txt"]
75
+ .map((suffix) => writeFile(`${bim}${suffix}`));
76
+ const unrelated = [writeFile(path.join(insideDir, "1.bim2")), writeFile(path.join(insideDir, "1.bimx.txt")), writeFile(path.join(insideDir, "x1.bim-wal"))];
77
+ const sidecarDir = path.join(insideDir, "1.bim.dir");
78
+ IModelJsFs.recursiveMkDirSync(sidecarDir);
79
+ await BriefcaseManager.deleteBriefcaseFiles(bim);
80
+ expect(IModelJsFs.existsSync(bim)).to.be.false;
81
+ for (const sidecar of sidecars)
82
+ expect(IModelJsFs.existsSync(sidecar), sidecar).to.be.false;
83
+ for (const file of unrelated)
84
+ expect(IModelJsFs.existsSync(file), file).to.be.true;
85
+ expect(IModelJsFs.existsSync(sidecarDir), "directories are not deleted").to.be.true;
86
+ });
87
+ it("deletes a corrupt file at any location, but not files that merely share a prefix", async () => {
88
+ const a = writeFile(path.join(outsideDir, "a"), "this is not an iModel");
89
+ const wal = writeFile(`${a}-wal`);
90
+ const unrelated = [writeFile(path.join(outsideDir, "abc.txt")), writeFile(path.join(outsideDir, "ab-c.txt"))];
91
+ await BriefcaseManager.deleteBriefcaseFiles(a);
92
+ expect(IModelJsFs.existsSync(a)).to.be.false;
93
+ expect(IModelJsFs.existsSync(wal)).to.be.false;
94
+ for (const file of unrelated)
95
+ expect(IModelJsFs.existsSync(file), file).to.be.true;
96
+ });
97
+ it("deletes stale associated files when the briefcase file is missing", async () => {
98
+ const bim = path.join(insideDir, "3.bim");
99
+ const wal = writeFile(`${bim}-wal`);
100
+ const locks = writeFile(`${bim}-locks`);
101
+ await BriefcaseManager.deleteBriefcaseFiles(bim);
102
+ expect(IModelJsFs.existsSync(wal)).to.be.false;
103
+ expect(IModelJsFs.existsSync(locks)).to.be.false;
104
+ });
105
+ });
106
+ describe("isBriefcaseSidecar", () => {
107
+ it("matches only <name>-* and <name>.*", () => {
108
+ for (const file of ["a.bim-wal", "a.bim-locks-shm", "a.bim.Tiles", "a.bim.HierarchyCache.db", "a.bim-hierarchies"])
109
+ expect(isBriefcaseSidecar(file, "a.bim"), file).to.be.true;
110
+ for (const file of ["a.bim", "a.bim-", "a.bim.", "a.bim2", "a.bimx.txt", "a.bim_wal", "xa.bim-wal", "b.bim-wal"])
111
+ expect(isBriefcaseSidecar(file, "a.bim"), file).to.be.false;
112
+ });
113
+ });
114
+ describe("checkFrontendBriefcaseDelete", () => {
115
+ const expectBadRequest = (filePath) => {
116
+ let error;
117
+ try {
118
+ checkFrontendBriefcaseDelete(filePath, BriefcaseManager.cacheDir);
119
+ }
120
+ catch (err) {
121
+ error = err;
122
+ }
123
+ expect(error).instanceOf(IModelError);
124
+ expect(error.errorNumber).equal(IModelStatus.BadRequest);
125
+ };
126
+ it("rejects a file outside the cache that is not an iModel", () => {
127
+ const notes = writeFile(path.join(outsideDir, "notes.txt"));
128
+ expectBadRequest(notes);
129
+ expect(IModelJsFs.existsSync(notes)).to.be.true;
130
+ });
131
+ it("rejects paths that use '..' to escape the cache", () => {
132
+ const notes = writeFile(path.join(outsideDir, "notes.txt"));
133
+ const escapingPath = `${insideDir}${path.sep}${path.relative(insideDir, notes)}`;
134
+ expect(escapingPath.startsWith(insideDir)).to.be.true;
135
+ expectBadRequest(escapingPath);
136
+ });
137
+ it("returns undefined for a missing file outside the cache, so its associated files are not deleted", () => {
138
+ writeFile(path.join(outsideDir, "a.docx"));
139
+ expect(checkFrontendBriefcaseDelete(path.join(outsideDir, "a"), BriefcaseManager.cacheDir)).to.be.undefined;
140
+ });
141
+ it("allows a valid iModel outside the cache", () => {
142
+ const bim = createIModel(path.join(outsideDir, "valid.bim"));
143
+ expect(checkFrontendBriefcaseDelete(bim, BriefcaseManager.cacheDir)).equal(path.resolve(bim));
144
+ });
145
+ it("allows any file, or missing file, inside the cache", () => {
146
+ const corrupt = writeFile(path.join(insideDir, "2.bim"), "this is not an iModel");
147
+ expect(checkFrontendBriefcaseDelete(corrupt, BriefcaseManager.cacheDir)).equal(path.resolve(corrupt));
148
+ const missing = path.join(insideDir, "3.bim");
149
+ expect(checkFrontendBriefcaseDelete(missing, BriefcaseManager.cacheDir)).equal(path.resolve(missing));
150
+ });
151
+ it("treats the cache directory case-insensitively on Windows", function () {
152
+ if (process.platform !== "win32")
153
+ this.skip();
154
+ const corrupt = writeFile(path.join(insideDir, "4.bim"), "this is not an iModel");
155
+ expect(checkFrontendBriefcaseDelete(corrupt.toUpperCase(), BriefcaseManager.cacheDir)).equal(path.resolve(corrupt.toUpperCase()));
156
+ });
157
+ });
158
+ });
159
+ //# sourceMappingURL=BriefcaseManagerDelete.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BriefcaseManagerDelete.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/BriefcaseManagerDelete.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { expect } from \"chai\";\r\nimport * as path from \"node:path\";\r\nimport * as sinon from \"sinon\";\r\nimport { Guid, IModelStatus, OpenMode } from \"@itwin/core-bentley\";\r\nimport { IModelError } from \"@itwin/core-common\";\r\nimport { BriefcaseManager } from \"../../BriefcaseManager\";\r\nimport { StandaloneDb } from \"../../IModelDb\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { checkFrontendBriefcaseDelete, isBriefcaseSidecar } from \"../../internal/BriefcaseUtils\";\r\nimport { IModelNative } from \"../../internal/NativePlatform\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\n\r\ndescribe(\"Deleting briefcase files\", () => {\r\n let outsideDir: string;\r\n let insideDir: string;\r\n\r\n const writeFile = (fileName: string, content = \"test content\") => {\r\n IModelJsFs.writeFileSync(fileName, content);\r\n return fileName;\r\n };\r\n\r\n const createIModel = (fileName: string) => {\r\n const db = StandaloneDb.createEmpty(fileName, { rootSubject: { name: \"DeleteBriefcaseFiles\" } });\r\n const pathName = db.pathName; // native appends \".bim\" if fileName has no extension\r\n db.close();\r\n return pathName;\r\n };\r\n\r\n beforeEach(() => {\r\n outsideDir = path.join(KnownTestLocations.outputDir, \"DeleteBriefcaseFiles\", Guid.createValue());\r\n insideDir = path.join(BriefcaseManager.cacheDir, Guid.createValue(), \"briefcases\");\r\n IModelJsFs.recursiveMkDirSync(outsideDir);\r\n IModelJsFs.recursiveMkDirSync(insideDir);\r\n\r\n const cacheRoot = path.resolve(BriefcaseManager.cacheDir) + path.sep;\r\n expect(path.resolve(outsideDir).startsWith(cacheRoot)).to.be.false;\r\n expect(path.resolve(insideDir).startsWith(cacheRoot)).to.be.true;\r\n });\r\n\r\n afterEach(() => {\r\n sinon.restore();\r\n IModelJsFs.removeSync(outsideDir);\r\n IModelJsFs.removeSync(path.dirname(insideDir));\r\n });\r\n\r\n describe(\"BriefcaseManager.deleteBriefcaseFiles\", () => {\r\n /** Create an iModel with an assigned (valid) briefcaseId, so deleteBriefcaseFiles tries to clean up rebase folders and release it. */\r\n const createAssignedBriefcase = (fileName: string) => {\r\n const pathName = createIModel(fileName);\r\n const nativeDb = new IModelNative.platform.DgnDb();\r\n nativeDb.openIModel(pathName, OpenMode.ReadWrite);\r\n nativeDb.resetBriefcaseId(2);\r\n nativeDb.saveChanges();\r\n nativeDb.closeFile();\r\n return pathName;\r\n };\r\n\r\n it(\"releases the briefcaseId and deletes the file even if cleaning up rebase folders fails\", async () => {\r\n const bim = createAssignedBriefcase(path.join(insideDir, \"5.bim\"));\r\n sinon.stub(BriefcaseManager as any, \"cleanupRebaseFolders\").throws(new Error(\"EBUSY\"));\r\n const release = sinon.stub(BriefcaseManager, \"releaseBriefcase\").resolves();\r\n\r\n await BriefcaseManager.deleteBriefcaseFiles(bim, \"access token\");\r\n\r\n expect(release.calledOnce).to.be.true;\r\n expect(release.firstCall.args[1].briefcaseId).equal(2);\r\n expect(IModelJsFs.existsSync(bim)).to.be.false;\r\n });\r\n\r\n it(\"cleans up rebase folders and deletes the file even if releasing the briefcaseId fails\", async () => {\r\n const bim = createAssignedBriefcase(path.join(insideDir, \"6.bim\"));\r\n const rebaseDir = path.join(insideDir, \".rebasing\", \"2\");\r\n IModelJsFs.recursiveMkDirSync(rebaseDir);\r\n sinon.stub(BriefcaseManager, \"releaseBriefcase\").rejects(new Error(\"hub unavailable\"));\r\n\r\n await BriefcaseManager.deleteBriefcaseFiles(bim, \"access token\");\r\n\r\n expect(IModelJsFs.existsSync(rebaseDir)).to.be.false;\r\n expect(IModelJsFs.existsSync(bim)).to.be.false;\r\n });\r\n it(\"deletes a briefcase along with its associated files, but not other files\", async () => {\r\n const bim = createIModel(path.join(insideDir, \"1.bim\"));\r\n const sidecars = [\"-wal\", \"-shm\", \"-journal\", \"-locks\", \"-locks-wal\", \"-locks-shm\", \".Tiles\", \".Tiles-journal\", \"-hierarchies\", \".HierarchyCache.db\", \".keep.txt\"]\r\n .map((suffix) => writeFile(`${bim}${suffix}`));\r\n const unrelated = [writeFile(path.join(insideDir, \"1.bim2\")), writeFile(path.join(insideDir, \"1.bimx.txt\")), writeFile(path.join(insideDir, \"x1.bim-wal\"))];\r\n const sidecarDir = path.join(insideDir, \"1.bim.dir\");\r\n IModelJsFs.recursiveMkDirSync(sidecarDir);\r\n\r\n await BriefcaseManager.deleteBriefcaseFiles(bim);\r\n\r\n expect(IModelJsFs.existsSync(bim)).to.be.false;\r\n for (const sidecar of sidecars)\r\n expect(IModelJsFs.existsSync(sidecar), sidecar).to.be.false;\r\n for (const file of unrelated)\r\n expect(IModelJsFs.existsSync(file), file).to.be.true;\r\n expect(IModelJsFs.existsSync(sidecarDir), \"directories are not deleted\").to.be.true;\r\n });\r\n\r\n it(\"deletes a corrupt file at any location, but not files that merely share a prefix\", async () => {\r\n const a = writeFile(path.join(outsideDir, \"a\"), \"this is not an iModel\");\r\n const wal = writeFile(`${a}-wal`);\r\n const unrelated = [writeFile(path.join(outsideDir, \"abc.txt\")), writeFile(path.join(outsideDir, \"ab-c.txt\"))];\r\n\r\n await BriefcaseManager.deleteBriefcaseFiles(a);\r\n\r\n expect(IModelJsFs.existsSync(a)).to.be.false;\r\n expect(IModelJsFs.existsSync(wal)).to.be.false;\r\n for (const file of unrelated)\r\n expect(IModelJsFs.existsSync(file), file).to.be.true;\r\n });\r\n\r\n it(\"deletes stale associated files when the briefcase file is missing\", async () => {\r\n const bim = path.join(insideDir, \"3.bim\");\r\n const wal = writeFile(`${bim}-wal`);\r\n const locks = writeFile(`${bim}-locks`);\r\n\r\n await BriefcaseManager.deleteBriefcaseFiles(bim);\r\n\r\n expect(IModelJsFs.existsSync(wal)).to.be.false;\r\n expect(IModelJsFs.existsSync(locks)).to.be.false;\r\n });\r\n });\r\n\r\n describe(\"isBriefcaseSidecar\", () => {\r\n it(\"matches only <name>-* and <name>.*\", () => {\r\n for (const file of [\"a.bim-wal\", \"a.bim-locks-shm\", \"a.bim.Tiles\", \"a.bim.HierarchyCache.db\", \"a.bim-hierarchies\"])\r\n expect(isBriefcaseSidecar(file, \"a.bim\"), file).to.be.true;\r\n for (const file of [\"a.bim\", \"a.bim-\", \"a.bim.\", \"a.bim2\", \"a.bimx.txt\", \"a.bim_wal\", \"xa.bim-wal\", \"b.bim-wal\"])\r\n expect(isBriefcaseSidecar(file, \"a.bim\"), file).to.be.false;\r\n });\r\n });\r\n\r\n describe(\"checkFrontendBriefcaseDelete\", () => {\r\n const expectBadRequest = (filePath: string) => {\r\n let error: unknown;\r\n try {\r\n checkFrontendBriefcaseDelete(filePath, BriefcaseManager.cacheDir);\r\n } catch (err) {\r\n error = err;\r\n }\r\n expect(error).instanceOf(IModelError);\r\n expect((error as IModelError).errorNumber).equal(IModelStatus.BadRequest);\r\n };\r\n\r\n it(\"rejects a file outside the cache that is not an iModel\", () => {\r\n const notes = writeFile(path.join(outsideDir, \"notes.txt\"));\r\n expectBadRequest(notes);\r\n expect(IModelJsFs.existsSync(notes)).to.be.true;\r\n });\r\n\r\n it(\"rejects paths that use '..' to escape the cache\", () => {\r\n const notes = writeFile(path.join(outsideDir, \"notes.txt\"));\r\n const escapingPath = `${insideDir}${path.sep}${path.relative(insideDir, notes)}`;\r\n expect(escapingPath.startsWith(insideDir)).to.be.true;\r\n expectBadRequest(escapingPath);\r\n });\r\n\r\n it(\"returns undefined for a missing file outside the cache, so its associated files are not deleted\", () => {\r\n writeFile(path.join(outsideDir, \"a.docx\"));\r\n expect(checkFrontendBriefcaseDelete(path.join(outsideDir, \"a\"), BriefcaseManager.cacheDir)).to.be.undefined;\r\n });\r\n\r\n it(\"allows a valid iModel outside the cache\", () => {\r\n const bim = createIModel(path.join(outsideDir, \"valid.bim\"));\r\n expect(checkFrontendBriefcaseDelete(bim, BriefcaseManager.cacheDir)).equal(path.resolve(bim));\r\n });\r\n\r\n it(\"allows any file, or missing file, inside the cache\", () => {\r\n const corrupt = writeFile(path.join(insideDir, \"2.bim\"), \"this is not an iModel\");\r\n expect(checkFrontendBriefcaseDelete(corrupt, BriefcaseManager.cacheDir)).equal(path.resolve(corrupt));\r\n\r\n const missing = path.join(insideDir, \"3.bim\");\r\n expect(checkFrontendBriefcaseDelete(missing, BriefcaseManager.cacheDir)).equal(path.resolve(missing));\r\n });\r\n\r\n it(\"treats the cache directory case-insensitively on Windows\", function () {\r\n if (process.platform !== \"win32\")\r\n this.skip();\r\n\r\n const corrupt = writeFile(path.join(insideDir, \"4.bim\"), \"this is not an iModel\");\r\n expect(checkFrontendBriefcaseDelete(corrupt.toUpperCase(), BriefcaseManager.cacheDir)).equal(path.resolve(corrupt.toUpperCase()));\r\n });\r\n });\r\n});\r\n"]}
@@ -0,0 +1,2 @@
1
+ import "../TestUtils";
2
+ //# sourceMappingURL=ChangeUnifier.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChangeUnifier.test.d.ts","sourceRoot":"","sources":["../../../../src/test/standalone/ChangeUnifier.test.ts"],"names":[],"mappings":"AAsBA,OAAO,cAAc,CAAC"}