obsidian-dev-utils 22.1.1-beta.9 → 23.0.0

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 (502) hide show
  1. package/CHANGELOG.md +141 -0
  2. package/dist/eslint.config.mts +2 -0
  3. package/dist/lib/cjs/@types/debug.d.cts +1 -0
  4. package/dist/lib/cjs/{obsidian/Components/PlaceholderComponent.cjs → Array.cjs} +18 -8
  5. package/dist/lib/cjs/Array.d.cts +12 -0
  6. package/dist/lib/cjs/Async.cjs +6 -1
  7. package/dist/lib/cjs/Async.d.cts +26 -18
  8. package/dist/lib/cjs/AsyncEvents.cjs +216 -0
  9. package/dist/lib/cjs/AsyncEvents.d.cts +144 -0
  10. package/dist/lib/cjs/Blob.cjs +1 -1
  11. package/dist/lib/cjs/Blob.d.cts +9 -8
  12. package/dist/lib/cjs/CssClass.cjs +5 -1
  13. package/dist/lib/cjs/CssClass.d.cts +18 -1
  14. package/dist/lib/cjs/Debug.cjs +1 -1
  15. package/dist/lib/cjs/Debug.d.cts +2 -1
  16. package/dist/lib/cjs/DebugController.cjs +1 -1
  17. package/dist/lib/cjs/DebugController.d.cts +1 -0
  18. package/dist/lib/cjs/Enum.cjs +1 -1
  19. package/dist/lib/cjs/Enum.d.cts +2 -1
  20. package/dist/lib/cjs/Error.cjs +8 -6
  21. package/dist/lib/cjs/Error.d.cts +3 -2
  22. package/dist/lib/cjs/Function.cjs +1 -1
  23. package/dist/lib/cjs/Function.d.cts +2 -1
  24. package/dist/lib/cjs/HTMLElement.cjs +1 -1
  25. package/dist/lib/cjs/HTMLElement.d.cts +4 -2
  26. package/dist/lib/cjs/Library.cjs +2 -2
  27. package/dist/lib/cjs/Library.d.cts +2 -1
  28. package/dist/lib/cjs/Object.cjs +38 -3
  29. package/dist/lib/cjs/Object.d.cts +18 -13
  30. package/dist/lib/cjs/Path.cjs +2 -2
  31. package/dist/lib/cjs/Path.d.cts +2 -1
  32. package/dist/lib/cjs/RegExp.cjs +1 -1
  33. package/dist/lib/cjs/RegExp.d.cts +2 -1
  34. package/dist/lib/cjs/ScriptUtils/CliUtils.cjs +7 -7
  35. package/dist/lib/cjs/ScriptUtils/CliUtils.d.cts +12 -11
  36. package/dist/lib/cjs/ScriptUtils/CodeGenerator.cjs +1 -1
  37. package/dist/lib/cjs/ScriptUtils/CodeGenerator.d.cts +3 -2
  38. package/dist/lib/cjs/ScriptUtils/ESLint/@types/@guardian__eslint-plugin-tsdoc-required.d.cts +1 -0
  39. package/dist/lib/cjs/ScriptUtils/ESLint/@types/eslint-plugin-modules-newlines.d.cts +1 -0
  40. package/dist/lib/cjs/ScriptUtils/ESLint/@types/eslint-plugin-verify-tsdoc.d.cts +1 -0
  41. package/dist/lib/cjs/ScriptUtils/ESLint/ESLint.cjs +1 -1
  42. package/dist/lib/cjs/ScriptUtils/ESLint/ESLint.d.cts +2 -1
  43. package/dist/lib/cjs/ScriptUtils/ESLint/eslint.config.cjs +13 -10
  44. package/dist/lib/cjs/ScriptUtils/ESLint/eslint.config.d.cts +2 -3
  45. package/dist/lib/cjs/ScriptUtils/Exec.cjs +1 -1
  46. package/dist/lib/cjs/ScriptUtils/Exec.d.cts +4 -3
  47. package/dist/lib/cjs/ScriptUtils/Fs.cjs +1 -1
  48. package/dist/lib/cjs/ScriptUtils/Fs.d.cts +5 -4
  49. package/dist/lib/cjs/ScriptUtils/JSON.cjs +1 -1
  50. package/dist/lib/cjs/ScriptUtils/JSON.d.cts +5 -4
  51. package/dist/lib/cjs/ScriptUtils/NodeModules.cjs +1 -1
  52. package/dist/lib/cjs/ScriptUtils/NodeModules.d.cts +2 -1
  53. package/dist/lib/cjs/ScriptUtils/Npm.cjs +1 -1
  54. package/dist/lib/cjs/ScriptUtils/Npm.d.cts +9 -10
  55. package/dist/lib/cjs/ScriptUtils/NpmPublish.cjs +1 -1
  56. package/dist/lib/cjs/ScriptUtils/NpmPublish.d.cts +3 -1
  57. package/dist/lib/cjs/ScriptUtils/NpmRun.cjs +1 -1
  58. package/dist/lib/cjs/ScriptUtils/NpmRun.d.cts +5 -0
  59. package/dist/lib/cjs/ScriptUtils/ObsidianDevUtilsRepoPaths.cjs +1 -10
  60. package/dist/lib/cjs/ScriptUtils/ObsidianDevUtilsRepoPaths.d.cts +45 -61
  61. package/dist/lib/cjs/ScriptUtils/Root.cjs +1 -1
  62. package/dist/lib/cjs/ScriptUtils/Root.d.cts +4 -3
  63. package/dist/lib/cjs/ScriptUtils/build.cjs +1 -1
  64. package/dist/lib/cjs/ScriptUtils/build.d.cts +7 -6
  65. package/dist/lib/cjs/ScriptUtils/cli.cjs +1 -1
  66. package/dist/lib/cjs/ScriptUtils/cli.d.cts +2 -1
  67. package/dist/lib/cjs/ScriptUtils/esbuild/Dependency.cjs +1 -1
  68. package/dist/lib/cjs/ScriptUtils/esbuild/Dependency.d.cts +4 -3
  69. package/dist/lib/cjs/ScriptUtils/esbuild/ObsidianPluginBuilder.cjs +1 -1
  70. package/dist/lib/cjs/ScriptUtils/esbuild/ObsidianPluginBuilder.d.cts +4 -3
  71. package/dist/lib/cjs/ScriptUtils/esbuild/changeExtensionPlugin.cjs +1 -1
  72. package/dist/lib/cjs/ScriptUtils/esbuild/changeExtensionPlugin.d.cts +2 -1
  73. package/dist/lib/cjs/ScriptUtils/esbuild/copyToObsidianPluginsFolderPlugin.cjs +1 -1
  74. package/dist/lib/cjs/ScriptUtils/esbuild/copyToObsidianPluginsFolderPlugin.d.cts +2 -1
  75. package/dist/lib/cjs/ScriptUtils/esbuild/customEsbuildOptionsPlugin.cjs +1 -1
  76. package/dist/lib/cjs/ScriptUtils/esbuild/customEsbuildOptionsPlugin.d.cts +2 -1
  77. package/dist/lib/cjs/ScriptUtils/esbuild/fixEsmPlugin.cjs +1 -1
  78. package/dist/lib/cjs/ScriptUtils/esbuild/fixEsmPlugin.d.cts +2 -1
  79. package/dist/lib/cjs/ScriptUtils/esbuild/fixSourceMapsPlugin.cjs +1 -1
  80. package/dist/lib/cjs/ScriptUtils/esbuild/fixSourceMapsPlugin.d.cts +2 -1
  81. package/dist/lib/cjs/ScriptUtils/esbuild/preprocessPlugin.cjs +1 -1
  82. package/dist/lib/cjs/ScriptUtils/esbuild/preprocessPlugin.d.cts +2 -1
  83. package/dist/lib/cjs/ScriptUtils/esbuild/renameCssPlugin.cjs +1 -1
  84. package/dist/lib/cjs/ScriptUtils/esbuild/renameCssPlugin.d.cts +5 -0
  85. package/dist/lib/cjs/ScriptUtils/esbuild/svelteWrapperPlugin.cjs +1 -1
  86. package/dist/lib/cjs/ScriptUtils/esbuild/svelteWrapperPlugin.d.cts +5 -0
  87. package/dist/lib/cjs/ScriptUtils/format.cjs +1 -1
  88. package/dist/lib/cjs/ScriptUtils/format.d.cts +4 -2
  89. package/dist/lib/cjs/ScriptUtils/spellcheck.cjs +1 -1
  90. package/dist/lib/cjs/ScriptUtils/spellcheck.d.cts +4 -3
  91. package/dist/lib/cjs/ScriptUtils/version.cjs +1 -1
  92. package/dist/lib/cjs/ScriptUtils/version.d.cts +12 -11
  93. package/dist/lib/cjs/String.cjs +1 -1
  94. package/dist/lib/cjs/String.d.cts +4 -3
  95. package/dist/lib/cjs/Transformers/DateTransformer.cjs +3 -1
  96. package/dist/lib/cjs/Transformers/DateTransformer.d.cts +4 -1
  97. package/dist/lib/cjs/Transformers/DurationTransformer.cjs +5 -1
  98. package/dist/lib/cjs/Transformers/DurationTransformer.d.cts +6 -1
  99. package/dist/lib/cjs/Transformers/GroupTransformer.cjs +7 -4
  100. package/dist/lib/cjs/Transformers/GroupTransformer.d.cts +9 -5
  101. package/dist/lib/cjs/Transformers/SkipPrivatePropertyTransformer.cjs +3 -1
  102. package/dist/lib/cjs/Transformers/SkipPrivatePropertyTransformer.d.cts +4 -1
  103. package/dist/lib/cjs/Transformers/Transformer.cjs +9 -2
  104. package/dist/lib/cjs/Transformers/Transformer.d.cts +2 -1
  105. package/dist/lib/cjs/Transformers/TypedTransformer.cjs +1 -1
  106. package/dist/lib/cjs/Transformers/TypedTransformer.d.cts +2 -1
  107. package/dist/lib/cjs/Type.cjs +24 -0
  108. package/dist/lib/cjs/Type.d.cts +17 -0
  109. package/dist/lib/cjs/ValueProvider.cjs +1 -1
  110. package/dist/lib/cjs/ValueProvider.d.cts +3 -2
  111. package/dist/lib/cjs/codemirror/StateFieldSpec.cjs +1 -1
  112. package/dist/lib/cjs/codemirror/StateFieldSpec.d.cts +2 -1
  113. package/dist/lib/cjs/index.cjs +10 -1
  114. package/dist/lib/cjs/index.d.cts +3 -0
  115. package/dist/lib/cjs/obsidian/App.cjs +1 -1
  116. package/dist/lib/cjs/obsidian/App.d.cts +2 -1
  117. package/dist/lib/cjs/obsidian/AttachmentPath.cjs +1 -1
  118. package/dist/lib/cjs/obsidian/AttachmentPath.d.cts +7 -5
  119. package/dist/lib/cjs/obsidian/Backlink.cjs +1 -1
  120. package/dist/lib/cjs/obsidian/Backlink.d.cts +3 -2
  121. package/dist/lib/cjs/obsidian/Callout.cjs +1 -1
  122. package/dist/lib/cjs/obsidian/Callout.d.cts +3 -2
  123. package/dist/lib/cjs/obsidian/Components/CheckboxComponent.cjs +99 -0
  124. package/dist/lib/cjs/obsidian/Components/CheckboxComponent.d.cts +59 -0
  125. package/dist/lib/cjs/obsidian/Components/DateComponent.cjs +1 -1
  126. package/dist/lib/cjs/obsidian/Components/DateComponent.d.cts +2 -1
  127. package/dist/lib/cjs/obsidian/Components/DateTimeComponent.cjs +1 -1
  128. package/dist/lib/cjs/obsidian/Components/DateTimeComponent.d.cts +2 -1
  129. package/dist/lib/cjs/obsidian/Components/EmailComponent.cjs +1 -1
  130. package/dist/lib/cjs/obsidian/Components/EmailComponent.d.cts +2 -1
  131. package/dist/lib/cjs/obsidian/Components/FileComponent.cjs +1 -1
  132. package/dist/lib/cjs/obsidian/Components/FileComponent.d.cts +2 -1
  133. package/dist/lib/cjs/obsidian/Components/MonthComponent.cjs +1 -1
  134. package/dist/lib/cjs/obsidian/Components/MonthComponent.d.cts +2 -1
  135. package/dist/lib/cjs/obsidian/Components/MultipleDropdownComponent.cjs +4 -2
  136. package/dist/lib/cjs/obsidian/Components/MultipleDropdownComponent.d.cts +4 -1
  137. package/dist/lib/cjs/obsidian/Components/MultipleEmailComponent.cjs +1 -1
  138. package/dist/lib/cjs/obsidian/Components/MultipleEmailComponent.d.cts +2 -1
  139. package/dist/lib/cjs/obsidian/Components/MultipleFileComponent.cjs +1 -1
  140. package/dist/lib/cjs/obsidian/Components/MultipleFileComponent.d.cts +2 -1
  141. package/dist/lib/cjs/obsidian/Components/MultipleTextComponent.cjs +30 -3
  142. package/dist/lib/cjs/obsidian/Components/MultipleTextComponent.d.cts +22 -3
  143. package/dist/lib/cjs/obsidian/Components/NumberComponent.cjs +1 -1
  144. package/dist/lib/cjs/obsidian/Components/NumberComponent.d.cts +2 -1
  145. package/dist/lib/cjs/obsidian/Components/TextBasedComponent.cjs +65 -0
  146. package/dist/lib/cjs/obsidian/Components/TextBasedComponent.d.cts +37 -0
  147. package/dist/lib/cjs/obsidian/Components/TimeComponent.cjs +1 -1
  148. package/dist/lib/cjs/obsidian/Components/TimeComponent.d.cts +2 -1
  149. package/dist/lib/cjs/obsidian/Components/TriStateCheckboxComponent.cjs +100 -0
  150. package/dist/lib/cjs/obsidian/Components/TriStateCheckboxComponent.d.cts +59 -0
  151. package/dist/lib/cjs/obsidian/Components/TypedDropdownComponent.cjs +129 -0
  152. package/dist/lib/cjs/obsidian/Components/TypedDropdownComponent.d.cts +78 -0
  153. package/dist/lib/cjs/obsidian/Components/TypedMultipleDropdownComponent.cjs +131 -0
  154. package/dist/lib/cjs/obsidian/Components/TypedMultipleDropdownComponent.d.cts +79 -0
  155. package/dist/lib/cjs/obsidian/Components/TypedRangeTextComponent.cjs +1 -1
  156. package/dist/lib/cjs/obsidian/Components/TypedRangeTextComponent.d.cts +4 -1
  157. package/dist/lib/cjs/obsidian/Components/TypedTextComponent.cjs +30 -4
  158. package/dist/lib/cjs/obsidian/Components/TypedTextComponent.d.cts +25 -3
  159. package/dist/lib/cjs/obsidian/Components/UrlComponent.cjs +1 -1
  160. package/dist/lib/cjs/obsidian/Components/UrlComponent.d.cts +2 -1
  161. package/dist/lib/cjs/obsidian/Components/ValidatorComponent.cjs +23 -29
  162. package/dist/lib/cjs/obsidian/Components/ValidatorComponent.d.cts +6 -6
  163. package/dist/lib/cjs/obsidian/Components/ValueComponentWithChangeTracking.cjs +1 -1
  164. package/dist/lib/cjs/obsidian/Components/ValueComponentWithChangeTracking.d.cts +4 -1
  165. package/dist/lib/cjs/obsidian/Components/WeekComponent.cjs +1 -1
  166. package/dist/lib/cjs/obsidian/Components/WeekComponent.d.cts +2 -1
  167. package/dist/lib/cjs/obsidian/Components/index.cjs +16 -4
  168. package/dist/lib/cjs/obsidian/Components/index.d.cts +5 -1
  169. package/dist/lib/cjs/obsidian/Dataview.cjs +1 -1
  170. package/dist/lib/cjs/obsidian/Dataview.d.cts +11 -12
  171. package/dist/lib/cjs/obsidian/DataviewLink.cjs +1 -1
  172. package/dist/lib/cjs/obsidian/DataviewLink.d.cts +4 -3
  173. package/dist/lib/cjs/obsidian/FileChange.cjs +1 -1
  174. package/dist/lib/cjs/obsidian/FileChange.d.cts +4 -3
  175. package/dist/lib/cjs/obsidian/FileManager.cjs +1 -1
  176. package/dist/lib/cjs/obsidian/FileManager.d.cts +6 -5
  177. package/dist/lib/cjs/obsidian/FileSystem.cjs +1 -1
  178. package/dist/lib/cjs/obsidian/FileSystem.d.cts +3 -1
  179. package/dist/lib/cjs/obsidian/Frontmatter.cjs +1 -1
  180. package/dist/lib/cjs/obsidian/Frontmatter.d.cts +5 -1
  181. package/dist/lib/cjs/obsidian/Link.cjs +1 -1
  182. package/dist/lib/cjs/obsidian/Link.d.cts +7 -6
  183. package/dist/lib/cjs/obsidian/Logger.cjs +1 -1
  184. package/dist/lib/cjs/obsidian/Logger.d.cts +2 -1
  185. package/dist/lib/cjs/obsidian/Loop.cjs +1 -1
  186. package/dist/lib/cjs/obsidian/Loop.d.cts +2 -1
  187. package/dist/lib/cjs/obsidian/Markdown.cjs +5 -8
  188. package/dist/lib/cjs/obsidian/Markdown.d.cts +2 -1
  189. package/dist/lib/cjs/obsidian/MarkdownCodeBlockProcessor.cjs +1 -1
  190. package/dist/lib/cjs/obsidian/MarkdownCodeBlockProcessor.d.cts +2 -1
  191. package/dist/lib/cjs/obsidian/MarkdownView.cjs +1 -1
  192. package/dist/lib/cjs/obsidian/MarkdownView.d.cts +2 -1
  193. package/dist/lib/cjs/obsidian/MetadataCache.cjs +1 -1
  194. package/dist/lib/cjs/obsidian/MetadataCache.d.cts +7 -5
  195. package/dist/lib/cjs/obsidian/Modals/Alert.cjs +3 -1
  196. package/dist/lib/cjs/obsidian/Modals/Alert.d.cts +3 -2
  197. package/dist/lib/cjs/obsidian/Modals/Confirm.cjs +3 -1
  198. package/dist/lib/cjs/obsidian/Modals/Confirm.d.cts +3 -2
  199. package/dist/lib/cjs/obsidian/Modals/ModalBase.cjs +1 -1
  200. package/dist/lib/cjs/obsidian/Modals/ModalBase.d.cts +2 -2
  201. package/dist/lib/cjs/obsidian/Modals/Prompt.cjs +3 -1
  202. package/dist/lib/cjs/obsidian/Modals/Prompt.d.cts +5 -3
  203. package/dist/lib/cjs/obsidian/Modals/SelectItem.cjs +2 -1
  204. package/dist/lib/cjs/obsidian/Modals/SelectItem.d.cts +4 -2
  205. package/dist/lib/cjs/obsidian/MonkeyAround.cjs +1 -1
  206. package/dist/lib/cjs/obsidian/MonkeyAround.d.cts +5 -3
  207. package/dist/lib/cjs/obsidian/ObsidianSettings.cjs +1 -1
  208. package/dist/lib/cjs/obsidian/ObsidianSettings.d.cts +3 -0
  209. package/dist/lib/cjs/obsidian/Pdf.cjs +1 -1
  210. package/dist/lib/cjs/obsidian/Pdf.d.cts +2 -1
  211. package/dist/lib/cjs/obsidian/Plugin/ObsidianPluginRepoPaths.cjs +6 -2
  212. package/dist/lib/cjs/obsidian/Plugin/ObsidianPluginRepoPaths.d.cts +38 -29
  213. package/dist/lib/cjs/obsidian/Plugin/Plugin.cjs +1 -1
  214. package/dist/lib/cjs/obsidian/Plugin/Plugin.d.cts +4 -3
  215. package/dist/lib/cjs/obsidian/Plugin/PluginBase.cjs +121 -32
  216. package/dist/lib/cjs/obsidian/Plugin/PluginBase.d.cts +52 -21
  217. package/dist/lib/cjs/obsidian/Plugin/PluginContext.cjs +1 -1
  218. package/dist/lib/cjs/obsidian/Plugin/PluginContext.d.cts +2 -1
  219. package/dist/lib/cjs/obsidian/Plugin/PluginId.cjs +1 -1
  220. package/dist/lib/cjs/obsidian/Plugin/PluginId.d.cts +2 -1
  221. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsManagerBase.cjs +76 -48
  222. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsManagerBase.d.cts +39 -21
  223. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsTabBase.cjs +18 -10
  224. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsTabBase.d.cts +18 -11
  225. package/dist/lib/cjs/obsidian/Plugin/PluginTypesBase.cjs +24 -0
  226. package/dist/lib/cjs/obsidian/Plugin/PluginTypesBase.d.cts +55 -0
  227. package/dist/lib/cjs/obsidian/Plugin/index.cjs +6 -3
  228. package/dist/lib/cjs/obsidian/Plugin/index.d.cts +1 -0
  229. package/dist/lib/cjs/obsidian/Queue.cjs +1 -1
  230. package/dist/lib/cjs/obsidian/Queue.d.cts +3 -2
  231. package/dist/lib/cjs/obsidian/React/AppContext.cjs +3 -3
  232. package/dist/lib/cjs/obsidian/React/AppContext.d.cts +8 -1
  233. package/dist/lib/cjs/obsidian/Reference.cjs +1 -1
  234. package/dist/lib/cjs/obsidian/Reference.d.cts +2 -1
  235. package/dist/lib/cjs/obsidian/RenameDeleteHandler.cjs +75 -75
  236. package/dist/lib/cjs/obsidian/RenameDeleteHandler.d.cts +3 -2
  237. package/dist/lib/cjs/obsidian/ResourceUrl.cjs +1 -1
  238. package/dist/lib/cjs/obsidian/ResourceUrl.d.cts +2 -1
  239. package/dist/lib/cjs/obsidian/SettingEx.cjs +41 -1
  240. package/dist/lib/cjs/obsidian/SettingEx.d.cts +35 -2
  241. package/dist/lib/cjs/obsidian/ValidationMessage.cjs +1 -1
  242. package/dist/lib/cjs/obsidian/ValidationMessage.d.cts +5 -0
  243. package/dist/lib/cjs/obsidian/Vault.cjs +1 -1
  244. package/dist/lib/cjs/obsidian/Vault.d.cts +15 -10
  245. package/dist/lib/cjs/obsidian/VaultEx.cjs +1 -1
  246. package/dist/lib/cjs/obsidian/VaultEx.d.cts +4 -3
  247. package/dist/lib/cjs/url.cjs +1 -1
  248. package/dist/lib/cjs/url.d.cts +2 -1
  249. package/dist/lib/esm/@types/debug.d.mts +1 -0
  250. package/dist/lib/esm/Array.d.mts +12 -0
  251. package/dist/lib/esm/Array.mjs +24 -0
  252. package/dist/lib/esm/Async.d.mts +26 -18
  253. package/dist/lib/esm/Async.mjs +5 -1
  254. package/dist/lib/esm/AsyncEvents.d.mts +144 -0
  255. package/dist/lib/esm/AsyncEvents.mjs +192 -0
  256. package/dist/lib/esm/Blob.d.mts +9 -8
  257. package/dist/lib/esm/Blob.mjs +1 -1
  258. package/dist/lib/esm/CssClass.d.mts +18 -1
  259. package/dist/lib/esm/CssClass.mjs +5 -1
  260. package/dist/lib/esm/Debug.d.mts +2 -1
  261. package/dist/lib/esm/Debug.mjs +1 -1
  262. package/dist/lib/esm/DebugController.d.mts +1 -0
  263. package/dist/lib/esm/Enum.d.mts +2 -1
  264. package/dist/lib/esm/Enum.mjs +1 -1
  265. package/dist/lib/esm/Error.d.mts +3 -2
  266. package/dist/lib/esm/Error.mjs +8 -6
  267. package/dist/lib/esm/Function.d.mts +2 -1
  268. package/dist/lib/esm/Function.mjs +1 -1
  269. package/dist/lib/esm/HTMLElement.d.mts +4 -2
  270. package/dist/lib/esm/HTMLElement.mjs +1 -1
  271. package/dist/lib/esm/Library.d.mts +2 -1
  272. package/dist/lib/esm/Library.mjs +2 -2
  273. package/dist/lib/esm/Object.d.mts +18 -13
  274. package/dist/lib/esm/Object.mjs +36 -3
  275. package/dist/lib/esm/Path.d.mts +2 -1
  276. package/dist/lib/esm/Path.mjs +2 -2
  277. package/dist/lib/esm/RegExp.d.mts +2 -1
  278. package/dist/lib/esm/RegExp.mjs +1 -1
  279. package/dist/lib/esm/ScriptUtils/CliUtils.d.mts +12 -11
  280. package/dist/lib/esm/ScriptUtils/CliUtils.mjs +7 -7
  281. package/dist/lib/esm/ScriptUtils/CodeGenerator.d.mts +3 -2
  282. package/dist/lib/esm/ScriptUtils/CodeGenerator.mjs +1 -1
  283. package/dist/lib/esm/ScriptUtils/ESLint/@types/@guardian__eslint-plugin-tsdoc-required.d.mts +1 -0
  284. package/dist/lib/esm/ScriptUtils/ESLint/@types/eslint-plugin-modules-newlines.d.mts +1 -0
  285. package/dist/lib/esm/ScriptUtils/ESLint/@types/eslint-plugin-verify-tsdoc.d.mts +1 -0
  286. package/dist/lib/esm/ScriptUtils/ESLint/ESLint.d.mts +2 -1
  287. package/dist/lib/esm/ScriptUtils/ESLint/ESLint.mjs +1 -1
  288. package/dist/lib/esm/ScriptUtils/ESLint/eslint.config.d.mts +2 -3
  289. package/dist/lib/esm/ScriptUtils/ESLint/eslint.config.mjs +13 -10
  290. package/dist/lib/esm/ScriptUtils/Exec.d.mts +4 -3
  291. package/dist/lib/esm/ScriptUtils/Exec.mjs +1 -1
  292. package/dist/lib/esm/ScriptUtils/Fs.d.mts +5 -4
  293. package/dist/lib/esm/ScriptUtils/Fs.mjs +1 -1
  294. package/dist/lib/esm/ScriptUtils/JSON.d.mts +5 -4
  295. package/dist/lib/esm/ScriptUtils/JSON.mjs +1 -1
  296. package/dist/lib/esm/ScriptUtils/NodeModules.d.mts +2 -1
  297. package/dist/lib/esm/ScriptUtils/NodeModules.mjs +1 -1
  298. package/dist/lib/esm/ScriptUtils/Npm.d.mts +9 -10
  299. package/dist/lib/esm/ScriptUtils/Npm.mjs +1 -1
  300. package/dist/lib/esm/ScriptUtils/NpmPublish.d.mts +3 -1
  301. package/dist/lib/esm/ScriptUtils/NpmPublish.mjs +1 -1
  302. package/dist/lib/esm/ScriptUtils/NpmRun.d.mts +5 -0
  303. package/dist/lib/esm/ScriptUtils/NpmRun.mjs +1 -1
  304. package/dist/lib/esm/ScriptUtils/ObsidianDevUtilsRepoPaths.d.mts +45 -61
  305. package/dist/lib/esm/ScriptUtils/ObsidianDevUtilsRepoPaths.mjs +1 -10
  306. package/dist/lib/esm/ScriptUtils/Root.d.mts +4 -3
  307. package/dist/lib/esm/ScriptUtils/Root.mjs +1 -1
  308. package/dist/lib/esm/ScriptUtils/build.d.mts +7 -6
  309. package/dist/lib/esm/ScriptUtils/build.mjs +1 -1
  310. package/dist/lib/esm/ScriptUtils/cli.d.mts +2 -1
  311. package/dist/lib/esm/ScriptUtils/cli.mjs +1 -1
  312. package/dist/lib/esm/ScriptUtils/esbuild/Dependency.d.mts +4 -3
  313. package/dist/lib/esm/ScriptUtils/esbuild/Dependency.mjs +1 -1
  314. package/dist/lib/esm/ScriptUtils/esbuild/ObsidianPluginBuilder.d.mts +4 -3
  315. package/dist/lib/esm/ScriptUtils/esbuild/ObsidianPluginBuilder.mjs +1 -1
  316. package/dist/lib/esm/ScriptUtils/esbuild/changeExtensionPlugin.d.mts +2 -1
  317. package/dist/lib/esm/ScriptUtils/esbuild/changeExtensionPlugin.mjs +1 -1
  318. package/dist/lib/esm/ScriptUtils/esbuild/copyToObsidianPluginsFolderPlugin.d.mts +2 -1
  319. package/dist/lib/esm/ScriptUtils/esbuild/copyToObsidianPluginsFolderPlugin.mjs +1 -1
  320. package/dist/lib/esm/ScriptUtils/esbuild/customEsbuildOptionsPlugin.d.mts +2 -1
  321. package/dist/lib/esm/ScriptUtils/esbuild/customEsbuildOptionsPlugin.mjs +1 -1
  322. package/dist/lib/esm/ScriptUtils/esbuild/fixEsmPlugin.d.mts +2 -1
  323. package/dist/lib/esm/ScriptUtils/esbuild/fixEsmPlugin.mjs +1 -1
  324. package/dist/lib/esm/ScriptUtils/esbuild/fixSourceMapsPlugin.d.mts +2 -1
  325. package/dist/lib/esm/ScriptUtils/esbuild/fixSourceMapsPlugin.mjs +1 -1
  326. package/dist/lib/esm/ScriptUtils/esbuild/preprocessPlugin.d.mts +2 -1
  327. package/dist/lib/esm/ScriptUtils/esbuild/preprocessPlugin.mjs +1 -1
  328. package/dist/lib/esm/ScriptUtils/esbuild/renameCssPlugin.d.mts +5 -0
  329. package/dist/lib/esm/ScriptUtils/esbuild/renameCssPlugin.mjs +1 -1
  330. package/dist/lib/esm/ScriptUtils/esbuild/svelteWrapperPlugin.d.mts +5 -0
  331. package/dist/lib/esm/ScriptUtils/esbuild/svelteWrapperPlugin.mjs +1 -1
  332. package/dist/lib/esm/ScriptUtils/format.d.mts +4 -2
  333. package/dist/lib/esm/ScriptUtils/format.mjs +1 -1
  334. package/dist/lib/esm/ScriptUtils/spellcheck.d.mts +4 -3
  335. package/dist/lib/esm/ScriptUtils/spellcheck.mjs +1 -1
  336. package/dist/lib/esm/ScriptUtils/version.d.mts +12 -11
  337. package/dist/lib/esm/ScriptUtils/version.mjs +1 -1
  338. package/dist/lib/esm/String.d.mts +4 -3
  339. package/dist/lib/esm/String.mjs +1 -1
  340. package/dist/lib/esm/Transformers/DateTransformer.d.mts +4 -1
  341. package/dist/lib/esm/Transformers/DateTransformer.mjs +3 -1
  342. package/dist/lib/esm/Transformers/DurationTransformer.d.mts +6 -1
  343. package/dist/lib/esm/Transformers/DurationTransformer.mjs +5 -1
  344. package/dist/lib/esm/Transformers/GroupTransformer.d.mts +9 -5
  345. package/dist/lib/esm/Transformers/GroupTransformer.mjs +7 -4
  346. package/dist/lib/esm/Transformers/SkipPrivatePropertyTransformer.d.mts +4 -1
  347. package/dist/lib/esm/Transformers/SkipPrivatePropertyTransformer.mjs +3 -1
  348. package/dist/lib/esm/Transformers/Transformer.d.mts +2 -1
  349. package/dist/lib/esm/Transformers/Transformer.mjs +9 -2
  350. package/dist/lib/esm/Transformers/TypedTransformer.d.mts +2 -1
  351. package/dist/lib/esm/Transformers/TypedTransformer.mjs +1 -1
  352. package/dist/lib/esm/Type.d.mts +17 -0
  353. package/dist/lib/esm/Type.mjs +8 -0
  354. package/dist/lib/esm/ValueProvider.d.mts +3 -2
  355. package/dist/lib/esm/ValueProvider.mjs +1 -1
  356. package/dist/lib/esm/codemirror/StateFieldSpec.d.mts +2 -1
  357. package/dist/lib/esm/index.d.mts +3 -0
  358. package/dist/lib/esm/index.mjs +7 -1
  359. package/dist/lib/esm/obsidian/App.d.mts +2 -1
  360. package/dist/lib/esm/obsidian/App.mjs +1 -1
  361. package/dist/lib/esm/obsidian/AttachmentPath.d.mts +7 -5
  362. package/dist/lib/esm/obsidian/AttachmentPath.mjs +1 -1
  363. package/dist/lib/esm/obsidian/Backlink.d.mts +3 -2
  364. package/dist/lib/esm/obsidian/Backlink.mjs +1 -1
  365. package/dist/lib/esm/obsidian/Callout.d.mts +3 -2
  366. package/dist/lib/esm/obsidian/Callout.mjs +1 -1
  367. package/dist/lib/esm/obsidian/Components/CheckboxComponent.d.mts +59 -0
  368. package/dist/lib/esm/obsidian/Components/CheckboxComponent.mjs +75 -0
  369. package/dist/lib/esm/obsidian/Components/DateComponent.d.mts +2 -1
  370. package/dist/lib/esm/obsidian/Components/DateComponent.mjs +1 -1
  371. package/dist/lib/esm/obsidian/Components/DateTimeComponent.d.mts +2 -1
  372. package/dist/lib/esm/obsidian/Components/DateTimeComponent.mjs +1 -1
  373. package/dist/lib/esm/obsidian/Components/EmailComponent.d.mts +2 -1
  374. package/dist/lib/esm/obsidian/Components/EmailComponent.mjs +1 -1
  375. package/dist/lib/esm/obsidian/Components/FileComponent.d.mts +2 -1
  376. package/dist/lib/esm/obsidian/Components/FileComponent.mjs +1 -1
  377. package/dist/lib/esm/obsidian/Components/MonthComponent.d.mts +2 -1
  378. package/dist/lib/esm/obsidian/Components/MonthComponent.mjs +1 -1
  379. package/dist/lib/esm/obsidian/Components/MultipleDropdownComponent.d.mts +4 -1
  380. package/dist/lib/esm/obsidian/Components/MultipleDropdownComponent.mjs +4 -2
  381. package/dist/lib/esm/obsidian/Components/MultipleEmailComponent.d.mts +2 -1
  382. package/dist/lib/esm/obsidian/Components/MultipleEmailComponent.mjs +1 -1
  383. package/dist/lib/esm/obsidian/Components/MultipleFileComponent.d.mts +2 -1
  384. package/dist/lib/esm/obsidian/Components/MultipleFileComponent.mjs +1 -1
  385. package/dist/lib/esm/obsidian/Components/MultipleTextComponent.d.mts +22 -3
  386. package/dist/lib/esm/obsidian/Components/MultipleTextComponent.mjs +30 -3
  387. package/dist/lib/esm/obsidian/Components/NumberComponent.d.mts +2 -1
  388. package/dist/lib/esm/obsidian/Components/NumberComponent.mjs +1 -1
  389. package/dist/lib/esm/obsidian/Components/TextBasedComponent.d.mts +37 -0
  390. package/dist/lib/esm/obsidian/Components/TextBasedComponent.mjs +41 -0
  391. package/dist/lib/esm/obsidian/Components/TimeComponent.d.mts +2 -1
  392. package/dist/lib/esm/obsidian/Components/TimeComponent.mjs +1 -1
  393. package/dist/lib/esm/obsidian/Components/TriStateCheckboxComponent.d.mts +59 -0
  394. package/dist/lib/esm/obsidian/Components/TriStateCheckboxComponent.mjs +76 -0
  395. package/dist/lib/esm/obsidian/Components/TypedDropdownComponent.d.mts +78 -0
  396. package/dist/lib/esm/obsidian/Components/TypedDropdownComponent.mjs +108 -0
  397. package/dist/lib/esm/obsidian/Components/TypedMultipleDropdownComponent.d.mts +79 -0
  398. package/dist/lib/esm/obsidian/Components/TypedMultipleDropdownComponent.mjs +110 -0
  399. package/dist/lib/esm/obsidian/Components/TypedRangeTextComponent.d.mts +4 -1
  400. package/dist/lib/esm/obsidian/Components/TypedRangeTextComponent.mjs +1 -1
  401. package/dist/lib/esm/obsidian/Components/TypedTextComponent.d.mts +25 -3
  402. package/dist/lib/esm/obsidian/Components/TypedTextComponent.mjs +30 -4
  403. package/dist/lib/esm/obsidian/Components/UrlComponent.d.mts +2 -1
  404. package/dist/lib/esm/obsidian/Components/UrlComponent.mjs +1 -1
  405. package/dist/lib/esm/obsidian/Components/ValidatorComponent.d.mts +6 -6
  406. package/dist/lib/esm/obsidian/Components/ValidatorComponent.mjs +25 -30
  407. package/dist/lib/esm/obsidian/Components/ValueComponentWithChangeTracking.d.mts +4 -1
  408. package/dist/lib/esm/obsidian/Components/WeekComponent.d.mts +2 -1
  409. package/dist/lib/esm/obsidian/Components/WeekComponent.mjs +1 -1
  410. package/dist/lib/esm/obsidian/Components/index.d.mts +5 -1
  411. package/dist/lib/esm/obsidian/Components/index.mjs +11 -3
  412. package/dist/lib/esm/obsidian/Dataview.d.mts +11 -12
  413. package/dist/lib/esm/obsidian/Dataview.mjs +1 -1
  414. package/dist/lib/esm/obsidian/DataviewLink.d.mts +4 -3
  415. package/dist/lib/esm/obsidian/DataviewLink.mjs +1 -1
  416. package/dist/lib/esm/obsidian/FileChange.d.mts +4 -3
  417. package/dist/lib/esm/obsidian/FileChange.mjs +1 -1
  418. package/dist/lib/esm/obsidian/FileManager.d.mts +6 -5
  419. package/dist/lib/esm/obsidian/FileManager.mjs +1 -1
  420. package/dist/lib/esm/obsidian/FileSystem.d.mts +3 -1
  421. package/dist/lib/esm/obsidian/FileSystem.mjs +1 -1
  422. package/dist/lib/esm/obsidian/Frontmatter.d.mts +5 -1
  423. package/dist/lib/esm/obsidian/Frontmatter.mjs +1 -1
  424. package/dist/lib/esm/obsidian/Link.d.mts +7 -6
  425. package/dist/lib/esm/obsidian/Link.mjs +1 -1
  426. package/dist/lib/esm/obsidian/Logger.d.mts +2 -1
  427. package/dist/lib/esm/obsidian/Logger.mjs +1 -1
  428. package/dist/lib/esm/obsidian/Loop.d.mts +2 -1
  429. package/dist/lib/esm/obsidian/Loop.mjs +1 -1
  430. package/dist/lib/esm/obsidian/Markdown.d.mts +2 -1
  431. package/dist/lib/esm/obsidian/Markdown.mjs +5 -8
  432. package/dist/lib/esm/obsidian/MarkdownCodeBlockProcessor.d.mts +2 -1
  433. package/dist/lib/esm/obsidian/MarkdownCodeBlockProcessor.mjs +1 -1
  434. package/dist/lib/esm/obsidian/MarkdownView.d.mts +2 -1
  435. package/dist/lib/esm/obsidian/MarkdownView.mjs +1 -1
  436. package/dist/lib/esm/obsidian/MetadataCache.d.mts +7 -5
  437. package/dist/lib/esm/obsidian/MetadataCache.mjs +1 -1
  438. package/dist/lib/esm/obsidian/Modals/Alert.d.mts +3 -2
  439. package/dist/lib/esm/obsidian/Modals/Alert.mjs +3 -1
  440. package/dist/lib/esm/obsidian/Modals/Confirm.d.mts +3 -2
  441. package/dist/lib/esm/obsidian/Modals/Confirm.mjs +3 -1
  442. package/dist/lib/esm/obsidian/Modals/ModalBase.d.mts +2 -2
  443. package/dist/lib/esm/obsidian/Modals/ModalBase.mjs +1 -1
  444. package/dist/lib/esm/obsidian/Modals/Prompt.d.mts +5 -3
  445. package/dist/lib/esm/obsidian/Modals/Prompt.mjs +3 -1
  446. package/dist/lib/esm/obsidian/Modals/SelectItem.d.mts +4 -2
  447. package/dist/lib/esm/obsidian/Modals/SelectItem.mjs +2 -1
  448. package/dist/lib/esm/obsidian/MonkeyAround.d.mts +5 -3
  449. package/dist/lib/esm/obsidian/MonkeyAround.mjs +1 -1
  450. package/dist/lib/esm/obsidian/ObsidianSettings.d.mts +3 -0
  451. package/dist/lib/esm/obsidian/ObsidianSettings.mjs +1 -1
  452. package/dist/lib/esm/obsidian/Pdf.d.mts +2 -1
  453. package/dist/lib/esm/obsidian/Pdf.mjs +1 -1
  454. package/dist/lib/esm/obsidian/Plugin/ObsidianPluginRepoPaths.d.mts +38 -29
  455. package/dist/lib/esm/obsidian/Plugin/ObsidianPluginRepoPaths.mjs +6 -2
  456. package/dist/lib/esm/obsidian/Plugin/Plugin.d.mts +4 -3
  457. package/dist/lib/esm/obsidian/Plugin/Plugin.mjs +1 -1
  458. package/dist/lib/esm/obsidian/Plugin/PluginBase.d.mts +52 -21
  459. package/dist/lib/esm/obsidian/Plugin/PluginBase.mjs +128 -38
  460. package/dist/lib/esm/obsidian/Plugin/PluginContext.d.mts +2 -1
  461. package/dist/lib/esm/obsidian/Plugin/PluginContext.mjs +1 -1
  462. package/dist/lib/esm/obsidian/Plugin/PluginId.d.mts +2 -1
  463. package/dist/lib/esm/obsidian/Plugin/PluginId.mjs +1 -1
  464. package/dist/lib/esm/obsidian/Plugin/PluginSettingsManagerBase.d.mts +39 -21
  465. package/dist/lib/esm/obsidian/Plugin/PluginSettingsManagerBase.mjs +80 -49
  466. package/dist/lib/esm/obsidian/Plugin/PluginSettingsTabBase.d.mts +18 -11
  467. package/dist/lib/esm/obsidian/Plugin/PluginSettingsTabBase.mjs +22 -11
  468. package/dist/lib/esm/obsidian/Plugin/PluginTypesBase.d.mts +55 -0
  469. package/dist/lib/esm/obsidian/Plugin/PluginTypesBase.mjs +8 -0
  470. package/dist/lib/esm/obsidian/Plugin/index.d.mts +1 -0
  471. package/dist/lib/esm/obsidian/Plugin/index.mjs +4 -2
  472. package/dist/lib/esm/obsidian/Queue.d.mts +3 -2
  473. package/dist/lib/esm/obsidian/Queue.mjs +1 -1
  474. package/dist/lib/esm/obsidian/React/AppContext.d.mts +8 -1
  475. package/dist/lib/esm/obsidian/React/AppContext.mjs +3 -3
  476. package/dist/lib/esm/obsidian/Reference.d.mts +2 -1
  477. package/dist/lib/esm/obsidian/Reference.mjs +1 -1
  478. package/dist/lib/esm/obsidian/RenameDeleteHandler.d.mts +3 -2
  479. package/dist/lib/esm/obsidian/RenameDeleteHandler.mjs +75 -75
  480. package/dist/lib/esm/obsidian/ResourceUrl.d.mts +2 -1
  481. package/dist/lib/esm/obsidian/ResourceUrl.mjs +1 -1
  482. package/dist/lib/esm/obsidian/SettingEx.d.mts +35 -2
  483. package/dist/lib/esm/obsidian/SettingEx.mjs +41 -1
  484. package/dist/lib/esm/obsidian/ValidationMessage.d.mts +5 -0
  485. package/dist/lib/esm/obsidian/ValidationMessage.mjs +1 -1
  486. package/dist/lib/esm/obsidian/Vault.d.mts +15 -10
  487. package/dist/lib/esm/obsidian/Vault.mjs +1 -1
  488. package/dist/lib/esm/obsidian/VaultEx.d.mts +4 -3
  489. package/dist/lib/esm/obsidian/VaultEx.mjs +1 -1
  490. package/dist/lib/esm/url.d.mts +2 -1
  491. package/dist/lib/esm/url.mjs +1 -1
  492. package/obsidian/Components/CheckboxComponent/package.json +6 -0
  493. package/obsidian/Components/TextBasedComponent/package.json +6 -0
  494. package/obsidian/Components/TriStateCheckboxComponent/package.json +6 -0
  495. package/obsidian/Components/TypedDropdownComponent/package.json +6 -0
  496. package/obsidian/Components/TypedMultipleDropdownComponent/package.json +6 -0
  497. package/obsidian/Plugin/PluginTypesBase/package.json +6 -0
  498. package/package.json +5 -6
  499. package/dist/lib/cjs/obsidian/Components/PlaceholderComponent.d.cts +0 -19
  500. package/dist/lib/esm/obsidian/Components/PlaceholderComponent.d.mts +0 -19
  501. package/dist/lib/esm/obsidian/Components/PlaceholderComponent.mjs +0 -14
  502. package/obsidian/Components/PlaceholderComponent/package.json +0 -6
