@itwin/core-backend 4.8.0-dev.4 → 4.8.0-dev.41

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 (230) hide show
  1. package/CHANGELOG.md +62 -1
  2. package/lib/cjs/BackendHubAccess.d.ts +18 -16
  3. package/lib/cjs/BackendHubAccess.d.ts.map +1 -1
  4. package/lib/cjs/BackendHubAccess.js +16 -15
  5. package/lib/cjs/BackendHubAccess.js.map +1 -1
  6. package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
  7. package/lib/cjs/BriefcaseManager.js +19 -11
  8. package/lib/cjs/BriefcaseManager.js.map +1 -1
  9. package/lib/cjs/Category.d.ts +0 -6
  10. package/lib/cjs/Category.d.ts.map +1 -1
  11. package/lib/cjs/Category.js +0 -6
  12. package/lib/cjs/Category.js.map +1 -1
  13. package/lib/cjs/ChangeSummaryManager.d.ts.map +1 -1
  14. package/lib/cjs/ChangeSummaryManager.js +11 -9
  15. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  16. package/lib/cjs/ChangedElementsDb.d.ts +1 -0
  17. package/lib/cjs/ChangedElementsDb.d.ts.map +1 -1
  18. package/lib/cjs/ChangedElementsDb.js +6 -4
  19. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  20. package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
  21. package/lib/cjs/ChangesetECAdaptor.js +26 -21
  22. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  23. package/lib/cjs/ChannelControl.d.ts +4 -26
  24. package/lib/cjs/ChannelControl.d.ts.map +1 -1
  25. package/lib/cjs/ChannelControl.js +2 -101
  26. package/lib/cjs/ChannelControl.js.map +1 -1
  27. package/lib/cjs/CheckpointManager.d.ts.map +1 -1
  28. package/lib/cjs/CheckpointManager.js +5 -3
  29. package/lib/cjs/CheckpointManager.js.map +1 -1
  30. package/lib/cjs/ClassRegistry.d.ts.map +1 -1
  31. package/lib/cjs/ClassRegistry.js +3 -2
  32. package/lib/cjs/ClassRegistry.js.map +1 -1
  33. package/lib/cjs/CloudSqlite.d.ts +28 -11
  34. package/lib/cjs/CloudSqlite.d.ts.map +1 -1
  35. package/lib/cjs/CloudSqlite.js +42 -1
  36. package/lib/cjs/CloudSqlite.js.map +1 -1
  37. package/lib/cjs/DevTools.d.ts.map +1 -1
  38. package/lib/cjs/DevTools.js +2 -1
  39. package/lib/cjs/DevTools.js.map +1 -1
  40. package/lib/cjs/DisplayStyle.d.ts +0 -3
  41. package/lib/cjs/DisplayStyle.d.ts.map +1 -1
  42. package/lib/cjs/DisplayStyle.js +0 -3
  43. package/lib/cjs/DisplayStyle.js.map +1 -1
  44. package/lib/cjs/ECDb.d.ts +6 -1
  45. package/lib/cjs/ECDb.d.ts.map +1 -1
  46. package/lib/cjs/ECDb.js +19 -14
  47. package/lib/cjs/ECDb.js.map +1 -1
  48. package/lib/cjs/ECSchemaXmlContext.js +2 -2
  49. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  50. package/lib/cjs/ECSqlStatement.d.ts +6 -3
  51. package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
  52. package/lib/cjs/ECSqlStatement.js +3 -3
  53. package/lib/cjs/ECSqlStatement.js.map +1 -1
  54. package/lib/cjs/Element.d.ts +3 -60
  55. package/lib/cjs/Element.d.ts.map +1 -1
  56. package/lib/cjs/Element.js +8 -64
  57. package/lib/cjs/Element.js.map +1 -1
  58. package/lib/cjs/ElementAspect.d.ts +0 -5
  59. package/lib/cjs/ElementAspect.d.ts.map +1 -1
  60. package/lib/cjs/ElementAspect.js +4 -8
  61. package/lib/cjs/ElementAspect.js.map +1 -1
  62. package/lib/cjs/ElementGraphics.d.ts.map +1 -1
  63. package/lib/cjs/ElementGraphics.js +2 -1
  64. package/lib/cjs/ElementGraphics.js.map +1 -1
  65. package/lib/cjs/ElementTreeWalker.d.ts +19 -0
  66. package/lib/cjs/ElementTreeWalker.d.ts.map +1 -1
  67. package/lib/cjs/ElementTreeWalker.js +23 -9
  68. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  69. package/lib/cjs/GeoCoordConfig.d.ts.map +1 -1
  70. package/lib/cjs/GeoCoordConfig.js +2 -1
  71. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  72. package/lib/cjs/GeographicCRSServices.js +2 -2
  73. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  74. package/lib/cjs/GeometrySummary.d.ts.map +1 -1
  75. package/lib/cjs/GeometrySummary.js +2 -1
  76. package/lib/cjs/GeometrySummary.js.map +1 -1
  77. package/lib/cjs/IModelDb.d.ts +25 -95
  78. package/lib/cjs/IModelDb.d.ts.map +1 -1
  79. package/lib/cjs/IModelDb.js +192 -142
  80. package/lib/cjs/IModelDb.js.map +1 -1
  81. package/lib/cjs/IModelElementCloneContext.d.ts.map +1 -1
  82. package/lib/cjs/IModelElementCloneContext.js +5 -4
  83. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  84. package/lib/cjs/IModelHost.d.ts +5 -3
  85. package/lib/cjs/IModelHost.d.ts.map +1 -1
  86. package/lib/cjs/IModelHost.js +16 -18
  87. package/lib/cjs/IModelHost.js.map +1 -1
  88. package/lib/cjs/IpcHost.d.ts.map +1 -1
  89. package/lib/cjs/IpcHost.js +15 -13
  90. package/lib/cjs/IpcHost.js.map +1 -1
  91. package/lib/cjs/LocalHub.d.ts +2 -2
  92. package/lib/cjs/LocalHub.d.ts.map +1 -1
  93. package/lib/cjs/LocalHub.js +17 -17
  94. package/lib/cjs/LocalHub.js.map +1 -1
  95. package/lib/cjs/LockControl.d.ts +73 -0
  96. package/lib/cjs/LockControl.d.ts.map +1 -0
  97. package/lib/cjs/LockControl.js +11 -0
  98. package/lib/cjs/LockControl.js.map +1 -0
  99. package/lib/cjs/Material.d.ts +2 -5
  100. package/lib/cjs/Material.d.ts.map +1 -1
  101. package/lib/cjs/Material.js +6 -4
  102. package/lib/cjs/Material.js.map +1 -1
  103. package/lib/cjs/Model.d.ts +0 -22
  104. package/lib/cjs/Model.d.ts.map +1 -1
  105. package/lib/cjs/Model.js +5 -26
  106. package/lib/cjs/Model.js.map +1 -1
  107. package/lib/cjs/Relationship.d.ts +0 -12
  108. package/lib/cjs/Relationship.d.ts.map +1 -1
  109. package/lib/cjs/Relationship.js +5 -16
  110. package/lib/cjs/Relationship.js.map +1 -1
  111. package/lib/cjs/SQLiteDb.d.ts +6 -1
  112. package/lib/cjs/SQLiteDb.d.ts.map +1 -1
  113. package/lib/cjs/SQLiteDb.js +23 -16
  114. package/lib/cjs/SQLiteDb.js.map +1 -1
  115. package/lib/cjs/SchemaSync.d.ts +3 -0
  116. package/lib/cjs/SchemaSync.d.ts.map +1 -1
  117. package/lib/cjs/SchemaSync.js +24 -11
  118. package/lib/cjs/SchemaSync.js.map +1 -1
  119. package/lib/cjs/SchemaUtils.js +3 -3
  120. package/lib/cjs/SchemaUtils.js.map +1 -1
  121. package/lib/cjs/SqliteChangesetReader.d.ts.map +1 -1
  122. package/lib/cjs/SqliteChangesetReader.js +2 -2
  123. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  124. package/lib/cjs/SqliteStatement.js +2 -2
  125. package/lib/cjs/SqliteStatement.js.map +1 -1
  126. package/lib/cjs/TextAnnotationGeometry.d.ts +1 -1
  127. package/lib/cjs/TextAnnotationGeometry.d.ts.map +1 -1
  128. package/lib/cjs/TextAnnotationGeometry.js +9 -5
  129. package/lib/cjs/TextAnnotationGeometry.js.map +1 -1
  130. package/lib/cjs/TextAnnotationLayout.d.ts.map +1 -1
  131. package/lib/cjs/TextAnnotationLayout.js +18 -5
  132. package/lib/cjs/TextAnnotationLayout.js.map +1 -1
  133. package/lib/cjs/TxnManager.d.ts +2 -1
  134. package/lib/cjs/TxnManager.d.ts.map +1 -1
  135. package/lib/cjs/TxnManager.js +4 -2
  136. package/lib/cjs/TxnManager.js.map +1 -1
  137. package/lib/cjs/ViewDefinition.d.ts +1 -18
  138. package/lib/cjs/ViewDefinition.d.ts.map +1 -1
  139. package/lib/cjs/ViewDefinition.js +1 -18
  140. package/lib/cjs/ViewDefinition.js.map +1 -1
  141. package/lib/cjs/ViewStore.d.ts.map +1 -1
  142. package/lib/cjs/ViewStore.js +6 -5
  143. package/lib/cjs/ViewStore.js.map +1 -1
  144. package/lib/cjs/core-backend.d.ts +2 -1
  145. package/lib/cjs/core-backend.d.ts.map +1 -1
  146. package/lib/cjs/core-backend.js +3 -5
  147. package/lib/cjs/core-backend.js.map +1 -1
  148. package/lib/cjs/domains/FunctionalElements.d.ts +0 -10
  149. package/lib/cjs/domains/FunctionalElements.d.ts.map +1 -1
  150. package/lib/cjs/domains/FunctionalElements.js +0 -10
  151. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  152. package/lib/cjs/domains/FunctionalSchema.d.ts.map +1 -1
  153. package/lib/cjs/domains/FunctionalSchema.js +2 -1
  154. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  155. package/lib/cjs/domains/GenericElements.d.ts +0 -18
  156. package/lib/cjs/domains/GenericElements.d.ts.map +1 -1
  157. package/lib/cjs/domains/GenericElements.js +0 -18
  158. package/lib/cjs/domains/GenericElements.js.map +1 -1
  159. package/lib/cjs/internal/ChangesetConflictArgs.d.ts +24 -0
  160. package/lib/cjs/internal/ChangesetConflictArgs.d.ts.map +1 -0
  161. package/lib/cjs/internal/ChangesetConflictArgs.js +7 -0
  162. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -0
  163. package/lib/cjs/internal/ChannelAdmin.d.ts +34 -0
  164. package/lib/cjs/internal/ChannelAdmin.d.ts.map +1 -0
  165. package/lib/cjs/internal/ChannelAdmin.js +117 -0
  166. package/lib/cjs/internal/ChannelAdmin.js.map +1 -0
  167. package/lib/cjs/internal/NativePlatform.d.ts +15 -0
  168. package/lib/cjs/internal/NativePlatform.d.ts.map +1 -0
  169. package/lib/cjs/internal/NativePlatform.js +49 -0
  170. package/lib/cjs/internal/NativePlatform.js.map +1 -0
  171. package/lib/cjs/internal/NoLocks.d.ts +6 -0
  172. package/lib/cjs/internal/NoLocks.d.ts.map +1 -0
  173. package/lib/cjs/internal/NoLocks.js +31 -0
  174. package/lib/cjs/internal/NoLocks.js.map +1 -0
  175. package/lib/cjs/{ServerBasedLocks.d.ts → internal/ServerBasedLocks.d.ts} +10 -16
  176. package/lib/cjs/internal/ServerBasedLocks.d.ts.map +1 -0
  177. package/lib/cjs/{ServerBasedLocks.js → internal/ServerBasedLocks.js} +29 -18
  178. package/lib/cjs/internal/ServerBasedLocks.js.map +1 -0
  179. package/lib/cjs/internal/Symbols.d.ts +11 -0
  180. package/lib/cjs/internal/Symbols.d.ts.map +1 -0
  181. package/lib/cjs/internal/Symbols.js +21 -0
  182. package/lib/cjs/internal/Symbols.js.map +1 -0
  183. package/lib/cjs/internal/cross-package.d.ts +4 -0
  184. package/lib/cjs/internal/cross-package.d.ts.map +1 -0
  185. package/lib/cjs/internal/cross-package.js +16 -0
  186. package/lib/cjs/internal/cross-package.js.map +1 -0
  187. package/lib/cjs/internal/workspace/SettingsImpl.d.ts +2 -2
  188. package/lib/cjs/internal/workspace/SettingsImpl.d.ts.map +1 -1
  189. package/lib/cjs/internal/workspace/SettingsImpl.js +3 -3
  190. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  191. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js +2 -2
  192. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  193. package/lib/cjs/internal/workspace/WorkspaceImpl.js +14 -14
  194. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  195. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.d.ts.map +1 -1
  196. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js +2 -1
  197. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  198. package/lib/cjs/rpc/tracing.d.ts.map +1 -1
  199. package/lib/cjs/rpc/tracing.js +5 -2
  200. package/lib/cjs/rpc/tracing.js.map +1 -1
  201. package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts +1 -0
  202. package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
  203. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js +9 -4
  204. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  205. package/lib/cjs/rpc-impl/IModelTileRpcImpl.d.ts.map +1 -1
  206. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js +5 -3
  207. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  208. package/lib/cjs/workspace/Settings.d.ts +3 -3
  209. package/lib/cjs/workspace/Settings.d.ts.map +1 -1
  210. package/lib/cjs/workspace/Settings.js +1 -1
  211. package/lib/cjs/workspace/Settings.js.map +1 -1
  212. package/lib/cjs/workspace/SettingsSchemas.d.ts +2 -2
  213. package/lib/cjs/workspace/SettingsSchemas.d.ts.map +1 -1
  214. package/lib/cjs/workspace/SettingsSchemas.js +1 -1
  215. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  216. package/lib/cjs/workspace/Workspace.d.ts +4 -4
  217. package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
  218. package/lib/cjs/workspace/Workspace.js +1 -1
  219. package/lib/cjs/workspace/Workspace.js.map +1 -1
  220. package/lib/cjs/workspace/WorkspaceEditor.d.ts +2 -2
  221. package/lib/cjs/workspace/WorkspaceEditor.d.ts.map +1 -1
  222. package/lib/cjs/workspace/WorkspaceEditor.js +1 -1
  223. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  224. package/package.json +15 -14
  225. package/lib/cjs/ServerBasedLocks.d.ts.map +0 -1
  226. package/lib/cjs/ServerBasedLocks.js.map +0 -1
  227. package/lib/cjs/internal/ImplementationProhibited.d.ts +0 -44
  228. package/lib/cjs/internal/ImplementationProhibited.d.ts.map +0 -1
  229. package/lib/cjs/internal/ImplementationProhibited.js +0 -51
  230. package/lib/cjs/internal/ImplementationProhibited.js.map +0 -1
