@mnaoumov/obsidian-lib 10.11.0 → 11.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 (460) hide show
  1. package/README.md +26 -0
  2. package/components/all-windows-status-bar-item-component/package.json +6 -0
  3. package/components/shared-component-pool-component/package.json +6 -0
  4. package/components/worker-component/package.json +6 -0
  5. package/components/worker-pool-component/package.json +6 -0
  6. package/components/workspace-layout-state-component/package.json +6 -0
  7. package/dist/lib/cjs/__merged.cjs +477 -285
  8. package/dist/lib/cjs/__merged.d.cts +26 -10
  9. package/dist/lib/cjs/anchored-suggest.cjs +1 -1
  10. package/dist/lib/cjs/app.cjs +2 -2
  11. package/dist/lib/cjs/async-with-notice.cjs +4 -4
  12. package/dist/lib/cjs/attachment-path.cjs +9 -9
  13. package/dist/lib/cjs/attachment-path.d.cts +3 -3
  14. package/dist/lib/cjs/attachment-unit-folder.cjs +2 -2
  15. package/dist/lib/cjs/backlink-index.cjs +5 -5
  16. package/dist/lib/cjs/backlink.cjs +7 -7
  17. package/dist/lib/cjs/bases-view-registrar.cjs +1 -1
  18. package/dist/lib/cjs/broken-link-candidates.cjs +1 -1
  19. package/dist/lib/cjs/bug-report-diagnostics.cjs +222 -0
  20. package/dist/lib/cjs/bug-report-diagnostics.d.cts +186 -0
  21. package/dist/lib/cjs/bug-report.cjs +38 -12
  22. package/dist/lib/cjs/bug-report.d.cts +65 -0
  23. package/dist/lib/cjs/bulk-operation-progress.cjs +1 -1
  24. package/dist/lib/cjs/bulk-operation.cjs +2 -2
  25. package/dist/lib/cjs/callout.cjs +6 -6
  26. package/dist/lib/cjs/canvas.cjs +11 -9
  27. package/dist/lib/cjs/canvas.d.cts +13 -0
  28. package/dist/lib/cjs/case-insensitive-file-index.cjs +3 -3
  29. package/dist/lib/cjs/code-block-render-handoff.cjs +5 -5
  30. package/dist/lib/cjs/codemirror/editor-mode-extension.cjs +4 -4
  31. package/dist/lib/cjs/codemirror/incremental-parse-state-field.cjs +2 -2
  32. package/dist/lib/cjs/codemirror/index.cjs +7 -7
  33. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +5 -5
  34. package/dist/lib/cjs/codemirror/markdown-editor-views.cjs +2 -2
  35. package/dist/lib/cjs/codemirror/settings-facet.cjs +1 -1
  36. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +17 -17
  37. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.d.cts +13 -13
  38. package/dist/lib/cjs/command-handlers/command-handler-component.cjs +2 -2
  39. package/dist/lib/cjs/command-handlers/command-handler.cjs +2 -2
  40. package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +10 -10
  41. package/dist/lib/cjs/command-handlers/editor-command-handler.d.cts +7 -7
  42. package/dist/lib/cjs/command-handlers/file-command-handler.cjs +3 -3
  43. package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +3 -3
  44. package/dist/lib/cjs/command-handlers/global-command-handler.cjs +2 -2
  45. package/dist/lib/cjs/command-handlers/index.cjs +15 -15
  46. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +95 -4
  47. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +34 -2
  48. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +2 -2
  49. package/dist/lib/cjs/command-handlers/open-discussion-command-handler.cjs +2 -2
  50. package/dist/lib/cjs/command-handlers/open-feature-request-command-handler.cjs +2 -2
  51. package/dist/lib/cjs/command-handlers/open-git-hub-command-handler.cjs +1 -1
  52. package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +2 -2
  53. package/dist/lib/cjs/command-handlers/undo-bulk-operation-command-handler.cjs +2 -2
  54. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +1 -1
  55. package/dist/lib/cjs/community-plugins.cjs +3 -3
  56. package/dist/lib/cjs/components/abort-signal-component.cjs +2 -2
  57. package/dist/lib/cjs/components/all-windows-event-component.cjs +5 -5
  58. package/dist/lib/cjs/components/all-windows-status-bar-item-component.cjs +245 -0
  59. package/dist/lib/cjs/components/all-windows-status-bar-item-component.d.cts +146 -0
  60. package/dist/lib/cjs/components/async-error-handler-component.cjs +5 -5
  61. package/dist/lib/cjs/components/async-events-component.cjs +1 -1
  62. package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +12 -12
  63. package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +2 -2
  64. package/dist/lib/cjs/components/component-ex.cjs +21 -11
  65. package/dist/lib/cjs/components/component-ex.d.cts +11 -0
  66. package/dist/lib/cjs/components/console-debug-component.cjs +2 -2
  67. package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +2 -2
  68. package/dist/lib/cjs/components/disposable-component.cjs +2 -2
  69. package/dist/lib/cjs/components/embed-extensions-component.cjs +21 -4
  70. package/dist/lib/cjs/components/embed-extensions-component.d.cts +8 -0
  71. package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +24 -10
  72. package/dist/lib/cjs/components/embeddable-markdown-editor-component.d.cts +9 -0
  73. package/dist/lib/cjs/components/file-explorer-root-menu-component.cjs +7 -7
  74. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +2 -2
  75. package/dist/lib/cjs/components/incremental-file-index-component.cjs +4 -4
  76. package/dist/lib/cjs/components/index.cjs +54 -39
  77. package/dist/lib/cjs/components/index.d.cts +5 -0
  78. package/dist/lib/cjs/components/layout-ready-component.cjs +3 -3
  79. package/dist/lib/cjs/components/menu-event-registrar-component.cjs +2 -2
  80. package/dist/lib/cjs/components/monkey-around-component.cjs +3 -3
  81. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +5 -5
  82. package/dist/lib/cjs/components/plugin-context-component.cjs +5 -5
  83. package/dist/lib/cjs/components/plugin-gate-component.cjs +69 -36
  84. package/dist/lib/cjs/components/plugin-gate-component.d.cts +36 -13
  85. package/dist/lib/cjs/components/plugin-notice-component.cjs +39 -33
  86. package/dist/lib/cjs/components/plugin-notice-component.d.cts +4 -3
  87. package/dist/lib/cjs/components/plugin-settings-component.cjs +119 -18
  88. package/dist/lib/cjs/components/plugin-settings-component.d.cts +35 -5
  89. package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +2 -2
  90. package/dist/lib/cjs/components/plugin-suggestion-component.cjs +8 -8
  91. package/dist/lib/cjs/components/pointer-position-component.cjs +2 -2
  92. package/dist/lib/cjs/components/reconfigurable-editor-extension-component.cjs +3 -3
  93. package/dist/lib/cjs/components/registry-component.cjs +2 -2
  94. package/dist/lib/cjs/components/release-notes-component.cjs +6 -6
  95. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +25 -25
  96. package/dist/lib/cjs/components/rmdir-guard-component.cjs +2 -2
  97. package/dist/lib/cjs/components/settings-facet-component.cjs +1 -1
  98. package/dist/lib/cjs/components/settings-migration-component.cjs +5 -5
  99. package/dist/lib/cjs/components/shared-component-pool-component.cjs +368 -0
  100. package/dist/lib/cjs/components/shared-component-pool-component.d.cts +129 -0
  101. package/dist/lib/cjs/components/style-sheet-component.cjs +3 -3
  102. package/dist/lib/cjs/components/syntax-highlighting-component.cjs +3 -3
  103. package/dist/lib/cjs/components/templates-language-component.cjs +1 -1
  104. package/dist/lib/cjs/components/worker-component.cjs +363 -0
  105. package/dist/lib/cjs/components/worker-component.d.cts +156 -0
  106. package/dist/lib/cjs/components/worker-pool-component.cjs +185 -0
  107. package/dist/lib/cjs/components/worker-pool-component.d.cts +102 -0
  108. package/dist/lib/cjs/components/workspace-layout-state-component.cjs +495 -0
  109. package/dist/lib/cjs/components/workspace-layout-state-component.d.cts +239 -0
  110. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +5 -5
  111. package/dist/lib/cjs/constructors/index.cjs +1 -1
  112. package/dist/lib/cjs/css-class.cjs +5 -1
  113. package/dist/lib/cjs/css-class.d.cts +16 -0
  114. package/dist/lib/cjs/data-handler.cjs +264 -6
  115. package/dist/lib/cjs/data-handler.d.cts +219 -2
  116. package/dist/lib/cjs/data-stores/data-store-locations.cjs +82 -24
  117. package/dist/lib/cjs/data-stores/data-store-locations.d.cts +15 -0
  118. package/dist/lib/cjs/data-stores/data-store-replica.cjs +33 -5
  119. package/dist/lib/cjs/data-stores/data-store-seeds.cjs +6 -6
  120. package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +2 -2
  121. package/dist/lib/cjs/data-stores/data-store-transport.cjs +81 -8
  122. package/dist/lib/cjs/data-stores/data-store-transport.d.cts +30 -1
  123. package/dist/lib/cjs/data-stores/index.cjs +6 -6
  124. package/dist/lib/cjs/data-stores/local-data-store.cjs +74 -10
  125. package/dist/lib/cjs/data-stores/local-data-store.d.cts +58 -1
  126. package/dist/lib/cjs/data-stores/shared-data-store.cjs +76 -19
  127. package/dist/lib/cjs/data-stores/shared-data-store.d.cts +18 -1
  128. package/dist/lib/cjs/dataview-link.cjs +2 -2
  129. package/dist/lib/cjs/dataview.cjs +27 -7
  130. package/dist/lib/cjs/dataview.d.cts +14 -0
  131. package/dist/lib/cjs/debug.cjs +3 -3
  132. package/dist/lib/cjs/demo-vault-helper.cjs +34 -6
  133. package/dist/lib/cjs/demo-vault-helper.d.cts +6 -2
  134. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +10 -10
  135. package/dist/lib/cjs/desktop-demo-vault-opener.cjs +13 -13
  136. package/dist/lib/cjs/desktop-git-runner.cjs +4 -14
  137. package/dist/lib/cjs/desktop-git-runner.d.cts +8 -2
  138. package/dist/lib/cjs/desktop-operating-system.cjs +1 -1
  139. package/dist/lib/cjs/desktop-request-url-stream.cjs +8 -14
  140. package/dist/lib/cjs/desktop-trusted-input.cjs +2 -2
  141. package/dist/lib/cjs/disposable.cjs +150 -0
  142. package/dist/lib/cjs/disposable.d.cts +39 -0
  143. package/dist/lib/cjs/editor-extension-registrar.cjs +1 -1
  144. package/dist/lib/cjs/editor-suggest-registrar.cjs +2 -2
  145. package/dist/lib/cjs/editor-suggest.cjs +1 -1
  146. package/dist/lib/cjs/editor.cjs +6 -6
  147. package/dist/lib/cjs/events.cjs +2 -2
  148. package/dist/lib/cjs/extensions-registrar.cjs +1 -1
  149. package/dist/lib/cjs/feature-request.cjs +1 -1
  150. package/dist/lib/cjs/file-change.cjs +10 -10
  151. package/dist/lib/cjs/file-explorer.cjs +2 -2
  152. package/dist/lib/cjs/file-manager.cjs +5 -5
  153. package/dist/lib/cjs/file-system.cjs +10 -10
  154. package/dist/lib/cjs/folder-note.cjs +4 -4
  155. package/dist/lib/cjs/frontmatter-formatting.cjs +7 -6
  156. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +1 -1
  157. package/dist/lib/cjs/frontmatter.cjs +5 -5
  158. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  159. package/dist/lib/cjs/git-rename-history.cjs +1 -1
  160. package/dist/lib/cjs/git-rename-history.d.cts +2 -2
  161. package/dist/lib/cjs/hotkey.cjs +1 -1
  162. package/dist/lib/cjs/hover-link-source-registrar.cjs +1 -1
  163. package/dist/lib/cjs/html-element.cjs +2 -2
  164. package/dist/lib/cjs/i18n/custom-type-options.cjs +1 -1
  165. package/dist/lib/cjs/i18n/default-translations.cjs +1 -1
  166. package/dist/lib/cjs/i18n/i18n.cjs +7 -7
  167. package/dist/lib/cjs/i18n/index.cjs +4 -4
  168. package/dist/lib/cjs/i18n/locales/en.cjs +27 -1
  169. package/dist/lib/cjs/i18n/locales/en.d.cts +26 -0
  170. package/dist/lib/cjs/i18n/locales/index.cjs +2 -2
  171. package/dist/lib/cjs/i18n/locales/translations-map.cjs +1 -1
  172. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +26 -0
  173. package/dist/lib/cjs/index.cjs +147 -126
  174. package/dist/lib/cjs/index.d.cts +7 -0
  175. package/dist/lib/cjs/inline-token-renderer.cjs +2 -2
  176. package/dist/lib/cjs/is-in-obsidian.cjs +1 -1
  177. package/dist/lib/cjs/library-styles.cjs +3 -3
  178. package/dist/lib/cjs/link-and-tag-input-suggest.cjs +2 -2
  179. package/dist/lib/cjs/link.cjs +76 -56
  180. package/dist/lib/cjs/link.d.cts +20 -14
  181. package/dist/lib/cjs/logger.cjs +4 -4
  182. package/dist/lib/cjs/loop.cjs +10 -16
  183. package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +17 -2
  184. package/dist/lib/cjs/markdown-code-block-processor-registrar.d.cts +7 -0
  185. package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -13
  186. package/dist/lib/cjs/markdown-post-processor-registrar.cjs +2 -2
  187. package/dist/lib/cjs/markdown-view.cjs +191 -3
  188. package/dist/lib/cjs/markdown-view.d.cts +48 -1
  189. package/dist/lib/cjs/markdown.cjs +12 -12
  190. package/dist/lib/cjs/metadata-cache.cjs +23 -23
  191. package/dist/lib/cjs/metadata-cache.d.cts +5 -4
  192. package/dist/lib/cjs/misplaced-attachment.cjs +297 -0
  193. package/dist/lib/cjs/misplaced-attachment.d.cts +228 -0
  194. package/dist/lib/cjs/mobile-app-info.cjs +1 -1
  195. package/dist/lib/cjs/modals/alert.cjs +4 -4
  196. package/dist/lib/cjs/modals/code-block-builder.cjs +7 -7
  197. package/dist/lib/cjs/modals/confirm.cjs +4 -4
  198. package/dist/lib/cjs/modals/copy-text-manually.cjs +181 -0
  199. package/dist/lib/cjs/modals/copy-text-manually.d.cts +38 -0
  200. package/dist/lib/cjs/modals/index.cjs +17 -11
  201. package/dist/lib/cjs/modals/index.d.cts +2 -0
  202. package/dist/lib/cjs/modals/minimizable-modal.cjs +6 -6
  203. package/dist/lib/cjs/modals/modal-command-builder.cjs +3 -3
  204. package/dist/lib/cjs/modals/modal.cjs +3 -3
  205. package/dist/lib/cjs/modals/prompt.cjs +10 -10
  206. package/dist/lib/cjs/modals/prompt.d.cts +1 -1
  207. package/dist/lib/cjs/modals/review-bug-report-diagnostics.cjs +202 -0
  208. package/dist/lib/cjs/modals/review-bug-report-diagnostics.d.cts +30 -0
  209. package/dist/lib/cjs/modals/select-item.cjs +6 -6
  210. package/dist/lib/cjs/modals/select-option.cjs +3 -3
  211. package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +1 -1
  212. package/dist/lib/cjs/note-priority.cjs +2 -2
  213. package/dist/lib/cjs/notebook-navigator.cjs +12 -2
  214. package/dist/lib/cjs/notebook-navigator.d.cts +6 -0
  215. package/dist/lib/cjs/obsidian-lib-state.cjs +1 -1
  216. package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +1 -1
  217. package/dist/lib/cjs/obsidian-settings.cjs +1 -1
  218. package/dist/lib/cjs/obsidian-word-characters.cjs +1 -1
  219. package/dist/lib/cjs/parse-link.cjs +14 -14
  220. package/dist/lib/cjs/path-compatibility.cjs +368 -0
  221. package/dist/lib/cjs/path-compatibility.d.cts +263 -0
  222. package/dist/lib/cjs/path-settings.cjs +3 -3
  223. package/dist/lib/cjs/pdf.cjs +2 -2
  224. package/dist/lib/cjs/plugin/index.cjs +18 -12
  225. package/dist/lib/cjs/plugin/index.d.cts +2 -0
  226. package/dist/lib/cjs/plugin/plugin-api.cjs +21 -12
  227. package/dist/lib/cjs/plugin/plugin-api.d.cts +5 -1
  228. package/dist/lib/cjs/plugin/plugin-async-cleanup.cjs +6 -3
  229. package/dist/lib/cjs/plugin/plugin-async-cleanup.d.cts +5 -0
  230. package/dist/lib/cjs/plugin/plugin-context.cjs +10 -9
  231. package/dist/lib/cjs/plugin/plugin-event-source.cjs +1 -1
  232. package/dist/lib/cjs/plugin/plugin-event-source.d.cts +4 -4
  233. package/dist/lib/cjs/plugin/plugin-install-state.cjs +49 -4
  234. package/dist/lib/cjs/plugin/plugin-install-state.d.cts +30 -0
  235. package/dist/lib/cjs/plugin/plugin-instance.cjs +450 -0
  236. package/dist/lib/cjs/plugin/plugin-instance.d.cts +258 -0
  237. package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +1 -1
  238. package/dist/lib/cjs/plugin/plugin-lifecycle-events.d.cts +6 -4
  239. package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +15 -15
  240. package/dist/lib/cjs/plugin/plugin.cjs +133 -34
  241. package/dist/lib/cjs/plugin/plugin.d.cts +35 -5
  242. package/dist/lib/cjs/plugin/settings-migration-api.cjs +1 -1
  243. package/dist/lib/cjs/plugin/third-party-plugin.cjs +231 -0
  244. package/dist/lib/cjs/plugin/third-party-plugin.d.cts +244 -0
  245. package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +2 -2
  246. package/dist/lib/cjs/popovers/field-popover.cjs +4 -4
  247. package/dist/lib/cjs/popovers/index.cjs +3 -3
  248. package/dist/lib/cjs/popovers/popover-anchor.cjs +1 -1
  249. package/dist/lib/cjs/popovers/popover.cjs +5 -5
  250. package/dist/lib/cjs/queue.cjs +8 -8
  251. package/dist/lib/cjs/react/app-context.cjs +3 -3
  252. package/dist/lib/cjs/react/index.cjs +1 -1
  253. package/dist/lib/cjs/reference-definition.cjs +1 -1
  254. package/dist/lib/cjs/reference.cjs +3 -3
  255. package/dist/lib/cjs/release-asset.cjs +5 -5
  256. package/dist/lib/cjs/rendered-markdown.cjs +4 -4
  257. package/dist/lib/cjs/request-url.cjs +4 -4
  258. package/dist/lib/cjs/resource-lock.cjs +46 -42
  259. package/dist/lib/cjs/resource-lock.d.cts +8 -7
  260. package/dist/lib/cjs/resource-url.cjs +3 -3
  261. package/dist/lib/cjs/ribbon-icon-registrar.cjs +1 -1
  262. package/dist/lib/cjs/setting-components/checkbox-component.cjs +3 -3
  263. package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +7 -7
  264. package/dist/lib/cjs/setting-components/date-component.cjs +4 -4
  265. package/dist/lib/cjs/setting-components/date-time-component.cjs +4 -4
  266. package/dist/lib/cjs/setting-components/email-component.cjs +2 -2
  267. package/dist/lib/cjs/setting-components/file-component.cjs +2 -2
  268. package/dist/lib/cjs/setting-components/folder-list-component.cjs +3 -3
  269. package/dist/lib/cjs/setting-components/hotkey-component.cjs +5 -5
  270. package/dist/lib/cjs/setting-components/index.cjs +30 -30
  271. package/dist/lib/cjs/setting-components/list-component.cjs +5 -5
  272. package/dist/lib/cjs/setting-components/month-component.cjs +4 -4
  273. package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +3 -3
  274. package/dist/lib/cjs/setting-components/multiple-email-component.cjs +2 -2
  275. package/dist/lib/cjs/setting-components/multiple-file-component.cjs +3 -3
  276. package/dist/lib/cjs/setting-components/multiple-text-component.cjs +9 -6
  277. package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +4 -1
  278. package/dist/lib/cjs/setting-components/number-component.cjs +2 -2
  279. package/dist/lib/cjs/setting-components/password-component.cjs +2 -2
  280. package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +3 -3
  281. package/dist/lib/cjs/setting-components/tag-list-component.cjs +4 -4
  282. package/dist/lib/cjs/setting-components/telephone-component.cjs +2 -2
  283. package/dist/lib/cjs/setting-components/text-based-component.cjs +1 -1
  284. package/dist/lib/cjs/setting-components/time-component.cjs +3 -3
  285. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +3 -3
  286. package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +3 -3
  287. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +4 -4
  288. package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +1 -1
  289. package/dist/lib/cjs/setting-components/typed-text-component.cjs +3 -3
  290. package/dist/lib/cjs/setting-components/url-component.cjs +2 -2
  291. package/dist/lib/cjs/setting-components/validator-component.cjs +4 -4
  292. package/dist/lib/cjs/setting-components/week-component.cjs +4 -4
  293. package/dist/lib/cjs/setting-ex.cjs +26 -26
  294. package/dist/lib/cjs/setting-group-ex.cjs +2 -2
  295. package/dist/lib/cjs/settings-recovery.cjs +217 -0
  296. package/dist/lib/cjs/settings-recovery.d.cts +178 -0
  297. package/dist/lib/cjs/settings-tabs.cjs +5 -5
  298. package/dist/lib/cjs/status-bar-item-registrar.cjs +1 -1
  299. package/dist/lib/cjs/templater.cjs +14 -4
  300. package/dist/lib/cjs/templater.d.cts +6 -0
  301. package/dist/lib/cjs/transformers/duration-transformer.cjs +2 -2
  302. package/dist/lib/cjs/transformers/index.cjs +1 -1
  303. package/dist/lib/cjs/trusted-input.cjs +1 -1
  304. package/dist/lib/cjs/validation.cjs +4 -4
  305. package/dist/lib/cjs/vault-delete.cjs +6 -6
  306. package/dist/lib/cjs/vault-transaction.cjs +5 -5
  307. package/dist/lib/cjs/vault.cjs +12 -12
  308. package/dist/lib/cjs/view-registrar.cjs +1 -1
  309. package/dist/lib/cjs/virtual-file.cjs +16 -14
  310. package/dist/lib/cjs/virtual-file.d.cts +2 -1
  311. package/dist/lib/cjs/wasm.cjs +119 -0
  312. package/dist/lib/cjs/wasm.d.cts +54 -0
  313. package/dist/lib/cjs/worker-protocol.cjs +209 -0
  314. package/dist/lib/cjs/worker-protocol.d.cts +282 -0
  315. package/dist/lib/cjs/workspace.cjs +1 -1
  316. package/dist/lib/esm/__merged.d.mts +26 -10
  317. package/dist/lib/esm/__merged.mjs +215 -5
  318. package/dist/lib/esm/app.mjs +2 -2
  319. package/dist/lib/esm/attachment-path.d.mts +3 -3
  320. package/dist/lib/esm/attachment-path.mjs +2 -2
  321. package/dist/lib/esm/backlink-index.mjs +2 -2
  322. package/dist/lib/esm/bug-report-diagnostics.d.mts +186 -0
  323. package/dist/lib/esm/bug-report-diagnostics.mjs +127 -0
  324. package/dist/lib/esm/bug-report.d.mts +65 -0
  325. package/dist/lib/esm/bug-report.mjs +33 -10
  326. package/dist/lib/esm/canvas.d.mts +13 -0
  327. package/dist/lib/esm/canvas.mjs +6 -5
  328. package/dist/lib/esm/command-handlers/abstract-file-command-handler.d.mts +13 -13
  329. package/dist/lib/esm/command-handlers/abstract-file-command-handler.mjs +14 -14
  330. package/dist/lib/esm/command-handlers/editor-command-handler.d.mts +7 -7
  331. package/dist/lib/esm/command-handlers/editor-command-handler.mjs +8 -8
  332. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.d.mts +34 -2
  333. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +99 -3
  334. package/dist/lib/esm/components/all-windows-status-bar-item-component.d.mts +146 -0
  335. package/dist/lib/esm/components/all-windows-status-bar-item-component.mjs +154 -0
  336. package/dist/lib/esm/components/component-ex.d.mts +11 -0
  337. package/dist/lib/esm/components/component-ex.mjs +19 -6
  338. package/dist/lib/esm/components/disposable-component.mjs +1 -1
  339. package/dist/lib/esm/components/embed-extensions-component.d.mts +8 -0
  340. package/dist/lib/esm/components/embed-extensions-component.mjs +20 -3
  341. package/dist/lib/esm/components/embeddable-markdown-editor-component.d.mts +9 -0
  342. package/dist/lib/esm/components/embeddable-markdown-editor-component.mjs +16 -2
  343. package/dist/lib/esm/components/index.d.mts +5 -0
  344. package/dist/lib/esm/components/index.mjs +12 -2
  345. package/dist/lib/esm/components/plugin-gate-component.d.mts +36 -13
  346. package/dist/lib/esm/components/plugin-gate-component.mjs +61 -26
  347. package/dist/lib/esm/components/plugin-notice-component.d.mts +4 -3
  348. package/dist/lib/esm/components/plugin-notice-component.mjs +30 -21
  349. package/dist/lib/esm/components/plugin-settings-component.d.mts +35 -5
  350. package/dist/lib/esm/components/plugin-settings-component.mjs +105 -4
  351. package/dist/lib/esm/components/rename-delete-handler-component.mjs +2 -2
  352. package/dist/lib/esm/components/shared-component-pool-component.d.mts +129 -0
  353. package/dist/lib/esm/components/shared-component-pool-component.mjs +280 -0
  354. package/dist/lib/esm/components/worker-component.d.mts +156 -0
  355. package/dist/lib/esm/components/worker-component.mjs +279 -0
  356. package/dist/lib/esm/components/worker-pool-component.d.mts +102 -0
  357. package/dist/lib/esm/components/worker-pool-component.mjs +95 -0
  358. package/dist/lib/esm/components/workspace-layout-state-component.d.mts +239 -0
  359. package/dist/lib/esm/components/workspace-layout-state-component.mjs +404 -0
  360. package/dist/lib/esm/css-class.d.mts +16 -0
  361. package/dist/lib/esm/css-class.mjs +5 -1
  362. package/dist/lib/esm/data-handler.d.mts +219 -2
  363. package/dist/lib/esm/data-handler.mjs +262 -5
  364. package/dist/lib/esm/data-stores/data-store-locations.d.mts +15 -0
  365. package/dist/lib/esm/data-stores/data-store-locations.mjs +80 -22
  366. package/dist/lib/esm/data-stores/data-store-replica.mjs +33 -5
  367. package/dist/lib/esm/data-stores/data-store-seeds.d.mts +2 -2
  368. package/dist/lib/esm/data-stores/data-store-seeds.mjs +4 -4
  369. package/dist/lib/esm/data-stores/data-store-transport.d.mts +30 -1
  370. package/dist/lib/esm/data-stores/data-store-transport.mjs +78 -5
  371. package/dist/lib/esm/data-stores/local-data-store.d.mts +58 -1
  372. package/dist/lib/esm/data-stores/local-data-store.mjs +71 -9
  373. package/dist/lib/esm/data-stores/shared-data-store.d.mts +18 -1
  374. package/dist/lib/esm/data-stores/shared-data-store.mjs +72 -15
  375. package/dist/lib/esm/dataview.d.mts +14 -0
  376. package/dist/lib/esm/dataview.mjs +19 -1
  377. package/dist/lib/esm/demo-vault-helper.d.mts +6 -2
  378. package/dist/lib/esm/demo-vault-helper.mjs +29 -1
  379. package/dist/lib/esm/desktop-demo-vault-opener.mjs +1 -1
  380. package/dist/lib/esm/desktop-git-runner.d.mts +8 -2
  381. package/dist/lib/esm/desktop-git-runner.mjs +3 -3
  382. package/dist/lib/esm/desktop-request-url-stream.mjs +4 -10
  383. package/dist/lib/esm/disposable.d.mts +39 -0
  384. package/dist/lib/esm/disposable.mjs +64 -0
  385. package/dist/lib/esm/file-system.mjs +2 -2
  386. package/dist/lib/esm/frontmatter-formatting.mjs +2 -1
  387. package/dist/lib/esm/generated-during-build.mjs +2 -2
  388. package/dist/lib/esm/git-rename-history.d.mts +2 -2
  389. package/dist/lib/esm/git-rename-history.mjs +1 -1
  390. package/dist/lib/esm/i18n/locales/en.d.mts +26 -0
  391. package/dist/lib/esm/i18n/locales/en.mjs +27 -1
  392. package/dist/lib/esm/i18n/locales/translations-map.d.mts +26 -0
  393. package/dist/lib/esm/index.d.mts +7 -0
  394. package/dist/lib/esm/index.mjs +15 -1
  395. package/dist/lib/esm/link.d.mts +20 -14
  396. package/dist/lib/esm/link.mjs +57 -38
  397. package/dist/lib/esm/loop.mjs +2 -8
  398. package/dist/lib/esm/markdown-code-block-processor-registrar.d.mts +7 -0
  399. package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +16 -1
  400. package/dist/lib/esm/markdown-view.d.mts +48 -1
  401. package/dist/lib/esm/markdown-view.mjs +192 -2
  402. package/dist/lib/esm/metadata-cache.d.mts +5 -4
  403. package/dist/lib/esm/metadata-cache.mjs +6 -6
  404. package/dist/lib/esm/misplaced-attachment.d.mts +228 -0
  405. package/dist/lib/esm/misplaced-attachment.mjs +212 -0
  406. package/dist/lib/esm/modals/copy-text-manually.d.mts +38 -0
  407. package/dist/lib/esm/modals/copy-text-manually.mjs +99 -0
  408. package/dist/lib/esm/modals/index.d.mts +2 -0
  409. package/dist/lib/esm/modals/index.mjs +5 -1
  410. package/dist/lib/esm/modals/prompt.d.mts +1 -1
  411. package/dist/lib/esm/modals/prompt.mjs +1 -1
  412. package/dist/lib/esm/modals/review-bug-report-diagnostics.d.mts +30 -0
  413. package/dist/lib/esm/modals/review-bug-report-diagnostics.mjs +120 -0
  414. package/dist/lib/esm/notebook-navigator.d.mts +6 -0
  415. package/dist/lib/esm/notebook-navigator.mjs +11 -2
  416. package/dist/lib/esm/parse-link.mjs +4 -4
  417. package/dist/lib/esm/path-compatibility.d.mts +263 -0
  418. package/dist/lib/esm/path-compatibility.mjs +277 -0
  419. package/dist/lib/esm/plugin/index.d.mts +2 -0
  420. package/dist/lib/esm/plugin/index.mjs +6 -2
  421. package/dist/lib/esm/plugin/plugin-api.d.mts +5 -1
  422. package/dist/lib/esm/plugin/plugin-api.mjs +13 -4
  423. package/dist/lib/esm/plugin/plugin-async-cleanup.d.mts +5 -0
  424. package/dist/lib/esm/plugin/plugin-async-cleanup.mjs +3 -1
  425. package/dist/lib/esm/plugin/plugin-context.mjs +2 -1
  426. package/dist/lib/esm/plugin/plugin-event-source.d.mts +4 -4
  427. package/dist/lib/esm/plugin/plugin-event-source.mjs +1 -1
  428. package/dist/lib/esm/plugin/plugin-install-state.d.mts +30 -0
  429. package/dist/lib/esm/plugin/plugin-install-state.mjs +44 -1
  430. package/dist/lib/esm/plugin/plugin-instance.d.mts +258 -0
  431. package/dist/lib/esm/plugin/plugin-instance.mjs +367 -0
  432. package/dist/lib/esm/plugin/plugin-lifecycle-events.d.mts +6 -4
  433. package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +1 -1
  434. package/dist/lib/esm/plugin/plugin.d.mts +35 -5
  435. package/dist/lib/esm/plugin/plugin.mjs +118 -9
  436. package/dist/lib/esm/plugin/third-party-plugin.d.mts +244 -0
  437. package/dist/lib/esm/plugin/third-party-plugin.mjs +147 -0
  438. package/dist/lib/esm/release-asset.mjs +1 -1
  439. package/dist/lib/esm/resource-lock.d.mts +8 -7
  440. package/dist/lib/esm/resource-lock.mjs +31 -26
  441. package/dist/lib/esm/setting-components/multiple-text-component.d.mts +4 -1
  442. package/dist/lib/esm/setting-components/multiple-text-component.mjs +6 -3
  443. package/dist/lib/esm/settings-recovery.d.mts +178 -0
  444. package/dist/lib/esm/settings-recovery.mjs +125 -0
  445. package/dist/lib/esm/settings-tabs.mjs +2 -2
  446. package/dist/lib/esm/templater.d.mts +6 -0
  447. package/dist/lib/esm/templater.mjs +11 -2
  448. package/dist/lib/esm/vault.mjs +1 -1
  449. package/dist/lib/esm/virtual-file.d.mts +2 -1
  450. package/dist/lib/esm/virtual-file.mjs +7 -5
  451. package/dist/lib/esm/wasm.d.mts +54 -0
  452. package/dist/lib/esm/wasm.mjs +30 -0
  453. package/dist/lib/esm/worker-protocol.d.mts +282 -0
  454. package/dist/lib/esm/worker-protocol.mjs +113 -0
  455. package/dist/styles.css +16 -1
  456. package/modals/copy-text-manually/package.json +6 -0
  457. package/modals/review-bug-report-diagnostics/package.json +6 -0
  458. package/package.json +10 -8
  459. package/plugin/plugin-instance/package.json +6 -0
  460. package/plugin/third-party-plugin/package.json +6 -0
