obsidian-dev-utils 2.18.0 → 2.19.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 2.19.0
4
+
5
+ - Refactor UIComponent
6
+
3
7
  ## 2.18.0
4
8
 
5
9
  - Export getAlias
@@ -39,38 +39,9 @@ class PluginSettingsTabBase extends import_obsidian.PluginSettingTab {
39
39
  super(plugin.app, plugin);
40
40
  this.plugin = plugin;
41
41
  }
42
- /**
43
- * Internal implementation of `bindValueComponent` that handles both overloads.
44
- *
45
- * @typeParam TValueComponent - The type of the value component extending `ValueComponent`.
46
- * @typeParam Property - The key of the plugin setting that the component is bound to.
47
- * @typeParam UIValueType - The inferred type of the UI value based on the value component's type.
48
- *
49
- * @param valueComponent - The component that will display and interact with the setting value.
50
- * @param property - The property key in `PluginSettings` to bind to the component.
51
- * @param options - Configuration options.
52
- *
53
- * @returns The `TValueComponent` instance that was bound to the property.
54
- */
55
- bindValueComponent(valueComponent, property, options) {
56
- const {
57
- autoSave,
58
- pluginSettings,
59
- settingToUIValueConverter,
60
- uiToSettingValueConverter
61
- } = options;
62
- const pluginSettings2 = pluginSettings ?? this.plugin.settingsCopy;
63
- valueComponent.setValue(settingToUIValueConverter(pluginSettings2[property])).onChange(async (newValue) => {
64
- pluginSettings2[property] = uiToSettingValueConverter(newValue);
65
- if (autoSave) {
66
- await this.plugin.saveSettings(pluginSettings2);
67
- }
68
- });
69
- return valueComponent;
70
- }
71
42
  }
72
43
  // Annotate the CommonJS export names for ESM import in node:
73
44
  0 && (module.exports = {
74
45
  PluginSettingsTabBase
75
46
  });