@@ -3,23 +3,24 @@
3
3
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
4
  * See LICENSE.md in the project root for license terms and full copyright notice.
5
5
  *--------------------------------------------------------------------------------------------*/
6
+ var _a;
6
7
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.ServerBasedLocks = void 0;
8
+ exports.createServerBasedLocks = exports.ServerBasedLocks = void 0;
8
9
  /** @packageDocumentation
9
10
  * @module iModels
10
11
  */
11
12
  const core_bentley_1 = require("@itwin/core-bentley");
12
13
  const core_common_1 = require("@itwin/core-common");
13
- const BackendHubAccess_1 = require("./BackendHubAccess");
14
- const IModelHost_1 = require("./IModelHost");
15
- const SQLiteDb_1 = require("./SQLiteDb");
16
- /** @internal */
14
+ const IModelHost_1 = require("../IModelHost");
15
+ const SQLiteDb_1 = require("../SQLiteDb");
16
+ const Symbols_1 = require("./Symbols");
17
17
  class ServerBasedLocks {
18
18
  get isServerBased() { return true; }
19
19
  constructor(iModel) {
20
+ this[_a] = undefined;
20
21
  this.lockDb = new SQLiteDb_1.SQLiteDb();
21
22
  this.briefcase = iModel;
22
- const dbName = `${iModel.nativeDb.getTempFileBaseName()}-locks`;
23
+ const dbName = `${iModel[Symbols_1._nativeDb].getTempFileBaseName()}-locks`;
23
24
  try {
24
25
  this.lockDb.openDb(dbName, core_bentley_1.OpenMode.ReadWrite);
25
26
  }
@@ -29,7 +30,7 @@ class ServerBasedLocks {
29
30
  this.lockDb.saveChanges();
30
31
  }
31
32
  }
32
- close() {
33
+ [(_a = Symbols_1._implementationProhibited, Symbols_1._close)]() {
33
34
  if (this.lockDb.isOpen)
34
35
  this.lockDb.closeDb();
35
36
  }
@@ -63,10 +64,16 @@ class ServerBasedLocks {
63
64
  return stmt.getValueInteger(0);
64
65
  });
65
66
  }
