@vived/host 5.2.2 → 5.2.3

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 (320) hide show
  1. package/dist/cjs/AppSandbox/Adapters/babylonInspectorSupportedAdapter.js +24 -0
  2. package/dist/cjs/AppSandbox/Adapters/babylonInspectorSupportedAdapter.js.map +1 -0
  3. package/dist/cjs/AppSandbox/Adapters/index.js +1 -0
  4. package/dist/cjs/AppSandbox/Adapters/index.js.map +1 -1
  5. package/dist/cjs/AppSandbox/Controller/index.js +1 -0
  6. package/dist/cjs/AppSandbox/Controller/index.js.map +1 -1
  7. package/dist/cjs/AppSandbox/Controller/setBabylonInspectorSupported.js +13 -0
  8. package/dist/cjs/AppSandbox/Controller/setBabylonInspectorSupported.js.map +1 -0
  9. package/dist/cjs/AppSandbox/Entities/AppSandboxEntity.js +7 -0
  10. package/dist/cjs/AppSandbox/Entities/AppSandboxEntity.js.map +1 -1
  11. package/dist/cjs/AppSandbox/Factories/AppSandboxFeatureFactory.js +1 -0
  12. package/dist/cjs/AppSandbox/Factories/AppSandboxFeatureFactory.js.map +1 -1
  13. package/dist/cjs/AppSandbox/Factories/index.js.map +1 -1
  14. package/dist/cjs/AppSandbox/Mocks/BabylonInspectorSupportedPMMock.js +16 -0
  15. package/dist/cjs/AppSandbox/Mocks/BabylonInspectorSupportedPMMock.js.map +1 -0
  16. package/dist/cjs/AppSandbox/Mocks/index.js +1 -0
  17. package/dist/cjs/AppSandbox/Mocks/index.js.map +1 -1
  18. package/dist/cjs/AppSandbox/PMs/BabylonInspectorSupportedPM.js +37 -0
  19. package/dist/cjs/AppSandbox/PMs/BabylonInspectorSupportedPM.js.map +1 -0
  20. package/dist/cjs/AppSandbox/PMs/DevFeaturesEnabledPM.js.map +1 -1
  21. package/dist/cjs/AppSandbox/PMs/ShowInspectorPM.js.map +1 -1
  22. package/dist/cjs/AppSandbox/PMs/StartInZSpacePM.js.map +1 -1
  23. package/dist/cjs/AppSandbox/PMs/index.js +1 -0
  24. package/dist/cjs/AppSandbox/PMs/index.js.map +1 -1
  25. package/dist/cjs/Apps/Entities/AppEntity.js.map +1 -1
  26. package/dist/cjs/Apps/Entities/AppRepo.js.map +1 -1
  27. package/dist/cjs/Apps/Factories/AppsFeatureFactory.js.map +1 -1
  28. package/dist/cjs/Apps/Factories/index.js.map +1 -1
  29. package/dist/cjs/Apps/UCs/Mounters/MounterUC.js.map +1 -1
  30. package/dist/cjs/Apps/UCs/Mounters/SandboxMounterUC.js.map +1 -1
  31. package/dist/cjs/Apps/UCs/StartAppUC.js.map +1 -1
  32. package/dist/cjs/Apps/UCs/StopAppUC.js.map +1 -1
  33. package/dist/cjs/Apps/index.js.map +1 -1
  34. package/dist/cjs/AssetPlugin/Factories/AssetPluginFeatureFactory.js.map +1 -1
  35. package/dist/cjs/AssetPlugin/Factories/index.js.map +1 -1
  36. package/dist/cjs/Assets/Adapters/assetFileAdapter.js.map +1 -1
  37. package/dist/cjs/Assets/Controllers/archiveAsset.js.map +1 -1
  38. package/dist/cjs/Assets/Controllers/deleteAsset.js.map +1 -1
  39. package/dist/cjs/Assets/Controllers/downloadAssetFile.js.map +1 -1
  40. package/dist/cjs/Assets/Controllers/editAppAsset.js.map +1 -1
  41. package/dist/cjs/Assets/Controllers/fetchAssetFile.js.map +1 -1
  42. package/dist/cjs/Assets/Controllers/getAppAssets.js.map +1 -1
  43. package/dist/cjs/Assets/Controllers/index.js.map +1 -1
  44. package/dist/cjs/Assets/Controllers/newAppAsset.js.map +1 -1
  45. package/dist/cjs/Assets/Controllers/toggleShowArchivedAssets.js.map +1 -1
  46. package/dist/cjs/Assets/Controllers/updateAppAssetMeta.js.map +1 -1
  47. package/dist/cjs/Assets/Controllers/updateAssetFile.js.map +1 -1
  48. package/dist/cjs/Assets/Entities/AppAssetsEntity.js.map +1 -1
  49. package/dist/cjs/Assets/Entities/AssetEntity.js.map +1 -1
  50. package/dist/cjs/Assets/Entities/AssetRepo.js.map +1 -1
  51. package/dist/cjs/Assets/Factories/AssetsFactory.js.map +1 -1
  52. package/dist/cjs/Assets/Factories/SandboxAssetsFactory.js.map +1 -1
  53. package/dist/cjs/Assets/Factories/index.js.map +1 -1
  54. package/dist/cjs/Assets/PMs/AssetFilePM.js.map +1 -1
  55. package/dist/cjs/Assets/PMs/AssetPM.js.map +1 -1
  56. package/dist/cjs/Assets/PMs/ShowArchivedAppAssetPM.js.map +1 -1
  57. package/dist/cjs/Assets/UCs/ArchiveAssetUC.js.map +1 -1
  58. package/dist/cjs/Assets/UCs/DeleteAssetUC.js.map +1 -1
  59. package/dist/cjs/Assets/UCs/DownloadAssetFileUC.js.map +1 -1
  60. package/dist/cjs/Assets/UCs/EditAppAssetUC.js.map +1 -1
  61. package/dist/cjs/Assets/UCs/GetAssetBlobURLUC.js.map +1 -1
  62. package/dist/cjs/Assets/UCs/GetAssetFileUC.js.map +1 -1
  63. package/dist/cjs/Assets/UCs/GetAssetUC.js.map +1 -1
  64. package/dist/cjs/Assets/UCs/NewAppAssetUC.js.map +1 -1
  65. package/dist/cjs/Assets/UCs/NewAssetUC.js.map +1 -1
  66. package/dist/cjs/Assets/UCs/UpdateAppAssetMetaUC.js.map +1 -1
  67. package/dist/cjs/Assets/UCs/UpdateAssetFileUC.js.map +1 -1
  68. package/dist/cjs/Assets/UCs/index.js.map +1 -1
  69. package/dist/cjs/Cache/Factories/CacheFeatureFactory.js.map +1 -1
  70. package/dist/cjs/Cache/Factories/index.js.map +1 -1
  71. package/dist/cjs/ChallengeResults/Entities/ChallengeResults.js.map +1 -1
  72. package/dist/cjs/ChallengeResults/Factories/ChallengeResultsFactory.js.map +1 -1
  73. package/dist/cjs/ChallengeResults/PMs/ChallengeResultsListPM.js.map +1 -1
  74. package/dist/cjs/ChallengeResults/PMs/HasChallengeResultsPM.js.map +1 -1
  75. package/dist/cjs/Dialog/Factories/SandboxDialogFactory.js +1 -2
  76. package/dist/cjs/Dialog/Factories/SandboxDialogFactory.js.map +1 -1
  77. package/dist/cjs/Handler/UCs/SubmitResultHandler.js.map +1 -1
  78. package/dist/cjs/Logger/Factories/SandboxLoggerFactory.js.map +1 -1
  79. package/dist/cjs/Logger/PMs/ForwardLogsToConsolePM.js.map +1 -1
  80. package/dist/cjs/StateMachine/Controllers/index.js.map +1 -1
  81. package/dist/cjs/StateMachine/Controllers/setTransitionDuration.js.map +1 -1
  82. package/dist/cjs/StateMachine/Factories/SandboxStateMachineFactory.js.map +1 -1
  83. package/dist/cjs/StateMachine/PMs/HostStatePM.js.map +1 -1
  84. package/dist/cjs/ThemeColors/Controllers/index.js.map +1 -1
  85. package/dist/cjs/ThemeColors/Controllers/setThemeByName.js.map +1 -1
  86. package/dist/cjs/ThemeColors/Factories/ThemeFactory.js.map +1 -1
  87. package/dist/cjs/ThemeColors/Mocks/MockSetThemeUC.js.map +1 -1
  88. package/dist/cjs/ThemeColors/Mocks/index.js.map +1 -1
  89. package/dist/cjs/VivedAPI/Adapters/apiStageAdapter.js.map +1 -1
  90. package/dist/cjs/VivedAPI/Adapters/index.js.map +1 -1
  91. package/dist/cjs/VivedAPI/Adapters/userTokenAdapter.js.map +1 -1
  92. package/dist/cjs/VivedAPI/Controllers/index.js.map +1 -1
  93. package/dist/cjs/VivedAPI/Controllers/loginUser.js.map +1 -1
  94. package/dist/cjs/VivedAPI/Controllers/logoutUser.js.map +1 -1
  95. package/dist/cjs/VivedAPI/Controllers/setApiStage.js.map +1 -1
  96. package/dist/cjs/VivedAPI/Entities/VivedAPIEntity.js.map +1 -1
  97. package/dist/cjs/VivedAPI/Entities/index.js.map +1 -1
  98. package/dist/cjs/VivedAPI/Factories/SandboxVivedAPIFactory.js.map +1 -1
  99. package/dist/cjs/VivedAPI/Factories/VivedAPIFactory.js.map +1 -1
  100. package/dist/cjs/VivedAPI/Factories/index.js.map +1 -1
  101. package/dist/cjs/VivedAPI/Factories/setupAPI.js.map +1 -1
  102. package/dist/cjs/VivedAPI/Factories/setupVivedAPIForSandbox.js.map +1 -1
  103. package/dist/cjs/VivedAPI/Mocks/MockJsonRequestUC.js.map +1 -1
  104. package/dist/cjs/VivedAPI/Mocks/index.js.map +1 -1
  105. package/dist/cjs/VivedAPI/PMs/ApiStagePM.js.map +1 -1
  106. package/dist/cjs/VivedAPI/PMs/UserTokenPM.js.map +1 -1
  107. package/dist/cjs/VivedAPI/PMs/index.js.map +1 -1
  108. package/dist/cjs/VivedAPI/UCs/BasicFetchUC.js.map +1 -1
  109. package/dist/cjs/VivedAPI/UCs/BlobRequestUC.js.map +1 -1
  110. package/dist/cjs/VivedAPI/UCs/DeleteAssetOnAPIUC.js.map +1 -1
  111. package/dist/cjs/VivedAPI/UCs/FileUploadUC.js.map +1 -1
  112. package/dist/cjs/VivedAPI/UCs/JsonRequestUC.js.map +1 -1
  113. package/dist/cjs/VivedAPI/UCs/PostNewAssetUC.js.map +1 -1
  114. package/dist/cjs/VivedAPI/UCs/SignedAuthTokenUC.js.map +1 -1
  115. package/dist/cjs/VivedAPI/UCs/UserAuthUC.js.map +1 -1
  116. package/dist/cjs/VivedAPI/UCs/index.js.map +1 -1
  117. package/dist/cjs/VivedAPI/index.js.map +1 -1
  118. package/dist/cjs/ZSpaceHost/Adapters/index.js +1 -0
  119. package/dist/cjs/ZSpaceHost/Adapters/index.js.map +1 -1
  120. package/dist/cjs/ZSpaceHost/Adapters/zSpaceIsSupportedAdapter.js +24 -0
  121. package/dist/cjs/ZSpaceHost/Adapters/zSpaceIsSupportedAdapter.js.map +1 -0
  122. package/dist/cjs/ZSpaceHost/Controllers/index.js.map +1 -1
  123. package/dist/cjs/ZSpaceHost/Controllers/setZSpaceIsSupported.js.map +1 -1
  124. package/dist/cjs/ZSpaceHost/Factories/SandboxZSpaceFactory.js +1 -0
  125. package/dist/cjs/ZSpaceHost/Factories/SandboxZSpaceFactory.js.map +1 -1
  126. package/dist/cjs/ZSpaceHost/Factories/setupZSpaceForSandbox.js +1 -0
  127. package/dist/cjs/ZSpaceHost/Factories/setupZSpaceForSandbox.js.map +1 -1
  128. package/dist/cjs/ZSpaceHost/Mocks/ZSpaceIsSupportedPMMock.js +16 -0
  129. package/dist/cjs/ZSpaceHost/Mocks/ZSpaceIsSupportedPMMock.js.map +1 -0
  130. package/dist/cjs/ZSpaceHost/Mocks/index.js +1 -0
  131. package/dist/cjs/ZSpaceHost/Mocks/index.js.map +1 -1
  132. package/dist/cjs/ZSpaceHost/PMs/EmulateZSpacePM.js.map +1 -1
  133. package/dist/cjs/ZSpaceHost/PMs/ZSpaceIsActivePM.js.map +1 -1
  134. package/dist/cjs/ZSpaceHost/PMs/ZSpaceIsSupportedPM.js +40 -0
  135. package/dist/cjs/ZSpaceHost/PMs/ZSpaceIsSupportedPM.js.map +1 -0
  136. package/dist/cjs/ZSpaceHost/PMs/index.js +1 -0
  137. package/dist/cjs/ZSpaceHost/PMs/index.js.map +1 -1
  138. package/dist/esm/AppSandbox/Adapters/babylonInspectorSupportedAdapter.js +21 -0
  139. package/dist/esm/AppSandbox/Adapters/babylonInspectorSupportedAdapter.js.map +1 -0
  140. package/dist/esm/AppSandbox/Adapters/index.js +1 -0
  141. package/dist/esm/AppSandbox/Adapters/index.js.map +1 -1
  142. package/dist/esm/AppSandbox/Controller/index.js +1 -0
  143. package/dist/esm/AppSandbox/Controller/index.js.map +1 -1
  144. package/dist/esm/AppSandbox/Controller/setBabylonInspectorSupported.js +10 -0
  145. package/dist/esm/AppSandbox/Controller/setBabylonInspectorSupported.js.map +1 -0
  146. package/dist/esm/AppSandbox/Entities/AppSandboxEntity.js +7 -0
  147. package/dist/esm/AppSandbox/Entities/AppSandboxEntity.js.map +1 -1
  148. package/dist/esm/AppSandbox/Factories/AppSandboxFeatureFactory.js +2 -1
  149. package/dist/esm/AppSandbox/Factories/AppSandboxFeatureFactory.js.map +1 -1
  150. package/dist/esm/AppSandbox/Factories/index.js.map +1 -1
  151. package/dist/esm/AppSandbox/Mocks/BabylonInspectorSupportedPMMock.js +11 -0
  152. package/dist/esm/AppSandbox/Mocks/BabylonInspectorSupportedPMMock.js.map +1 -0
  153. package/dist/esm/AppSandbox/Mocks/index.js +1 -0
  154. package/dist/esm/AppSandbox/Mocks/index.js.map +1 -1
  155. package/dist/esm/AppSandbox/PMs/BabylonInspectorSupportedPM.js +32 -0
  156. package/dist/esm/AppSandbox/PMs/BabylonInspectorSupportedPM.js.map +1 -0
  157. package/dist/esm/AppSandbox/PMs/DevFeaturesEnabledPM.js.map +1 -1
  158. package/dist/esm/AppSandbox/PMs/ShowInspectorPM.js.map +1 -1
  159. package/dist/esm/AppSandbox/PMs/StartInZSpacePM.js.map +1 -1
  160. package/dist/esm/AppSandbox/PMs/index.js +1 -0
  161. package/dist/esm/AppSandbox/PMs/index.js.map +1 -1
  162. package/dist/esm/Apps/Entities/AppEntity.js.map +1 -1
  163. package/dist/esm/Apps/Entities/AppRepo.js.map +1 -1
  164. package/dist/esm/Apps/Factories/AppsFeatureFactory.js.map +1 -1
  165. package/dist/esm/Apps/Factories/index.js.map +1 -1
  166. package/dist/esm/Apps/UCs/Mounters/MounterUC.js.map +1 -1
  167. package/dist/esm/Apps/UCs/Mounters/SandboxMounterUC.js.map +1 -1
  168. package/dist/esm/Apps/UCs/StartAppUC.js.map +1 -1
  169. package/dist/esm/Apps/UCs/StopAppUC.js.map +1 -1
  170. package/dist/esm/Apps/index.js.map +1 -1
  171. package/dist/esm/AssetPlugin/Factories/AssetPluginFeatureFactory.js.map +1 -1
  172. package/dist/esm/AssetPlugin/Factories/index.js.map +1 -1
  173. package/dist/esm/Assets/Adapters/assetFileAdapter.js.map +1 -1
  174. package/dist/esm/Assets/Controllers/archiveAsset.js.map +1 -1
  175. package/dist/esm/Assets/Controllers/deleteAsset.js.map +1 -1
  176. package/dist/esm/Assets/Controllers/downloadAssetFile.js.map +1 -1
  177. package/dist/esm/Assets/Controllers/editAppAsset.js.map +1 -1
  178. package/dist/esm/Assets/Controllers/fetchAssetFile.js.map +1 -1
  179. package/dist/esm/Assets/Controllers/getAppAssets.js.map +1 -1
  180. package/dist/esm/Assets/Controllers/index.js.map +1 -1
  181. package/dist/esm/Assets/Controllers/newAppAsset.js.map +1 -1
  182. package/dist/esm/Assets/Controllers/toggleShowArchivedAssets.js.map +1 -1
  183. package/dist/esm/Assets/Controllers/updateAppAssetMeta.js.map +1 -1
  184. package/dist/esm/Assets/Controllers/updateAssetFile.js.map +1 -1
  185. package/dist/esm/Assets/Entities/AppAssetsEntity.js.map +1 -1
  186. package/dist/esm/Assets/Entities/AssetEntity.js.map +1 -1
  187. package/dist/esm/Assets/Entities/AssetRepo.js.map +1 -1
  188. package/dist/esm/Assets/Factories/AssetsFactory.js.map +1 -1
  189. package/dist/esm/Assets/Factories/SandboxAssetsFactory.js.map +1 -1
  190. package/dist/esm/Assets/Factories/index.js.map +1 -1
  191. package/dist/esm/Assets/PMs/AssetFilePM.js.map +1 -1
  192. package/dist/esm/Assets/PMs/AssetPM.js.map +1 -1
  193. package/dist/esm/Assets/PMs/ShowArchivedAppAssetPM.js.map +1 -1
  194. package/dist/esm/Assets/UCs/ArchiveAssetUC.js.map +1 -1
  195. package/dist/esm/Assets/UCs/DeleteAssetUC.js.map +1 -1
  196. package/dist/esm/Assets/UCs/DownloadAssetFileUC.js.map +1 -1
  197. package/dist/esm/Assets/UCs/EditAppAssetUC.js.map +1 -1
  198. package/dist/esm/Assets/UCs/GetAssetBlobURLUC.js.map +1 -1
  199. package/dist/esm/Assets/UCs/GetAssetFileUC.js.map +1 -1
  200. package/dist/esm/Assets/UCs/GetAssetUC.js.map +1 -1
  201. package/dist/esm/Assets/UCs/NewAppAssetUC.js.map +1 -1
  202. package/dist/esm/Assets/UCs/NewAssetUC.js.map +1 -1
  203. package/dist/esm/Assets/UCs/UpdateAppAssetMetaUC.js.map +1 -1
  204. package/dist/esm/Assets/UCs/UpdateAssetFileUC.js.map +1 -1
  205. package/dist/esm/Assets/UCs/index.js.map +1 -1
  206. package/dist/esm/Cache/Factories/CacheFeatureFactory.js.map +1 -1
  207. package/dist/esm/Cache/Factories/index.js.map +1 -1
  208. package/dist/esm/ChallengeResults/Entities/ChallengeResults.js.map +1 -1
  209. package/dist/esm/ChallengeResults/Factories/ChallengeResultsFactory.js.map +1 -1
  210. package/dist/esm/ChallengeResults/PMs/ChallengeResultsListPM.js.map +1 -1
  211. package/dist/esm/ChallengeResults/PMs/HasChallengeResultsPM.js.map +1 -1
  212. package/dist/esm/Dialog/Factories/SandboxDialogFactory.js +1 -2
  213. package/dist/esm/Dialog/Factories/SandboxDialogFactory.js.map +1 -1
  214. package/dist/esm/Handler/UCs/SubmitResultHandler.js.map +1 -1
  215. package/dist/esm/Logger/Factories/SandboxLoggerFactory.js.map +1 -1
  216. package/dist/esm/Logger/PMs/ForwardLogsToConsolePM.js.map +1 -1
  217. package/dist/esm/StateMachine/Controllers/index.js.map +1 -1
  218. package/dist/esm/StateMachine/Controllers/setTransitionDuration.js.map +1 -1
  219. package/dist/esm/StateMachine/Factories/SandboxStateMachineFactory.js.map +1 -1
  220. package/dist/esm/StateMachine/PMs/HostStatePM.js.map +1 -1
  221. package/dist/esm/ThemeColors/Controllers/index.js.map +1 -1
  222. package/dist/esm/ThemeColors/Controllers/setThemeByName.js.map +1 -1
  223. package/dist/esm/ThemeColors/Factories/ThemeFactory.js.map +1 -1
  224. package/dist/esm/ThemeColors/Mocks/MockSetThemeUC.js.map +1 -1
  225. package/dist/esm/ThemeColors/Mocks/index.js.map +1 -1
  226. package/dist/esm/VivedAPI/Adapters/apiStageAdapter.js.map +1 -1
  227. package/dist/esm/VivedAPI/Adapters/index.js.map +1 -1
  228. package/dist/esm/VivedAPI/Adapters/userTokenAdapter.js.map +1 -1
  229. package/dist/esm/VivedAPI/Controllers/index.js.map +1 -1
  230. package/dist/esm/VivedAPI/Controllers/loginUser.js.map +1 -1
  231. package/dist/esm/VivedAPI/Controllers/logoutUser.js.map +1 -1
  232. package/dist/esm/VivedAPI/Controllers/setApiStage.js.map +1 -1
  233. package/dist/esm/VivedAPI/Entities/VivedAPIEntity.js.map +1 -1
  234. package/dist/esm/VivedAPI/Entities/index.js.map +1 -1
  235. package/dist/esm/VivedAPI/Factories/SandboxVivedAPIFactory.js.map +1 -1
  236. package/dist/esm/VivedAPI/Factories/VivedAPIFactory.js.map +1 -1
  237. package/dist/esm/VivedAPI/Factories/index.js.map +1 -1
  238. package/dist/esm/VivedAPI/Factories/setupAPI.js.map +1 -1
  239. package/dist/esm/VivedAPI/Factories/setupVivedAPIForSandbox.js.map +1 -1
  240. package/dist/esm/VivedAPI/Mocks/MockJsonRequestUC.js.map +1 -1
  241. package/dist/esm/VivedAPI/Mocks/index.js.map +1 -1
  242. package/dist/esm/VivedAPI/PMs/ApiStagePM.js.map +1 -1
  243. package/dist/esm/VivedAPI/PMs/UserTokenPM.js.map +1 -1
  244. package/dist/esm/VivedAPI/PMs/index.js.map +1 -1
  245. package/dist/esm/VivedAPI/UCs/BasicFetchUC.js.map +1 -1
  246. package/dist/esm/VivedAPI/UCs/BlobRequestUC.js.map +1 -1
  247. package/dist/esm/VivedAPI/UCs/DeleteAssetOnAPIUC.js.map +1 -1
  248. package/dist/esm/VivedAPI/UCs/FileUploadUC.js.map +1 -1
  249. package/dist/esm/VivedAPI/UCs/JsonRequestUC.js.map +1 -1
  250. package/dist/esm/VivedAPI/UCs/PostNewAssetUC.js.map +1 -1
  251. package/dist/esm/VivedAPI/UCs/SignedAuthTokenUC.js.map +1 -1
  252. package/dist/esm/VivedAPI/UCs/UserAuthUC.js.map +1 -1
  253. package/dist/esm/VivedAPI/UCs/index.js.map +1 -1
  254. package/dist/esm/VivedAPI/index.js.map +1 -1
  255. package/dist/esm/ZSpaceHost/Adapters/index.js +1 -0
  256. package/dist/esm/ZSpaceHost/Adapters/index.js.map +1 -1
  257. package/dist/esm/ZSpaceHost/Adapters/zSpaceIsSupportedAdapter.js +21 -0
  258. package/dist/esm/ZSpaceHost/Adapters/zSpaceIsSupportedAdapter.js.map +1 -0
  259. package/dist/esm/ZSpaceHost/Controllers/index.js.map +1 -1
  260. package/dist/esm/ZSpaceHost/Controllers/setZSpaceIsSupported.js.map +1 -1
  261. package/dist/esm/ZSpaceHost/Factories/SandboxZSpaceFactory.js +2 -1
  262. package/dist/esm/ZSpaceHost/Factories/SandboxZSpaceFactory.js.map +1 -1
  263. package/dist/esm/ZSpaceHost/Factories/setupZSpaceForSandbox.js +2 -1
  264. package/dist/esm/ZSpaceHost/Factories/setupZSpaceForSandbox.js.map +1 -1
  265. package/dist/esm/ZSpaceHost/Mocks/ZSpaceIsSupportedPMMock.js +11 -0
  266. package/dist/esm/ZSpaceHost/Mocks/ZSpaceIsSupportedPMMock.js.map +1 -0
  267. package/dist/esm/ZSpaceHost/Mocks/index.js +1 -0
  268. package/dist/esm/ZSpaceHost/Mocks/index.js.map +1 -1
  269. package/dist/esm/ZSpaceHost/PMs/EmulateZSpacePM.js.map +1 -1
  270. package/dist/esm/ZSpaceHost/PMs/ZSpaceIsActivePM.js.map +1 -1
  271. package/dist/esm/ZSpaceHost/PMs/ZSpaceIsSupportedPM.js +35 -0
  272. package/dist/esm/ZSpaceHost/PMs/ZSpaceIsSupportedPM.js.map +1 -0
  273. package/dist/esm/ZSpaceHost/PMs/index.js +1 -0
  274. package/dist/esm/ZSpaceHost/PMs/index.js.map +1 -1
  275. package/dist/types/AppSandbox/Adapters/babylonInspectorSupportedAdapter.d.ts +3 -0
  276. package/dist/types/AppSandbox/Adapters/babylonInspectorSupportedAdapter.d.ts.map +1 -0
  277. package/dist/types/AppSandbox/Adapters/index.d.ts +1 -0
  278. package/dist/types/AppSandbox/Adapters/index.d.ts.map +1 -1
  279. package/dist/types/AppSandbox/Controller/index.d.ts +1 -0
  280. package/dist/types/AppSandbox/Controller/index.d.ts.map +1 -1
  281. package/dist/types/AppSandbox/Controller/setBabylonInspectorSupported.d.ts +3 -0
  282. package/dist/types/AppSandbox/Controller/setBabylonInspectorSupported.d.ts.map +1 -0
  283. package/dist/types/AppSandbox/Entities/AppSandboxEntity.d.ts +2 -0
  284. package/dist/types/AppSandbox/Entities/AppSandboxEntity.d.ts.map +1 -1
  285. package/dist/types/AppSandbox/Factories/AppSandboxFeatureFactory.d.ts.map +1 -1
  286. package/dist/types/AppSandbox/Mocks/BabylonInspectorSupportedPMMock.d.ts +8 -0
  287. package/dist/types/AppSandbox/Mocks/BabylonInspectorSupportedPMMock.d.ts.map +1 -0
  288. package/dist/types/AppSandbox/Mocks/index.d.ts +1 -0
  289. package/dist/types/AppSandbox/Mocks/index.d.ts.map +1 -1
  290. package/dist/types/AppSandbox/PMs/BabylonInspectorSupportedPM.d.ts +7 -0
  291. package/dist/types/AppSandbox/PMs/BabylonInspectorSupportedPM.d.ts.map +1 -0
  292. package/dist/types/AppSandbox/PMs/index.d.ts +1 -0
  293. package/dist/types/AppSandbox/PMs/index.d.ts.map +1 -1
  294. package/dist/types/Apps/Factories/AppsFeatureFactory.d.ts.map +1 -1
  295. package/dist/types/AssetPlugin/Factories/AssetPluginFeatureFactory.d.ts.map +1 -1
  296. package/dist/types/Assets/Factories/AssetsFactory.d.ts.map +1 -1
  297. package/dist/types/Dialog/Factories/SandboxDialogFactory.d.ts.map +1 -1
  298. package/dist/types/StateMachine/Factories/SandboxStateMachineFactory.d.ts.map +1 -1
  299. package/dist/types/ZSpaceHost/Adapters/index.d.ts +1 -0
  300. package/dist/types/ZSpaceHost/Adapters/index.d.ts.map +1 -1
  301. package/dist/types/ZSpaceHost/Adapters/zSpaceIsSupportedAdapter.d.ts +3 -0
  302. package/dist/types/ZSpaceHost/Adapters/zSpaceIsSupportedAdapter.d.ts.map +1 -0
  303. package/dist/types/ZSpaceHost/Factories/SandboxZSpaceFactory.d.ts.map +1 -1
  304. package/dist/types/ZSpaceHost/Factories/setupZSpaceForSandbox.d.ts.map +1 -1
  305. package/dist/types/ZSpaceHost/Mocks/ZSpaceIsSupportedPMMock.d.ts +8 -0
  306. package/dist/types/ZSpaceHost/Mocks/ZSpaceIsSupportedPMMock.d.ts.map +1 -0
  307. package/dist/types/ZSpaceHost/Mocks/index.d.ts +1 -0
  308. package/dist/types/ZSpaceHost/Mocks/index.d.ts.map +1 -1
  309. package/dist/types/ZSpaceHost/PMs/ZSpaceIsSupportedPM.d.ts +7 -0
  310. package/dist/types/ZSpaceHost/PMs/ZSpaceIsSupportedPM.d.ts.map +1 -0
  311. package/dist/types/ZSpaceHost/PMs/index.d.ts +1 -0
  312. package/dist/types/ZSpaceHost/PMs/index.d.ts.map +1 -1
  313. package/package.json +1 -1
  314. package/README.md +0 -105
  315. package/dist/cjs/Assets/Factories/setupAssets.js +0 -14
  316. package/dist/cjs/Assets/Factories/setupAssets.js.map +0 -1
  317. package/dist/esm/Assets/Factories/setupAssets.js +0 -11
  318. package/dist/esm/Assets/Factories/setupAssets.js.map +0 -1
  319. package/dist/types/Assets/Factories/setupAssets.d.ts +0 -8
  320. package/dist/types/Assets/Factories/setupAssets.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AssetRepo.js","sourceRoot":"","sources":["../../../../src/Assets/Entities/AssetRepo.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\nimport { AssetEntity, makeAssetEntity } from \"./AssetEntity\";\r\n\r\n/**\r\n * Data Transfer Object interface for asset operations between external APIs and the asset system.\r\n *\r\n * This interface defines the structure for transferring asset data from external sources\r\n * (such as APIs, databases, or file systems) into the VIVED asset management system.\r\n * It includes all necessary metadata and supports hierarchical asset relationships.\r\n *\r\n * @interface AssetDTO\r\n * @property id - Unique identifier for the asset\r\n * @property ownerId - ID of the user or entity that owns this asset\r\n * @property name - Display name of the asset\r\n * @property description - Detailed description of the asset's purpose or content\r\n * @property archived - Whether the asset is archived (soft deleted)\r\n * @property filename - Original filename of the uploaded file\r\n * @property fileURL - Remote URL where the file can be accessed\r\n * @property linkedAssets - Array of linked asset relationships with type and nested DTO\r\n */\r\nexport interface AssetDTO {\r\n id: string;\r\n ownerId: string;\r\n name: string;\r\n description: string;\r\n archived: boolean;\r\n filename: string;\r\n fileURL: string;\r\n linkedAssets: { type: string; asset: AssetDTO }[];\r\n}\r\n\r\n/**\r\n * AssetRepo implements the Repository pattern for asset lifecycle management in VIVED applications.\r\n *\r\n * This singleton entity handles:\r\n * 1. Asset CRUD operations (Create, Read, Update, Delete)\r\n * 2. Factory pattern for asset creation with dependency injection support\r\n * 3. DTO to entity mapping for external data integration\r\n * 4. Recursive linked asset processing for complex hierarchies\r\n * 5. Asset lookup and caching for performance optimization\r\n *\r\n * Key Concepts:\r\n * - Repository pattern provides a clean abstraction over asset storage\r\n * - Factory pattern allows for customizable asset creation strategies\r\n * - DTO processing supports complex asset hierarchies with linked relationships\r\n * - Singleton pattern ensures consistent asset management across the application\r\n *\r\n * Usage Patterns:\r\n * ```typescript\r\n * // Get the global asset repository\r\n * const assetRepo = AssetRepo.get(appObjects);\r\n * if (assetRepo) {\r\n * // Basic CRUD operations\r\n * const asset = assetRepo.getOrCreate(\"asset123\");\r\n * assetRepo.add(asset);\r\n * const allAssets = assetRepo.getAll();\r\n * const exists = assetRepo.has(\"asset123\");\r\n * assetRepo.remove(\"asset123\");\r\n *\r\n * // DTO processing for external data\r\n * const assetDTO = {\r\n * id: \"asset456\",\r\n * name: \"Sample Asset\",\r\n * // ... other properties\r\n * linkedAssets: [\r\n * { type: \"texture\", asset: textureDTO },\r\n * { type: \"sound\", asset: soundDTO }\r\n * ]\r\n * };\r\n * const createdAsset = assetRepo.addFromDTO(assetDTO);\r\n * }\r\n * ```\r\n *\r\n * Integration Points:\r\n * - Works with AssetEntity for individual asset management\r\n * - Integrates with AppAssetsEntity for collection operations\r\n * - Used by GetAppAssetsUC and other use cases for bulk operations\r\n * - Supports external APIs through DTO processing\r\n */\r\nexport abstract class AssetRepo extends AppObjectEntity {\r\n /** Static type identifier for component registration */\r\n static type = \"AssetRepository\";\r\n\r\n /**\r\n * Adds an asset to the repository if not already present\r\n * @param asset - The AssetEntity to add to the repository\r\n * Side effects: Triggers change notifications for UI updates\r\n */\r\n abstract add(asset: AssetEntity): void;\r\n\r\n /**\r\n * Checks if an asset exists in the repository\r\n * @param id - The unique identifier to check for\r\n * @returns true if the asset exists, false otherwise\r\n */\r\n abstract has(id: string): boolean;\r\n\r\n /**\r\n * Retrieves an asset from the repository\r\n * @param assetID - The unique identifier of the asset to retrieve\r\n * @returns AssetEntity if found, undefined otherwise\r\n */\r\n abstract get(assetID: string): AssetEntity | undefined;\r\n\r\n /**\r\n * Retrieves an existing asset or creates a new one if not found\r\n * Uses the asset factory to create new instances when needed\r\n * @param assetID - The unique identifier of the asset\r\n * @returns AssetEntity (either existing or newly created)\r\n */\r\n abstract getOrCreate(assetID: string): AssetEntity;\r\n\r\n /**\r\n * Retrieves all assets currently stored in the repository\r\n * @returns Array of all AssetEntity instances\r\n */\r\n abstract getAll(): AssetEntity[];\r\n\r\n /**\r\n * Removes an asset from the repository\r\n * @param assetID - The unique identifier of the asset to remove\r\n * Side effects: Triggers change notifications for UI updates\r\n */\r\n abstract remove(assetID: string): void;\r\n\r\n /**\r\n * Factory method for creating new AssetEntity instances\r\n * Can be overridden or injected to customize asset creation behavior\r\n * @param id - The unique identifier for the new asset\r\n * @returns A new AssetEntity instance\r\n */\r\n abstract assetFactory(id: string): AssetEntity;\r\n\r\n /**\r\n * Creates assets from external DTO data with recursive linked asset processing\r\n * Handles complex asset hierarchies by processing all linked assets recursively\r\n * @param dto - The asset data transfer object containing asset metadata and relationships\r\n * @returns The primary AssetEntity created from the DTO\r\n * Side effects: Creates and adds multiple assets if linked assets are present\r\n */\r\n abstract addFromDTO(dto: AssetDTO): AssetEntity;\r\n\r\n /**\r\n * Retrieves the singleton AssetRepo from the host application objects\r\n * @param hostAppObjects - The application object repository to search\r\n * @returns AssetRepo instance or undefined if not found\r\n * Uses getSingletonComponent to ensure only one instance exists\r\n */\r\n static get(hostAppObjects: AppObjectRepo): AssetRepo | undefined {\r\n return getSingletonComponent(AssetRepo.type, hostAppObjects);\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create a new AssetRepo instance\r\n * @param appObj - The AppObject that will host this AssetRepo\r\n * @returns A new AssetRepo implementation instance\r\n */\r\nexport function makeAssetRepo(appObj: AppObject): AssetRepo {\r\n return new AssetRepositoryImp(appObj);\r\n}\r\n\r\n/**\r\n * Private implementation of AssetRepo that handles all concrete repository functionality.\r\n *\r\n * Key Implementation Details:\r\n * - Uses Map for efficient asset lookup and storage\r\n * - Implements factory pattern with fallback to default asset creation\r\n * - Processes DTOs recursively to handle complex asset hierarchies\r\n * - Maintains referential integrity when mapping DTOs to entities\r\n * - Automatic singleton registration ensures global accessibility\r\n *\r\n * DTO Processing Pattern:\r\n * The addFromDTO method recursively processes linked assets to ensure that\r\n * complex asset hierarchies are properly created and linked. This supports\r\n * scenarios where assets depend on other assets (e.g., 3D models with textures).\r\n *\r\n * Factory Pattern Implementation:\r\n * The assetFactory method can be overridden or injected to customize how\r\n * assets are created, allowing for different asset types or initialization strategies.\r\n */\r\nclass AssetRepositoryImp extends AssetRepo {\r\n /** Internal storage for asset lookup using Map for O(1) access */\r\n private assetLookup = new Map<string, AssetEntity>();\r\n\r\n /**\r\n * Checks if an asset exists in the repository\r\n * @param id - The asset ID to check for\r\n * @returns true if asset exists, false otherwise\r\n */\r\n has = (id: string): boolean => {\r\n return this.assetLookup.has(id);\r\n };\r\n /**\r\n * Factory method for creating new AssetEntity instances\r\n * Uses default factory if not injected via dependency injection\r\n * This allows for dependency injection of custom asset creation logic\r\n * @param id - The unique identifier for the new asset\r\n * @returns A new AssetEntity instance using the default factory\r\n */\r\n assetFactory = (id: string): AssetEntity => {\r\n return makeAssetEntity(this.appObjects.getOrCreate(id));\r\n };\r\n\r\n /**\r\n * Adds an asset to the repository if not already present\r\n * Prevents duplicate entries and maintains repository integrity\r\n * @param asset - The AssetEntity to add\r\n * Side effects: Triggers change notifications if asset was added\r\n */\r\n add = (asset: AssetEntity): void => {\r\n if (this.assetLookup.has(asset.id)) return;\r\n this.assetLookup.set(asset.id, asset);\r\n this.notifyOnChange();\r\n };\r\n\r\n /**\r\n * Retrieves an asset from the repository\r\n * @param assetID - The unique identifier of the asset\r\n * @returns AssetEntity if found, undefined otherwise\r\n */\r\n get = (assetID: string): AssetEntity | undefined => {\r\n return this.assetLookup.get(assetID);\r\n };\r\n\r\n /**\r\n * Retrieves an existing asset or creates a new one using the factory\r\n * This is the primary method for ensuring assets exist in the repository\r\n * @param assetID - The unique identifier of the asset\r\n * @returns AssetEntity (either existing or newly created)\r\n */\r\n getOrCreate = (assetID: string): AssetEntity => {\r\n const existing = this.assetLookup.get(assetID);\r\n if (existing) {\r\n return existing;\r\n }\r\n\r\n const newAsset = this.assetFactory(assetID);\r\n this.add(newAsset);\r\n return newAsset;\r\n };\r\n\r\n /**\r\n * Retrieves all assets in the repository\r\n * Returns the values from the internal Map as an array\r\n * @returns Array of all AssetEntity instances\r\n */\r\n getAll = (): AssetEntity[] => {\r\n return Array.from(this.assetLookup.values());\r\n };\r\n\r\n /**\r\n * Removes an asset from the repository if present\r\n * @param assetID - The unique identifier of the asset to remove\r\n * Side effects: Triggers change notifications if asset was removed\r\n */\r\n remove = (assetID: string) => {\r\n if (!this.assetLookup.has(assetID)) return;\r\n\r\n this.assetLookup.delete(assetID);\r\n this.notifyOnChange();\r\n };\r\n\r\n /**\r\n * Creates assets from external DTO data with recursive linked asset processing\r\n * This method handles complex asset hierarchies by:\r\n * 1. Creating the primary asset from the DTO\r\n * 2. Recursively processing all linked assets\r\n * 3. Establishing relationships between assets\r\n *\r\n * @param dto - The asset data transfer object containing metadata and relationships\r\n * @returns The primary AssetEntity created from the DTO\r\n * Side effects: Creates and adds multiple assets for complex hierarchies\r\n */\r\n addFromDTO(dto: AssetDTO): AssetEntity {\r\n const baseAsset = this.getOrCreate(dto.id);\r\n this.setAssetFromDTO(dto, baseAsset);\r\n\r\n const allLinkedDTOs: AssetDTO[] = [];\r\n this.addLinkedAssetDTOsRecursively(dto.linkedAssets, allLinkedDTOs);\r\n\r\n allLinkedDTOs.forEach((linkedDTO) => {\r\n const asset = this.getOrCreate(linkedDTO.id);\r\n this.setAssetFromDTO(linkedDTO, asset);\r\n });\r\n\r\n return baseAsset;\r\n }\r\n\r\n /**\r\n * Recursively processes linked asset DTOs to build a flat list of all dependencies\r\n * This method traverses the entire asset hierarchy to ensure all linked assets\r\n * are processed regardless of nesting depth\r\n *\r\n * @param linkedAssetList - Array of linked asset references with type and DTO\r\n * @param metaList - Accumulator array for collecting all linked DTOs\r\n * Side effects: Populates metaList with all linked DTOs found in the hierarchy\r\n */\r\n private addLinkedAssetDTOsRecursively(\r\n linkedAssetList: { type: string; asset: AssetDTO }[],\r\n metaList: AssetDTO[]\r\n ) {\r\n linkedAssetList.forEach((linkedAsset) => {\r\n metaList.push(linkedAsset.asset);\r\n this.addLinkedAssetDTOsRecursively(\r\n linkedAsset.asset.linkedAssets,\r\n metaList\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Maps DTO properties to an AssetEntity instance\r\n * This method handles the conversion from external data format to internal entity state\r\n * Also establishes linked asset relationships\r\n *\r\n * @param data - The DTO containing asset metadata\r\n * @param asset - The AssetEntity to populate with DTO data\r\n * @returns The populated AssetEntity for chaining\r\n * Side effects: Modifies asset properties and establishes linked asset relationships\r\n */\r\n private setAssetFromDTO = (data: AssetDTO, asset: AssetEntity) => {\r\n asset.description = data.description;\r\n asset.name = data.name;\r\n asset.archived = data.archived;\r\n asset.filename = data.filename;\r\n asset.owner = data.ownerId;\r\n asset.fileURL = data.fileURL;\r\n\r\n data.linkedAssets.forEach((linkedAsset) => {\r\n asset.addLinkedAsset(linkedAsset.type, linkedAsset.asset.id);\r\n });\r\n\r\n return asset;\r\n };\r\n\r\n /**\r\n * Initializes the AssetRepo with singleton registration\r\n * @param appObj - The AppObject that will host this repository\r\n * Side effects: Registers this instance as a singleton for global access\r\n */\r\n constructor(appObj: AppObject) {\r\n super(appObj, AssetRepo.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"AssetRepo.js","sourceRoot":"","sources":["../../../../src/Assets/Entities/AssetRepo.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getSingletonComponent,\n AppObject,\n AppObjectEntity,\n AppObjectRepo\n} from \"@vived/core\";\nimport { AssetEntity, makeAssetEntity } from \"./AssetEntity\";\n\n/**\n * Data Transfer Object interface for asset operations between external APIs and the asset system.\n *\n * This interface defines the structure for transferring asset data from external sources\n * (such as APIs, databases, or file systems) into the VIVED asset management system.\n * It includes all necessary metadata and supports hierarchical asset relationships.\n *\n * @interface AssetDTO\n * @property id - Unique identifier for the asset\n * @property ownerId - ID of the user or entity that owns this asset\n * @property name - Display name of the asset\n * @property description - Detailed description of the asset's purpose or content\n * @property archived - Whether the asset is archived (soft deleted)\n * @property filename - Original filename of the uploaded file\n * @property fileURL - Remote URL where the file can be accessed\n * @property linkedAssets - Array of linked asset relationships with type and nested DTO\n */\nexport interface AssetDTO {\n id: string;\n ownerId: string;\n name: string;\n description: string;\n archived: boolean;\n filename: string;\n fileURL: string;\n linkedAssets: { type: string; asset: AssetDTO }[];\n}\n\n/**\n * AssetRepo implements the Repository pattern for asset lifecycle management in VIVED applications.\n *\n * This singleton entity handles:\n * 1. Asset CRUD operations (Create, Read, Update, Delete)\n * 2. Factory pattern for asset creation with dependency injection support\n * 3. DTO to entity mapping for external data integration\n * 4. Recursive linked asset processing for complex hierarchies\n * 5. Asset lookup and caching for performance optimization\n *\n * Key Concepts:\n * - Repository pattern provides a clean abstraction over asset storage\n * - Factory pattern allows for customizable asset creation strategies\n * - DTO processing supports complex asset hierarchies with linked relationships\n * - Singleton pattern ensures consistent asset management across the application\n *\n * Usage Patterns:\n * ```typescript\n * // Get the global asset repository\n * const assetRepo = AssetRepo.get(appObjects);\n * if (assetRepo) {\n * // Basic CRUD operations\n * const asset = assetRepo.getOrCreate(\"asset123\");\n * assetRepo.add(asset);\n * const allAssets = assetRepo.getAll();\n * const exists = assetRepo.has(\"asset123\");\n * assetRepo.remove(\"asset123\");\n *\n * // DTO processing for external data\n * const assetDTO = {\n * id: \"asset456\",\n * name: \"Sample Asset\",\n * // ... other properties\n * linkedAssets: [\n * { type: \"texture\", asset: textureDTO },\n * { type: \"sound\", asset: soundDTO }\n * ]\n * };\n * const createdAsset = assetRepo.addFromDTO(assetDTO);\n * }\n * ```\n *\n * Integration Points:\n * - Works with AssetEntity for individual asset management\n * - Integrates with AppAssetsEntity for collection operations\n * - Used by GetAppAssetsUC and other use cases for bulk operations\n * - Supports external APIs through DTO processing\n */\nexport abstract class AssetRepo extends AppObjectEntity {\n /** Static type identifier for component registration */\n static type = \"AssetRepository\";\n\n /**\n * Adds an asset to the repository if not already present\n * @param asset - The AssetEntity to add to the repository\n * Side effects: Triggers change notifications for UI updates\n */\n abstract add(asset: AssetEntity): void;\n\n /**\n * Checks if an asset exists in the repository\n * @param id - The unique identifier to check for\n * @returns true if the asset exists, false otherwise\n */\n abstract has(id: string): boolean;\n\n /**\n * Retrieves an asset from the repository\n * @param assetID - The unique identifier of the asset to retrieve\n * @returns AssetEntity if found, undefined otherwise\n */\n abstract get(assetID: string): AssetEntity | undefined;\n\n /**\n * Retrieves an existing asset or creates a new one if not found\n * Uses the asset factory to create new instances when needed\n * @param assetID - The unique identifier of the asset\n * @returns AssetEntity (either existing or newly created)\n */\n abstract getOrCreate(assetID: string): AssetEntity;\n\n /**\n * Retrieves all assets currently stored in the repository\n * @returns Array of all AssetEntity instances\n */\n abstract getAll(): AssetEntity[];\n\n /**\n * Removes an asset from the repository\n * @param assetID - The unique identifier of the asset to remove\n * Side effects: Triggers change notifications for UI updates\n */\n abstract remove(assetID: string): void;\n\n /**\n * Factory method for creating new AssetEntity instances\n * Can be overridden or injected to customize asset creation behavior\n * @param id - The unique identifier for the new asset\n * @returns A new AssetEntity instance\n */\n abstract assetFactory(id: string): AssetEntity;\n\n /**\n * Creates assets from external DTO data with recursive linked asset processing\n * Handles complex asset hierarchies by processing all linked assets recursively\n * @param dto - The asset data transfer object containing asset metadata and relationships\n * @returns The primary AssetEntity created from the DTO\n * Side effects: Creates and adds multiple assets if linked assets are present\n */\n abstract addFromDTO(dto: AssetDTO): AssetEntity;\n\n /**\n * Retrieves the singleton AssetRepo from the host application objects\n * @param hostAppObjects - The application object repository to search\n * @returns AssetRepo instance or undefined if not found\n * Uses getSingletonComponent to ensure only one instance exists\n */\n static get(hostAppObjects: AppObjectRepo): AssetRepo | undefined {\n return getSingletonComponent(AssetRepo.type, hostAppObjects);\n }\n}\n\n/**\n * Factory function to create a new AssetRepo instance\n * @param appObj - The AppObject that will host this AssetRepo\n * @returns A new AssetRepo implementation instance\n */\nexport function makeAssetRepo(appObj: AppObject): AssetRepo {\n return new AssetRepositoryImp(appObj);\n}\n\n/**\n * Private implementation of AssetRepo that handles all concrete repository functionality.\n *\n * Key Implementation Details:\n * - Uses Map for efficient asset lookup and storage\n * - Implements factory pattern with fallback to default asset creation\n * - Processes DTOs recursively to handle complex asset hierarchies\n * - Maintains referential integrity when mapping DTOs to entities\n * - Automatic singleton registration ensures global accessibility\n *\n * DTO Processing Pattern:\n * The addFromDTO method recursively processes linked assets to ensure that\n * complex asset hierarchies are properly created and linked. This supports\n * scenarios where assets depend on other assets (e.g., 3D models with textures).\n *\n * Factory Pattern Implementation:\n * The assetFactory method can be overridden or injected to customize how\n * assets are created, allowing for different asset types or initialization strategies.\n */\nclass AssetRepositoryImp extends AssetRepo {\n /** Internal storage for asset lookup using Map for O(1) access */\n private assetLookup = new Map<string, AssetEntity>();\n\n /**\n * Checks if an asset exists in the repository\n * @param id - The asset ID to check for\n * @returns true if asset exists, false otherwise\n */\n has = (id: string): boolean => {\n return this.assetLookup.has(id);\n };\n /**\n * Factory method for creating new AssetEntity instances\n * Uses default factory if not injected via dependency injection\n * This allows for dependency injection of custom asset creation logic\n * @param id - The unique identifier for the new asset\n * @returns A new AssetEntity instance using the default factory\n */\n assetFactory = (id: string): AssetEntity => {\n return makeAssetEntity(this.appObjects.getOrCreate(id));\n };\n\n /**\n * Adds an asset to the repository if not already present\n * Prevents duplicate entries and maintains repository integrity\n * @param asset - The AssetEntity to add\n * Side effects: Triggers change notifications if asset was added\n */\n add = (asset: AssetEntity): void => {\n if (this.assetLookup.has(asset.id)) return;\n this.assetLookup.set(asset.id, asset);\n this.notifyOnChange();\n };\n\n /**\n * Retrieves an asset from the repository\n * @param assetID - The unique identifier of the asset\n * @returns AssetEntity if found, undefined otherwise\n */\n get = (assetID: string): AssetEntity | undefined => {\n return this.assetLookup.get(assetID);\n };\n\n /**\n * Retrieves an existing asset or creates a new one using the factory\n * This is the primary method for ensuring assets exist in the repository\n * @param assetID - The unique identifier of the asset\n * @returns AssetEntity (either existing or newly created)\n */\n getOrCreate = (assetID: string): AssetEntity => {\n const existing = this.assetLookup.get(assetID);\n if (existing) {\n return existing;\n }\n\n const newAsset = this.assetFactory(assetID);\n this.add(newAsset);\n return newAsset;\n };\n\n /**\n * Retrieves all assets in the repository\n * Returns the values from the internal Map as an array\n * @returns Array of all AssetEntity instances\n */\n getAll = (): AssetEntity[] => {\n return Array.from(this.assetLookup.values());\n };\n\n /**\n * Removes an asset from the repository if present\n * @param assetID - The unique identifier of the asset to remove\n * Side effects: Triggers change notifications if asset was removed\n */\n remove = (assetID: string) => {\n if (!this.assetLookup.has(assetID)) return;\n\n this.assetLookup.delete(assetID);\n this.notifyOnChange();\n };\n\n /**\n * Creates assets from external DTO data with recursive linked asset processing\n * This method handles complex asset hierarchies by:\n * 1. Creating the primary asset from the DTO\n * 2. Recursively processing all linked assets\n * 3. Establishing relationships between assets\n *\n * @param dto - The asset data transfer object containing metadata and relationships\n * @returns The primary AssetEntity created from the DTO\n * Side effects: Creates and adds multiple assets for complex hierarchies\n */\n addFromDTO(dto: AssetDTO): AssetEntity {\n const baseAsset = this.getOrCreate(dto.id);\n this.setAssetFromDTO(dto, baseAsset);\n\n const allLinkedDTOs: AssetDTO[] = [];\n this.addLinkedAssetDTOsRecursively(dto.linkedAssets, allLinkedDTOs);\n\n allLinkedDTOs.forEach((linkedDTO) => {\n const asset = this.getOrCreate(linkedDTO.id);\n this.setAssetFromDTO(linkedDTO, asset);\n });\n\n return baseAsset;\n }\n\n /**\n * Recursively processes linked asset DTOs to build a flat list of all dependencies\n * This method traverses the entire asset hierarchy to ensure all linked assets\n * are processed regardless of nesting depth\n *\n * @param linkedAssetList - Array of linked asset references with type and DTO\n * @param metaList - Accumulator array for collecting all linked DTOs\n * Side effects: Populates metaList with all linked DTOs found in the hierarchy\n */\n private addLinkedAssetDTOsRecursively(\n linkedAssetList: { type: string; asset: AssetDTO }[],\n metaList: AssetDTO[]\n ) {\n linkedAssetList.forEach((linkedAsset) => {\n metaList.push(linkedAsset.asset);\n this.addLinkedAssetDTOsRecursively(\n linkedAsset.asset.linkedAssets,\n metaList\n );\n });\n }\n\n /**\n * Maps DTO properties to an AssetEntity instance\n * This method handles the conversion from external data format to internal entity state\n * Also establishes linked asset relationships\n *\n * @param data - The DTO containing asset metadata\n * @param asset - The AssetEntity to populate with DTO data\n * @returns The populated AssetEntity for chaining\n * Side effects: Modifies asset properties and establishes linked asset relationships\n */\n private setAssetFromDTO = (data: AssetDTO, asset: AssetEntity) => {\n asset.description = data.description;\n asset.name = data.name;\n asset.archived = data.archived;\n asset.filename = data.filename;\n asset.owner = data.ownerId;\n asset.fileURL = data.fileURL;\n\n data.linkedAssets.forEach((linkedAsset) => {\n asset.addLinkedAsset(linkedAsset.type, linkedAsset.asset.id);\n });\n\n return asset;\n };\n\n /**\n * Initializes the AssetRepo with singleton registration\n * @param appObj - The AppObject that will host this repository\n * Side effects: Registers this instance as a singleton for global access\n */\n constructor(appObj: AppObject) {\n super(appObj, AssetRepo.type);\n this.appObjects.registerSingleton(this);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"AssetsFactory.js","sourceRoot":"","sources":["../../../../src/Assets/Factories/AssetsFactory.ts"],"names":[],"mappings":";;;AAAA,sCAAsE;AACtE,0CAIqB;AACrB,gCAGgB;AAChB,gCAUgB;AAEhB;;;;GAIG;AACH,MAAa,aAAc,SAAQ,oBAAa;IAI9C,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,CAAC,CAAC;QAJnB,+BAA+B;QACtB,gBAAW,GAAG,eAAe,CAAC;IAIvC,CAAC;IAED;;OAEG;IACH,aAAa;QACX,sBAAsB;QACtB,MAAM,SAAS,GAAG,IAAA,wBAAa,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACnD,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,OAAO,CAAC,EAAU,EAAe,EAAE;YACjC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAE3C,WAAW;YACX,MAAM,MAAM,GAAG,IAAA,0BAAe,EAAC,EAAE,CAAC,CAAC;YAEnC,qBAAqB;YACrB,IAAA,wBAAkB,EAAC,EAAE,CAAC,CAAC;YACvB,IAAA,uBAAiB,EAAC,EAAE,CAAC,CAAC;YACtB,IAAA,6BAAuB,EAAC,EAAE,CAAC,CAAC;YAC5B,IAAA,2BAAqB,EAAC,EAAE,CAAC,CAAC;YAE1B,qBAAqB;YACrB,IAAA,iBAAW,EAAC,EAAE,CAAC,CAAC;YAChB,IAAA,qBAAe,EAAC,EAAE,CAAC,CAAC;YAEpB,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,iBAAiB;QACjB,IAAA,2BAAqB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtC,IAAA,wBAAkB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,IAAA,oBAAc,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,IAAA,wBAAkB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,IAAA,oBAAc,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,6CAA6C;IAC/C,CAAC;IAED;;OAEG;IACH,UAAU;QACR,0CAA0C;IAC5C,CAAC;CACF;AAlED,sCAkEC","sourcesContent":["import { AppObject, AppObjectRepo, DomainFactory } from \"@vived/core\";\r\nimport {\r\n AssetEntity,\r\n makeAssetEntity,\r\n makeAssetRepo\r\n} from \"../Entities\";\r\nimport {\r\n makeAssetFilePM,\r\n makeAssetPM\r\n} from \"../PMs\";\r\nimport {\r\n makeArchiveAssetUC,\r\n makeDeleteAssetUC,\r\n makeDownloadAssetFileUC,\r\n makeGetAssetBlobURLUC,\r\n makeGetAssetFileUC,\r\n makeGetAssetUC,\r\n makeNewAssetUC,\r\n makePrefetchAssets,\r\n makeUpdateAssetFileUC\r\n} from \"../UCs\";\r\n\r\n/**\r\n * Factory responsible for setting up the Assets domain components.\r\n * This factory initializes all entities, use cases, and presentation models\r\n * required for the Assets functionality.\r\n */\r\nexport class AssetsFactory extends DomainFactory {\r\n // Unique name for this factory\r\n readonly factoryName = \"AssetsFactory\";\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject);\r\n }\r\n\r\n /**\r\n * Sets up all entities required for the Assets system\r\n */\r\n setupEntities(): void {\r\n // Initialize entities\r\n const assetRepo = makeAssetRepo(this.appObject);\r\n assetRepo.assetFactory = this.makeAssetFactory();\r\n }\r\n\r\n /**\r\n * Creates an asset factory function that properly initializes assets with all required components\r\n */\r\n private makeAssetFactory() {\r\n return (id: string): AssetEntity => {\r\n const ao = this.appObjects.getOrCreate(id);\r\n\r\n // Entities\r\n const entity = makeAssetEntity(ao);\r\n\r\n // UCs for each asset\r\n makeArchiveAssetUC(ao);\r\n makeDeleteAssetUC(ao);\r\n makeDownloadAssetFileUC(ao);\r\n makeUpdateAssetFileUC(ao);\r\n\r\n // PMs for each asset\r\n makeAssetPM(ao);\r\n makeAssetFilePM(ao);\r\n\r\n return entity;\r\n };\r\n }\r\n\r\n /**\r\n * Sets up all use cases for the Assets system\r\n */\r\n setupUCs(): void {\r\n // Repository UCs\r\n makeGetAssetBlobURLUC(this.appObject);\r\n makeGetAssetFileUC(this.appObject);\r\n makeGetAssetUC(this.appObject);\r\n makePrefetchAssets(this.appObject);\r\n makeNewAssetUC(this.appObject);\r\n }\r\n\r\n /**\r\n * Sets up all presentation managers for the Assets system\r\n */\r\n setupPMs(): void {\r\n // No PMs needed for core asset functionality\r\n }\r\n\r\n /**\r\n * Performs any final setup operations after all components are initialized\r\n */\r\n finalSetup(): void {\r\n // No additional setup required for assets\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"AssetsFactory.js","sourceRoot":"","sources":["../../../../src/Assets/Factories/AssetsFactory.ts"],"names":[],"mappings":";;;AAAA,sCAAsE;AACtE,0CAA0E;AAC1E,gCAAsD;AACtD,gCAUgB;AAEhB;;;;GAIG;AACH,MAAa,aAAc,SAAQ,oBAAa;IAI9C,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,CAAC,CAAC;QAJnB,+BAA+B;QACtB,gBAAW,GAAG,eAAe,CAAC;IAIvC,CAAC;IAED;;OAEG;IACH,aAAa;QACX,sBAAsB;QACtB,MAAM,SAAS,GAAG,IAAA,wBAAa,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACnD,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,OAAO,CAAC,EAAU,EAAe,EAAE;YACjC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAE3C,WAAW;YACX,MAAM,MAAM,GAAG,IAAA,0BAAe,EAAC,EAAE,CAAC,CAAC;YAEnC,qBAAqB;YACrB,IAAA,wBAAkB,EAAC,EAAE,CAAC,CAAC;YACvB,IAAA,uBAAiB,EAAC,EAAE,CAAC,CAAC;YACtB,IAAA,6BAAuB,EAAC,EAAE,CAAC,CAAC;YAC5B,IAAA,2BAAqB,EAAC,EAAE,CAAC,CAAC;YAE1B,qBAAqB;YACrB,IAAA,iBAAW,EAAC,EAAE,CAAC,CAAC;YAChB,IAAA,qBAAe,EAAC,EAAE,CAAC,CAAC;YAEpB,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,iBAAiB;QACjB,IAAA,2BAAqB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtC,IAAA,wBAAkB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,IAAA,oBAAc,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,IAAA,wBAAkB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,IAAA,oBAAc,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,6CAA6C;IAC/C,CAAC;IAED;;OAEG;IACH,UAAU;QACR,0CAA0C;IAC5C,CAAC;CACF;AAlED,sCAkEC","sourcesContent":["import { AppObject, AppObjectRepo, DomainFactory } from \"@vived/core\";\nimport { AssetEntity, makeAssetEntity, makeAssetRepo } from \"../Entities\";\nimport { makeAssetFilePM, makeAssetPM } from \"../PMs\";\nimport {\n makeArchiveAssetUC,\n makeDeleteAssetUC,\n makeDownloadAssetFileUC,\n makeGetAssetBlobURLUC,\n makeGetAssetFileUC,\n makeGetAssetUC,\n makeNewAssetUC,\n makePrefetchAssets,\n makeUpdateAssetFileUC\n} from \"../UCs\";\n\n/**\n * Factory responsible for setting up the Assets domain components.\n * This factory initializes all entities, use cases, and presentation models\n * required for the Assets functionality.\n */\nexport class AssetsFactory extends DomainFactory {\n // Unique name for this factory\n readonly factoryName = \"AssetsFactory\";\n\n constructor(appObject: AppObject) {\n super(appObject);\n }\n\n /**\n * Sets up all entities required for the Assets system\n */\n setupEntities(): void {\n // Initialize entities\n const assetRepo = makeAssetRepo(this.appObject);\n assetRepo.assetFactory = this.makeAssetFactory();\n }\n\n /**\n * Creates an asset factory function that properly initializes assets with all required components\n */\n private makeAssetFactory() {\n return (id: string): AssetEntity => {\n const ao = this.appObjects.getOrCreate(id);\n\n // Entities\n const entity = makeAssetEntity(ao);\n\n // UCs for each asset\n makeArchiveAssetUC(ao);\n makeDeleteAssetUC(ao);\n makeDownloadAssetFileUC(ao);\n makeUpdateAssetFileUC(ao);\n\n // PMs for each asset\n makeAssetPM(ao);\n makeAssetFilePM(ao);\n\n return entity;\n };\n }\n\n /**\n * Sets up all use cases for the Assets system\n */\n setupUCs(): void {\n // Repository UCs\n makeGetAssetBlobURLUC(this.appObject);\n makeGetAssetFileUC(this.appObject);\n makeGetAssetUC(this.appObject);\n makePrefetchAssets(this.appObject);\n makeNewAssetUC(this.appObject);\n }\n\n /**\n * Sets up all presentation managers for the Assets system\n */\n setupPMs(): void {\n // No PMs needed for core asset functionality\n }\n\n /**\n * Performs any final setup operations after all components are initialized\n */\n finalSetup(): void {\n // No additional setup required for assets\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SandboxAssetsFactory.js","sourceRoot":"","sources":["../../../../src/Assets/Factories/SandboxAssetsFactory.ts"],"names":[],"mappings":";;;AAuHA,4DAKC;AA5HD,sCAAsE;AACtE,0CAMqB;AACrB,gCAMgB;AAChB,gCAcgB;AAEhB;;;;GAIG;AACH,MAAa,oBAAqB,SAAQ,oBAAa;IAOrD,YAAY,SAAoB,EAAE,UAAyB;QACzD,KAAK,CAAC,SAAS,CAAC,CAAC;QAPnB,+BAA+B;QACtB,gBAAW,GAAG,sBAAsB,CAAC;QAO5C,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;QAC9D,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,aAAa;QACX,sBAAsB;QACtB,MAAM,SAAS,GAAG,IAAA,wBAAa,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClD,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACjD,IAAA,wBAAa,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,uBAAuB;QACvB,IAAA,sBAAgB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnC,IAAA,2BAAqB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxC,IAAA,wBAAkB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrC,IAAA,oBAAc,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,IAAA,wBAAkB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrC,IAAA,oBAAc,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEjC,iBAAiB;QACjB,IAAA,uBAAiB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpC,IAAA,uBAAiB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,iBAAiB;QACjB,IAAA,wBAAkB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrC,IAAA,gCAA0B,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAA,2BAAqB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,UAAU;QACR,0CAA0C;IAC5C,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,OAAO,CAAC,EAAU,EAAe,EAAE;YACjC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAE3C,WAAW;YACX,MAAM,MAAM,GAAG,IAAA,0BAAe,EAAC,EAAE,CAAC,CAAC;YAEnC,MAAM;YACN,IAAA,wBAAkB,EAAC,EAAE,CAAC,CAAC;YACvB,IAAA,uBAAiB,EAAC,EAAE,CAAC,CAAC;YACtB,IAAA,6BAAuB,EAAC,EAAE,CAAC,CAAC;YAC5B,IAAA,2BAAqB,EAAC,EAAE,CAAC,CAAC;YAC1B,IAAA,8BAAwB,EAAC,EAAE,CAAC,CAAC;YAE7B,MAAM;YACN,IAAA,iBAAW,EAAC,EAAE,CAAC,CAAC;YAChB,IAAA,qBAAe,EAAC,EAAE,CAAC,CAAC;YAEpB,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC;CACF;AAjFD,oDAiFC;AAED,SAAgB,wBAAwB,CACtC,UAAyB;IAEzB,MAAM,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IACnD,OAAO,IAAI,oBAAoB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;AAClD,CAAC","sourcesContent":["import { AppObject, AppObjectRepo, DomainFactory } from \"@vived/core\";\r\nimport {\r\n AssetEntity,\r\n AssetRepo,\r\n makeAppAssets,\r\n makeAssetEntity,\r\n makeAssetRepo\r\n} from \"../Entities\";\r\nimport {\r\n makeAppAssetListPM,\r\n makeAssetFilePM,\r\n makeAssetPM,\r\n makeEditingAppAssetPM,\r\n makeShowArchivedAppAssetPM\r\n} from \"../PMs\";\r\nimport {\r\n makeArchiveAssetUC,\r\n makeDeleteAssetUC,\r\n makeDownloadAssetFileUC,\r\n makeEditAppAsset,\r\n makeGetAppAssetUC,\r\n makeGetAssetBlobURLUC,\r\n makeGetAssetFileUC,\r\n makeGetAssetUC,\r\n makeNewAppAssetUC,\r\n makeNewAssetUC,\r\n makePrefetchAssets,\r\n makeUpdateAppAssetMetaUC,\r\n makeUpdateAssetFileUC\r\n} from \"../UCs\";\r\n\r\n/**\r\n * Factory responsible for setting up the Assets domain components for sandbox.\r\n * This factory initializes all entities, use cases, and presentation models\r\n * required for the Assets functionality.\r\n */\r\nexport class SandboxAssetsFactory extends DomainFactory {\r\n // Unique name for this factory\r\n readonly factoryName = \"SandboxAssetsFactory\";\r\n\r\n private assetRepoAO: AppObject;\r\n private appAssetsAO: AppObject;\r\n\r\n constructor(appObject: AppObject, appObjects: AppObjectRepo) {\r\n super(appObject);\r\n this.assetRepoAO = appObjects.getOrCreate(\"Asset Repository\");\r\n this.appAssetsAO = appObjects.getOrCreate(\"App Assets\");\r\n }\r\n\r\n /**\r\n * Sets up all entities required for the Assets system\r\n */\r\n setupEntities(): void {\r\n // Initialize entities\r\n const assetRepo = makeAssetRepo(this.assetRepoAO);\r\n assetRepo.assetFactory = this.makeAssetFactory();\r\n makeAppAssets(this.appAssetsAO);\r\n }\r\n\r\n /**\r\n * Sets up all use cases for the Assets system\r\n */\r\n setupUCs(): void {\r\n // Asset Repository UCs\r\n makeEditAppAsset(this.assetRepoAO);\r\n makeGetAssetBlobURLUC(this.assetRepoAO);\r\n makeGetAssetFileUC(this.assetRepoAO);\r\n makeGetAssetUC(this.assetRepoAO);\r\n makePrefetchAssets(this.assetRepoAO);\r\n makeNewAssetUC(this.assetRepoAO);\r\n\r\n // App Assets UCs\r\n makeNewAppAssetUC(this.appAssetsAO);\r\n makeGetAppAssetUC(this.appAssetsAO);\r\n }\r\n\r\n /**\r\n * Sets up all presentation managers for the Assets system\r\n */\r\n setupPMs(): void {\r\n // App Assets PMs\r\n makeAppAssetListPM(this.appAssetsAO);\r\n makeShowArchivedAppAssetPM(this.appAssetsAO);\r\n makeEditingAppAssetPM(this.appAssetsAO);\r\n }\r\n\r\n /**\r\n * Performs any final setup operations after all components are initialized\r\n */\r\n finalSetup(): void {\r\n // No additional setup required for Assets\r\n }\r\n\r\n /**\r\n * Creates the asset factory function for creating individual assets\r\n */\r\n private makeAssetFactory() {\r\n return (id: string): AssetEntity => {\r\n const ao = this.appObjects.getOrCreate(id);\r\n\r\n // Entities\r\n const entity = makeAssetEntity(ao);\r\n\r\n // UCs\r\n makeArchiveAssetUC(ao);\r\n makeDeleteAssetUC(ao);\r\n makeDownloadAssetFileUC(ao);\r\n makeUpdateAssetFileUC(ao);\r\n makeUpdateAppAssetMetaUC(ao);\r\n\r\n // PMs\r\n makeAssetPM(ao);\r\n makeAssetFilePM(ao);\r\n\r\n return entity;\r\n };\r\n }\r\n}\r\n\r\nexport function makeSandboxAssetsFactory(\r\n appObjects: AppObjectRepo\r\n): SandboxAssetsFactory {\r\n const ao = appObjects.getOrCreate(\"SandboxAssets\");\r\n return new SandboxAssetsFactory(ao, appObjects);\r\n}\r\n"]}
