obsidian-dev-utils 22.1.1-beta.8 → 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 +146 -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 +88 -55
  222. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsManagerBase.d.cts +42 -22
  223. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsTabBase.cjs +29 -13
  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 +42 -22
  465. package/dist/lib/esm/obsidian/Plugin/PluginSettingsManagerBase.mjs +92 -56
  466. package/dist/lib/esm/obsidian/Plugin/PluginSettingsTabBase.d.mts +18 -11
  467. package/dist/lib/esm/obsidian/Plugin/PluginSettingsTabBase.mjs +33 -14
  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,13 +29,12 @@ __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');
37
37
  var import_SkipPrivatePropertyTransformer = require('../../Transformers/SkipPrivatePropertyTransformer.cjs');
38
- var import_ValidationMessage = require('../ValidationMessage.cjs');
39
38
  const defaultTransformer = new import_GroupTransformer.GroupTransformer([
40
39
  new import_SkipPrivatePropertyTransformer.SkipPrivatePropertyTransformer(),
41
40
  new import_DateTransformer.DateTransformer(),
@@ -70,12 +69,12 @@ class EditableSettingsProxyHandler extends ProxyHandlerBase {
70
69
  record[prop] = value;
71
70
  return true;
72
71
  }
73
- property.set(value);
74
- this.validationPromise = this.validationPromise.then(() => property.setAndValidate(value));
72
+ property.setValue(value);
73
+ this.validationPromise = this.validationPromise.then(() => property.setValueAndValidate(value));
75
74
  return true;
76
75
  }
77
76
  getPropertyValue(property) {
78
- return property.get();
77
+ return property.currentValue;
79
78
  }
80
79
  }
