obsidian-dev-utils 14.4.0 → 14.4.1-beta.1

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.
@@ -32,7 +32,7 @@ __export(Library_exports, {
32
32
  LIBRARY_VERSION: () => LIBRARY_VERSION
33
33
  });
34
34
  module.exports = __toCommonJS(Library_exports);
35
- const LIBRARY_VERSION = "14.4.0";
35
+ const LIBRARY_VERSION = "14.4.1-beta.1";
36
36
  const LIBRARY_NAME = "obsidian-dev-utils";
37
37
  const LIBRARY_STYLES = ".obsidian-dev-utils {\n /* default styles */\n}\n\n.obsidian-dev-utils.alert-modal {\n /* default styles */\n}\n\n.obsidian-dev-utils.confirm-modal {\n /* default styles */\n}\n\n.obsidian-dev-utils.plugin-settings-tab {\n /* default styles */\n}\n\n.obsidian-dev-utils.plugin-settings-tab .value-component-invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n\n.obsidian-dev-utils.prompt-modal {\n /* default styles */\n}\n\n.obsidian-dev-utils.select-item-modal {\n /* default styles */\n}\n";
38
38
  // Annotate the CommonJS export names for ESM import in node:
@@ -31,18 +31,73 @@ __export(PluginSettingsTabBase_exports, {
31
31
  });
32
32
  module.exports = __toCommonJS(PluginSettingsTabBase_exports);
33
33
  var import_obsidian = require('obsidian');
34
+ var import_Async = require('../../Async.cjs');
34
35
  var import_CssClass = require('../../CssClass.cjs');
35
36
  var import_PluginBase = require('./PluginBase.cjs');
36
37
  var import_PluginId = require('./PluginId.cjs');
38
+ var import_ValueComponent = require('./ValueComponent.cjs');
37
39
  class PluginSettingsTabBase extends import_obsidian.PluginSettingTab {
38
40
  constructor(plugin) {
39
41
  super(plugin.app, plugin);
40
42
  this.plugin = plugin;
41
43
  this.containerEl.addClass(import_CssClass.CssClass.LibraryName, (0, import_PluginId.getPluginId)(), import_CssClass.CssClass.PluginSettingsTab);
42
44
  }
45
+ validatorsMap = /* @__PURE__ */ new WeakMap();
46
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
47
+ async revalidate(valueComponent) {
48
+ const validator = this.validatorsMap.get(valueComponent);
49
+ if (validator) {
50
+ return await validator();
51
+ }
52
+ return true;
53
+ }
54
+ bind(valueComponent, property, options) {
55
+ const DEFAULT_OPTIONS = {
56
+ componentToPluginSettingsValueConverter: (value) => value,
57
+ pluginSettingsToComponentValueConverter: (value) => value,
58
+ shouldAutoSave: true,
59
+ shouldShowValidationMessage: true
60
+ };
61
+ const optionsExt = { ...DEFAULT_OPTIONS, ...options };
62
+ const pluginSettingsFn = () => optionsExt.pluginSettings ?? this.plugin.settingsCopy;
63
+ const validate = async (uiValue) => {
64
+ if (!optionsExt.valueValidator) {
65
+ return true;
66
+ }
67
+ uiValue ??= valueComponent.getValue();
68
+ const errorMessage = await optionsExt.valueValidator(uiValue);
69
+ const validatorElement2 = (0, import_ValueComponent.getValidatorElement)(valueComponent);
70
+ if (validatorElement2) {
71
+ validatorElement2.setCustomValidity(errorMessage ?? "");
72
+ validatorElement2.title = errorMessage ?? "";
73
+ validatorElement2.toggleClass(import_CssClass.CssClass.ValueComponentInvalid, !!errorMessage);
74
+ if (validatorElement2.isActiveElement() && optionsExt.shouldShowValidationMessage) {
75
+ validatorElement2.reportValidity();
76
+ }
77
+ }
78
+ return !errorMessage;
79
+ };
80
+ valueComponent.setValue(optionsExt.pluginSettingsToComponentValueConverter(pluginSettingsFn()[property])).onChange(async (uiValue) => {
81
+ if (!await validate(uiValue)) {
82
+ return;
83
+ }
84
+ const pluginSettings = pluginSettingsFn();
85
+ pluginSettings[property] = optionsExt.componentToPluginSettingsValueConverter(uiValue);
86
+ if (optionsExt.shouldAutoSave) {
87
+ await this.plugin.saveSettings(pluginSettings);
88
+ }
89
+ await optionsExt.onChanged?.();
90
+ });
91
+ const validatorElement = (0, import_ValueComponent.getValidatorElement)(valueComponent);
92
+ validatorElement?.addEventListener("focus", (0, import_Async.convertAsyncToSync)(() => validate()));
93
+ validatorElement?.addEventListener("blur", (0, import_Async.convertAsyncToSync)(() => validate()));
94
+ this.validatorsMap.set(valueComponent, () => validate());
95
+ (0, import_Async.invokeAsyncSafely)(() => validate());
96
+ return valueComponent;
97
+ }
43
98
  }
44
99
  // Annotate the CommonJS export names for ESM import in node:
45
100
  0 && (module.exports = {
46
101
  PluginSettingsTabBase
47
102
  });