1
+ {"version":3,"file":"SandboxAssetsFactory.js","sourceRoot":"","sources":["../../../../src/Assets/Factories/SandboxAssetsFactory.ts"],"names":[],"mappings":";;;AAuHA,4DAKC;AA5HD,sCAAsE;AACtE,0CAMqB;AACrB,gCAMgB;AAChB,gCAcgB;AAEhB;;;;GAIG;AACH,MAAa,oBAAqB,SAAQ,oBAAa;IAOrD,YAAY,SAAoB,EAAE,UAAyB;QACzD,KAAK,CAAC,SAAS,CAAC,CAAC;QAPnB,+BAA+B;QACtB,gBAAW,GAAG,sBAAsB,CAAC;QAO5C,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;QAC9D,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,aAAa;QACX,sBAAsB;QACtB,MAAM,SAAS,GAAG,IAAA,wBAAa,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClD,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACjD,IAAA,wBAAa,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,uBAAuB;QACvB,IAAA,sBAAgB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnC,IAAA,2BAAqB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxC,IAAA,wBAAkB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrC,IAAA,oBAAc,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,IAAA,wBAAkB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrC,IAAA,oBAAc,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEjC,iBAAiB;QACjB,IAAA,uBAAiB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpC,IAAA,uBAAiB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,iBAAiB;QACjB,IAAA,wBAAkB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrC,IAAA,gCAA0B,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAA,2BAAqB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,UAAU;QACR,0CAA0C;IAC5C,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,OAAO,CAAC,EAAU,EAAe,EAAE;YACjC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAE3C,WAAW;YACX,MAAM,MAAM,GAAG,IAAA,0BAAe,EAAC,EAAE,CAAC,CAAC;YAEnC,MAAM;YACN,IAAA,wBAAkB,EAAC,EAAE,CAAC,CAAC;YACvB,IAAA,uBAAiB,EAAC,EAAE,CAAC,CAAC;YACtB,IAAA,6BAAuB,EAAC,EAAE,CAAC,CAAC;YAC5B,IAAA,2BAAqB,EAAC,EAAE,CAAC,CAAC;YAC1B,IAAA,8BAAwB,EAAC,EAAE,CAAC,CAAC;YAE7B,MAAM;YACN,IAAA,iBAAW,EAAC,EAAE,CAAC,CAAC;YAChB,IAAA,qBAAe,EAAC,EAAE,CAAC,CAAC;YAEpB,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC;CACF;AAjFD,oDAiFC;AAED,SAAgB,wBAAwB,CACtC,UAAyB;IAEzB,MAAM,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IACnD,OAAO,IAAI,oBAAoB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;AAClD,CAAC","sourcesContent":["import { AppObject, AppObjectRepo, DomainFactory } from \"@vived/core\";\nimport {\n AssetEntity,\n AssetRepo,\n makeAppAssets,\n makeAssetEntity,\n makeAssetRepo\n} from \"../Entities\";\nimport {\n makeAppAssetListPM,\n makeAssetFilePM,\n makeAssetPM,\n makeEditingAppAssetPM,\n makeShowArchivedAppAssetPM\n} from \"../PMs\";\nimport {\n makeArchiveAssetUC,\n makeDeleteAssetUC,\n makeDownloadAssetFileUC,\n makeEditAppAsset,\n makeGetAppAssetUC,\n makeGetAssetBlobURLUC,\n makeGetAssetFileUC,\n makeGetAssetUC,\n makeNewAppAssetUC,\n makeNewAssetUC,\n makePrefetchAssets,\n makeUpdateAppAssetMetaUC,\n makeUpdateAssetFileUC\n} from \"../UCs\";\n\n/**\n * Factory responsible for setting up the Assets domain components for sandbox.\n * This factory initializes all entities, use cases, and presentation models\n * required for the Assets functionality.\n */\nexport class SandboxAssetsFactory extends DomainFactory {\n // Unique name for this factory\n readonly factoryName = \"SandboxAssetsFactory\";\n\n private assetRepoAO: AppObject;\n private appAssetsAO: AppObject;\n\n constructor(appObject: AppObject, appObjects: AppObjectRepo) {\n super(appObject);\n this.assetRepoAO = appObjects.getOrCreate(\"Asset Repository\");\n this.appAssetsAO = appObjects.getOrCreate(\"App Assets\");\n }\n\n /**\n * Sets up all entities required for the Assets system\n */\n setupEntities(): void {\n // Initialize entities\n const assetRepo = makeAssetRepo(this.assetRepoAO);\n assetRepo.assetFactory = this.makeAssetFactory();\n makeAppAssets(this.appAssetsAO);\n }\n\n /**\n * Sets up all use cases for the Assets system\n */\n setupUCs(): void {\n // Asset Repository UCs\n makeEditAppAsset(this.assetRepoAO);\n makeGetAssetBlobURLUC(this.assetRepoAO);\n makeGetAssetFileUC(this.assetRepoAO);\n makeGetAssetUC(this.assetRepoAO);\n makePrefetchAssets(this.assetRepoAO);\n makeNewAssetUC(this.assetRepoAO);\n\n // App Assets UCs\n makeNewAppAssetUC(this.appAssetsAO);\n makeGetAppAssetUC(this.appAssetsAO);\n }\n\n /**\n * Sets up all presentation managers for the Assets system\n */\n setupPMs(): void {\n // App Assets PMs\n makeAppAssetListPM(this.appAssetsAO);\n makeShowArchivedAppAssetPM(this.appAssetsAO);\n makeEditingAppAssetPM(this.appAssetsAO);\n }\n\n /**\n * Performs any final setup operations after all components are initialized\n */\n finalSetup(): void {\n // No additional setup required for Assets\n }\n\n /**\n * Creates the asset factory function for creating individual assets\n */\n private makeAssetFactory() {\n return (id: string): AssetEntity => {\n const ao = this.appObjects.getOrCreate(id);\n\n // Entities\n const entity = makeAssetEntity(ao);\n\n // UCs\n makeArchiveAssetUC(ao);\n makeDeleteAssetUC(ao);\n makeDownloadAssetFileUC(ao);\n makeUpdateAssetFileUC(ao);\n makeUpdateAppAssetMetaUC(ao);\n\n // PMs\n makeAssetPM(ao);\n makeAssetFilePM(ao);\n\n return entity;\n };\n }\n}\n\nexport function makeSandboxAssetsFactory(\n appObjects: AppObjectRepo\n): SandboxAssetsFactory {\n const ao = appObjects.getOrCreate(\"SandboxAssets\");\n return new SandboxAssetsFactory(ao, appObjects);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Assets/Factories/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAuC;AACvC,0DAAwC;AACxC,kDAAgC","sourcesContent":["export * from \"./SandboxAssetsFactory\";\r\nexport * from \"./setupAssetsForSandbox\";\r\nexport * from \"./AssetsFactory\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Assets/Factories/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAuC;AACvC,0DAAwC;AACxC,kDAAgC","sourcesContent":["export * from \"./SandboxAssetsFactory\";\nexport * from \"./setupAssetsForSandbox\";\nexport * from \"./AssetsFactory\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"AssetFilePM.js","sourceRoot":"","sources":["../../../../src/Assets/PMs/AssetFilePM.ts"],"names":[],"mappings":"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","sourcesContent":["// filepath: c:\\Users\\amosp\\Documents\\WebGL\\vivedlearning_host\\src\\Assets\\PMs\\AssetFilePM.ts\r\nimport { AppObject, AppObjectPM, AppObjectRepo } from \"@vived/core\";\r\nimport { AssetEntity } from \"../Entities/AssetEntity\";\r\n\r\n/**\r\n * View Model for Asset file information\r\n * Represents the data needed by the view to display asset file status\r\n */\r\nexport interface AssetFileVM {\r\n /** URL to the asset's file blob for direct access */\r\n blobURL: string | undefined;\r\n /** Whether the asset file is currently being fetched */\r\n isFetchingFile: boolean;\r\n /** Whether the asset file has been successfully fetched */\r\n fileHasBeenFetched: boolean;\r\n /** Error that occurred during file fetching, if any */\r\n fetchError: Error | undefined;\r\n}\r\n\r\n/**\r\n * Default empty AssetFileVM for initialization\r\n */\r\nexport const defaultAssetFileVM: AssetFileVM = {\r\n blobURL: undefined,\r\n isFetchingFile: false,\r\n fileHasBeenFetched: false,\r\n fetchError: undefined\r\n};\r\n\r\n/**\r\n * Presentation Manager for Asset file status\r\n *\r\n * The AssetFilePM is responsible for:\r\n * - Converting the file-related properties of AssetEntity into a view-friendly format (AssetFileVM)\r\n * - Notifying the view when asset file status changes\r\n * - Providing comparison utilities for view models\r\n *\r\n * Usage:\r\n * 1. Retrieve an instance with `AssetFilePM.getByID(assetId, appObjects)`\r\n * 2. Subscribe to view updates with `pm.addView(callback)`\r\n * 3. Access current view data with `pm.lastVM`\r\n */\r\nexport abstract class AssetFilePM extends AppObjectPM<AssetFileVM> {\r\n static type = \"AssetFilePM\";\r\n\r\n /**\r\n * Retrieves an AssetFilePM instance for a specific asset by ID\r\n *\r\n * @param assetID - The unique identifier of the asset\r\n * @param appObjects - The repository of app objects\r\n * @returns The AssetFilePM instance or undefined if not found\r\n */\r\n static getByID(\r\n assetID: string,\r\n appObjects: AppObjectRepo\r\n ): AssetFilePM | undefined {\r\n const appObject = appObjects.get(assetID);\r\n if (!appObject) {\r\n appObjects.submitWarning(\r\n \"AssetFilePM.getByID\",\r\n \"Unable to find app object by ID \" + assetID\r\n );\r\n return;\r\n }\r\n\r\n const pm = appObject.getComponent<AssetFilePM>(AssetFilePM.type);\r\n if (!pm) {\r\n appObjects.submitWarning(\r\n \"AssetFilePM.getByID\",\r\n \"App Object does not have a AssetFilePM\"\r\n );\r\n return;\r\n }\r\n return pm;\r\n }\r\n}\r\n\r\n/**\r\n * Creates a new AssetFilePM instance\r\n *\r\n * @param appObject - The app object to associate with this PM\r\n * @returns A new AssetFilePM instance\r\n */\r\nexport function makeAssetFilePM(appObject: AppObject): AssetFilePM {\r\n return new AssetFilePMImp(appObject);\r\n}\r\n\r\n/**\r\n * Implementation of the AssetFilePM abstract class\r\n * Handles the connection between AssetEntity file properties and view\r\n */\r\nclass AssetFilePMImp extends AssetFilePM {\r\n private get asset() {\r\n return this.getCachedLocalComponent<AssetEntity>(AssetEntity.type);\r\n }\r\n\r\n /**\r\n * Compares two AssetFileVM instances for equality\r\n * Used to determine if the view needs to update\r\n *\r\n * @param a - First AssetFileVM to compare\r\n * @param b - Second AssetFileVM to compare\r\n * @returns True if view models are equal, false otherwise\r\n */\r\n vmsAreEqual(a: AssetFileVM, b: AssetFileVM): boolean {\r\n if (a.blobURL !== b.blobURL) return false;\r\n if (a.isFetchingFile !== b.isFetchingFile) return false;\r\n if (a.fileHasBeenFetched !== b.fileHasBeenFetched) return false;\r\n\r\n // Handle errors comparison (both undefined, or same message)\r\n if (a.fetchError !== b.fetchError) {\r\n if (a.fetchError === undefined && b.fetchError !== undefined)\r\n return false;\r\n if (a.fetchError !== undefined && b.fetchError === undefined)\r\n return false;\r\n if (\r\n a.fetchError !== undefined &&\r\n b.fetchError !== undefined &&\r\n a.fetchError.message !== b.fetchError.message\r\n )\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Observer callback that updates the view model when the entity changes\r\n * Transforms entity data into view model format\r\n */\r\n formVM = (): void => {\r\n if (!this.asset) return;\r\n\r\n const vm: AssetFileVM = {\r\n blobURL: this.asset.blobURL,\r\n isFetchingFile: this.asset.isFetchingFile,\r\n fileHasBeenFetched: this.asset.fileHasBeenFetched,\r\n fetchError: this.asset.fetchError\r\n };\r\n\r\n this.doUpdateView(vm);\r\n };\r\n\r\n /**\r\n * Creates a new AssetFilePMImp instance\r\n *\r\n * @param appObject - The app object to associate with this PM\r\n */\r\n constructor(appObject: AppObject) {\r\n super(appObject, AssetFilePM.type);\r\n\r\n if (this.asset) {\r\n this.observeEntity(this.asset);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"AssetFilePM.js","sourceRoot":"","sources":["../../../../src/Assets/PMs/AssetFilePM.ts"],"names":[],"mappings":"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","sourcesContent":["// filepath: c:\\Users\\amosp\\Documents\\WebGL\\vivedlearning_host\\src\\Assets\\PMs\\AssetFilePM.ts\nimport { AppObject, AppObjectPM, AppObjectRepo } from \"@vived/core\";\nimport { AssetEntity } from \"../Entities/AssetEntity\";\n\n/**\n * View Model for Asset file information\n * Represents the data needed by the view to display asset file status\n */\nexport interface AssetFileVM {\n /** URL to the asset's file blob for direct access */\n blobURL: string | undefined;\n /** Whether the asset file is currently being fetched */\n isFetchingFile: boolean;\n /** Whether the asset file has been successfully fetched */\n fileHasBeenFetched: boolean;\n /** Error that occurred during file fetching, if any */\n fetchError: Error | undefined;\n}\n\n/**\n * Default empty AssetFileVM for initialization\n */\nexport const defaultAssetFileVM: AssetFileVM = {\n blobURL: undefined,\n isFetchingFile: false,\n fileHasBeenFetched: false,\n fetchError: undefined\n};\n\n/**\n * Presentation Manager for Asset file status\n *\n * The AssetFilePM is responsible for:\n * - Converting the file-related properties of AssetEntity into a view-friendly format (AssetFileVM)\n * - Notifying the view when asset file status changes\n * - Providing comparison utilities for view models\n *\n * Usage:\n * 1. Retrieve an instance with `AssetFilePM.getByID(assetId, appObjects)`\n * 2. Subscribe to view updates with `pm.addView(callback)`\n * 3. Access current view data with `pm.lastVM`\n */\nexport abstract class AssetFilePM extends AppObjectPM<AssetFileVM> {\n static type = \"AssetFilePM\";\n\n /**\n * Retrieves an AssetFilePM instance for a specific asset by ID\n *\n * @param assetID - The unique identifier of the asset\n * @param appObjects - The repository of app objects\n * @returns The AssetFilePM instance or undefined if not found\n */\n static getByID(\n assetID: string,\n appObjects: AppObjectRepo\n ): AssetFilePM | undefined {\n const appObject = appObjects.get(assetID);\n if (!appObject) {\n appObjects.submitWarning(\n \"AssetFilePM.getByID\",\n \"Unable to find app object by ID \" + assetID\n );\n return;\n }\n\n const pm = appObject.getComponent<AssetFilePM>(AssetFilePM.type);\n if (!pm) {\n appObjects.submitWarning(\n \"AssetFilePM.getByID\",\n \"App Object does not have a AssetFilePM\"\n );\n return;\n }\n return pm;\n }\n}\n\n/**\n * Creates a new AssetFilePM instance\n *\n * @param appObject - The app object to associate with this PM\n * @returns A new AssetFilePM instance\n */\nexport function makeAssetFilePM(appObject: AppObject): AssetFilePM {\n return new AssetFilePMImp(appObject);\n}\n\n/**\n * Implementation of the AssetFilePM abstract class\n * Handles the connection between AssetEntity file properties and view\n */\nclass AssetFilePMImp extends AssetFilePM {\n private get asset() {\n return this.getCachedLocalComponent<AssetEntity>(AssetEntity.type);\n }\n\n /**\n * Compares two AssetFileVM instances for equality\n * Used to determine if the view needs to update\n *\n * @param a - First AssetFileVM to compare\n * @param b - Second AssetFileVM to compare\n * @returns True if view models are equal, false otherwise\n */\n vmsAreEqual(a: AssetFileVM, b: AssetFileVM): boolean {\n if (a.blobURL !== b.blobURL) return false;\n if (a.isFetchingFile !== b.isFetchingFile) return false;\n if (a.fileHasBeenFetched !== b.fileHasBeenFetched) return false;\n\n // Handle errors comparison (both undefined, or same message)\n if (a.fetchError !== b.fetchError) {\n if (a.fetchError === undefined && b.fetchError !== undefined)\n return false;\n if (a.fetchError !== undefined && b.fetchError === undefined)\n return false;\n if (\n a.fetchError !== undefined &&\n b.fetchError !== undefined &&\n a.fetchError.message !== b.fetchError.message\n )\n return false;\n }\n\n return true;\n }\n\n /**\n * Observer callback that updates the view model when the entity changes\n * Transforms entity data into view model format\n */\n formVM = (): void => {\n if (!this.asset) return;\n\n const vm: AssetFileVM = {\n blobURL: this.asset.blobURL,\n isFetchingFile: this.asset.isFetchingFile,\n fileHasBeenFetched: this.asset.fileHasBeenFetched,\n fetchError: this.asset.fetchError\n };\n\n this.doUpdateView(vm);\n };\n\n /**\n * Creates a new AssetFilePMImp instance\n *\n * @param appObject - The app object to associate with this PM\n */\n constructor(appObject: AppObject) {\n super(appObject, AssetFilePM.type);\n\n if (this.asset) {\n this.observeEntity(this.asset);\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"AssetPM.js","sourceRoot":"","sources":["../../../../src/Assets/PMs/AssetPM.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;AAoEH,kCAEC;AApED,sCAAoE;AACpE,yDAAsD;AAiBtD;;;;;GAKG;AACH,MAAsB,OAAQ,SAAQ,kBAAoB;IAIxD;;;;;;OAMG;IACH,MAAM,CAAC,OAAO,CACZ,OAAe,EACf,UAAyB;QAEzB,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,UAAU,CAAC,aAAa,CACtB,iBAAiB,EACjB,kCAAkC,GAAG,OAAO,CAC7C,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,EAAE,GAAG,SAAS,CAAC,YAAY,CAAU,OAAO,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,UAAU,CAAC,aAAa,CACtB,iBAAiB,EACjB,oCAAoC,CACrC,CAAC;YACF,OAAO;QACT,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;;AAjCH,0BAkCC;AAjCC,wDAAwD;AACjD,YAAI,GAAG,SAAS,CAAC;AAkC1B;;;;;GAKG;AACH,SAAgB,WAAW,CAAC,SAAoB;IAC9C,OAAO,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAW,SAAQ,OAAO;IAI9B;;;;;;OAMG;IACH,WAAW,CAAC,CAAU,EAAE,CAAU;QAChC,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5C,IAAI,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW;YAAE,OAAO,KAAK,CAAC;QAClD,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACpC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC;QAEhC,OAAO,IAAI,CAAC;IACd,CAAC;IAeD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAdzB,kBAAa,GAAG,GAAG,EAAE;YAC3B,IAAI,CAAC,IAAI,CAAC,KAAK;gBAAE,OAAO;YAExB,MAAM,EAAE,GAAY;gBAClB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;gBAC7B,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW;gBACnC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;gBACjB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;aACtB,CAAC;YAEF,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC,CAAC;QAKA,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,YAAY,CAAc,yBAAW,CAAC,IAAI,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjD,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;CACF;AAEY,QAAA,cAAc,GAAY;IACrC,QAAQ,EAAE,KAAK;IACf,WAAW,EAAE,EAAE;IACf,EAAE,EAAE,EAAE;IACN,IAAI,EAAE,EAAE;CACT,CAAC","sourcesContent":["/**\r\n * AssetPM.ts\r\n *\r\n * This presentation manager handles the view model generation and change tracking\r\n * for individual asset entities, providing a clean interface between asset data\r\n * and UI components.\r\n *\r\n * Key Concepts:\r\n * - Transforms asset entity data into view models for UI consumption\r\n * - Tracks entity changes and triggers UI updates when needed\r\n * - Provides efficient comparison methods for view model equality\r\n * - Manages asset entity lifecycle and observer patterns\r\n * - Follows the PM pattern for separation of concerns between domain and presentation\r\n *\r\n * Usage Patterns:\r\n * - Created per-asset during factory setup\r\n * - Accessed through static getByID() method with asset ID\r\n * - Automatically updates UI components when underlying asset data changes\r\n * - Used by adapters to connect asset data to React components and other UI frameworks\r\n */\r\n\r\nimport { AppObject, AppObjectPM, AppObjectRepo } from \"@vived/core\";\r\nimport { AssetEntity } from \"../Entities/AssetEntity\";\r\n\r\n/**\r\n * View model interface representing asset data optimized for UI display.\r\n * Contains essential asset information formatted for presentation components.\r\n */\r\nexport interface AssetVM {\r\n /** Unique identifier of the asset */\r\n id: string;\r\n /** Display name of the asset */\r\n name: string;\r\n /** Description of the asset's purpose or content */\r\n description: string;\r\n /** Whether the asset is archived (hidden from normal views) */\r\n archived: boolean;\r\n}\r\n\r\n/**\r\n * AssetPM manages presentation logic for individual asset entities.\r\n *\r\n * This presentation manager bridges the gap between asset domain entities\r\n * and UI components by providing optimized view models and change tracking.\r\n */\r\nexport abstract class AssetPM extends AppObjectPM<AssetVM> {\r\n /** Static type identifier for component registration */\r\n static type = \"AssetPM\";\r\n\r\n /**\r\n * Retrieves an AssetPM component for a specific asset.\r\n *\r\n * @param assetID - The unique identifier of the asset\r\n * @param appObjects - Repository for accessing app objects and components\r\n * @returns AssetPM instance or undefined if not found\r\n */\r\n static getByID(\r\n assetID: string,\r\n appObjects: AppObjectRepo\r\n ): AssetPM | undefined {\r\n const appObject = appObjects.get(assetID);\r\n if (!appObject) {\r\n appObjects.submitWarning(\r\n \"AssetPM.getByID\",\r\n \"Unable to find app object by ID \" + assetID\r\n );\r\n return;\r\n }\r\n\r\n const pm = appObject.getComponent<AssetPM>(AssetPM.type);\r\n if (!pm) {\r\n appObjects.submitWarning(\r\n \"AssetPM.getByID\",\r\n \"App Object does not have a AssetPM\"\r\n );\r\n return;\r\n }\r\n return pm;\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create a new AssetPM instance.\r\n *\r\n * @param appObject - The AppObject that will host this PM (should contain an AssetEntity)\r\n * @returns A new AssetPM implementation instance\r\n */\r\nexport function makeAssetPM(appObject: AppObject): AssetPM {\r\n return new AssetPMImp(appObject);\r\n}\r\n\r\n/**\r\n * Private implementation of AssetPM with entity integration and change tracking.\r\n *\r\n * Key Implementation Details:\r\n * - Observes AssetEntity changes and generates view models accordingly\r\n * - Implements efficient view model comparison for performance optimization\r\n * - Handles entity lifecycle management and cleanup\r\n * - Provides error handling for missing entity dependencies\r\n */\r\nclass AssetPMImp extends AssetPM {\r\n /** The asset entity this PM observes and presents */\r\n private asset?: AssetEntity;\r\n\r\n /**\r\n * Compares two asset view models for equality to optimize UI updates.\r\n *\r\n * @param a - First asset view model to compare\r\n * @param b - Second asset view model to compare\r\n * @returns true if view models are equal, false otherwise\r\n */\r\n vmsAreEqual(a: AssetVM, b: AssetVM): boolean {\r\n if (a.archived !== b.archived) return false;\r\n if (a.description !== b.description) return false;\r\n if (a.name !== b.name) return false;\r\n if (a.id !== b.id) return false;\r\n\r\n return true;\r\n }\r\n\r\n private onAssetChange = () => {\r\n if (!this.asset) return;\r\n\r\n const vm: AssetVM = {\r\n archived: this.asset.archived,\r\n description: this.asset.description,\r\n id: this.asset.id,\r\n name: this.asset.name\r\n };\r\n\r\n this.doUpdateView(vm);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, AssetPM.type);\r\n\r\n this.asset = appObject.getComponent<AssetEntity>(AssetEntity.type);\r\n if (!this.asset) {\r\n this.warn(\"PM has been added to an App Object without an AssetEntity\");\r\n return;\r\n }\r\n\r\n this.asset.addChangeObserver(this.onAssetChange);\r\n this.onAssetChange();\r\n }\r\n}\r\n\r\nexport const defaultAssetVM: AssetVM = {\r\n archived: false,\r\n description: \"\",\r\n id: \"\",\r\n name: \"\"\r\n};\r\n"]}
1
+ {"version":3,"file":"AssetPM.js","sourceRoot":"","sources":["../../../../src/Assets/PMs/AssetPM.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;AAoEH,kCAEC;AApED,sCAAoE;AACpE,yDAAsD;AAiBtD;;;;;GAKG;AACH,MAAsB,OAAQ,SAAQ,kBAAoB;IAIxD;;;;;;OAMG;IACH,MAAM,CAAC,OAAO,CACZ,OAAe,EACf,UAAyB;QAEzB,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,UAAU,CAAC,aAAa,CACtB,iBAAiB,EACjB,kCAAkC,GAAG,OAAO,CAC7C,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,EAAE,GAAG,SAAS,CAAC,YAAY,CAAU,OAAO,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,UAAU,CAAC,aAAa,CACtB,iBAAiB,EACjB,oCAAoC,CACrC,CAAC;YACF,OAAO;QACT,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;;AAjCH,0BAkCC;AAjCC,wDAAwD;AACjD,YAAI,GAAG,SAAS,CAAC;AAkC1B;;;;;GAKG;AACH,SAAgB,WAAW,CAAC,SAAoB;IAC9C,OAAO,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAW,SAAQ,OAAO;IAI9B;;;;;;OAMG;IACH,WAAW,CAAC,CAAU,EAAE,CAAU;QAChC,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5C,IAAI,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW;YAAE,OAAO,KAAK,CAAC;QAClD,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACpC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC;QAEhC,OAAO,IAAI,CAAC;IACd,CAAC;IAeD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAdzB,kBAAa,GAAG,GAAG,EAAE;YAC3B,IAAI,CAAC,IAAI,CAAC,KAAK;gBAAE,OAAO;YAExB,MAAM,EAAE,GAAY;gBAClB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;gBAC7B,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW;gBACnC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;gBACjB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;aACtB,CAAC;YAEF,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC,CAAC;QAKA,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,YAAY,CAAc,yBAAW,CAAC,IAAI,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjD,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;CACF;AAEY,QAAA,cAAc,GAAY;IACrC,QAAQ,EAAE,KAAK;IACf,WAAW,EAAE,EAAE;IACf,EAAE,EAAE,EAAE;IACN,IAAI,EAAE,EAAE;CACT,CAAC","sourcesContent":["/**\n * AssetPM.ts\n *\n * This presentation manager handles the view model generation and change tracking\n * for individual asset entities, providing a clean interface between asset data\n * and UI components.\n *\n * Key Concepts:\n * - Transforms asset entity data into view models for UI consumption\n * - Tracks entity changes and triggers UI updates when needed\n * - Provides efficient comparison methods for view model equality\n * - Manages asset entity lifecycle and observer patterns\n * - Follows the PM pattern for separation of concerns between domain and presentation\n *\n * Usage Patterns:\n * - Created per-asset during factory setup\n * - Accessed through static getByID() method with asset ID\n * - Automatically updates UI components when underlying asset data changes\n * - Used by adapters to connect asset data to React components and other UI frameworks\n */\n\nimport { AppObject, AppObjectPM, AppObjectRepo } from \"@vived/core\";\nimport { AssetEntity } from \"../Entities/AssetEntity\";\n\n/**\n * View model interface representing asset data optimized for UI display.\n * Contains essential asset information formatted for presentation components.\n */\nexport interface AssetVM {\n /** Unique identifier of the asset */\n id: string;\n /** Display name of the asset */\n name: string;\n /** Description of the asset's purpose or content */\n description: string;\n /** Whether the asset is archived (hidden from normal views) */\n archived: boolean;\n}\n\n/**\n * AssetPM manages presentation logic for individual asset entities.\n *\n * This presentation manager bridges the gap between asset domain entities\n * and UI components by providing optimized view models and change tracking.\n */\nexport abstract class AssetPM extends AppObjectPM<AssetVM> {\n /** Static type identifier for component registration */\n static type = \"AssetPM\";\n\n /**\n * Retrieves an AssetPM component for a specific asset.\n *\n * @param assetID - The unique identifier of the asset\n * @param appObjects - Repository for accessing app objects and components\n * @returns AssetPM instance or undefined if not found\n */\n static getByID(\n assetID: string,\n appObjects: AppObjectRepo\n ): AssetPM | undefined {\n const appObject = appObjects.get(assetID);\n if (!appObject) {\n appObjects.submitWarning(\n \"AssetPM.getByID\",\n \"Unable to find app object by ID \" + assetID\n );\n return;\n }\n\n const pm = appObject.getComponent<AssetPM>(AssetPM.type);\n if (!pm) {\n appObjects.submitWarning(\n \"AssetPM.getByID\",\n \"App Object does not have a AssetPM\"\n );\n return;\n }\n return pm;\n }\n}\n\n/**\n * Factory function to create a new AssetPM instance.\n *\n * @param appObject - The AppObject that will host this PM (should contain an AssetEntity)\n * @returns A new AssetPM implementation instance\n */\nexport function makeAssetPM(appObject: AppObject): AssetPM {\n return new AssetPMImp(appObject);\n}\n\n/**\n * Private implementation of AssetPM with entity integration and change tracking.\n *\n * Key Implementation Details:\n * - Observes AssetEntity changes and generates view models accordingly\n * - Implements efficient view model comparison for performance optimization\n * - Handles entity lifecycle management and cleanup\n * - Provides error handling for missing entity dependencies\n */\nclass AssetPMImp extends AssetPM {\n /** The asset entity this PM observes and presents */\n private asset?: AssetEntity;\n\n /**\n * Compares two asset view models for equality to optimize UI updates.\n *\n * @param a - First asset view model to compare\n * @param b - Second asset view model to compare\n * @returns true if view models are equal, false otherwise\n */\n vmsAreEqual(a: AssetVM, b: AssetVM): boolean {\n if (a.archived !== b.archived) return false;\n if (a.description !== b.description) return false;\n if (a.name !== b.name) return false;\n if (a.id !== b.id) return false;\n\n return true;\n }\n\n private onAssetChange = () => {\n if (!this.asset) return;\n\n const vm: AssetVM = {\n archived: this.asset.archived,\n description: this.asset.description,\n id: this.asset.id,\n name: this.asset.name\n };\n\n this.doUpdateView(vm);\n };\n\n constructor(appObject: AppObject) {\n super(appObject, AssetPM.type);\n\n this.asset = appObject.getComponent<AssetEntity>(AssetEntity.type);\n if (!this.asset) {\n this.warn(\"PM has been added to an App Object without an AssetEntity\");\n return;\n }\n\n this.asset.addChangeObserver(this.onAssetChange);\n this.onAssetChange();\n }\n}\n\nexport const defaultAssetVM: AssetVM = {\n archived: false,\n description: \"\",\n id: \"\",\n name: \"\"\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ShowArchivedAppAssetPM.js","sourceRoot":"","sources":["../../../../src/Assets/PMs/ShowArchivedAppAssetPM.ts"],"names":[],"mappings":";;;AAgBA,gEAIC;AApBD,sCAKqB;AACrB,iEAA8D;AAE9D,MAAsB,sBAAuB,SAAQ,2BAA6B;IAGhF,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAAC,sBAAsB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACxE,CAAC;;AALH,wDAMC;AALQ,2BAAI,GAAG,wBAAwB,CAAC;AAOzC,SAAgB,0BAA0B,CACxC,SAAoB;IAEpB,OAAO,IAAI,yBAAyB,CAAC,SAAS,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,yBAA0B,SAAQ,sBAAsB;IAK5D,WAAW,CAAC,CAAU,EAAE,CAAU;QAChC,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAQD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAbhD,cAAS,GAAG,KAAK,CAAC;QAMlB,WAAM,GAAG,GAAS,EAAE;YAClB,IAAI,CAAC,IAAI,CAAC,SAAS;gBAAE,OAAO;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;YACvC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC,CAAC;QAKA,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,YAAY,CACrC,iCAAe,CAAC,IAAI,CACrB,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CACP,+DAA+D,CAChE,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;CACF","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectSingletonPM,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\nimport { AppAssetsEntity } from \"../Entities/AppAssetsEntity\";\r\n\r\nexport abstract class ShowArchivedAppAssetPM extends AppObjectSingletonPM<boolean> {\r\n static type = \"ShowArchivedAppAssetPM\";\r\n\r\n static get(appObjects: AppObjectRepo): ShowArchivedAppAssetPM | undefined {\r\n return getSingletonComponent(ShowArchivedAppAssetPM.type, appObjects);\r\n }\r\n}\r\n\r\nexport function makeShowArchivedAppAssetPM(\r\n appObject: AppObject\r\n): ShowArchivedAppAssetPM {\r\n return new ShowArchivedAppAssetPMImp(appObject);\r\n}\r\n\r\nclass ShowArchivedAppAssetPMImp extends ShowArchivedAppAssetPM {\r\n private appAssets?: AppAssetsEntity;\r\n\r\n defaultVM = false;\r\n\r\n vmsAreEqual(a: boolean, b: boolean): boolean {\r\n return a === b;\r\n }\r\n\r\n formVM = (): void => {\r\n if (!this.appAssets) return;\r\n const vm = this.appAssets.showArchived;\r\n this.doUpdateView(vm);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ShowArchivedAppAssetPM.type);\r\n\r\n this.appAssets = appObject.getComponent<AppAssetsEntity>(\r\n AppAssetsEntity.type\r\n );\r\n if (!this.appAssets) {\r\n this.warn(\r\n \"PM has been added to an App Object without an AppAssetsEntity\"\r\n );\r\n return;\r\n }\r\n\r\n this.observeEntity(this.appAssets);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ShowArchivedAppAssetPM.js","sourceRoot":"","sources":["../../../../src/Assets/PMs/ShowArchivedAppAssetPM.ts"],"names":[],"mappings":";;;AAgBA,gEAIC;AApBD,sCAKqB;AACrB,iEAA8D;AAE9D,MAAsB,sBAAuB,SAAQ,2BAA6B;IAGhF,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAAC,sBAAsB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACxE,CAAC;;AALH,wDAMC;AALQ,2BAAI,GAAG,wBAAwB,CAAC;AAOzC,SAAgB,0BAA0B,CACxC,SAAoB;IAEpB,OAAO,IAAI,yBAAyB,CAAC,SAAS,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,yBAA0B,SAAQ,sBAAsB;IAK5D,WAAW,CAAC,CAAU,EAAE,CAAU;QAChC,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAQD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAbhD,cAAS,GAAG,KAAK,CAAC;QAMlB,WAAM,GAAG,GAAS,EAAE;YAClB,IAAI,CAAC,IAAI,CAAC,SAAS;gBAAE,OAAO;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;YACvC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC,CAAC;QAKA,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,YAAY,CACrC,iCAAe,CAAC,IAAI,CACrB,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CACP,+DAA+D,CAChE,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;CACF","sourcesContent":["import {\n getSingletonComponent,\n AppObject,\n AppObjectSingletonPM,\n AppObjectRepo\n} from \"@vived/core\";\nimport { AppAssetsEntity } from \"../Entities/AppAssetsEntity\";\n\nexport abstract class ShowArchivedAppAssetPM extends AppObjectSingletonPM<boolean> {\n static type = \"ShowArchivedAppAssetPM\";\n\n static get(appObjects: AppObjectRepo): ShowArchivedAppAssetPM | undefined {\n return getSingletonComponent(ShowArchivedAppAssetPM.type, appObjects);\n }\n}\n\nexport function makeShowArchivedAppAssetPM(\n appObject: AppObject\n): ShowArchivedAppAssetPM {\n return new ShowArchivedAppAssetPMImp(appObject);\n}\n\nclass ShowArchivedAppAssetPMImp extends ShowArchivedAppAssetPM {\n private appAssets?: AppAssetsEntity;\n\n defaultVM = false;\n\n vmsAreEqual(a: boolean, b: boolean): boolean {\n return a === b;\n }\n\n formVM = (): void => {\n if (!this.appAssets) return;\n const vm = this.appAssets.showArchived;\n this.doUpdateView(vm);\n };\n\n constructor(appObject: AppObject) {\n super(appObject, ShowArchivedAppAssetPM.type);\n\n this.appAssets = appObject.getComponent<AppAssetsEntity>(\n AppAssetsEntity.type\n );\n if (!this.appAssets) {\n this.warn(\n \"PM has been added to an App Object without an AppAssetsEntity\"\n );\n return;\n }\n\n this.observeEntity(this.appAssets);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ArchiveAssetUC.js","sourceRoot":"","sources":["../../../../src/Assets/UCs/ArchiveAssetUC.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * ArchiveAssetUC.ts\r\n *\r\n * This use case handles the archiving and unarchiving of assets, providing\r\n * a reversible soft-deletion mechanism that hides assets from normal views\r\n * while preserving them in the system.\r\n *\r\n * Key Concepts:\r\n * - Archive operations are reversible soft-deletion mechanisms\r\n * - Archived assets remain in the system but are hidden from normal views\r\n * - Uses API calls to persist archive state changes\r\n * - Provides user feedback through spinner and error dialogs\r\n * - Updates both local entity state and collection notifications\r\n *\r\n * Usage Patterns:\r\n * - Created per-asset during factory setup\r\n * - Accessed through static get() method with asset ID\r\n * - Handles both archiving (hiding) and unarchiving (showing) operations\r\n * - Manages async API calls with proper error handling and user feedback\r\n */\r\n\r\nimport { AppObject, AppObjectRepo, AppObjectUC } from \"@vived/core\";\r\nimport {\r\n DialogAlertDTO,\r\n MakeAlertDialogUC,\r\n MakeSpinnerDialogUC\r\n} from \"../../Dialog\";\r\nimport { PatchAssetIsArchivedUC } from \"../../VivedAPI\";\r\nimport { AppAssetsEntity } from \"../Entities/AppAssetsEntity\";\r\nimport { AssetEntity } from \"../Entities/AssetEntity\";\r\n\r\n/**\r\n * ArchiveAssetUC manages the archiving and unarchiving operations for individual assets.\r\n *\r\n * This use case provides the business logic for toggling asset archive status,\r\n * handling API persistence, and managing user feedback during the operation.\r\n * Archive operations are reversible and provide a soft-deletion mechanism.\r\n */\r\nexport abstract class ArchiveAssetUC extends AppObjectUC {\r\n /** Static type identifier for component registration */\r\n static type = \"ArchiveAssetUC\";\r\n\r\n /**\r\n * Sets the archived status of the associated asset.\r\n *\r\n * @param archived - True to archive (hide) the asset, false to unarchive (show) it\r\n * @returns Promise that resolves when the operation completes successfully\r\n */\r\n abstract setArchived(archived: boolean): Promise<void>;\r\n\r\n /**\r\n * Retrieves an ArchiveAssetUC component for a specific asset.\r\n *\r\n * @param assetID - The unique identifier of the asset\r\n * @param appObjects - Repository for accessing app objects and components\r\n * @returns ArchiveAssetUC instance or undefined if not found\r\n */\r\n static get(\r\n assetID: string,\r\n appObjects: AppObjectRepo\r\n ): ArchiveAssetUC | undefined {\r\n const appObject = appObjects.get(assetID);\r\n if (!appObject) {\r\n appObjects.submitWarning(\r\n \"ArchiveAssetUC.get\",\r\n \"Unable to find app object\"\r\n );\r\n return undefined;\r\n }\r\n\r\n const uc = appObject.getComponent<ArchiveAssetUC>(ArchiveAssetUC.type);\r\n if (!uc) {\r\n appObjects.submitWarning(\r\n \"ArchiveAssetUC.get\",\r\n \"App Object does not have ArchiveAssetUC\"\r\n );\r\n return undefined;\r\n }\r\n\r\n return uc;\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create a new ArchiveAssetUC instance.\r\n *\r\n * @param appObject - The AppObject that will host this use case (should contain an AssetEntity)\r\n * @returns A new ArchiveAssetUC implementation instance\r\n */\r\nexport function makeArchiveAssetUC(appObject: AppObject): ArchiveAssetUC {\r\n return new ArchiveAssetUCImp(appObject);\r\n}\r\n\r\n/**\r\n * Private implementation of ArchiveAssetUC that handles the concrete archive operations.\r\n *\r\n * Key Implementation Details:\r\n * - Validates asset entity existence and current archive state\r\n * - Uses PatchAssetIsArchivedUC for API persistence\r\n * - Provides user feedback through spinner dialogs during operations\r\n * - Handles errors gracefully with alert dialogs and logging\r\n * - Updates local asset state and triggers collection change notifications\r\n * - Prevents redundant operations when archive state hasn't changed\r\n */\r\nclass ArchiveAssetUCImp extends ArchiveAssetUC {\r\n /** The asset entity this use case operates on */\r\n private asset?: AssetEntity;\r\n\r\n /**\r\n * Gets the API use case for patching asset archive status\r\n * Cached for efficient repeated access during operations\r\n */\r\n private get patchAssetIsArchived() {\r\n return this.getCachedSingleton<PatchAssetIsArchivedUC>(\r\n PatchAssetIsArchivedUC.type\r\n )?.doPatch;\r\n }\r\n\r\n /**\r\n * Gets the app assets collection entity for triggering collection updates\r\n * Used to notify UI components when asset visibility changes\r\n */\r\n private get appAssets() {\r\n return this.getCachedSingleton<AppAssetsEntity>(AppAssetsEntity.type);\r\n }\r\n\r\n /**\r\n * Sets the archived status of the asset with full error handling and user feedback.\r\n *\r\n * This method handles the complete archive workflow:\r\n * 1. Validates the asset exists and state change is needed\r\n * 2. Shows a spinner dialog during the API operation\r\n * 3. Updates the asset entity and collection on success\r\n * 4. Shows error dialogs and logs failures appropriately\r\n *\r\n * @param archived - True to archive the asset, false to unarchive it\r\n * @returns Promise that resolves when the operation completes (successfully or with handled error)\r\n */\r\n setArchived = (archived: boolean): Promise<void> => {\r\n const asset = this.asset;\r\n\r\n if (!asset) {\r\n return Promise.reject(new Error(\"No Asset Entity\"));\r\n }\r\n\r\n // Prevent redundant operations\r\n if (asset.archived === archived) {\r\n return Promise.resolve();\r\n }\r\n\r\n const patchAssetIsArchived = this.patchAssetIsArchived;\r\n if (!patchAssetIsArchived) {\r\n return Promise.reject();\r\n }\r\n\r\n // Show user feedback during operation\r\n const title = archived ? \"Archiving Asset\" : \"Unarchive Asset\";\r\n const spinner = MakeSpinnerDialogUC.make(\r\n {\r\n title,\r\n message: \"Updating asset's archived flag...\"\r\n },\r\n this.appObjects\r\n );\r\n\r\n return new Promise((resolve, reject) => {\r\n patchAssetIsArchived(asset.id, archived)\r\n .then(() => {\r\n // Update local state\r\n asset.archived = archived;\r\n\r\n // Notify collections if this asset is part of them\r\n if (this.appAssets && this.appAssets.has(asset.id)) {\r\n this.appAssets.notifyOnChange();\r\n }\r\n spinner?.close();\r\n resolve();\r\n })\r\n .catch((e) => {\r\n // Handle errors with user feedback\r\n this.error(\"Archive asset error: \" + e.message);\r\n spinner?.close();\r\n const dialogDTO: DialogAlertDTO = {\r\n buttonLabel: \"OK\",\r\n message: `Something went wrong when setting the asset's archived flag. Check the console. ${e.message}`,\r\n title: \"Archive Asset Error\"\r\n };\r\n\r\n MakeAlertDialogUC.make(dialogDTO, this.appObjects);\r\n resolve(); // Resolve to prevent unhandled rejections, error is already handled\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * Initializes the ArchiveAssetUC with validation of required components.\r\n *\r\n * @param appObject - The AppObject that should contain the AssetEntity this UC will operate on\r\n */\r\n constructor(appObject: AppObject) {\r\n super(appObject, ArchiveAssetUC.type);\r\n\r\n this.asset = appObject.getComponent<AssetEntity>(AssetEntity.type);\r\n if (!this.asset) {\r\n this.error(\r\n \"UC has been added to an App Object that does not have ArchiveAssetUC\"\r\n );\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ArchiveAssetUC.js","sourceRoot":"","sources":["../../../../src/Assets/UCs/ArchiveAssetUC.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ArchiveAssetUC.ts\n *\n * This use case handles the archiving and unarchiving of assets, providing\n * a reversible soft-deletion mechanism that hides assets from normal views\n * while preserving them in the system.\n *\n * Key Concepts:\n * - Archive operations are reversible soft-deletion mechanisms\n * - Archived assets remain in the system but are hidden from normal views\n * - Uses API calls to persist archive state changes\n * - Provides user feedback through spinner and error dialogs\n * - Updates both local entity state and collection notifications\n *\n * Usage Patterns:\n * - Created per-asset during factory setup\n * - Accessed through static get() method with asset ID\n * - Handles both archiving (hiding) and unarchiving (showing) operations\n * - Manages async API calls with proper error handling and user feedback\n */\n\nimport { AppObject, AppObjectRepo, AppObjectUC } from \"@vived/core\";\nimport {\n DialogAlertDTO,\n MakeAlertDialogUC,\n MakeSpinnerDialogUC\n} from \"../../Dialog\";\nimport { PatchAssetIsArchivedUC } from \"../../VivedAPI\";\nimport { AppAssetsEntity } from \"../Entities/AppAssetsEntity\";\nimport { AssetEntity } from \"../Entities/AssetEntity\";\n\n/**\n * ArchiveAssetUC manages the archiving and unarchiving operations for individual assets.\n *\n * This use case provides the business logic for toggling asset archive status,\n * handling API persistence, and managing user feedback during the operation.\n * Archive operations are reversible and provide a soft-deletion mechanism.\n */\nexport abstract class ArchiveAssetUC extends AppObjectUC {\n /** Static type identifier for component registration */\n static type = \"ArchiveAssetUC\";\n\n /**\n * Sets the archived status of the associated asset.\n *\n * @param archived - True to archive (hide) the asset, false to unarchive (show) it\n * @returns Promise that resolves when the operation completes successfully\n */\n abstract setArchived(archived: boolean): Promise<void>;\n\n /**\n * Retrieves an ArchiveAssetUC component for a specific asset.\n *\n * @param assetID - The unique identifier of the asset\n * @param appObjects - Repository for accessing app objects and components\n * @returns ArchiveAssetUC instance or undefined if not found\n */\n static get(\n assetID: string,\n appObjects: AppObjectRepo\n ): ArchiveAssetUC | undefined {\n const appObject = appObjects.get(assetID);\n if (!appObject) {\n appObjects.submitWarning(\n \"ArchiveAssetUC.get\",\n \"Unable to find app object\"\n );\n return undefined;\n }\n\n const uc = appObject.getComponent<ArchiveAssetUC>(ArchiveAssetUC.type);\n if (!uc) {\n appObjects.submitWarning(\n \"ArchiveAssetUC.get\",\n \"App Object does not have ArchiveAssetUC\"\n );\n return undefined;\n }\n\n return uc;\n }\n}\n\n/**\n * Factory function to create a new ArchiveAssetUC instance.\n *\n * @param appObject - The AppObject that will host this use case (should contain an AssetEntity)\n * @returns A new ArchiveAssetUC implementation instance\n */\nexport function makeArchiveAssetUC(appObject: AppObject): ArchiveAssetUC {\n return new ArchiveAssetUCImp(appObject);\n}\n\n/**\n * Private implementation of ArchiveAssetUC that handles the concrete archive operations.\n *\n * Key Implementation Details:\n * - Validates asset entity existence and current archive state\n * - Uses PatchAssetIsArchivedUC for API persistence\n * - Provides user feedback through spinner dialogs during operations\n * - Handles errors gracefully with alert dialogs and logging\n * - Updates local asset state and triggers collection change notifications\n * - Prevents redundant operations when archive state hasn't changed\n */\nclass ArchiveAssetUCImp extends ArchiveAssetUC {\n /** The asset entity this use case operates on */\n private asset?: AssetEntity;\n\n /**\n * Gets the API use case for patching asset archive status\n * Cached for efficient repeated access during operations\n */\n private get patchAssetIsArchived() {\n return this.getCachedSingleton<PatchAssetIsArchivedUC>(\n PatchAssetIsArchivedUC.type\n )?.doPatch;\n }\n\n /**\n * Gets the app assets collection entity for triggering collection updates\n * Used to notify UI components when asset visibility changes\n */\n private get appAssets() {\n return this.getCachedSingleton<AppAssetsEntity>(AppAssetsEntity.type);\n }\n\n /**\n * Sets the archived status of the asset with full error handling and user feedback.\n *\n * This method handles the complete archive workflow:\n * 1. Validates the asset exists and state change is needed\n * 2. Shows a spinner dialog during the API operation\n * 3. Updates the asset entity and collection on success\n * 4. Shows error dialogs and logs failures appropriately\n *\n * @param archived - True to archive the asset, false to unarchive it\n * @returns Promise that resolves when the operation completes (successfully or with handled error)\n */\n setArchived = (archived: boolean): Promise<void> => {\n const asset = this.asset;\n\n if (!asset) {\n return Promise.reject(new Error(\"No Asset Entity\"));\n }\n\n // Prevent redundant operations\n if (asset.archived === archived) {\n return Promise.resolve();\n }\n\n const patchAssetIsArchived = this.patchAssetIsArchived;\n if (!patchAssetIsArchived) {\n return Promise.reject();\n }\n\n // Show user feedback during operation\n const title = archived ? \"Archiving Asset\" : \"Unarchive Asset\";\n const spinner = MakeSpinnerDialogUC.make(\n {\n title,\n message: \"Updating asset's archived flag...\"\n },\n this.appObjects\n );\n\n return new Promise((resolve, reject) => {\n patchAssetIsArchived(asset.id, archived)\n .then(() => {\n // Update local state\n asset.archived = archived;\n\n // Notify collections if this asset is part of them\n if (this.appAssets && this.appAssets.has(asset.id)) {\n this.appAssets.notifyOnChange();\n }\n spinner?.close();\n resolve();\n })\n .catch((e) => {\n // Handle errors with user feedback\n this.error(\"Archive asset error: \" + e.message);\n spinner?.close();\n const dialogDTO: DialogAlertDTO = {\n buttonLabel: \"OK\",\n message: `Something went wrong when setting the asset's archived flag. Check the console. ${e.message}`,\n title: \"Archive Asset Error\"\n };\n\n MakeAlertDialogUC.make(dialogDTO, this.appObjects);\n resolve(); // Resolve to prevent unhandled rejections, error is already handled\n });\n });\n };\n\n /**\n * Initializes the ArchiveAssetUC with validation of required components.\n *\n * @param appObject - The AppObject that should contain the AssetEntity this UC will operate on\n */\n constructor(appObject: AppObject) {\n super(appObject, ArchiveAssetUC.type);\n\n this.asset = appObject.getComponent<AssetEntity>(AssetEntity.type);\n if (!this.asset) {\n this.error(\n \"UC has been added to an App Object that does not have ArchiveAssetUC\"\n );\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"DeleteAssetUC.js","sourceRoot":"","sources":["../../../../src/Assets/UCs/DeleteAssetUC.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * DeleteAssetUC.ts\r\n *\r\n * This use case handles the permanent deletion of assets from the system,\r\n * including user confirmation dialogs and cleanup of all related data.\r\n *\r\n * Key Concepts:\r\n * - Permanent deletion removes assets completely from the system\r\n * - Includes mandatory user confirmation to prevent accidental deletions\r\n * - Cleans up asset from all collections and repositories\r\n * - Uses API calls to persist deletion on the backend\r\n * - Provides user feedback through dialogs during the operation\r\n *\r\n * Usage Patterns:\r\n * - Created per-asset during factory setup\r\n * - Accessed through static get() method with asset ID\r\n * - Provides both confirmed and unconfirmed deletion methods\r\n * - Handles async operations with proper error handling and user feedback\r\n */\r\n\r\nimport { AppObject, AppObjectRepo, AppObjectUC } from \"@vived/core\";\r\nimport {\r\n DialogAlertDTO,\r\n MakeAlertDialogUC,\r\n MakeConfirmDialogUC,\r\n MakeSpinnerDialogUC\r\n} from \"../../Dialog\";\r\nimport { DeleteAssetOnAPIUC } from \"../../VivedAPI\";\r\nimport { AppAssetsEntity } from \"../Entities/AppAssetsEntity\";\r\nimport { AssetEntity } from \"../Entities/AssetEntity\";\r\nimport { AssetRepo } from \"../Entities/AssetRepo\";\r\n\r\n/**\r\n * DeleteAssetUC manages the permanent deletion of individual assets.\r\n *\r\n * This use case provides both confirmed and unconfirmed deletion methods,\r\n * handling complete cleanup of asset data from all system components.\r\n */\r\nexport abstract class DeleteAssetUC extends AppObjectUC {\r\n /** Static type identifier for component registration */\r\n static type = \"DeleteAssetUC\";\r\n\r\n /**\r\n * Permanently deletes the associated asset without user confirmation.\r\n *\r\n * @returns Promise that resolves when the deletion completes successfully\r\n */\r\n abstract delete(): Promise<void>;\r\n\r\n /**\r\n * Initiates asset deletion with user confirmation dialog.\r\n * Shows a confirmation dialog before proceeding with the deletion.\r\n */\r\n abstract deleteWithConfirm(): void;\r\n\r\n /**\r\n * Retrieves a DeleteAssetUC component for a specific asset.\r\n *\r\n * @param assetID - The unique identifier of the asset\r\n * @param appObjects - Repository for accessing app objects and components\r\n * @returns DeleteAssetUC instance or undefined if not found\r\n */\r\n static get(\r\n assetID: string,\r\n appObjects: AppObjectRepo\r\n ): DeleteAssetUC | undefined {\r\n const appObject = appObjects.get(assetID);\r\n if (!appObject) {\r\n appObjects.submitWarning(\r\n \"DeleteAssetUC.get\",\r\n \"Unable to find app object\"\r\n );\r\n return undefined;\r\n }\r\n\r\n const uc = appObject.getComponent<DeleteAssetUC>(DeleteAssetUC.type);\r\n if (!uc) {\r\n appObjects.submitWarning(\r\n \"DeleteAssetUC.get\",\r\n \"App Object does not have DeleteAssetUC\"\r\n );\r\n return undefined;\r\n }\r\n\r\n return uc;\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create a new DeleteAssetUC instance.\r\n *\r\n * @param appObject - The AppObject that will host this use case (should contain an AssetEntity)\r\n * @returns A new DeleteAssetUC implementation instance\r\n */\r\nexport function makeDeleteAssetUC(appObject: AppObject): DeleteAssetUC {\r\n return new DeleteAssetUCImp(appObject);\r\n}\r\n\r\n/**\r\n * Private implementation of DeleteAssetUC that handles the concrete deletion operations.\r\n *\r\n * Key Implementation Details:\r\n * - Validates asset entity existence before operations\r\n * - Uses DeleteAssetOnAPIUC for backend persistence\r\n * - Provides user confirmation through dialog system\r\n * - Shows spinner dialogs during deletion operations\r\n * - Handles errors gracefully with alert dialogs and logging\r\n * - Cleans up asset from all collections and repositories\r\n * - Removes asset from both AppAssetsEntity and AssetRepo\r\n */\r\nclass DeleteAssetUCImp extends DeleteAssetUC {\r\n /** The asset entity this use case operates on */\r\n private asset?: AssetEntity;\r\n\r\n /**\r\n * Gets the API use case for deleting assets from the backend\r\n * Cached for efficient repeated access during operations\r\n */\r\n private get doDelete() {\r\n return this.getCachedSingleton<DeleteAssetOnAPIUC>(DeleteAssetOnAPIUC.type)\r\n ?.doDelete;\r\n }\r\n\r\n /**\r\n * Gets the app assets collection entity for cleanup operations\r\n * Used to remove the asset from collection displays\r\n */\r\n private get appAssets() {\r\n return this.getCachedSingleton<AppAssetsEntity>(AppAssetsEntity.type);\r\n }\r\n\r\n /**\r\n * Gets the asset repository for cleanup operations\r\n * Used to remove the asset from the global asset repository\r\n */\r\n private get assetRepo() {\r\n return this.getCachedSingleton<AssetRepo>(AssetRepo.type);\r\n }\r\n\r\n /**\r\n * Initiates asset deletion with user confirmation.\r\n *\r\n * Shows a confirmation dialog with warnings about the irreversible nature\r\n * of the operation and suggests archiving as an alternative.\r\n */\r\n deleteWithConfirm = () => {\r\n MakeConfirmDialogUC.make(\r\n {\r\n cancelButtonLabel: \"Cancel\",\r\n confirmButtonLabel: \"Delete Asset\",\r\n message:\r\n \"Are you sure you want to delete this asset. This cannot be undone and could affect users. Consider archiving it instead\",\r\n title: \"Delete Asset\",\r\n onConfirm: this.delete\r\n },\r\n this.appObjects\r\n );\r\n };\r\n\r\n /**\r\n * Permanently deletes the asset with full cleanup and user feedback.\r\n *\r\n * This method handles the complete deletion workflow:\r\n * 1. Validates the asset exists\r\n * 2. Shows a spinner dialog during the API operation\r\n * 3. Removes the asset from backend via API\r\n * 4. Cleans up the asset from all local collections and repositories\r\n * 5. Shows error dialogs and logs failures appropriately\r\n *\r\n * @returns Promise that resolves when the operation completes (successfully or with handled error)\r\n */\r\n delete = (): Promise<void> => {\r\n const asset = this.asset;\r\n\r\n if (!asset) {\r\n return Promise.reject(new Error(\"No Asset Entity\"));\r\n }\r\n\r\n const doDelete = this.doDelete;\r\n if (!doDelete) {\r\n return Promise.reject();\r\n }\r\n\r\n // Show user feedback during operation\r\n const title = \"Delete Asset\";\r\n const spinnerDialog = MakeSpinnerDialogUC.make(\r\n {\r\n title,\r\n message: \"Deleting asset...\"\r\n },\r\n this.appObjects\r\n );\r\n\r\n return new Promise((resolve) => {\r\n doDelete(asset.id)\r\n .then(() => {\r\n // Clean up from all collections and repositories\r\n if (this.appAssets && this.appAssets.has(asset.id)) {\r\n this.appAssets.remove(asset.id);\r\n }\r\n\r\n if (this.assetRepo && this.assetRepo.has(asset.id)) {\r\n this.assetRepo.remove(asset.id);\r\n }\r\n\r\n spinnerDialog?.close();\r\n resolve();\r\n })\r\n .catch((e) => {\r\n // Handle errors with user feedback\r\n this.error(\"Archive asset error: \" + e.message);\r\n spinnerDialog?.close();\r\n const dialogDTO: DialogAlertDTO = {\r\n buttonLabel: \"OK\",\r\n message: `Something went wrong when setting the asset's archived flag. Check the console. ${e.message}`,\r\n title: \"Archive Asset Error\"\r\n };\r\n MakeAlertDialogUC.make(dialogDTO, this.appObjects);\r\n resolve(); // Resolve to prevent unhandled rejections, error is already handled\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * Initializes the DeleteAssetUC with validation of required components.\r\n *\r\n * @param appObject - The AppObject that should contain the AssetEntity this UC will operate on\r\n */\r\n constructor(appObject: AppObject) {\r\n super(appObject, DeleteAssetUC.type);\r\n\r\n this.asset = appObject.getComponent<AssetEntity>(AssetEntity.type);\r\n if (!this.asset) {\r\n this.error(\r\n \"UC has been added to an App Object that does not have ArchiveAssetUC\"\r\n );\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"DeleteAssetUC.js","sourceRoot":"","sources":["../../../../src/Assets/UCs/DeleteAssetUC.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * DeleteAssetUC.ts\n *\n * This use case handles the permanent deletion of assets from the system,\n * including user confirmation dialogs and cleanup of all related data.\n *\n * Key Concepts:\n * - Permanent deletion removes assets completely from the system\n * - Includes mandatory user confirmation to prevent accidental deletions\n * - Cleans up asset from all collections and repositories\n * - Uses API calls to persist deletion on the backend\n * - Provides user feedback through dialogs during the operation\n *\n * Usage Patterns:\n * - Created per-asset during factory setup\n * - Accessed through static get() method with asset ID\n * - Provides both confirmed and unconfirmed deletion methods\n * - Handles async operations with proper error handling and user feedback\n */\n\nimport { AppObject, AppObjectRepo, AppObjectUC } from \"@vived/core\";\nimport {\n DialogAlertDTO,\n MakeAlertDialogUC,\n MakeConfirmDialogUC,\n MakeSpinnerDialogUC\n} from \"../../Dialog\";\nimport { DeleteAssetOnAPIUC } from \"../../VivedAPI\";\nimport { AppAssetsEntity } from \"../Entities/AppAssetsEntity\";\nimport { AssetEntity } from \"../Entities/AssetEntity\";\nimport { AssetRepo } from \"../Entities/AssetRepo\";\n\n/**\n * DeleteAssetUC manages the permanent deletion of individual assets.\n *\n * This use case provides both confirmed and unconfirmed deletion methods,\n * handling complete cleanup of asset data from all system components.\n */\nexport abstract class DeleteAssetUC extends AppObjectUC {\n /** Static type identifier for component registration */\n static type = \"DeleteAssetUC\";\n\n /**\n * Permanently deletes the associated asset without user confirmation.\n *\n * @returns Promise that resolves when the deletion completes successfully\n */\n abstract delete(): Promise<void>;\n\n /**\n * Initiates asset deletion with user confirmation dialog.\n * Shows a confirmation dialog before proceeding with the deletion.\n */\n abstract deleteWithConfirm(): void;\n\n /**\n * Retrieves a DeleteAssetUC component for a specific asset.\n *\n * @param assetID - The unique identifier of the asset\n * @param appObjects - Repository for accessing app objects and components\n * @returns DeleteAssetUC instance or undefined if not found\n */\n static get(\n assetID: string,\n appObjects: AppObjectRepo\n ): DeleteAssetUC | undefined {\n const appObject = appObjects.get(assetID);\n if (!appObject) {\n appObjects.submitWarning(\n \"DeleteAssetUC.get\",\n \"Unable to find app object\"\n );\n return undefined;\n }\n\n const uc = appObject.getComponent<DeleteAssetUC>(DeleteAssetUC.type);\n if (!uc) {\n appObjects.submitWarning(\n \"DeleteAssetUC.get\",\n \"App Object does not have DeleteAssetUC\"\n );\n return undefined;\n }\n\n return uc;\n }\n}\n\n/**\n * Factory function to create a new DeleteAssetUC instance.\n *\n * @param appObject - The AppObject that will host this use case (should contain an AssetEntity)\n * @returns A new DeleteAssetUC implementation instance\n */\nexport function makeDeleteAssetUC(appObject: AppObject): DeleteAssetUC {\n return new DeleteAssetUCImp(appObject);\n}\n\n/**\n * Private implementation of DeleteAssetUC that handles the concrete deletion operations.\n *\n * Key Implementation Details:\n * - Validates asset entity existence before operations\n * - Uses DeleteAssetOnAPIUC for backend persistence\n * - Provides user confirmation through dialog system\n * - Shows spinner dialogs during deletion operations\n * - Handles errors gracefully with alert dialogs and logging\n * - Cleans up asset from all collections and repositories\n * - Removes asset from both AppAssetsEntity and AssetRepo\n */\nclass DeleteAssetUCImp extends DeleteAssetUC {\n /** The asset entity this use case operates on */\n private asset?: AssetEntity;\n\n /**\n * Gets the API use case for deleting assets from the backend\n * Cached for efficient repeated access during operations\n */\n private get doDelete() {\n return this.getCachedSingleton<DeleteAssetOnAPIUC>(DeleteAssetOnAPIUC.type)\n ?.doDelete;\n }\n\n /**\n * Gets the app assets collection entity for cleanup operations\n * Used to remove the asset from collection displays\n */\n private get appAssets() {\n return this.getCachedSingleton<AppAssetsEntity>(AppAssetsEntity.type);\n }\n\n /**\n * Gets the asset repository for cleanup operations\n * Used to remove the asset from the global asset repository\n */\n private get assetRepo() {\n return this.getCachedSingleton<AssetRepo>(AssetRepo.type);\n }\n\n /**\n * Initiates asset deletion with user confirmation.\n *\n * Shows a confirmation dialog with warnings about the irreversible nature\n * of the operation and suggests archiving as an alternative.\n */\n deleteWithConfirm = () => {\n MakeConfirmDialogUC.make(\n {\n cancelButtonLabel: \"Cancel\",\n confirmButtonLabel: \"Delete Asset\",\n message:\n \"Are you sure you want to delete this asset. This cannot be undone and could affect users. Consider archiving it instead\",\n title: \"Delete Asset\",\n onConfirm: this.delete\n },\n this.appObjects\n );\n };\n\n /**\n * Permanently deletes the asset with full cleanup and user feedback.\n *\n * This method handles the complete deletion workflow:\n * 1. Validates the asset exists\n * 2. Shows a spinner dialog during the API operation\n * 3. Removes the asset from backend via API\n * 4. Cleans up the asset from all local collections and repositories\n * 5. Shows error dialogs and logs failures appropriately\n *\n * @returns Promise that resolves when the operation completes (successfully or with handled error)\n */\n delete = (): Promise<void> => {\n const asset = this.asset;\n\n if (!asset) {\n return Promise.reject(new Error(\"No Asset Entity\"));\n }\n\n const doDelete = this.doDelete;\n if (!doDelete) {\n return Promise.reject();\n }\n\n // Show user feedback during operation\n const title = \"Delete Asset\";\n const spinnerDialog = MakeSpinnerDialogUC.make(\n {\n title,\n message: \"Deleting asset...\"\n },\n this.appObjects\n );\n\n return new Promise((resolve) => {\n doDelete(asset.id)\n .then(() => {\n // Clean up from all collections and repositories\n if (this.appAssets && this.appAssets.has(asset.id)) {\n this.appAssets.remove(asset.id);\n }\n\n if (this.assetRepo && this.assetRepo.has(asset.id)) {\n this.assetRepo.remove(asset.id);\n }\n\n spinnerDialog?.close();\n resolve();\n })\n .catch((e) => {\n // Handle errors with user feedback\n this.error(\"Archive asset error: \" + e.message);\n spinnerDialog?.close();\n const dialogDTO: DialogAlertDTO = {\n buttonLabel: \"OK\",\n message: `Something went wrong when setting the asset's archived flag. Check the console. ${e.message}`,\n title: \"Archive Asset Error\"\n };\n MakeAlertDialogUC.make(dialogDTO, this.appObjects);\n resolve(); // Resolve to prevent unhandled rejections, error is already handled\n });\n });\n };\n\n /**\n * Initializes the DeleteAssetUC with validation of required components.\n *\n * @param appObject - The AppObject that should contain the AssetEntity this UC will operate on\n */\n constructor(appObject: AppObject) {\n super(appObject, DeleteAssetUC.type);\n\n this.asset = appObject.getComponent<AssetEntity>(AssetEntity.type);\n if (!this.asset) {\n this.error(\n \"UC has been added to an App Object that does not have ArchiveAssetUC\"\n );\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"DownloadAssetFileUC.js","sourceRoot":"","sources":["../../../../src/Assets/UCs/DownloadAssetFileUC.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * DownloadAssetFileUC.ts\r\n *\r\n * This use case handles downloading asset files to the user's local system,\r\n * managing both cached and remote file retrieval with browser download triggers.\r\n *\r\n * Key Concepts:\r\n * - Downloads asset files to user's local file system via browser\r\n * - Handles both cached (blob URL) and remote file sources\r\n * - Uses GetAssetFileUC for remote file retrieval when needed\r\n * - Provides user feedback through spinner dialogs during downloads\r\n * - Triggers browser download mechanism using temporary anchor elements\r\n *\r\n * Usage Patterns:\r\n * - Created per-asset during factory setup\r\n * - Accessed through static get() method with asset ID\r\n * - Handles both immediate downloads (cached files) and fetch-then-download (remote files)\r\n * - Manages async operations with proper error handling and user feedback\r\n */\r\n\r\nimport { AppObject, AppObjectRepo, AppObjectUC } from \"@vived/core\";\r\nimport {\r\n DialogAlertDTO,\r\n MakeAlertDialogUC,\r\n MakeSpinnerDialogUC\r\n} from \"../../Dialog\";\r\nimport { AssetEntity } from \"../Entities/AssetEntity\";\r\nimport { GetAssetFileUC } from \"./GetAssetFileUC\";\r\n\r\n/**\r\n * DownloadAssetFileUC manages downloading asset files to the user's local system.\r\n *\r\n * This use case handles the complete download workflow, from file retrieval\r\n * (if necessary) to triggering the browser's download mechanism.\r\n */\r\nexport abstract class DownloadAssetFileUC extends AppObjectUC {\r\n /** Static type identifier for component registration */\r\n static type = \"DownloadAssetFileUC\";\r\n\r\n /**\r\n * Downloads the associated asset file to the user's local system.\r\n *\r\n * @returns Promise that resolves when the download operation completes\r\n */\r\n abstract download(): Promise<void>;\r\n\r\n /**\r\n * Triggers the browser download mechanism for a cached asset file.\r\n * This method assumes the asset already has a blob URL available.\r\n */\r\n abstract saveFileLocally(): void;\r\n\r\n /**\r\n * Retrieves a DownloadAssetFileUC component for a specific asset.\r\n *\r\n * @param assetID - The unique identifier of the asset\r\n * @param appObjects - Repository for accessing app objects and components\r\n * @returns DownloadAssetFileUC instance or undefined if not found\r\n */\r\n static get(\r\n assetID: string,\r\n appObjects: AppObjectRepo\r\n ): DownloadAssetFileUC | undefined {\r\n const appObject = appObjects.get(assetID);\r\n if (!appObject) {\r\n appObjects.submitWarning(\r\n \"DownloadAssetFileUC.get\",\r\n \"Unable to find app object\"\r\n );\r\n return undefined;\r\n }\r\n\r\n const uc = appObject.getComponent<DownloadAssetFileUC>(\r\n DownloadAssetFileUC.type\r\n );\r\n if (!uc) {\r\n appObjects.submitWarning(\r\n \"DownloadAssetFileUC.get\",\r\n \"App Object does not have DownloadAssetFileUC\"\r\n );\r\n return undefined;\r\n }\r\n\r\n return uc;\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create a new DownloadAssetFileUC instance.\r\n *\r\n * @param appObject - The AppObject that will host this use case (should contain an AssetEntity)\r\n * @returns A new DownloadAssetFileUC implementation instance\r\n */\r\nexport function makeDownloadAssetFileUC(\r\n appObject: AppObject\r\n): DownloadAssetFileUC {\r\n return new DownloadAssetFileUCImp(appObject);\r\n}\r\n\r\n/**\r\n * Private implementation of DownloadAssetFileUC that handles the concrete download operations.\r\n *\r\n * Key Implementation Details:\r\n * - Checks for cached blob URLs to enable immediate downloads\r\n * - Falls back to GetAssetFileUC for remote file retrieval\r\n * - Shows spinner dialogs during file fetch operations\r\n * - Handles errors gracefully with alert dialogs and logging\r\n * - Uses DOM manipulation to trigger browser downloads\r\n * - Preserves original filenames for downloaded files\r\n */\r\nclass DownloadAssetFileUCImp extends DownloadAssetFileUC {\r\n /** The asset entity this use case operates on */\r\n private asset?: AssetEntity;\r\n\r\n /**\r\n * Gets the use case for retrieving asset files from remote sources\r\n * Used when the asset file is not already cached locally\r\n */\r\n private get getAssetFile() {\r\n return this.getCachedSingleton<GetAssetFileUC>(GetAssetFileUC.type)\r\n ?.getAssetFile;\r\n }\r\n\r\n /**\r\n * Downloads the asset file with smart caching and user feedback.\r\n *\r\n * This method implements the complete download workflow:\r\n * 1. Validates the asset exists\r\n * 2. If a blob URL exists, triggers immediate download\r\n * 3. If no blob URL, fetches the file from remote source first\r\n * 4. Shows spinner dialog during remote fetch operations\r\n * 5. Triggers download once file is available locally\r\n * 6. Handles errors with appropriate user feedback\r\n *\r\n * @returns Promise that resolves when the download operation completes\r\n */\r\n download = (): Promise<void> => {\r\n const asset = this.asset;\r\n\r\n if (!asset) {\r\n return Promise.reject(new Error(\"No Asset Entity\"));\r\n }\r\n\r\n // If file is already cached, download immediately\r\n if (asset.blobURL) {\r\n this.saveFileLocally();\r\n return Promise.resolve();\r\n }\r\n\r\n // Need to fetch file first\r\n const getAssetFile = this.getAssetFile;\r\n if (!getAssetFile) {\r\n return Promise.reject();\r\n }\r\n\r\n // Show user feedback during fetch operation\r\n const title = \"Download Asset\";\r\n const spinnerDialog = MakeSpinnerDialogUC.make(\r\n {\r\n title,\r\n message: \"Downloading asset...\"\r\n },\r\n this.appObjects\r\n );\r\n\r\n return new Promise((resolve) => {\r\n getAssetFile(asset.id)\r\n .then(() => {\r\n spinnerDialog?.close();\r\n this.saveFileLocally();\r\n resolve();\r\n })\r\n .catch((e) => {\r\n // Handle errors with user feedback\r\n this.error(\"Archive asset error: \" + e.message);\r\n spinnerDialog?.close();\r\n const dialogDTO: DialogAlertDTO = {\r\n buttonLabel: \"OK\",\r\n message: `Something went wrong when setting the asset's archived flag. Check the console. ${e.message}`,\r\n title: \"Archive Asset Error\"\r\n };\r\n MakeAlertDialogUC.make(dialogDTO, this.appObjects);\r\n resolve(); // Resolve to prevent unhandled rejections, error is already handled\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * Triggers the browser's download mechanism for the cached asset file.\r\n *\r\n * This method creates a temporary anchor element with the blob URL and\r\n * programmatically clicks it to trigger the browser download. The download\r\n * preserves the original filename from the asset metadata.\r\n */\r\n saveFileLocally = () => {\r\n if (!this.asset) {\r\n this.error(\"No Asset\");\r\n return;\r\n }\r\n\r\n if (!this.asset.blobURL) {\r\n this.error(\"No blob URL\");\r\n return;\r\n }\r\n\r\n // Create temporary anchor element to trigger download\r\n const a = document.createElement(\"a\");\r\n a.href = this.asset.blobURL;\r\n a.download = this.asset.filename;\r\n a.click();\r\n };\r\n\r\n /**\r\n * Initializes the DownloadAssetFileUC with validation of required components.\r\n *\r\n * @param appObject - The AppObject that should contain the AssetEntity this UC will operate on\r\n */\r\n constructor(appObject: AppObject) {\r\n super(appObject, DownloadAssetFileUC.type);\r\n\r\n this.asset = appObject.getComponent<AssetEntity>(AssetEntity.type);\r\n if (!this.asset) {\r\n this.error(\r\n \"UC has been added to an App Object that does not have ArchiveAssetUC\"\r\n );\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"DownloadAssetFileUC.js","sourceRoot":"","sources":["../../../../src/Assets/UCs/DownloadAssetFileUC.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;;AA2EH,0DAIC;AA7ED,sCAAoE;AACpE,yCAIsB;AACtB,yDAAsD;AACtD,qDAAkD;AAElD;;;;;GAKG;AACH,MAAsB,mBAAoB,SAAQ,kBAAW;IAiB3D;;;;;;OAMG;IACH,MAAM,CAAC,GAAG,CACR,OAAe,EACf,UAAyB;QAEzB,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,UAAU,CAAC,aAAa,CACtB,yBAAyB,EACzB,2BAA2B,CAC5B,CAAC;YACF,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,EAAE,GAAG,SAAS,CAAC,YAAY,CAC/B,mBAAmB,CAAC,IAAI,CACzB,CAAC;QACF,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,UAAU,CAAC,aAAa,CACtB,yBAAyB,EACzB,8CAA8C,CAC/C,CAAC;YACF,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;;AAjDH,kDAkDC;AAjDC,wDAAwD;AACjD,wBAAI,GAAG,qBAAqB,CAAC;AAkDtC;;;;;GAKG;AACH,SAAgB,uBAAuB,CACrC,SAAoB;IAEpB,OAAO,IAAI,sBAAsB,CAAC,SAAS,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,sBAAuB,SAAQ,mBAAmB;IAItD;;;OAGG;IACH,IAAY,YAAY;QACtB,OAAO,IAAI,CAAC,kBAAkB,CAAiB,+BAAc,CAAC,IAAI,CAAC;YACjE,EAAE,YAAY,CAAC;IACnB,CAAC;IA2FD;;;;OAIG;IACH,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC;QA/F7C;;;;;;;;;;;;WAYG;QACH,aAAQ,GAAG,GAAkB,EAAE;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YAEzB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACtD,CAAC;YAED,kDAAkD;YAClD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;YAC3B,CAAC;YAED,2BAA2B;YAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;YACvC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1B,CAAC;YAED,4CAA4C;YAC5C,MAAM,KAAK,GAAG,gBAAgB,CAAC;YAC/B,MAAM,aAAa,GAAG,4BAAmB,CAAC,IAAI,CAC5C;gBACE,KAAK;gBACL,OAAO,EAAE,sBAAsB;aAChC,EACD,IAAI,CAAC,UAAU,CAChB,CAAC;YAEF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC7B,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;qBACnB,IAAI,CAAC,GAAG,EAAE;oBACT,aAAa,EAAE,KAAK,EAAE,CAAC;oBACvB,IAAI,CAAC,eAAe,EAAE,CAAC;oBACvB,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC;qBACD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;oBACX,mCAAmC;oBACnC,IAAI,CAAC,KAAK,CAAC,uBAAuB,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;oBAChD,aAAa,EAAE,KAAK,EAAE,CAAC;oBACvB,MAAM,SAAS,GAAmB;wBAChC,WAAW,EAAE,IAAI;wBACjB,OAAO,EAAE,mFAAmF,CAAC,CAAC,OAAO,EAAE;wBACvG,KAAK,EAAE,qBAAqB;qBAC7B,CAAC;oBACF,0BAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;oBACnD,OAAO,EAAE,CAAC,CAAC,oEAAoE;gBACjF,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF;;;;;;WAMG;QACH,oBAAe,GAAG,GAAG,EAAE;YACrB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBAC1B,OAAO;YACT,CAAC;YAED,sDAAsD;YACtD,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YACtC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YAC5B,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YACjC,CAAC,CAAC,KAAK,EAAE,CAAC;QACZ,CAAC,CAAC;QAUA,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,YAAY,CAAc,yBAAW,CAAC,IAAI,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,CACR,sEAAsE,CACvE,CAAC;QACJ,CAAC;IACH,CAAC;CACF","sourcesContent":["/**\n * DownloadAssetFileUC.ts\n *\n * This use case handles downloading asset files to the user's local system,\n * managing both cached and remote file retrieval with browser download triggers.\n *\n * Key Concepts:\n * - Downloads asset files to user's local file system via browser\n * - Handles both cached (blob URL) and remote file sources\n * - Uses GetAssetFileUC for remote file retrieval when needed\n * - Provides user feedback through spinner dialogs during downloads\n * - Triggers browser download mechanism using temporary anchor elements\n *\n * Usage Patterns:\n * - Created per-asset during factory setup\n * - Accessed through static get() method with asset ID\n * - Handles both immediate downloads (cached files) and fetch-then-download (remote files)\n * - Manages async operations with proper error handling and user feedback\n */\n\nimport { AppObject, AppObjectRepo, AppObjectUC } from \"@vived/core\";\nimport {\n DialogAlertDTO,\n MakeAlertDialogUC,\n MakeSpinnerDialogUC\n} from \"../../Dialog\";\nimport { AssetEntity } from \"../Entities/AssetEntity\";\nimport { GetAssetFileUC } from \"./GetAssetFileUC\";\n\n/**\n * DownloadAssetFileUC manages downloading asset files to the user's local system.\n *\n * This use case handles the complete download workflow, from file retrieval\n * (if necessary) to triggering the browser's download mechanism.\n */\nexport abstract class DownloadAssetFileUC extends AppObjectUC {\n /** Static type identifier for component registration */\n static type = \"DownloadAssetFileUC\";\n\n /**\n * Downloads the associated asset file to the user's local system.\n *\n * @returns Promise that resolves when the download operation completes\n */\n abstract download(): Promise<void>;\n\n /**\n * Triggers the browser download mechanism for a cached asset file.\n * This method assumes the asset already has a blob URL available.\n */\n abstract saveFileLocally(): void;\n\n /**\n * Retrieves a DownloadAssetFileUC component for a specific asset.\n *\n * @param assetID - The unique identifier of the asset\n * @param appObjects - Repository for accessing app objects and components\n * @returns DownloadAssetFileUC instance or undefined if not found\n */\n static get(\n assetID: string,\n appObjects: AppObjectRepo\n ): DownloadAssetFileUC | undefined {\n const appObject = appObjects.get(assetID);\n if (!appObject) {\n appObjects.submitWarning(\n \"DownloadAssetFileUC.get\",\n \"Unable to find app object\"\n );\n return undefined;\n }\n\n const uc = appObject.getComponent<DownloadAssetFileUC>(\n DownloadAssetFileUC.type\n );\n if (!uc) {\n appObjects.submitWarning(\n \"DownloadAssetFileUC.get\",\n \"App Object does not have DownloadAssetFileUC\"\n );\n return undefined;\n }\n\n return uc;\n }\n}\n\n/**\n * Factory function to create a new DownloadAssetFileUC instance.\n *\n * @param appObject - The AppObject that will host this use case (should contain an AssetEntity)\n * @returns A new DownloadAssetFileUC implementation instance\n */\nexport function makeDownloadAssetFileUC(\n appObject: AppObject\n): DownloadAssetFileUC {\n return new DownloadAssetFileUCImp(appObject);\n}\n\n/**\n * Private implementation of DownloadAssetFileUC that handles the concrete download operations.\n *\n * Key Implementation Details:\n * - Checks for cached blob URLs to enable immediate downloads\n * - Falls back to GetAssetFileUC for remote file retrieval\n * - Shows spinner dialogs during file fetch operations\n * - Handles errors gracefully with alert dialogs and logging\n * - Uses DOM manipulation to trigger browser downloads\n * - Preserves original filenames for downloaded files\n */\nclass DownloadAssetFileUCImp extends DownloadAssetFileUC {\n /** The asset entity this use case operates on */\n private asset?: AssetEntity;\n\n /**\n * Gets the use case for retrieving asset files from remote sources\n * Used when the asset file is not already cached locally\n */\n private get getAssetFile() {\n return this.getCachedSingleton<GetAssetFileUC>(GetAssetFileUC.type)\n ?.getAssetFile;\n }\n\n /**\n * Downloads the asset file with smart caching and user feedback.\n *\n * This method implements the complete download workflow:\n * 1. Validates the asset exists\n * 2. If a blob URL exists, triggers immediate download\n * 3. If no blob URL, fetches the file from remote source first\n * 4. Shows spinner dialog during remote fetch operations\n * 5. Triggers download once file is available locally\n * 6. Handles errors with appropriate user feedback\n *\n * @returns Promise that resolves when the download operation completes\n */\n download = (): Promise<void> => {\n const asset = this.asset;\n\n if (!asset) {\n return Promise.reject(new Error(\"No Asset Entity\"));\n }\n\n // If file is already cached, download immediately\n if (asset.blobURL) {\n this.saveFileLocally();\n return Promise.resolve();\n }\n\n // Need to fetch file first\n const getAssetFile = this.getAssetFile;\n if (!getAssetFile) {\n return Promise.reject();\n }\n\n // Show user feedback during fetch operation\n const title = \"Download Asset\";\n const spinnerDialog = MakeSpinnerDialogUC.make(\n {\n title,\n message: \"Downloading asset...\"\n },\n this.appObjects\n );\n\n return new Promise((resolve) => {\n getAssetFile(asset.id)\n .then(() => {\n spinnerDialog?.close();\n this.saveFileLocally();\n resolve();\n })\n .catch((e) => {\n // Handle errors with user feedback\n this.error(\"Archive asset error: \" + e.message);\n spinnerDialog?.close();\n const dialogDTO: DialogAlertDTO = {\n buttonLabel: \"OK\",\n message: `Something went wrong when setting the asset's archived flag. Check the console. ${e.message}`,\n title: \"Archive Asset Error\"\n };\n MakeAlertDialogUC.make(dialogDTO, this.appObjects);\n resolve(); // Resolve to prevent unhandled rejections, error is already handled\n });\n });\n };\n\n /**\n * Triggers the browser's download mechanism for the cached asset file.\n *\n * This method creates a temporary anchor element with the blob URL and\n * programmatically clicks it to trigger the browser download. The download\n * preserves the original filename from the asset metadata.\n */\n saveFileLocally = () => {\n if (!this.asset) {\n this.error(\"No Asset\");\n return;\n }\n\n if (!this.asset.blobURL) {\n this.error(\"No blob URL\");\n return;\n }\n\n // Create temporary anchor element to trigger download\n const a = document.createElement(\"a\");\n a.href = this.asset.blobURL;\n a.download = this.asset.filename;\n a.click();\n };\n\n /**\n * Initializes the DownloadAssetFileUC with validation of required components.\n *\n * @param appObject - The AppObject that should contain the AssetEntity this UC will operate on\n */\n constructor(appObject: AppObject) {\n super(appObject, DownloadAssetFileUC.type);\n\n this.asset = appObject.getComponent<AssetEntity>(AssetEntity.type);\n if (!this.asset) {\n this.error(\n \"UC has been added to an App Object that does not have ArchiveAssetUC\"\n );\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"EditAppAssetUC.js","sourceRoot":"","sources":["../../../../src/Assets/UCs/EditAppAssetUC.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;;AAmDH,4CAEC;AAnDD,sCAKqB;AACrB,iFAGoD;AACpD,0CAAyD;AAEzD;;;;;GAKG;AACH,MAAsB,cAAe,SAAQ,kBAAW;IAWtD;;;;;OAKG;IACH,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAC1B,cAAc,CAAC,IAAI,EACnB,UAAU,CACX,CAAC;IACJ,CAAC;;AAtBH,wCAuBC;AAtBC,wDAAwD;AACjD,mBAAI,GAAG,gBAAgB,CAAC;AAuBjC;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,SAAoB;IACnD,OAAO,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,aAAc,SAAQ,cAAc;IAIxC,6DAA6D;IAC7D,IAAY,SAAS;QACnB,OAAO,IAAI,CAAC,kBAAkB,CAAkB,0BAAe,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC;IAED,yEAAyE;IACzE,IAAY,OAAO;QACjB,OAAO,IAAI,CAAC,kBAAkB,CAAmB,mCAAgB,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IA4BD;;;;OAIG;IACH,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;QAhCxC;;;;;;;;;;;WAWG;QACH,cAAS,GAAG,CAAC,OAAe,EAAQ,EAAE;YACpC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO;YAEhE,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,8BAA8B,GAAG,OAAO,CAAC,CAAC;gBACpD,OAAO;YACT,CAAC;YAED,sDAAsD;YACtD,IAAI,CAAC,SAAS,CAAC,YAAY,GAAG,KAAK,CAAC;YACpC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,+BAAY,CAAC,UAAU,CAAC;QAC/C,CAAC,CAAC;QASA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAExC,qDAAqD;QACrD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,YAAY,CAAY,oBAAS,CAAC,IAAI,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;IACH,CAAC;CACF","sourcesContent":["/**\r\n * EditAppAssetUC.ts\r\n *\r\n * This use case handles initiating the asset editing workflow by transitioning\r\n * the application to editing mode for a specific asset.\r\n *\r\n * Key Concepts:\r\n * - Manages application state transitions for asset editing workflows\r\n * - Sets the editing context in AppAssetsEntity for UI components\r\n * - Transitions sandbox state to enable editing interfaces\r\n * - Validates asset existence before initiating editing\r\n * - Provides error handling for missing assets or dependencies\r\n *\r\n * Usage Patterns:\r\n * - Singleton use case accessed through static get() method\r\n * - Called with asset ID to initiate editing for specific assets\r\n * - Coordinates between asset repository, app assets entity, and sandbox state\r\n * - Used by controllers to start editing workflows from UI interactions\r\n */\r\n\r\nimport {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectRepo,\r\n AppObjectUC\r\n} from \"@vived/core\";\r\nimport {\r\n AppSandboxEntity,\r\n SandboxState\r\n} from \"../../AppSandbox/Entities/AppSandboxEntity\";\r\nimport { AppAssetsEntity, AssetRepo } from \"../Entities\";\r\n\r\n/**\r\n * EditAppAssetUC handles initiating asset editing workflows and state transitions.\r\n *\r\n * This singleton use case manages the transition from normal asset viewing\r\n * to editing mode, setting up the necessary context for editing interfaces.\r\n */\r\nexport abstract class EditAppAssetUC extends AppObjectUC {\r\n /** Static type identifier for component registration */\r\n static type = \"EditAppAssetUC\";\r\n\r\n /**\r\n * Initiates editing mode for the specified asset.\r\n *\r\n * @param assetID - The unique identifier of the asset to edit\r\n */\r\n abstract editAsset(assetID: string): void;\r\n\r\n /**\r\n * Retrieves the singleton EditAppAssetUC instance.\r\n *\r\n * @param appObjects - Repository for accessing the singleton component\r\n * @returns EditAppAssetUC instance or undefined if not found\r\n */\r\n static get(appObjects: AppObjectRepo): EditAppAssetUC | undefined {\r\n return getSingletonComponent<EditAppAssetUC>(\r\n EditAppAssetUC.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create a new EditAppAssetUC instance.\r\n *\r\n * @param appObject - The AppObject that will host this singleton use case (must have AssetRepo)\r\n * @returns A new EditAppAssetUC implementation instance\r\n */\r\nexport function makeEditAppAsset(appObject: AppObject): EditAppAssetUC {\r\n return new GetAssetUCImp(appObject);\r\n}\r\n\r\n/**\r\n * Private implementation of EditAppAssetUC that handles state transitions for asset editing.\r\n *\r\n * Key Implementation Details:\r\n * - Validates asset existence in repository before initiating editing\r\n * - Sets editing context in AppAssetsEntity for UI component access\r\n * - Transitions sandbox state to enable editing interfaces\r\n * - Provides warning logs for missing assets or invalid operations\r\n * - Validates required dependencies during initialization\r\n */\r\nclass GetAssetUCImp extends EditAppAssetUC {\r\n /** The asset repository for asset lookup and validation */\r\n private assetRepo?: AssetRepo;\r\n\r\n /** Gets the app assets entity for setting editing context */\r\n private get appAssets() {\r\n return this.getCachedSingleton<AppAssetsEntity>(AppAssetsEntity.type);\r\n }\r\n\r\n /** Gets the sandbox entity for managing application state transitions */\r\n private get sandbox() {\r\n return this.getCachedSingleton<AppSandboxEntity>(AppSandboxEntity.type);\r\n }\r\n\r\n /**\r\n * Initiates asset editing by setting up editing context and transitioning state.\r\n *\r\n * This method handles the complete editing initiation workflow:\r\n * 1. Validates required dependencies are available\r\n * 2. Looks up the asset in the repository\r\n * 3. Sets the editing context in AppAssetsEntity\r\n * 4. Transitions sandbox state to editing mode\r\n * 5. Provides appropriate warnings for missing assets\r\n *\r\n * @param assetID - The unique identifier of the asset to edit\r\n */\r\n editAsset = (assetID: string): void => {\r\n if (!this.assetRepo || !this.appAssets || !this.sandbox) return;\r\n\r\n const asset = this.assetRepo.get(assetID);\r\n if (!asset) {\r\n this.warn(\"Unable to find asset by id: \" + assetID);\r\n return;\r\n }\r\n\r\n // Set editing context and transition to editing state\r\n this.appAssets.editingAsset = asset;\r\n this.sandbox.state = SandboxState.EDIT_ASSET;\r\n };\r\n\r\n /**\r\n * Initializes the EditAppAssetUC with required dependencies and validation.\r\n *\r\n * @param appObject - The AppObject that should contain the AssetRepo for asset lookup\r\n */\r\n constructor(appObject: AppObject) {\r\n super(appObject, EditAppAssetUC.type);\r\n this.appObjects.registerSingleton(this);\r\n\r\n // Validate and cache the asset repository dependency\r\n this.assetRepo = appObject.getComponent<AssetRepo>(AssetRepo.type);\r\n if (!this.assetRepo) {\r\n this.error(\"UC added to an App Object that does not have AssetRepo\");\r\n return;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"EditAppAssetUC.js","sourceRoot":"","sources":["../../../../src/Assets/UCs/EditAppAssetUC.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;;AAmDH,4CAEC;AAnDD,sCAKqB;AACrB,iFAGoD;AACpD,0CAAyD;AAEzD;;;;;GAKG;AACH,MAAsB,cAAe,SAAQ,kBAAW;IAWtD;;;;;OAKG;IACH,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAC1B,cAAc,CAAC,IAAI,EACnB,UAAU,CACX,CAAC;IACJ,CAAC;;AAtBH,wCAuBC;AAtBC,wDAAwD;AACjD,mBAAI,GAAG,gBAAgB,CAAC;AAuBjC;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,SAAoB;IACnD,OAAO,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,aAAc,SAAQ,cAAc;IAIxC,6DAA6D;IAC7D,IAAY,SAAS;QACnB,OAAO,IAAI,CAAC,kBAAkB,CAAkB,0BAAe,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC;IAED,yEAAyE;IACzE,IAAY,OAAO;QACjB,OAAO,IAAI,CAAC,kBAAkB,CAAmB,mCAAgB,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IA4BD;;;;OAIG;IACH,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;QAhCxC;;;;;;;;;;;WAWG;QACH,cAAS,GAAG,CAAC,OAAe,EAAQ,EAAE;YACpC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO;YAEhE,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,8BAA8B,GAAG,OAAO,CAAC,CAAC;gBACpD,OAAO;YACT,CAAC;YAED,sDAAsD;YACtD,IAAI,CAAC,SAAS,CAAC,YAAY,GAAG,KAAK,CAAC;YACpC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,+BAAY,CAAC,UAAU,CAAC;QAC/C,CAAC,CAAC;QASA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAExC,qDAAqD;QACrD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,YAAY,CAAY,oBAAS,CAAC,IAAI,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;IACH,CAAC;CACF","sourcesContent":["/**\n * EditAppAssetUC.ts\n *\n * This use case handles initiating the asset editing workflow by transitioning\n * the application to editing mode for a specific asset.\n *\n * Key Concepts:\n * - Manages application state transitions for asset editing workflows\n * - Sets the editing context in AppAssetsEntity for UI components\n * - Transitions sandbox state to enable editing interfaces\n * - Validates asset existence before initiating editing\n * - Provides error handling for missing assets or dependencies\n *\n * Usage Patterns:\n * - Singleton use case accessed through static get() method\n * - Called with asset ID to initiate editing for specific assets\n * - Coordinates between asset repository, app assets entity, and sandbox state\n * - Used by controllers to start editing workflows from UI interactions\n */\n\nimport {\n getSingletonComponent,\n AppObject,\n AppObjectRepo,\n AppObjectUC\n} from \"@vived/core\";\nimport {\n AppSandboxEntity,\n SandboxState\n} from \"../../AppSandbox/Entities/AppSandboxEntity\";\nimport { AppAssetsEntity, AssetRepo } from \"../Entities\";\n\n/**\n * EditAppAssetUC handles initiating asset editing workflows and state transitions.\n *\n * This singleton use case manages the transition from normal asset viewing\n * to editing mode, setting up the necessary context for editing interfaces.\n */\nexport abstract class EditAppAssetUC extends AppObjectUC {\n /** Static type identifier for component registration */\n static type = \"EditAppAssetUC\";\n\n /**\n * Initiates editing mode for the specified asset.\n *\n * @param assetID - The unique identifier of the asset to edit\n */\n abstract editAsset(assetID: string): void;\n\n /**\n * Retrieves the singleton EditAppAssetUC instance.\n *\n * @param appObjects - Repository for accessing the singleton component\n * @returns EditAppAssetUC instance or undefined if not found\n */\n static get(appObjects: AppObjectRepo): EditAppAssetUC | undefined {\n return getSingletonComponent<EditAppAssetUC>(\n EditAppAssetUC.type,\n appObjects\n );\n }\n}\n\n/**\n * Factory function to create a new EditAppAssetUC instance.\n *\n * @param appObject - The AppObject that will host this singleton use case (must have AssetRepo)\n * @returns A new EditAppAssetUC implementation instance\n */\nexport function makeEditAppAsset(appObject: AppObject): EditAppAssetUC {\n return new GetAssetUCImp(appObject);\n}\n\n/**\n * Private implementation of EditAppAssetUC that handles state transitions for asset editing.\n *\n * Key Implementation Details:\n * - Validates asset existence in repository before initiating editing\n * - Sets editing context in AppAssetsEntity for UI component access\n * - Transitions sandbox state to enable editing interfaces\n * - Provides warning logs for missing assets or invalid operations\n * - Validates required dependencies during initialization\n */\nclass GetAssetUCImp extends EditAppAssetUC {\n /** The asset repository for asset lookup and validation */\n private assetRepo?: AssetRepo;\n\n /** Gets the app assets entity for setting editing context */\n private get appAssets() {\n return this.getCachedSingleton<AppAssetsEntity>(AppAssetsEntity.type);\n }\n\n /** Gets the sandbox entity for managing application state transitions */\n private get sandbox() {\n return this.getCachedSingleton<AppSandboxEntity>(AppSandboxEntity.type);\n }\n\n /**\n * Initiates asset editing by setting up editing context and transitioning state.\n *\n * This method handles the complete editing initiation workflow:\n * 1. Validates required dependencies are available\n * 2. Looks up the asset in the repository\n * 3. Sets the editing context in AppAssetsEntity\n * 4. Transitions sandbox state to editing mode\n * 5. Provides appropriate warnings for missing assets\n *\n * @param assetID - The unique identifier of the asset to edit\n */\n editAsset = (assetID: string): void => {\n if (!this.assetRepo || !this.appAssets || !this.sandbox) return;\n\n const asset = this.assetRepo.get(assetID);\n if (!asset) {\n this.warn(\"Unable to find asset by id: \" + assetID);\n return;\n }\n\n // Set editing context and transition to editing state\n this.appAssets.editingAsset = asset;\n this.sandbox.state = SandboxState.EDIT_ASSET;\n };\n\n /**\n * Initializes the EditAppAssetUC with required dependencies and validation.\n *\n * @param appObject - The AppObject that should contain the AssetRepo for asset lookup\n */\n constructor(appObject: AppObject) {\n super(appObject, EditAppAssetUC.type);\n this.appObjects.registerSingleton(this);\n\n // Validate and cache the asset repository dependency\n this.assetRepo = appObject.getComponent<AssetRepo>(AssetRepo.type);\n if (!this.assetRepo) {\n this.error(\"UC added to an App Object that does not have AssetRepo\");\n return;\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"GetAssetBlobURLUC.js","sourceRoot":"","sources":["../../../../src/Assets/UCs/GetAssetBlobURLUC.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * GetAssetBlobURLUC.ts\r\n *\r\n * This use case provides optimized asset file retrieval with caching support,\r\n * returning blob URLs for immediate use in web applications.\r\n *\r\n * Key Concepts:\r\n * - Provides blob URLs for asset files with multi-level caching optimization\r\n * - Checks memory cache (existing entities) first for immediate access\r\n * - Falls back to persistent cache (IndexedDB/localStorage) for faster retrieval\r\n * - Finally fetches from remote API when cache misses occur\r\n * - Manages fetch state indicators for UI feedback\r\n * - Automatically stores fetched files in cache for future access\r\n *\r\n * Usage Patterns:\r\n * - Singleton use case accessed through static get() method\r\n * - Called with asset ID to retrieve blob URL for display or download\r\n * - Handles async operations with comprehensive error handling\r\n * - Optimizes performance through multi-level caching strategy\r\n */\r\n\r\nimport {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectRepo,\r\n AppObjectUC\r\n} from \"@vived/core\";\r\nimport { FetchAssetFileFromAPIUC } from \"../../VivedAPI\";\r\nimport { GetAssetFromCacheUC, StoreAssetInCacheUC } from \"../../Cache\";\r\nimport { AssetEntity } from \"../Entities/AssetEntity\";\r\nimport { AssetRepo } from \"../Entities/AssetRepo\";\r\nimport { GetAssetUC } from \"./GetAssetUC\";\r\n\r\n/**\r\n * GetAssetBlobURLUC handles optimized retrieval of asset files as blob URLs.\r\n *\r\n * This singleton use case implements a multi-level caching strategy to minimize\r\n * network requests and provide fast access to asset files for web applications.\r\n */\r\nexport abstract class GetAssetBlobURLUC extends AppObjectUC {\r\n /** Static type identifier for component registration */\r\n static type = \"GetAssetBlobURLUC\";\r\n\r\n /**\r\n * Retrieves a blob URL for the specified asset file.\r\n *\r\n * @param assetID - The unique identifier of the asset\r\n * @param useCache - Optional flag to control caching behavior (defaults to true)\r\n * @returns Promise resolving to a blob URL for immediate use\r\n */\r\n abstract getAssetBlobURL(\r\n assetID: string,\r\n useCache?: boolean\r\n ): Promise<string>;\r\n\r\n /**\r\n * Retrieves the singleton GetAssetBlobURLUC instance.\r\n *\r\n * @param appObjects - Repository for accessing the singleton component\r\n * @returns GetAssetBlobURLUC instance or undefined if not found\r\n */\r\n static get(appObjects: AppObjectRepo): GetAssetBlobURLUC | undefined {\r\n return getSingletonComponent<GetAssetBlobURLUC>(\r\n GetAssetBlobURLUC.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create a new GetAssetBlobURLUC instance.\r\n *\r\n * @param appObject - The AppObject that will host this singleton use case\r\n * @returns A new GetAssetBlobURLUC implementation instance\r\n */\r\nexport function makeGetAssetBlobURLUC(appObject: AppObject): GetAssetBlobURLUC {\r\n return new GetAssetBlobURLUCImp(appObject);\r\n}\r\n\r\n/**\r\n * Private implementation of GetAssetBlobURLUC with multi-level caching strategy.\r\n *\r\n * Key Implementation Details:\r\n * - Implements three-tier caching: memory (entities), persistent cache, and remote API\r\n * - Manages fetch state indicators for user feedback during operations\r\n * - Automatically caches fetched files for future access optimization\r\n * - Handles cache failures gracefully with fallback to direct API access\r\n * - Converts between Blob and File objects for compatibility\r\n * - Provides detailed error handling and logging for debugging\r\n */\r\nclass GetAssetBlobURLUCImp extends GetAssetBlobURLUC {\r\n /** Gets the asset repository for entity management and lookup */\r\n private get assetRepo() {\r\n return this.getCachedSingleton<AssetRepo>(AssetRepo.type);\r\n }\r\n\r\n /** Gets the API use case for fetching asset files from remote sources */\r\n private get fetchAssetFile() {\r\n return this.getCachedSingleton<FetchAssetFileFromAPIUC>(\r\n FetchAssetFileFromAPIUC.type\r\n )?.doFetch;\r\n }\r\n\r\n /** Gets the use case for retrieving asset metadata */\r\n private get getAsset() {\r\n return this.getCachedSingleton<GetAssetUC>(GetAssetUC.type)?.getAsset;\r\n }\r\n\r\n /** Gets the use case for retrieving assets from persistent cache */\r\n private get getAssetFromCache() {\r\n return this.getCachedSingleton<GetAssetFromCacheUC>(\r\n GetAssetFromCacheUC.type\r\n )?.getAsset;\r\n }\r\n\r\n /** Gets the use case for storing assets in persistent cache */\r\n private get storeAssetInCache() {\r\n return this.getCachedSingleton<StoreAssetInCacheUC>(\r\n StoreAssetInCacheUC.type\r\n )?.storeAsset;\r\n }\r\n\r\n /**\r\n * Retrieves an asset blob URL using optimized multi-level caching.\r\n *\r\n * This method implements a three-tier caching strategy:\r\n * 1. Memory cache: Check if asset entity already has a blob URL\r\n * 2. Persistent cache: Check IndexedDB/localStorage for cached file\r\n * 3. Remote API: Fetch from backend as last resort\r\n *\r\n * Each level provides progressively better performance, with automatic\r\n * population of higher-level caches for future access optimization.\r\n *\r\n * @param assetID - The unique identifier of the asset\r\n * @param useCache - Optional flag to control caching behavior (defaults to true)\r\n * @returns Promise resolving to a blob URL for the asset file\r\n */\r\n getAssetBlobURL = (\r\n assetID: string,\r\n useCache: boolean = true\r\n ): Promise<string> => {\r\n const assetRepo = this.assetRepo;\r\n const getAsset = this.getAsset;\r\n const fetchAssetFile = this.fetchAssetFile;\r\n const getAssetFromCache = this.getAssetFromCache;\r\n const storeAssetInCache = this.storeAssetInCache;\r\n\r\n if (!assetRepo || !getAsset || !fetchAssetFile) {\r\n return Promise.reject();\r\n }\r\n\r\n // If cache is disabled, skip all cache checks and go directly to API\r\n if (!useCache) {\r\n return new Promise((resolve, reject) => {\r\n this.fetchAssetNormally(assetID, resolve, reject);\r\n });\r\n }\r\n\r\n // Level 1: Check memory cache (existing entities with blob URLs)\r\n const existing = assetRepo.get(assetID);\r\n if (existing && existing.blobURL) {\r\n return Promise.resolve(existing.blobURL);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n let fetchedAsset: AssetEntity | undefined;\r\n\r\n // Level 2: Check persistent cache\r\n if (getAssetFromCache) {\r\n getAssetFromCache(assetID)\r\n .then((cachedBlob) => {\r\n if (cachedBlob) {\r\n // Asset found in cache, get metadata and create file\r\n return getAsset(assetID).then((asset) => {\r\n fetchedAsset = asset;\r\n const filename = asset.filename || \"cached-asset\";\r\n return new File([cachedBlob], filename, {\r\n type: cachedBlob.type\r\n });\r\n });\r\n } else {\r\n // Level 3: Fetch from remote API\r\n return getAsset(assetID).then((asset) => {\r\n asset.isFetchingFile = true;\r\n asset.fetchError = undefined;\r\n fetchedAsset = asset;\r\n return fetchAssetFile(asset);\r\n });\r\n }\r\n })\r\n .then((file) => {\r\n if (fetchedAsset) {\r\n // Create blob URL and update entity\r\n fetchedAsset.setFile(file);\r\n fetchedAsset.isFetchingFile = false;\r\n\r\n // Store in cache for future access (if not from cache already)\r\n if (storeAssetInCache) {\r\n storeAssetInCache(\r\n assetID,\r\n new Blob([file], { type: file.type }),\r\n file.type\r\n ).catch((e) => {\r\n this.warn(`Failed to cache asset: ${e.message}`);\r\n });\r\n }\r\n\r\n if (fetchedAsset.blobURL) {\r\n resolve(fetchedAsset.blobURL);\r\n return;\r\n }\r\n }\r\n reject(new Error(\"Blob URL is empty\"));\r\n })\r\n .catch((e: Error) => {\r\n // Cache error, fallback to normal flow\r\n this.warn(`Cache error or fetch error: ${e.message}`);\r\n this.fetchAssetNormally(assetID, resolve, reject);\r\n });\r\n } else {\r\n // No cache available, use direct API access\r\n this.fetchAssetNormally(assetID, resolve, reject);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Helper method for direct asset fetching without cache support.\r\n *\r\n * This method handles the direct API fetch workflow when caching\r\n * is not available or has failed. It still attempts to store the\r\n * result in cache for future optimization.\r\n *\r\n * @param assetID - The unique identifier of the asset\r\n * @param resolve - Success callback with blob URL\r\n * @param reject - Error callback with error details\r\n */\r\n private fetchAssetNormally = (\r\n assetID: string,\r\n resolve: (blobURL: string) => void,\r\n reject: (error: Error) => void\r\n ): void => {\r\n const getAsset = this.getAsset;\r\n const fetchAssetFile = this.fetchAssetFile;\r\n const storeAssetInCache = this.storeAssetInCache;\r\n\r\n if (!getAsset || !fetchAssetFile) {\r\n reject(new Error(\"Required dependencies not found\"));\r\n return;\r\n }\r\n\r\n let fetchedAsset: AssetEntity | undefined;\r\n\r\n getAsset(assetID)\r\n .then((asset) => {\r\n // Set loading state for UI feedback\r\n asset.isFetchingFile = true;\r\n asset.fetchError = undefined;\r\n fetchedAsset = asset;\r\n return fetchAssetFile(asset);\r\n })\r\n .then((file) => {\r\n if (fetchedAsset) {\r\n // Create blob URL and update entity\r\n fetchedAsset.setFile(file);\r\n fetchedAsset.isFetchingFile = false;\r\n\r\n // Store in cache for future optimization (if available)\r\n if (storeAssetInCache) {\r\n storeAssetInCache(\r\n assetID,\r\n new Blob([file], { type: file.type }),\r\n file.type\r\n ).catch((e) => {\r\n this.warn(`Failed to cache asset: ${e.message}`);\r\n });\r\n }\r\n\r\n if (fetchedAsset.blobURL) {\r\n resolve(fetchedAsset.blobURL);\r\n return;\r\n }\r\n }\r\n reject(new Error(\"Blob URL is empty\"));\r\n })\r\n .catch((e: Error) => {\r\n // Handle fetch errors with proper state cleanup\r\n if (fetchedAsset) {\r\n fetchedAsset.fetchError = e;\r\n fetchedAsset.isFetchingFile = false;\r\n }\r\n reject(e);\r\n });\r\n };\r\n\r\n /**\r\n * Initializes the GetAssetBlobURLUC and registers it as a singleton.\r\n *\r\n * @param appObject - The AppObject that will host this singleton use case\r\n */\r\n constructor(appObject: AppObject) {\r\n super(appObject, GetAssetBlobURLUC.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"GetAssetBlobURLUC.js","sourceRoot":"","sources":["../../../../src/Assets/UCs/GetAssetBlobURLUC.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;AAwDH,sDAEC;AAxDD,sCAKqB;AACrB,6CAAyD;AACzD,uCAAuE;AAEvE,qDAAkD;AAClD,6CAA0C;AAE1C;;;;;GAKG;AACH,MAAsB,iBAAkB,SAAQ,kBAAW;IAgBzD;;;;;OAKG;IACH,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAC1B,iBAAiB,CAAC,IAAI,EACtB,UAAU,CACX,CAAC;IACJ,CAAC;;AA3BH,8CA4BC;AA3BC,wDAAwD;AACjD,sBAAI,GAAG,mBAAmB,CAAC;AA4BpC;;;;;GAKG;AACH,SAAgB,qBAAqB,CAAC,SAAoB;IACxD,OAAO,IAAI,oBAAoB,CAAC,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,oBAAqB,SAAQ,iBAAiB;IAClD,iEAAiE;IACjE,IAAY,SAAS;QACnB,OAAO,IAAI,CAAC,kBAAkB,CAAY,qBAAS,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED,yEAAyE;IACzE,IAAY,cAAc;QACxB,OAAO,IAAI,CAAC,kBAAkB,CAC5B,kCAAuB,CAAC,IAAI,CAC7B,EAAE,OAAO,CAAC;IACb,CAAC;IAED,sDAAsD;IACtD,IAAY,QAAQ;QAClB,OAAO,IAAI,CAAC,kBAAkB,CAAa,uBAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IACxE,CAAC;IAED,oEAAoE;IACpE,IAAY,iBAAiB;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAC5B,2BAAmB,CAAC,IAAI,CACzB,EAAE,QAAQ,CAAC;IACd,CAAC;IAED,+DAA+D;IAC/D,IAAY,iBAAiB;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAC5B,2BAAmB,CAAC,IAAI,CACzB,EAAE,UAAU,CAAC;IAChB,CAAC;IA+KD;;;;OAIG;IACH,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAnL3C;;;;;;;;;;;;;;WAcG;QACH,oBAAe,GAAG,CAChB,OAAe,EACf,WAAoB,IAAI,EACP,EAAE;YACnB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;YAC3C,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;YACjD,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;YAEjD,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC/C,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1B,CAAC;YAED,qEAAqE;YACrE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBACrC,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;gBACpD,CAAC,CAAC,CAAC;YACL,CAAC;YAED,iEAAiE;YACjE,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACjC,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;YAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,IAAI,YAAqC,CAAC;gBAE1C,kCAAkC;gBAClC,IAAI,iBAAiB,EAAE,CAAC;oBACtB,iBAAiB,CAAC,OAAO,CAAC;yBACvB,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;wBACnB,IAAI,UAAU,EAAE,CAAC;4BACf,qDAAqD;4BACrD,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;gCACtC,YAAY,GAAG,KAAK,CAAC;gCACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,cAAc,CAAC;gCAClD,OAAO,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE;oCACtC,IAAI,EAAE,UAAU,CAAC,IAAI;iCACtB,CAAC,CAAC;4BACL,CAAC,CAAC,CAAC;wBACL,CAAC;6BAAM,CAAC;4BACN,iCAAiC;4BACjC,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;gCACtC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;gCAC5B,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;gCAC7B,YAAY,GAAG,KAAK,CAAC;gCACrB,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;4BAC/B,CAAC,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC,CAAC;yBACD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;wBACb,IAAI,YAAY,EAAE,CAAC;4BACjB,oCAAoC;4BACpC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;4BAC3B,YAAY,CAAC,cAAc,GAAG,KAAK,CAAC;4BAEpC,+DAA+D;4BAC/D,IAAI,iBAAiB,EAAE,CAAC;gCACtB,iBAAiB,CACf,OAAO,EACP,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EACrC,IAAI,CAAC,IAAI,CACV,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;oCACZ,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gCACnD,CAAC,CAAC,CAAC;4BACL,CAAC;4BAED,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;gCACzB,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gCAC9B,OAAO;4BACT,CAAC;wBACH,CAAC;wBACD,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;oBACzC,CAAC,CAAC;yBACD,KAAK,CAAC,CAAC,CAAQ,EAAE,EAAE;wBAClB,uCAAuC;wBACvC,IAAI,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;wBACtD,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;oBACpD,CAAC,CAAC,CAAC;gBACP,CAAC;qBAAM,CAAC;oBACN,4CAA4C;oBAC5C,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF;;;;;;;;;;WAUG;QACK,uBAAkB,GAAG,CAC3B,OAAe,EACf,OAAkC,EAClC,MAA8B,EACxB,EAAE;YACR,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;YAC3C,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;YAEjD,IAAI,CAAC,QAAQ,IAAI,CAAC,cAAc,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBACrD,OAAO;YACT,CAAC;YAED,IAAI,YAAqC,CAAC;YAE1C,QAAQ,CAAC,OAAO,CAAC;iBACd,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;gBACd,oCAAoC;gBACpC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC5B,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;gBAC7B,YAAY,GAAG,KAAK,CAAC;gBACrB,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC,CAAC;iBACD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;gBACb,IAAI,YAAY,EAAE,CAAC;oBACjB,oCAAoC;oBACpC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBAC3B,YAAY,CAAC,cAAc,GAAG,KAAK,CAAC;oBAEpC,wDAAwD;oBACxD,IAAI,iBAAiB,EAAE,CAAC;wBACtB,iBAAiB,CACf,OAAO,EACP,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EACrC,IAAI,CAAC,IAAI,CACV,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;4BACZ,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;wBACnD,CAAC,CAAC,CAAC;oBACL,CAAC;oBAED,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;wBACzB,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;wBAC9B,OAAO;oBACT,CAAC;gBACH,CAAC;gBACD,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACzC,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,CAAQ,EAAE,EAAE;gBAClB,gDAAgD;gBAChD,IAAI,YAAY,EAAE,CAAC;oBACjB,YAAY,CAAC,UAAU,GAAG,CAAC,CAAC;oBAC5B,YAAY,CAAC,cAAc,GAAG,KAAK,CAAC;gBACtC,CAAC;gBACD,MAAM,CAAC,CAAC,CAAC,CAAC;YACZ,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;QASA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["/**\n * GetAssetBlobURLUC.ts\n *\n * This use case provides optimized asset file retrieval with caching support,\n * returning blob URLs for immediate use in web applications.\n *\n * Key Concepts:\n * - Provides blob URLs for asset files with multi-level caching optimization\n * - Checks memory cache (existing entities) first for immediate access\n * - Falls back to persistent cache (IndexedDB/localStorage) for faster retrieval\n * - Finally fetches from remote API when cache misses occur\n * - Manages fetch state indicators for UI feedback\n * - Automatically stores fetched files in cache for future access\n *\n * Usage Patterns:\n * - Singleton use case accessed through static get() method\n * - Called with asset ID to retrieve blob URL for display or download\n * - Handles async operations with comprehensive error handling\n * - Optimizes performance through multi-level caching strategy\n */\n\nimport {\n getSingletonComponent,\n AppObject,\n AppObjectRepo,\n AppObjectUC\n} from \"@vived/core\";\nimport { FetchAssetFileFromAPIUC } from \"../../VivedAPI\";\nimport { GetAssetFromCacheUC, StoreAssetInCacheUC } from \"../../Cache\";\nimport { AssetEntity } from \"../Entities/AssetEntity\";\nimport { AssetRepo } from \"../Entities/AssetRepo\";\nimport { GetAssetUC } from \"./GetAssetUC\";\n\n/**\n * GetAssetBlobURLUC handles optimized retrieval of asset files as blob URLs.\n *\n * This singleton use case implements a multi-level caching strategy to minimize\n * network requests and provide fast access to asset files for web applications.\n */\nexport abstract class GetAssetBlobURLUC extends AppObjectUC {\n /** Static type identifier for component registration */\n static type = \"GetAssetBlobURLUC\";\n\n /**\n * Retrieves a blob URL for the specified asset file.\n *\n * @param assetID - The unique identifier of the asset\n * @param useCache - Optional flag to control caching behavior (defaults to true)\n * @returns Promise resolving to a blob URL for immediate use\n */\n abstract getAssetBlobURL(\n assetID: string,\n useCache?: boolean\n ): Promise<string>;\n\n /**\n * Retrieves the singleton GetAssetBlobURLUC instance.\n *\n * @param appObjects - Repository for accessing the singleton component\n * @returns GetAssetBlobURLUC instance or undefined if not found\n */\n static get(appObjects: AppObjectRepo): GetAssetBlobURLUC | undefined {\n return getSingletonComponent<GetAssetBlobURLUC>(\n GetAssetBlobURLUC.type,\n appObjects\n );\n }\n}\n\n/**\n * Factory function to create a new GetAssetBlobURLUC instance.\n *\n * @param appObject - The AppObject that will host this singleton use case\n * @returns A new GetAssetBlobURLUC implementation instance\n */\nexport function makeGetAssetBlobURLUC(appObject: AppObject): GetAssetBlobURLUC {\n return new GetAssetBlobURLUCImp(appObject);\n}\n\n/**\n * Private implementation of GetAssetBlobURLUC with multi-level caching strategy.\n *\n * Key Implementation Details:\n * - Implements three-tier caching: memory (entities), persistent cache, and remote API\n * - Manages fetch state indicators for user feedback during operations\n * - Automatically caches fetched files for future access optimization\n * - Handles cache failures gracefully with fallback to direct API access\n * - Converts between Blob and File objects for compatibility\n * - Provides detailed error handling and logging for debugging\n */\nclass GetAssetBlobURLUCImp extends GetAssetBlobURLUC {\n /** Gets the asset repository for entity management and lookup */\n private get assetRepo() {\n return this.getCachedSingleton<AssetRepo>(AssetRepo.type);\n }\n\n /** Gets the API use case for fetching asset files from remote sources */\n private get fetchAssetFile() {\n return this.getCachedSingleton<FetchAssetFileFromAPIUC>(\n FetchAssetFileFromAPIUC.type\n )?.doFetch;\n }\n\n /** Gets the use case for retrieving asset metadata */\n private get getAsset() {\n return this.getCachedSingleton<GetAssetUC>(GetAssetUC.type)?.getAsset;\n }\n\n /** Gets the use case for retrieving assets from persistent cache */\n private get getAssetFromCache() {\n return this.getCachedSingleton<GetAssetFromCacheUC>(\n GetAssetFromCacheUC.type\n )?.getAsset;\n }\n\n /** Gets the use case for storing assets in persistent cache */\n private get storeAssetInCache() {\n return this.getCachedSingleton<StoreAssetInCacheUC>(\n StoreAssetInCacheUC.type\n )?.storeAsset;\n }\n\n /**\n * Retrieves an asset blob URL using optimized multi-level caching.\n *\n * This method implements a three-tier caching strategy:\n * 1. Memory cache: Check if asset entity already has a blob URL\n * 2. Persistent cache: Check IndexedDB/localStorage for cached file\n * 3. Remote API: Fetch from backend as last resort\n *\n * Each level provides progressively better performance, with automatic\n * population of higher-level caches for future access optimization.\n *\n * @param assetID - The unique identifier of the asset\n * @param useCache - Optional flag to control caching behavior (defaults to true)\n * @returns Promise resolving to a blob URL for the asset file\n */\n getAssetBlobURL = (\n assetID: string,\n useCache: boolean = true\n ): Promise<string> => {\n const assetRepo = this.assetRepo;\n const getAsset = this.getAsset;\n const fetchAssetFile = this.fetchAssetFile;\n const getAssetFromCache = this.getAssetFromCache;\n const storeAssetInCache = this.storeAssetInCache;\n\n if (!assetRepo || !getAsset || !fetchAssetFile) {\n return Promise.reject();\n }\n\n // If cache is disabled, skip all cache checks and go directly to API\n if (!useCache) {\n return new Promise((resolve, reject) => {\n this.fetchAssetNormally(assetID, resolve, reject);\n });\n }\n\n // Level 1: Check memory cache (existing entities with blob URLs)\n const existing = assetRepo.get(assetID);\n if (existing && existing.blobURL) {\n return Promise.resolve(existing.blobURL);\n }\n\n return new Promise((resolve, reject) => {\n let fetchedAsset: AssetEntity | undefined;\n\n // Level 2: Check persistent cache\n if (getAssetFromCache) {\n getAssetFromCache(assetID)\n .then((cachedBlob) => {\n if (cachedBlob) {\n // Asset found in cache, get metadata and create file\n return getAsset(assetID).then((asset) => {\n fetchedAsset = asset;\n const filename = asset.filename || \"cached-asset\";\n return new File([cachedBlob], filename, {\n type: cachedBlob.type\n });\n });\n } else {\n // Level 3: Fetch from remote API\n return getAsset(assetID).then((asset) => {\n asset.isFetchingFile = true;\n asset.fetchError = undefined;\n fetchedAsset = asset;\n return fetchAssetFile(asset);\n });\n }\n })\n .then((file) => {\n if (fetchedAsset) {\n // Create blob URL and update entity\n fetchedAsset.setFile(file);\n fetchedAsset.isFetchingFile = false;\n\n // Store in cache for future access (if not from cache already)\n if (storeAssetInCache) {\n storeAssetInCache(\n assetID,\n new Blob([file], { type: file.type }),\n file.type\n ).catch((e) => {\n this.warn(`Failed to cache asset: ${e.message}`);\n });\n }\n\n if (fetchedAsset.blobURL) {\n resolve(fetchedAsset.blobURL);\n return;\n }\n }\n reject(new Error(\"Blob URL is empty\"));\n })\n .catch((e: Error) => {\n // Cache error, fallback to normal flow\n this.warn(`Cache error or fetch error: ${e.message}`);\n this.fetchAssetNormally(assetID, resolve, reject);\n });\n } else {\n // No cache available, use direct API access\n this.fetchAssetNormally(assetID, resolve, reject);\n }\n });\n };\n\n /**\n * Helper method for direct asset fetching without cache support.\n *\n * This method handles the direct API fetch workflow when caching\n * is not available or has failed. It still attempts to store the\n * result in cache for future optimization.\n *\n * @param assetID - The unique identifier of the asset\n * @param resolve - Success callback with blob URL\n * @param reject - Error callback with error details\n */\n private fetchAssetNormally = (\n assetID: string,\n resolve: (blobURL: string) => void,\n reject: (error: Error) => void\n ): void => {\n const getAsset = this.getAsset;\n const fetchAssetFile = this.fetchAssetFile;\n const storeAssetInCache = this.storeAssetInCache;\n\n if (!getAsset || !fetchAssetFile) {\n reject(new Error(\"Required dependencies not found\"));\n return;\n }\n\n let fetchedAsset: AssetEntity | undefined;\n\n getAsset(assetID)\n .then((asset) => {\n // Set loading state for UI feedback\n asset.isFetchingFile = true;\n asset.fetchError = undefined;\n fetchedAsset = asset;\n return fetchAssetFile(asset);\n })\n .then((file) => {\n if (fetchedAsset) {\n // Create blob URL and update entity\n fetchedAsset.setFile(file);\n fetchedAsset.isFetchingFile = false;\n\n // Store in cache for future optimization (if available)\n if (storeAssetInCache) {\n storeAssetInCache(\n assetID,\n new Blob([file], { type: file.type }),\n file.type\n ).catch((e) => {\n this.warn(`Failed to cache asset: ${e.message}`);\n });\n }\n\n if (fetchedAsset.blobURL) {\n resolve(fetchedAsset.blobURL);\n return;\n }\n }\n reject(new Error(\"Blob URL is empty\"));\n })\n .catch((e: Error) => {\n // Handle fetch errors with proper state cleanup\n if (fetchedAsset) {\n fetchedAsset.fetchError = e;\n fetchedAsset.isFetchingFile = false;\n }\n reject(e);\n });\n };\n\n /**\n * Initializes the GetAssetBlobURLUC and registers it as a singleton.\n *\n * @param appObject - The AppObject that will host this singleton use case\n */\n constructor(appObject: AppObject) {\n super(appObject, GetAssetBlobURLUC.type);\n this.appObjects.registerSingleton(this);\n }\n}\n"]}