@@ -3,8 +3,43 @@
3
3
  * @file
4
4
  *
5
5
  * A module for handling data loading and saving to the plugin's data file.
6
+ *
7
+ * {@link PluginDataHandler} bounds the plugin's `data.json` in bytes, in both directions, because Obsidian does
8
+ * not. Read from Obsidian `1.15.1`: `Plugin.loadData` reads the whole file and `JSON.parse`s it with no limit, so an
9
+ * oversized file is fully read and parsed into memory on every startup, and `Plugin.saveData` writes
10
+ * `JSON.stringify(data, undefined, 2)` with no limit either. Obsidian also swallows a failed read or write: its
11
+ * `readJson` logs a parse failure and resolves `undefined`, and its `writeJson` catches every error. So the guard
12
+ * has to decide BEFORE handing the call to Obsidian, which is the only point where refusing still changes the
13
+ * outcome.
14
+ *
15
+ * The same `readJson` makes a `data.json` that EXISTS but does not parse indistinguishable from no file at all: both
16
+ * resolve `undefined`. A settings component reading that as "nothing stored" saves its defaults over the file, and
17
+ * the user's settings are gone. So when Obsidian answers `undefined` or `null`, {@link PluginDataHandler.loadData}
18
+ * reads the file raw and parses it itself; a file that does not parse is copied into the device-local
19
+ * {@link SettingsRecoveryStore} and reported as a {@link PluginDataParseError}, never as missing.
6
20
  */