48
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc1RhYkJhc2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uIFBsdWdpblNldHRpbmdzVGFiQmFzZVxuICogVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5nIHRhYnMgaW4gT2JzaWRpYW4uXG4gKiBJdCBwcm92aWRlcyBhIHV0aWxpdHkgbWV0aG9kIHRvIGJpbmQgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsZSBjaGFuZ2VzLlxuICovXG5cbmltcG9ydCB7IFBsdWdpblNldHRpbmdUYWIgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luU2V0dGluZ3NCYXNlIH0gZnJvbSAnLi9QbHVnaW5TZXR0aW5nc0Jhc2UudHMnO1xuXG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uLy4uL0Nzc0NsYXNzLnRzJztcbmltcG9ydCB7IFBsdWdpbkJhc2UgfSBmcm9tICcuL1BsdWdpbkJhc2UudHMnO1xuaW1wb3J0IHsgZ2V0UGx1Z2luSWQgfSBmcm9tICcuL1BsdWdpbklkLnRzJztcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBjcmVhdGluZyBwbHVnaW4gc2V0dGluZ3MgdGFicyBpbiBPYnNpZGlhbi5cbiAqIFByb3ZpZGVzIGEgbWV0aG9kIGZvciBiaW5kaW5nIHZhbHVlIGNvbXBvbmVudHMgdG8gcGx1Z2luIHNldHRpbmdzIGFuZCBoYW5kbGluZyBjaGFuZ2VzLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBsdWdpbiAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gdGhhdCBleHRlbmRzIFBsdWdpbkJhc2UuXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyBvYmplY3QuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQbHVnaW5TZXR0aW5nc1RhYkJhc2U8XG4gIFRQbHVnaW4gZXh0ZW5kcyBQbHVnaW5CYXNlPFBsdWdpblNldHRpbmdzPixcbiAgUGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nc0Jhc2UgPSBUUGx1Z2luIGV4dGVuZHMgUGx1Z2luQmFzZTxpbmZlciBQPiA/IFAgOiBuZXZlclxuPiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIG92ZXJyaWRlIHBsdWdpbjogVFBsdWdpbikge1xuICAgIHN1cGVyKHBsdWdpbi5hcHAsIHBsdWdpbik7XG4gICAgdGhpcy5jb250YWluZXJFbC5hZGRDbGFzcyhDc3NDbGFzcy5MaWJyYXJ5TmFtZSwgZ2V0UGx1Z2luSWQoKSwgQ3NzQ2xhc3MuUGx1Z2luU2V0dGluZ3NUYWIpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTUEsc0JBQWlDO0FBSWpDLHNCQUF5QjtBQUN6Qix3QkFBMkI7QUFDM0Isc0JBQTRCO0FBU3JCLE1BQWUsOEJBR1osaUNBQWlCO0FBQUEsRUFDbEIsWUFBNEIsUUFBaUI7QUFDbEQsVUFBTSxPQUFPLEtBQUssTUFBTTtBQURTO0FBRWpDLFNBQUssWUFBWSxTQUFTLHlCQUFTLGlCQUFhLDZCQUFZLEdBQUcseUJBQVMsaUJBQWlCO0FBQUEsRUFDM0Y7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
103
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc1RhYkJhc2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uIFBsdWdpblNldHRpbmdzVGFiQmFzZVxuICogVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5nIHRhYnMgaW4gT2JzaWRpYW4uXG4gKiBJdCBwcm92aWRlcyBhIHV0aWxpdHkgbWV0aG9kIHRvIGJpbmQgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsZSBjaGFuZ2VzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgVmFsdWVDb21wb25lbnQgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IFBsdWdpblNldHRpbmdUYWIgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgS2V5c01hdGNoaW5nIH0gZnJvbSAnLi4vLi4vQHR5cGVzLnRzJztcbmltcG9ydCB0eXBlIHsgTWF5YmVQcm9taXNlIH0gZnJvbSAnLi4vLi4vQXN5bmMudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5TZXR0aW5nc0Jhc2UgfSBmcm9tICcuL1BsdWdpblNldHRpbmdzQmFzZS50cyc7XG5pbXBvcnQgdHlwZSB7IFZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nIH0gZnJvbSAnLi9WYWx1ZUNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7XG4gIGNvbnZlcnRBc3luY1RvU3luYyxcbiAgaW52b2tlQXN5bmNTYWZlbHlcblxufSBmcm9tICcuLi8uLi9Bc3luYy50cyc7XG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uLy4uL0Nzc0NsYXNzLnRzJztcbmltcG9ydCB7IFBsdWdpbkJhc2UgfSBmcm9tICcuL1BsdWdpbkJhc2UudHMnO1xuaW1wb3J0IHsgZ2V0UGx1Z2luSWQgfSBmcm9tICcuL1BsdWdpbklkLnRzJztcbmltcG9ydCB7IGdldFZhbGlkYXRvckVsZW1lbnQgfSBmcm9tICcuL1ZhbHVlQ29tcG9uZW50LnRzJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciBiaW5kaW5nIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmluZE9wdGlvbnM8UGx1Z2luU2V0dGluZ3MsIFVJVmFsdWU+IHtcbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCBjaGFuZ2VzLlxuICAgKi9cbiAgb25DaGFuZ2VkPzogKCkgPT4gTWF5YmVQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHNldHRpbmdzIG9iamVjdCB0byBiaW5kIHRoZSBjb21wb25lbnQgdG8uIERlZmF1bHQgaXMgdGhlIHBsdWdpbidzIGN1cnJlbnQgc2V0dGluZ3MuXG4gICAqL1xuICBwbHVnaW5TZXR0aW5ncz86IFBsdWdpblNldHRpbmdzO1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBzYXZlcyB0aGUgcGx1Z2luIHNldHRpbmdzIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGNvbXBvbmVudCB2YWx1ZSBjaGFuZ2VzLiBEZWZhdWx0IGlzIGB0cnVlYC5cbiAgICovXG4gIHNob3VsZEF1dG9TYXZlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgdHJ1ZSwgc2hvd3MgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSB3aGVuIHRoZSBjb21wb25lbnQgdmFsdWUgaXMgaW52YWxpZC4gRGVmYXVsdCBpcyBgdHJ1ZWAuXG4gICAqL1xuICBzaG91bGRTaG93VmFsaWRhdGlvbk1lc3NhZ2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIFVJIHZhbHVlIGJlZm9yZSBzZXR0aW5nIGl0IG9uIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gICAqIEBwYXJhbSB1aVZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBVSSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIEFuIGVycm9yIG1lc3NhZ2UgaWYgdGhlIHZhbHVlIGlzIGludmFsaWQsIG9yIGAoZW1wdHkgc3RyaW5nKWAgb3IgYHZvaWRgIGlmIGl0IGlzIHZhbGlkLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbnZhbGlkLXZvaWQtdHlwZVxuICB2YWx1ZVZhbGlkYXRvcj86ICh1aVZhbHVlOiBVSVZhbHVlKSA9PiBNYXliZVByb21pc2U8c3RyaW5nIHwgdm9pZD47XG59XG5cbi8qKlxuICogRXh0ZW5kZWQgb3B0aW9ucyBmb3IgYmluZGluZyBhIHZhbHVlIGNvbXBvbmVudCB0byBhIHBsdWdpbiBzZXR0aW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpbmRPcHRpb25zRXh0ZW5kZWQ8UGx1Z2luU2V0dGluZ3MsIFVJVmFsdWUsIFByb3BlcnR5IGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3M+IGV4dGVuZHMgQmluZE9wdGlvbnM8UGx1Z2luU2V0dGluZ3MsIFVJVmFsdWU+IHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBVSSBjb21wb25lbnQncyB2YWx1ZSBiYWNrIHRvIHRoZSBwbHVnaW4gc2V0dGluZ3MgdmFsdWUuXG4gICAqIEBwYXJhbSB1aVZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBVSSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSB0byBzZXQgb24gdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAgICovXG4gIGNvbXBvbmVudFRvUGx1Z2luU2V0dGluZ3NWYWx1ZUNvbnZlcnRlcjogKHVpVmFsdWU6IFVJVmFsdWUpID0+IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5XTtcblxuICAvKipcbiAgICogQ29udmVydHMgdGhlIHBsdWdpbiBzZXR0aW5ncyB2YWx1ZSB0byB0aGUgdmFsdWUgdXNlZCBieSB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAcGFyYW0gcGx1Z2luU2V0dGluZ3NWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIHRvIHNldCBvbiB0aGUgVUkgY29tcG9uZW50LlxuICAgKi9cbiAgcGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyOiAocGx1Z2luU2V0dGluZ3NWYWx1ZTogUGx1Z2luU2V0dGluZ3NbUHJvcGVydHldKSA9PiBVSVZhbHVlO1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5ncyB0YWJzIGluIE9ic2lkaWFuLlxuICogUHJvdmlkZXMgYSBtZXRob2QgZm9yIGJpbmRpbmcgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsaW5nIGNoYW5nZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUUGx1Z2luIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiB0aGF0IGV4dGVuZHMgUGx1Z2luQmFzZS5cbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpblNldHRpbmdzVGFiQmFzZTxcbiAgVFBsdWdpbiBleHRlbmRzIFBsdWdpbkJhc2U8UGx1Z2luU2V0dGluZ3M+LFxuICBQbHVnaW5TZXR0aW5ncyBleHRlbmRzIFBsdWdpblNldHRpbmdzQmFzZSA9IFRQbHVnaW4gZXh0ZW5kcyBQbHVnaW5CYXNlPGluZmVyIFA+ID8gUCA6IG5ldmVyXG4+IGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG4gIHByaXZhdGUgdmFsaWRhdG9yc01hcCA9IG5ldyBXZWFrTWFwPFZhbHVlQ29tcG9uZW50PHVua25vd24+LCAoKSA9PiBQcm9taXNlPGJvb2xlYW4+PigpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgb3ZlcnJpZGUgcGx1Z2luOiBUUGx1Z2luKSB7XG4gICAgc3VwZXIocGx1Z2luLmFwcCwgcGx1Z2luKTtcbiAgICB0aGlzLmNvbnRhaW5lckVsLmFkZENsYXNzKENzc0NsYXNzLkxpYnJhcnlOYW1lLCBnZXRQbHVnaW5JZCgpLCBDc3NDbGFzcy5QbHVnaW5TZXR0aW5nc1RhYik7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwdWJsaWMgYXN5bmMgcmV2YWxpZGF0ZSh2YWx1ZUNvbXBvbmVudDogVmFsdWVDb21wb25lbnQ8YW55Pik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IHRoaXMudmFsaWRhdG9yc01hcC5nZXQodmFsdWVDb21wb25lbnQpO1xuICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgIHJldHVybiBhd2FpdCB2YWxpZGF0b3IoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBiaW5kPFxuICAgIFVJVmFsdWUsXG4gICAgVFZhbHVlQ29tcG9uZW50XG4gID4oXG4gICAgdmFsdWVDb21wb25lbnQ6IFRWYWx1ZUNvbXBvbmVudCAmIFZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nPFVJVmFsdWU+LFxuICAgIHByb3BlcnR5OiBLZXlzTWF0Y2hpbmc8UGx1Z2luU2V0dGluZ3MsIFVJVmFsdWU+LFxuICAgIG9wdGlvbnM/OiBCaW5kT3B0aW9uczxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZT5cbiAgKTogVFZhbHVlQ29tcG9uZW50O1xuXG4gIHByb3RlY3RlZCBiaW5kPFxuICAgIFVJVmFsdWUsXG4gICAgVFZhbHVlQ29tcG9uZW50LFxuICAgIFByb3BlcnR5IGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3NcbiAgPihcbiAgICB2YWx1ZUNvbXBvbmVudDogVFZhbHVlQ29tcG9uZW50ICYgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmc8VUlWYWx1ZT4sXG4gICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgIG9wdGlvbnM6IEJpbmRPcHRpb25zRXh0ZW5kZWQ8UGx1Z2luU2V0dGluZ3MsIFVJVmFsdWUsIFByb3BlcnR5PlxuICApOiBUVmFsdWVDb21wb25lbnQ7XG5cbiAgcHJvdGVjdGVkIGJpbmQ8XG4gICAgVUlWYWx1ZSxcbiAgICBUVmFsdWVDb21wb25lbnQsXG4gICAgUHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBQbHVnaW5TZXR0aW5nc1xuICA+KFxuICAgIHZhbHVlQ29tcG9uZW50OiBUVmFsdWVDb21wb25lbnQgJiBWYWx1ZUNvbXBvbmVudFdpdGhDaGFuZ2VUcmFja2luZzxVSVZhbHVlPixcbiAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgb3B0aW9ucz86IEJpbmRPcHRpb25zPFBsdWdpblNldHRpbmdzLCBVSVZhbHVlPlxuICApOiBUVmFsdWVDb21wb25lbnQge1xuICAgIHR5cGUgUHJvcGVydHlUeXBlID0gUGx1Z2luU2V0dGluZ3NbUHJvcGVydHldO1xuICAgIGNvbnN0IERFRkFVTFRfT1BUSU9OUzogQmluZE9wdGlvbnNFeHRlbmRlZDxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZSwgUHJvcGVydHk+ID0ge1xuICAgICAgY29tcG9uZW50VG9QbHVnaW5TZXR0aW5nc1ZhbHVlQ29udmVydGVyOiAodmFsdWU6IFVJVmFsdWUpOiBQcm9wZXJ0eVR5cGUgPT4gdmFsdWUgYXMgUHJvcGVydHlUeXBlLFxuICAgICAgcGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyOiAodmFsdWU6IFByb3BlcnR5VHlwZSk6IFVJVmFsdWUgPT4gdmFsdWUgYXMgVUlWYWx1ZSxcbiAgICAgIHNob3VsZEF1dG9TYXZlOiB0cnVlLFxuICAgICAgc2hvdWxkU2hvd1ZhbGlkYXRpb25NZXNzYWdlOiB0cnVlXG4gICAgfTtcblxuICAgIGNvbnN0IG9wdGlvbnNFeHQ6IEJpbmRPcHRpb25zRXh0ZW5kZWQ8UGx1Z2luU2V0dGluZ3MsIFVJVmFsdWUsIFByb3BlcnR5PiA9IHsgLi4uREVGQVVMVF9PUFRJT05TLCAuLi5vcHRpb25zIH07XG4gICAgY29uc3QgcGx1Z2luU2V0dGluZ3NGbiA9ICgpOiBQbHVnaW5TZXR0aW5ncyA9PiBvcHRpb25zRXh0LnBsdWdpblNldHRpbmdzID8/IHRoaXMucGx1Z2luLnNldHRpbmdzQ29weTtcblxuICAgIGNvbnN0IHZhbGlkYXRlID0gYXN5bmMgKHVpVmFsdWU/OiBVSVZhbHVlKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICBpZiAoIW9wdGlvbnNFeHQudmFsdWVWYWxpZGF0b3IpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICB1aVZhbHVlID8/PSB2YWx1ZUNvbXBvbmVudC5nZXRWYWx1ZSgpO1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYXdhaXQgb3B0aW9uc0V4dC52YWx1ZVZhbGlkYXRvcih1aVZhbHVlKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB2YWxpZGF0b3JFbGVtZW50ID0gZ2V0VmFsaWRhdG9yRWxlbWVudCh2YWx1ZUNvbXBvbmVudCk7XG4gICAgICBpZiAodmFsaWRhdG9yRWxlbWVudCkge1xuICAgICAgICB2YWxpZGF0b3JFbGVtZW50LnNldEN1c3RvbVZhbGlkaXR5KGVycm9yTWVzc2FnZSA/PyAnJyk7XG4gICAgICAgIHZhbGlkYXRvckVsZW1lbnQudGl0bGUgPSBlcnJvck1lc3NhZ2UgPz8gJyc7XG4gICAgICAgIHZhbGlkYXRvckVsZW1lbnQudG9nZ2xlQ2xhc3MoQ3NzQ2xhc3MuVmFsdWVDb21wb25lbnRJbnZhbGlkLCAhIWVycm9yTWVzc2FnZSk7XG4gICAgICAgIGlmICh2YWxpZGF0b3JFbGVtZW50LmlzQWN0aXZlRWxlbWVudCgpICYmIG9wdGlvbnNFeHQuc2hvdWxkU2hvd1ZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICAgICAgdmFsaWRhdG9yRWxlbWVudC5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhZXJyb3JNZXNzYWdlO1xuICAgIH07XG5cbiAgICB2YWx1ZUNvbXBvbmVudFxuICAgICAgLnNldFZhbHVlKG9wdGlvbnNFeHQucGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyKHBsdWdpblNldHRpbmdzRm4oKVtwcm9wZXJ0eV0pKVxuICAgICAgLm9uQ2hhbmdlKGFzeW5jICh1aVZhbHVlKSA9PiB7XG4gICAgICAgIGlmICghYXdhaXQgdmFsaWRhdGUodWlWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGx1Z2luU2V0dGluZ3MgPSBwbHVnaW5TZXR0aW5nc0ZuKCk7XG4gICAgICAgIHBsdWdpblNldHRpbmdzW3Byb3BlcnR5XSA9IG9wdGlvbnNFeHQuY29tcG9uZW50VG9QbHVnaW5TZXR0aW5nc1ZhbHVlQ29udmVydGVyKHVpVmFsdWUpO1xuICAgICAgICBpZiAob3B0aW9uc0V4dC5zaG91bGRBdXRvU2F2ZSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncyhwbHVnaW5TZXR0aW5ncyk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBvcHRpb25zRXh0Lm9uQ2hhbmdlZD8uKCk7XG4gICAgICB9KTtcblxuICAgIGNvbnN0IHZhbGlkYXRvckVsZW1lbnQgPSBnZXRWYWxpZGF0b3JFbGVtZW50KHZhbHVlQ29tcG9uZW50KTtcbiAgICB2YWxpZGF0b3JFbGVtZW50Py5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGNvbnZlcnRBc3luY1RvU3luYygoKSA9PiB2YWxpZGF0ZSgpKSk7XG4gICAgdmFsaWRhdG9yRWxlbWVudD8uYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGNvbnZlcnRBc3luY1RvU3luYygoKSA9PiB2YWxpZGF0ZSgpKSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB0aGlzLnZhbGlkYXRvcnNNYXAuc2V0KHZhbHVlQ29tcG9uZW50IGFzIFZhbHVlQ29tcG9uZW50PGFueT4sICgpID0+IHZhbGlkYXRlKCkpO1xuXG4gICAgaW52b2tlQXN5bmNTYWZlbHkoKCkgPT4gdmFsaWRhdGUoKSk7XG4gICAgcmV0dXJuIHZhbHVlQ29tcG9uZW50O1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBUUEsc0JBQWlDO0FBT2pDLG1CQUlPO0FBQ1Asc0JBQXlCO0FBQ3pCLHdCQUEyQjtBQUMzQixzQkFBNEI7QUFDNUIsNEJBQW9DO0FBNkQ3QixNQUFlLDhCQUdaLGlDQUFpQjtBQUFBLEVBR2xCLFlBQTRCLFFBQWlCO0FBQ2xELFVBQU0sT0FBTyxLQUFLLE1BQU07QUFEUztBQUVqQyxTQUFLLFlBQVksU0FBUyx5QkFBUyxpQkFBYSw2QkFBWSxHQUFHLHlCQUFTLGlCQUFpQjtBQUFBLEVBQzNGO0FBQUEsRUFMUSxnQkFBZ0Isb0JBQUksUUFBeUQ7QUFBQTtBQUFBLEVBUXJGLE1BQWEsV0FBVyxnQkFBdUQ7QUFDN0UsVUFBTSxZQUFZLEtBQUssY0FBYyxJQUFJLGNBQWM7QUFDdkQsUUFBSSxXQUFXO0FBQ2IsYUFBTyxNQUFNLFVBQVU7QUFBQSxJQUN6QjtBQUVBLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFxQlUsS0FLUixnQkFDQSxVQUNBLFNBQ2lCO0FBRWpCLFVBQU0sa0JBQTBFO0FBQUEsTUFDOUUseUNBQXlDLENBQUMsVUFBaUM7QUFBQSxNQUMzRSx5Q0FBeUMsQ0FBQyxVQUFpQztBQUFBLE1BQzNFLGdCQUFnQjtBQUFBLE1BQ2hCLDZCQUE2QjtBQUFBLElBQy9CO0FBRUEsVUFBTSxhQUFxRSxFQUFFLEdBQUcsaUJBQWlCLEdBQUcsUUFBUTtBQUM1RyxVQUFNLG1CQUFtQixNQUFzQixXQUFXLGtCQUFrQixLQUFLLE9BQU87QUFFeEYsVUFBTSxXQUFXLE9BQU8sWUFBd0M7QUFDOUQsVUFBSSxDQUFDLFdBQVcsZ0JBQWdCO0FBQzlCLGVBQU87QUFBQSxNQUNUO0FBQ0Esa0JBQVksZUFBZSxTQUFTO0FBQ3BDLFlBQU0sZUFBZSxNQUFNLFdBQVcsZUFBZSxPQUFPO0FBQzVELFlBQU1BLHdCQUFtQiwyQ0FBb0IsY0FBYztBQUMzRCxVQUFJQSxtQkFBa0I7QUFDcEIsUUFBQUEsa0JBQWlCLGtCQUFrQixnQkFBZ0IsRUFBRTtBQUNyRCxRQUFBQSxrQkFBaUIsUUFBUSxnQkFBZ0I7QUFDekMsUUFBQUEsa0JBQWlCLFlBQVkseUJBQVMsdUJBQXVCLENBQUMsQ0FBQyxZQUFZO0FBQzNFLFlBQUlBLGtCQUFpQixnQkFBZ0IsS0FBSyxXQUFXLDZCQUE2QjtBQUNoRixVQUFBQSxrQkFBaUIsZUFBZTtBQUFBLFFBQ2xDO0FBQUEsTUFDRjtBQUVBLGFBQU8sQ0FBQztBQUFBLElBQ1Y7QUFFQSxtQkFDRyxTQUFTLFdBQVcsd0NBQXdDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQ3pGLFNBQVMsT0FBTyxZQUFZO0FBQzNCLFVBQUksQ0FBQyxNQUFNLFNBQVMsT0FBTyxHQUFHO0FBQzVCO0FBQUEsTUFDRjtBQUNBLFlBQU0saUJBQWlCLGlCQUFpQjtBQUN4QyxxQkFBZSxRQUFRLElBQUksV0FBVyx3Q0FBd0MsT0FBTztBQUNyRixVQUFJLFdBQVcsZ0JBQWdCO0FBQzdCLGNBQU0sS0FBSyxPQUFPLGFBQWEsY0FBYztBQUFBLE1BQy9DO0FBRUEsWUFBTSxXQUFXLFlBQVk7QUFBQSxJQUMvQixDQUFDO0FBRUgsVUFBTSx1QkFBbUIsMkNBQW9CLGNBQWM7QUFDM0Qsc0JBQWtCLGlCQUFpQixhQUFTLGlDQUFtQixNQUFNLFNBQVMsQ0FBQyxDQUFDO0FBQ2hGLHNCQUFrQixpQkFBaUIsWUFBUSxpQ0FBbUIsTUFBTSxTQUFTLENBQUMsQ0FBQztBQUUvRSxTQUFLLGNBQWMsSUFBSSxnQkFBdUMsTUFBTSxTQUFTLENBQUM7QUFFOUUsd0NBQWtCLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLFdBQU87QUFBQSxFQUNUO0FBQ0Y7IiwKICAibmFtZXMiOiBbInZhbGlkYXRvckVsZW1lbnQiXQp9Cg==
@@ -3,9 +3,57 @@
3
3
  * This module defines a base class for creating plugin setting tabs in Obsidian.