76
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc1RhYkJhc2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbInZhciBfX2ltcG9ydF9tZXRhX3VybCA9IGdsb2JhbFRoaXNbXCJpbXBvcnQubWV0YS51cmxcIl0gPz8gKCgpPT5yZXF1aXJlKFwibm9kZTp1cmxcIikucGF0aFRvRmlsZVVSTChfX2ZpbGVuYW1lKSkoKTtcbnZhciBfX3Byb2Nlc3MgPSBnbG9iYWxUaGlzW1wicHJvY2Vzc1wiXSA/PyB7XG4gIFwiY3dkXCI6ICgpPT5cIi9cIixcbiAgXCJlbnZcIjoge30sXG4gIFwicGxhdGZvcm1cIjogXCJhbmRyb2lkXCJcbn07XG4vKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvbiBQbHVnaW5TZXR0aW5nc1RhYkJhc2VcbiAqIFRoaXMgbW9kdWxlIGRlZmluZXMgYSBiYXNlIGNsYXNzIGZvciBjcmVhdGluZyBwbHVnaW4gc2V0dGluZyB0YWJzIGluIE9ic2lkaWFuLlxuICogSXQgcHJvdmlkZXMgYSB1dGlsaXR5IG1ldGhvZCB0byBiaW5kIHZhbHVlIGNvbXBvbmVudHMgdG8gcGx1Z2luIHNldHRpbmdzIGFuZCBoYW5kbGUgY2hhbmdlcy5cbiAqL1xuXG5pbXBvcnQgeyBQbHVnaW5TZXR0aW5nVGFiIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBQbHVnaW5CYXNlIH0gZnJvbSBcIi4vUGx1Z2luQmFzZS50c1wiO1xuaW1wb3J0IHR5cGUgeyBLZXlzTWF0Y2hpbmcgfSBmcm9tIFwiLi4vLi4vQHR5cGVzLnRzXCI7XG5cbmludGVyZmFjZSBWYWx1ZUNvbXBvbmVudDxUPiB7XG4gIHNldFZhbHVlKHZhbHVlOiBUKTogdGhpcztcbiAgb25DaGFuZ2UoY2FsbGJhY2s6IChuZXdWYWx1ZTogVCkgPT4gUHJvbWlzZTx2b2lkPik6IHRoaXM7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYmluZGluZyBhIHZhbHVlIGNvbXBvbmVudCB0byBhIHBsdWdpbiBzZXR0aW5nLlxuICovXG50eXBlIEJpbmRWYWx1ZUNvbXBvbmVudE9wdGlvbnM8UGx1Z2luU2V0dGluZ3MsIFByb3BlcnR5IGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3MsIFVJVmFsdWVUeXBlPiA9IHtcbiAgLy8gSWYgdHJ1ZSwgc2F2ZXMgdGhlIHBsdWdpbiBzZXR0aW5ncyBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSBjb21wb25lbnQgdmFsdWUgY2hhbmdlcy4gRGVmYXVsdCBpcyBgdHJ1ZWAuXG4gIGF1dG9TYXZlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBzZXR0aW5ncyBvYmplY3QgdG8gYmluZCB0aGUgY29tcG9uZW50IHRvLiBEZWZhdWx0IGlzIHRoZSBwbHVnaW4ncyBjdXJyZW50IHNldHRpbmdzLlxuICAgKi9cbiAgcGx1Z2luU2V0dGluZ3M/OiBQbHVnaW5TZXR0aW5ncztcblxuICAvKipcbiAgICogQ29udmVydHMgdGhlIHNldHRpbmcgdmFsdWUgdG8gdGhlIHZhbHVlIHVzZWQgYnkgdGhlIFVJIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIHByb3BlcnR5VmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSB0byBzZXQgb24gdGhlIFVJIGNvbXBvbmVudC5cbiAgICovXG4gIHNldHRpbmdUb1VJVmFsdWVDb252ZXJ0ZXI6IChwcm9wZXJ0eVZhbHVlOiBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eV0pID0+IFVJVmFsdWVUeXBlO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgVUkgY29tcG9uZW50J3MgdmFsdWUgYmFjayB0byB0aGUgc2V0dGluZyB2YWx1ZS5cbiAgICogQHBhcmFtIHVpVmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIFVJIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIHRvIHNldCBvbiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICAgKi9cbiAgdWlUb1NldHRpbmdWYWx1ZUNvbnZlcnRlcjogKHVpVmFsdWU6IFVJVmFsdWVUeXBlKSA9PiBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eV07XG59O1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5ncyB0YWJzIGluIE9ic2lkaWFuLlxuICogUHJvdmlkZXMgYSBtZXRob2QgZm9yIGJpbmRpbmcgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsaW5nIGNoYW5nZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUUGx1Z2luIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiB0aGF0IGV4dGVuZHMgUGx1Z2luQmFzZS5cbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpblNldHRpbmdzVGFiQmFzZTxcbiAgVFBsdWdpbiBleHRlbmRzIFBsdWdpbkJhc2U8UGx1Z2luU2V0dGluZ3M+LFxuICBQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdFxuPiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIG92ZXJyaWRlIHBsdWdpbjogVFBsdWdpbikge1xuICAgIHN1cGVyKHBsdWdpbi5hcHAsIHBsdWdpbik7XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgYSB2YWx1ZSBjb21wb25lbnQgdG8gYSBwcm9wZXJ0eSBpbiB0aGUgcGx1Z2luIHNldHRpbmdzIHdpdGggb3B0aW9uYWwgYXV0b21hdGljIHNhdmluZyBhbmQgdmFsdWUgY29udmVyc2lvbi5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUVmFsdWVDb21wb25lbnQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgY29tcG9uZW50IGV4dGVuZGluZyBgVmFsdWVDb21wb25lbnRgLlxuICAgKiBAdHlwZVBhcmFtIFByb3BlcnR5IC0gVGhlIGtleSBvZiB0aGUgcGx1Z2luIHNldHRpbmcgdGhhdCB0aGUgY29tcG9uZW50IGlzIGJvdW5kIHRvLlxuICAgKiBAdHlwZVBhcmFtIFByb3BlcnR5VHlwZSAtIFRoZSBpbmZlcnJlZCB0eXBlIG9mIHRoZSBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgdmFsdWUgY29tcG9uZW50J3MgdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlQ29tcG9uZW50IC0gVGhlIGNvbXBvbmVudCB0aGF0IHdpbGwgZGlzcGxheSBhbmQgaW50ZXJhY3Qgd2l0aCB0aGUgc2V0dGluZyB2YWx1ZS5cbiAgICogQHBhcmFtIHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGtleSBpbiBgUGx1Z2luU2V0dGluZ3NgIHRvIGJpbmQgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBgVFZhbHVlQ29tcG9uZW50YCBpbnN0YW5jZSB0aGF0IHdhcyBib3VuZCB0byB0aGUgcHJvcGVydHkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYmluZFZhbHVlQ29tcG9uZW50PFxuICAgIFRWYWx1ZUNvbXBvbmVudCBleHRlbmRzIFZhbHVlQ29tcG9uZW50PHVua25vd24+LFxuICAgIFByb3BlcnR5IGV4dGVuZHMgS2V5c01hdGNoaW5nPFBsdWdpblNldHRpbmdzLCBVSVZhbHVlVHlwZT4sXG4gICAgVUlWYWx1ZVR5cGUgPSBUVmFsdWVDb21wb25lbnQgZXh0ZW5kcyBWYWx1ZUNvbXBvbmVudDxpbmZlciBQPiA/IFAgOiBuZXZlcixcbiAgPihcbiAgICB2YWx1ZUNvbXBvbmVudDogVFZhbHVlQ29tcG9uZW50LFxuICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICBvcHRpb25zPzogQmluZFZhbHVlQ29tcG9uZW50T3B0aW9uczxQbHVnaW5TZXR0aW5ncywgUHJvcGVydHksIFVJVmFsdWVUeXBlPlxuICApOiBUVmFsdWVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEJpbmRzIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcHJvcGVydHkgaW4gdGhlIHBsdWdpbiBzZXR0aW5ncyB3aXRoIGF1dG9tYXRpYyBzYXZpbmcgYW5kIGN1c3RvbSB2YWx1ZSBjb252ZXJzaW9uLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQgZXh0ZW5kaW5nIGBWYWx1ZUNvbXBvbmVudGAuXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHkgLSBUaGUga2V5IG9mIHRoZSBwbHVnaW4gc2V0dGluZyB0aGF0IHRoZSBjb21wb25lbnQgaXMgYm91bmQgdG8uXG4gICAqIEB0eXBlUGFyYW0gVUlWYWx1ZVR5cGUgLSBUaGUgaW5mZXJyZWQgdHlwZSBvZiB0aGUgVUkgdmFsdWUgYmFzZWQgb24gdGhlIHZhbHVlIGNvbXBvbmVudCdzIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZUNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgdGhhdCB3aWxsIGRpc3BsYXkgYW5kIGludGVyYWN0IHdpdGggdGhlIHNldHRpbmcgdmFsdWUuXG4gICAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBrZXkgaW4gYFBsdWdpblNldHRpbmdzYCB0byBiaW5kIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgYFRWYWx1ZUNvbXBvbmVudGAgaW5zdGFuY2UgdGhhdCB3YXMgYm91bmQgdG8gdGhlIHByb3BlcnR5LlxuICAgKi9cbiAgcHJvdGVjdGVkIGJpbmRWYWx1ZUNvbXBvbmVudDxcbiAgICBUVmFsdWVDb21wb25lbnQgZXh0ZW5kcyBWYWx1ZUNvbXBvbmVudDx1bmtub3duPixcbiAgICBQcm9wZXJ0eSBleHRlbmRzIGtleW9mIFBsdWdpblNldHRpbmdzLFxuICAgIFVJVmFsdWVUeXBlID0gVFZhbHVlQ29tcG9uZW50IGV4dGVuZHMgVmFsdWVDb21wb25lbnQ8aW5mZXIgUD4gPyBQIDogbmV2ZXIsXG4gID4oXG4gICAgdmFsdWVDb21wb25lbnQ6IFRWYWx1ZUNvbXBvbmVudCxcbiAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgb3B0aW9uczogQmluZFZhbHVlQ29tcG9uZW50T3B0aW9uczxQbHVnaW5TZXR0aW5ncywgUHJvcGVydHksIFVJVmFsdWVUeXBlPlxuICApOiBUVmFsdWVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIGBiaW5kVmFsdWVDb21wb25lbnRgIHRoYXQgaGFuZGxlcyBib3RoIG92ZXJsb2Fkcy5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUVmFsdWVDb21wb25lbnQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgY29tcG9uZW50IGV4dGVuZGluZyBgVmFsdWVDb21wb25lbnRgLlxuICAgKiBAdHlwZVBhcmFtIFByb3BlcnR5IC0gVGhlIGtleSBvZiB0aGUgcGx1Z2luIHNldHRpbmcgdGhhdCB0aGUgY29tcG9uZW50IGlzIGJvdW5kIHRvLlxuICAgKiBAdHlwZVBhcmFtIFVJVmFsdWVUeXBlIC0gVGhlIGluZmVycmVkIHR5cGUgb2YgdGhlIFVJIHZhbHVlIGJhc2VkIG9uIHRoZSB2YWx1ZSBjb21wb25lbnQncyB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVDb21wb25lbnQgLSBUaGUgY29tcG9uZW50IHRoYXQgd2lsbCBkaXNwbGF5IGFuZCBpbnRlcmFjdCB3aXRoIHRoZSBzZXR0aW5nIHZhbHVlLlxuICAgKiBAcGFyYW0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IGluIGBQbHVnaW5TZXR0aW5nc2AgdG8gYmluZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGBUVmFsdWVDb21wb25lbnRgIGluc3RhbmNlIHRoYXQgd2FzIGJvdW5kIHRvIHRoZSBwcm9wZXJ0eS5cbiAgICovXG4gIHByb3RlY3RlZCBiaW5kVmFsdWVDb21wb25lbnQ8XG4gICAgVFZhbHVlQ29tcG9uZW50IGV4dGVuZHMgVmFsdWVDb21wb25lbnQ8dW5rbm93bj4sXG4gICAgUHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBQbHVnaW5TZXR0aW5ncyxcbiAgICBVSVZhbHVlVHlwZSA9IFRWYWx1ZUNvbXBvbmVudCBleHRlbmRzIFZhbHVlQ29tcG9uZW50PGluZmVyIFA+ID8gUCA6IG5ldmVyLFxuICA+KFxuICAgIHZhbHVlQ29tcG9uZW50OiBUVmFsdWVDb21wb25lbnQsXG4gICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgIG9wdGlvbnM6IEJpbmRWYWx1ZUNvbXBvbmVudE9wdGlvbnM8UGx1Z2luU2V0dGluZ3MsIFByb3BlcnR5LCBVSVZhbHVlVHlwZT5cbiAgKTogVFZhbHVlQ29tcG9uZW50IHtcbiAgICBjb25zdCB7XG4gICAgICBhdXRvU2F2ZSxcbiAgICAgIHBsdWdpblNldHRpbmdzLFxuICAgICAgc2V0dGluZ1RvVUlWYWx1ZUNvbnZlcnRlcixcbiAgICAgIHVpVG9TZXR0aW5nVmFsdWVDb252ZXJ0ZXJcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBwbHVnaW5TZXR0aW5nczIgPSBwbHVnaW5TZXR0aW5ncyA/PyB0aGlzLnBsdWdpbi5zZXR0aW5nc0NvcHk7XG4gICAgKHZhbHVlQ29tcG9uZW50IGFzIFZhbHVlQ29tcG9uZW50PFVJVmFsdWVUeXBlPilcbiAgICAgIC5zZXRWYWx1ZShzZXR0aW5nVG9VSVZhbHVlQ29udmVydGVyKHBsdWdpblNldHRpbmdzMltwcm9wZXJ0eV0pKVxuICAgICAgLm9uQ2hhbmdlKGFzeW5jIChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICBwbHVnaW5TZXR0aW5nczJbcHJvcGVydHldID0gdWlUb1NldHRpbmdWYWx1ZUNvbnZlcnRlcihuZXdWYWx1ZSk7XG4gICAgICAgIGlmIChhdXRvU2F2ZSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncyhwbHVnaW5TZXR0aW5nczIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICByZXR1cm4gdmFsdWVDb21wb25lbnQ7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVlBLHNCQUFpQztBQUNqQyx3QkFBMkI7QUFiM0IsSUFBSSxvQkFBb0IsV0FBVyxpQkFBaUIsTUFBTSxNQUFJLFFBQVEsVUFBVSxFQUFFLGNBQWMsVUFBVSxHQUFHO0FBQzdHLElBQUksWUFBWSxXQUFXLFNBQVMsS0FBSztBQUFBLEVBQ3ZDLE9BQU8sTUFBSTtBQUFBLEVBQ1gsT0FBTyxDQUFDO0FBQUEsRUFDUixZQUFZO0FBQ2Q7QUFrRE8sTUFBZSw4QkFHWixpQ0FBaUI7QUFBQSxFQUNsQixZQUE0QixRQUFpQjtBQUNsRCxVQUFNLE9BQU8sS0FBSyxNQUFNO0FBRFM7QUFBQSxFQUVuQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUE2RFUsbUJBS1IsZ0JBQ0EsVUFDQSxTQUNpQjtBQUNqQixVQUFNO0FBQUEsTUFDSjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0YsSUFBSTtBQUNKLFVBQU0sa0JBQWtCLGtCQUFrQixLQUFLLE9BQU87QUFDdEQsSUFBQyxlQUNFLFNBQVMsMEJBQTBCLGdCQUFnQixRQUFRLENBQUMsQ0FBQyxFQUM3RCxTQUFTLE9BQU8sYUFBYTtBQUM1QixzQkFBZ0IsUUFBUSxJQUFJLDBCQUEwQixRQUFRO0FBQzlELFVBQUksVUFBVTtBQUNaLGNBQU0sS0FBSyxPQUFPLGFBQWEsZUFBZTtBQUFBLE1BQ2hEO0FBQUEsSUFDRixDQUFDO0FBQ0gsV0FBTztBQUFBLEVBQ1Q7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
47
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc1RhYkJhc2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbInZhciBfX2ltcG9ydF9tZXRhX3VybCA9IGdsb2JhbFRoaXNbXCJpbXBvcnQubWV0YS51cmxcIl0gPz8gKCgpPT5yZXF1aXJlKFwibm9kZTp1cmxcIikucGF0aFRvRmlsZVVSTChfX2ZpbGVuYW1lKSkoKTtcbnZhciBfX3Byb2Nlc3MgPSBnbG9iYWxUaGlzW1wicHJvY2Vzc1wiXSA/PyB7XG4gIFwiY3dkXCI6ICgpPT5cIi9cIixcbiAgXCJlbnZcIjoge30sXG4gIFwicGxhdGZvcm1cIjogXCJhbmRyb2lkXCJcbn07XG4vKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvbiBQbHVnaW5TZXR0aW5nc1RhYkJhc2VcbiAqIFRoaXMgbW9kdWxlIGRlZmluZXMgYSBiYXNlIGNsYXNzIGZvciBjcmVhdGluZyBwbHVnaW4gc2V0dGluZyB0YWJzIGluIE9ic2lkaWFuLlxuICogSXQgcHJvdmlkZXMgYSB1dGlsaXR5IG1ldGhvZCB0byBiaW5kIHZhbHVlIGNvbXBvbmVudHMgdG8gcGx1Z2luIHNldHRpbmdzIGFuZCBoYW5kbGUgY2hhbmdlcy5cbiAqL1xuXG5pbXBvcnQgeyBQbHVnaW5TZXR0aW5nVGFiIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBQbHVnaW5CYXNlIH0gZnJvbSBcIi4vUGx1Z2luQmFzZS50c1wiO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5ncyB0YWJzIGluIE9ic2lkaWFuLlxuICogUHJvdmlkZXMgYSBtZXRob2QgZm9yIGJpbmRpbmcgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsaW5nIGNoYW5nZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUUGx1Z2luIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiB0aGF0IGV4dGVuZHMgUGx1Z2luQmFzZS5cbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpblNldHRpbmdzVGFiQmFzZTxcbiAgVFBsdWdpbiBleHRlbmRzIFBsdWdpbkJhc2U8UGx1Z2luU2V0dGluZ3M+LFxuICBQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdCA9IFRQbHVnaW4gZXh0ZW5kcyBQbHVnaW5CYXNlPGluZmVyIFA+ID8gUCA6IG5ldmVyLFxuPiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIG92ZXJyaWRlIHBsdWdpbjogVFBsdWdpbikge1xuICAgIHN1cGVyKHBsdWdpbi5hcHAsIHBsdWdpbik7XG4gIH1cbn1cblxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBWUEsc0JBQWlDO0FBQ2pDLHdCQUEyQjtBQWIzQixJQUFJLG9CQUFvQixXQUFXLGlCQUFpQixNQUFNLE1BQUksUUFBUSxVQUFVLEVBQUUsY0FBYyxVQUFVLEdBQUc7QUFDN0csSUFBSSxZQUFZLFdBQVcsU0FBUyxLQUFLO0FBQUEsRUFDdkMsT0FBTyxNQUFJO0FBQUEsRUFDWCxPQUFPLENBQUM7QUFBQSxFQUNSLFlBQVk7QUFDZDtBQWlCTyxNQUFlLDhCQUdaLGlDQUFpQjtBQUFBLEVBQ2xCLFlBQTRCLFFBQWlCO0FBQ2xELFVBQU0sT0FBTyxLQUFLLE1BQU07QUFEUztBQUFBLEVBRW5DO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -5,33 +5,6 @@
5
5
  */