7
21
  import type { Plugin } from 'obsidian';
22
+ import type { SettingsRecoveryCopy, SettingsRecoveryStore } from './settings-recovery.mjs';
23
+ /**
24
+ * The default maximum size of a plugin's `data.json`, in bytes: 16 MiB.
25
+ *
26
+ * This is a protective budget against startup exhaustion, not a sync quota. Obsidian Sync's own per-file limit
27
+ * depends on the plan and is a separate constraint a plugin may want to stay well under.
28
+ */
29
+ export declare const DEFAULT_PLUGIN_DATA_MAX_SIZE_IN_BYTES = 16777216;
30
+ /**
31
+ * The operation a {@link PluginDataSizeLimitExceededError} refused.
32
+ */
33
+ export declare enum PluginDataOperation {
34
+ /**
35
+ * Loading the existing `data.json`.
36
+ */
37
+ Load = "load",
38
+ /**
39
+ * Saving a new `data.json`.
40
+ */
41
+ Save = "save"
42
+ }
8
43
  /**
9
44
  * A handler for loading and saving data to the plugin's data file.
10
45
  */
@@ -15,6 +50,12 @@ export interface DataHandler {
15
50
  * @returns The loaded data.
16
51
  */
17
52
  readonly loadData: () => Promise<unknown>;
53
+ /**
54
+ * Where a copy of the data file is kept before anything could lose what it held, or `null` (or absent) when the
55
+ * handler keeps none. A settings component keeps a copy here before a first save that would drop or change a
56
+ * stored value, and skips that save when the copy cannot be kept.
57
+ */
58
+ readonly recoveryStore?: null | SettingsRecoveryStore;
18
59
  /**
19
60
  * A function to save data to the plugin's data file.
20
61
  *
@@ -23,27 +64,203 @@ export interface DataHandler {
23
64
  readonly saveData: (data: unknown) => Promise<void>;
24
65
  }
25
66
  /**
26
- * A handler for loading and saving data to the plugin's data file.
67
+ * Options for {@link PluginDataHandler}.
68
+ */
69
+ export interface PluginDataHandlerConstructorOptions {
70
+ /**
71
+ * The maximum size of `data.json`, in UTF-8 bytes as written to disk. Defaults to
72
+ * {@link DEFAULT_PLUGIN_DATA_MAX_SIZE_IN_BYTES}. Pass `Infinity` to disable the guard.
73
+ */
74
+ readonly maxSizeInBytes?: number;
75
+ /**
76
+ * Where recovery copies of `data.json` are kept. Defaults to a device-local {@link LocalSettingsRecoveryStore}
77
+ * for the plugin. Pass `null` to keep none: an unparseable file is then still reported and never overwritten, so a
78
+ * settings component built on this handler fails its load rather than run on defaults, and a first save that drops
79
+ * or changes a stored value is written with no copy kept, as before recovery copies existed.
80
+ */
81
+ readonly recoveryStore?: null | SettingsRecoveryStore;
82
+ }
83
+ /**
84
+ * Parameters for {@link PluginDataParseError}.
85
+ */
86
+ export interface PluginDataParseErrorConstructorParams {
87
+ /**
88
+ * The error `JSON.parse` threw.
89
+ */
90
+ readonly cause: unknown;
91
+ /**
92
+ * The path of the plugin's `data.json`.
93
+ */
94
+ readonly path: string;
95
+ /**
96
+ * The `manifest.id` of the plugin.
97
+ */
98
+ readonly pluginId: string;
99
+ /**
100
+ * The `manifest.name` of the plugin.
101
+ */
102
+ readonly pluginName: string;
103
+ /**
104
+ * The recovery copy kept of the file, or `null` when none could be kept.
105
+ */
106
+ readonly recoveryCopy: null | SettingsRecoveryCopy;
107
+ }
108
+ /**
109
+ * Parameters for {@link PluginDataSizeLimitExceededError}.
110
+ */
111
+ export interface PluginDataSizeLimitExceededErrorConstructorParams {
112
+ /**
113
+ * The size limit, in bytes.
114
+ */
115
+ readonly maxSizeInBytes: number;
116
+ /**
117
+ * The refused operation.
118
+ */
119
+ readonly operation: PluginDataOperation;
120
+ /**
121
+ * The path of the plugin's `data.json`.
122
+ */
123
+ readonly path: string;
124
+ /**
125
+ * The `manifest.id` of the plugin.
126
+ */
127
+ readonly pluginId: string;
128
+ /**
129
+ * The `manifest.name` of the plugin.
130
+ */
131
+ readonly pluginName: string;
132
+ /**
133
+ * The size of the existing file (load) or of the serialized data (save), in bytes.
134
+ */
135
+ readonly sizeInBytes: number;
136
+ }
137
+ /**
138
+ * A handler for loading and saving data to the plugin's data file, refusing a `data.json` larger than a byte limit.
27
139
  */
28
140
  export declare class PluginDataHandler implements DataHandler {
29
141
  protected readonly plugin: Plugin;
142
+ /**
143
+ * Where recovery copies of `data.json` are kept, or `null` when none are.
144
+ */
145
+ readonly recoveryStore: null | SettingsRecoveryStore;
146
+ /**
147
+ * The maximum size of `data.json`, in bytes.
148
+ */
149
+ protected readonly maxSizeInBytes: number;
30
150
  /**
31
151
  * Creates a new plugin data handler.
32
152
  *
33
153
  * @param plugin - The plugin instance.
154
+ * @param options - The options.
34
155
  */
35
- constructor(plugin: Plugin);
156
+ constructor(plugin: Plugin, options?: PluginDataHandlerConstructorOptions);
36
157
  /**
37
158
  * Loads data from the plugin's data file.
38
159
  *
160
+ * The file's size is read through the adapter BEFORE Obsidian reads and parses it, so an oversized file is never
161
+ * loaded into memory. When Obsidian answers `undefined` or `null`, the file is read raw and parsed here, because
162
+ * Obsidian answers `undefined` for a file that exists but does not parse too.
163
+ *
39
164
  * @returns The loaded data.
165
+ * @throws {@link PluginDataSizeLimitExceededError} If the existing file is larger than the limit.
166
+ * @throws {@link PluginDataParseError} If the existing file is not valid JSON. The file is left untouched, and a
167
+ * recovery copy of it is kept first when the handler has a recovery store.
40
168
  */
41
169
  loadData(): Promise<unknown>;
42
170
  /**
43
171
  * Saves data to the plugin's data file.
44
172
  *
173
+ * The data is serialized exactly as Obsidian writes it, and its UTF-8 byte length is checked before anything is
174
+ * written.
175
+ *
45
176
  * @param data - The data to save.
46
177
  * @returns A promise that resolves when the data is saved.
178
+ * @throws {@link PluginDataSizeLimitExceededError} If the serialized data is larger than the limit.
47
179
  */
48
180
  saveData(data: unknown): Promise<void>;
181
+ /**
182
+ * Gets the path of the plugin's `data.json`, as Obsidian's `Plugin.loadData` reads it.
183
+ *
184
+ * @returns The path, or `null` when the manifest has no folder.
185
+ */
186
+ protected getDataFilePath(): null | string;
187
+ /**
188
+ * Tells the user that `data.json` could not be parsed: a notice naming the plugin and the path, and the error in the
189
+ * console.
190
+ *
191
+ * @param error - The parse error.
192
+ */
193
+ protected reportParseError(error: PluginDataParseError): void;
194
+ private createError;
195
+ private getExistingFileSize;
196
+ private keepRecoveryCopy;
197
+ private readRawFile;
198
+ }
199
+ /**
200
+ * Thrown when a plugin's `data.json` exists but is not valid JSON.
201
+ *
202
+ * The file is never touched when this is thrown. When {@link recoveryCopy} is not `null`, a copy of the file's raw text
203
+ * was kept on this device first, so even a later save over the file loses nothing.
204
+ */
205
+ export declare class PluginDataParseError extends Error {
206
+ /**
207
+ * The path of the plugin's `data.json`.
208
+ */
209
+ readonly path: string;
210
+ /**
211
+ * The `manifest.id` of the plugin.
212
+ */
213
+ readonly pluginId: string;
214
+ /**
215
+ * The `manifest.name` of the plugin.
216
+ */
217
+ readonly pluginName: string;
218
+ /**
219
+ * The recovery copy kept of the file, or `null` when none could be kept.
220
+ */
221
+ readonly recoveryCopy: null | SettingsRecoveryCopy;
222
+ /**
223
+ * Creates a {@link PluginDataParseError}.
224
+ *
225
+ * @param params - The parameters for the error.
226
+ */
227
+ constructor(params: PluginDataParseErrorConstructorParams);
228
+ }
229
+ /**
230
+ * Thrown when a plugin's `data.json` is, or would become, larger than the configured limit.
231
+ *
232
+ * The file on disk is never touched when this is thrown: an oversized existing file is left intact for the user to
233
+ * inspect or trim, and an oversized save is refused before anything is written, so the last good file remains.
234
+ */
235
+ export declare class PluginDataSizeLimitExceededError extends Error {
236
+ /**
237
+ * The size limit, in bytes.
238
+ */
239
+ readonly maxSizeInBytes: number;
240
+ /**
241
+ * The refused operation.
242
+ */
243
+ readonly operation: PluginDataOperation;
244
+ /**
245
+ * The path of the plugin's `data.json`.
246
+ */
247
+ readonly path: string;
248
+ /**
249
+ * The `manifest.id` of the plugin.
250
+ */
251
+ readonly pluginId: string;
252
+ /**
253
+ * The `manifest.name` of the plugin.
254
+ */
255
+ readonly pluginName: string;
256
+ /**
257
+ * The size of the existing file (load) or of the serialized data (save), in bytes.
258
+ */
259
+ readonly sizeInBytes: number;
260
+ /**
261
+ * Creates a {@link PluginDataSizeLimitExceededError}.
262
+ *
263
+ * @param params - The parameters for the error.
264
+ */
265
+ constructor(params: PluginDataSizeLimitExceededErrorConstructorParams);
49
266
  }
@@ -2,36 +2,293 @@
2
2
  THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
5
29
 
30
+ ensureBrowserProcess();
31
+ })();
32
+
33
+ import { normalizePath } from "obsidian";
34
+ import { PluginNoticeComponent } from "./components/plugin-notice-component.mjs";
35
+ import { t } from "./i18n/i18n.mjs";
36
+ import {
37
+ LocalSettingsRecoveryStore,
38
+ SettingsRecoveryReason
39
+ } from "./settings-recovery.mjs";
40
+ const OBSIDIAN_JSON_INDENT = 2;
41
+ const DEFAULT_PLUGIN_DATA_MAX_SIZE_IN_BYTES = 16777216;
42
+ var PluginDataOperation = /* @__PURE__ */ ((PluginDataOperation2) => {
43
+ PluginDataOperation2["Load"] = "load";
44
+ PluginDataOperation2["Save"] = "save";
45
+ return PluginDataOperation2;
46
+ })(PluginDataOperation || {});
6
47
  class PluginDataHandler {
7
48
  /**
8
49
  * Creates a new plugin data handler.
9
50
  *
10
51
  * @param plugin - The plugin instance.
52
+ * @param options - The options.
11
53
  */
12
- constructor(plugin) {
54
+ constructor(plugin, options = {}) {
13
55
  this.plugin = plugin;
56
+ const maxSizeInBytes = options.maxSizeInBytes ?? DEFAULT_PLUGIN_DATA_MAX_SIZE_IN_BYTES;
57
+ if (Number.isNaN(maxSizeInBytes) || maxSizeInBytes < 0) {
58
+ throw new RangeError(`maxSizeInBytes must be a non-negative number, got ${String(maxSizeInBytes)}.`);
59
+ }
60
+ this.maxSizeInBytes = maxSizeInBytes;
61
+ this.recoveryStore = options.recoveryStore === void 0 ? new LocalSettingsRecoveryStore({ app: plugin.app, pluginId: plugin.manifest.id }) : options.recoveryStore;
14
62
  }
15
63
  plugin;
64
+ /**
65
+ * Where recovery copies of `data.json` are kept, or `null` when none are.
66
+ */
67
+ recoveryStore;
68
+ /**
69
+ * The maximum size of `data.json`, in bytes.
70
+ */
71
+ maxSizeInBytes;
16
72
  /**
17
73
  * Loads data from the plugin's data file.
18
74
  *
75
+ * The file's size is read through the adapter BEFORE Obsidian reads and parses it, so an oversized file is never
76
+ * loaded into memory. When Obsidian answers `undefined` or `null`, the file is read raw and parsed here, because
77
+ * Obsidian answers `undefined` for a file that exists but does not parse too.
78
+ *
19
79
  * @returns The loaded data.
80
+ * @throws {@link PluginDataSizeLimitExceededError} If the existing file is larger than the limit.
81
+ * @throws {@link PluginDataParseError} If the existing file is not valid JSON. The file is left untouched, and a
82
+ * recovery copy of it is kept first when the handler has a recovery store.
20
83
  */
21
84
  async loadData() {
22
- return this.plugin.loadData();
85
+ const sizeInBytes = await this.getExistingFileSize();
86
+ if (sizeInBytes !== null && sizeInBytes > this.maxSizeInBytes) {
87
+ throw this.createError("load" /* Load */, sizeInBytes);
88
+ }
89
+ const data = await this.plugin.loadData();
90
+ if (data !== void 0 && data !== null) {
91
+ return data;
92
+ }
93
+ const path = this.getDataFilePath();
94
+ if (path === null) {
95
+ return data;
96
+ }
97
+ const rawText = await this.readRawFile(path);
98
+ if (rawText === null) {
99
+ return data;
100
+ }
101
+ try {
102
+ const parsed = JSON.parse(rawText);
103
+ return parsed;
104
+ } catch (parseError) {
105
+ const error = new PluginDataParseError({
106
+ cause: parseError,
107
+ path,
108
+ pluginId: this.plugin.manifest.id,
109
+ pluginName: this.plugin.manifest.name,
110
+ recoveryCopy: await this.keepRecoveryCopy(path, rawText)
111
+ });
112
+ this.reportParseError(error);
113
+ throw error;
114
+ }
23
115
  }
24
116
  /**
25
117
  * Saves data to the plugin's data file.
26
118
  *
119
+ * The data is serialized exactly as Obsidian writes it, and its UTF-8 byte length is checked before anything is
120
+ * written.
121
+ *
27
122
  * @param data - The data to save.
28
123
  * @returns A promise that resolves when the data is saved.
124
+ * @throws {@link PluginDataSizeLimitExceededError} If the serialized data is larger than the limit.
29
125
  */
30
126
  async saveData(data) {
31
- return this.plugin.saveData(data);
127
+ if (this.maxSizeInBytes !== Infinity) {
128
+ const serialized = JSON.stringify(data, void 0, OBSIDIAN_JSON_INDENT);
129
+ if (serialized !== void 0) {
130
+ const sizeInBytes = new TextEncoder().encode(serialized).byteLength;
131
+ if (sizeInBytes > this.maxSizeInBytes) {
132
+ throw this.createError("save" /* Save */, sizeInBytes);
133
+ }
134
+ }
135
+ }
136
+ await this.plugin.saveData(data);
137
+ }
138
+ /**
139
+ * Gets the path of the plugin's `data.json`, as Obsidian's `Plugin.loadData` reads it.
140
+ *
141
+ * @returns The path, or `null` when the manifest has no folder.
142
+ */
143
+ getDataFilePath() {
144
+ const directory = this.plugin.manifest.dir;
145
+ return directory ? normalizePath(`${directory}/data.json`) : null;
146
+ }
147
+ /**
148
+ * Tells the user that `data.json` could not be parsed: a notice naming the plugin and the path, and the error in the
149
+ * console.
150
+ *
151
+ * @param error - The parse error.
152
+ */
153
+ reportParseError(error) {
154
+ console.error(error);
155
+ new PluginNoticeComponent({
156
+ app: this.plugin.app,
157
+ pluginName: this.plugin.manifest.name
158
+ }).showNotice(
159
+ error.recoveryCopy === null ? t(($) => $.obsidianLib.notices.dataFileUnparseable, { path: error.path }) : t(($) => $.obsidianLib.notices.dataFileUnparseableCopyKept, { path: error.path })
160
+ );
161
+ }
162
+ createError(operation, sizeInBytes) {
163
+ return new PluginDataSizeLimitExceededError({
164
+ maxSizeInBytes: this.maxSizeInBytes,
165
+ operation,
166
+ path: this.getDataFilePath() ?? "data.json",
167
+ pluginId: this.plugin.manifest.id,
168
+ pluginName: this.plugin.manifest.name,
169
+ sizeInBytes
170
+ });
171
+ }
172
+ async getExistingFileSize() {
173
+ if (this.maxSizeInBytes === Infinity) {
174
+ return null;
175
+ }
176
+ const path = this.getDataFilePath();
177
+ if (path === null) {
178
+ return null;
179
+ }
180
+ try {
181
+ const stat = await this.plugin.app.vault.adapter.stat(path);
182
+ return stat?.size ?? null;
183
+ } catch {
184
+ return null;
185
+ }
186
+ }
187
+ async keepRecoveryCopy(path, rawText) {
188
+ if (this.recoveryStore === null) {
189
+ return null;
190
+ }
191
+ try {
192
+ return await this.recoveryStore.keep({ path, rawText, reason: SettingsRecoveryReason.InvalidJson });
193
+ } catch (error) {
194
+ console.error(new Error(`Could not keep a recovery copy of "${path}"`, { cause: error }));
195
+ return null;
196
+ }
197
+ }
198
+ async readRawFile(path) {
199
+ const adapter = this.plugin.app.vault.adapter;
200
+ try {
201
+ return await adapter.exists(path) ? await adapter.read(path) : null;
202
+ } catch {
203
+ return null;
204
+ }
205
+ }
206
+ }
207
+ class PluginDataParseError extends Error {
208
+ /**
209
+ * The path of the plugin's `data.json`.
210
+ */
211
+ path;
212
+ /**
213
+ * The `manifest.id` of the plugin.
214
+ */
215
+ pluginId;
216
+ /**
217
+ * The `manifest.name` of the plugin.
218
+ */
219
+ pluginName;
220
+ /**
221
+ * The recovery copy kept of the file, or `null` when none could be kept.
222
+ */
223
+ recoveryCopy;
224
+ /**
225
+ * Creates a {@link PluginDataParseError}.
226
+ *
227
+ * @param params - The parameters for the error.
228
+ */
229
+ constructor(params) {
230
+ const copy = params.recoveryCopy === null ? "No recovery copy could be kept." : `A recovery copy was kept on this device as "${params.recoveryCopy.id}".`;
231
+ super(
232
+ `Plugin "${params.pluginName}" (${params.pluginId}): "${params.path}" is not valid JSON, so it could not be loaded. The file was left untouched. ${copy}`,
233
+ { cause: params.cause }
234
+ );
235
+ this.name = "PluginDataParseError";
236
+ this.path = params.path;
237
+ this.pluginId = params.pluginId;
238
+ this.pluginName = params.pluginName;
239
+ this.recoveryCopy = params.recoveryCopy;
240
+ }
241
+ }
242
+ class PluginDataSizeLimitExceededError extends Error {
243
+ /**
244
+ * The size limit, in bytes.
245
+ */
246
+ maxSizeInBytes;
247
+ /**
248
+ * The refused operation.
249
+ */
250
+ operation;
251
+ /**
252
+ * The path of the plugin's `data.json`.
253
+ */
254
+ path;
255
+ /**
256
+ * The `manifest.id` of the plugin.
257
+ */
258
+ pluginId;
259
+ /**
260
+ * The `manifest.name` of the plugin.
261
+ */
262
+ pluginName;
263
+ /**
264
+ * The size of the existing file (load) or of the serialized data (save), in bytes.
265
+ */
266
+ sizeInBytes;
267
+ /**
268
+ * Creates a {@link PluginDataSizeLimitExceededError}.
269
+ *
270
+ * @param params - The parameters for the error.
271
+ */
272
+ constructor(params) {
273
+ const what = params.operation === "load" /* Load */ ? `Refusing to load "${params.path}": the file is ${String(params.sizeInBytes)} bytes` : `Refusing to save "${params.path}": the data would be ${String(params.sizeInBytes)} bytes`;
274
+ const consequence = params.operation === "load" /* Load */ ? "The file was left untouched." : "Nothing was written, so the last saved file remains.";
275
+ super(
276
+ `Plugin "${params.pluginName}" (${params.pluginId}): ${what}, over the ${String(params.maxSizeInBytes)}-byte limit. ${consequence} Keep data.json for small settings, and move large or growing state to LocalDataStore or SharedDataStore.`
277
+ );
278
+ this.name = "PluginDataSizeLimitExceededError";
279
+ this.maxSizeInBytes = params.maxSizeInBytes;
280
+ this.operation = params.operation;
281
+ this.path = params.path;
282
+ this.pluginId = params.pluginId;
283
+ this.pluginName = params.pluginName;
284
+ this.sizeInBytes = params.sizeInBytes;
32
285
  }
33
286
  }
34
287
  export {
35
- PluginDataHandler
288
+ DEFAULT_PLUGIN_DATA_MAX_SIZE_IN_BYTES,
289
+ PluginDataHandler,
290
+ PluginDataOperation,
291
+ PluginDataParseError,
292
+ PluginDataSizeLimitExceededError
36
293
  };
37
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RhdGEtaGFuZGxlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgbW9kdWxlIGZvciBoYW5kbGluZyBkYXRhIGxvYWRpbmcgYW5kIHNhdmluZyB0byB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG4vKipcbiAqIEEgaGFuZGxlciBmb3IgbG9hZGluZyBhbmQgc2F2aW5nIGRhdGEgdG8gdGhlIHBsdWdpbidzIGRhdGEgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhSGFuZGxlciB7XG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRvIGxvYWQgZGF0YSBmcm9tIHRoZSBwbHVnaW4ncyBkYXRhIGZpbGUuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBsb2FkZWQgZGF0YS5cbiAgICovXG4gIHJlYWRvbmx5IGxvYWREYXRhOiAoKSA9PiBQcm9taXNlPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRvIHNhdmUgZGF0YSB0byB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBkYXRhIHRvIHNhdmUuXG4gICAqL1xuICByZWFkb25seSBzYXZlRGF0YTogKGRhdGE6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQSBoYW5kbGVyIGZvciBsb2FkaW5nIGFuZCBzYXZpbmcgZGF0YSB0byB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luRGF0YUhhbmRsZXIgaW1wbGVtZW50cyBEYXRhSGFuZGxlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsdWdpbiBkYXRhIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBwbHVnaW46IFBsdWdpbikge31cblxuICAvKipcbiAgICogTG9hZHMgZGF0YSBmcm9tIHRoZSBwbHVnaW4ncyBkYXRhIGZpbGUuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBsb2FkZWQgZGF0YS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkRGF0YSgpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5wbHVnaW4ubG9hZERhdGEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBkYXRhIHRvIHRoZSBwbHVnaW4ncyBkYXRhIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIGRhdGEgdG8gc2F2ZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGF0YSBpcyBzYXZlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzYXZlRGF0YShkYXRhOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMucGx1Z2luLnNhdmVEYXRhKGRhdGEpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQThCTyxNQUFNLGtCQUF5QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU03QyxZQUErQixRQUFnQjtBQUFoQjtBQUFBLEVBQWlCO0FBQUEsRUFBakI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPdEMsTUFBYSxXQUE2QjtBQUN4QyxXQUFPLEtBQUssT0FBTyxTQUFTO0FBQUEsRUFDOUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE1BQWEsU0FBUyxNQUE4QjtBQUNsRCxXQUFPLEtBQUssT0FBTyxTQUFTLElBQUk7QUFBQSxFQUNsQztBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
294
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhLWhhbmRsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgbW9kdWxlIGZvciBoYW5kbGluZyBkYXRhIGxvYWRpbmcgYW5kIHNhdmluZyB0byB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLlxuICpcbiAqIHtAbGluayBQbHVnaW5EYXRhSGFuZGxlcn0gYm91bmRzIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYCBpbiBieXRlcywgaW4gYm90aCBkaXJlY3Rpb25zLCBiZWNhdXNlIE9ic2lkaWFuIGRvZXNcbiAqIG5vdC4gUmVhZCBmcm9tIE9ic2lkaWFuIGAxLjE1LjFgOiBgUGx1Z2luLmxvYWREYXRhYCByZWFkcyB0aGUgd2hvbGUgZmlsZSBhbmQgYEpTT04ucGFyc2VgcyBpdCB3aXRoIG5vIGxpbWl0LCBzbyBhblxuICogb3ZlcnNpemVkIGZpbGUgaXMgZnVsbHkgcmVhZCBhbmQgcGFyc2VkIGludG8gbWVtb3J5IG9uIGV2ZXJ5IHN0YXJ0dXAsIGFuZCBgUGx1Z2luLnNhdmVEYXRhYCB3cml0ZXNcbiAqIGBKU09OLnN0cmluZ2lmeShkYXRhLCB1bmRlZmluZWQsIDIpYCB3aXRoIG5vIGxpbWl0IGVpdGhlci4gT2JzaWRpYW4gYWxzbyBzd2FsbG93cyBhIGZhaWxlZCByZWFkIG9yIHdyaXRlOiBpdHNcbiAqIGByZWFkSnNvbmAgbG9ncyBhIHBhcnNlIGZhaWx1cmUgYW5kIHJlc29sdmVzIGB1bmRlZmluZWRgLCBhbmQgaXRzIGB3cml0ZUpzb25gIGNhdGNoZXMgZXZlcnkgZXJyb3IuIFNvIHRoZSBndWFyZFxuICogaGFzIHRvIGRlY2lkZSBCRUZPUkUgaGFuZGluZyB0aGUgY2FsbCB0byBPYnNpZGlhbiwgd2hpY2ggaXMgdGhlIG9ubHkgcG9pbnQgd2hlcmUgcmVmdXNpbmcgc3RpbGwgY2hhbmdlcyB0aGVcbiAqIG91dGNvbWUuXG4gKlxuICogVGhlIHNhbWUgYHJlYWRKc29uYCBtYWtlcyBhIGBkYXRhLmpzb25gIHRoYXQgRVhJU1RTIGJ1dCBkb2VzIG5vdCBwYXJzZSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIG5vIGZpbGUgYXQgYWxsOiBib3RoXG4gKiByZXNvbHZlIGB1bmRlZmluZWRgLiBBIHNldHRpbmdzIGNvbXBvbmVudCByZWFkaW5nIHRoYXQgYXMgXCJub3RoaW5nIHN0b3JlZFwiIHNhdmVzIGl0cyBkZWZhdWx0cyBvdmVyIHRoZSBmaWxlLCBhbmRcbiAqIHRoZSB1c2VyJ3Mgc2V0dGluZ3MgYXJlIGdvbmUuIFNvIHdoZW4gT2JzaWRpYW4gYW5zd2VycyBgdW5kZWZpbmVkYCBvciBgbnVsbGAsIHtAbGluayBQbHVnaW5EYXRhSGFuZGxlci5sb2FkRGF0YX1cbiAqIHJlYWRzIHRoZSBmaWxlIHJhdyBhbmQgcGFyc2VzIGl0IGl0c2VsZjsgYSBmaWxlIHRoYXQgZG9lcyBub3QgcGFyc2UgaXMgY29waWVkIGludG8gdGhlIGRldmljZS1sb2NhbFxuICoge0BsaW5rIFNldHRpbmdzUmVjb3ZlcnlTdG9yZX0gYW5kIHJlcG9ydGVkIGFzIGEge0BsaW5rIFBsdWdpbkRhdGFQYXJzZUVycm9yfSwgbmV2ZXIgYXMgbWlzc2luZy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgbm9ybWFsaXplUGF0aCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBTZXR0aW5nc1JlY292ZXJ5Q29weSxcbiAgU2V0dGluZ3NSZWNvdmVyeVN0b3JlXG59IGZyb20gJy4vc2V0dGluZ3MtcmVjb3ZlcnkudHMnO1xuXG5pbXBvcnQgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgdCB9IGZyb20gJy4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7XG4gIExvY2FsU2V0dGluZ3NSZWNvdmVyeVN0b3JlLFxuICBTZXR0aW5nc1JlY292ZXJ5UmVhc29uXG59IGZyb20gJy4vc2V0dGluZ3MtcmVjb3ZlcnkudHMnO1xuXG4vKipcbiAqIFRoZSBpbmRlbnRhdGlvbiBPYnNpZGlhbidzIGBWYXVsdC53cml0ZUpzb25gIHBhc3NlcyB0byBgSlNPTi5zdHJpbmdpZnlgIGZvciBgZGF0YS5qc29uYCAocmVhZCBmcm9tIGAxLjE1LjFgKS5cbiAqL1xuY29uc3QgT0JTSURJQU5fSlNPTl9JTkRFTlQgPSAyO1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IG1heGltdW0gc2l6ZSBvZiBhIHBsdWdpbidzIGBkYXRhLmpzb25gLCBpbiBieXRlczogMTYgTWlCLlxuICpcbiAqIFRoaXMgaXMgYSBwcm90ZWN0aXZlIGJ1ZGdldCBhZ2FpbnN0IHN0YXJ0dXAgZXhoYXVzdGlvbiwgbm90IGEgc3luYyBxdW90YS4gT2JzaWRpYW4gU3luYydzIG93biBwZXItZmlsZSBsaW1pdFxuICogZGVwZW5kcyBvbiB0aGUgcGxhbiBhbmQgaXMgYSBzZXBhcmF0ZSBjb25zdHJhaW50IGEgcGx1Z2luIG1heSB3YW50IHRvIHN0YXkgd2VsbCB1bmRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUExVR0lOX0RBVEFfTUFYX1NJWkVfSU5fQllURVMgPSAxNl83NzdfMjE2O1xuXG4vKipcbiAqIFRoZSBvcGVyYXRpb24gYSB7QGxpbmsgUGx1Z2luRGF0YVNpemVMaW1pdEV4Y2VlZGVkRXJyb3J9IHJlZnVzZWQuXG4gKi9cbmV4cG9ydCBlbnVtIFBsdWdpbkRhdGFPcGVyYXRpb24ge1xuICAvKipcbiAgICogTG9hZGluZyB0aGUgZXhpc3RpbmcgYGRhdGEuanNvbmAuXG4gICAqL1xuICBMb2FkID0gJ2xvYWQnLFxuXG4gIC8qKlxuICAgKiBTYXZpbmcgYSBuZXcgYGRhdGEuanNvbmAuXG4gICAqL1xuICBTYXZlID0gJ3NhdmUnXG59XG5cbi8qKlxuICogQSBoYW5kbGVyIGZvciBsb2FkaW5nIGFuZCBzYXZpbmcgZGF0YSB0byB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFIYW5kbGVyIHtcbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdG8gbG9hZCBkYXRhIGZyb20gdGhlIHBsdWdpbidzIGRhdGEgZmlsZS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGxvYWRlZCBkYXRhLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZERhdGE6ICgpID0+IFByb21pc2U8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFdoZXJlIGEgY29weSBvZiB0aGUgZGF0YSBmaWxlIGlzIGtlcHQgYmVmb3JlIGFueXRoaW5nIGNvdWxkIGxvc2Ugd2hhdCBpdCBoZWxkLCBvciBgbnVsbGAgKG9yIGFic2VudCkgd2hlbiB0aGVcbiAgICogaGFuZGxlciBrZWVwcyBub25lLiBBIHNldHRpbmdzIGNvbXBvbmVudCBrZWVwcyBhIGNvcHkgaGVyZSBiZWZvcmUgYSBmaXJzdCBzYXZlIHRoYXQgd291bGQgZHJvcCBvciBjaGFuZ2UgYVxuICAgKiBzdG9yZWQgdmFsdWUsIGFuZCBza2lwcyB0aGF0IHNhdmUgd2hlbiB0aGUgY29weSBjYW5ub3QgYmUga2VwdC5cbiAgICovXG4gIHJlYWRvbmx5IHJlY292ZXJ5U3RvcmU/OiBudWxsIHwgU2V0dGluZ3NSZWNvdmVyeVN0b3JlO1xuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRvIHNhdmUgZGF0YSB0byB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBkYXRhIHRvIHNhdmUuXG4gICAqL1xuICByZWFkb25seSBzYXZlRGF0YTogKGRhdGE6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIFBsdWdpbkRhdGFIYW5kbGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5EYXRhSGFuZGxlckNvbnN0cnVjdG9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBzaXplIG9mIGBkYXRhLmpzb25gLCBpbiBVVEYtOCBieXRlcyBhcyB3cml0dGVuIHRvIGRpc2suIERlZmF1bHRzIHRvXG4gICAqIHtAbGluayBERUZBVUxUX1BMVUdJTl9EQVRBX01BWF9TSVpFX0lOX0JZVEVTfS4gUGFzcyBgSW5maW5pdHlgIHRvIGRpc2FibGUgdGhlIGd1YXJkLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4U2l6ZUluQnl0ZXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXJlIHJlY292ZXJ5IGNvcGllcyBvZiBgZGF0YS5qc29uYCBhcmUga2VwdC4gRGVmYXVsdHMgdG8gYSBkZXZpY2UtbG9jYWwge0BsaW5rIExvY2FsU2V0dGluZ3NSZWNvdmVyeVN0b3JlfVxuICAgKiBmb3IgdGhlIHBsdWdpbi4gUGFzcyBgbnVsbGAgdG8ga2VlcCBub25lOiBhbiB1bnBhcnNlYWJsZSBmaWxlIGlzIHRoZW4gc3RpbGwgcmVwb3J0ZWQgYW5kIG5ldmVyIG92ZXJ3cml0dGVuLCBzbyBhXG4gICAqIHNldHRpbmdzIGNvbXBvbmVudCBidWlsdCBvbiB0aGlzIGhhbmRsZXIgZmFpbHMgaXRzIGxvYWQgcmF0aGVyIHRoYW4gcnVuIG9uIGRlZmF1bHRzLCBhbmQgYSBmaXJzdCBzYXZlIHRoYXQgZHJvcHNcbiAgICogb3IgY2hhbmdlcyBhIHN0b3JlZCB2YWx1ZSBpcyB3cml0dGVuIHdpdGggbm8gY29weSBrZXB0LCBhcyBiZWZvcmUgcmVjb3ZlcnkgY29waWVzIGV4aXN0ZWQuXG4gICAqL1xuICByZWFkb25seSByZWNvdmVyeVN0b3JlPzogbnVsbCB8IFNldHRpbmdzUmVjb3ZlcnlTdG9yZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUGx1Z2luRGF0YVBhcnNlRXJyb3J9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkRhdGFQYXJzZUVycm9yQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGVycm9yIGBKU09OLnBhcnNlYCB0aHJldy5cbiAgICovXG4gIHJlYWRvbmx5IGNhdXNlOiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgcGx1Z2luJ3MgYGRhdGEuanNvbmAuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0Lm5hbWVgIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvdmVyeSBjb3B5IGtlcHQgb2YgdGhlIGZpbGUsIG9yIGBudWxsYCB3aGVuIG5vbmUgY291bGQgYmUga2VwdC5cbiAgICovXG4gIHJlYWRvbmx5IHJlY292ZXJ5Q29weTogbnVsbCB8IFNldHRpbmdzUmVjb3ZlcnlDb3B5O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBQbHVnaW5EYXRhU2l6ZUxpbWl0RXhjZWVkZWRFcnJvcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRGF0YVNpemVMaW1pdEV4Y2VlZGVkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBsaW1pdCwgaW4gYnl0ZXMuXG4gICAqL1xuICByZWFkb25seSBtYXhTaXplSW5CeXRlczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVmdXNlZCBvcGVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246IFBsdWdpbkRhdGFPcGVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QubmFtZWAgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGV4aXN0aW5nIGZpbGUgKGxvYWQpIG9yIG9mIHRoZSBzZXJpYWxpemVkIGRhdGEgKHNhdmUpLCBpbiBieXRlcy5cbiAgICovXG4gIHJlYWRvbmx5IHNpemVJbkJ5dGVzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBoYW5kbGVyIGZvciBsb2FkaW5nIGFuZCBzYXZpbmcgZGF0YSB0byB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLCByZWZ1c2luZyBhIGBkYXRhLmpzb25gIGxhcmdlciB0aGFuIGEgYnl0ZSBsaW1pdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkRhdGFIYW5kbGVyIGltcGxlbWVudHMgRGF0YUhhbmRsZXIge1xuICAvKipcbiAgICogV2hlcmUgcmVjb3ZlcnkgY29waWVzIG9mIGBkYXRhLmpzb25gIGFyZSBrZXB0LCBvciBgbnVsbGAgd2hlbiBub25lIGFyZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZWNvdmVyeVN0b3JlOiBudWxsIHwgU2V0dGluZ3NSZWNvdmVyeVN0b3JlO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBzaXplIG9mIGBkYXRhLmpzb25gLCBpbiBieXRlcy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBtYXhTaXplSW5CeXRlczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsdWdpbiBkYXRhIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBwbHVnaW46IFBsdWdpbiwgb3B0aW9uczogUGx1Z2luRGF0YUhhbmRsZXJDb25zdHJ1Y3Rvck9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IG1heFNpemVJbkJ5dGVzID0gb3B0aW9ucy5tYXhTaXplSW5CeXRlcyA/PyBERUZBVUxUX1BMVUdJTl9EQVRBX01BWF9TSVpFX0lOX0JZVEVTO1xuICAgIGlmIChOdW1iZXIuaXNOYU4obWF4U2l6ZUluQnl0ZXMpIHx8IG1heFNpemVJbkJ5dGVzIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYG1heFNpemVJbkJ5dGVzIG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLCBnb3QgJHtTdHJpbmcobWF4U2l6ZUluQnl0ZXMpfS5gKTtcbiAgICB9XG4gICAgdGhpcy5tYXhTaXplSW5CeXRlcyA9IG1heFNpemVJbkJ5dGVzO1xuICAgIHRoaXMucmVjb3ZlcnlTdG9yZSA9IG9wdGlvbnMucmVjb3ZlcnlTdG9yZSA9PT0gdW5kZWZpbmVkXG4gICAgICA/IG5ldyBMb2NhbFNldHRpbmdzUmVjb3ZlcnlTdG9yZSh7IGFwcDogcGx1Z2luLmFwcCwgcGx1Z2luSWQ6IHBsdWdpbi5tYW5pZmVzdC5pZCB9KVxuICAgICAgOiBvcHRpb25zLnJlY292ZXJ5U3RvcmU7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgZGF0YSBmcm9tIHRoZSBwbHVnaW4ncyBkYXRhIGZpbGUuXG4gICAqXG4gICAqIFRoZSBmaWxlJ3Mgc2l6ZSBpcyByZWFkIHRocm91Z2ggdGhlIGFkYXB0ZXIgQkVGT1JFIE9ic2lkaWFuIHJlYWRzIGFuZCBwYXJzZXMgaXQsIHNvIGFuIG92ZXJzaXplZCBmaWxlIGlzIG5ldmVyXG4gICAqIGxvYWRlZCBpbnRvIG1lbW9yeS4gV2hlbiBPYnNpZGlhbiBhbnN3ZXJzIGB1bmRlZmluZWRgIG9yIGBudWxsYCwgdGhlIGZpbGUgaXMgcmVhZCByYXcgYW5kIHBhcnNlZCBoZXJlLCBiZWNhdXNlXG4gICAqIE9ic2lkaWFuIGFuc3dlcnMgYHVuZGVmaW5lZGAgZm9yIGEgZmlsZSB0aGF0IGV4aXN0cyBidXQgZG9lcyBub3QgcGFyc2UgdG9vLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbG9hZGVkIGRhdGEuXG4gICAqIEB0aHJvd3Mge0BsaW5rIFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yfSBJZiB0aGUgZXhpc3RpbmcgZmlsZSBpcyBsYXJnZXIgdGhhbiB0aGUgbGltaXQuXG4gICAqIEB0aHJvd3Mge0BsaW5rIFBsdWdpbkRhdGFQYXJzZUVycm9yfSBJZiB0aGUgZXhpc3RpbmcgZmlsZSBpcyBub3QgdmFsaWQgSlNPTi4gVGhlIGZpbGUgaXMgbGVmdCB1bnRvdWNoZWQsIGFuZCBhXG4gICAqIHJlY292ZXJ5IGNvcHkgb2YgaXQgaXMga2VwdCBmaXJzdCB3aGVuIHRoZSBoYW5kbGVyIGhhcyBhIHJlY292ZXJ5IHN0b3JlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWREYXRhKCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHNpemVJbkJ5dGVzID0gYXdhaXQgdGhpcy5nZXRFeGlzdGluZ0ZpbGVTaXplKCk7XG4gICAgaWYgKHNpemVJbkJ5dGVzICE9PSBudWxsICYmIHNpemVJbkJ5dGVzID4gdGhpcy5tYXhTaXplSW5CeXRlcykge1xuICAgICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihQbHVnaW5EYXRhT3BlcmF0aW9uLkxvYWQsIHNpemVJbkJ5dGVzKTtcbiAgICB9XG4gICAgY29uc3QgZGF0YTogdW5rbm93biA9IGF3YWl0IHRoaXMucGx1Z2luLmxvYWREYXRhKCk7XG4gICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCAmJiBkYXRhICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gdGhpcy5nZXREYXRhRmlsZVBhdGgoKTtcbiAgICBpZiAocGF0aCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGNvbnN0IHJhd1RleHQgPSBhd2FpdCB0aGlzLnJlYWRSYXdGaWxlKHBhdGgpO1xuICAgIGlmIChyYXdUZXh0ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkOiB1bmtub3duID0gSlNPTi5wYXJzZShyYXdUZXh0KTtcbiAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgUGx1Z2luRGF0YVBhcnNlRXJyb3Ioe1xuICAgICAgICBjYXVzZTogcGFyc2VFcnJvcixcbiAgICAgICAgcGF0aCxcbiAgICAgICAgcGx1Z2luSWQ6IHRoaXMucGx1Z2luLm1hbmlmZXN0LmlkLFxuICAgICAgICBwbHVnaW5OYW1lOiB0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lLFxuICAgICAgICByZWNvdmVyeUNvcHk6IGF3YWl0IHRoaXMua2VlcFJlY292ZXJ5Q29weShwYXRoLCByYXdUZXh0KVxuICAgICAgfSk7XG4gICAgICB0aGlzLnJlcG9ydFBhcnNlRXJyb3IoZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGRhdGEgdG8gdGhlIHBsdWdpbidzIGRhdGEgZmlsZS5cbiAgICpcbiAgICogVGhlIGRhdGEgaXMgc2VyaWFsaXplZCBleGFjdGx5IGFzIE9ic2lkaWFuIHdyaXRlcyBpdCwgYW5kIGl0cyBVVEYtOCBieXRlIGxlbmd0aCBpcyBjaGVja2VkIGJlZm9yZSBhbnl0aGluZyBpc1xuICAgKiB3cml0dGVuLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBkYXRhIHRvIHNhdmUuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRhdGEgaXMgc2F2ZWQuXG4gICAqIEB0aHJvd3Mge0BsaW5rIFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yfSBJZiB0aGUgc2VyaWFsaXplZCBkYXRhIGlzIGxhcmdlciB0aGFuIHRoZSBsaW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzYXZlRGF0YShkYXRhOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMubWF4U2l6ZUluQnl0ZXMgIT09IEluZmluaXR5KSB7XG4gICAgICAvLyBPYnNpZGlhbidzIGB3cml0ZUpzb25gIHdvdWxkIHN3YWxsb3cgYSBzZXJpYWxpemF0aW9uIGZhaWx1cmUgYW5kIHdyaXRlIG5vdGhpbmc7IHRocm93aW5nIGhlcmUgaW5zdGVhZCBrZWVwc1xuICAgICAgLy8gdGhlIGRpc2sgdW5jaGFuZ2VkIHRvbywgYW5kIHRlbGxzIHRoZSBjYWxsZXIuXG4gICAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkoZGF0YSwgdW5kZWZpbmVkLCBPQlNJRElBTl9KU09OX0lOREVOVCk7XG4gICAgICBpZiAoc2VyaWFsaXplZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHNpemVJbkJ5dGVzID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHNlcmlhbGl6ZWQpLmJ5dGVMZW5ndGg7XG4gICAgICAgIGlmIChzaXplSW5CeXRlcyA+IHRoaXMubWF4U2l6ZUluQnl0ZXMpIHtcbiAgICAgICAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKFBsdWdpbkRhdGFPcGVyYXRpb24uU2F2ZSwgc2l6ZUluQnl0ZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHBhdGggb2YgdGhlIHBsdWdpbidzIGBkYXRhLmpzb25gLCBhcyBPYnNpZGlhbidzIGBQbHVnaW4ubG9hZERhdGFgIHJlYWRzIGl0LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcGF0aCwgb3IgYG51bGxgIHdoZW4gdGhlIG1hbmlmZXN0IGhhcyBubyBmb2xkZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0RGF0YUZpbGVQYXRoKCk6IG51bGwgfCBzdHJpbmcge1xuICAgIGNvbnN0IGRpcmVjdG9yeSA9IHRoaXMucGx1Z2luLm1hbmlmZXN0LmRpcjtcbiAgICByZXR1cm4gZGlyZWN0b3J5ID8gbm9ybWFsaXplUGF0aChgJHtkaXJlY3Rvcnl9L2RhdGEuanNvbmApIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZWxscyB0aGUgdXNlciB0aGF0IGBkYXRhLmpzb25gIGNvdWxkIG5vdCBiZSBwYXJzZWQ6IGEgbm90aWNlIG5hbWluZyB0aGUgcGx1Z2luIGFuZCB0aGUgcGF0aCwgYW5kIHRoZSBlcnJvciBpbiB0aGVcbiAgICogY29uc29sZS5cbiAgICpcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIHBhcnNlIGVycm9yLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlcG9ydFBhcnNlRXJyb3IoZXJyb3I6IFBsdWdpbkRhdGFQYXJzZUVycm9yKTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgbmV3IFBsdWdpbk5vdGljZUNvbXBvbmVudCh7XG4gICAgICBhcHA6IHRoaXMucGx1Z2luLmFwcCxcbiAgICAgIHBsdWdpbk5hbWU6IHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWVcbiAgICB9KS5zaG93Tm90aWNlKFxuICAgICAgZXJyb3IucmVjb3ZlcnlDb3B5ID09PSBudWxsXG4gICAgICAgID8gdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5ub3RpY2VzLmRhdGFGaWxlVW5wYXJzZWFibGUsIHsgcGF0aDogZXJyb3IucGF0aCB9KVxuICAgICAgICA6IHQoKCQpID0+ICQub2JzaWRpYW5MaWIubm90aWNlcy5kYXRhRmlsZVVucGFyc2VhYmxlQ29weUtlcHQsIHsgcGF0aDogZXJyb3IucGF0aCB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVycm9yKG9wZXJhdGlvbjogUGx1Z2luRGF0YU9wZXJhdGlvbiwgc2l6ZUluQnl0ZXM6IG51bWJlcik6IFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yIHtcbiAgICByZXR1cm4gbmV3IFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yKHtcbiAgICAgIG1heFNpemVJbkJ5dGVzOiB0aGlzLm1heFNpemVJbkJ5dGVzLFxuICAgICAgb3BlcmF0aW9uLFxuICAgICAgcGF0aDogdGhpcy5nZXREYXRhRmlsZVBhdGgoKSA/PyAnZGF0YS5qc29uJyxcbiAgICAgIHBsdWdpbklkOiB0aGlzLnBsdWdpbi5tYW5pZmVzdC5pZCxcbiAgICAgIHBsdWdpbk5hbWU6IHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUsXG4gICAgICBzaXplSW5CeXRlc1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRFeGlzdGluZ0ZpbGVTaXplKCk6IFByb21pc2U8bnVsbCB8IG51bWJlcj4ge1xuICAgIGlmICh0aGlzLm1heFNpemVJbkJ5dGVzID09PSBJbmZpbml0eSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHBhdGggPSB0aGlzLmdldERhdGFGaWxlUGF0aCgpO1xuICAgIGlmIChwYXRoID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXQgPSBhd2FpdCB0aGlzLnBsdWdpbi5hcHAudmF1bHQuYWRhcHRlci5zdGF0KHBhdGgpO1xuICAgICAgcmV0dXJuIHN0YXQ/LnNpemUgPz8gbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRoZSBzaXplIGlzIHVua25vd24sIG5vdCBvdmVyc2l6ZWQ6IE9ic2lkaWFuJ3Mgb3duIHJlYWQgZGVjaWRlcyB3aGF0IGhhcHBlbnMgbmV4dCwgYXMgYmVmb3JlIHRoaXMgZ3VhcmQuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGtlZXBSZWNvdmVyeUNvcHkocGF0aDogc3RyaW5nLCByYXdUZXh0OiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCBTZXR0aW5nc1JlY292ZXJ5Q29weT4ge1xuICAgIGlmICh0aGlzLnJlY292ZXJ5U3RvcmUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVjb3ZlcnlTdG9yZS5rZWVwKHsgcGF0aCwgcmF3VGV4dCwgcmVhc29uOiBTZXR0aW5nc1JlY292ZXJ5UmVhc29uLkludmFsaWRKc29uIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG5ldyBFcnJvcihgQ291bGQgbm90IGtlZXAgYSByZWNvdmVyeSBjb3B5IG9mIFwiJHtwYXRofVwiYCwgeyBjYXVzZTogZXJyb3IgfSkpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkUmF3RmlsZShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5wbHVnaW4uYXBwLnZhdWx0LmFkYXB0ZXI7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBhZGFwdGVyLmV4aXN0cyhwYXRoKSA/IGF3YWl0IGFkYXB0ZXIucmVhZChwYXRoKSA6IG51bGw7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBVbnJlYWRhYmxlIGlzIG5vdCB1bnBhcnNlYWJsZTogT2JzaWRpYW4ncyBvd24gYW5zd2VyIHN0YW5kcywgYXMgYmVmb3JlIHRoaXMgY2hlY2suXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHBsdWdpbidzIGBkYXRhLmpzb25gIGV4aXN0cyBidXQgaXMgbm90IHZhbGlkIEpTT04uXG4gKlxuICogVGhlIGZpbGUgaXMgbmV2ZXIgdG91Y2hlZCB3aGVuIHRoaXMgaXMgdGhyb3duLiBXaGVuIHtAbGluayByZWNvdmVyeUNvcHl9IGlzIG5vdCBgbnVsbGAsIGEgY29weSBvZiB0aGUgZmlsZSdzIHJhdyB0ZXh0XG4gKiB3YXMga2VwdCBvbiB0aGlzIGRldmljZSBmaXJzdCwgc28gZXZlbiBhIGxhdGVyIHNhdmUgb3ZlciB0aGUgZmlsZSBsb3NlcyBub3RoaW5nLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luRGF0YVBhcnNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgcGx1Z2luJ3MgYGRhdGEuanNvbmAuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QubmFtZWAgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvdmVyeSBjb3B5IGtlcHQgb2YgdGhlIGZpbGUsIG9yIGBudWxsYCB3aGVuIG5vbmUgY291bGQgYmUga2VwdC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZWNvdmVyeUNvcHk6IG51bGwgfCBTZXR0aW5nc1JlY292ZXJ5Q29weTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBQbHVnaW5EYXRhUGFyc2VFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVycm9yLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luRGF0YVBhcnNlRXJyb3JDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIGNvbnN0IGNvcHkgPSBwYXJhbXMucmVjb3ZlcnlDb3B5ID09PSBudWxsXG4gICAgICA/ICdObyByZWNvdmVyeSBjb3B5IGNvdWxkIGJlIGtlcHQuJ1xuICAgICAgOiBgQSByZWNvdmVyeSBjb3B5IHdhcyBrZXB0IG9uIHRoaXMgZGV2aWNlIGFzIFwiJHtwYXJhbXMucmVjb3ZlcnlDb3B5LmlkfVwiLmA7XG4gICAgc3VwZXIoXG4gICAgICBgUGx1Z2luIFwiJHtwYXJhbXMucGx1Z2luTmFtZX1cIiAoJHtwYXJhbXMucGx1Z2luSWR9KTogXCIke3BhcmFtcy5wYXRofVwiIGlzIG5vdCB2YWxpZCBKU09OLCBzbyBpdCBjb3VsZCBub3QgYmUgbG9hZGVkLiBUaGUgZmlsZSB3YXMgbGVmdCB1bnRvdWNoZWQuICR7Y29weX1gLFxuICAgICAgeyBjYXVzZTogcGFyYW1zLmNhdXNlIH1cbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdQbHVnaW5EYXRhUGFyc2VFcnJvcic7XG4gICAgdGhpcy5wYXRoID0gcGFyYW1zLnBhdGg7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnBsdWdpbk5hbWUgPSBwYXJhbXMucGx1Z2luTmFtZTtcbiAgICB0aGlzLnJlY292ZXJ5Q29weSA9IHBhcmFtcy5yZWNvdmVyeUNvcHk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHBsdWdpbidzIGBkYXRhLmpzb25gIGlzLCBvciB3b3VsZCBiZWNvbWUsIGxhcmdlciB0aGFuIHRoZSBjb25maWd1cmVkIGxpbWl0LlxuICpcbiAqIFRoZSBmaWxlIG9uIGRpc2sgaXMgbmV2ZXIgdG91Y2hlZCB3aGVuIHRoaXMgaXMgdGhyb3duOiBhbiBvdmVyc2l6ZWQgZXhpc3RpbmcgZmlsZSBpcyBsZWZ0IGludGFjdCBmb3IgdGhlIHVzZXIgdG9cbiAqIGluc3BlY3Qgb3IgdHJpbSwgYW5kIGFuIG92ZXJzaXplZCBzYXZlIGlzIHJlZnVzZWQgYmVmb3JlIGFueXRoaW5nIGlzIHdyaXR0ZW4sIHNvIHRoZSBsYXN0IGdvb2QgZmlsZSByZW1haW5zLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luRGF0YVNpemVMaW1pdEV4Y2VlZGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBsaW1pdCwgaW4gYnl0ZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbWF4U2l6ZUluQnl0ZXM6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHJlZnVzZWQgb3BlcmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9wZXJhdGlvbjogUGx1Z2luRGF0YU9wZXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIHBsdWdpbidzIGBkYXRhLmpzb25gLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0Lm5hbWVgIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgZXhpc3RpbmcgZmlsZSAobG9hZCkgb3Igb2YgdGhlIHNlcmlhbGl6ZWQgZGF0YSAoc2F2ZSksIGluIGJ5dGVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNpemVJbkJ5dGVzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgUGx1Z2luRGF0YVNpemVMaW1pdEV4Y2VlZGVkRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlcnJvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBjb25zdCB3aGF0ID0gcGFyYW1zLm9wZXJhdGlvbiA9PT0gUGx1Z2luRGF0YU9wZXJhdGlvbi5Mb2FkXG4gICAgICA/IGBSZWZ1c2luZyB0byBsb2FkIFwiJHtwYXJhbXMucGF0aH1cIjogdGhlIGZpbGUgaXMgJHtTdHJpbmcocGFyYW1zLnNpemVJbkJ5dGVzKX0gYnl0ZXNgXG4gICAgICA6IGBSZWZ1c2luZyB0byBzYXZlIFwiJHtwYXJhbXMucGF0aH1cIjogdGhlIGRhdGEgd291bGQgYmUgJHtTdHJpbmcocGFyYW1zLnNpemVJbkJ5dGVzKX0gYnl0ZXNgO1xuICAgIGNvbnN0IGNvbnNlcXVlbmNlID0gcGFyYW1zLm9wZXJhdGlvbiA9PT0gUGx1Z2luRGF0YU9wZXJhdGlvbi5Mb2FkXG4gICAgICA/ICdUaGUgZmlsZSB3YXMgbGVmdCB1bnRvdWNoZWQuJ1xuICAgICAgOiAnTm90aGluZyB3YXMgd3JpdHRlbiwgc28gdGhlIGxhc3Qgc2F2ZWQgZmlsZSByZW1haW5zLic7XG4gICAgc3VwZXIoXG4gICAgICBgUGx1Z2luIFwiJHtwYXJhbXMucGx1Z2luTmFtZX1cIiAoJHtwYXJhbXMucGx1Z2luSWR9KTogJHt3aGF0fSwgb3ZlciB0aGUgJHtTdHJpbmcocGFyYW1zLm1heFNpemVJbkJ5dGVzKX0tYnl0ZSBsaW1pdC4gJHtjb25zZXF1ZW5jZX0gYFxuICAgICAgICArICdLZWVwIGRhdGEuanNvbiBmb3Igc21hbGwgc2V0dGluZ3MsIGFuZCBtb3ZlIGxhcmdlIG9yIGdyb3dpbmcgc3RhdGUgdG8gTG9jYWxEYXRhU3RvcmUgb3IgU2hhcmVkRGF0YVN0b3JlLidcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdQbHVnaW5EYXRhU2l6ZUxpbWl0RXhjZWVkZWRFcnJvcic7XG4gICAgdGhpcy5tYXhTaXplSW5CeXRlcyA9IHBhcmFtcy5tYXhTaXplSW5CeXRlcztcbiAgICB0aGlzLm9wZXJhdGlvbiA9IHBhcmFtcy5vcGVyYXRpb247XG4gICAgdGhpcy5wYXRoID0gcGFyYW1zLnBhdGg7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnBsdWdpbk5hbWUgPSBwYXJhbXMucGx1Z2luTmFtZTtcbiAgICB0aGlzLnNpemVJbkJ5dGVzID0gcGFyYW1zLnNpemVJbkJ5dGVzO1xuICB9XG59XG4iXSwibWFw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
@@ -55,6 +55,21 @@ export declare class DataStoreLocations {
55
55
  * @returns A promise that resolves when the new writer is ready.
56
56
  */
57
57
  relocate(location: DataStoreLocation): Promise<void>;
58
+ private buildChain;
58
59
  private createTransport;
60
+ /**
61
+ * Maps the records of an anchor folder that was moved (or sits under a moved folder) onto the folder the store is open
62
+ * at, because records name absolute folders.
63
+ *
64
+ * A transition that names its `anchor` is remapped from that folder exactly, so several successive moves resolve too.
65
+ * A transition written before that field existed names no anchor, and a moved anchor then looks the same as a chain whose
66
+ * first record has not arrived yet. So the former folder is inferred only when nothing starts at the initial identity,
67
+ * exactly one candidate folder (one the legacy records start from, in the initial format) yields a complete chain, and
68
+ * that folder no longer holds this store. Anything else is left for `buildChain` to reject.
69
+ *
70
+ * @param transitions - The transitions recorded at the anchor.
71
+ * @returns The transitions to build the chain from.
72
+ */
73
+ private resolveMovedAnchor;
59
74
  private validateLocation;
60
75
  }