4
4
  * It provides a utility method to bind value components to plugin settings and handle changes.
5
5
  */
6
+ import type { ValueComponent } from 'obsidian';
6
7
  import { PluginSettingTab } from 'obsidian';
8
+ import type { KeysMatching } from '../../@types.ts';
9
+ import type { MaybePromise } from '../../Async.ts';
7
10
  import type { PluginSettingsBase } from './PluginSettingsBase.ts';
11
+ import type { ValueComponentWithChangeTracking } from './ValueComponent.ts';
8
12
  import { PluginBase } from './PluginBase.ts';
13
+ /**
14
+ * Options for binding a value component to a plugin setting.
15
+ */
16
+ export interface BindOptions<PluginSettings, UIValue> {
17
+ /**
18
+ * A callback function that is called when the value of the component changes.
19
+ */
20
+ onChanged?: () => MaybePromise<void>;
21
+ /**
22
+ * The plugin settings object to bind the component to. Default is the plugin's current settings.
23
+ */
24
+ pluginSettings?: PluginSettings;
25
+ /**
26
+ * If true, saves the plugin settings automatically after the component value changes. Default is `true`.
27
+ */
28
+ shouldAutoSave?: boolean;
29
+ /**
30
+ * If true, shows the validation message when the component value is invalid. Default is `true`.
31
+ */
32
+ shouldShowValidationMessage?: boolean;
33
+ /**
34
+ * Validates the UI value before setting it on the plugin settings.
35
+ * @param uiValue - The value of the UI component.
36
+ * @returns An error message if the value is invalid, or `(empty string)` or `void` if it is valid.
37
+ */
38
+ valueValidator?: (uiValue: UIValue) => MaybePromise<string | void>;
39
+ }
40
+ /**
41
+ * Extended options for binding a value component to a plugin setting.
42
+ */
43
+ export interface BindOptionsExtended<PluginSettings, UIValue, Property extends keyof PluginSettings> extends BindOptions<PluginSettings, UIValue> {
44
+ /**
45
+ * Converts the UI component's value back to the plugin settings value.
46
+ * @param uiValue - The value of the UI component.
47
+ * @returns The value to set on the plugin settings.
48
+ */
49
+ componentToPluginSettingsValueConverter: (uiValue: UIValue) => PluginSettings[Property];
50
+ /**
51
+ * Converts the plugin settings value to the value used by the UI component.
52
+ * @param pluginSettingsValue - The value of the property in the plugin settings.
53
+ * @returns The value to set on the UI component.
54
+ */
55
+ pluginSettingsToComponentValueConverter: (pluginSettingsValue: PluginSettings[Property]) => UIValue;
56
+ }
9
57
  /**
10
58
  * Base class for creating plugin settings tabs in Obsidian.
11
59
  * Provides a method for binding value components to plugin settings and handling changes.
@@ -15,5 +63,9 @@ import { PluginBase } from './PluginBase.ts';
15
63
  */