6
6
  import { PluginSettingTab } from "obsidian";
7
7
  import { PluginBase } from "./PluginBase.ts";
8
- import type { KeysMatching } from "../../@types.ts";
9
- interface ValueComponent<T> {
10
- setValue(value: T): this;
11
- onChange(callback: (newValue: T) => Promise<void>): this;
12
- }
13
- /**
14
- * Options for binding a value component to a plugin setting.
15
- */
16
- type BindValueComponentOptions<PluginSettings, Property extends keyof PluginSettings, UIValueType> = {
17
- autoSave?: boolean;
18
- /**
19
- * The plugin settings object to bind the component to. Default is the plugin's current settings.
20
- */
21
- pluginSettings?: PluginSettings;
22
- /**
23
- * Converts the setting value to the value used by the UI component.
24
- * @param propertyValue - The value of the property in the plugin settings.
25
- * @returns The value to set on the UI component.
26
- */
27
- settingToUIValueConverter: (propertyValue: PluginSettings[Property]) => UIValueType;
28
- /**
29
- * Converts the UI component's value back to the setting value.
30
- * @param uiValue - The value of the UI component.
31
- * @returns The value to set on the plugin settings.
32
- */
33
- uiToSettingValueConverter: (uiValue: UIValueType) => PluginSettings[Property];
34
- };
35
8
  /**
36
9
  * Base class for creating plugin settings tabs in Obsidian.
37
10
  * Provides a method for binding value components to plugin settings and handling changes.
@@ -39,36 +12,7 @@ type BindValueComponentOptions<PluginSettings, Property extends keyof PluginSett
39
12
  * @typeParam TPlugin - The type of the plugin that extends PluginBase.
40
13
  * @typeParam PluginSettings - The type of the plugin settings object.
41
14
  */