81
80
  class PropertiesMap extends Map {
@@ -92,16 +91,17 @@ class PropertiesMap extends Map {
92
91
  }
93
92
  class SafeSettingsProxyHandler extends ProxyHandlerBase {
94
93
  getPropertyValue(property) {
95
- return property.getSafe();
94
+ return property.safeValue;
96
95
  }
97
96
  }
98
97
  class PluginSettingsManagerBase {
99
98
  constructor(plugin) {
100
99
  this.plugin = plugin;
100
+ this.app = plugin.app;
101
101
  this.defaultSettings = this.createDefaultSettings();
102
- this.addValidators();
102
+ this.registerValidators();
103
103
  this.properties = new PropertiesMap();
104
- for (const propertyName of Object.keys(this.defaultSettings)) {
104
+ for (const propertyName of (0, import_Object.getAllKeys)(this.defaultSettings)) {
105
105
  this.properties.set(
106
106
  propertyName,
107
107
  new PluginSettingsProperty(propertyName, this.defaultSettings[propertyName], this.validators.get(propertyName) ?? import_Function.noop)
@@ -110,6 +110,7 @@ class PluginSettingsManagerBase {
110
110
  this.validators.clear();
111
111
  this.safeSettings = new Proxy(this.defaultSettings, new SafeSettingsProxyHandler(this.properties));
112
112
  }
113
+ app;
113
114
  safeSettings;
114
115
  defaultSettings;
115
116
  properties;
@@ -126,7 +127,7 @@ class PluginSettingsManagerBase {
126
127
  }
127
128
  async loadFromFile() {
128
129
  for (const property of this.properties.values()) {
129
- property.clear();
130
+ property.reset();
130
131
  }
131
132
  const data = await this.plugin.loadData();
132
133
  if (data === void 0 || data === null) {
@@ -140,7 +141,8 @@ class PluginSettingsManagerBase {
140
141
  let record = data;
141
142
  const originalJson = JSON.stringify(record);
142
143
  record = this.getTransformer().transformObjectRecursively(record);
143
- await this.prepareRecord(record);
144
+ await this.onLoadRecord(record);
145
+ const propertiesToSave = [];
144
146
  for (const [propertyName, value] of Object.entries(record)) {
145
147
  const property = this.properties.get(propertyName);
146
148
  if (!property) {
@@ -155,17 +157,23 @@ class PluginSettingsManagerBase {
155
157
  });
156
158
  continue;
157
159
  }
158
- await property.setAndValidate(value);
160
+ property.setValue(value);
161
+ propertiesToSave.push(property);
159
162
  }
160
- 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());
161
168
  if (newJson !== originalJson) {
162
- await this.saveToFile();
169
+ await this.saveToFileImpl();
163
170
  }
171
+ await this.plugin.onLoadSettings(this.getSavedSettings());
164
172
  }
165
173
  /**
166
174
  * Saves the new plugin settings.
167
175
  *
168
- * @returns A promise that resolves when the settings are saved.
176
+ * @returns A {@link Promise} that resolves when the settings are saved.
169
177
  */
170
178
  async saveToFile() {
171
179
  const oldSettings = this.getSavedSettings();
@@ -176,89 +184,114 @@ class PluginSettingsManagerBase {
176
184
  if (!hasChanges) {
177
185
  return;
178
186
  }
179
- await this.plugin.saveData(this.prepareRecordToSave());
187
+ await this.saveToFileImpl();
180
188
  await this.plugin.onSaveSettings(this.getSavedSettings(), oldSettings);
181
189
  }
182
- addValidator(propertyName, validator) {
183
- this.validators.set(propertyName, validator);
184
- }
185
- addValidators() {
186
- (0, import_Function.noop)();
187
- }
188
190
  getTransformer() {
189
191
  return defaultTransformer;
190
192
  }
191
- 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() {
192
213
  (0, import_Function.noop)();
193
214
  }
194
215
  getSavedSettings() {
195
216
  const savedSettings = {};
196
217
  for (const [propertyName, property] of this.properties.entries()) {
197
- savedSettings[propertyName] = property.getSaved();
218
+ savedSettings[propertyName] = property.lastSavedValue;
198
219
  }
199
220
  const proto = Object.getPrototypeOf(this.defaultSettings);
200
221
  Object.setPrototypeOf(savedSettings, proto);
201
222
  return savedSettings;
202
223
  }
203
- prepareRecordToSave() {
224
+ async prepareRecordToSave() {
204
225
  const settings = {};
205
226
  for (const [propertyName, property] of this.properties.entries()) {
206
- settings[propertyName] = property.get();
227
+ settings[propertyName] = property.currentValue;
207
228
  }
229
+ await this.onSavingRecord(settings);
208
230
  return this.getTransformer().transformObjectRecursively(settings);
209
231
  }
232
+ async saveToFileImpl() {
233
+ await this.plugin.saveData(await this.prepareRecordToSave());
234
+ }
210
235
  }
211
236
  class PluginSettingsProperty {
212
237
  constructor(propertyName, defaultValue, validator) {
213
238
  this.propertyName = propertyName;
214
239
  this.defaultValue = defaultValue;
215
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;
216
252
  }
217
253
  get validationMessage() {
218
254
  return this._validationMessage;
219
255
  }
256
+ _currentValue;
257
+ _lastSavedValue;
220
258
  _validationMessage = "";
221
- savedValue;
222
- value;
223
- clear() {
224
- this.value = void 0;
259
+ reset() {
260
+ this._currentValue = this.defaultValue;
225
261
  this._validationMessage = "";
226
262
  }
227
- get() {
228
- return this.value ?? this.defaultValue;
229
- }
230
- getSafe() {
231
- return this._validationMessage ? this.defaultValue : this.get();
232
- }
233
- getSaved() {
234
- return this.savedValue;
235
- }
236
263
  save() {
237
- if (this.savedValue === this.value) {
264
+ if (this._lastSavedValue === this._currentValue) {
238
265
  return false;
239
266
  }
240
- this.savedValue = this.value;
267
+ this._lastSavedValue = this._currentValue;
241
268
  return true;
242
269
  }
243
- set(value) {
244
- if ((0, import_ValidationMessage.isValidationMessageHolder)(value)) {
245
- this._validationMessage = value.validationMessage;
246
- } else {
247
- this.value = value;
248
- }
270
+ setValidationMessage(validationMessage) {
271
+ this._validationMessage = validationMessage;
272
+ this.showWarning();
249
273
  }
250
- async setAndValidate(value) {
251
- this.set(value);
252
- if (this.value === void 0) {
253
- return;
274
+ setValue(value) {
275
+ this._currentValue = value;
276
+ }
277
+ async setValueAndValidate(value) {
278
+ this.setValue(value);
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";
254
287
  }
255
- this._validationMessage = await this.validator(this.value) ?? "";
288
+ this.showWarning(value);
289
+ }
290
+ showWarning(value) {
256
291
  if (!this._validationMessage) {
257
292
  return;
258
293
  }
259
- const warningMessage = `Could not set plugin setting: ${this.propertyName}. Using default value instead.`;
260
- new import_obsidian.Notice(warningMessage);
261
- console.warn(warningMessage, {
294
+ console.warn(`Could not set plugin setting: ${this.propertyName}. Using default value instead.`, {
262
295
  defaultValue: this.defaultValue,
263
296
  propertyName: this.propertyName,
264
297
  validationMessage: this._validationMessage,
@@ -271,4 +304,4 @@ class PluginSettingsProperty {
271
304
  PluginSettingsManagerBase,
272
305
  PluginSettingsProperty
273
306
  });
274
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc01hbmFnZXJCYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7XG4gIFByb21pc2FibGUsXG4gIFJlYWRvbmx5RGVlcFxufSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBOb3RpY2UgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWF5YmVSZXR1cm4sXG4gIFN0cmluZ0tleXNcbn0gZnJvbSAnLi4vLi4vT2JqZWN0LnRzJztcbmltcG9ydCB0eXBlIHsgVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi9UcmFuc2Zvcm1lcnMvVHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBWYWxpZGF0aW9uTWVzc2FnZUhvbGRlciB9IGZyb20gJy4uL1ZhbGlkYXRpb25NZXNzYWdlLnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luQmFzZSB9IGZyb20gJy4vUGx1Z2luQmFzZS50cyc7XG5cbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuLi8uLi9GdW5jdGlvbi50cyc7XG5pbXBvcnQgeyBEYXRlVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi9UcmFuc2Zvcm1lcnMvRGF0ZVRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IER1cmF0aW9uVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi9UcmFuc2Zvcm1lcnMvRHVyYXRpb25UcmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBHcm91cFRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL0dyb3VwVHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgU2tpcFByaXZhdGVQcm9wZXJ0eVRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL1NraXBQcml2YXRlUHJvcGVydHlUcmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBpc1ZhbGlkYXRpb25NZXNzYWdlSG9sZGVyIH0gZnJvbSAnLi4vVmFsaWRhdGlvbk1lc3NhZ2UudHMnO1xuXG5jb25zdCBkZWZhdWx0VHJhbnNmb3JtZXIgPSBuZXcgR3JvdXBUcmFuc2Zvcm1lcihbXG4gIG5ldyBTa2lwUHJpdmF0ZVByb3BlcnR5VHJhbnNmb3JtZXIoKSxcbiAgbmV3IERhdGVUcmFuc2Zvcm1lcigpLFxuICBuZXcgRHVyYXRpb25UcmFuc2Zvcm1lcigpXG5dKTtcblxudHlwZSBWYWxpZGF0b3I8VD4gPSAodmFsdWU6IFQpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbmFic3RyYWN0IGNsYXNzIFByb3h5SGFuZGxlckJhc2U8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGltcGxlbWVudHMgUHJveHlIYW5kbGVyPFBsdWdpblNldHRpbmdzPiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcGVydGllczogUHJvcGVydGllc01hcDxQbHVnaW5TZXR0aW5ncz4pIHt9XG5cbiAgcHVibGljIGdldCh0YXJnZXQ6IFBsdWdpblNldHRpbmdzLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiB1bmtub3duIHtcbiAgICBjb25zdCByZWNvcmQgPSB0YXJnZXQgYXMgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj47XG4gICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHJlY29yZFtwcm9wXTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucHJvcGVydGllcy5nZXQocHJvcCk7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIHJlY29yZFtwcm9wXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5OiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PHVua25vd24+KTogdW5rbm93bjtcbn1cblxuY2xhc3MgRWRpdGFibGVTZXR0aW5nc1Byb3h5SGFuZGxlcjxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBQcm94eUhhbmRsZXJCYXNlPFBsdWdpblNldHRpbmdzPiB7XG4gIHByaXZhdGUgdmFsaWRhdGlvblByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgcHVibGljIHNldCh0YXJnZXQ6IFBsdWdpblNldHRpbmdzLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVjb3JkID0gdGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+O1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmVjb3JkW3Byb3BdID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucHJvcGVydGllcy5nZXQocHJvcCk7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgcmVjb3JkW3Byb3BdID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcm9wZXJ0eS5zZXQodmFsdWUpO1xuICAgIHRoaXMudmFsaWRhdGlvblByb21pc2UgPSB0aGlzLnZhbGlkYXRpb25Qcm9taXNlLnRoZW4oKCkgPT4gcHJvcGVydHkuc2V0QW5kVmFsaWRhdGUodmFsdWUpKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldFByb3BlcnR5VmFsdWUocHJvcGVydHk6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8dW5rbm93bj4pOiB1bmtub3duIHtcbiAgICByZXR1cm4gcHJvcGVydHkuZ2V0KCk7XG4gIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNsYXNzIFByb3BlcnRpZXNNYXA8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgTWFwPHN0cmluZywgUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxhbnk+PiB7XG4gIHB1YmxpYyBnZXRUeXBlZDxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPj4ocHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUpOiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0+IHtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IHN1cGVyLmdldChwcm9wZXJ0eU5hbWUpO1xuICAgIGlmICghcHJvcGVydHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgJHtTdHJpbmcocHJvcGVydHlOYW1lKX0gbm90IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BlcnR5IGFzIFBsdWdpblNldHRpbmdzUHJvcGVydHk8UGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXT47XG4gIH1cblxuICBwdWJsaWMgc2V0VHlwZWQ8UHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+KFxuICAgIHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lLFxuICAgIHZhbHVlOiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0+XG4gICk6IHRoaXMge1xuICAgIHJldHVybiBzdXBlci5zZXQocHJvcGVydHlOYW1lLCB2YWx1ZSk7XG4gIH1cbn1cblxuY2xhc3MgU2FmZVNldHRpbmdzUHJveHlIYW5kbGVyPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIFByb3h5SGFuZGxlckJhc2U8UGx1Z2luU2V0dGluZ3M+IHtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldFByb3BlcnR5VmFsdWUocHJvcGVydHk6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8dW5rbm93bj4pOiB1bmtub3duIHtcbiAgICByZXR1cm4gcHJvcGVydHkuZ2V0U2FmZSgpO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgbWFuYWdpbmcgcGx1Z2luIHNldHRpbmdzLlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSByZXByZXNlbnRpbmcgdGhlIHBsdWdpbiBzZXR0aW5ncyBvYmplY3QuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQbHVnaW5TZXR0aW5nc01hbmFnZXJCYXNlPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiB7XG4gIHB1YmxpYyByZWFkb25seSBzYWZlU2V0dGluZ3M6IFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5ncz47XG5cbiAgcHJpdmF0ZSBkZWZhdWx0U2V0dGluZ3M6IFBsdWdpblNldHRpbmdzO1xuICBwcml2YXRlIHByb3BlcnRpZXM6IFByb3BlcnRpZXNNYXA8UGx1Z2luU2V0dGluZ3M+O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHZhbGlkYXRvcnM6IE1hcDxzdHJpbmcsIFZhbGlkYXRvcjxhbnk+PiA9IG5ldyBNYXA8c3RyaW5nLCBWYWxpZGF0b3I8YW55Pj4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBwbHVnaW46IFBsdWdpbkJhc2U8UGx1Z2luU2V0dGluZ3M+KSB7XG4gICAgdGhpcy5kZWZhdWx0U2V0dGluZ3MgPSB0aGlzLmNyZWF0ZURlZmF1bHRTZXR0aW5ncygpO1xuXG4gICAgdGhpcy5hZGRWYWxpZGF0b3JzKCk7XG5cbiAgICB0aGlzLnByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllc01hcDxQbHVnaW5TZXR0aW5ncz4oKTtcblxuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIE9iamVjdC5rZXlzKHRoaXMuZGVmYXVsdFNldHRpbmdzKSBhcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPltdKSB7XG4gICAgICB0aGlzLnByb3BlcnRpZXMuc2V0KFxuICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgIG5ldyBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5KHByb3BlcnR5TmFtZSwgdGhpcy5kZWZhdWx0U2V0dGluZ3NbcHJvcGVydHlOYW1lXSwgdGhpcy52YWxpZGF0b3JzLmdldChwcm9wZXJ0eU5hbWUpID8/IG5vb3ApXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMudmFsaWRhdG9ycy5jbGVhcigpO1xuXG4gICAgdGhpcy5zYWZlU2V0dGluZ3MgPSBuZXcgUHJveHkodGhpcy5kZWZhdWx0U2V0dGluZ3MsIG5ldyBTYWZlU2V0dGluZ3NQcm94eUhhbmRsZXI8UGx1Z2luU2V0dGluZ3M+KHRoaXMucHJvcGVydGllcykpIGFzIFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5ncz47XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZWRpdEFuZFNhdmUoZWRpdG9yOiAoc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZWRpdGFibGVTZXR0aW5ncyA9IG5ldyBQcm94eSh0aGlzLmRlZmF1bHRTZXR0aW5ncywgbmV3IEVkaXRhYmxlU2V0dGluZ3NQcm94eUhhbmRsZXI8UGx1Z2luU2V0dGluZ3M+KHRoaXMucHJvcGVydGllcykpIGFzIHtcbiAgICAgIHZhbGlkYXRpb25Qcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICAgIH0gJiBQbHVnaW5TZXR0aW5ncztcbiAgICBhd2FpdCBlZGl0b3IoZWRpdGFibGVTZXR0aW5ncyk7XG4gICAgYXdhaXQgZWRpdGFibGVTZXR0aW5ncy52YWxpZGF0aW9uUHJvbWlzZTtcbiAgICBhd2FpdCB0aGlzLnNhdmVUb0ZpbGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQcm9wZXJ0eTxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPj4ocHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUpOiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmdldFR5cGVkKHByb3BlcnR5TmFtZSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9hZEZyb21GaWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgdGhpcy5wcm9wZXJ0aWVzLnZhbHVlcygpKSB7XG4gICAgICBwcm9wZXJ0eS5jbGVhcigpO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLnBsdWdpbi5sb2FkRGF0YSgpIGFzIHVua25vd247XG5cbiAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkIHx8IGRhdGEgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBBcnJheS5pc0FycmF5KGRhdGEpID8gJ0FycmF5JyA6IHR5cGVvZiBkYXRhO1xuICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCBkYXRhIHR5cGUuIEV4cGVjdGVkIE9iamVjdCwgZ290OiAke3R5cGV9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJlY29yZCA9IGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3Qgb3JpZ2luYWxKc29uID0gSlNPTi5zdHJpbmdpZnkocmVjb3JkKTtcbiAgICByZWNvcmQgPSB0aGlzLmdldFRyYW5zZm9ybWVyKCkudHJhbnNmb3JtT2JqZWN0UmVjdXJzaXZlbHkocmVjb3JkKTtcbiAgICBhd2FpdCB0aGlzLnByZXBhcmVSZWNvcmQocmVjb3JkKTtcblxuICAgIGZvciAoY29uc3QgW3Byb3BlcnR5TmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCkpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5wcm9wZXJ0aWVzLmdldChwcm9wZXJ0eU5hbWUpO1xuICAgICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFVua25vd24gcHJvcGVydHk6ICR7cHJvcGVydHlOYW1lfWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gdHlwZW9mIHByb3BlcnR5LmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgdmFsdWUgdHlwZScsIHtcbiAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgcHJvcGVydHlUeXBlOiB0eXBlb2YgcHJvcGVydHkuZGVmYXVsdFZhbHVlLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgcHJvcGVydHkuc2V0QW5kVmFsaWRhdGUodmFsdWUpO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0pzb24gPSBKU09OLnN0cmluZ2lmeSh0aGlzLnByZXBhcmVSZWNvcmRUb1NhdmUoKSk7XG5cbiAgICBpZiAobmV3SnNvbiAhPT0gb3JpZ2luYWxKc29uKSB7XG4gICAgICBhd2FpdCB0aGlzLnNhdmVUb0ZpbGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGhlIG5ldyBwbHVnaW4gc2V0dGluZ3MuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSBzYXZlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzYXZlVG9GaWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0gdGhpcy5nZXRTYXZlZFNldHRpbmdzKCk7XG5cbiAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiB0aGlzLnByb3BlcnRpZXMudmFsdWVzKCkpIHtcbiAgICAgIGhhc0NoYW5nZXMgfHw9IHByb3BlcnR5LnNhdmUoKTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0NoYW5nZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnByZXBhcmVSZWNvcmRUb1NhdmUoKSk7XG4gICAgYXdhaXQgdGhpcy5wbHVnaW4ub25TYXZlU2V0dGluZ3ModGhpcy5nZXRTYXZlZFNldHRpbmdzKCksIG9sZFNldHRpbmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGRWYWxpZGF0b3I8UHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+KFxuICAgIHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lLFxuICAgIHZhbGlkYXRvcjogVmFsaWRhdG9yPFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0+XG4gICk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdG9ycy5zZXQocHJvcGVydHlOYW1lLCB2YWxpZGF0b3IpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZFZhbGlkYXRvcnMoKTogdm9pZCB7XG4gICAgbm9vcCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNyZWF0ZURlZmF1bHRTZXR0aW5ncygpOiBQbHVnaW5TZXR0aW5ncztcblxuICBwcm90ZWN0ZWQgZ2V0VHJhbnNmb3JtZXIoKTogVHJhbnNmb3JtZXIge1xuICAgIHJldHVybiBkZWZhdWx0VHJhbnNmb3JtZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJlcGFyZVJlY29yZChfcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2FibGU8dm9pZD4ge1xuICAgIG5vb3AoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2F2ZWRTZXR0aW5ncygpOiBQYXJ0aWFsPFBsdWdpblNldHRpbmdzPiB7XG4gICAgY29uc3Qgc2F2ZWRTZXR0aW5nczogUGFydGlhbDxQbHVnaW5TZXR0aW5ncz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eU5hbWUsIHByb3BlcnR5XSBvZiB0aGlzLnByb3BlcnRpZXMuZW50cmllcygpKSB7XG4gICAgICBzYXZlZFNldHRpbmdzW3Byb3BlcnR5TmFtZSBhcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPl0gPSBwcm9wZXJ0eS5nZXRTYXZlZCgpIGFzIFBsdWdpblNldHRpbmdzW1N0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+XSB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcy5kZWZhdWx0U2V0dGluZ3MpIGFzIG9iamVjdDtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc2F2ZWRTZXR0aW5ncywgcHJvdG8pO1xuICAgIHJldHVybiBzYXZlZFNldHRpbmdzO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlUmVjb3JkVG9TYXZlKCk6IFJlY29yZDxTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPiwgdW5rbm93bj4ge1xuICAgIGNvbnN0IHNldHRpbmdzOiBSZWNvcmQ8U3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4sIHVua25vd24+ID0ge30gYXMgUmVjb3JkPFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+LCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eU5hbWUsIHByb3BlcnR5XSBvZiB0aGlzLnByb3BlcnRpZXMuZW50cmllcygpKSB7XG4gICAgICBzZXR0aW5nc1twcm9wZXJ0eU5hbWUgYXMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5dID0gcHJvcGVydHkuZ2V0KCkgYXMgdW5rbm93bjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybU9iamVjdFJlY3Vyc2l2ZWx5KHNldHRpbmdzKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgcHJvcGVydHkgb2YgYSBwbHVnaW4gc2V0dGluZ3MuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5LlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxUPiB7XG4gIHB1YmxpYyBnZXQgdmFsaWRhdGlvbk1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2U7XG4gIH1cblxuICBwcml2YXRlIF92YWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuXG4gIHByaXZhdGUgc2F2ZWRWYWx1ZTogVCB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHZhbHVlOiBUIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZTogVCwgcHJpdmF0ZSByZWFkb25seSB2YWxpZGF0b3I6IFZhbGlkYXRvcjxUPikge31cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuICB9XG5cbiAgcHVibGljIGdldCgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZSA/PyB0aGlzLmRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTYWZlKCk6IFQge1xuICAgIHJldHVybiB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZSA/IHRoaXMuZGVmYXVsdFZhbHVlIDogdGhpcy5nZXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTYXZlZCgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zYXZlZFZhbHVlO1xuICB9XG5cbiAgcHVibGljIHNhdmUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc2F2ZWRWYWx1ZSA9PT0gdGhpcy52YWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuc2F2ZWRWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgc2V0KHZhbHVlOiBUIHwgdW5kZWZpbmVkIHwgVmFsaWRhdGlvbk1lc3NhZ2VIb2xkZXIpOiB2b2lkIHtcbiAgICBpZiAoaXNWYWxpZGF0aW9uTWVzc2FnZUhvbGRlcih2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlID0gdmFsdWUudmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0QW5kVmFsaWRhdGUodmFsdWU6IFQgfCB1bmRlZmluZWQgfCBWYWxpZGF0aW9uTWVzc2FnZUhvbGRlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2V0KHZhbHVlKTtcbiAgICBpZiAodGhpcy52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2UgPSAoYXdhaXQgdGhpcy52YWxpZGF0b3IodGhpcy52YWx1ZSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/PyAnJztcblxuICAgIGlmICghdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3YXJuaW5nTWVzc2FnZSA9IGBDb3VsZCBub3Qgc2V0IHBsdWdpbiBzZXR0aW5nOiAke3RoaXMucHJvcGVydHlOYW1lfS4gVXNpbmcgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkLmA7XG4gICAgbmV3IE5vdGljZSh3YXJuaW5nTWVzc2FnZSk7XG4gICAgY29uc29sZS53YXJuKHdhcm5pbmdNZXNzYWdlLCB7XG4gICAgICBkZWZhdWx0VmFsdWU6IHRoaXMuZGVmYXVsdFZhbHVlLFxuICAgICAgcHJvcGVydHlOYW1lOiB0aGlzLnByb3BlcnR5TmFtZSxcbiAgICAgIHZhbGlkYXRpb25NZXNzYWdlOiB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZSxcbiAgICAgIHZhbHVlXG4gICAgfSk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLQSxzQkFBdUI7QUFVdkIsc0JBQXFCO0FBQ3JCLDZCQUFnQztBQUNoQyxpQ0FBb0M7QUFDcEMsOEJBQWlDO0FBQ2pDLDRDQUErQztBQUMvQywrQkFBMEM7QUFFMUMsTUFBTSxxQkFBcUIsSUFBSSx5Q0FBaUI7QUFBQSxFQUM5QyxJQUFJLHFFQUErQjtBQUFBLEVBQ25DLElBQUksdUNBQWdCO0FBQUEsRUFDcEIsSUFBSSwrQ0FBb0I7QUFDMUIsQ0FBQztBQUlELE1BQWUsaUJBQXdGO0FBQUEsRUFDOUYsWUFBK0IsWUFBMkM7QUFBM0M7QUFBQSxFQUE0QztBQUFBLEVBRTNFLElBQUksUUFBd0IsTUFBZ0M7QUFDakUsVUFBTSxTQUFTO0FBQ2YsUUFBSSxPQUFPLFNBQVMsVUFBVTtBQUM1QixhQUFPLE9BQU8sSUFBSTtBQUFBLElBQ3BCO0FBRUEsVUFBTSxXQUFXLEtBQUssV0FBVyxJQUFJLElBQUk7QUFDekMsUUFBSSxDQUFDLFVBQVU7QUFDYixhQUFPLE9BQU8sSUFBSTtBQUFBLElBQ3BCO0FBRUEsV0FBTyxLQUFLLGlCQUFpQixRQUFRO0FBQUEsRUFDdkM7QUFHRjtBQUVBLE1BQU0scUNBQW9FLGlCQUFpQztBQUFBLEVBQ2pHLG9CQUFvQixRQUFRLFFBQVE7QUFBQSxFQUNyQyxJQUFJLFFBQXdCLE1BQXVCLE9BQXlCO0FBQ2pGLFVBQU0sU0FBUztBQUVmLFFBQUksT0FBTyxTQUFTLFVBQVU7QUFDNUIsYUFBTyxJQUFJLElBQUk7QUFDZixhQUFPO0FBQUEsSUFDVDtBQUVBLFVBQU0sV0FBVyxLQUFLLFdBQVcsSUFBSSxJQUFJO0FBQ3pDLFFBQUksQ0FBQyxVQUFVO0FBQ2IsYUFBTyxJ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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,37 +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 { ValidationMessageHolder } from '../ValidationMessage.cjs';
5
- import type { PluginBase } from './PluginBase.cjs';
9
+ import type { MaybeReturn, StringKeys } from '../../Type.cjs';
10
+ import type { ExtractPlugin, ExtractPluginSettings, PluginTypesBase } from './PluginTypesBase.cjs';
6
11
  type Validator<T> = (value: T) => Promisable<MaybeReturn<string>>;
7
12
  /**
8
13
  * Base class for managing plugin settings.
9
14
  *
10
15
  * @typeParam PluginSettings - The type representing the plugin settings object.
11
16
  */
12
- export declare abstract class PluginSettingsManagerBase<PluginSettings extends object> {
13
- private plugin;
14
- 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>>;
15
21
  private defaultSettings;
16
22
  private properties;
17
23
  private validators;
18
- constructor(plugin: PluginBase<PluginSettings>);
19
- editAndSave(editor: (settings: PluginSettings) => Promisable<void>): Promise<void>;
20
- 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]>;
21
27
  loadFromFile(): Promise<void>;
22
28
  /**
23
29
  * Saves the new plugin settings.
24
30
  *
25
- * @returns A promise that resolves when the settings are saved.
31
+ * @returns A {@link Promise} that resolves when the settings are saved.
26
32
  */
27
33
  saveToFile(): Promise<void>;
28
- protected addValidator<PropertyName extends StringKeys<PluginSettings>>(propertyName: PropertyName, validator: Validator<PluginSettings[PropertyName]>): void;
29
- protected addValidators(): void;
30
- protected abstract createDefaultSettings(): PluginSettings;
34
+ protected abstract createDefaultSettings(): ExtractPluginSettings<PluginTypes>;
31
35
  protected getTransformer(): Transformer;
32
- 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;
33
50
  private getSavedSettings;
34
51
  private prepareRecordToSave;
52
+ private saveToFileImpl;
35
53
  }
36
54
  /**
37
55
  * A property of a plugin settings.
@@ -42,17 +60,19 @@ export declare class PluginSettingsProperty<T> {
42
60
  private readonly propertyName;
43
61
  readonly defaultValue: T;
44
62
  private readonly validator;
63
+ get currentValue(): T;
64
+ get lastSavedValue(): T;
65
+ get safeValue(): T;
45
66
  get validationMessage(): string;
67
+ private _currentValue;
68
+ private _lastSavedValue;
46
69
  private _validationMessage;
47
- private savedValue;
48
- private value;
49
70
  constructor(propertyName: string, defaultValue: T, validator: Validator<T>);
50
- clear(): void;
51
- get(): T;
52
- getSafe(): T;
53
- getSaved(): T | undefined;
71
+ reset(): void;
54
72
  save(): boolean;
55
- set(value: T | undefined | ValidationMessageHolder): void;
56
- setAndValidate(value: T | undefined | ValidationMessageHolder): Promise<void>;
73
+ setValidationMessage(validationMessage: string): void;
74
+ setValue(value: T): void;
75
+ setValueAndValidate(value: T): Promise<void>;
76
+ private showWarning;
57
77
  }
58
78
  export {};