@@ -1,21 +1,25 @@
1
1
  /**
2
- * @packageDocumentation PluginBase
2
+ * @packageDocumentation
3
+ *
3
4
  * Base class for Obsidian plugins providing utility methods for settings management, error handling, and notifications.
4
5
  *
5
6
  * This class simplifies the process of managing plugin settings, displaying notifications, and handling errors.
6
7
  * Subclasses should implement methods to create default settings and settings tabs, and complete plugin-specific
7
8
  * loading tasks.
8
9
  */
9
- import type { PluginSettingTab } from 'obsidian';
10
- import type { Promisable, ReadonlyDeep } from 'type-fest';
11
- import { Plugin } from 'obsidian';
12
- import { PluginSettingsManagerBase } from './PluginSettingsManagerBase.cjs';
10
+ import type { ReadonlyDeep } from 'type-fest';
11
+ import { Plugin as ObsidianPlugin } from 'obsidian';
12
+ import type { AsyncEventRef } from '../../AsyncEvents.cjs';
13
+ import type { ExtractPluginSettings, ExtractPluginSettingsManager, ExtractPluginSettingsTab, PluginTypesBase } from './PluginTypesBase.cjs';
14
+ import { AsyncEvents } from '../../AsyncEvents.cjs';
15
+ type LifecycleEventName = 'layoutReady' | 'load' | 'unload';
13
16
  /**
14
17
  * Base class for creating Obsidian plugins with built-in support for settings management, error handling, and notifications.
15
18
  *
16
19
  * @typeParam PluginSettings - The type representing the plugin settings object.
17
20
  */