16
64
  export declare abstract class PluginSettingsTabBase<TPlugin extends PluginBase<PluginSettings>, PluginSettings extends PluginSettingsBase = TPlugin extends PluginBase<infer P> ? P : never> extends PluginSettingTab {
17
65
  plugin: TPlugin;
66
+ private validatorsMap;
18
67
  constructor(plugin: TPlugin);
68
+ revalidate(valueComponent: ValueComponent<any>): Promise<boolean>;
69
+ protected bind<UIValue, TValueComponent>(valueComponent: TValueComponent & ValueComponentWithChangeTracking<UIValue>, property: KeysMatching<PluginSettings, UIValue>, options?: BindOptions<PluginSettings, UIValue>): TValueComponent;
70
+ protected bind<UIValue, TValueComponent, Property extends keyof PluginSettings>(valueComponent: TValueComponent & ValueComponentWithChangeTracking<UIValue>, property: Property, options: BindOptionsExtended<PluginSettings, UIValue, Property>): TValueComponent;
19
71
  }
@@ -27,92 +27,10 @@ var __copyProps = (to, from, except, desc) => {
27
27
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
28
  var ValueComponent_exports = {};
29
29
  __export(ValueComponent_exports, {
30
- extend: () => extend,
31
- revalidate: () => revalidate
30
+ getValidatorElement: () => getValidatorElement
32
31
  });
33
32
  module.exports = __toCommonJS(ValueComponent_exports);
34
33
  var import_obsidian = require('obsidian');
35
- var import_Async = require('../../Async.cjs');
36
- var import_CssClass = require('../../CssClass.cjs');
37
- var import_Object = require('../../Object.cjs');
38
- const validatorsMap = /* @__PURE__ */ new WeakMap();
39
- class ValueComponentEx {
40
- constructor(valueComponent) {
41
- this.valueComponent = valueComponent;
42
- }
43
- /**
44
- * Returns the ValueComponent with extended functionality.
45
- */
46
- asExtended() {
47
- return (0, import_Object.assignWithNonEnumerableProperties)({}, this.valueComponent, this);
48
- }
49
- /**
50
- * Binds the ValueComponent to a property in the plugin settings.
51
- *
52
- * @typeParam Plugin - The type of the plugin that extends `PluginBase`.
53
- * @typeParam Property - The key of the plugin setting that the component is bound to.
54
- * @typeParam PluginSettings - The type of the plugin settings object.
55
- * @param plugin - The plugin.
56
- * @param property - The property key in `PluginSettings` to bind to the UI component.
57
- * @param options - Configuration options.
58
- * @returns The `ValueComponent` instance that was bound to the property.
59
- */
60
- bind(plugin, property, options) {
61
- const DEFAULT_OPTIONS = {
62
- componentToPluginSettingsValueConverter: (value) => value,
63
- pluginSettingsToComponentValueConverter: (value) => value,
64
- shouldAutoSave: true,
65
- shouldShowValidationMessage: true
66
- };
67
- const optionsExt = { ...DEFAULT_OPTIONS, ...options };
68
- const pluginExt = plugin;
69
- const pluginSettingsFn = () => optionsExt.pluginSettings ?? pluginExt.settingsCopy;
70
- const validate = async (uiValue) => {
71
- if (!optionsExt.valueValidator) {
72
- return true;
73
- }
74
- uiValue ??= this.valueComponent.getValue();
75
- const errorMessage = await optionsExt.valueValidator(uiValue);
76
- const validatorElement2 = getValidatorElement(this.valueComponent);
77
- if (validatorElement2) {
78
- validatorElement2.setCustomValidity(errorMessage ?? "");
79
- validatorElement2.title = errorMessage ?? "";
80
- validatorElement2.toggleClass(import_CssClass.CssClass.ValueComponentInvalid, !!errorMessage);
81
- if (validatorElement2.isActiveElement() && optionsExt.shouldShowValidationMessage) {
82
- validatorElement2.reportValidity();
83
- }
84
- }
85
- return !errorMessage;
86
- };
87
- this.valueComponent.setValue(optionsExt.pluginSettingsToComponentValueConverter(pluginSettingsFn()[property])).onChange(async (uiValue) => {
88
- if (!await validate(uiValue)) {
89
- return;
90
- }
91
- const pluginSettings = pluginSettingsFn();
92
- pluginSettings[property] = optionsExt.componentToPluginSettingsValueConverter(uiValue);
93
- if (optionsExt.shouldAutoSave) {
94
- await pluginExt.saveSettings(pluginSettings);
95
- }
96
- await optionsExt.onChanged?.();
97
- });
98
- const validatorElement = getValidatorElement(this.valueComponent);
99
- validatorElement?.addEventListener("focus", (0, import_Async.convertAsyncToSync)(() => validate()));
100
- validatorElement?.addEventListener("blur", (0, import_Async.convertAsyncToSync)(() => validate()));
101
- validatorsMap.set(this.valueComponent, () => validate());
102
- (0, import_Async.invokeAsyncSafely)(() => validate());
103
- return this.asExtended();
104
- }
105
- }
106
- function extend(valueComponent) {
107
- return new ValueComponentEx(valueComponent).asExtended();
108
- }
109
- async function revalidate(valueComponent) {
110
- const validator = validatorsMap.get(valueComponent);
111
- if (validator) {
112
- return await validator();
113
- }
114
- return true;
115
- }
116
34
  function getValidatorElement(valueComponent) {
117
35
  if (valueComponent instanceof import_obsidian.DropdownComponent) {
118
36
  return valueComponent.selectEl;
@@ -130,7 +48,6 @@ function getValidatorElement(valueComponent) {
130
48
  }
131
49
  // Annotate the CommonJS export names for ESM import in node:
132
50
  0 && (module.exports = {
133
- extend,
134
- revalidate
51
+ getValidatorElement
135
52
  });
136
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9WYWx1ZUNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb24gVmFsdWVDb21wb25lbnRcbiAqIENvbnRhaW5zIHV0aWxpdHkgdHlwZXMgYW5kIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgdmFsdWUgY29tcG9uZW50cywgd2hpY2ggYXJlIFVJIGNvbXBvbmVudHMgdGhhdCBkaXNwbGF5IGFuZCBlZGl0IHZhbHVlcy5cbiAqL1xuXG5pbXBvcnQge1xuICBEcm9wZG93bkNvbXBvbmVudCxcbiAgU2xpZGVyQ29tcG9uZW50LFxuICBUZXh0QXJlYUNvbXBvbmVudCxcbiAgVGV4dENvbXBvbmVudCxcbiAgVmFsdWVDb21wb25lbnRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IEtleXNNYXRjaGluZyB9IGZyb20gJy4uLy4uL0B0eXBlcy50cyc7XG5pbXBvcnQgdHlwZSB7IE1heWJlUHJvbWlzZSB9IGZyb20gJy4uLy4uL0FzeW5jLnRzJztcbmltcG9ydCB0eXBlIHsgVmFsaWRhdG9yRWxlbWVudCB9IGZyb20gJy4uLy4uL0hUTUxFbGVtZW50LnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luQmFzZSB9IGZyb20gJy4vUGx1Z2luQmFzZS50cyc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpblNldHRpbmdzQmFzZSB9IGZyb20gJy4vUGx1Z2luU2V0dGluZ3NCYXNlLnRzJztcblxuaW1wb3J0IHtcbiAgY29udmVydEFzeW5jVG9TeW5jLFxuICBpbnZva2VBc3luY1NhZmVseVxufSBmcm9tICcuLi8uLi9Bc3luYy50cyc7XG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uLy4uL0Nzc0NsYXNzLnRzJztcbmltcG9ydCB7IGFzc2lnbldpdGhOb25FbnVtZXJhYmxlUHJvcGVydGllcyB9IGZyb20gJy4uLy4uL09iamVjdC50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYmluZGluZyBhIHZhbHVlIGNvbXBvbmVudCB0byBhIHBsdWdpbiBzZXR0aW5nLlxuICovXG5pbnRlcmZhY2UgQmluZFZhbHVlQ29tcG9uZW50T3B0aW9uczxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZT4ge1xuICAvKipcbiAgICogQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50IGNoYW5nZXMuXG4gICAqL1xuICBvbkNoYW5nZWQ/OiAoKSA9PiBNYXliZVByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gc2V0dGluZ3Mgb2JqZWN0IHRvIGJpbmQgdGhlIGNvbXBvbmVudCB0by4gRGVmYXVsdCBpcyB0aGUgcGx1Z2luJ3MgY3VycmVudCBzZXR0aW5ncy5cbiAgICovXG4gIHBsdWdpblNldHRpbmdzPzogUGx1Z2luU2V0dGluZ3M7XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIHNhdmVzIHRoZSBwbHVnaW4gc2V0dGluZ3MgYXV0b21hdGljYWxseSBhZnRlciB0aGUgY29tcG9uZW50IHZhbHVlIGNoYW5nZXMuIERlZmF1bHQgaXMgYHRydWVgLlxuICAgKi9cbiAgc2hvdWxkQXV0b1NhdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBzaG93cyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIHdoZW4gdGhlIGNvbXBvbmVudCB2YWx1ZSBpcyBpbnZhbGlkLiBEZWZhdWx0IGlzIGB0cnVlYC5cbiAgICovXG4gIHNob3VsZFNob3dWYWxpZGF0aW9uTWVzc2FnZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgVUkgdmFsdWUgYmVmb3JlIHNldHRpbmcgaXQgb24gdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAgICogQHBhcmFtIHVpVmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIFVJIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgQW4gZXJyb3IgbWVzc2FnZSBpZiB0aGUgdmFsdWUgaXMgaW52YWxpZCwgb3IgYChlbXB0eSBzdHJpbmcpYCBvciBgdm9pZGAgaWYgaXQgaXMgdmFsaWQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWludmFsaWQtdm9pZC10eXBlXG4gIHZhbHVlVmFsaWRhdG9yPzogKHVpVmFsdWU6IFVJVmFsdWUpID0+IE1heWJlUHJvbWlzZTxzdHJpbmcgfCB2b2lkPjtcbn1cblxuLyoqXG4gKiBFeHRlbmRlZCBvcHRpb25zIGZvciBiaW5kaW5nIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gKi9cbmludGVyZmFjZSBCaW5kVmFsdWVDb21wb25lbnRPcHRpb25zRXh0ZW5kZWQ8UGx1Z2luU2V0dGluZ3MsIFVJVmFsdWUsIFByb3BlcnR5IGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3M+IGV4dGVuZHMgQmluZFZhbHVlQ29tcG9uZW50T3B0aW9uczxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZT4ge1xuICAvKipcbiAgICogQ29udmVydHMgdGhlIFVJIGNvbXBvbmVudCdzIHZhbHVlIGJhY2sgdG8gdGhlIHBsdWdpbiBzZXR0aW5ncyB2YWx1ZS5cbiAgICogQHBhcmFtIHVpVmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIFVJIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIHRvIHNldCBvbiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICAgKi9cbiAgY29tcG9uZW50VG9QbHVnaW5TZXR0aW5nc1ZhbHVlQ29udmVydGVyOiAodWlWYWx1ZTogVUlWYWx1ZSkgPT4gUGx1Z2luU2V0dGluZ3NbUHJvcGVydHldO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgcGx1Z2luIHNldHRpbmdzIHZhbHVlIHRvIHRoZSB2YWx1ZSB1c2VkIGJ5IHRoZSBVSSBjb21wb25lbnQuXG4gICAqIEBwYXJhbSBwbHVnaW5TZXR0aW5nc1ZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgdG8gc2V0IG9uIHRoZSBVSSBjb21wb25lbnQuXG4gICAqL1xuICBwbHVnaW5TZXR0aW5nc1RvQ29tcG9uZW50VmFsdWVDb252ZXJ0ZXI6IChwbHVnaW5TZXR0aW5nc1ZhbHVlOiBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eV0pID0+IFVJVmFsdWU7XG59XG5cbi8qKlxuICogVmFsdWVDb21wb25lbnQgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBvcmlnaW5hbCBWYWx1ZUNvbXBvbmVudCB3aXRoIGV4dGVuZGVkIGZ1bmN0aW9uYWxpdHkuXG4gKi9cbnR5cGUgVmFsdWVDb21wb25lbnRFeFR5cGU8VUlWYWx1ZSwgVFZhbHVlQ29tcG9uZW50IGV4dGVuZHMgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmc8VUlWYWx1ZT4+ID0gVFZhbHVlQ29tcG9uZW50ICYgVmFsdWVDb21wb25lbnRFeDxVSVZhbHVlLCBUVmFsdWVDb21wb25lbnQ+O1xuXG4vKipcbiAqIEEgVmFsdWVDb21wb25lbnQgdGhhdCBjYW4gdHJhY2sgY2hhbmdlcy5cbiAqL1xuaW50ZXJmYWNlIFZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nPFQ+IGV4dGVuZHMgVmFsdWVDb21wb25lbnQ8VD4ge1xuICAvKipcbiAgICogU2V0cyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50IGNoYW5nZXMuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCBjaGFuZ2VzLlxuICAgKi9cbiAgb25DaGFuZ2UoY2FsbGJhY2s6IChuZXdWYWx1ZTogVCkgPT4gUHJvbWlzZTx2b2lkPik6IHRoaXM7XG59XG5cbmNvbnN0IHZhbGlkYXRvcnNNYXAgPSBuZXcgV2Vha01hcDxWYWx1ZUNvbXBvbmVudDx1bmtub3duPiwgKCkgPT4gUHJvbWlzZTxib29sZWFuPj4oKTtcblxuLyoqXG4gKiBWYWx1ZUNvbXBvbmVudCB3aXRoIGV4dGVuZGVkIGZ1bmN0aW9uYWxpdHkuXG4gKi9cbmNsYXNzIFZhbHVlQ29tcG9uZW50RXg8VUlWYWx1ZSwgVFZhbHVlQ29tcG9uZW50IGV4dGVuZHMgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmc8VUlWYWx1ZT4+IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgdmFsdWVDb21wb25lbnQ6IFRWYWx1ZUNvbXBvbmVudCkge1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFZhbHVlQ29tcG9uZW50IHdpdGggZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eS5cbiAgICovXG4gIHB1YmxpYyBhc0V4dGVuZGVkKCk6IFZhbHVlQ29tcG9uZW50RXhUeXBlPFVJVmFsdWUsIFRWYWx1ZUNvbXBvbmVudD4ge1xuICAgIHJldHVybiBhc3NpZ25XaXRoTm9uRW51bWVyYWJsZVByb3BlcnRpZXMoe30sIHRoaXMudmFsdWVDb21wb25lbnQsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIHRoZSBWYWx1ZUNvbXBvbmVudCB0byBhIHByb3BlcnR5IGluIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIG9iamVjdC5cbiAgICogQHR5cGVQYXJhbSBQcm9wZXJ0eSAtIFRoZSBrZXkgb2YgdGhlIHBsdWdpbiBzZXR0aW5nIHRoYXQgdGhlIGNvbXBvbmVudCBpcyBib3VuZCB0by5cbiAgICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBrZXkgaW4gYFBsdWdpblNldHRpbmdzYCB0byBiaW5kIHRvIHRoZSBVSSBjb21wb25lbnQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBUaGUgYFZhbHVlQ29tcG9uZW50YCBpbnN0YW5jZSB0aGF0IHdhcyBib3VuZCB0byB0aGUgcHJvcGVydHkuXG4gICAqL1xuICBwdWJsaWMgYmluZDxcbiAgICBQbHVnaW5TZXR0aW5ncyBleHRlbmRzIFBsdWdpblNldHRpbmdzQmFzZSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVyc1xuICAgIFByb3BlcnR5IGV4dGVuZHMgS2V5c01hdGNoaW5nPFBsdWdpblNldHRpbmdzLCBVSVZhbHVlPlxuICA+KFxuICAgIHBsdWdpbjogUGx1Z2luQmFzZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgIG9wdGlvbnM/OiBCaW5kVmFsdWVDb21wb25lbnRPcHRpb25zPFBsdWdpblNldHRpbmdzLCBVSVZhbHVlPlxuICApOiBWYWx1ZUNvbXBvbmVudEV4VHlwZTxVSVZhbHVlLCBUVmFsdWVDb21wb25lbnQ+O1xuXG4gIC8qKlxuICAgKiBCaW5kcyB0aGUgVmFsdWVDb21wb25lbnQgdG8gYSBwcm9wZXJ0eSBpbiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFBsdWdpbiAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gdGhhdCBleHRlbmRzIGBQbHVnaW5CYXNlYC5cbiAgICogQHR5cGVQYXJhbSBQcm9wZXJ0eSAtIFRoZSBrZXkgb2YgdGhlIHBsdWdpbiBzZXR0aW5nIHRoYXQgdGhlIGNvbXBvbmVudCBpcyBib3VuZCB0by5cbiAgICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3Mgb2JqZWN0LlxuICAgKiBAcGFyYW0gcGx1Z2luIC0gVGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBpbiBgUGx1Z2luU2V0dGluZ3NgIHRvIGJpbmQgdG8gdGhlIFVJIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIFRoZSBgVmFsdWVDb21wb25lbnRgIGluc3RhbmNlIHRoYXQgd2FzIGJvdW5kIHRvIHRoZSBwcm9wZXJ0eS5cbiAgICovXG4gIHB1YmxpYyBiaW5kPFxuICAgIFBsdWdpblNldHRpbmdzIGV4dGVuZHMgUGx1Z2luU2V0dGluZ3NCYXNlLFxuICAgIFByb3BlcnR5IGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3NcbiAgPihcbiAgICBwbHVnaW46IFBsdWdpbkJhc2U8UGx1Z2luU2V0dGluZ3M+LFxuICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICBvcHRpb25zOiBCaW5kVmFsdWVDb21wb25lbnRPcHRpb25zRXh0ZW5kZWQ8UGx1Z2luU2V0dGluZ3MsIFVJVmFsdWUsIFByb3BlcnR5PlxuICApOiBWYWx1ZUNvbXBvbmVudEV4VHlwZTxVSVZhbHVlLCBUVmFsdWVDb21wb25lbnQ+O1xuXG4gIC8qKlxuICAgKiBCaW5kcyB0aGUgVmFsdWVDb21wb25lbnQgdG8gYSBwcm9wZXJ0eSBpbiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFBsdWdpbiAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gdGhhdCBleHRlbmRzIGBQbHVnaW5CYXNlYC5cbiAgICogQHR5cGVQYXJhbSBQcm9wZXJ0eSAtIFRoZSBrZXkgb2YgdGhlIHBsdWdpbiBzZXR0aW5nIHRoYXQgdGhlIGNvbXBvbmVudCBpcyBib3VuZCB0by5cbiAgICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3Mgb2JqZWN0LlxuICAgKiBAcGFyYW0gcGx1Z2luIC0gVGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBpbiBgUGx1Z2luU2V0dGluZ3NgIHRvIGJpbmQgdG8gdGhlIFVJIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIFRoZSBgVmFsdWVDb21wb25lbnRgIGluc3RhbmNlIHRoYXQgd2FzIGJvdW5kIHRvIHRoZSBwcm9wZXJ0eS5cbiAgICovXG4gIHB1YmxpYyBiaW5kPFxuICAgIFBsdWdpblNldHRpbmdzIGV4dGVuZHMgUGx1Z2luU2V0dGluZ3NCYXNlLFxuICAgIFByb3BlcnR5IGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3NcbiAgPihcbiAgICBwbHVnaW46IFBsdWdpbkJhc2U8UGx1Z2luU2V0dGluZ3M+LFxuICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICBvcHRpb25zPzogQmluZFZhbHVlQ29tcG9uZW50T3B0aW9uczxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZT5cbiAgKTogVmFsdWVDb21wb25lbnRFeFR5cGU8VUlWYWx1ZSwgVFZhbHVlQ29tcG9uZW50PiB7XG4gICAgdHlwZSBQcm9wZXJ0eVR5cGUgPSBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eV07XG4gICAgY29uc3QgREVGQVVMVF9PUFRJT05TOiBCaW5kVmFsdWVDb21wb25lbnRPcHRpb25zRXh0ZW5kZWQ8UGx1Z2luU2V0dGluZ3MsIFVJVmFsdWUsIFByb3BlcnR5PiA9IHtcbiAgICAgIGNvbXBvbmVudFRvUGx1Z2luU2V0dGluZ3NWYWx1ZUNvbnZlcnRlcjogKHZhbHVlKTogUHJvcGVydHlUeXBlID0+IHZhbHVlIGFzIFByb3BlcnR5VHlwZSxcbiAgICAgIHBsdWdpblNldHRpbmdzVG9Db21wb25lbnRWYWx1ZUNvbnZlcnRlcjogKHZhbHVlKTogVUlWYWx1ZSA9PiB2YWx1ZSBhcyBVSVZhbHVlLFxuICAgICAgc2hvdWxkQXV0b1NhdmU6IHRydWUsXG4gICAgICBzaG91bGRTaG93VmFsaWRhdGlvbk1lc3NhZ2U6IHRydWVcbiAgICB9O1xuXG4gICAgY29uc3Qgb3B0aW9uc0V4dDogQmluZFZhbHVlQ29tcG9uZW50T3B0aW9uc0V4dGVuZGVkPFBsdWdpblNldHRpbmdzLCBVSVZhbHVlLCBQcm9wZXJ0eT4gPSB7IC4uLkRFRkFVTFRfT1BUSU9OUywgLi4ub3B0aW9ucyB9O1xuICAgIGNvbnN0IHBsdWdpbkV4dCA9IHBsdWdpbiBhcyB1bmtub3duIGFzIFBsdWdpbkJhc2U8UGx1Z2luU2V0dGluZ3M+O1xuICAgIGNvbnN0IHBsdWdpblNldHRpbmdzRm4gPSAoKTogUGx1Z2luU2V0dGluZ3MgPT4gb3B0aW9uc0V4dC5wbHVnaW5TZXR0aW5ncyA/PyBwbHVnaW5FeHQuc2V0dGluZ3NDb3B5O1xuXG4gICAgY29uc3QgdmFsaWRhdGUgPSBhc3luYyAodWlWYWx1ZT86IFVJVmFsdWUpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgIGlmICghb3B0aW9uc0V4dC52YWx1ZVZhbGlkYXRvcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHVpVmFsdWUgPz89IHRoaXMudmFsdWVDb21wb25lbnQuZ2V0VmFsdWUoKTtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGF3YWl0IG9wdGlvbnNFeHQudmFsdWVWYWxpZGF0b3IodWlWYWx1ZSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdmFsaWRhdG9yRWxlbWVudCA9IGdldFZhbGlkYXRvckVsZW1lbnQodGhpcy52YWx1ZUNvbXBvbmVudCk7XG4gICAgICBpZiAodmFsaWRhdG9yRWxlbWVudCkge1xuICAgICAgICB2YWxpZGF0b3JFbGVtZW50LnNldEN1c3RvbVZhbGlkaXR5KGVycm9yTWVzc2FnZSA/PyAnJyk7XG4gICAgICAgIHZhbGlkYXRvckVsZW1lbnQudGl0bGUgPSBlcnJvck1lc3NhZ2UgPz8gJyc7XG4gICAgICAgIHZhbGlkYXRvckVsZW1lbnQudG9nZ2xlQ2xhc3MoQ3NzQ2xhc3MuVmFsdWVDb21wb25lbnRJbnZhbGlkLCAhIWVycm9yTWVzc2FnZSk7XG4gICAgICAgIGlmICh2YWxpZGF0b3JFbGVtZW50LmlzQWN0aXZlRWxlbWVudCgpICYmIG9wdGlvbnNFeHQuc2hvdWxkU2hvd1ZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICAgICAgdmFsaWRhdG9yRWxlbWVudC5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhZXJyb3JNZXNzYWdlO1xuICAgIH07XG5cbiAgICB0aGlzLnZhbHVlQ29tcG9uZW50XG4gICAgICAuc2V0VmFsdWUob3B0aW9uc0V4dC5wbHVnaW5TZXR0aW5nc1RvQ29tcG9uZW50VmFsdWVDb252ZXJ0ZXIocGx1Z2luU2V0dGluZ3NGbigpW3Byb3BlcnR5XSkpXG4gICAgICAub25DaGFuZ2UoYXN5bmMgKHVpVmFsdWUpID0+IHtcbiAgICAgICAgaWYgKCFhd2FpdCB2YWxpZGF0ZSh1aVZhbHVlKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwbHVnaW5TZXR0aW5ncyA9IHBsdWdpblNldHRpbmdzRm4oKTtcbiAgICAgICAgcGx1Z2luU2V0dGluZ3NbcHJvcGVydHldID0gb3B0aW9uc0V4dC5jb21wb25lbnRUb1BsdWdpblNldHRpbmdzVmFsdWVDb252ZXJ0ZXIodWlWYWx1ZSk7XG4gICAgICAgIGlmIChvcHRpb25zRXh0LnNob3VsZEF1dG9TYXZlKSB7XG4gICAgICAgICAgYXdhaXQgcGx1Z2luRXh0LnNhdmVTZXR0aW5ncyhwbHVnaW5TZXR0aW5ncyk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBvcHRpb25zRXh0Lm9uQ2hhbmdlZD8uKCk7XG4gICAgICB9KTtcblxuICAgIGNvbnN0IHZhbGlkYXRvckVsZW1lbnQgPSBnZXRWYWxpZGF0b3JFbGVtZW50KHRoaXMudmFsdWVDb21wb25lbnQpO1xuICAgIHZhbGlkYXRvckVsZW1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgY29udmVydEFzeW5jVG9TeW5jKCgpID0+IHZhbGlkYXRlKCkpKTtcbiAgICB2YWxpZGF0b3JFbGVtZW50Py5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgY29udmVydEFzeW5jVG9TeW5jKCgpID0+IHZhbGlkYXRlKCkpKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHZhbGlkYXRvcnNNYXAuc2V0KHRoaXMudmFsdWVDb21wb25lbnQgYXMgVmFsdWVDb21wb25lbnQ8YW55PiwgKCkgPT4gdmFsaWRhdGUoKSk7XG5cbiAgICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiB2YWxpZGF0ZSgpKTtcbiAgICByZXR1cm4gdGhpcy5hc0V4dGVuZGVkKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRlbmRzIGEgVmFsdWVDb21wb25lbnQgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogQHR5cGVQYXJhbSBVSVZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHRoZSBjb21wb25lbnQgZGlzcGxheXMuXG4gKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQgZXh0ZW5kaW5nIGBWYWx1ZUNvbXBvbmVudGAuXG4gKiBAcGFyYW0gdmFsdWVDb21wb25lbnQgLSBUaGUgdmFsdWUgY29tcG9uZW50IHRvIGV4dGVuZC5cbiAqIEByZXR1cm5zIFRoZSB2YWx1ZSBjb21wb25lbnQgd2l0aCBleHRlbmRlZCBmdW5jdGlvbmFsaXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kPFVJVmFsdWUsIFRWYWx1ZUNvbXBvbmVudCBleHRlbmRzIFZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nPFVJVmFsdWU+Pih2YWx1ZUNvbXBvbmVudDogVFZhbHVlQ29tcG9uZW50ICYgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmc8VUlWYWx1ZT4pOiBWYWx1ZUNvbXBvbmVudEV4VHlwZTxVSVZhbHVlLCBUVmFsdWVDb21wb25lbnQ+IHtcbiAgcmV0dXJuIG5ldyBWYWx1ZUNvbXBvbmVudEV4PFVJVmFsdWUsIFRWYWx1ZUNvbXBvbmVudD4odmFsdWVDb21wb25lbnQpLmFzRXh0ZW5kZWQoKTtcbn1cblxuLyoqXG4gKiBSZXZhbGlkYXRlcyBhIHZhbHVlIGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0gdmFsdWVDb21wb25lbnQgLSBUaGUgdmFsdWUgY29tcG9uZW50IHRvIHJldmFsaWRhdGUuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlIGNvbXBvbmVudCBpcyB2YWxpZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmV2YWxpZGF0ZSh2YWx1ZUNvbXBvbmVudDogVmFsdWVDb21wb25lbnQ8YW55Pik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB2YWxpZGF0b3IgPSB2YWxpZGF0b3JzTWFwLmdldCh2YWx1ZUNvbXBvbmVudCk7XG4gIGlmICh2YWxpZGF0b3IpIHtcbiAgICByZXR1cm4gYXdhaXQgdmFsaWRhdG9yKCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB2YWxpZGF0b3IgZWxlbWVudCBmcm9tIGEgdmFsdWUgY29tcG9uZW50IGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0gdmFsdWVDb21wb25lbnQgLSBUaGUgdmFsdWUgY29tcG9uZW50IHRvIGdldCB0aGUgdmFsaWRhdG9yIGVsZW1lbnQgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSB2YWxpZGF0b3IgZWxlbWVudCBpZiBpdCBleGlzdHMsIG9yIGBudWxsYCBpZiBpdCBkb2VzIG5vdC5cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsaWRhdG9yRWxlbWVudDxVSVZhbHVlPih2YWx1ZUNvbXBvbmVudDogVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmc8VUlWYWx1ZT4pOiBudWxsIHwgVmFsaWRhdG9yRWxlbWVudCB7XG4gIGlmICh2YWx1ZUNvbXBvbmVudCBpbnN0YW5jZW9mIERyb3Bkb3duQ29tcG9uZW50KSB7XG4gICAgcmV0dXJuIHZhbHVlQ29tcG9uZW50LnNlbGVjdEVsO1xuICB9XG5cbiAgaWYgKHZhbHVlQ29tcG9uZW50IGluc3RhbmNlb2YgU2xpZGVyQ29tcG9uZW50KSB7XG4gICAgcmV0dXJuIHZhbHVlQ29tcG9uZW50LnNsaWRlckVsO1xuICB9XG5cbiAgaWYgKHZhbHVlQ29tcG9uZW50IGluc3RhbmNlb2YgVGV4dEFyZWFDb21wb25lbnQpIHtcbiAgICByZXR1cm4gdmFsdWVDb21wb25lbnQuaW5wdXRFbDtcbiAgfVxuXG4gIGlmICh2YWx1ZUNvbXBvbmVudCBpbnN0YW5jZW9mIFRleHRDb21wb25lbnQpIHtcbiAgICByZXR1cm4gdmFsdWVDb21wb25lbnQuaW5wdXRFbDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS0Esc0JBTU87QUFRUCxtQkFHTztBQUNQLHNCQUF5QjtBQUN6QixvQkFBa0Q7QUF1RWxELE1BQU0sZ0JBQWdCLG9CQUFJLFFBQXlEO0FBS25GLE1BQU0saUJBQTZGO0FBQUEsRUFDMUYsWUFBb0IsZ0JBQWlDO0FBQWpDO0FBQUEsRUFDM0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLGFBQTZEO0FBQ2xFLGVBQU8saURBQWtDLENBQUMsR0FBRyxLQUFLLGdCQUFnQixJQUFJO0FBQUEsRUFDeEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFxRE8sS0FJTCxRQUNBLFVBQ0EsU0FDZ0Q7QUFFaEQsVUFBTSxrQkFBd0Y7QUFBQSxNQUM1Rix5Q0FBeUMsQ0FBQyxVQUF3QjtBQUFBLE1BQ2xFLHlDQUF5QyxDQUFDLFVBQW1CO0FBQUEsTUFDN0QsZ0JBQWdCO0FBQUEsTUFDaEIsNkJBQTZCO0FBQUEsSUFDL0I7QUFFQSxVQUFNLGFBQW1GLEVBQUUsR0FBRyxpQkFBaUIsR0FBRyxRQUFRO0FBQzFILFVBQU0sWUFBWTtBQUNsQixVQUFNLG1CQUFtQixNQUFzQixXQUFXLGtCQUFrQixVQUFVO0FBRXRGLFVBQU0sV0FBVyxPQUFPLFlBQXdDO0FBQzlELFVBQUksQ0FBQyxXQUFXLGdCQUFnQjtBQUM5QixlQUFPO0FBQUEsTUFDVDtBQUNBLGtCQUFZLEtBQUssZUFBZSxTQUFTO0FBQ3pDLFlBQU0sZUFBZSxNQUFNLFdBQVcsZUFBZSxPQUFPO0FBQzVELFlBQU1BLG9CQUFtQixvQkFBb0IsS0FBSyxjQUFjO0FBQ2hFLFVBQUlBLG1CQUFrQjtBQUNwQixRQUFBQSxrQkFBaUIsa0JBQWtCLGdCQUFnQixFQUFFO0FBQ3JELFFBQUFBLGtCQUFpQixRQUFRLGdCQUFnQjtBQUN6QyxRQUFBQSxrQkFBaUIsWUFBWSx5QkFBUyx1QkFBdUIsQ0FBQyxDQUFDLFlBQVk7QUFDM0UsWUFBSUEsa0JBQWlCLGdCQUFnQixLQUFLLFdBQVcsNkJBQTZCO0FBQ2hGLFVBQUFBLGtCQUFpQixlQUFlO0FBQUEsUUFDbEM7QUFBQSxNQUNGO0FBRUEsYUFBTyxDQUFDO0FBQUEsSUFDVjtBQUVBLFNBQUssZUFDRixTQUFTLFdBQVcsd0NBQXdDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQ3pGLFNBQVMsT0FBTyxZQUFZO0FBQzNCLFVBQUksQ0FBQyxNQUFNLFNBQVMsT0FBTyxHQUFHO0FBQzVCO0FBQUEsTUFDRjtBQUNBLFlBQU0saUJBQWlCLGlCQUFpQjtBQUN4QyxxQkFBZSxRQUFRLElBQUksV0FBVyx3Q0FBd0MsT0FBTztBQUNyRixVQUFJLFdBQVcsZ0JBQWdCO0FBQzdCLGNBQU0sVUFBVSxhQUFhLGNBQWM7QUFBQSxNQUM3QztBQUVBLFlBQU0sV0FBVyxZQUFZO0FBQUEsSUFDL0IsQ0FBQztBQUVILFVBQU0sbUJBQW1CLG9CQUFvQixLQUFLLGNBQWM7QUFDaEUsc0JBQWtCLGlCQUFpQixhQUFTLGlDQUFtQixNQUFNLFNBQVMsQ0FBQyxDQUFDO0FBQ2hGLHNCQUFrQixpQkFBaUIsWUFBUSxpQ0FBbUIsTUFBTSxTQUFTLENBQUMsQ0FBQztBQUUvRSxrQkFBYyxJQUFJLEtBQUssZ0JBQXVDLE1BQU0sU0FBUyxDQUFDO0FBRTlFLHdDQUFrQixNQUFNLFNBQVMsQ0FBQztBQUNsQyxXQUFPLEtBQUssV0FBVztBQUFBLEVBQ3pCO0FBQ0Y7QUFVTyxTQUFTLE9BQW1GLGdCQUE2SDtBQUM5TixTQUFPLElBQUksaUJBQTJDLGNBQWMsRUFBRSxXQUFXO0FBQ25GO0FBU0EsZUFBc0IsV0FBVyxnQkFBdUQ7QUFDdEYsUUFBTSxZQUFZLGNBQWMsSUFBSSxjQUFjO0FBQ2xELE1BQUksV0FBVztBQUNiLFdBQU8sTUFBTSxVQUFVO0FBQUEsRUFDekI7QUFFQSxTQUFPO0FBQ1Q7QUFRQSxTQUFTLG9CQUE2QixnQkFBb0Y7QUFDeEgsTUFBSSwwQkFBMEIsbUNBQW1CO0FBQy9DLFdBQU8sZUFBZTtBQUFBLEVBQ3hCO0FBRUEsTUFBSSwwQkFBMEIsaUNBQWlCO0FBQzdDLFdBQU8sZUFBZTtBQUFBLEVBQ3hCO0FBRUEsTUFBSSwwQkFBMEIsbUNBQW1CO0FBQy9DLFdBQU8sZUFBZTtBQUFBLEVBQ3hCO0FBRUEsTUFBSSwwQkFBMEIsK0JBQWU7QUFDM0MsV0FBTyxlQUFlO0FBQUEsRUFDeEI7QUFFQSxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbInZhbGlkYXRvckVsZW1lbnQiXQp9Cg==
53
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9WYWx1ZUNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb24gVmFsdWVDb21wb25lbnRcbiAqIENvbnRhaW5zIHV0aWxpdHkgdHlwZXMgYW5kIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgdmFsdWUgY29tcG9uZW50cywgd2hpY2ggYXJlIFVJIGNvbXBvbmVudHMgdGhhdCBkaXNwbGF5IGFuZCBlZGl0IHZhbHVlcy5cbiAqL1xuXG5pbXBvcnQge1xuICBEcm9wZG93bkNvbXBvbmVudCxcbiAgU2xpZGVyQ29tcG9uZW50LFxuICBUZXh0QXJlYUNvbXBvbmVudCxcbiAgVGV4dENvbXBvbmVudCxcbiAgVmFsdWVDb21wb25lbnRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFZhbGlkYXRvckVsZW1lbnQgfSBmcm9tICcuLi8uLi9IVE1MRWxlbWVudC50cyc7XG5cbi8qKlxuICogQSBWYWx1ZUNvbXBvbmVudCB0aGF0IGNhbiB0cmFjayBjaGFuZ2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nPFQ+IGV4dGVuZHMgVmFsdWVDb21wb25lbnQ8VD4ge1xuICAvKipcbiAgICogU2V0cyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50IGNoYW5nZXMuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCBjaGFuZ2VzLlxuICAgKi9cbiAgb25DaGFuZ2UoY2FsbGJhY2s6IChuZXdWYWx1ZTogVCkgPT4gUHJvbWlzZTx2b2lkPik6IHRoaXM7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsaWRhdG9yIGVsZW1lbnQgZnJvbSBhIHZhbHVlIGNvbXBvbmVudCBpZiBpdCBleGlzdHMuXG4gKlxuICogQHBhcmFtIHZhbHVlQ29tcG9uZW50IC0gVGhlIHZhbHVlIGNvbXBvbmVudCB0byBnZXQgdGhlIHZhbGlkYXRvciBlbGVtZW50IGZyb20uXG4gKiBAcmV0dXJucyBUaGUgdmFsaWRhdG9yIGVsZW1lbnQgaWYgaXQgZXhpc3RzLCBvciBgbnVsbGAgaWYgaXQgZG9lcyBub3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWxpZGF0b3JFbGVtZW50PFVJVmFsdWU+KHZhbHVlQ29tcG9uZW50OiBWYWx1ZUNvbXBvbmVudFdpdGhDaGFuZ2VUcmFja2luZzxVSVZhbHVlPik6IG51bGwgfCBWYWxpZGF0b3JFbGVtZW50IHtcbiAgaWYgKHZhbHVlQ29tcG9uZW50IGluc3RhbmNlb2YgRHJvcGRvd25Db21wb25lbnQpIHtcbiAgICByZXR1cm4gdmFsdWVDb21wb25lbnQuc2VsZWN0RWw7XG4gIH1cblxuICBpZiAodmFsdWVDb21wb25lbnQgaW5zdGFuY2VvZiBTbGlkZXJDb21wb25lbnQpIHtcbiAgICByZXR1cm4gdmFsdWVDb21wb25lbnQuc2xpZGVyRWw7XG4gIH1cblxuICBpZiAodmFsdWVDb21wb25lbnQgaW5zdGFuY2VvZiBUZXh0QXJlYUNvbXBvbmVudCkge1xuICAgIHJldHVybiB2YWx1ZUNvbXBvbmVudC5pbnB1dEVsO1xuICB9XG5cbiAgaWYgKHZhbHVlQ29tcG9uZW50IGluc3RhbmNlb2YgVGV4dENvbXBvbmVudCkge1xuICAgIHJldHVybiB2YWx1ZUNvbXBvbmVudC5pbnB1dEVsO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS0Esc0JBTU87QUFzQkEsU0FBUyxvQkFBNkIsZ0JBQW9GO0FBQy9ILE1BQUksMEJBQTBCLG1DQUFtQjtBQUMvQyxXQUFPLGVBQWU7QUFBQSxFQUN4QjtBQUVBLE1BQUksMEJBQTBCLGlDQUFpQjtBQUM3QyxXQUFPLGVBQWU7QUFBQSxFQUN4QjtBQUVBLE1BQUksMEJBQTBCLG1DQUFtQjtBQUMvQyxXQUFPLGVBQWU7QUFBQSxFQUN4QjtBQUVBLE1BQUksMEJBQTBCLCtCQUFlO0FBQzNDLFdBQU8sZUFBZTtBQUFBLEVBQ3hCO0FBRUEsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -3,62 +3,11 @@
3
3
  * Contains utility types and functions for handling value components, which are UI components that display and edit values.
4
4
  */
5
5
  import { ValueComponent } from 'obsidian';
6
- import type { KeysMatching } from '../../@types.ts';
7
- import type { MaybePromise } from '../../Async.ts';
8
- import type { PluginBase } from './PluginBase.ts';
9
- import type { PluginSettingsBase } from './PluginSettingsBase.ts';
10
- /**
11
- * Options for binding a value component to a plugin setting.
12
- */
13
- interface BindValueComponentOptions<PluginSettings, UIValue> {
14
- /**
15
- * A callback function that is called when the value of the component changes.
16
- */
17
- onChanged?: () => MaybePromise<void>;
18
- /**
19
- * The plugin settings object to bind the component to. Default is the plugin's current settings.
20
- */
21
- pluginSettings?: PluginSettings;
22
- /**
23
- * If true, saves the plugin settings automatically after the component value changes. Default is `true`.
24
- */
25
- shouldAutoSave?: boolean;
26
- /**
27
- * If true, shows the validation message when the component value is invalid. Default is `true`.
28
- */
29
- shouldShowValidationMessage?: boolean;
30
- /**
31
- * Validates the UI value before setting it on the plugin settings.
32
- * @param uiValue - The value of the UI component.
33
- * @returns An error message if the value is invalid, or `(empty string)` or `void` if it is valid.
34
- */
35
- valueValidator?: (uiValue: UIValue) => MaybePromise<string | void>;
36
- }
37
- /**
38
- * Extended options for binding a value component to a plugin setting.
39
- */
40
- interface BindValueComponentOptionsExtended<PluginSettings, UIValue, Property extends keyof PluginSettings> extends BindValueComponentOptions<PluginSettings, UIValue> {
41
- /**
42
- * Converts the UI component's value back to the plugin settings value.
43
- * @param uiValue - The value of the UI component.
44
- * @returns The value to set on the plugin settings.
45
- */
46
- componentToPluginSettingsValueConverter: (uiValue: UIValue) => PluginSettings[Property];
47
- /**
48
- * Converts the plugin settings value to the value used by the UI component.
49
- * @param pluginSettingsValue - The value of the property in the plugin settings.
50
- * @returns The value to set on the UI component.
51
- */
52
- pluginSettingsToComponentValueConverter: (pluginSettingsValue: PluginSettings[Property]) => UIValue;
53
- }
54
- /**
55
- * ValueComponent that can be used as an original ValueComponent with extended functionality.
56
- */
57
- type ValueComponentExType<UIValue, TValueComponent extends ValueComponentWithChangeTracking<UIValue>> = TValueComponent & ValueComponentEx<UIValue, TValueComponent>;
6
+ import type { ValidatorElement } from '../../HTMLElement.ts';
58
7
  /**
59
8
  * A ValueComponent that can track changes.
60
9
  */
61
- interface ValueComponentWithChangeTracking<T> extends ValueComponent<T> {
10
+ export interface ValueComponentWithChangeTracking<T> extends ValueComponent<T> {
62
11
  /**
63
12
  * Sets a callback function to be called when the value of the component changes.
64
13
  *
@@ -67,53 +16,9 @@ interface ValueComponentWithChangeTracking<T> extends ValueComponent<T> {
67
16
  onChange(callback: (newValue: T) => Promise<void>): this;
68
17
  }
69
18
  /**
70
- * ValueComponent with extended functionality.
71
- */
72
- declare class ValueComponentEx<UIValue, TValueComponent extends ValueComponentWithChangeTracking<UIValue>> {
73
- private valueComponent;
74
- constructor(valueComponent: TValueComponent);
75
- /**
76
- * Returns the ValueComponent with extended functionality.
77
- */
78
- asExtended(): ValueComponentExType<UIValue, TValueComponent>;
79
- /**
80
- * Binds the ValueComponent to a property in the plugin settings.
81
- *
82
- * @typeParam PluginSettings - The type of the plugin settings object.
83
- * @typeParam Property - The key of the plugin setting that the component is bound to.
84
- * @param plugin - The plugin.
85
- * @param property - The property key in `PluginSettings` to bind to the UI component.
86
- * @param options - Configuration options.
87
- * @returns The `ValueComponent` instance that was bound to the property.
88
- */
89
- bind<PluginSettings extends PluginSettingsBase, Property extends KeysMatching<PluginSettings, UIValue>>(plugin: PluginBase<PluginSettings>, property: Property, options?: BindValueComponentOptions<PluginSettings, UIValue>): ValueComponentExType<UIValue, TValueComponent>;
90
- /**
91
- * Binds the ValueComponent to a property in the plugin settings.
92
- *
93
- * @typeParam Plugin - The type of the plugin that extends `PluginBase`.
94
- * @typeParam Property - The key of the plugin setting that the component is bound to.
95
- * @typeParam PluginSettings - The type of the plugin settings object.
96
- * @param plugin - The plugin.
97
- * @param property - The property key in `PluginSettings` to bind to the UI component.
98
- * @param options - Configuration options.
99
- * @returns The `ValueComponent` instance that was bound to the property.
100
- */
101
- bind<PluginSettings extends PluginSettingsBase, Property extends keyof PluginSettings>(plugin: PluginBase<PluginSettings>, property: Property, options: BindValueComponentOptionsExtended<PluginSettings, UIValue, Property>): ValueComponentExType<UIValue, TValueComponent>;
102
- }
103
- /**
104
- * Extends a ValueComponent with additional functionality.
105
- *
106
- * @typeParam UIValue - The type of the value the component displays.
107
- * @typeParam TValueComponent - The type of the value component extending `ValueComponent`.
108
- * @param valueComponent - The value component to extend.
109
- * @returns The value component with extended functionality.
110
- */
111
- export declare function extend<UIValue, TValueComponent extends ValueComponentWithChangeTracking<UIValue>>(valueComponent: TValueComponent & ValueComponentWithChangeTracking<UIValue>): ValueComponentExType<UIValue, TValueComponent>;
112
- /**
113
- * Revalidates a value component.
19
+ * Gets the validator element from a value component if it exists.
114
20
  *
115
- * @param valueComponent - The value component to revalidate.
116
- * @returns `true` if the value component is valid, `false` otherwise.
21
+ * @param valueComponent - The value component to get the validator element from.
22
+ * @returns The validator element if it exists, or `null` if it does not.
117
23
  */
118
- export declare function revalidate(valueComponent: ValueComponent<any>): Promise<boolean>;
119
- export {};
24
+ export declare function getValidatorElement<UIValue>(valueComponent: ValueComponentWithChangeTracking<UIValue>): null | ValidatorElement;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-dev-utils",
3
- "version": "14.4.0",
3
+ "version": "14.4.1-beta.1",
4
4
  "description": "This is the collection of useful functions that you can use for your Obsidian plugin development",
5
5
  "keywords": [
6
6
  "obsidian"
Binary file