66
- async releaseAllLocks() {
67
+ async [Symbols_1._releaseAllLocks]() {
67
68
  await IModelHost_1.IModelHost.hubAccess.releaseAllLocks(this.briefcase); // throws if unsuccessful
68
69
  this.clearAllLocks();
69
70
  }
71
+ async releaseAllLocks() {
72
+ if (this.briefcase.txns.hasLocalChanges) {
73
+ throw new Error("Locks cannot be released while the briefcase contains local changes");
74
+ }
75
+ return this[Symbols_1._releaseAllLocks]();
76
+ }
70
77
  insertLock(id, state, origin) {
71
78
  this.lockDb.withPreparedSqliteStatement("INSERT INTO locks(id,state,origin) VALUES (?,?,?) ON CONFLICT(id) DO UPDATE SET state=excluded.state,origin=excluded.origin", (stmt) => {
72
79
  stmt.bindId(1, id);
@@ -82,23 +89,23 @@ class ServerBasedLocks {
82
89
  if (id === undefined || id === core_common_1.IModel.rootSubjectId)
83
90
  return false; // has no owners
84
91
  const { modelId, parentId } = this.getOwners(id);
85
- if (this.getLockState(modelId) === BackendHubAccess_1.LockState.Exclusive || this.getLockState(parentId) === BackendHubAccess_1.LockState.Exclusive)
92
+ if (this.getLockState(modelId) === core_common_1.LockState.Exclusive || this.getLockState(parentId) === core_common_1.LockState.Exclusive)
86
93
  return true;
87
94
  // see if this model is exclusively locked by one of its owners. If so, save that fact on modelId so future tests won't have to descend.
88
95
  if (this.ownerHoldsExclusiveLock(modelId))
89
- return this.insertLock(modelId, BackendHubAccess_1.LockState.Exclusive, 2 /* LockOrigin.Discovered */);
96
+ return this.insertLock(modelId, core_common_1.LockState.Exclusive, 2 /* LockOrigin.Discovered */);
90
97
  // see if the parent is exclusively locked by one of its owners. If so, save that fact on parentId so future tests won't have to descend.
91
- return this.ownerHoldsExclusiveLock(parentId) ? this.insertLock(parentId, BackendHubAccess_1.LockState.Exclusive, 2 /* LockOrigin.Discovered */) : false; // eslint-disable-line @typescript-eslint/no-non-null-assertion
98
+ return this.ownerHoldsExclusiveLock(parentId) ? this.insertLock(parentId, core_common_1.LockState.Exclusive, 2 /* LockOrigin.Discovered */) : false; // eslint-disable-line @typescript-eslint/no-non-null-assertion
92
99
  }
93
100
  /** Determine whether an the exclusive lock is already held by an element (or one of its owners) */
94
101
  holdsExclusiveLock(id) {
95
102
  // see if we hold the exclusive lock. or if one of the element's owners is exclusively locked (recursively)
96
- return this.getLockState(id) === BackendHubAccess_1.LockState.Exclusive || this.ownerHoldsExclusiveLock(id);
103
+ return this.getLockState(id) === core_common_1.LockState.Exclusive || this.ownerHoldsExclusiveLock(id);
97
104
  }
98
105
  holdsSharedLock(id) {
99
106
  const state = this.getLockState(id);
100
107
  // see if we hold shared or exclusive lock, or if an owner has exclusive lock. If so we implicitly have shared lock, but owner holding shared lock doesn't help.
101
- return (state === BackendHubAccess_1.LockState.Shared || state === BackendHubAccess_1.LockState.Exclusive) || this.ownerHoldsExclusiveLock(id);
108
+ return (state === core_common_1.LockState.Shared || state === core_common_1.LockState.Exclusive) || this.ownerHoldsExclusiveLock(id);
102
109
  }
103
110
  /** if the shared lock on the element supplied is not already held, add it to the set of shared locks required. Then, check owners. */
104
111
  addSharedLock(id, locks) {
@@ -124,7 +131,7 @@ class ServerBasedLocks {
124
131
  this.addOwnerSharedLocks(lock[0], sharedLocks);
125
132
  for (const shared of sharedLocks) {
126
133
  if (!locks.has(shared)) // we may already be asking for exclusive lock
127
- locks.set(shared, BackendHubAccess_1.LockState.Shared);
134
+ locks.set(shared, core_common_1.LockState.Shared);
128
135
  }
129
136
  await IModelHost_1.IModelHost.hubAccess.acquireLocks(this.briefcase, locks); // throws if unsuccessful
130
137
  for (const lock of locks)
@@ -136,20 +143,20 @@ class ServerBasedLocks {
136
143
  if (arg.shared) {
137
144
  for (const id of core_bentley_1.Id64.iterable(arg.shared)) {
138
145
  if (!this.holdsSharedLock(id))
139
- locks.set(id, BackendHubAccess_1.LockState.Shared);
146
+ locks.set(id, core_common_1.LockState.Shared);
140
147
  }
141
148
  }
142
149
  if (arg.exclusive) {
143
150
  for (const id of core_bentley_1.Id64.iterable(arg.exclusive)) {
144
151
  if (!this.holdsExclusiveLock(id))
145
- locks.set(id, BackendHubAccess_1.LockState.Exclusive);
152
+ locks.set(id, core_common_1.LockState.Exclusive);
146
153
  }
147
154
  }
148
155
  return this.acquireAllLocks(locks);
149
156
  }
150
157
  /** When an element is newly created in a session, we hold the lock on it implicitly. Save that fact. */
151
- elementWasCreated(id) {
152
- this.insertLock(id, BackendHubAccess_1.LockState.Exclusive, 1 /* LockOrigin.NewElement */);
158
+ [Symbols_1._elementWasCreated](id) {
159
+ this.insertLock(id, core_common_1.LockState.Exclusive, 1 /* LockOrigin.NewElement */);
153
160
  this.lockDb.saveChanges();
154
161
  }
155
162
  /** locks are not necessary during change propagation. */
@@ -166,4 +173,8 @@ class ServerBasedLocks {
166
173
  }
167
174
  }
168
175
  exports.ServerBasedLocks = ServerBasedLocks;
176
+ function createServerBasedLocks(iModel) {
177
+ return new ServerBasedLocks(iModel);
178
+ }
179
+ exports.createServerBasedLocks = createServerBasedLocks;
169
180
  //# sourceMappingURL=ServerBasedLocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerBasedLocks.js","sourceRoot":"","sources":["../../../src/internal/ServerBasedLocks.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\n/** @packageDocumentation\r\n * @module iModels\r\n */\r\n\r\nimport { DbResult, Id64, Id64Arg, Id64String, IModelStatus, OpenMode } from \"@itwin/core-bentley\";\r\nimport { IModel, IModelError, LockState } from \"@itwin/core-common\";\r\nimport { LockMap } from \"../BackendHubAccess\";\r\nimport { BriefcaseDb } from \"../IModelDb\";\r\nimport { LockControl } from \"../LockControl\";\r\nimport { IModelHost } from \"../IModelHost\";\r\nimport { SQLiteDb } from \"../SQLiteDb\";\r\nimport { _close, _elementWasCreated, _implementationProhibited, _nativeDb, _releaseAllLocks } from \"./Symbols\";\r\n\r\n/**\r\n * Both the Model and Parent of an element are considered \"owners\" of their member elements. That means:\r\n * 1) they must hold at least a shared lock before an exclusive lock can be acquired for their members\r\n * 2) if they hold an exclusive lock, then all of their members are exclusively locked implicitly.\r\n */\r\ninterface ElementOwners {\r\n readonly modelId: Id64String;\r\n readonly parentId: Id64String | undefined;\r\n}\r\n\r\n// eslint-disable-next-line no-restricted-syntax\r\nconst enum LockOrigin {\r\n Acquired = 0,\r\n NewElement = 1,\r\n Discovered = 2,\r\n}\r\n\r\nexport class ServerBasedLocks implements LockControl {\r\n public readonly [_implementationProhibited] = undefined;\r\n\r\n public get isServerBased() { return true; }\r\n protected readonly lockDb = new SQLiteDb();\r\n protected readonly briefcase: BriefcaseDb;\r\n\r\n public constructor(iModel: BriefcaseDb) {\r\n this.briefcase = iModel;\r\n const dbName = `${iModel[_nativeDb].getTempFileBaseName()}-locks`;\r\n try {\r\n this.lockDb.openDb(dbName, OpenMode.ReadWrite);\r\n } catch (_e) {\r\n this.lockDb.createDb(dbName);\r\n this.lockDb.executeSQL(\"CREATE TABLE locks(id INTEGER PRIMARY KEY NOT NULL,state INTEGER NOT NULL,origin INTEGER)\");\r\n this.lockDb.saveChanges();\r\n }\r\n }\r\n\r\n public [_close]() {\r\n if (this.lockDb.isOpen)\r\n this.lockDb.closeDb();\r\n }\r\n\r\n private getOwners(id: Id64String): ElementOwners {\r\n return this.briefcase.withPreparedSqliteStatement(\"SELECT ModelId,ParentId FROM bis_Element WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, id);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(rc, `element ${id} not found`);\r\n\r\n return { modelId: stmt.getValueId(0), parentId: stmt.getValueId(1) };\r\n });\r\n }\r\n\r\n private getLockState(id?: Id64String): LockState | undefined {\r\n return (id === undefined || !Id64.isValid(id)) ? undefined : this.lockDb.withPreparedSqliteStatement(\"SELECT state FROM locks WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, id);\r\n return (DbResult.BE_SQLITE_ROW === stmt.step()) ? stmt.getValueInteger(0) : undefined;\r\n });\r\n }\r\n\r\n /** Clear the cache of locally held locks.\r\n * Note: does *not* release locks from server.\r\n */\r\n private clearAllLocks() {\r\n this.lockDb.executeSQL(\"DELETE FROM locks\");\r\n this.lockDb.saveChanges();\r\n }\r\n\r\n /** only for tests */\r\n public getLockCount(state: LockState): number {\r\n return this.lockDb.withSqliteStatement(\"SELECT count(*) FROM locks WHERE state=?\", (stmt) => {\r\n stmt.bindInteger(1, state);\r\n stmt.step();\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n public async [_releaseAllLocks](): Promise<void> {\r\n await IModelHost.hubAccess.releaseAllLocks(this.briefcase); // throws if unsuccessful\r\n this.clearAllLocks();\r\n }\r\n\r\n public async releaseAllLocks(): Promise<void> {\r\n if (this.briefcase.txns.hasLocalChanges) {\r\n throw new Error(\"Locks cannot be released while the briefcase contains local changes\");\r\n }\r\n\r\n return this[_releaseAllLocks]();\r\n }\r\n\r\n private insertLock(id: Id64String, state: LockState, origin: LockOrigin): true {\r\n this.lockDb.withPreparedSqliteStatement(\"INSERT INTO locks(id,state,origin) VALUES (?,?,?) ON CONFLICT(id) DO UPDATE SET state=excluded.state,origin=excluded.origin\", (stmt) => {\r\n stmt.bindId(1, id);\r\n stmt.bindInteger(2, state);\r\n stmt.bindInteger(3, origin);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't insert lock into database\");\r\n });\r\n return true;\r\n }\r\n\r\n private ownerHoldsExclusiveLock(id: Id64String | undefined): boolean {\r\n if (id === undefined || id === IModel.rootSubjectId)\r\n return false; // has no owners\r\n\r\n const { modelId, parentId } = this.getOwners(id);\r\n if (this.getLockState(modelId) === LockState.Exclusive || this.getLockState(parentId) === LockState.Exclusive)\r\n return true;\r\n\r\n // see if this model is exclusively locked by one of its owners. If so, save that fact on modelId so future tests won't have to descend.\r\n if (this.ownerHoldsExclusiveLock(modelId))\r\n return this.insertLock(modelId, LockState.Exclusive, LockOrigin.Discovered);\r\n\r\n // see if the parent is exclusively locked by one of its owners. If so, save that fact on parentId so future tests won't have to descend.\r\n return this.ownerHoldsExclusiveLock(parentId) ? this.insertLock(parentId!, LockState.Exclusive, LockOrigin.Discovered) : false; // eslint-disable-line @typescript-eslint/no-non-null-assertion\r\n }\r\n\r\n /** Determine whether an the exclusive lock is already held by an element (or one of its owners) */\r\n public holdsExclusiveLock(id: Id64String): boolean {\r\n // see if we hold the exclusive lock. or if one of the element's owners is exclusively locked (recursively)\r\n return this.getLockState(id) === LockState.Exclusive || this.ownerHoldsExclusiveLock(id);\r\n }\r\n\r\n public holdsSharedLock(id: Id64String): boolean {\r\n const state = this.getLockState(id);\r\n // see if we hold shared or exclusive lock, or if an owner has exclusive lock. If so we implicitly have shared lock, but owner holding shared lock doesn't help.\r\n return (state === LockState.Shared || state === LockState.Exclusive) || this.ownerHoldsExclusiveLock(id);\r\n }\r\n\r\n /** if the shared lock on the element supplied is not already held, add it to the set of shared locks required. Then, check owners. */\r\n private addSharedLock(id: Id64String | undefined, locks: Set<Id64String>) {\r\n // if the id is not valid, or of the lock is already in the set, or if we already hold a shared lock, we're done\r\n // Note: if we hold a shared lock, it is guaranteed that we also hold all required shared locks on owners.\r\n if (id === undefined || !Id64.isValid(id) || locks.has(id) || this.holdsSharedLock(id))\r\n return;\r\n\r\n locks.add(id); // add to set of needed shared locks\r\n this.addOwnerSharedLocks(id, locks); // check parent models and groups\r\n }\r\n\r\n /** add owners (recursively) of an element to a list of required shared locks, if not already held. */\r\n private addOwnerSharedLocks(id: Id64String, locks: Set<Id64String>) {\r\n const el = this.getOwners(id);\r\n this.addSharedLock(el.parentId, locks); // if this element is in a group\r\n this.addSharedLock(el.modelId, locks); // check its model\r\n }\r\n\r\n /** attempt to acquire all necessary locks for a set of elements */\r\n private async acquireAllLocks(locks: LockMap) {\r\n if (locks.size === 0) // no locks are required.\r\n return;\r\n\r\n const sharedLocks = new Set<Id64String>();\r\n for (const lock of locks)\r\n this.addOwnerSharedLocks(lock[0], sharedLocks);\r\n\r\n for (const shared of sharedLocks) {\r\n if (!locks.has(shared)) // we may already be asking for exclusive lock\r\n locks.set(shared, LockState.Shared);\r\n }\r\n\r\n await IModelHost.hubAccess.acquireLocks(this.briefcase, locks); // throws if unsuccessful\r\n for (const lock of locks)\r\n this.insertLock(lock[0], lock[1], LockOrigin.Acquired);\r\n this.lockDb.saveChanges();\r\n }\r\n\r\n public async acquireLocks(arg: { shared?: Id64Arg, exclusive?: Id64Arg }): Promise<void> {\r\n const locks = new Map<Id64String, LockState>();\r\n if (arg.shared) {\r\n for (const id of Id64.iterable(arg.shared)) {\r\n if (!this.holdsSharedLock(id))\r\n locks.set(id, LockState.Shared);\r\n }\r\n }\r\n if (arg.exclusive) {\r\n for (const id of Id64.iterable(arg.exclusive)) {\r\n if (!this.holdsExclusiveLock(id))\r\n locks.set(id, LockState.Exclusive);\r\n }\r\n }\r\n return this.acquireAllLocks(locks);\r\n }\r\n\r\n /** When an element is newly created in a session, we hold the lock on it implicitly. Save that fact. */\r\n public [_elementWasCreated](id: Id64String) {\r\n this.insertLock(id, LockState.Exclusive, LockOrigin.NewElement);\r\n this.lockDb.saveChanges();\r\n }\r\n\r\n /** locks are not necessary during change propagation. */\r\n private get _locksAreRequired() { return !this.briefcase.txns.isIndirectChanges; }\r\n\r\n /** throw if locks are currently required and the exclusive lock is not held on the supplied element */\r\n public checkExclusiveLock(id: Id64String, type: string, operation: string) {\r\n if (this._locksAreRequired && !this.holdsExclusiveLock(id))\r\n throw new IModelError(IModelStatus.LockNotHeld, `exclusive lock not held on ${type} for ${operation} (id=${id})`);\r\n }\r\n\r\n /** throw if locks are currently required and a shared lock is not held on the supplied element */\r\n public checkSharedLock(id: Id64String, type: string, operation: string) {\r\n if (this._locksAreRequired && !this.holdsSharedLock(id))\r\n throw new IModelError(IModelStatus.LockNotHeld, `shared lock not held on ${type} for ${operation} (id=${id})`);\r\n }\r\n\r\n}\r\n\r\nexport function createServerBasedLocks(iModel: BriefcaseDb): LockControl {\r\n return new ServerBasedLocks(iModel);\r\n}\r\n"]}
@@ -0,0 +1,11 @@
1
+ /** @packageDocumentation
2
+ * @module Workspace
3
+ */
4
+ export declare const _implementationProhibited: unique symbol;
5
+ export declare const _close: unique symbol;
6
+ export declare const _elementWasCreated: unique symbol;
7
+ /** @internal */
8
+ export declare const _nativeDb: unique symbol;
9
+ export declare const _releaseAllLocks: unique symbol;
10
+ export declare const _verifyChannel: unique symbol;
11
+ //# sourceMappingURL=Symbols.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Symbols.d.ts","sourceRoot":"","sources":["../../../src/internal/Symbols.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,eAAO,MAAM,yBAAyB,eAAmG,CAAC;AAM1I,eAAO,MAAM,MAAM,eAA2B,CAAC;AAC/C,eAAO,MAAM,kBAAkB,eAAuC,CAAC;AACvE,gBAAgB;AAChB,eAAO,MAAM,SAAS,eAA8B,CAAC;AACrD,eAAO,MAAM,gBAAgB,eAAqC,CAAC;AACnE,eAAO,MAAM,cAAc,eAAmC,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ /** @packageDocumentation
7
+ * @module Workspace
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports._verifyChannel = exports._releaseAllLocks = exports._nativeDb = exports._elementWasCreated = exports._close = exports._implementationProhibited = void 0;
11
+ exports._implementationProhibited = Symbol.for("Implementations of this interface can only be obtained from the containing package");
12
+ function sym(name) {
13
+ return `${name}_core-backend_INTERNAL_ONLY_DO_NOT_USE`;
14
+ }
15
+ exports._close = Symbol.for(sym("close"));
16
+ exports._elementWasCreated = Symbol.for(sym("elementWasCreated"));
17
+ /** @internal */
18
+ exports._nativeDb = Symbol.for(sym("nativeDb"));
19
+ exports._releaseAllLocks = Symbol.for(sym("releaseAllLocks"));
20
+ exports._verifyChannel = Symbol.for(sym("verifyChannel"));
21
+ //# sourceMappingURL=Symbols.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Symbols.js","sourceRoot":"","sources":["../../../src/internal/Symbols.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEU,QAAA,yBAAyB,GAAG,MAAM,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC;AAE1I,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO,GAAG,IAAI,wCAAwC,CAAC;AACzD,CAAC;AAEY,QAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAClC,QAAA,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;AACvE,gBAAgB;AACH,QAAA,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;AACxC,QAAA,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;AACtD,QAAA,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC","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/** @packageDocumentation\r\n * @module Workspace\r\n */\r\n\r\nexport const _implementationProhibited = Symbol.for(\"Implementations of this interface can only be obtained from the containing package\");\r\n\r\nfunction sym(name: string): string {\r\n return `${name}_core-backend_INTERNAL_ONLY_DO_NOT_USE`;\r\n}\r\n\r\nexport const _close = Symbol.for(sym(\"close\"));\r\nexport const _elementWasCreated = Symbol.for(sym(\"elementWasCreated\"));\r\n/** @internal */\r\nexport const _nativeDb = Symbol.for(sym(\"nativeDb\"));\r\nexport const _releaseAllLocks = Symbol.for(sym(\"releaseAllLocks\"));\r\nexport const _verifyChannel = Symbol.for(sym(\"verifyChannel\"));\r\n"]}
@@ -0,0 +1,4 @@
1
+ export { IModelJsNative, NativeCloudSqlite, NativeLoggerCategory } from "@bentley/imodeljs-native";
2
+ export { IModelNative } from "./NativePlatform";
3
+ export { _nativeDb, } from "./Symbols";
4
+ //# sourceMappingURL=cross-package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-package.d.ts","sourceRoot":"","sources":["../../../src/internal/cross-package.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACnG,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EACL,SAAS,GACV,MAAM,WAAW,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports._nativeDb = exports.IModelNative = exports.NativeLoggerCategory = exports.NativeCloudSqlite = exports.IModelJsNative = void 0;
8
+ var imodeljs_native_1 = require("@bentley/imodeljs-native");
9
+ Object.defineProperty(exports, "IModelJsNative", { enumerable: true, get: function () { return imodeljs_native_1.IModelJsNative; } });
10
+ Object.defineProperty(exports, "NativeCloudSqlite", { enumerable: true, get: function () { return imodeljs_native_1.NativeCloudSqlite; } });
11
+ Object.defineProperty(exports, "NativeLoggerCategory", { enumerable: true, get: function () { return imodeljs_native_1.NativeLoggerCategory; } });
12
+ var NativePlatform_1 = require("./NativePlatform");
13
+ Object.defineProperty(exports, "IModelNative", { enumerable: true, get: function () { return NativePlatform_1.IModelNative; } });
14
+ var Symbols_1 = require("./Symbols");
15
+ Object.defineProperty(exports, "_nativeDb", { enumerable: true, get: function () { return Symbols_1._nativeDb; } });
16
+ //# sourceMappingURL=cross-package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-package.js","sourceRoot":"","sources":["../../../src/internal/cross-package.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,4DAAmG;AAA1F,iHAAA,cAAc,OAAA;AAAE,oHAAA,iBAAiB,OAAA;AAAE,uHAAA,oBAAoB,OAAA;AAChE,mDAAgD;AAAvC,8GAAA,YAAY,OAAA;AACrB,qCAEmB;AADjB,oGAAA,SAAS,OAAA","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\nexport { IModelJsNative, NativeCloudSqlite, NativeLoggerCategory } from \"@bentley/imodeljs-native\";\r\nexport { IModelNative } from \"./NativePlatform\";\r\nexport {\r\n _nativeDb,\r\n} from \"./Symbols\";\r\n"]}
@@ -4,13 +4,13 @@
4
4
  import { BeEvent } from "@itwin/core-bentley";
5
5
  import { LocalDirName, LocalFileName } from "@itwin/core-common";
6
6
  import { Setting, SettingName, Settings, SettingsContainer, SettingsDictionary, SettingsDictionaryProps, SettingsDictionarySource, SettingsPriority } from "../../workspace/Settings";
7
- import { implementationProhibited } from "../ImplementationProhibited";
7
+ import { _implementationProhibited } from "../Symbols";
8
8
  /**
9
9
  * Internal implementation of Settings interface.
10
10
  * @internal
11
11
  */
12
12
  export declare class SettingsImpl implements Settings {
13
- readonly [implementationProhibited]: undefined;
13
+ readonly [_implementationProhibited]: undefined;
14
14
  dictionaries: SettingsDictionary[];
15
15
  protected verifyPriority(_priority: SettingsPriority): void;
16
16
  close(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsImpl.d.ts","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsImpl.ts"],"names":[],"mappings":"AAIA;;GAEG;AAKH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEtL,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAsBvE;;;GAGG;AACH,qBAAa,YAAa,YAAW,QAAQ;IAC3C,SAAgB,CAAC,wBAAwB,CAAC,YAAa;IAChD,YAAY,EAAE,kBAAkB,EAAE,CAAM;IAC/C,SAAS,CAAC,cAAc,CAAC,SAAS,EAAE,gBAAgB;IAC7C,KAAK;IACZ,SAAgB,iBAAiB,gBAAqB,IAAI,EAAI;IAEvD,OAAO,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB;IAI3D,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB;IAQ9D,OAAO,CAAC,KAAK,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM;IAI5D,aAAa,CAAC,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,iBAAiB;IAiBzE,aAAa,CAAC,MAAM,EAAE,wBAAwB,GAAG,kBAAkB,GAAG,SAAS;IAQ/E,cAAc,CAAC,MAAM,EAAE,wBAAwB,EAAE,UAAU,UAAO;IAYhE,iBAAiB,CAAC,CAAC,SAAS,OAAO,EAAE,WAAW,EAAE,WAAW,GAAG,QAAQ,CAAC;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,UAAU,EAAE,kBAAkB,CAAA;KAAC,CAAC;IASrH,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAAE,WAAW,EAAE,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC;IAM5E,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAS/F,OAAO,CAAC,SAAS;IAMV,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IAC1D,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS;IAIhD,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO;IAC7D,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,GAAG,SAAS;IAIlD,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IAC1D,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS;IAIhD,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC;IAClE,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,CAAC,GAAG,SAAS;IAK7D,QAAQ,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IACtE,QAAQ,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,CAAC,EAAE,GAAG,SAAS;IActE,OAAO,CAAC,gBAAgB;CAgBzB"}
1
+ {"version":3,"file":"SettingsImpl.d.ts","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsImpl.ts"],"names":[],"mappings":"AAIA;;GAEG;AAKH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEtL,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAsBvD;;;GAGG;AACH,qBAAa,YAAa,YAAW,QAAQ;IAC3C,SAAgB,CAAC,yBAAyB,CAAC,YAAa;IACjD,YAAY,EAAE,kBAAkB,EAAE,CAAM;IAC/C,SAAS,CAAC,cAAc,CAAC,SAAS,EAAE,gBAAgB;IAC7C,KAAK;IACZ,SAAgB,iBAAiB,gBAAqB,IAAI,EAAI;IAEvD,OAAO,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB;IAI3D,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB;IAQ9D,OAAO,CAAC,KAAK,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM;IAI5D,aAAa,CAAC,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,iBAAiB;IAiBzE,aAAa,CAAC,MAAM,EAAE,wBAAwB,GAAG,kBAAkB,GAAG,SAAS;IAQ/E,cAAc,CAAC,MAAM,EAAE,wBAAwB,EAAE,UAAU,UAAO;IAYhE,iBAAiB,CAAC,CAAC,SAAS,OAAO,EAAE,WAAW,EAAE,WAAW,GAAG,QAAQ,CAAC;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,UAAU,EAAE,kBAAkB,CAAA;KAAC,CAAC;IASrH,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAAE,WAAW,EAAE,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC;IAM5E,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAS/F,OAAO,CAAC,SAAS;IAMV,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IAC1D,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS;IAIhD,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO;IAC7D,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,GAAG,SAAS;IAIlD,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IAC1D,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS;IAIhD,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC;IAClE,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,CAAC,GAAG,SAAS;IAK7D,QAAQ,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IACtE,QAAQ,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,CAAC,EAAE,GAAG,SAAS;IActE,OAAO,CAAC,gBAAgB;CAgBzB"}
@@ -16,7 +16,7 @@ const core_bentley_1 = require("@itwin/core-bentley");
16
16
  const IModelJsFs_1 = require("../../IModelJsFs");
17
17
  const Settings_1 = require("../../workspace/Settings");
18
18
  const IModelHost_1 = require("../../IModelHost");
19
- const ImplementationProhibited_1 = require("../ImplementationProhibited");
19
+ const Symbols_1 = require("../Symbols");
20
20
  const dictionaryMatches = (d1, d2) => {
21
21
  return (d1.workspaceDb === d2.workspaceDb) && (d1.name === d2.name);
22
22
  };
@@ -31,7 +31,7 @@ class SettingsDictionaryImpl {
31
31
  return undefined !== value ? Settings_1.Setting.clone(value) : undefined;
32
32
  }
33
33
  }
34
- _a = ImplementationProhibited_1.implementationProhibited;
34
+ _a = Symbols_1._implementationProhibited;
35
35
  /**
36
36
  * Internal implementation of Settings interface.
37
37
  * @internal
@@ -157,5 +157,5 @@ class SettingsImpl {
157
157
  }
158
158
  }
159
159
  exports.SettingsImpl = SettingsImpl;
160
- _b = ImplementationProhibited_1.implementationProhibited;
160
+ _b = Symbols_1._implementationProhibited;
161
161
  //# sourceMappingURL=SettingsImpl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsImpl.js","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsImpl.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/** @packageDocumentation\r\n * @module Workspace\r\n */\r\n\r\nimport * as fs from \"fs-extra\";\r\nimport { parse } from \"json5\";\r\nimport { extname, join } from \"path\";\r\nimport { BeEvent } from \"@itwin/core-bentley\";\r\nimport { LocalDirName, LocalFileName } from \"@itwin/core-common\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { Setting, SettingName, Settings, SettingsContainer, SettingsDictionary, SettingsDictionaryProps, SettingsDictionarySource, SettingsPriority } from \"../../workspace/Settings\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { implementationProhibited } from \"../ImplementationProhibited\";\r\n\r\nconst dictionaryMatches = (d1: SettingsDictionarySource, d2: SettingsDictionarySource): boolean => {\r\n return (d1.workspaceDb === d2.workspaceDb) && (d1.name === d2.name);\r\n};\r\n\r\nclass SettingsDictionaryImpl implements SettingsDictionary {\r\n public readonly [implementationProhibited] = undefined;\r\n public readonly props: SettingsDictionaryProps;\r\n public readonly settings: SettingsContainer;\r\n\r\n public constructor(props: SettingsDictionaryProps, settings: SettingsContainer) {\r\n this.props = { ...props }; // make a copy so it can't be changed by caller\r\n this.settings = settings;\r\n }\r\n\r\n public getSetting<T extends Setting>(settingName: string): T | undefined {\r\n const value = this.settings[settingName] as T | undefined;\r\n return undefined !== value ? Setting.clone(value) : undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Internal implementation of Settings interface.\r\n * @internal\r\n */\r\nexport class SettingsImpl implements Settings {\r\n public readonly [implementationProhibited] = undefined;\r\n public dictionaries: SettingsDictionary[] = [];\r\n protected verifyPriority(_priority: SettingsPriority) { }\r\n public close() { }\r\n public readonly onSettingsChanged = new BeEvent<() => void>();\r\n\r\n public addFile(fileName: LocalFileName, priority: SettingsPriority) {\r\n this.addJson({ name: fileName, priority }, fs.readFileSync(fileName, \"utf-8\"));\r\n }\r\n\r\n public addDirectory(dirName: LocalDirName, priority: SettingsPriority) {\r\n for (const fileName of IModelJsFs.readdirSync(dirName)) {\r\n const ext = extname(fileName);\r\n if (ext === \".json5\" || ext === \".json\")\r\n this.addFile(join(dirName, fileName), priority);\r\n }\r\n }\r\n\r\n public addJson(props: SettingsDictionaryProps, settingsJson: string) {\r\n this.addDictionary(props, parse(settingsJson));\r\n }\r\n\r\n public addDictionary(props: SettingsDictionaryProps, settings: SettingsContainer) {\r\n this.verifyPriority(props.priority);\r\n this.dropDictionary(props, false); // make sure we don't have the same dictionary twice\r\n const dict = new SettingsDictionaryImpl(props, settings);\r\n const doAdd = () => {\r\n for (let i = 0; i < this.dictionaries.length; ++i) {\r\n if (this.dictionaries[i].props.priority <= dict.props.priority) {\r\n this.dictionaries.splice(i, 0, dict);\r\n return;\r\n }\r\n }\r\n this.dictionaries.push(dict);\r\n };\r\n doAdd();\r\n this.onSettingsChanged.raiseEvent();\r\n }\r\n\r\n public getDictionary(source: SettingsDictionarySource): SettingsDictionary | undefined {\r\n for (const dictionary of this.dictionaries) {\r\n if (dictionaryMatches(dictionary.props, source))\r\n return dictionary;\r\n }\r\n return undefined;\r\n }\r\n\r\n public dropDictionary(source: SettingsDictionarySource, raiseEvent = true) {\r\n for (let i = 0; i < this.dictionaries.length; ++i) {\r\n if (dictionaryMatches(this.dictionaries[i].props, source)) {\r\n this.dictionaries.splice(i, 1);\r\n if (raiseEvent)\r\n this.onSettingsChanged.raiseEvent();\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n public * getSettingEntries<T extends Setting>(settingName: SettingName): Iterable<{ value: T, dictionary: SettingsDictionary}> {\r\n for (const dictionary of this.dictionaries) {\r\n const value = dictionary.getSetting<T>(settingName);\r\n if (undefined !== value) {\r\n yield { value, dictionary };\r\n }\r\n }\r\n }\r\n\r\n public * getSettingValues<T extends Setting>(settingName: SettingName): Iterable<T> {\r\n for (const entry of this.getSettingEntries<T>(settingName)) {\r\n yield entry.value;\r\n }\r\n }\r\n\r\n public getSetting<T extends Setting>(settingName: SettingName, defaultValue?: T): T | undefined {\r\n for (const value of this.getSettingValues<T>(settingName)) {\r\n return value;\r\n }\r\n\r\n return defaultValue;\r\n }\r\n\r\n // get the setting and verify the result is either undefined or the correct type. If so, return it. Otherwise throw an exception.\r\n private getResult<T extends Setting>(name: SettingName, expectedType: string) {\r\n const out = this.getSetting<T>(name);\r\n if (out === undefined || typeof out === expectedType)\r\n return out;\r\n throw new Error(`setting \"${name}\" is not a ${expectedType}: ${typeof out}`);\r\n }\r\n public getString(name: SettingName, defaultValue: string): string;\r\n public getString(name: SettingName): string | undefined;\r\n public getString(name: SettingName, defaultValue?: string): string | undefined {\r\n return this.getResult<string>(name, \"string\") ?? defaultValue;\r\n }\r\n public getBoolean(name: SettingName, defaultValue: boolean): boolean;\r\n public getBoolean(name: SettingName): boolean | undefined;\r\n public getBoolean(name: SettingName, defaultValue?: boolean): boolean | undefined {\r\n return this.getResult<boolean>(name, \"boolean\") ?? defaultValue;\r\n }\r\n public getNumber(name: SettingName, defaultValue: number): number;\r\n public getNumber(name: SettingName): number | undefined;\r\n public getNumber(name: SettingName, defaultValue?: number): number | undefined {\r\n return this.getResult<number>(name, \"number\") ?? defaultValue;\r\n }\r\n public getObject<T extends object>(name: SettingName, defaultValue: T): T;\r\n public getObject<T extends object>(name: SettingName): T | undefined;\r\n public getObject<T extends object>(name: SettingName, defaultValue?: T): T | undefined {\r\n const out = this.getResult<T>(name, \"object\");\r\n return out ? IModelHost.settingsSchemas.validateSetting(out, name) : defaultValue;\r\n }\r\n public getArray<T extends Setting>(name: SettingName, defaultValue: T[]): T[];\r\n public getArray<T extends Setting>(name: SettingName): T[] | undefined;\r\n public getArray<T extends Setting>(name: SettingName, defaultValue?: T[]): T[] | undefined {\r\n if (IModelHost.settingsSchemas.settingDefs.get(name)?.combineArray) {\r\n return this.getCombinedArray<T>(name, defaultValue);\r\n }\r\n\r\n const out = this.getSetting<T[]>(name);\r\n if (out === undefined)\r\n return defaultValue;\r\n if (!Array.isArray(out))\r\n throw new Error(`setting ${name} is not an array: ${out}`);\r\n return IModelHost.settingsSchemas.validateSetting(out, name);\r\n }\r\n\r\n private getCombinedArray<T extends Setting>(name: SettingName, defaultValue?: T[]): T[] | undefined {\r\n let foundSetting = false;\r\n const out: T[] = [];\r\n for (const array of this.getSettingValues<T[]>(name)) {\r\n foundSetting = true;\r\n\r\n IModelHost.settingsSchemas.validateSetting(array, name);\r\n for (const value of array) {\r\n if (undefined === out.find((x) => Setting.areEqual(x, value))) {\r\n out.push(value);\r\n }\r\n }\r\n }\r\n\r\n return foundSetting ? out : defaultValue;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"SettingsImpl.js","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsImpl.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/** @packageDocumentation\r\n * @module Workspace\r\n */\r\n\r\nimport * as fs from \"fs-extra\";\r\nimport { parse } from \"json5\";\r\nimport { extname, join } from \"path\";\r\nimport { BeEvent } from \"@itwin/core-bentley\";\r\nimport { LocalDirName, LocalFileName } from \"@itwin/core-common\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { Setting, SettingName, Settings, SettingsContainer, SettingsDictionary, SettingsDictionaryProps, SettingsDictionarySource, SettingsPriority } from \"../../workspace/Settings\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { _implementationProhibited } from \"../Symbols\";\r\n\r\nconst dictionaryMatches = (d1: SettingsDictionarySource, d2: SettingsDictionarySource): boolean => {\r\n return (d1.workspaceDb === d2.workspaceDb) && (d1.name === d2.name);\r\n};\r\n\r\nclass SettingsDictionaryImpl implements SettingsDictionary {\r\n public readonly [_implementationProhibited] = undefined;\r\n public readonly props: SettingsDictionaryProps;\r\n public readonly settings: SettingsContainer;\r\n\r\n public constructor(props: SettingsDictionaryProps, settings: SettingsContainer) {\r\n this.props = { ...props }; // make a copy so it can't be changed by caller\r\n this.settings = settings;\r\n }\r\n\r\n public getSetting<T extends Setting>(settingName: string): T | undefined {\r\n const value = this.settings[settingName] as T | undefined;\r\n return undefined !== value ? Setting.clone(value) : undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Internal implementation of Settings interface.\r\n * @internal\r\n */\r\nexport class SettingsImpl implements Settings {\r\n public readonly [_implementationProhibited] = undefined;\r\n public dictionaries: SettingsDictionary[] = [];\r\n protected verifyPriority(_priority: SettingsPriority) { }\r\n public close() { }\r\n public readonly onSettingsChanged = new BeEvent<() => void>();\r\n\r\n public addFile(fileName: LocalFileName, priority: SettingsPriority) {\r\n this.addJson({ name: fileName, priority }, fs.readFileSync(fileName, \"utf-8\"));\r\n }\r\n\r\n public addDirectory(dirName: LocalDirName, priority: SettingsPriority) {\r\n for (const fileName of IModelJsFs.readdirSync(dirName)) {\r\n const ext = extname(fileName);\r\n if (ext === \".json5\" || ext === \".json\")\r\n this.addFile(join(dirName, fileName), priority);\r\n }\r\n }\r\n\r\n public addJson(props: SettingsDictionaryProps, settingsJson: string) {\r\n this.addDictionary(props, parse(settingsJson));\r\n }\r\n\r\n public addDictionary(props: SettingsDictionaryProps, settings: SettingsContainer) {\r\n this.verifyPriority(props.priority);\r\n this.dropDictionary(props, false); // make sure we don't have the same dictionary twice\r\n const dict = new SettingsDictionaryImpl(props, settings);\r\n const doAdd = () => {\r\n for (let i = 0; i < this.dictionaries.length; ++i) {\r\n if (this.dictionaries[i].props.priority <= dict.props.priority) {\r\n this.dictionaries.splice(i, 0, dict);\r\n return;\r\n }\r\n }\r\n this.dictionaries.push(dict);\r\n };\r\n doAdd();\r\n this.onSettingsChanged.raiseEvent();\r\n }\r\n\r\n public getDictionary(source: SettingsDictionarySource): SettingsDictionary | undefined {\r\n for (const dictionary of this.dictionaries) {\r\n if (dictionaryMatches(dictionary.props, source))\r\n return dictionary;\r\n }\r\n return undefined;\r\n }\r\n\r\n public dropDictionary(source: SettingsDictionarySource, raiseEvent = true) {\r\n for (let i = 0; i < this.dictionaries.length; ++i) {\r\n if (dictionaryMatches(this.dictionaries[i].props, source)) {\r\n this.dictionaries.splice(i, 1);\r\n if (raiseEvent)\r\n this.onSettingsChanged.raiseEvent();\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n public * getSettingEntries<T extends Setting>(settingName: SettingName): Iterable<{ value: T, dictionary: SettingsDictionary}> {\r\n for (const dictionary of this.dictionaries) {\r\n const value = dictionary.getSetting<T>(settingName);\r\n if (undefined !== value) {\r\n yield { value, dictionary };\r\n }\r\n }\r\n }\r\n\r\n public * getSettingValues<T extends Setting>(settingName: SettingName): Iterable<T> {\r\n for (const entry of this.getSettingEntries<T>(settingName)) {\r\n yield entry.value;\r\n }\r\n }\r\n\r\n public getSetting<T extends Setting>(settingName: SettingName, defaultValue?: T): T | undefined {\r\n for (const value of this.getSettingValues<T>(settingName)) {\r\n return value;\r\n }\r\n\r\n return defaultValue;\r\n }\r\n\r\n // get the setting and verify the result is either undefined or the correct type. If so, return it. Otherwise throw an exception.\r\n private getResult<T extends Setting>(name: SettingName, expectedType: string) {\r\n const out = this.getSetting<T>(name);\r\n if (out === undefined || typeof out === expectedType)\r\n return out;\r\n throw new Error(`setting \"${name}\" is not a ${expectedType}: ${typeof out}`);\r\n }\r\n public getString(name: SettingName, defaultValue: string): string;\r\n public getString(name: SettingName): string | undefined;\r\n public getString(name: SettingName, defaultValue?: string): string | undefined {\r\n return this.getResult<string>(name, \"string\") ?? defaultValue;\r\n }\r\n public getBoolean(name: SettingName, defaultValue: boolean): boolean;\r\n public getBoolean(name: SettingName): boolean | undefined;\r\n public getBoolean(name: SettingName, defaultValue?: boolean): boolean | undefined {\r\n return this.getResult<boolean>(name, \"boolean\") ?? defaultValue;\r\n }\r\n public getNumber(name: SettingName, defaultValue: number): number;\r\n public getNumber(name: SettingName): number | undefined;\r\n public getNumber(name: SettingName, defaultValue?: number): number | undefined {\r\n return this.getResult<number>(name, \"number\") ?? defaultValue;\r\n }\r\n public getObject<T extends object>(name: SettingName, defaultValue: T): T;\r\n public getObject<T extends object>(name: SettingName): T | undefined;\r\n public getObject<T extends object>(name: SettingName, defaultValue?: T): T | undefined {\r\n const out = this.getResult<T>(name, \"object\");\r\n return out ? IModelHost.settingsSchemas.validateSetting(out, name) : defaultValue;\r\n }\r\n public getArray<T extends Setting>(name: SettingName, defaultValue: T[]): T[];\r\n public getArray<T extends Setting>(name: SettingName): T[] | undefined;\r\n public getArray<T extends Setting>(name: SettingName, defaultValue?: T[]): T[] | undefined {\r\n if (IModelHost.settingsSchemas.settingDefs.get(name)?.combineArray) {\r\n return this.getCombinedArray<T>(name, defaultValue);\r\n }\r\n\r\n const out = this.getSetting<T[]>(name);\r\n if (out === undefined)\r\n return defaultValue;\r\n if (!Array.isArray(out))\r\n throw new Error(`setting ${name} is not an array: ${out}`);\r\n return IModelHost.settingsSchemas.validateSetting(out, name);\r\n }\r\n\r\n private getCombinedArray<T extends Setting>(name: SettingName, defaultValue?: T[]): T[] | undefined {\r\n let foundSetting = false;\r\n const out: T[] = [];\r\n for (const array of this.getSettingValues<T[]>(name)) {\r\n foundSetting = true;\r\n\r\n IModelHost.settingsSchemas.validateSetting(array, name);\r\n for (const value of array) {\r\n if (undefined === out.find((x) => Setting.areEqual(x, value))) {\r\n out.push(value);\r\n }\r\n }\r\n }\r\n\r\n return foundSetting ? out : defaultValue;\r\n }\r\n}\r\n"]}
@@ -14,7 +14,7 @@ const json5_1 = require("json5");
14
14
  const path_1 = require("path");
15
15
  const core_bentley_1 = require("@itwin/core-bentley");
16
16
  const IModelJsFs_1 = require("../../IModelJsFs");
17
- const ImplementationProhibited_1 = require("../ImplementationProhibited");
17
+ const Symbols_1 = require("../Symbols");
18
18
  const makeSettingKey = (prefix, key) => `${prefix}/${key}`;
19
19
  class SettingsSchemasImpl {
20
20
  constructor() {
@@ -268,7 +268,7 @@ class SettingsSchemasImpl {
268
268
  }
269
269
  }
270
270
  }
271
- _a = ImplementationProhibited_1.implementationProhibited;
271
+ _a = Symbols_1._implementationProhibited;
272
272
  function constructSettingsSchemas() {
273
273
  return new SettingsSchemasImpl();
274
274
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsSchemasImpl.js","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsSchemasImpl.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/** @packageDocumentation\r\n * @module Workspace\r\n */\r\n\r\nimport * as fs from \"fs-extra\";\r\nimport { parse } from \"json5\";\r\nimport { extname, join } from \"path\";\r\nimport { assert, BeEvent, JSONSchemaType, JSONSchemaTypeName, Mutable } from \"@itwin/core-bentley\";\r\nimport { LocalDirName, LocalFileName } from \"@itwin/core-common\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { SettingGroupSchema, SettingSchema, SettingsSchemas } from \"../../workspace/SettingsSchemas\";\r\nimport { implementationProhibited } from \"../ImplementationProhibited\";\r\n\r\nconst makeSettingKey = (prefix: string, key: string) => `${prefix}/${key}`;\r\n\r\nclass SettingsSchemasImpl implements SettingsSchemas {\r\n public readonly [implementationProhibited] = undefined;\r\n private readonly _allGroups = new Map<string, SettingGroupSchema>();\r\n /** a map of all registered Setting Definitions */\r\n public readonly settingDefs = new Map<string, SettingSchema>();\r\n /** a map of all registered TypeDefs */\r\n public readonly typeDefs = new Map<string, SettingSchema>();\r\n /** event that signals that the values in [[allSchemas]] have changed in some way. */\r\n public readonly onSchemaChanged = new BeEvent<() => void>();\r\n\r\n private verifyType<T>(val: T, expectedType: JSONSchemaTypeName, path: string) {\r\n if (expectedType === \"integer\") {\r\n if (Number.isInteger(val))\r\n return;\r\n } else if (expectedType === \"null\") {\r\n if (val === null || val === undefined)\r\n return;\r\n } else if (typeof val === expectedType)\r\n return;\r\n\r\n throw new Error(`value for ${path}: \"${val}\" is wrong type, expected ${expectedType}`);\r\n }\r\n\r\n public validateSetting<T>(value: T, settingName: string): T {\r\n const settingDef = this.settingDefs.get(settingName);\r\n if (undefined !== settingDef) // if there's no setting definition, there's no rules so just return ok\r\n this.validateProperty(value, settingDef, settingName);\r\n return value;\r\n }\r\n\r\n /** @internal */\r\n public getObjectProperties(propDef: Readonly<SettingSchema>, scope: string): { required?: string[], properties: { [name: string]: SettingSchema } } {\r\n let required = propDef.required;\r\n let properties = propDef.properties;\r\n\r\n // if this object extends a typeDef, add typeDef's properties and required values, recursively\r\n if (propDef.extends !== undefined) {\r\n const typeDef = this.typeDefs.get(propDef.extends);\r\n if (undefined === typeDef)\r\n throw new Error(`typeDef ${propDef.extends} does not exist for ${scope}`);\r\n const expanded = this.getObjectProperties(typeDef, `${scope}.${propDef.extends}`);\r\n if (expanded.required)\r\n required = required ? [...required, ...expanded.required] : expanded.required;\r\n if (expanded.properties) {\r\n properties = properties ? { ...expanded.properties, ...properties } : expanded.properties;\r\n }\r\n }\r\n properties = properties ?? {};\r\n return { required, properties };\r\n }\r\n\r\n /** @internal */\r\n public getArrayItems(propDef: Readonly<SettingSchema>, scope: string): SettingSchema {\r\n let items = propDef.items;\r\n if (undefined === items && propDef.extends) {\r\n const typeDef = this.typeDefs.get(propDef.extends);\r\n if (undefined === typeDef)\r\n throw new Error(`typeDef ${propDef.extends} does not exist for ${scope}`);\r\n items = typeDef.items;\r\n }\r\n if (undefined === items)\r\n throw new Error(`array ${scope} has no items definition`);\r\n return items;\r\n }\r\n\r\n private validateProperty<T>(val: T, propDef: Readonly<SettingSchema>, path: string) {\r\n switch (propDef.type) {\r\n case \"boolean\":\r\n case \"number\":\r\n case \"string\":\r\n case \"integer\":\r\n case \"null\":\r\n return this.verifyType(val, propDef.type, path);\r\n\r\n case \"array\":\r\n if (!Array.isArray(val))\r\n throw new Error(`Property ${path} must be an array`);\r\n const items = this.getArrayItems(propDef, path);\r\n for (let i = 0; i < val.length; ++i)\r\n this.validateProperty(val[i], items, `${path}[${i}]`);\r\n return;\r\n }\r\n if (!val || typeof val !== \"object\")\r\n throw new Error(`${path} must be an object`);\r\n\r\n const { required, properties } = this.getObjectProperties(propDef, path);\r\n\r\n // first ensure all required properties are present\r\n if (undefined !== required) {\r\n for (const entry of required) {\r\n const value = (val as any)[entry];\r\n if (undefined === value)\r\n throw new Error(`required value for \"${entry}\" is missing in \"${path}\"`);\r\n }\r\n }\r\n\r\n // you can supply default values in typeDefs. See if any members are undefined that have a default.\r\n if (undefined !== properties) {\r\n for (const [key, prop] of Object.entries(properties)) {\r\n if ((val as any)[key] === undefined && prop.default)\r\n (val as any)[key] = prop.default;\r\n }\r\n }\r\n\r\n // then validate all values in the supplied object are valid\r\n for (const key of Object.keys(val)) {\r\n const prop = properties[key];\r\n if (prop !== undefined) { // note: extra values are ignored.\r\n this.validateProperty((val as any)[key], prop, `${path}.${key}`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Add one or more [[SettingSchemaGroup]]s. `SettingSchemaGroup`s must include a `schemaPrefix` member that is used\r\n * to identify the group. If a group with the same name is already registered, the old values are first removed and then the new group is added.\r\n */\r\n public addGroup(settingsGroup: SettingGroupSchema | SettingGroupSchema[]): void {\r\n if (!Array.isArray(settingsGroup))\r\n settingsGroup = [settingsGroup];\r\n\r\n this.doAdd(settingsGroup);\r\n this.onSchemaChanged.raiseEvent();\r\n }\r\n\r\n /** Add a [[SettingSchemaGroup]] from stringified json5. */\r\n public addJson(settingSchema: string): void {\r\n this.addGroup(parse(settingSchema));\r\n }\r\n\r\n /** Add a [[SettingSchemaGroup]] from a json5 file. */\r\n public addFile(fileName: LocalFileName): void {\r\n try {\r\n this.addJson(fs.readFileSync(fileName, \"utf-8\"));\r\n } catch (e: any) {\r\n throw new Error(`parsing SettingSchema file \"${fileName}\": ${e.message}\"`);\r\n }\r\n }\r\n\r\n /** Add all files with a either \".json\" or \".json5\" extension from a supplied directory. */\r\n public addDirectory(dirName: LocalDirName) {\r\n for (const fileName of IModelJsFs.readdirSync(dirName)) {\r\n const ext = extname(fileName);\r\n if (ext === \".json5\" || ext === \".json\")\r\n this.addFile(join(dirName, fileName));\r\n }\r\n }\r\n\r\n /** Remove a previously added [[SettingSchemaGroup]] by schemaPrefix */\r\n public removeGroup(schemaPrefix: string): void {\r\n this.doRemove(schemaPrefix);\r\n this.onSchemaChanged.raiseEvent();\r\n }\r\n\r\n private doAdd(settingsGroup: SettingGroupSchema[]) {\r\n settingsGroup.forEach((group) => {\r\n if (undefined === group.schemaPrefix)\r\n throw new Error(`settings group has no \"schemaPrefix\" member`);\r\n\r\n this.doRemove(group.schemaPrefix);\r\n this.validateAndAdd(group);\r\n this._allGroups.set(group.schemaPrefix, group);\r\n });\r\n }\r\n\r\n private doRemove(schemaPrefix: string) {\r\n const group = this._allGroups.get(schemaPrefix);\r\n if (undefined !== group?.settingDefs) {\r\n for (const key of Object.keys(group.settingDefs))\r\n this.settingDefs.delete(makeSettingKey(schemaPrefix, key));\r\n }\r\n if (undefined !== group?.typeDefs) {\r\n for (const key of Object.keys(group.typeDefs))\r\n this.settingDefs.delete(makeSettingKey(schemaPrefix, key));\r\n }\r\n this._allGroups.delete(schemaPrefix);\r\n }\r\n\r\n private validateName(name: string) {\r\n if (!name.trim())\r\n throw new Error(`empty property name`);\r\n }\r\n\r\n private verifyPropertyDef(name: string, property: SettingSchema | undefined) {\r\n if (!property)\r\n throw new Error(`missing required property ${name}`);\r\n\r\n if (!property.type)\r\n throw new Error(`property ${name} has no type`);\r\n\r\n switch (property.type) {\r\n case \"boolean\":\r\n case \"integer\":\r\n case \"null\":\r\n case \"number\":\r\n case \"string\":\r\n return;\r\n\r\n case \"object\":\r\n const required = property.required;\r\n const props = property.properties;\r\n if (required && props) {\r\n for (const entry of required) {\r\n if (undefined === props[entry])\r\n throw new Error(`missing required property of ${name}: \"${entry}\"`);\r\n }\r\n }\r\n if (props) {\r\n for (const key of Object.keys(props))\r\n try {\r\n this.verifyPropertyDef(key, props[key]);\r\n } catch (e: any) {\r\n throw new Error(`property ${key} of ${name}: ${e.message}`);\r\n }\r\n }\r\n return;\r\n\r\n case \"array\":\r\n if (typeof property.extends === \"string\")\r\n return;\r\n if (typeof property.items !== \"object\")\r\n throw new Error(`array property ${name} has no items member`);\r\n try {\r\n this.verifyPropertyDef(\"items\", property.items);\r\n } catch (e: any) {\r\n throw new Error(`array property ${name}: ${e.message}`);\r\n }\r\n return;\r\n\r\n default:\r\n throw new Error(`property ${name} has illegal type \"${property.type}\"`);\r\n }\r\n }\r\n\r\n private validateAndAdd(group: SettingGroupSchema) {\r\n const settingDefs = group.settingDefs;\r\n if (undefined !== settingDefs) {\r\n for (const key of Object.keys(settingDefs)) {\r\n this.validateName(key);\r\n this.verifyPropertyDef(key, settingDefs[key]);\r\n const property: Mutable<SettingSchema> | undefined = settingDefs[key];\r\n assert(undefined !== property);\r\n property.default = property.default ?? this.getDefaultValue(property.type);\r\n this.settingDefs.set(makeSettingKey(group.schemaPrefix, key), property);\r\n }\r\n }\r\n const typeDefs = group.typeDefs ?? {};\r\n for (const key of Object.keys(typeDefs)) {\r\n this.validateName(key);\r\n this.verifyPropertyDef(key, typeDefs[key]);\r\n const typeDef = typeDefs[key];\r\n assert(undefined !== typeDef);\r\n this.typeDefs.set(makeSettingKey(group.schemaPrefix, key), typeDef);\r\n }\r\n }\r\n\r\n private getDefaultValue(type: JSONSchemaTypeName | JSONSchemaTypeName[]): JSONSchemaType | undefined {\r\n type = Array.isArray(type) ? type[0] : type;\r\n switch (type) {\r\n case \"boolean\":\r\n return false;\r\n case \"integer\":\r\n case \"number\":\r\n return 0;\r\n case \"string\":\r\n return \"\";\r\n case \"array\":\r\n return [];\r\n case \"object\":\r\n return {};\r\n default:\r\n return undefined;\r\n }\r\n }\r\n}\r\n\r\nexport function constructSettingsSchemas(): SettingsSchemas {\r\n return new SettingsSchemasImpl();\r\n}\r\n"]}
1
+ {"version":3,"file":"SettingsSchemasImpl.js","sourceRoot":"","sources":["../../../../src/internal/workspace/SettingsSchemasImpl.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/** @packageDocumentation\r\n * @module Workspace\r\n */\r\n\r\nimport * as fs from \"fs-extra\";\r\nimport { parse } from \"json5\";\r\nimport { extname, join } from \"path\";\r\nimport { assert, BeEvent, JSONSchemaType, JSONSchemaTypeName, Mutable } from \"@itwin/core-bentley\";\r\nimport { LocalDirName, LocalFileName } from \"@itwin/core-common\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { SettingGroupSchema, SettingSchema, SettingsSchemas } from \"../../workspace/SettingsSchemas\";\r\nimport { _implementationProhibited } from \"../Symbols\";\r\n\r\nconst makeSettingKey = (prefix: string, key: string) => `${prefix}/${key}`;\r\n\r\nclass SettingsSchemasImpl implements SettingsSchemas {\r\n public readonly [_implementationProhibited] = undefined;\r\n private readonly _allGroups = new Map<string, SettingGroupSchema>();\r\n /** a map of all registered Setting Definitions */\r\n public readonly settingDefs = new Map<string, SettingSchema>();\r\n /** a map of all registered TypeDefs */\r\n public readonly typeDefs = new Map<string, SettingSchema>();\r\n /** event that signals that the values in [[allSchemas]] have changed in some way. */\r\n public readonly onSchemaChanged = new BeEvent<() => void>();\r\n\r\n private verifyType<T>(val: T, expectedType: JSONSchemaTypeName, path: string) {\r\n if (expectedType === \"integer\") {\r\n if (Number.isInteger(val))\r\n return;\r\n } else if (expectedType === \"null\") {\r\n if (val === null || val === undefined)\r\n return;\r\n } else if (typeof val === expectedType)\r\n return;\r\n\r\n throw new Error(`value for ${path}: \"${val}\" is wrong type, expected ${expectedType}`);\r\n }\r\n\r\n public validateSetting<T>(value: T, settingName: string): T {\r\n const settingDef = this.settingDefs.get(settingName);\r\n if (undefined !== settingDef) // if there's no setting definition, there's no rules so just return ok\r\n this.validateProperty(value, settingDef, settingName);\r\n return value;\r\n }\r\n\r\n /** @internal */\r\n public getObjectProperties(propDef: Readonly<SettingSchema>, scope: string): { required?: string[], properties: { [name: string]: SettingSchema } } {\r\n let required = propDef.required;\r\n let properties = propDef.properties;\r\n\r\n // if this object extends a typeDef, add typeDef's properties and required values, recursively\r\n if (propDef.extends !== undefined) {\r\n const typeDef = this.typeDefs.get(propDef.extends);\r\n if (undefined === typeDef)\r\n throw new Error(`typeDef ${propDef.extends} does not exist for ${scope}`);\r\n const expanded = this.getObjectProperties(typeDef, `${scope}.${propDef.extends}`);\r\n if (expanded.required)\r\n required = required ? [...required, ...expanded.required] : expanded.required;\r\n if (expanded.properties) {\r\n properties = properties ? { ...expanded.properties, ...properties } : expanded.properties;\r\n }\r\n }\r\n properties = properties ?? {};\r\n return { required, properties };\r\n }\r\n\r\n /** @internal */\r\n public getArrayItems(propDef: Readonly<SettingSchema>, scope: string): SettingSchema {\r\n let items = propDef.items;\r\n if (undefined === items && propDef.extends) {\r\n const typeDef = this.typeDefs.get(propDef.extends);\r\n if (undefined === typeDef)\r\n throw new Error(`typeDef ${propDef.extends} does not exist for ${scope}`);\r\n items = typeDef.items;\r\n }\r\n if (undefined === items)\r\n throw new Error(`array ${scope} has no items definition`);\r\n return items;\r\n }\r\n\r\n private validateProperty<T>(val: T, propDef: Readonly<SettingSchema>, path: string) {\r\n switch (propDef.type) {\r\n case \"boolean\":\r\n case \"number\":\r\n case \"string\":\r\n case \"integer\":\r\n case \"null\":\r\n return this.verifyType(val, propDef.type, path);\r\n\r\n case \"array\":\r\n if (!Array.isArray(val))\r\n throw new Error(`Property ${path} must be an array`);\r\n const items = this.getArrayItems(propDef, path);\r\n for (let i = 0; i < val.length; ++i)\r\n this.validateProperty(val[i], items, `${path}[${i}]`);\r\n return;\r\n }\r\n if (!val || typeof val !== \"object\")\r\n throw new Error(`${path} must be an object`);\r\n\r\n const { required, properties } = this.getObjectProperties(propDef, path);\r\n\r\n // first ensure all required properties are present\r\n if (undefined !== required) {\r\n for (const entry of required) {\r\n const value = (val as any)[entry];\r\n if (undefined === value)\r\n throw new Error(`required value for \"${entry}\" is missing in \"${path}\"`);\r\n }\r\n }\r\n\r\n // you can supply default values in typeDefs. See if any members are undefined that have a default.\r\n if (undefined !== properties) {\r\n for (const [key, prop] of Object.entries(properties)) {\r\n if ((val as any)[key] === undefined && prop.default)\r\n (val as any)[key] = prop.default;\r\n }\r\n }\r\n\r\n // then validate all values in the supplied object are valid\r\n for (const key of Object.keys(val)) {\r\n const prop = properties[key];\r\n if (prop !== undefined) { // note: extra values are ignored.\r\n this.validateProperty((val as any)[key], prop, `${path}.${key}`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Add one or more [[SettingSchemaGroup]]s. `SettingSchemaGroup`s must include a `schemaPrefix` member that is used\r\n * to identify the group. If a group with the same name is already registered, the old values are first removed and then the new group is added.\r\n */\r\n public addGroup(settingsGroup: SettingGroupSchema | SettingGroupSchema[]): void {\r\n if (!Array.isArray(settingsGroup))\r\n settingsGroup = [settingsGroup];\r\n\r\n this.doAdd(settingsGroup);\r\n this.onSchemaChanged.raiseEvent();\r\n }\r\n\r\n /** Add a [[SettingSchemaGroup]] from stringified json5. */\r\n public addJson(settingSchema: string): void {\r\n this.addGroup(parse(settingSchema));\r\n }\r\n\r\n /** Add a [[SettingSchemaGroup]] from a json5 file. */\r\n public addFile(fileName: LocalFileName): void {\r\n try {\r\n this.addJson(fs.readFileSync(fileName, \"utf-8\"));\r\n } catch (e: any) {\r\n throw new Error(`parsing SettingSchema file \"${fileName}\": ${e.message}\"`);\r\n }\r\n }\r\n\r\n /** Add all files with a either \".json\" or \".json5\" extension from a supplied directory. */\r\n public addDirectory(dirName: LocalDirName) {\r\n for (const fileName of IModelJsFs.readdirSync(dirName)) {\r\n const ext = extname(fileName);\r\n if (ext === \".json5\" || ext === \".json\")\r\n this.addFile(join(dirName, fileName));\r\n }\r\n }\r\n\r\n /** Remove a previously added [[SettingSchemaGroup]] by schemaPrefix */\r\n public removeGroup(schemaPrefix: string): void {\r\n this.doRemove(schemaPrefix);\r\n this.onSchemaChanged.raiseEvent();\r\n }\r\n\r\n private doAdd(settingsGroup: SettingGroupSchema[]) {\r\n settingsGroup.forEach((group) => {\r\n if (undefined === group.schemaPrefix)\r\n throw new Error(`settings group has no \"schemaPrefix\" member`);\r\n\r\n this.doRemove(group.schemaPrefix);\r\n this.validateAndAdd(group);\r\n this._allGroups.set(group.schemaPrefix, group);\r\n });\r\n }\r\n\r\n private doRemove(schemaPrefix: string) {\r\n const group = this._allGroups.get(schemaPrefix);\r\n if (undefined !== group?.settingDefs) {\r\n for (const key of Object.keys(group.settingDefs))\r\n this.settingDefs.delete(makeSettingKey(schemaPrefix, key));\r\n }\r\n if (undefined !== group?.typeDefs) {\r\n for (const key of Object.keys(group.typeDefs))\r\n this.settingDefs.delete(makeSettingKey(schemaPrefix, key));\r\n }\r\n this._allGroups.delete(schemaPrefix);\r\n }\r\n\r\n private validateName(name: string) {\r\n if (!name.trim())\r\n throw new Error(`empty property name`);\r\n }\r\n\r\n private verifyPropertyDef(name: string, property: SettingSchema | undefined) {\r\n if (!property)\r\n throw new Error(`missing required property ${name}`);\r\n\r\n if (!property.type)\r\n throw new Error(`property ${name} has no type`);\r\n\r\n switch (property.type) {\r\n case \"boolean\":\r\n case \"integer\":\r\n case \"null\":\r\n case \"number\":\r\n case \"string\":\r\n return;\r\n\r\n case \"object\":\r\n const required = property.required;\r\n const props = property.properties;\r\n if (required && props) {\r\n for (const entry of required) {\r\n if (undefined === props[entry])\r\n throw new Error(`missing required property of ${name}: \"${entry}\"`);\r\n }\r\n }\r\n if (props) {\r\n for (const key of Object.keys(props))\r\n try {\r\n this.verifyPropertyDef(key, props[key]);\r\n } catch (e: any) {\r\n throw new Error(`property ${key} of ${name}: ${e.message}`);\r\n }\r\n }\r\n return;\r\n\r\n case \"array\":\r\n if (typeof property.extends === \"string\")\r\n return;\r\n if (typeof property.items !== \"object\")\r\n throw new Error(`array property ${name} has no items member`);\r\n try {\r\n this.verifyPropertyDef(\"items\", property.items);\r\n } catch (e: any) {\r\n throw new Error(`array property ${name}: ${e.message}`);\r\n }\r\n return;\r\n\r\n default:\r\n throw new Error(`property ${name} has illegal type \"${property.type}\"`);\r\n }\r\n }\r\n\r\n private validateAndAdd(group: SettingGroupSchema) {\r\n const settingDefs = group.settingDefs;\r\n if (undefined !== settingDefs) {\r\n for (const key of Object.keys(settingDefs)) {\r\n this.validateName(key);\r\n this.verifyPropertyDef(key, settingDefs[key]);\r\n const property: Mutable<SettingSchema> | undefined = settingDefs[key];\r\n assert(undefined !== property);\r\n property.default = property.default ?? this.getDefaultValue(property.type);\r\n this.settingDefs.set(makeSettingKey(group.schemaPrefix, key), property);\r\n }\r\n }\r\n const typeDefs = group.typeDefs ?? {};\r\n for (const key of Object.keys(typeDefs)) {\r\n this.validateName(key);\r\n this.verifyPropertyDef(key, typeDefs[key]);\r\n const typeDef = typeDefs[key];\r\n assert(undefined !== typeDef);\r\n this.typeDefs.set(makeSettingKey(group.schemaPrefix, key), typeDef);\r\n }\r\n }\r\n\r\n private getDefaultValue(type: JSONSchemaTypeName | JSONSchemaTypeName[]): JSONSchemaType | undefined {\r\n type = Array.isArray(type) ? type[0] : type;\r\n switch (type) {\r\n case \"boolean\":\r\n return false;\r\n case \"integer\":\r\n case \"number\":\r\n return 0;\r\n case \"string\":\r\n return \"\";\r\n case \"array\":\r\n return [];\r\n case \"object\":\r\n return {};\r\n default:\r\n return undefined;\r\n }\r\n }\r\n}\r\n\r\nexport function constructSettingsSchemas(): SettingsSchemas {\r\n return new SettingsSchemasImpl();\r\n}\r\n"]}
@@ -24,7 +24,7 @@ const Workspace_1 = require("../../workspace/Workspace");
24
24
  const WorkspaceEditor_1 = require("../../workspace/WorkspaceEditor");
25
25
  const WorkspaceSqliteDb_1 = require("./WorkspaceSqliteDb");
26
26
  const SettingsImpl_1 = require("./SettingsImpl");
27
- const ImplementationProhibited_1 = require("../ImplementationProhibited");
27
+ const Symbols_1 = require("../Symbols");
28
28
  function workspaceDbNameWithDefault(dbName) {
29
29
  return dbName ?? "workspace-db";
30
30
  }
@@ -139,14 +139,14 @@ class WorkspaceContainerImpl {
139
139
  this.cloudContainer?.sharedDisconnect();
140
140
  }
141
141
  }
142
- _a = ImplementationProhibited_1.implementationProhibited;
142
+ _a = Symbols_1._implementationProhibited;
143
143
  /** Implementation of WorkspaceDb */
144
144
  class WorkspaceDbImpl {
145
145
  /** true if this WorkspaceDb is currently open */
146
146
  get isOpen() { return this.sqliteDb.isOpen; }
147
147
  get container() { return this._container; }
148
148
  queryFileResource(rscName) {
149
- const info = this.sqliteDb.nativeDb.queryEmbeddedFile(rscName);
149
+ const info = this.sqliteDb[Symbols_1._nativeDb].queryEmbeddedFile(rscName);
150
150
  if (undefined === info)
151
151
  return undefined;
152
152
  // since resource names can contain illegal characters, path separators, etc., we make the local file name from its hash, in hex.
@@ -182,7 +182,7 @@ class WorkspaceDbImpl {
182
182
  }
183
183
  get manifest() {
184
184
  return this._manifest ??= this.withOpenDb((db) => {
185
- const manifestJson = db.nativeDb.queryFileProperty(exports.workspaceManifestProperty, true);
185
+ const manifestJson = db[Symbols_1._nativeDb].queryFileProperty(exports.workspaceManifestProperty, true);
186
186
  return manifestJson ? JSON.parse(manifestJson) : { workspaceName: this.dbName };
187
187
  });
188
188
  }
@@ -207,7 +207,7 @@ class WorkspaceDbImpl {
207
207
  return this.sqliteDb.withSqliteStatement("SELECT rowid from blobs WHERE id=?", (stmt) => {
208
208
  stmt.bindString(1, rscName);
209
209
  const blobReader = SQLiteDb_1.SQLiteDb.createBlobIO();
210
- blobReader.open(this.sqliteDb.nativeDb, { tableName: "blobs", columnName: "value", row: stmt.getValueInteger(0) });
210
+ blobReader.open(this.sqliteDb[Symbols_1._nativeDb], { tableName: "blobs", columnName: "value", row: stmt.getValueInteger(0) });
211
211
  return blobReader;
212
212
  });
213
213
  }
@@ -235,7 +235,7 @@ class WorkspaceDbImpl {
235
235
  fs.removeSync(localFileName);
236
236
  else
237
237
  IModelJsFs_1.IModelJsFs.recursiveMkDirSync((0, path_1.dirname)(localFileName));
238
- db.nativeDb.extractEmbeddedFile({ name: rscName, localFileName });
238
+ db[Symbols_1._nativeDb].extractEmbeddedFile({ name: rscName, localFileName });
239
239
  const date = new Date(info.date);
240
240
  fs.utimesSync(localFileName, date, date); // set the last-modified date of the file to match date in container
241
241
  fs.chmodSync(localFileName, "0444"); // set file readonly
@@ -266,7 +266,7 @@ class WorkspaceDbImpl {
266
266
  });
267
267
  }
268
268
  }
269
- _b = ImplementationProhibited_1.implementationProhibited;
269
+ _b = Symbols_1._implementationProhibited;
270
270
  /** Implementation of Workspace */
271
271
  class WorkspaceImpl {
272
272
  getCloudCache() {
@@ -389,7 +389,7 @@ class WorkspaceImpl {
389
389
  return result;
390
390
  }
391
391
  }
392
- _c = ImplementationProhibited_1.implementationProhibited;
392
+ _c = Symbols_1._implementationProhibited;
393
393
  const workspaceEditorName = "WorkspaceEditor"; // name of the cache for the editor workspace
394
394
  class EditorWorkspaceImpl extends WorkspaceImpl {
395
395
  getCloudCache() {
@@ -430,7 +430,7 @@ class EditorImpl {
430
430
  this.workspace.close();
431
431
  }
432
432
  }
433
- _d = ImplementationProhibited_1.implementationProhibited;
433
+ _d = Symbols_1._implementationProhibited;
434
434
  class EditorContainerImpl extends WorkspaceContainerImpl {
435
435
  get cloudContainer() {
436
436
  return super.cloudContainer;
@@ -559,7 +559,7 @@ class EditableDbImpl extends WorkspaceDbImpl {
559
559
  this.sqliteDb.saveChanges();
560
560
  }
561
561
  updateManifest(manifest) {
562
- this.sqliteDb.nativeDb.saveFileProperty(exports.workspaceManifestProperty, JSON.stringify(manifest));
562
+ this.sqliteDb[Symbols_1._nativeDb].saveFileProperty(exports.workspaceManifestProperty, JSON.stringify(manifest));
563
563
  this._manifest = undefined;
564
564
  }
565
565
  updateSettingsResource(settings, rscName) {
@@ -590,7 +590,7 @@ class EditableDbImpl extends WorkspaceDbImpl {
590
590
  return this.sqliteDb.withSqliteStatement("SELECT rowid from blobs WHERE id=?", (stmt) => {
591
591
  stmt.bindString(1, rscName);
592
592
  const blobWriter = SQLiteDb_1.SQLiteDb.createBlobIO();
593
- blobWriter.open(this.sqliteDb.nativeDb, { tableName: "blobs", columnName: "value", row: stmt.getValueInteger(0), writeable: true });
593
+ blobWriter.open(this.sqliteDb[Symbols_1._nativeDb], { tableName: "blobs", columnName: "value", row: stmt.getValueInteger(0), writeable: true });
594
594
  return blobWriter;
595
595
  });
596
596
  }
@@ -602,11 +602,11 @@ class EditableDbImpl extends WorkspaceDbImpl {
602
602
  fileExt = fileExt ?? (0, path_1.extname)(localFileName);
603
603
  if (fileExt?.[0] === ".")
604
604
  fileExt = fileExt.slice(1);
605
- this.sqliteDb.nativeDb.embedFile({ name: rscName, localFileName, date: this.getFileModifiedTime(localFileName), fileExt });
605
+ this.sqliteDb[Symbols_1._nativeDb].embedFile({ name: rscName, localFileName, date: this.getFileModifiedTime(localFileName), fileExt });
606
606
  }
607
607
  updateFile(rscName, localFileName) {
608
608
  this.queryFileResource(rscName); // throws if not present
609
- this.sqliteDb.nativeDb.replaceEmbeddedFile({ name: rscName, localFileName, date: this.getFileModifiedTime(localFileName) });
609
+ this.sqliteDb[Symbols_1._nativeDb].replaceEmbeddedFile({ name: rscName, localFileName, date: this.getFileModifiedTime(localFileName) });
610
610
  }
611
611
  removeFile(rscName) {
612
612
  const file = this.queryFileResource(rscName);
@@ -614,7 +614,7 @@ class EditableDbImpl extends WorkspaceDbImpl {
614
614
  throw new Error(`file resource "${rscName}" does not exist`);
615
615
  if (file && fs.existsSync(file.localFileName))
616
616
  fs.unlinkSync(file.localFileName);
617
- this.sqliteDb.nativeDb.removeEmbeddedFile(rscName);
617
+ this.sqliteDb[Symbols_1._nativeDb].removeEmbeddedFile(rscName);
618
618
  }
619
619
  }
620
620
  function constructWorkspaceDb(props, container) {