18
- export declare abstract class PluginBase<PluginSettings extends object = object> extends Plugin {
21
+ export declare abstract class PluginBase<PluginTypes extends PluginTypesBase> extends ObsidianPlugin {
22
+ readonly events: AsyncEvents;
19
23
  /**
20
24
  * Gets the AbortSignal used for aborting long-running operations.
21
25
  *
@@ -27,10 +31,13 @@ export declare abstract class PluginBase<PluginSettings extends object = object>
27
31
  *
28
32
  * @returns The readonly plugin settings.
29
33
  */
30
- get settings(): ReadonlyDeep<PluginSettings>;
31
- get settingsManager(): PluginSettingsManagerBase<PluginSettings>;
34
+ get settings(): ReadonlyDeep<ExtractPluginSettings<PluginTypes>>;
35
+ get settingsManager(): ExtractPluginSettingsManager<PluginTypes>;
36
+ get settingsTab(): ExtractPluginSettingsTab<PluginTypes>;
32
37
  private _abortSignal;
33
38
  private _settingsManager;
39
+ private _settingsTab;
40
+ private lifecycleEventNames;
34
41
  private notice?;
35
42
  /**
36
43
  * Logs a message to the console.
@@ -53,44 +60,68 @@ export declare abstract class PluginBase<PluginSettings extends object = object>
53
60
  * Called when the plugin is loaded
54
61
  */
55
62
  onload(): Promise<void>;
63
+ /**
64
+ * Called when the plugin settings are loaded or reloaded.
65
+ *
66
+ * @param _settings - The settings.
67
+ */
68
+ onLoadSettings(_settings: ExtractPluginSettings<PluginTypes>): Promise<void>;
56
69
  /**
57
70
  * Called when the plugin settings are saved.
58
71
  *
59
72
  * @param _newSettings - The new settings.
60
73
  * @param _oldSettings - The old settings.
61
- * @returns A promise or void indicating the completion of the save process.
62
74
  */
63
- onSaveSettings(_newSettings: Partial<PluginSettings>, _oldSettings: Partial<PluginSettings>): Promise<void>;
75
+ onSaveSettings(_newSettings: ExtractPluginSettings<PluginTypes>, _oldSettings: ExtractPluginSettings<PluginTypes>): Promise<void>;
76
+ onunload(): void;
77
+ /**
78
+ * Registers an async event.
79
+ * Unregisters the event when the plugin is unloaded.
80
+ *
81
+ * @param eventRef - The event reference.
82
+ */
83
+ registerAsyncEvent(eventRef: AsyncEventRef): void;
64
84
  /**
65
- * Creates a plugin settings tab. This method must be implemented by subclasses.
85
+ * Waits for a lifecycle event to be triggered.
86
+ *
87
+ * If you `await` this method during lifecycle event, it might cause a deadlock.
88
+ *
89
+ * Consider wrapping this call with {@link invokeAsyncSafely}.
90
+ *
91
+ * @param name - The name of the event.
92
+ * @returns A {@link Promise} that resolves when the event is triggered.
93
+ */
94
+ waitForLifecycleEvent(name: LifecycleEventName): Promise<void>;
95
+ /**
96
+ * Creates a plugin settings tab.
66
97
  *
67
98
  * @returns The settings tab or null if not applicable.
68
99
  */
69
- protected abstract createPluginSettingsTab(): null | PluginSettingTab;
100
+ protected createPluginSettingsTab(): ExtractPluginSettingsTab<PluginTypes> | null;
70
101
  /**
71
102
  * Creates the plugin settings manager. This method must be implemented by subclasses.
72
103
  *
73
104
  * @returns The plugin settings manager.
74
105
  */
75
- protected abstract createSettingsManager(): PluginSettingsManagerBase<PluginSettings>;
106
+ protected createSettingsManager(): ExtractPluginSettingsManager<PluginTypes> | null;
76
107
  /**
77
108
  * Called when the layout is ready. This method can be overridden by subclasses to perform actions once
78
109
  * the layout is ready.
79
- *
80
- * @returns A promise or void indicating the completion of the layout setup.
81
110
  */
82
- protected onLayoutReady(): Promisable<void>;
111
+ protected onLayoutReady(): Promise<void>;
112
+ protected onloadImpl(): Promise<void>;
83
113
  /**
84
- * Called when the plugin loading is complete. This method must be implemented by subclasses to perform
85
- * any additional setup required after loading is complete.
86
- *
87
- * @returns A promise or void indicating the completion of the load process.
114
+ * Called when the plugin is unloaded.
88
115
  */
89
- protected onloadComplete(): Promisable<void>;
116
+ protected onunloadImpl(): Promise<void>;
90
117
  /**
91
118
  * Displays a notice message to the user.
92
119
  *
93
120
  * @param message - The message to display.
94
121
  */
95
122
  protected showNotice(message: string): void;
123
+ private afterLoad;
124
+ private onLayoutReadyBase;
125
+ private triggerLifecycleEvent;
96
126
  }
127
+ export {};
@@ -59,4 +59,4 @@ function getPluginContextWindow() {
59
59
  0 && (module.exports = {
60
60
  initPluginContext
61
61
  });
62
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5Db250ZXh0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvbiBQbHVnaW5Db250ZXh0XG4gKiBJbml0aWFsaXplcyB0aGUgcGx1Z2luIGNvbnRleHQgYW5kIHNldHMgdXAgdGhlIHBsdWdpbiBJRC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgY29tcGFyZVZlcnNpb25zIH0gZnJvbSAnY29tcGFyZS12ZXJzaW9ucyc7XG5cbmltcG9ydCB0eXBlIHsgRGVidWdDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vRGVidWdDb250cm9sbGVyLnRzJztcblxuaW1wb3J0IHtcbiAgZ2V0RGVidWdDb250cm9sbGVyLFxuICBzaG93SW5pdGlhbERlYnVnTWVzc2FnZVxufSBmcm9tICcuLi8uLi9EZWJ1Zy50cyc7XG5pbXBvcnQge1xuICBMSUJSQVJZX05BTUUsXG4gIExJQlJBUllfU1RZTEVTLFxuICBMSUJSQVJZX1ZFUlNJT05cbn0gZnJvbSAnLi4vLi4vTGlicmFyeS50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuLi9BcHAudHMnO1xuaW1wb3J0IHsgc2V0UGx1Z2luSWQgfSBmcm9tICcuL1BsdWdpbklkLnRzJztcblxuaW50ZXJmYWNlIFBsdWdpbkNvbnRleHRXaW5kb3cge1xuICBERUJVRzogRGVidWdDb250cm9sbGVyO1xufVxuXG5jb25zdCBTVFlMRVNfSUQgPSBgJHtMSUJSQVJZX05BTUV9LXN0eWxlc2A7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgdGhlIHBsdWdpbiBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIHBsdWdpbiBJRC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRQbHVnaW5Db250ZXh0KGFwcDogQXBwLCBwbHVnaW5JZDogc3RyaW5nKTogdm9pZCB7XG4gIHNldFBsdWdpbklkKHBsdWdpbklkKTtcbiAgc2hvd0luaXRpYWxEZWJ1Z01lc3NhZ2UocGx1Z2luSWQpO1xuXG4gIGNvbnN0IGxhc3RMaWJyYXJ5VmVyc2lvbldyYXBwZXIgPSBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoYXBwLCAnbGFzdExpYnJhcnlWZXJzaW9uJywgJzAuMC4wJyk7XG4gIGlmIChjb21wYXJlVmVyc2lvbnMoTElCUkFSWV9WRVJTSU9OLCBsYXN0TGlicmFyeVZlcnNpb25XcmFwcGVyLnZhbHVlKSA8PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGFzdExpYnJhcnlWZXJzaW9uV3JhcHBlci52YWx1ZSA9IExJQlJBUllfVkVSU0lPTjtcblxuICBjb25zdCBwbHVnaW5Db250ZXh0V2luZG93ID0gZ2V0UGx1Z2luQ29udGV4dFdpbmRvdygpO1xuICBwbHVnaW5Db250ZXh0V2luZG93LkRFQlVHID0gZ2V0RGVidWdDb250cm9sbGVyKCk7XG5cbiAgZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKGAjJHtTVFlMRVNfSUR9YCk/LnJlbW92ZSgpO1xuICBkb2N1bWVudC5oZWFkLmNyZWF0ZUVsKCdzdHlsZScsIHtcbiAgICBhdHRyOiB7XG4gICAgICBpZDogU1RZTEVTX0lEXG4gICAgfSxcbiAgICB0ZXh0OiBMSUJSQVJZX1NUWUxFU1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UGx1Z2luQ29udGV4dFdpbmRvdygpOiBQYXJ0aWFsPFBsdWdpbkNvbnRleHRXaW5kb3c+IHtcbiAgcmV0dXJuIHdpbmRvdyBhcyBQYXJ0aWFsPFBsdWdpbkNvbnRleHRXaW5kb3c+O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPQSw4QkFBZ0M7QUFJaEMsbUJBR087QUFDUCxxQkFJTztBQUNQLGlCQUF5QztBQUN6QyxzQkFBNEI7QUFNNUIsTUFBTSxZQUFZLEdBQUcsMkJBQVk7QUFRMUIsU0FBUyxrQkFBa0IsS0FBVSxVQUF3QjtBQUNsRSxtQ0FBWSxRQUFRO0FBQ3BCLDRDQUF3QixRQUFRO0FBRWhDLFFBQU0sZ0NBQTRCLHFDQUF5QixLQUFLLHNCQUFzQixPQUFPO0FBQzdGLFVBQUkseUNBQWdCLGdDQUFpQiwwQkFBMEIsS0FBSyxLQUFLLEdBQUc7QUFDMUU7QUFBQSxFQUNGO0FBRUEsNEJBQTBCLFFBQVE7QUFFbEMsUUFBTSxzQkFBc0IsdUJBQXVCO0FBQ25ELHNCQUFvQixZQUFRLGlDQUFtQjtBQUUvQyxXQUFTLEtBQUssY0FBYyxJQUFJLFNBQVMsRUFBRSxHQUFHLE9BQU87QUFDckQsV0FBUyxLQUFLLFNBQVMsU0FBUztBQUFBLElBQzlCLE1BQU07QUFBQSxNQUNKLElBQUk7QUFBQSxJQUNOO0FBQUEsSUFDQSxNQUFNO0FBQUEsRUFDUixDQUFDO0FBQ0g7QUFFQSxTQUFTLHlCQUF1RDtBQUM5RCxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbXQp9Cg==
62
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5Db250ZXh0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIEluaXRpYWxpemVzIHRoZSBwbHVnaW4gY29udGV4dCBhbmQgc2V0cyB1cCB0aGUgcGx1Z2luIElELlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcblxuaW1wb3J0IHR5cGUgeyBEZWJ1Z0NvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi9EZWJ1Z0NvbnRyb2xsZXIudHMnO1xuXG5pbXBvcnQge1xuICBnZXREZWJ1Z0NvbnRyb2xsZXIsXG4gIHNob3dJbml0aWFsRGVidWdNZXNzYWdlXG59IGZyb20gJy4uLy4uL0RlYnVnLnRzJztcbmltcG9ydCB7XG4gIExJQlJBUllfTkFNRSxcbiAgTElCUkFSWV9TVFlMRVMsXG4gIExJQlJBUllfVkVSU0lPTlxufSBmcm9tICcuLi8uLi9MaWJyYXJ5LnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uL0FwcC50cyc7XG5pbXBvcnQgeyBzZXRQbHVnaW5JZCB9IGZyb20gJy4vUGx1Z2luSWQudHMnO1xuXG5pbnRlcmZhY2UgUGx1Z2luQ29udGV4dFdpbmRvdyB7XG4gIERFQlVHOiBEZWJ1Z0NvbnRyb2xsZXI7XG59XG5cbmNvbnN0IFNUWUxFU19JRCA9IGAke0xJQlJBUllfTkFNRX0tc3R5bGVzYDtcblxuLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgcGx1Z2luIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgcGx1Z2luIElELlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdFBsdWdpbkNvbnRleHQoYXBwOiBBcHAsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgc2V0UGx1Z2luSWQocGx1Z2luSWQpO1xuICBzaG93SW5pdGlhbERlYnVnTWVzc2FnZShwbHVnaW5JZCk7XG5cbiAgY29uc3QgbGFzdExpYnJhcnlWZXJzaW9uV3JhcHBlciA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZShhcHAsICdsYXN0TGlicmFyeVZlcnNpb24nLCAnMC4wLjAnKTtcbiAgaWYgKGNvbXBhcmVWZXJzaW9ucyhMSUJSQVJZX1ZFUlNJT04sIGxhc3RMaWJyYXJ5VmVyc2lvbldyYXBwZXIudmFsdWUpIDw9IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsYXN0TGlicmFyeVZlcnNpb25XcmFwcGVyLnZhbHVlID0gTElCUkFSWV9WRVJTSU9OO1xuXG4gIGNvbnN0IHBsdWdpbkNvbnRleHRXaW5kb3cgPSBnZXRQbHVnaW5Db250ZXh0V2luZG93KCk7XG4gIHBsdWdpbkNvbnRleHRXaW5kb3cuREVCVUcgPSBnZXREZWJ1Z0NvbnRyb2xsZXIoKTtcblxuICBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoYCMke1NUWUxFU19JRH1gKT8ucmVtb3ZlKCk7XG4gIGRvY3VtZW50LmhlYWQuY3JlYXRlRWwoJ3N0eWxlJywge1xuICAgIGF0dHI6IHtcbiAgICAgIGlkOiBTVFlMRVNfSURcbiAgICB9LFxuICAgIHRleHQ6IExJQlJBUllfU1RZTEVTXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQbHVnaW5Db250ZXh0V2luZG93KCk6IFBhcnRpYWw8UGx1Z2luQ29udGV4dFdpbmRvdz4ge1xuICByZXR1cm4gd2luZG93IGFzIFBhcnRpYWw8UGx1Z2luQ29udGV4dFdpbmRvdz47XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBLDhCQUFnQztBQUloQyxtQkFHTztBQUNQLHFCQUlPO0FBQ1AsaUJBQXlDO0FBQ3pDLHNCQUE0QjtBQU01QixNQUFNLFlBQVksR0FBRywyQkFBWTtBQVExQixTQUFTLGtCQUFrQixLQUFVLFVBQXdCO0FBQ2xFLG1DQUFZLFFBQVE7QUFDcEIsNENBQXdCLFFBQVE7QUFFaEMsUUFBTSxnQ0FBNEIscUNBQXlCLEtBQUssc0JBQXNCLE9BQU87QUFDN0YsVUFBSSx5Q0FBZ0IsZ0NBQWlCLDBCQUEwQixLQUFLLEtBQUssR0FBRztBQUMxRTtBQUFBLEVBQ0Y7QUFFQSw0QkFBMEIsUUFBUTtBQUVsQyxRQUFNLHNCQUFzQix1QkFBdUI7QUFDbkQsc0JBQW9CLFlBQVEsaUNBQW1CO0FBRS9DLFdBQVMsS0FBSyxjQUFjLElBQUksU0FBUyxFQUFFLEdBQUcsT0FBTztBQUNyRCxXQUFTLEtBQUssU0FBUyxTQUFTO0FBQUEsSUFDOUIsTUFBTTtBQUFBLE1BQ0osSUFBSTtBQUFBLElBQ047QUFBQSxJQUNBLE1BQU07QUFBQSxFQUNSLENBQUM7QUFDSDtBQUVBLFNBQVMseUJBQXVEO0FBQzlELFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
@@ -1,5 +1,6 @@
1
1
  /**
2
- * @packageDocumentation PluginContext
2
+ * @packageDocumentation
3
+ *
3
4
  * Initializes the plugin context and sets up the plugin ID.
4
5
  */
5
6
  import type { App } from 'obsidian';
@@ -46,4 +46,4 @@ function setPluginId(newPluginId) {
46
46
  getPluginId,
47
47
  setPluginId
48
48
  });
49
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5JZC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb24gUGx1Z2luSWRcbiAqIEhvbGRlciBmb3IgdGhlIHBsdWdpbiBJRC5cbiAqL1xuXG4vKipcbiAqIFRoZSBwbHVnaW4gSUQgZm9yIG5vIHBsdWdpbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE5PX1BMVUdJTl9JRF9JTklUSUFMSVpFRCA9ICdfX25vLXBsdWdpbi1pZC1pbml0aWFsaXplZF9fJztcblxubGV0IHBsdWdpbklkID0gTk9fUExVR0lOX0lEX0lOSVRJQUxJWkVEO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHBsdWdpbiBJRC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgcGx1Z2luIElELlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGx1Z2luSWQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBsdWdpbklkO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIHBsdWdpbiBJRC5cbiAqXG4gKiBAcGFyYW0gbmV3UGx1Z2luSWQgLSBUaGUgbmV3IHBsdWdpbiBJRC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFBsdWdpbklkKG5ld1BsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKG5ld1BsdWdpbklkKSB7XG4gICAgcGx1Z2luSWQgPSBuZXdQbHVnaW5JZDtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBUU8sTUFBTSwyQkFBMkI7QUFFeEMsSUFBSSxXQUFXO0FBT1IsU0FBUyxjQUFzQjtBQUNwQyxTQUFPO0FBQ1Q7QUFPTyxTQUFTLFlBQVksYUFBMkI7QUFDckQsTUFBSSxhQUFhO0FBQ2YsZUFBVztBQUFBLEVBQ2I7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
49
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5JZC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqXG4gKiBIb2xkZXIgZm9yIHRoZSBwbHVnaW4gSUQuXG4gKi9cblxuLyoqXG4gKiBUaGUgcGx1Z2luIElEIGZvciBubyBwbHVnaW4uXG4gKi9cbmV4cG9ydCBjb25zdCBOT19QTFVHSU5fSURfSU5JVElBTElaRUQgPSAnX19uby1wbHVnaW4taWQtaW5pdGlhbGl6ZWRfXyc7XG5cbmxldCBwbHVnaW5JZCA9IE5PX1BMVUdJTl9JRF9JTklUSUFMSVpFRDtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbHVnaW4gSUQuXG4gKlxuICogQHJldHVybnMgVGhlIHBsdWdpbiBJRC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBsdWdpbklkKCk6IHN0cmluZyB7XG4gIHJldHVybiBwbHVnaW5JZDtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBwbHVnaW4gSUQuXG4gKlxuICogQHBhcmFtIG5ld1BsdWdpbklkIC0gVGhlIG5ldyBwbHVnaW4gSUQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRQbHVnaW5JZChuZXdQbHVnaW5JZDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChuZXdQbHVnaW5JZCkge1xuICAgIHBsdWdpbklkID0gbmV3UGx1Z2luSWQ7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNPLE1BQU0sMkJBQTJCO0FBRXhDLElBQUksV0FBVztBQU9SLFNBQVMsY0FBc0I7QUFDcEMsU0FBTztBQUNUO0FBT08sU0FBUyxZQUFZLGFBQTJCO0FBQ3JELE1BQUksYUFBYTtBQUNmLGVBQVc7QUFBQSxFQUNiO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -1,5 +1,6 @@
1
1
  /**
2
- * @packageDocumentation PluginId
2
+ * @packageDocumentation
3
+ *
3
4
  * Holder for the plugin ID.
4
5
  */
5
6
  /**
@@ -29,8 +29,8 @@ __export(PluginSettingsManagerBase_exports, {
29
29
  PluginSettingsProperty: () => PluginSettingsProperty
30
30
  });
31
31
  module.exports = __toCommonJS(PluginSettingsManagerBase_exports);
32
- var import_obsidian = require('obsidian');
33
32
  var import_Function = require('../../Function.cjs');
33
+ var import_Object = require('../../Object.cjs');
34
34
  var import_DateTransformer = require('../../Transformers/DateTransformer.cjs');
35
35
  var import_DurationTransformer = require('../../Transformers/DurationTransformer.cjs');
36
36
  var import_GroupTransformer = require('../../Transformers/GroupTransformer.cjs');
@@ -74,7 +74,7 @@ class EditableSettingsProxyHandler extends ProxyHandlerBase {
74
74
  return true;
75
75
  }
76
76
  getPropertyValue(property) {
77
- return property.getModifiedOrDefaultValue();
77
+ return property.currentValue;
78
78
  }
79
79
  }
80
80
  class PropertiesMap extends Map {
@@ -91,16 +91,17 @@ class PropertiesMap extends Map {
91
91
  }
92
92
  class SafeSettingsProxyHandler extends ProxyHandlerBase {
93
93
  getPropertyValue(property) {
94
- return property.getSafeValue();
94
+ return property.safeValue;
95
95
  }
96
96
  }
97
97
  class PluginSettingsManagerBase {
98
98
  constructor(plugin) {
99
99
  this.plugin = plugin;
100
+ this.app = plugin.app;
100
101
  this.defaultSettings = this.createDefaultSettings();
101
- this.addValidators();
102
+ this.registerValidators();
102
103
  this.properties = new PropertiesMap();
103
- for (const propertyName of Object.keys(this.defaultSettings)) {
104
+ for (const propertyName of (0, import_Object.getAllKeys)(this.defaultSettings)) {
104
105
  this.properties.set(
105
106
  propertyName,
106
107
  new PluginSettingsProperty(propertyName, this.defaultSettings[propertyName], this.validators.get(propertyName) ?? import_Function.noop)
@@ -109,6 +110,7 @@ class PluginSettingsManagerBase {
109
110
  this.validators.clear();
110
111
  this.safeSettings = new Proxy(this.defaultSettings, new SafeSettingsProxyHandler(this.properties));
111
112
  }
113
+ app;
112
114
  safeSettings;
113
115
  defaultSettings;
114
116
  properties;
@@ -125,7 +127,7 @@ class PluginSettingsManagerBase {
125
127
  }
126
128
  async loadFromFile() {
127
129
  for (const property of this.properties.values()) {
128
- property.clear();
130
+ property.reset();
129
131
  }
130
132
  const data = await this.plugin.loadData();
131
133
  if (data === void 0 || data === null) {
@@ -139,7 +141,8 @@ class PluginSettingsManagerBase {
139
141
  let record = data;
140
142
  const originalJson = JSON.stringify(record);
141
143
  record = this.getTransformer().transformObjectRecursively(record);
142
- await this.prepareRecord(record);
144
+ await this.onLoadRecord(record);
145
+ const propertiesToSave = [];
143
146
  for (const [propertyName, value] of Object.entries(record)) {
144
147
  const property = this.properties.get(propertyName);
145
148
  if (!property) {
@@ -154,17 +157,23 @@ class PluginSettingsManagerBase {
154
157
  });
155
158
  continue;
156
159
  }
157
- await property.setValueAndValidate(value);
160
+ property.setValue(value);
161
+ propertiesToSave.push(property);
158
162
  }
159
- const newJson = JSON.stringify(this.prepareRecordToSave());
163
+ for (const property of propertiesToSave) {
164
+ await property.setValueAndValidate(property.currentValue);
165
+ property.save();
166
+ }
167
+ const newJson = JSON.stringify(await this.prepareRecordToSave());
160
168
  if (newJson !== originalJson) {
161
- await this.saveToFile();
169
+ await this.saveToFileImpl();
162
170
  }
171
+ await this.plugin.onLoadSettings(this.getSavedSettings());
163
172
  }
164
173
  /**
165
174
  * Saves the new plugin settings.
166
175
  *
167
- * @returns A promise that resolves when the settings are saved.
176
+ * @returns A {@link Promise} that resolves when the settings are saved.
168
177
  */
169
178
  async saveToFile() {
170
179
  const oldSettings = this.getSavedSettings();
@@ -175,71 +184,87 @@ class PluginSettingsManagerBase {
175
184
  if (!hasChanges) {
176
185
  return;
177
186
  }
178
- await this.plugin.saveData(this.prepareRecordToSave());
187
+ await this.saveToFileImpl();
179
188
  await this.plugin.onSaveSettings(this.getSavedSettings(), oldSettings);
180
189
  }
181
- addValidator(propertyName, validator) {
182
- this.validators.set(propertyName, validator);
183
- }
184
- addValidators() {
185
- (0, import_Function.noop)();
186
- }
187
190
  getTransformer() {
188
191
  return defaultTransformer;
189
192
  }
190
- prepareRecord(_record) {
193
+ /**
194
+ * Called when the plugin settings are loaded.
195
+ *
196
+ * @param _record - The record.
197
+ */
198
+ async onLoadRecord(_record) {
199
+ await (0, import_Function.noopAsync)();
200
+ }
201
+ /**
202
+ * Called when the plugin settings are saving.
203
+ *
204
+ * @param _record - The record.
205
+ */
206
+ async onSavingRecord(_record) {
207
+ await (0, import_Function.noopAsync)();
208
+ }
209
+ registerValidator(propertyName, validator) {
210
+ this.validators.set(propertyName, validator);
211
+ }
212
+ registerValidators() {
191
213
  (0, import_Function.noop)();
192
214
  }
193
215
  getSavedSettings() {
194
216
  const savedSettings = {};
195
217
  for (const [propertyName, property] of this.properties.entries()) {
196
- savedSettings[propertyName] = property.getLastSavedValue();
218
+ savedSettings[propertyName] = property.lastSavedValue;
197
219
  }
198
220
  const proto = Object.getPrototypeOf(this.defaultSettings);
199
221
  Object.setPrototypeOf(savedSettings, proto);
200
222
  return savedSettings;
201
223
  }
202
- prepareRecordToSave() {
224
+ async prepareRecordToSave() {
203
225
  const settings = {};
204
226
  for (const [propertyName, property] of this.properties.entries()) {
205
- settings[propertyName] = property.getModifiedValue();
227
+ settings[propertyName] = property.currentValue;
206
228
  }
229
+ await this.onSavingRecord(settings);
207
230
  return this.getTransformer().transformObjectRecursively(settings);
208
231
  }
232
+ async saveToFileImpl() {
233
+ await this.plugin.saveData(await this.prepareRecordToSave());
234
+ }
209
235
  }
210
236
  class PluginSettingsProperty {
211
237
  constructor(propertyName, defaultValue, validator) {
212
238
  this.propertyName = propertyName;
213
239
  this.defaultValue = defaultValue;
214
240
  this.validator = validator;
241
+ this._lastSavedValue = defaultValue;
242
+ this._currentValue = defaultValue;
243
+ }
244
+ get currentValue() {
245
+ return this._currentValue;
246
+ }
247
+ get lastSavedValue() {
248
+ return this._lastSavedValue;
249
+ }
250
+ get safeValue() {
251
+ return this._validationMessage ? this.defaultValue : this._currentValue;
215
252
  }
216
253
  get validationMessage() {
217
254
  return this._validationMessage;
218
255
  }
256
+ _currentValue;
257
+ _lastSavedValue;
219
258
  _validationMessage = "";
220
- lastSavedValue;
221
- modifiedValue;
222
- clear() {
223
- this.modifiedValue = void 0;
259
+ reset() {
260
+ this._currentValue = this.defaultValue;
224
261
  this._validationMessage = "";
225
262
  }
226
- getLastSavedValue() {
227
- return this.lastSavedValue;
228
- }
229
- getModifiedOrDefaultValue() {
230
- return this.modifiedValue ?? this.defaultValue;
231
- }
232
- getModifiedValue() {
233
- return this.modifiedValue;
234
- }
235
- getSafeValue() {
236
- return this._validationMessage ? this.defaultValue : this.getModifiedOrDefaultValue();
237
- }
238
263
  save() {
239
- if (this.lastSavedValue === this.modifiedValue) {
264
+ if (this._lastSavedValue === this._currentValue) {
240
265
  return false;
241
266
  }
242
- this.lastSavedValue = this.modifiedValue;
267
+ this._lastSavedValue = this._currentValue;
243
268
  return true;
244
269
  }
245
270
  setValidationMessage(validationMessage) {
@@ -247,23 +272,26 @@ class PluginSettingsProperty {
247
272
  this.showWarning();
248
273
  }
249
274
  setValue(value) {
250
- this.modifiedValue = value;
275
+ this._currentValue = value;
251
276
  }
252
277
  async setValueAndValidate(value) {
253
278
  this.setValue(value);
254
- if (this.modifiedValue === void 0) {
255
- return;
279
+ try {
280
+ this._validationMessage = await this.validator(this._currentValue) ?? "";
281
+ } catch (error) {
282
+ console.error("Validation failed", {
283
+ propertyName: this.propertyName,
284
+ value
285
+ }, error);
286
+ this._validationMessage = "Validation failed";
256
287
  }
257
- this._validationMessage = await this.validator(this.modifiedValue) ?? "";
258
288
  this.showWarning(value);
259
289
  }
260
290
  showWarning(value) {
261
291
  if (!this._validationMessage) {
262
292
  return;
263
293
  }
264
- const warningMessage = `Could not set plugin setting: ${this.propertyName}. Using default value instead.`;
265
- new import_obsidian.Notice(warningMessage);
266
- console.warn(warningMessage, {
294
+ console.warn(`Could not set plugin setting: ${this.propertyName}. Using default value instead.`, {
267
295
  defaultValue: this.defaultValue,
268
296
  propertyName: this.propertyName,
269
297
  validationMessage: this._validationMessage,
@@ -276,4 +304,4 @@ class PluginSettingsProperty {
276
304
  PluginSettingsManagerBase,
277
305
  PluginSettingsProperty
278
306
  });
279
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc01hbmFnZXJCYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7XG4gIFByb21pc2FibGUsXG4gIFJlYWRvbmx5RGVlcFxufSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBOb3RpY2UgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWF5YmVSZXR1cm4sXG4gIFN0cmluZ0tleXNcbn0gZnJvbSAnLi4vLi4vT2JqZWN0LnRzJztcbmltcG9ydCB0eXBlIHsgVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi9UcmFuc2Zvcm1lcnMvVHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5CYXNlIH0gZnJvbSAnLi9QbHVnaW5CYXNlLnRzJztcblxuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4uLy4uL0Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IERhdGVUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL1RyYW5zZm9ybWVycy9EYXRlVHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgRHVyYXRpb25UcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL1RyYW5zZm9ybWVycy9EdXJhdGlvblRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IEdyb3VwVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi9UcmFuc2Zvcm1lcnMvR3JvdXBUcmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBTa2lwUHJpdmF0ZVByb3BlcnR5VHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi9UcmFuc2Zvcm1lcnMvU2tpcFByaXZhdGVQcm9wZXJ0eVRyYW5zZm9ybWVyLnRzJztcblxuY29uc3QgZGVmYXVsdFRyYW5zZm9ybWVyID0gbmV3IEdyb3VwVHJhbnNmb3JtZXIoW1xuICBuZXcgU2tpcFByaXZhdGVQcm9wZXJ0eVRyYW5zZm9ybWVyKCksXG4gIG5ldyBEYXRlVHJhbnNmb3JtZXIoKSxcbiAgbmV3IER1cmF0aW9uVHJhbnNmb3JtZXIoKVxuXSk7XG5cbnR5cGUgVmFsaWRhdG9yPFQ+ID0gKHZhbHVlOiBUKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG5hYnN0cmFjdCBjbGFzcyBQcm94eUhhbmRsZXJCYXNlPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiBpbXBsZW1lbnRzIFByb3h5SGFuZGxlcjxQbHVnaW5TZXR0aW5ncz4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IHByb3BlcnRpZXM6IFByb3BlcnRpZXNNYXA8UGx1Z2luU2V0dGluZ3M+KSB7fVxuXG4gIHB1YmxpYyBnZXQodGFyZ2V0OiBQbHVnaW5TZXR0aW5ncywgcHJvcDogc3RyaW5nIHwgc3ltYm9sKTogdW5rbm93biB7XG4gICAgY29uc3QgcmVjb3JkID0gdGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+O1xuICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiByZWNvcmRbcHJvcF07XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLnByb3BlcnRpZXMuZ2V0KHByb3ApO1xuICAgIGlmICghcHJvcGVydHkpIHtcbiAgICAgIHJldHVybiByZWNvcmRbcHJvcF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eTogUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTx1bmtub3duPik6IHVua25vd247XG59XG5cbmNsYXNzIEVkaXRhYmxlU2V0dGluZ3NQcm94eUhhbmRsZXI8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgUHJveHlIYW5kbGVyQmFzZTxQbHVnaW5TZXR0aW5ncz4ge1xuICBwcml2YXRlIHZhbGlkYXRpb25Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHB1YmxpYyBzZXQodGFyZ2V0OiBQbHVnaW5TZXR0aW5ncywgcHJvcDogc3RyaW5nIHwgc3ltYm9sLCB2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlY29yZCA9IHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPjtcblxuICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJlY29yZFtwcm9wXSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLnByb3BlcnRpZXMuZ2V0KHByb3ApO1xuICAgIGlmICghcHJvcGVydHkpIHtcbiAgICAgIHJlY29yZFtwcm9wXSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJvcGVydHkuc2V0VmFsdWUodmFsdWUpO1xuICAgIHRoaXMudmFsaWRhdGlvblByb21pc2UgPSB0aGlzLnZhbGlkYXRpb25Qcm9taXNlLnRoZW4oKCkgPT4gcHJvcGVydHkuc2V0VmFsdWVBbmRWYWxpZGF0ZSh2YWx1ZSkpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eTogUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTx1bmtub3duPik6IHVua25vd24ge1xuICAgIHJldHVybiBwcm9wZXJ0eS5nZXRNb2RpZmllZE9yRGVmYXVsdFZhbHVlKCk7XG4gIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNsYXNzIFByb3BlcnRpZXNNYXA8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgTWFwPHN0cmluZywgUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxhbnk+PiB7XG4gIHB1YmxpYyBnZXRUeXBlZDxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPj4ocHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUpOiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0+IHtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IHN1cGVyLmdldChwcm9wZXJ0eU5hbWUpO1xuICAgIGlmICghcHJvcGVydHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgJHtTdHJpbmcocHJvcGVydHlOYW1lKX0gbm90IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BlcnR5IGFzIFBsdWdpblNldHRpbmdzUHJvcGVydHk8UGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXT47XG4gIH1cblxuICBwdWJsaWMgc2V0VHlwZWQ8UHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+KFxuICAgIHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lLFxuICAgIHZhbHVlOiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0+XG4gICk6IHRoaXMge1xuICAgIHJldHVybiBzdXBlci5zZXQocHJvcGVydHlOYW1lLCB2YWx1ZSk7XG4gIH1cbn1cblxuY2xhc3MgU2FmZVNldHRpbmdzUHJveHlIYW5kbGVyPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIFByb3h5SGFuZGxlckJhc2U8UGx1Z2luU2V0dGluZ3M+IHtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldFByb3BlcnR5VmFsdWUocHJvcGVydHk6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8dW5rbm93bj4pOiB1bmtub3duIHtcbiAgICByZXR1cm4gcHJvcGVydHkuZ2V0U2FmZVZhbHVlKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBtYW5hZ2luZyBwbHVnaW4gc2V0dGluZ3MuXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIHJlcHJlc2VudGluZyB0aGUgcGx1Z2luIHNldHRpbmdzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpblNldHRpbmdzTWFuYWdlckJhc2U8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgcHVibGljIHJlYWRvbmx5IHNhZmVTZXR0aW5nczogUmVhZG9ubHlEZWVwPFBsdWdpblNldHRpbmdzPjtcblxuICBwcml2YXRlIGRlZmF1bHRTZXR0aW5nczogUGx1Z2luU2V0dGluZ3M7XG4gIHByaXZhdGUgcHJvcGVydGllczogUHJvcGVydGllc01hcDxQbHVnaW5TZXR0aW5ncz47XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgdmFsaWRhdG9yczogTWFwPHN0cmluZywgVmFsaWRhdG9yPGFueT4+ID0gbmV3IE1hcDxzdHJpbmcsIFZhbGlkYXRvcjxhbnk+PigpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHBsdWdpbjogUGx1Z2luQmFzZTxQbHVnaW5TZXR0aW5ncz4pIHtcbiAgICB0aGlzLmRlZmF1bHRTZXR0aW5ncyA9IHRoaXMuY3JlYXRlRGVmYXVsdFNldHRpbmdzKCk7XG5cbiAgICB0aGlzLmFkZFZhbGlkYXRvcnMoKTtcblxuICAgIHRoaXMucHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzTWFwPFBsdWdpblNldHRpbmdzPigpO1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgT2JqZWN0LmtleXModGhpcy5kZWZhdWx0U2V0dGluZ3MpIGFzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+W10pIHtcbiAgICAgIHRoaXMucHJvcGVydGllcy5zZXQoXG4gICAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgICAgbmV3IFBsdWdpblNldHRpbmdzUHJvcGVydHkocHJvcGVydHlOYW1lLCB0aGlzLmRlZmF1bHRTZXR0aW5nc1twcm9wZXJ0eU5hbWVdLCB0aGlzLnZhbGlkYXRvcnMuZ2V0KHByb3BlcnR5TmFtZSkgPz8gbm9vcClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy52YWxpZGF0b3JzLmNsZWFyKCk7XG5cbiAgICB0aGlzLnNhZmVTZXR0aW5ncyA9IG5ldyBQcm94eSh0aGlzLmRlZmF1bHRTZXR0aW5ncywgbmV3IFNhZmVTZXR0aW5nc1Byb3h5SGFuZGxlcjxQbHVnaW5TZXR0aW5ncz4odGhpcy5wcm9wZXJ0aWVzKSkgYXMgUmVhZG9ubHlEZWVwPFBsdWdpblNldHRpbmdzPjtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBlZGl0QW5kU2F2ZShlZGl0b3I6IChzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MpID0+IFByb21pc2FibGU8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBlZGl0YWJsZVNldHRpbmdzID0gbmV3IFByb3h5KHRoaXMuZGVmYXVsdFNldHRpbmdzLCBuZXcgRWRpdGFibGVTZXR0aW5nc1Byb3h5SGFuZGxlcjxQbHVnaW5TZXR0aW5ncz4odGhpcy5wcm9wZXJ0aWVzKSkgYXMge1xuICAgICAgdmFsaWRhdGlvblByb21pc2U6IFByb21pc2U8dm9pZD47XG4gICAgfSAmIFBsdWdpblNldHRpbmdzO1xuICAgIGF3YWl0IGVkaXRvcihlZGl0YWJsZVNldHRpbmdzKTtcbiAgICBhd2FpdCBlZGl0YWJsZVNldHRpbmdzLnZhbGlkYXRpb25Qcm9taXNlO1xuICAgIGF3YWl0IHRoaXMuc2F2ZVRvRmlsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldFByb3BlcnR5PFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+Pihwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZSk6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8UGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXT4ge1xuICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuZ2V0VHlwZWQocHJvcGVydHlOYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2FkRnJvbUZpbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiB0aGlzLnByb3BlcnRpZXMudmFsdWVzKCkpIHtcbiAgICAgIHByb3BlcnR5LmNsZWFyKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMucGx1Z2luLmxvYWREYXRhKCkgYXMgdW5rbm93bjtcblxuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQgfHwgZGF0YSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgY29uc3QgdHlwZSA9IEFycmF5LmlzQXJyYXkoZGF0YSkgPyAnQXJyYXknIDogdHlwZW9mIGRhdGE7XG4gICAgICBjb25zb2xlLmVycm9yKGBJbnZhbGlkIGRhdGEgdHlwZS4gRXhwZWN0ZWQgT2JqZWN0LCBnb3Q6ICR7dHlwZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmVjb3JkID0gZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBvcmlnaW5hbEpzb24gPSBKU09OLnN0cmluZ2lmeShyZWNvcmQpO1xuICAgIHJlY29yZCA9IHRoaXMuZ2V0VHJhbnNmb3JtZXIoKS50cmFuc2Zvcm1PYmplY3RSZWN1cnNpdmVseShyZWNvcmQpO1xuICAgIGF3YWl0IHRoaXMucHJlcGFyZVJlY29yZChyZWNvcmQpO1xuXG4gICAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkKSkge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLnByb3BlcnRpZXMuZ2V0KHByb3BlcnR5TmFtZSk7XG4gICAgICBpZiAoIXByb3BlcnR5KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgVW5rbm93biBwcm9wZXJ0eTogJHtwcm9wZXJ0eU5hbWV9YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSB0eXBlb2YgcHJvcGVydHkuZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCB2YWx1ZSB0eXBlJywge1xuICAgICAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgICAgICBwcm9wZXJ0eVR5cGU6IHR5cGVvZiBwcm9wZXJ0eS5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBwcm9wZXJ0eS5zZXRWYWx1ZUFuZFZhbGlkYXRlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdKc29uID0gSlNPTi5zdHJpbmdpZnkodGhpcy5wcmVwYXJlUmVjb3JkVG9TYXZlKCkpO1xuXG4gICAgaWYgKG5ld0pzb24gIT09IG9yaWdpbmFsSnNvbikge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlVG9GaWxlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIHRoZSBuZXcgcGx1Z2luIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZXR0aW5ncyBhcmUgc2F2ZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2F2ZVRvRmlsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IHRoaXMuZ2V0U2F2ZWRTZXR0aW5ncygpO1xuXG4gICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgdGhpcy5wcm9wZXJ0aWVzLnZhbHVlcygpKSB7XG4gICAgICBoYXNDaGFuZ2VzIHx8PSBwcm9wZXJ0eS5zYXZlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNDaGFuZ2VzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wcmVwYXJlUmVjb3JkVG9TYXZlKCkpO1xuICAgIGF3YWl0IHRoaXMucGx1Z2luLm9uU2F2ZVNldHRpbmdzKHRoaXMuZ2V0U2F2ZWRTZXR0aW5ncygpLCBvbGRTZXR0aW5ncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkVmFsaWRhdG9yPFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+PihcbiAgICBwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZSxcbiAgICB2YWxpZGF0b3I6IFZhbGlkYXRvcjxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRvcnMuc2V0KHByb3BlcnR5TmFtZSwgdmFsaWRhdG9yKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGRWYWxpZGF0b3JzKCk6IHZvaWQge1xuICAgIG5vb3AoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVEZWZhdWx0U2V0dGluZ3MoKTogUGx1Z2luU2V0dGluZ3M7XG5cbiAgcHJvdGVjdGVkIGdldFRyYW5zZm9ybWVyKCk6IFRyYW5zZm9ybWVyIHtcbiAgICByZXR1cm4gZGVmYXVsdFRyYW5zZm9ybWVyO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByZXBhcmVSZWNvcmQoX3JlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNhYmxlPHZvaWQ+IHtcbiAgICBub29wKCk7XG4gIH1cblxuICBwcml2YXRlIGdldFNhdmVkU2V0dGluZ3MoKTogUGFydGlhbDxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIGNvbnN0IHNhdmVkU2V0dGluZ3M6IFBhcnRpYWw8UGx1Z2luU2V0dGluZ3M+ID0ge307XG4gICAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCBwcm9wZXJ0eV0gb2YgdGhpcy5wcm9wZXJ0aWVzLmVudHJpZXMoKSkge1xuICAgICAgc2F2ZWRTZXR0aW5nc1twcm9wZXJ0eU5hbWUgYXMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5dID0gcHJvcGVydHkuZ2V0TGFzdFNhdmVkVmFsdWUoKSBhcyBQbHVnaW5TZXR0aW5nc1tTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPl0gfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMuZGVmYXVsdFNldHRpbmdzKSBhcyBvYmplY3Q7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHNhdmVkU2V0dGluZ3MsIHByb3RvKTtcbiAgICByZXR1cm4gc2F2ZWRTZXR0aW5ncztcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVJlY29yZFRvU2F2ZSgpOiBSZWNvcmQ8U3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4sIHVua25vd24+IHtcbiAgICBjb25zdCBzZXR0aW5nczogUmVjb3JkPFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+LCB1bmtub3duPiA9IHt9IGFzIFJlY29yZDxTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPiwgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCBwcm9wZXJ0eV0gb2YgdGhpcy5wcm9wZXJ0aWVzLmVudHJpZXMoKSkge1xuICAgICAgc2V0dGluZ3NbcHJvcGVydHlOYW1lIGFzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+XSA9IHByb3BlcnR5LmdldE1vZGlmaWVkVmFsdWUoKSBhcyB1bmtub3duO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldFRyYW5zZm9ybWVyKCkudHJhbnNmb3JtT2JqZWN0UmVjdXJzaXZlbHkoc2V0dGluZ3MpO1xuICB9XG59XG5cbi8qKlxuICogQSBwcm9wZXJ0eSBvZiBhIHBsdWdpbiBzZXR0aW5ncy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PFQ+IHtcbiAgcHVibGljIGdldCB2YWxpZGF0aW9uTWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZTtcbiAgfVxuXG4gIHByaXZhdGUgX3ZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG4gIHByaXZhdGUgbGFzdFNhdmVkVmFsdWU6IFQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgbW9kaWZpZWRWYWx1ZTogVCB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZTogVCwgcHJpdmF0ZSByZWFkb25seSB2YWxpZGF0b3I6IFZhbGlkYXRvcjxUPikge31cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5tb2RpZmllZFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG4gIH1cblxuICBwdWJsaWMgZ2V0TGFzdFNhdmVkVmFsdWUoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdFNhdmVkVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0TW9kaWZpZWRPckRlZmF1bHRWYWx1ZSgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5tb2RpZmllZFZhbHVlID8/IHRoaXMuZGVmYXVsdFZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldE1vZGlmaWVkVmFsdWUoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubW9kaWZpZWRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTYWZlVmFsdWUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlID8gdGhpcy5kZWZhdWx0VmFsdWUgOiB0aGlzLmdldE1vZGlmaWVkT3JEZWZhdWx0VmFsdWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmxhc3RTYXZlZFZhbHVlID09PSB0aGlzLm1vZGlmaWVkVmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmxhc3RTYXZlZFZhbHVlID0gdGhpcy5tb2RpZmllZFZhbHVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHNldFZhbGlkYXRpb25NZXNzYWdlKHZhbGlkYXRpb25NZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZSA9IHZhbGlkYXRpb25NZXNzYWdlO1xuICAgIHRoaXMuc2hvd1dhcm5pbmcoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWYWx1ZSh2YWx1ZTogVCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMubW9kaWZpZWRWYWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNldFZhbHVlQW5kVmFsaWRhdGUodmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnNldFZhbHVlKHZhbHVlKTtcbiAgICBpZiAodGhpcy5tb2RpZmllZFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZSA9IChhd2FpdCB0aGlzLnZhbGlkYXRvcih0aGlzLm1vZGlmaWVkVmFsdWUpIGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gJyc7XG4gICAgdGhpcy5zaG93V2FybmluZyh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIHNob3dXYXJuaW5nKHZhbHVlPzogVCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3YXJuaW5nTWVzc2FnZSA9IGBDb3VsZCBub3Qgc2V0IHBsdWdpbiBzZXR0aW5nOiAke3RoaXMucHJvcGVydHlOYW1lfS4gVXNpbmcgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkLmA7XG4gICAgbmV3IE5vdGljZSh3YXJuaW5nTWVzc2FnZSk7XG4gICAgY29uc29sZS53YXJuKHdhcm5pbmdNZXNzYWdlLCB7XG4gICAgICBkZWZhdWx0VmFsdWU6IHRoaXMuZGVmYXVsdFZhbHVlLFxuICAgICAgcHJvcGVydHlOYW1lOiB0aGlzLnByb3BlcnR5TmFtZSxcbiAgICAgIHZhbGlkYXRpb25NZXNzYWdlOiB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZSxcbiAgICAgIHZhbHVlXG4gICAgfSk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLQSxzQkFBdUI7QUFTdkIsc0JBQXFCO0FBQ3JCLDZCQUFnQztBQUNoQyxpQ0FBb0M7QUFDcEMsOEJBQWlDO0FBQ2pDLDRDQUErQztBQUUvQyxNQUFNLHFCQUFxQixJQUFJLHlDQUFpQjtBQUFBLEVBQzlDLElBQUkscUVBQStCO0FBQUEsRUFDbkMsSUFBSSx1Q0FBZ0I7QUFBQSxFQUNwQixJQUFJLCtDQUFvQjtBQUMxQixDQUFDO0FBSUQsTUFBZSxpQkFBd0Y7QUFBQSxFQUM5RixZQUErQixZQUEyQztBQUEzQztBQUFBLEVBQTRDO0FBQUEsRUFFM0UsSUFBSSxRQUF3QixNQUFnQztBQUNqRSxVQUFNLFNBQVM7QUFDZixRQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzVCLGFBQU8sT0FBTyxJQUFJO0FBQUEsSUFDcEI7QUFFQSxVQUFNLFdBQVcsS0FBSyxXQUFXLElBQUksSUFBSTtBQUN6QyxRQUFJLENBQUMsVUFBVTtBQUNiLGFBQU8sT0FBTyxJQUFJO0FBQUEsSUFDcEI7QUFFQSxXQUFPLEtBQUssaUJBQWlCLFFBQVE7QUFBQSxFQUN2QztBQUdGO0FBRUEsTUFBTSxxQ0FBb0UsaUJBQWlDO0FBQUEsRUFDakcsb0JBQW9CLFFBQVEsUUFBUTtBQUFB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
307
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc01hbmFnZXJCYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIFBsdWdpbiBzZXR0aW5ncyBtYW5hZ2VyIGJhc2UgY2xhc3MuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7XG4gIFByb21pc2FibGUsXG4gIFJlYWRvbmx5RGVlcFxufSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL1RyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgTWF5YmVSZXR1cm4sXG4gIFN0cmluZ0tleXNcbn0gZnJvbSAnLi4vLi4vVHlwZS50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEV4dHJhY3RQbHVnaW4sXG4gIEV4dHJhY3RQbHVnaW5TZXR0aW5ncyxcbiAgUGx1Z2luVHlwZXNCYXNlXG59IGZyb20gJy4vUGx1Z2luVHlwZXNCYXNlLnRzJztcblxuaW1wb3J0IHtcbiAgbm9vcCxcbiAgbm9vcEFzeW5jXG59IGZyb20gJy4uLy4uL0Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IGdldEFsbEtleXMgfSBmcm9tICcuLi8uLi9PYmplY3QudHMnO1xuaW1wb3J0IHsgRGF0ZVRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL0RhdGVUcmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBEdXJhdGlvblRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL0R1cmF0aW9uVHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgR3JvdXBUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL1RyYW5zZm9ybWVycy9Hcm91cFRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IFNraXBQcml2YXRlUHJvcGVydHlUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL1RyYW5zZm9ybWVycy9Ta2lwUHJpdmF0ZVByb3BlcnR5VHJhbnNmb3JtZXIudHMnO1xuXG5jb25zdCBkZWZhdWx0VHJhbnNmb3JtZXIgPSBuZXcgR3JvdXBUcmFuc2Zvcm1lcihbXG4gIG5ldyBTa2lwUHJpdmF0ZVByb3BlcnR5VHJhbnNmb3JtZXIoKSxcbiAgbmV3IERhdGVUcmFuc2Zvcm1lcigpLFxuICBuZXcgRHVyYXRpb25UcmFuc2Zvcm1lcigpXG5dKTtcblxudHlwZSBWYWxpZGF0b3I8VD4gPSAodmFsdWU6IFQpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbmFic3RyYWN0IGNsYXNzIFByb3h5SGFuZGxlckJhc2U8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGltcGxlbWVudHMgUHJveHlIYW5kbGVyPFBsdWdpblNldHRpbmdzPiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcGVydGllczogUHJvcGVydGllc01hcDxQbHVnaW5TZXR0aW5ncz4pIHt9XG5cbiAgcHVibGljIGdldCh0YXJnZXQ6IFBsdWdpblNldHRpbmdzLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiB1bmtub3duIHtcbiAgICBjb25zdCByZWNvcmQgPSB0YXJnZXQgYXMgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj47XG4gICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHJlY29yZFtwcm9wXTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucHJvcGVydGllcy5nZXQocHJvcCk7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIHJlY29yZFtwcm9wXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5OiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PHVua25vd24+KTogdW5rbm93bjtcbn1cblxuY2xhc3MgRWRpdGFibGVTZXR0aW5nc1Byb3h5SGFuZGxlcjxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBQcm94eUhhbmRsZXJCYXNlPFBsdWdpblNldHRpbmdzPiB7XG4gIHByaXZhdGUgdmFsaWRhdGlvblByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgcHVibGljIHNldCh0YXJnZXQ6IFBsdWdpblNldHRpbmdzLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVjb3JkID0gdGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+O1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmVjb3JkW3Byb3BdID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucHJvcGVydGllcy5nZXQocHJvcCk7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgcmVjb3JkW3Byb3BdID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgdGhpcy52YWxpZGF0aW9uUHJvbWlzZSA9IHRoaXMudmFsaWRhdGlvblByb21pc2UudGhlbigoKSA9PiBwcm9wZXJ0eS5zZXRWYWx1ZUFuZFZhbGlkYXRlKHZhbHVlKSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5OiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PHVua25vd24+KTogdW5rbm93biB7XG4gICAgcmV0dXJuIHByb3BlcnR5LmN1cnJlbnRWYWx1ZTtcbiAgfVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuY2xhc3MgUHJvcGVydGllc01hcDxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBNYXA8c3RyaW5nLCBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PGFueT4+IHtcbiAgcHVibGljIGdldFR5cGVkPFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+Pihwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZSk6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8UGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXT4ge1xuICAgIGNvbnN0IHByb3BlcnR5ID0gc3VwZXIuZ2V0KHByb3BlcnR5TmFtZSk7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9wZXJ0eSAke1N0cmluZyhwcm9wZXJ0eU5hbWUpfSBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcGVydHkgYXMgUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRUeXBlZDxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPj4oXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgdmFsdWU6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8UGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXT5cbiAgKTogdGhpcyB7XG4gICAgcmV0dXJuIHN1cGVyLnNldChwcm9wZXJ0eU5hbWUsIHZhbHVlKTtcbiAgfVxufVxuXG5jbGFzcyBTYWZlU2V0dGluZ3NQcm94eUhhbmRsZXI8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgUHJveHlIYW5kbGVyQmFzZTxQbHVnaW5TZXR0aW5ncz4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eTogUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTx1bmtub3duPik6IHVua25vd24ge1xuICAgIHJldHVybiBwcm9wZXJ0eS5zYWZlVmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBtYW5hZ2luZyBwbHVnaW4gc2V0dGluZ3MuXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIHJlcHJlc2VudGluZyB0aGUgcGx1Z2luIHNldHRpbmdzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpblNldHRpbmdzTWFuYWdlckJhc2U8UGx1Z2luVHlwZXMgZXh0ZW5kcyBQbHVnaW5UeXBlc0Jhc2U+IHtcbiAgcHVibGljIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwdWJsaWMgcmVhZG9ubHkgc2FmZVNldHRpbmdzOiBSZWFkb25seURlZXA8RXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPj47XG5cbiAgcHJpdmF0ZSBkZWZhdWx0U2V0dGluZ3M6IEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz47XG4gIHByaXZhdGUgcHJvcGVydGllczogUHJvcGVydGllc01hcDxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+PjtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSB2YWxpZGF0b3JzOiBNYXA8c3RyaW5nLCBWYWxpZGF0b3I8YW55Pj4gPSBuZXcgTWFwPHN0cmluZywgVmFsaWRhdG9yPGFueT4+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBwbHVnaW46IEV4dHJhY3RQbHVnaW48UGx1Z2luVHlwZXM+KSB7XG4gICAgdGhpcy5hcHAgPSBwbHVnaW4uYXBwO1xuICAgIHRoaXMuZGVmYXVsdFNldHRpbmdzID0gdGhpcy5jcmVhdGVEZWZhdWx0U2V0dGluZ3MoKTtcblxuICAgIHRoaXMucmVnaXN0ZXJWYWxpZGF0b3JzKCk7XG5cbiAgICB0aGlzLnByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllc01hcDxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+PigpO1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgZ2V0QWxsS2V5cyh0aGlzLmRlZmF1bHRTZXR0aW5ncykpIHtcbiAgICAgIHRoaXMucHJvcGVydGllcy5zZXQoXG4gICAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgICAgbmV3IFBsdWdpblNldHRpbmdzUHJvcGVydHkocHJvcGVydHlOYW1lLCB0aGlzLmRlZmF1bHRTZXR0aW5nc1twcm9wZXJ0eU5hbWVdLCB0aGlzLnZhbGlkYXRvcnMuZ2V0KHByb3BlcnR5TmFtZSkgPz8gbm9vcClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy52YWxpZGF0b3JzLmNsZWFyKCk7XG5cbiAgICB0aGlzLnNhZmVTZXR0aW5ncyA9IG5ldyBQcm94eSh0aGlzLmRlZmF1bHRTZXR0aW5ncywgbmV3IFNhZmVTZXR0aW5nc1Byb3h5SGFuZGxlcjxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+Pih0aGlzLnByb3BlcnRpZXMpKSBhcyBSZWFkb25seURlZXA8XG4gICAgICBFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+XG4gICAgPjtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBlZGl0QW5kU2F2ZShlZGl0b3I6IChzZXR0aW5nczogRXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPikgPT4gUHJvbWlzYWJsZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGVkaXRhYmxlU2V0dGluZ3MgPSBuZXcgUHJveHkodGhpcy5kZWZhdWx0U2V0dGluZ3MsIG5ldyBFZGl0YWJsZVNldHRpbmdzUHJveHlIYW5kbGVyPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz4+KHRoaXMucHJvcGVydGllcykpIGFzIHtcbiAgICAgIHZhbGlkYXRpb25Qcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICAgIH0gJiBFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+O1xuICAgIGF3YWl0IGVkaXRvcihlZGl0YWJsZVNldHRpbmdzKTtcbiAgICBhd2FpdCBlZGl0YWJsZVNldHRpbmdzLnZhbGlkYXRpb25Qcm9taXNlO1xuICAgIGF3YWl0IHRoaXMuc2F2ZVRvRmlsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldFByb3BlcnR5PFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPj4+KFxuICAgIHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lXG4gICk6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8RXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPltQcm9wZXJ0eU5hbWVdPiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXRUeXBlZChwcm9wZXJ0eU5hbWUpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWRGcm9tRmlsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHRoaXMucHJvcGVydGllcy52YWx1ZXMoKSkge1xuICAgICAgcHJvcGVydHkucmVzZXQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5wbHVnaW4ubG9hZERhdGEoKSBhcyB1bmtub3duO1xuXG4gICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCB8fCBkYXRhID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBjb25zdCB0eXBlID0gQXJyYXkuaXNBcnJheShkYXRhKSA/ICdBcnJheScgOiB0eXBlb2YgZGF0YTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgZGF0YSB0eXBlLiBFeHBlY3RlZCBPYmplY3QsIGdvdDogJHt0eXBlfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCByZWNvcmQgPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IG9yaWdpbmFsSnNvbiA9IEpTT04uc3RyaW5naWZ5KHJlY29yZCk7XG4gICAgcmVjb3JkID0gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybU9iamVjdFJlY3Vyc2l2ZWx5KHJlY29yZCk7XG4gICAgYXdhaXQgdGhpcy5vbkxvYWRSZWNvcmQocmVjb3JkKTtcblxuICAgIGNvbnN0IHByb3BlcnRpZXNUb1NhdmU6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8dW5rbm93bj5bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkKSkge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLnByb3BlcnRpZXMuZ2V0KHByb3BlcnR5TmFtZSk7XG4gICAgICBpZiAoIXByb3BlcnR5KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgVW5rbm93biBwcm9wZXJ0eTogJHtwcm9wZXJ0eU5hbWV9YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSB0eXBlb2YgcHJvcGVydHkuZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCB2YWx1ZSB0eXBlJywge1xuICAgICAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgICAgICBwcm9wZXJ0eVR5cGU6IHR5cGVvZiBwcm9wZXJ0eS5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICBwcm9wZXJ0aWVzVG9TYXZlLnB1c2gocHJvcGVydHkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllc1RvU2F2ZSkge1xuICAgICAgYXdhaXQgcHJvcGVydHkuc2V0VmFsdWVBbmRWYWxpZGF0ZShwcm9wZXJ0eS5jdXJyZW50VmFsdWUpO1xuICAgICAgcHJvcGVydHkuc2F2ZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0pzb24gPSBKU09OLnN0cmluZ2lmeShhd2FpdCB0aGlzLnByZXBhcmVSZWNvcmRUb1NhdmUoKSk7XG5cbiAgICBpZiAobmV3SnNvbiAhPT0gb3JpZ2luYWxKc29uKSB7XG4gICAgICBhd2FpdCB0aGlzLnNhdmVUb0ZpbGVJbXBsKCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5wbHVnaW4ub25Mb2FkU2V0dGluZ3ModGhpcy5nZXRTYXZlZFNldHRpbmdzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIHRoZSBuZXcgcGx1Z2luIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSBzYXZlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzYXZlVG9GaWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0gdGhpcy5nZXRTYXZlZFNldHRpbmdzKCk7XG5cbiAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiB0aGlzLnByb3BlcnRpZXMudmFsdWVzKCkpIHtcbiAgICAgIGhhc0NoYW5nZXMgfHw9IHByb3BlcnR5LnNhdmUoKTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0NoYW5nZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNhdmVUb0ZpbGVJbXBsKCk7XG4gICAgYXdhaXQgdGhpcy5wbHVnaW4ub25TYXZlU2V0dGluZ3ModGhpcy5nZXRTYXZlZFNldHRpbmdzKCksIG9sZFNldHRpbmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVEZWZhdWx0U2V0dGluZ3MoKTogRXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPjtcblxuICBwcm90ZWN0ZWQgZ2V0VHJhbnNmb3JtZXIoKTogVHJhbnNmb3JtZXIge1xuICAgIHJldHVybiBkZWZhdWx0VHJhbnNmb3JtZXI7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBzZXR0aW5ncyBhcmUgbG9hZGVkLlxuICAgKlxuICAgKiBAcGFyYW0gX3JlY29yZCAtIFRoZSByZWNvcmQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25Mb2FkUmVjb3JkKF9yZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBzZXR0aW5ncyBhcmUgc2F2aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gX3JlY29yZCAtIFRoZSByZWNvcmQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25TYXZpbmdSZWNvcmQoX3JlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBub29wQXN5bmMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWdpc3RlclZhbGlkYXRvcjxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz4+PihcbiAgICBwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZSxcbiAgICB2YWxpZGF0b3I6IFZhbGlkYXRvcjxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+W1Byb3BlcnR5TmFtZV0+XG4gICk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdG9ycy5zZXQocHJvcGVydHlOYW1lLCB2YWxpZGF0b3IpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyVmFsaWRhdG9ycygpOiB2b2lkIHtcbiAgICBub29wKCk7XG4gIH1cblxuICBwcml2YXRlIGdldFNhdmVkU2V0dGluZ3MoKTogRXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPiB7XG4gICAgY29uc3Qgc2F2ZWRTZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eU5hbWUsIHByb3BlcnR5XSBvZiB0aGlzLnByb3BlcnRpZXMuZW50cmllcygpKSB7XG4gICAgICBzYXZlZFNldHRpbmdzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eS5sYXN0U2F2ZWRWYWx1ZSBhc1xuICAgICAgICB8IEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz5bU3RyaW5nS2V5czxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+Pl1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMuZGVmYXVsdFNldHRpbmdzKSBhcyBvYmplY3Q7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHNhdmVkU2V0dGluZ3MsIHByb3RvKTtcblxuICAgIHJldHVybiBzYXZlZFNldHRpbmdzIGFzIEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz47XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVSZWNvcmRUb1NhdmUoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICAgIGNvbnN0IHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW3Byb3BlcnR5TmFtZSwgcHJvcGVydHldIG9mIHRoaXMucHJvcGVydGllcy5lbnRyaWVzKCkpIHtcbiAgICAgIHNldHRpbmdzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eS5jdXJyZW50VmFsdWUgYXMgdW5rbm93bjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLm9uU2F2aW5nUmVjb3JkKHNldHRpbmdzKTtcblxuICAgIHJldHVybiB0aGlzLmdldFRyYW5zZm9ybWVyKCkudHJhbnNmb3JtT2JqZWN0UmVjdXJzaXZlbHkoc2V0dGluZ3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzYXZlVG9GaWxlSW1wbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YShhd2FpdCB0aGlzLnByZXBhcmVSZWNvcmRUb1NhdmUoKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHByb3BlcnR5IG9mIGEgcGx1Z2luIHNldHRpbmdzLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpblNldHRpbmdzUHJvcGVydHk8VD4ge1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRWYWx1ZSgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBsYXN0U2F2ZWRWYWx1ZSgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fbGFzdFNhdmVkVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNhZmVWYWx1ZSgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2UgPyB0aGlzLmRlZmF1bHRWYWx1ZSA6IHRoaXMuX2N1cnJlbnRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmFsaWRhdGlvbk1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2U7XG4gIH1cblxuICBwcml2YXRlIF9jdXJyZW50VmFsdWU6IFQ7XG5cbiAgcHJpdmF0ZSBfbGFzdFNhdmVkVmFsdWU6IFQ7XG5cbiAgcHJpdmF0ZSBfdmFsaWRhdGlvbk1lc3NhZ2UgPSAnJztcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZTogVCwgcHJpdmF0ZSByZWFkb25seSB2YWxpZGF0b3I6IFZhbGlkYXRvcjxUPikge1xuICAgIHRoaXMuX2xhc3RTYXZlZFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgIHRoaXMuX2N1cnJlbnRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJyZW50VmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZTtcbiAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuICB9XG5cbiAgcHVibGljIHNhdmUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2xhc3RTYXZlZFZhbHVlID09PSB0aGlzLl9jdXJyZW50VmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9sYXN0U2F2ZWRWYWx1ZSA9IHRoaXMuX2N1cnJlbnRWYWx1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWYWxpZGF0aW9uTWVzc2FnZSh2YWxpZGF0aW9uTWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2UgPSB2YWxpZGF0aW9uTWVzc2FnZTtcbiAgICB0aGlzLnNob3dXYXJuaW5nKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0VmFsdWUodmFsdWU6IFQpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJyZW50VmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzZXRWYWx1ZUFuZFZhbGlkYXRlKHZhbHVlOiBUKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlID0gKGF3YWl0IHRoaXMudmFsaWRhdG9yKHRoaXMuX2N1cnJlbnRWYWx1ZSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/PyAnJztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignVmFsaWRhdGlvbiBmYWlsZWQnLCB7XG4gICAgICAgIHByb3BlcnR5TmFtZTogdGhpcy5wcm9wZXJ0eU5hbWUsXG4gICAgICAgIHZhbHVlXG4gICAgICB9LCBlcnJvcik7XG4gICAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZSA9ICdWYWxpZGF0aW9uIGZhaWxlZCc7XG4gICAgfVxuICAgIHRoaXMuc2hvd1dhcm5pbmcodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93V2FybmluZyh2YWx1ZT86IFQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS53YXJuKGBDb3VsZCBub3Qgc2V0IHBsdWdpbiBzZXR0aW5nOiAke3RoaXMucHJvcGVydHlOYW1lfS4gVXNpbmcgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkLmAsIHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogdGhpcy5kZWZhdWx0VmFsdWUsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHRoaXMucHJvcGVydHlOYW1lLFxuICAgICAgdmFsaWRhdGlvbk1lc3NhZ2U6IHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlLFxuICAgICAgdmFsdWVcbiAgICB9KTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXVCQSxzQkFHTztBQUNQLG9CQUEyQjtBQUMzQiw2QkFBZ0M7QUFDaEMsaUNBQW9DO0FBQ3BDLDhCQUFpQztBQUNqQyw0Q0FBK0M7QUFFL0MsTUFBTSxxQkFBcUIsSUFBSSx5Q0FBaUI7QUFBQSxFQUM5QyxJQUFJ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
@@ -1,36 +1,55 @@
1
+ /**
2
+ * @packageDocumentation
3
+ *
4
+ * Plugin settings manager base class.
5
+ */
6
+ import type { App } from 'obsidian';
1
7
  import type { Promisable, ReadonlyDeep } from 'type-fest';
2
- import type { MaybeReturn, StringKeys } from '../../Object.cjs';
3
8
  import type { Transformer } from '../../Transformers/Transformer.cjs';
4
- import type { PluginBase } from './PluginBase.cjs';
9
+ import type { MaybeReturn, StringKeys } from '../../Type.cjs';
10
+ import type { ExtractPlugin, ExtractPluginSettings, PluginTypesBase } from './PluginTypesBase.cjs';
5
11
  type Validator<T> = (value: T) => Promisable<MaybeReturn<string>>;
6
12
  /**
7
13
  * Base class for managing plugin settings.
8
14
  *
9
15
  * @typeParam PluginSettings - The type representing the plugin settings object.
10
16
  */
11
- export declare abstract class PluginSettingsManagerBase<PluginSettings extends object> {
12
- private plugin;
13
- readonly safeSettings: ReadonlyDeep<PluginSettings>;
17
+ export declare abstract class PluginSettingsManagerBase<PluginTypes extends PluginTypesBase> {
18
+ readonly plugin: ExtractPlugin<PluginTypes>;
19
+ readonly app: App;
20
+ readonly safeSettings: ReadonlyDeep<ExtractPluginSettings<PluginTypes>>;
14
21
  private defaultSettings;
15
22
  private properties;
16
23
  private validators;
17
- constructor(plugin: PluginBase<PluginSettings>);
18
- editAndSave(editor: (settings: PluginSettings) => Promisable<void>): Promise<void>;
19
- getProperty<PropertyName extends StringKeys<PluginSettings>>(propertyName: PropertyName): PluginSettingsProperty<PluginSettings[PropertyName]>;
24
+ constructor(plugin: ExtractPlugin<PluginTypes>);
25
+ editAndSave(editor: (settings: ExtractPluginSettings<PluginTypes>) => Promisable<void>): Promise<void>;
26
+ getProperty<PropertyName extends StringKeys<ExtractPluginSettings<PluginTypes>>>(propertyName: PropertyName): PluginSettingsProperty<ExtractPluginSettings<PluginTypes>[PropertyName]>;
20
27
  loadFromFile(): Promise<void>;
21
28
  /**
22
29
  * Saves the new plugin settings.
23
30
  *
24
- * @returns A promise that resolves when the settings are saved.
31
+ * @returns A {@link Promise} that resolves when the settings are saved.
25
32
  */
26
33
  saveToFile(): Promise<void>;
27
- protected addValidator<PropertyName extends StringKeys<PluginSettings>>(propertyName: PropertyName, validator: Validator<PluginSettings[PropertyName]>): void;
28
- protected addValidators(): void;
29
- protected abstract createDefaultSettings(): PluginSettings;
34
+ protected abstract createDefaultSettings(): ExtractPluginSettings<PluginTypes>;
30
35
  protected getTransformer(): Transformer;
31
- protected prepareRecord(_record: Record<string, unknown>): Promisable<void>;
36
+ /**
37
+ * Called when the plugin settings are loaded.
38
+ *
39
+ * @param _record - The record.
40
+ */
41
+ protected onLoadRecord(_record: Record<string, unknown>): Promise<void>;
42
+ /**
43
+ * Called when the plugin settings are saving.
44
+ *
45
+ * @param _record - The record.
46
+ */
47
+ protected onSavingRecord(_record: Record<string, unknown>): Promise<void>;
48
+ protected registerValidator<PropertyName extends StringKeys<ExtractPluginSettings<PluginTypes>>>(propertyName: PropertyName, validator: Validator<ExtractPluginSettings<PluginTypes>[PropertyName]>): void;
49
+ protected registerValidators(): void;
32
50
  private getSavedSettings;
33
51
  private prepareRecordToSave;
52
+ private saveToFileImpl;
34
53
  }
35
54
  /**
36
55
  * A property of a plugin settings.
@@ -41,19 +60,18 @@ export declare class PluginSettingsProperty<T> {
41
60
  private readonly propertyName;
42
61
  readonly defaultValue: T;
43
62
  private readonly validator;
63
+ get currentValue(): T;
64
+ get lastSavedValue(): T;
65
+ get safeValue(): T;
44
66
  get validationMessage(): string;
67
+ private _currentValue;
68
+ private _lastSavedValue;
45
69
  private _validationMessage;
46
- private lastSavedValue;
47
- private modifiedValue;
48
70
  constructor(propertyName: string, defaultValue: T, validator: Validator<T>);
49
- clear(): void;
50
- getLastSavedValue(): T | undefined;
51
- getModifiedOrDefaultValue(): T;
52
- getModifiedValue(): T | undefined;
53
- getSafeValue(): T;
71
+ reset(): void;
54
72
  save(): boolean;
55
73
  setValidationMessage(validationMessage: string): void;
56
- setValue(value: T | undefined): void;
74
+ setValue(value: T): void;
57
75
  setValueAndValidate(value: T): Promise<void>;
58
76
  private showWarning;
59
77
  }