42
- export declare abstract class PluginSettingsTabBase<TPlugin extends PluginBase<PluginSettings>, PluginSettings extends object> extends PluginSettingTab {
15
+ export declare abstract class PluginSettingsTabBase<TPlugin extends PluginBase<PluginSettings>, PluginSettings extends object = TPlugin extends PluginBase<infer P> ? P : never> extends PluginSettingTab {
43
16
  plugin: TPlugin;
44
17
  constructor(plugin: TPlugin);
45
- /**
46
- * Binds a value component to a property in the plugin settings with optional automatic saving and value conversion.
47
- *
48
- * @typeParam TValueComponent - The type of the value component extending `ValueComponent`.
49
- * @typeParam Property - The key of the plugin setting that the component is bound to.
50
- * @typeParam PropertyType - The inferred type of the property based on the value component's type.
51
- *
52
- * @param valueComponent - The component that will display and interact with the setting value.
53
- * @param property - The property key in `PluginSettings` to bind to the component.
54
- * @param options - Configuration options.
55
- *
56
- * @returns The `TValueComponent` instance that was bound to the property.
57
- */
58
- protected bindValueComponent<TValueComponent extends ValueComponent<unknown>, Property extends KeysMatching<PluginSettings, UIValueType>, UIValueType = TValueComponent extends ValueComponent<infer P> ? P : never>(valueComponent: TValueComponent, property: Property, options?: BindValueComponentOptions<PluginSettings, Property, UIValueType>): TValueComponent;
59
- /**
60
- * Binds a value component to a property in the plugin settings with automatic saving and custom value conversion.
61
- *
62
- * @typeParam TValueComponent - The type of the value component extending `ValueComponent`.
63
- * @typeParam Property - The key of the plugin setting that the component is bound to.
64
- * @typeParam UIValueType - The inferred type of the UI value based on the value component's type.
65
- *
66
- * @param valueComponent - The component that will display and interact with the setting value.
67
- * @param property - The property key in `PluginSettings` to bind to the component.
68
- * @param options - Configuration options.
69
- *
70
- * @returns The `TValueComponent` instance that was bound to the property.
71
- */
72
- protected bindValueComponent<TValueComponent extends ValueComponent<unknown>, Property extends keyof PluginSettings, UIValueType = TValueComponent extends ValueComponent<infer P> ? P : never>(valueComponent: TValueComponent, property: Property, options: BindValueComponentOptions<PluginSettings, Property, UIValueType>): TValueComponent;
73
18
  }
74
- export {};
@@ -0,0 +1,80 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ "use strict";
7
+ var __defProp = Object.defineProperty;
8
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
9
+ var __getOwnPropNames = Object.getOwnPropertyNames;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __export = (target, all) => {
12
+ for (var name in all)
13
+ __defProp(target, name, { get: all[name], enumerable: true });
14
+ };
15
+ var __copyProps = (to, from, except, desc) => {
16
+ if (from && typeof from === "object" || typeof from === "function") {
17
+ for (let key of __getOwnPropNames(from))
18
+ if (!__hasOwnProp.call(to, key) && key !== except)
19
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
20
+ }
21
+ return to;
22
+ };
23
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
24
+ var UIComponent_exports = {};
25
+ __export(UIComponent_exports, {
26
+ bindUiComponent: () => bindUiComponent
27
+ });
28
+ module.exports = __toCommonJS(UIComponent_exports);
29
+ var import_obsidian = require("obsidian");
30
+ var __import_meta_url = globalThis["import.meta.url"] ?? (() => require("node:url").pathToFileURL(__filename))();
31
+ var __process = globalThis["process"] ?? {
32
+ "cwd": () => "/",
33
+ "env": {},
34
+ "platform": "android"
35
+ };
36
+ function bindUiComponent(pluginSettingsTab, uiComponent, property, options) {
37
+ options ??= {
38
+ settingToUIValueConverter: (value) => value,
39
+ uiToSettingValueConverter: (value) => value
40
+ };
41
+ const pluginSettings = options.pluginSettings ?? pluginSettingsTab.plugin.settingsCopy;
42
+ uiComponent.setValue(options.settingToUIValueConverter(pluginSettings[property])).onChange(async (uiValue) => {
43
+ if (options.uiValueValidator) {
44
+ const errorMessage = options.uiValueValidator(uiValue);
45
+ const validatorElement = getValidatorElement(uiComponent);
46
+ if (validatorElement) {
47
+ validatorElement.setCustomValidity(errorMessage ?? "");
48
+ validatorElement.reportValidity();
49
+ }
50
+ if (errorMessage) {
51
+ return;
52
+ }
53
+ }
54
+ pluginSettings[property] = options.uiToSettingValueConverter(uiValue);
55
+ if (options.autoSave ?? true) {
56
+ await pluginSettingsTab.plugin.saveSettings(pluginSettings);
57
+ }
58
+ });
59
+ return uiComponent;
60
+ }
61
+ function getValidatorElement(uiComponent) {
62
+ if (uiComponent instanceof import_obsidian.DropdownComponent) {
63
+ return uiComponent.selectEl;
64
+ }
65
+ if (uiComponent instanceof import_obsidian.SliderComponent) {
66
+ return uiComponent.sliderEl;
67
+ }
68
+ if (uiComponent instanceof import_obsidian.TextAreaComponent) {
69
+ return uiComponent.inputEl;
70
+ }
71
+ if (uiComponent instanceof import_obsidian.TextComponent) {
72
+ return uiComponent.inputEl;
73
+ }
74
+ return null;
75
+ }
76
+ // Annotate the CommonJS export names for ESM import in node:
77
+ 0 && (module.exports = {
78
+ bindUiComponent
79
+ });
80
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9VSUNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsidmFyIF9faW1wb3J0X21ldGFfdXJsID0gZ2xvYmFsVGhpc1tcImltcG9ydC5tZXRhLnVybFwiXSA/PyAoKCk9PnJlcXVpcmUoXCJub2RlOnVybFwiKS5wYXRoVG9GaWxlVVJMKF9fZmlsZW5hbWUpKSgpO1xudmFyIF9fcHJvY2VzcyA9IGdsb2JhbFRoaXNbXCJwcm9jZXNzXCJdID8/IHtcbiAgXCJjd2RcIjogKCk9PlwiL1wiLFxuICBcImVudlwiOiB7fSxcbiAgXCJwbGF0Zm9ybVwiOiBcImFuZHJvaWRcIlxufTtcbmltcG9ydCB0eXBlIHsgS2V5c01hdGNoaW5nIH0gZnJvbSBcIi4uLy4uL0B0eXBlcy50c1wiO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5TZXR0aW5nc1RhYkJhc2UgfSBmcm9tIFwiLi9QbHVnaW5TZXR0aW5nc1RhYkJhc2UudHNcIjtcbmltcG9ydCB0eXBlIHsgUGx1Z2luQmFzZSB9IGZyb20gXCIuL1BsdWdpbkJhc2UudHNcIjtcbmltcG9ydCB7XG4gIERyb3Bkb3duQ29tcG9uZW50LFxuICBTbGlkZXJDb21wb25lbnQsXG4gIFRleHRBcmVhQ29tcG9uZW50LFxuICBUZXh0Q29tcG9uZW50XG59IGZyb20gXCJvYnNpZGlhblwiO1xuXG4vKipcbiAqIEEgVUkgY29tcG9uZW50IHRoYXQgY2FuIGJlIGJvdW5kIHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVUlDb21wb25lbnQ8VUlWYWx1ZT4ge1xuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldCBvbiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgc2V0VmFsdWUodmFsdWU6IFVJVmFsdWUpOiB0aGlzO1xuXG4gIC8qKlxuICAgKiBTZXRzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQgY2hhbmdlcy5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50IGNoYW5nZXMuXG4gICAqL1xuICBvbkNoYW5nZShjYWxsYmFjazogKG5ld1ZhbHVlOiBVSVZhbHVlKSA9PiBQcm9taXNlPHZvaWQ+KTogdGhpcztcbn1cblxuLyoqXG4gKiBBIFVJIGNvbXBvbmVudCB0aGF0IGNhbiBiZSB2YWxpZGF0ZWQuXG4gKi9cbmludGVyZmFjZSBWYWxpZGF0b3JFbGVtZW50IHtcbiAgLyoqXG4gICAqIFNldHMgYSBjdXN0b20gZXJyb3IgbWVzc2FnZSBvbiB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gc2V0IG9uIHRoZSBlbGVtZW50LlxuICAgKi9cbiAgc2V0Q3VzdG9tVmFsaWRpdHkoZXJyb3I6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgdGhlIHZhbGlkaXR5IG9mIHRoZSBlbGVtZW50LlxuICAgKi9cbiAgcmVwb3J0VmFsaWRpdHkoKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBiaW5kaW5nIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gKi9cbnR5cGUgQmluZFVJQ29tcG9uZW50T3B0aW9uczxQbHVnaW5TZXR0aW5ncywgUHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZVR5cGU+ID0ge1xuICAvLyBJZiB0cnVlLCBzYXZlcyB0aGUgcGx1Z2luIHNldHRpbmdzIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGNvbXBvbmVudCB2YWx1ZSBjaGFuZ2VzLiBEZWZhdWx0IGlzIGB0cnVlYC5cbiAgYXV0b1NhdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHNldHRpbmdzIG9iamVjdCB0byBiaW5kIHRoZSBjb21wb25lbnQgdG8uIERlZmF1bHQgaXMgdGhlIHBsdWdpbidzIGN1cnJlbnQgc2V0dGluZ3MuXG4gICAqL1xuICBwbHVnaW5TZXR0aW5ncz86IFBsdWdpblNldHRpbmdzO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgc2V0dGluZyB2YWx1ZSB0byB0aGUgdmFsdWUgdXNlZCBieSB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIHRvIHNldCBvbiB0aGUgVUkgY29tcG9uZW50LlxuICAgKi9cbiAgc2V0dGluZ1RvVUlWYWx1ZUNvbnZlcnRlcjogKHByb3BlcnR5VmFsdWU6IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5XSkgPT4gVUlWYWx1ZVR5cGU7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBVSSBjb21wb25lbnQncyB2YWx1ZSBiYWNrIHRvIHRoZSBzZXR0aW5nIHZhbHVlLlxuICAgKiBAcGFyYW0gdWlWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgdG8gc2V0IG9uIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gICAqL1xuICB1aVRvU2V0dGluZ1ZhbHVlQ29udmVydGVyOiAodWlWYWx1ZTogVUlWYWx1ZVR5cGUpID0+IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5XTtcblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBVSSB2YWx1ZSBiZWZvcmUgc2V0dGluZyBpdCBvbiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICAgKiBAcGFyYW0gdWlWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBBbiBlcnJvciBtZXNzYWdlIGlmIHRoZSB2YWx1ZSBpcyBpbnZhbGlkLCBvciBgbnVsbGAgaWYgaXQgaXMgdmFsaWQuXG4gICAqL1xuICB1aVZhbHVlVmFsaWRhdG9yPzogKHVpVmFsdWU6IFVJVmFsdWVUeXBlKSA9PiBzdHJpbmcgfCBudWxsO1xufTtcblxuLyoqXG4gKiBCaW5kcyBhIHZhbHVlIGNvbXBvbmVudCB0byBhIHByb3BlcnR5IGluIHRoZSBwbHVnaW4gc2V0dGluZ3Mgd2l0aCBvcHRpb25hbCBhdXRvbWF0aWMgc2F2aW5nIGFuZCB2YWx1ZSBjb252ZXJzaW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3NUYWIgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRhYiB0aGF0IGV4dGVuZHMgYFBsdWdpblNldHRpbmdzVGFiQmFzZWAuXG4gKiBAdHlwZVBhcmFtIFRVSUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQgZXh0ZW5kaW5nIGBVSUNvbXBvbmVudGAuXG4gKiBAdHlwZVBhcmFtIFByb3BlcnR5IC0gVGhlIGtleSBvZiB0aGUgcGx1Z2luIHNldHRpbmcgdGhhdCB0aGUgY29tcG9uZW50IGlzIGJvdW5kIHRvLlxuICogQHR5cGVQYXJhbSBVSVZhbHVlVHlwZSAtIFRoZSBpbmZlcnJlZCB0eXBlIGJhc2VkIG9uIHRoZSBVSSBjb21wb25lbnQncyB0eXBlLlxuICogQHR5cGVQYXJhbSBUUGx1Z2luIC0gVGhlIGluZmVycmVkIHR5cGUgb2YgdGhlIHBsdWdpbiB0aGF0IGV4dGVuZHMgYFBsdWdpbkJhc2VgLlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSBpbmZlcnJlZCB0eXBlIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3Mgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBwbHVnaW5TZXR0aW5nc1RhYiAtIFRoZSBwbHVnaW4gc2V0dGluZ3MgdGFiIHRoYXQgY29udGFpbnMgdGhlIFVJIGNvbXBvbmVudC5cbiAqIEBwYXJhbSB1aUNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgdGhhdCB3aWxsIGRpc3BsYXkgYW5kIGludGVyYWN0IHdpdGggdGhlIHNldHRpbmcgdmFsdWUuXG4gKiBAcGFyYW0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IGluIGBQbHVnaW5TZXR0aW5nc2AgdG8gYmluZCB0byB0aGUgVUkgY29tcG9uZW50LlxuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKlxuICogQHJldHVybnMgVGhlIGBVSUNvbXBvbmVudGAgaW5zdGFuY2UgdGhhdCB3YXMgYm91bmQgdG8gdGhlIHByb3BlcnR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZFVpQ29tcG9uZW50PFxuICBQbHVnaW5TZXR0aW5nc1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdzVGFiQmFzZTxUUGx1Z2luLCBQbHVnaW5TZXR0aW5ncz4sXG4gIFRVSUNvbXBvbmVudCBleHRlbmRzIFVJQ29tcG9uZW50PHVua25vd24+LFxuICBQcm9wZXJ0eSBleHRlbmRzIEtleXNNYXRjaGluZzxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZVR5cGU+LFxuICBVSVZhbHVlVHlwZSA9IFRVSUNvbXBvbmVudCBleHRlbmRzIFVJQ29tcG9uZW50PGluZmVyIFA+ID8gUCA6IG5ldmVyLFxuICBUUGx1Z2luIGV4dGVuZHMgUGx1Z2luQmFzZTxQbHVnaW5TZXR0aW5ncz4gPSBQbHVnaW5TZXR0aW5nc1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdzVGFiQmFzZTxpbmZlciBQPiA/IFAgOiBuZXZlcixcbiAgUGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3QgPSBUUGx1Z2luIGV4dGVuZHMgUGx1Z2luQmFzZTxpbmZlciBQPiA/IFAgOiBuZXZlcixcbj4oXG4gIHBsdWdpblNldHRpbmdzVGFiOiBQbHVnaW5TZXR0aW5nc1RhYixcbiAgdWlDb21wb25lbnQ6IFRVSUNvbXBvbmVudCxcbiAgcHJvcGVydHk6IFByb3BlcnR5LFxuICBvcHRpb25zPzogQmluZFVJQ29tcG9uZW50T3B0aW9uczxQbHVnaW5TZXR0aW5ncywgUHJvcGVydHksIFVJVmFsdWVUeXBlPlxuKTogVFVJQ29tcG9uZW50O1xuXG4vKipcbiAqIEJpbmRzIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcHJvcGVydHkgaW4gdGhlIHBsdWdpbiBzZXR0aW5ncyB3aXRoIG9wdGlvbmFsIGF1dG9tYXRpYyBzYXZpbmcgYW5kIHZhbHVlIGNvbnZlcnNpb24uXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5nc1RhYiAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MgdGFiIHRoYXQgZXh0ZW5kcyBgUGx1Z2luU2V0dGluZ3NUYWJCYXNlYC5cbiAqIEB0eXBlUGFyYW0gVFVJQ29tcG9uZW50IC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIGNvbXBvbmVudCBleHRlbmRpbmcgYFVJQ29tcG9uZW50YC5cbiAqIEB0eXBlUGFyYW0gUHJvcGVydHkgLSBUaGUga2V5IG9mIHRoZSBwbHVnaW4gc2V0dGluZyB0aGF0IHRoZSBjb21wb25lbnQgaXMgYm91bmQgdG8uXG4gKiBAdHlwZVBhcmFtIFVJVmFsdWVUeXBlIC0gVGhlIGluZmVycmVkIHR5cGUgYmFzZWQgb24gdGhlIFVJIGNvbXBvbmVudCdzIHR5cGUuXG4gKiBAdHlwZVBhcmFtIFRQbHVnaW4gLSBUaGUgaW5mZXJyZWQgdHlwZSBvZiB0aGUgcGx1Z2luIHRoYXQgZXh0ZW5kcyBgUGx1Z2luQmFzZWAuXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIGluZmVycmVkIHR5cGUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHBsdWdpblNldHRpbmdzVGFiIC0gVGhlIHBsdWdpbiBzZXR0aW5ncyB0YWIgdGhhdCBjb250YWlucyB0aGUgVUkgY29tcG9uZW50LlxuICogQHBhcmFtIHVpQ29tcG9uZW50IC0gVGhlIGNvbXBvbmVudCB0aGF0IHdpbGwgZGlzcGxheSBhbmQgaW50ZXJhY3Qgd2l0aCB0aGUgc2V0dGluZyB2YWx1ZS5cbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBrZXkgaW4gYFBsdWdpblNldHRpbmdzYCB0byBiaW5kIHRvIHRoZSBVSSBjb21wb25lbnQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYFVJQ29tcG9uZW50YCBpbnN0YW5jZSB0aGF0IHdhcyBib3VuZCB0byB0aGUgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kVWlDb21wb25lbnQ8XG4gIFBsdWdpblNldHRpbmdzVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ3NUYWJCYXNlPFRQbHVnaW4sIFBsdWdpblNldHRpbmdzPixcbiAgVFVJQ29tcG9uZW50IGV4dGVuZHMgVUlDb21wb25lbnQ8dW5rbm93bj4sXG4gIFByb3BlcnR5IGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3MsXG4gIFVJVmFsdWVUeXBlID0gVFVJQ29tcG9uZW50IGV4dGVuZHMgVUlDb21wb25lbnQ8aW5mZXIgUD4gPyBQIDogbmV2ZXIsXG4gIFRQbHVnaW4gZXh0ZW5kcyBQbHVnaW5CYXNlPFBsdWdpblNldHRpbmdzPiA9IFBsdWdpblNldHRpbmdzVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ3NUYWJCYXNlPGluZmVyIFA+ID8gUCA6IG5ldmVyLFxuICBQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdCA9IFRQbHVnaW4gZXh0ZW5kcyBQbHVnaW5CYXNlPGluZmVyIFA+ID8gUCA6IG5ldmVyLFxuPihcbiAgcGx1Z2luU2V0dGluZ3NUYWI6IFBsdWdpblNldHRpbmdzVGFiLFxuICB1aUNvbXBvbmVudDogVFVJQ29tcG9uZW50LFxuICBwcm9wZXJ0eTogUHJvcGVydHksXG4gIG9wdGlvbnM6IEJpbmRVSUNvbXBvbmVudE9wdGlvbnM8UGx1Z2luU2V0dGluZ3MsIFByb3BlcnR5LCBVSVZhbHVlVHlwZT5cbik6IFRVSUNvbXBvbmVudDtcblxuLyoqXG4gKiBCaW5kcyBhIHZhbHVlIGNvbXBvbmVudCB0byBhIHByb3BlcnR5IGluIHRoZSBwbHVnaW4gc2V0dGluZ3Mgd2l0aCBvcHRpb25hbCBhdXRvbWF0aWMgc2F2aW5nIGFuZCB2YWx1ZSBjb252ZXJzaW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3NUYWIgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRhYiB0aGF0IGV4dGVuZHMgYFBsdWdpblNldHRpbmdzVGFiQmFzZWAuXG4gKiBAdHlwZVBhcmFtIFRVSUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQgZXh0ZW5kaW5nIGBVSUNvbXBvbmVudGAuXG4gKiBAdHlwZVBhcmFtIFByb3BlcnR5IC0gVGhlIGtleSBvZiB0aGUgcGx1Z2luIHNldHRpbmcgdGhhdCB0aGUgY29tcG9uZW50IGlzIGJvdW5kIHRvLlxuICogQHR5cGVQYXJhbSBVSVZhbHVlVHlwZSAtIFRoZSBpbmZlcnJlZCB0eXBlIGJhc2VkIG9uIHRoZSBVSSBjb21wb25lbnQncyB0eXBlLlxuICogQHR5cGVQYXJhbSBUUGx1Z2luIC0gVGhlIGluZmVycmVkIHR5cGUgb2YgdGhlIHBsdWdpbiB0aGF0IGV4dGVuZHMgYFBsdWdpbkJhc2VgLlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSBpbmZlcnJlZCB0eXBlIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3Mgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBwbHVnaW5TZXR0aW5nc1RhYiAtIFRoZSBwbHVnaW4gc2V0dGluZ3MgdGFiIHRoYXQgY29udGFpbnMgdGhlIFVJIGNvbXBvbmVudC5cbiAqIEBwYXJhbSB1aUNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgdGhhdCB3aWxsIGRpc3BsYXkgYW5kIGludGVyYWN0IHdpdGggdGhlIHNldHRpbmcgdmFsdWUuXG4gKiBAcGFyYW0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IGluIGBQbHVnaW5TZXR0aW5nc2AgdG8gYmluZCB0byB0aGUgVUkgY29tcG9uZW50LlxuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKlxuICogQHJldHVybnMgVGhlIGBVSUNvbXBvbmVudGAgaW5zdGFuY2UgdGhhdCB3YXMgYm91bmQgdG8gdGhlIHByb3BlcnR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZFVpQ29tcG9uZW50PFxuICBQbHVnaW5TZXR0aW5nc1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdzVGFiQmFzZTxUUGx1Z2luLCBQbHVnaW5TZXR0aW5ncz4sXG4gIFRVSUNvbXBvbmVudCBleHRlbmRzIFVJQ29tcG9uZW50PHVua25vd24+LFxuICBQcm9wZXJ0eSBleHRlbmRzIGtleW9mIFBsdWdpblNldHRpbmdzLFxuICBVSVZhbHVlVHlwZSA9IFRVSUNvbXBvbmVudCBleHRlbmRzIFVJQ29tcG9uZW50PGluZmVyIFA+ID8gUCA6IG5ldmVyLFxuICBUUGx1Z2luIGV4dGVuZHMgUGx1Z2luQmFzZTxQbHVnaW5TZXR0aW5ncz4gPSBQbHVnaW5TZXR0aW5nc1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdzVGFiQmFzZTxpbmZlciBQPiA/IFAgOiBuZXZlcixcbiAgUGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3QgPSBUUGx1Z2luIGV4dGVuZHMgUGx1Z2luQmFzZTxpbmZlciBQPiA/IFAgOiBuZXZlcixcbj4oXG4gIHBsdWdpblNldHRpbmdzVGFiOiBQbHVnaW5TZXR0aW5nc1RhYixcbiAgdWlDb21wb25lbnQ6IFRVSUNvbXBvbmVudCxcbiAgcHJvcGVydHk6IFByb3BlcnR5LFxuICBvcHRpb25zPzogQmluZFVJQ29tcG9uZW50T3B0aW9uczxQbHVnaW5TZXR0aW5ncywgUHJvcGVydHksIFVJVmFsdWVUeXBlPlxuKTogVFVJQ29tcG9uZW50IHtcbiAgb3B0aW9ucyA/Pz0ge1xuICAgIHNldHRpbmdUb1VJVmFsdWVDb252ZXJ0ZXI6ICh2YWx1ZSk6IFVJVmFsdWVUeXBlID0+IHZhbHVlIGFzIFVJVmFsdWVUeXBlLFxuICAgIHVpVG9TZXR0aW5nVmFsdWVDb252ZXJ0ZXI6ICh2YWx1ZSk6IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5XSA9PiB2YWx1ZSBhcyBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eV0sXG4gIH07XG4gIGNvbnN0IHBsdWdpblNldHRpbmdzID0gb3B0aW9ucy5wbHVnaW5TZXR0aW5ncyA/PyBwbHVnaW5TZXR0aW5nc1RhYi5wbHVnaW4uc2V0dGluZ3NDb3B5O1xuICAodWlDb21wb25lbnQgYXMgVUlDb21wb25lbnQ8VUlWYWx1ZVR5cGU+KVxuICAgIC5zZXRWYWx1ZShvcHRpb25zLnNldHRpbmdUb1VJVmFsdWVDb252ZXJ0ZXIocGx1Z2luU2V0dGluZ3NbcHJvcGVydHldKSlcbiAgICAub25DaGFuZ2UoYXN5bmMgKHVpVmFsdWUpID0+IHtcbiAgICAgIGlmIChvcHRpb25zLnVpVmFsdWVWYWxpZGF0b3IpIHtcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gb3B0aW9ucy51aVZhbHVlVmFsaWRhdG9yKHVpVmFsdWUpO1xuICAgICAgICBjb25zdCB2YWxpZGF0b3JFbGVtZW50ID0gZ2V0VmFsaWRhdG9yRWxlbWVudCh1aUNvbXBvbmVudCk7XG4gICAgICAgIGlmICh2YWxpZGF0b3JFbGVtZW50KSB7XG4gICAgICAgICAgdmFsaWRhdG9yRWxlbWVudC5zZXRDdXN0b21WYWxpZGl0eShlcnJvck1lc3NhZ2UgPz8gXCJcIik7XG4gICAgICAgICAgdmFsaWRhdG9yRWxlbWVudC5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBsdWdpblNldHRpbmdzW3Byb3BlcnR5XSA9IG9wdGlvbnMudWlUb1NldHRpbmdWYWx1ZUNvbnZlcnRlcih1aVZhbHVlKTtcbiAgICAgIGlmIChvcHRpb25zLmF1dG9TYXZlID8/IHRydWUpIHtcbiAgICAgICAgYXdhaXQgcGx1Z2luU2V0dGluZ3NUYWIucGx1Z2luLnNhdmVTZXR0aW5ncyhwbHVnaW5TZXR0aW5ncyk7XG4gICAgICB9XG4gICAgfSk7XG4gIHJldHVybiB1aUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB2YWxpZGF0b3IgZWxlbWVudCBmcm9tIGEgVUkgY29tcG9uZW50IGlmIGl0IGV4aXN0cy5cbiAqIEBwYXJhbSB1aUNvbXBvbmVudCAtIFRoZSBVSSBjb21wb25lbnQgdG8gZ2V0IHRoZSB2YWxpZGF0b3IgZWxlbWVudCBmcm9tLlxuICogQHJldHVybnMgVGhlIHZhbGlkYXRvciBlbGVtZW50IGlmIGl0IGV4aXN0cywgb3IgYG51bGxgIGlmIGl0IGRvZXMgbm90LlxuICovXG5mdW5jdGlvbiBnZXRWYWxpZGF0b3JFbGVtZW50KHVpQ29tcG9uZW50OiBVSUNvbXBvbmVudDx1bmtub3duPik6IFZhbGlkYXRvckVsZW1lbnQgfCBudWxsIHtcbiAgaWYgKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgRHJvcGRvd25Db21wb25lbnQpIHtcbiAgICByZXR1cm4gdWlDb21wb25lbnQuc2VsZWN0RWw7XG4gIH1cblxuICBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBTbGlkZXJDb21wb25lbnQpIHtcbiAgICByZXR1cm4gdWlDb21wb25lbnQuc2xpZGVyRWw7XG4gIH1cblxuICBpZiAodWlDb21wb25lbnQgaW5zdGFuY2VvZiBUZXh0QXJlYUNvbXBvbmVudCkge1xuICAgIHJldHVybiB1aUNvbXBvbmVudC5pbnB1dEVsO1xuICB9XG5cbiAgaWYgKHVpQ29tcG9uZW50IGluc3RhbmNlb2YgVGV4dENvbXBvbmVudCkge1xuICAgIHJldHVybiB1aUNvbXBvbmVudC5pbnB1dEVsO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFTQSxzQkFLTztBQWRQLElBQUksb0JBQW9CLFdBQVcsaUJBQWlCLE1BQU0sTUFBSSxRQUFRLFVBQVUsRUFBRSxjQUFjLFVBQVUsR0FBRztBQUM3RyxJQUFJLFlBQVksV0FBVyxTQUFTLEtBQUs7QUFBQSxFQUN2QyxPQUFPLE1BQUk7QUFBQSxFQUNYLE9BQU8sQ0FBQztBQUFBLEVBQ1IsWUFBWTtBQUNkO0FBNkpPLFNBQVMsZ0JBUWQsbUJBQ0EsYUFDQSxVQUNBLFNBQ2M7QUFDZCxjQUFZO0FBQUEsSUFDViwyQkFBMkIsQ0FBQyxVQUF1QjtBQUFBLElBQ25ELDJCQUEyQixDQUFDLFVBQW9DO0FBQUEsRUFDbEU7QUFDQSxRQUFNLGlCQUFpQixRQUFRLGtCQUFrQixrQkFBa0IsT0FBTztBQUMxRSxFQUFDLFlBQ0UsU0FBUyxRQUFRLDBCQUEwQixlQUFlLFFBQVEsQ0FBQyxDQUFDLEVBQ3BFLFNBQVMsT0FBTyxZQUFZO0FBQzNCLFFBQUksUUFBUSxrQkFBa0I7QUFDNUIsWUFBTSxlQUFlLFFBQVEsaUJBQWlCLE9BQU87QUFDckQsWUFBTSxtQkFBbUIsb0JBQW9CLFdBQVc7QUFDeEQsVUFBSSxrQkFBa0I7QUFDcEIseUJBQWlCLGtCQUFrQixnQkFBZ0IsRUFBRTtBQUNyRCx5QkFBaUIsZUFBZTtBQUFBLE1BQ2xDO0FBQ0EsVUFBSSxjQUFjO0FBQ2hCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFDQSxtQkFBZSxRQUFRLElBQUksUUFBUSwwQkFBMEIsT0FBTztBQUNwRSxRQUFJLFFBQVEsWUFBWSxNQUFNO0FBQzVCLFlBQU0sa0JBQWtCLE9BQU8sYUFBYSxjQUFjO0FBQUEsSUFDNUQ7QUFBQSxFQUNGLENBQUM7QUFDSCxTQUFPO0FBQ1Q7QUFPQSxTQUFTLG9CQUFvQixhQUE0RDtBQUN2RixNQUFJLHVCQUF1QixtQ0FBbUI7QUFDNUMsV0FBTyxZQUFZO0FBQUEsRUFDckI7QUFFQSxNQUFJLHVCQUF1QixpQ0FBaUI7QUFDMUMsV0FBTyxZQUFZO0FBQUEsRUFDckI7QUFFQSxNQUFJLHVCQUF1QixtQ0FBbUI7QUFDNUMsV0FBTyxZQUFZO0FBQUEsRUFDckI7QUFFQSxNQUFJLHVCQUF1QiwrQkFBZTtBQUN4QyxXQUFPLFlBQVk7QUFBQSxFQUNyQjtBQUVBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,83 @@
1
+ import type { KeysMatching } from "../../@types.ts";
2
+ import type { PluginSettingsTabBase } from "./PluginSettingsTabBase.ts";
3
+ import type { PluginBase } from "./PluginBase.ts";
4
+ /**
5
+ * A UI component that can be bound to a plugin setting.
6
+ */
7
+ export interface UIComponent<UIValue> {
8
+ /**
9
+ * Sets the value of the component.
10
+ * @param value - The value to set on the component.
11
+ */
12
+ setValue(value: UIValue): this;
13
+ /**
14
+ * Sets a callback function to be called when the value of the component changes.
15
+ * @param callback - A callback function that is called when the value of the component changes.
16
+ */
17
+ onChange(callback: (newValue: UIValue) => Promise<void>): this;
18
+ }
19
+ /**
20
+ * Options for binding a value component to a plugin setting.
21
+ */
22
+ type BindUIComponentOptions<PluginSettings, Property extends keyof PluginSettings, UIValueType> = {
23
+ autoSave?: boolean;
24
+ /**
25
+ * The plugin settings object to bind the component to. Default is the plugin's current settings.
26
+ */
27
+ pluginSettings?: PluginSettings;
28
+ /**
29
+ * Converts the setting value to the value used by the UI component.
30
+ * @param propertyValue - The value of the property in the plugin settings.
31
+ * @returns The value to set on the UI component.
32
+ */
33
+ settingToUIValueConverter: (propertyValue: PluginSettings[Property]) => UIValueType;
34
+ /**
35
+ * Converts the UI component's value back to the setting value.
36
+ * @param uiValue - The value of the UI component.
37
+ * @returns The value to set on the plugin settings.
38
+ */
39
+ uiToSettingValueConverter: (uiValue: UIValueType) => PluginSettings[Property];
40
+ /**
41
+ * Validates the UI value before setting it on the plugin settings.
42
+ * @param uiValue - The value of the UI component.
43
+ * @returns An error message if the value is invalid, or `null` if it is valid.
44
+ */
45
+ uiValueValidator?: (uiValue: UIValueType) => string | null;
46
+ };
47
+ /**
48
+ * Binds a value component to a property in the plugin settings with optional automatic saving and value conversion.
49
+ *
50
+ * @typeParam PluginSettingsTab - The type of the plugin settings tab that extends `PluginSettingsTabBase`.
51
+ * @typeParam TUIComponent - The type of the value component extending `UIComponent`.
52
+ * @typeParam Property - The key of the plugin setting that the component is bound to.
53
+ * @typeParam UIValueType - The inferred type based on the UI component's type.
54
+ * @typeParam TPlugin - The inferred type of the plugin that extends `PluginBase`.
55
+ * @typeParam PluginSettings - The inferred type of the plugin settings object.
56
+ *
57
+ * @param pluginSettingsTab - The plugin settings tab that contains the UI component.
58
+ * @param uiComponent - The component that will display and interact with the setting value.
59
+ * @param property - The property key in `PluginSettings` to bind to the UI component.
60
+ * @param options - Configuration options.
61
+ *
62
+ * @returns The `UIComponent` instance that was bound to the property.
63
+ */
64
+ export declare function bindUiComponent<PluginSettingsTab extends PluginSettingsTabBase<TPlugin, PluginSettings>, TUIComponent extends UIComponent<unknown>, Property extends KeysMatching<PluginSettings, UIValueType>, UIValueType = TUIComponent extends UIComponent<infer P> ? P : never, TPlugin extends PluginBase<PluginSettings> = PluginSettingsTab extends PluginSettingsTabBase<infer P> ? P : never, PluginSettings extends object = TPlugin extends PluginBase<infer P> ? P : never>(pluginSettingsTab: PluginSettingsTab, uiComponent: TUIComponent, property: Property, options?: BindUIComponentOptions<PluginSettings, Property, UIValueType>): TUIComponent;
65
+ /**
66
+ * Binds a value component to a property in the plugin settings with optional automatic saving and value conversion.
67
+ *
68
+ * @typeParam PluginSettingsTab - The type of the plugin settings tab that extends `PluginSettingsTabBase`.
69
+ * @typeParam TUIComponent - The type of the value component extending `UIComponent`.
70
+ * @typeParam Property - The key of the plugin setting that the component is bound to.
71
+ * @typeParam UIValueType - The inferred type based on the UI component's type.
72
+ * @typeParam TPlugin - The inferred type of the plugin that extends `PluginBase`.
73
+ * @typeParam PluginSettings - The inferred type of the plugin settings object.
74
+ *
75
+ * @param pluginSettingsTab - The plugin settings tab that contains the UI component.
76
+ * @param uiComponent - The component that will display and interact with the setting value.
77
+ * @param property - The property key in `PluginSettings` to bind to the UI component.
78
+ * @param options - Configuration options.
79
+ *
80
+ * @returns The `UIComponent` instance that was bound to the property.
81
+ */
82
+ export declare function bindUiComponent<PluginSettingsTab extends PluginSettingsTabBase<TPlugin, PluginSettings>, TUIComponent extends UIComponent<unknown>, Property extends keyof PluginSettings, UIValueType = TUIComponent extends UIComponent<infer P> ? P : never, TPlugin extends PluginBase<PluginSettings> = PluginSettingsTab extends PluginSettingsTabBase<infer P> ? P : never, PluginSettings extends object = TPlugin extends PluginBase<infer P> ? P : never>(pluginSettingsTab: PluginSettingsTab, uiComponent: TUIComponent, property: Property, options: BindUIComponentOptions<PluginSettings, Property, UIValueType>): TUIComponent;
83
+ export {};
@@ -37,7 +37,8 @@ __export(Plugin_exports, {
37
37
  Plugin: () => Plugin,
38
38
  PluginBase: () => PluginBase,
39
39
  PluginSettings: () => PluginSettings,
40
- PluginSettingsTabBase: () => PluginSettingsTabBase
40
+ PluginSettingsTabBase: () => PluginSettingsTabBase,
41
+ UIComponent: () => UIComponent
41
42
  });
42
43
  module.exports = __toCommonJS(Plugin_exports);
43
44
  var ObsidianPluginRepoPaths = __toESM(require("./ObsidianPluginRepoPaths.cjs"), 1);
@@ -45,6 +46,7 @@ var Plugin = __toESM(require("./Plugin.cjs"), 1);
45
46
  var PluginBase = __toESM(require("./PluginBase.cjs"), 1);
46
47
  var PluginSettings = __toESM(require("./PluginSettings.cjs"), 1);
47
48
  var PluginSettingsTabBase = __toESM(require("./PluginSettingsTabBase.cjs"), 1);
49
+ var UIComponent = __toESM(require("./UIComponent.cjs"), 1);
48
50
  var __import_meta_url = globalThis["import.meta.url"] ?? (() => require("node:url").pathToFileURL(__filename))();
49
51
  var __process = globalThis["process"] ?? {
50
52
  "cwd": () => "/",
@@ -57,6 +59,7 @@ var __process = globalThis["process"] ?? {
57
59
  Plugin,
58
60
  PluginBase,
59
61
  PluginSettings,
60
- PluginSettingsTabBase
62
+ PluginSettingsTabBase,
63
+ UIComponent
61
64
  });
62
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsidmFyIF9faW1wb3J0X21ldGFfdXJsID0gZ2xvYmFsVGhpc1tcImltcG9ydC5tZXRhLnVybFwiXSA/PyAoKCk9PnJlcXVpcmUoXCJub2RlOnVybFwiKS5wYXRoVG9GaWxlVVJMKF9fZmlsZW5hbWUpKSgpO1xudmFyIF9fcHJvY2VzcyA9IGdsb2JhbFRoaXNbXCJwcm9jZXNzXCJdID8/IHtcbiAgXCJjd2RcIjogKCk9PlwiL1wiLFxuICBcImVudlwiOiB7fSxcbiAgXCJwbGF0Zm9ybVwiOiBcImFuZHJvaWRcIlxufTtcbi8qIFRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEJVSUxEIFNDUklQVCAqL1xuXG5leHBvcnQgKiBhcyBPYnNpZGlhblBsdWdpblJlcG9QYXRocyBmcm9tIFwiLi9PYnNpZGlhblBsdWdpblJlcG9QYXRocy50c1wiO1xuZXhwb3J0ICogYXMgUGx1Z2luIGZyb20gXCIuL1BsdWdpbi50c1wiO1xuZXhwb3J0ICogYXMgUGx1Z2luQmFzZSBmcm9tIFwiLi9QbHVnaW5CYXNlLnRzXCI7XG5leHBvcnQgKiBhcyBQbHVnaW5TZXR0aW5ncyBmcm9tIFwiLi9QbHVnaW5TZXR0aW5ncy50c1wiO1xuZXhwb3J0ICogYXMgUGx1Z2luU2V0dGluZ3NUYWJCYXNlIGZyb20gXCIuL1BsdWdpblNldHRpbmdzVGFiQmFzZS50c1wiO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBUUEsOEJBQXlDO0FBQ3pDLGFBQXdCO0FBQ3hCLGlCQUE0QjtBQUM1QixxQkFBZ0M7QUFDaEMsNEJBQXVDO0FBWnZDLElBQUksb0JBQW9CLFdBQVcsaUJBQWlCLE1BQU0sTUFBSSxRQUFRLFVBQVUsRUFBRSxjQUFjLFVBQVUsR0FBRztBQUM3RyxJQUFJLFlBQVksV0FBVyxTQUFTLEtBQUs7QUFBQSxFQUN2QyxPQUFPLE1BQUk7QUFBQSxFQUNYLE9BQU8sQ0FBQztBQUFBLEVBQ1IsWUFBWTtBQUNkOyIsCiAgIm5hbWVzIjogW10KfQo=
65
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsidmFyIF9faW1wb3J0X21ldGFfdXJsID0gZ2xvYmFsVGhpc1tcImltcG9ydC5tZXRhLnVybFwiXSA/PyAoKCk9PnJlcXVpcmUoXCJub2RlOnVybFwiKS5wYXRoVG9GaWxlVVJMKF9fZmlsZW5hbWUpKSgpO1xudmFyIF9fcHJvY2VzcyA9IGdsb2JhbFRoaXNbXCJwcm9jZXNzXCJdID8/IHtcbiAgXCJjd2RcIjogKCk9PlwiL1wiLFxuICBcImVudlwiOiB7fSxcbiAgXCJwbGF0Zm9ybVwiOiBcImFuZHJvaWRcIlxufTtcbi8qIFRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEJVSUxEIFNDUklQVCAqL1xuXG5leHBvcnQgKiBhcyBPYnNpZGlhblBsdWdpblJlcG9QYXRocyBmcm9tIFwiLi9PYnNpZGlhblBsdWdpblJlcG9QYXRocy50c1wiO1xuZXhwb3J0ICogYXMgUGx1Z2luIGZyb20gXCIuL1BsdWdpbi50c1wiO1xuZXhwb3J0ICogYXMgUGx1Z2luQmFzZSBmcm9tIFwiLi9QbHVnaW5CYXNlLnRzXCI7XG5leHBvcnQgKiBhcyBQbHVnaW5TZXR0aW5ncyBmcm9tIFwiLi9QbHVnaW5TZXR0aW5ncy50c1wiO1xuZXhwb3J0ICogYXMgUGx1Z2luU2V0dGluZ3NUYWJCYXNlIGZyb20gXCIuL1BsdWdpblNldHRpbmdzVGFiQmFzZS50c1wiO1xuZXhwb3J0ICogYXMgVUlDb21wb25lbnQgZnJvbSBcIi4vVUlDb21wb25lbnQudHNcIjtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBUUEsOEJBQXlDO0FBQ3pDLGFBQXdCO0FBQ3hCLGlCQUE0QjtBQUM1QixxQkFBZ0M7QUFDaEMsNEJBQXVDO0FBQ3ZDLGtCQUE2QjtBQWI3QixJQUFJLG9CQUFvQixXQUFXLGlCQUFpQixNQUFNLE1BQUksUUFBUSxVQUFVLEVBQUUsY0FBYyxVQUFVLEdBQUc7QUFDN0csSUFBSSxZQUFZLFdBQVcsU0FBUyxLQUFLO0FBQUEsRUFDdkMsT0FBTyxNQUFJO0FBQUEsRUFDWCxPQUFPLENBQUM7QUFBQSxFQUNSLFlBQVk7QUFDZDsiLAogICJuYW1lcyI6IFtdCn0K
@@ -3,3 +3,4 @@ export * as Plugin from "./Plugin.ts";
3
3
  export * as PluginBase from "./PluginBase.ts";
4
4
  export * as PluginSettings from "./PluginSettings.ts";
5
5
  export * as PluginSettingsTabBase from "./PluginSettingsTabBase.ts";
6
+ export * as UIComponent from "./UIComponent.ts";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-dev-utils",
3
- "version": "2.18.0",
3
+ "version": "2.19.0",
4
4
  "description": "This is the collection of useful functions that you can use for your Obsidian plugin development",
5
5
  "main": "./dist/lib/index.cjs",
6
6
  "types": "./dist/lib/index.d.ts",