obsidian-dev-utils 1.6.0 → 1.7.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 1.7.1
4
+
5
+ - Make proper `bindValueComponent` overloads
6
+
7
+ ## 1.7.0
8
+
9
+ - Allow convert plugin setting values
10
+
3
11
  ## 1.6.0
4
12
 
5
13
  - Serialize JSON with functions
@@ -45,20 +45,29 @@ class PluginSettingsTabBase extends import_obsidian.PluginSettingTab {
45
45
  this.plugin = plugin;
46
46
  }
47
47
  /**
48
- * Binds a value component to a specific property in the plugin settings.
49
- * Updates the plugin settings when the value component's value changes.
48
+ * Internal implementation of `bindValueComponent` that handles both overloads.
50
49
  *
51
- * @template TValueComponent - The type of the value component.
52
- * @template Property - The type of the property in the plugin settings that the value component is bound to.
53
- * @param {TValueComponent} valueComponent - The value component to bind.
54
- * @param {PluginSettings} pluginSettings - The plugin settings object.
55
- * @param {Property} property - The property in the plugin settings to bind the value component to.
56
- * @param {boolean} [autoSave=true] - Whether to automatically save settings when the value changes.
57
- * @returns {TValueComponent} The bound value component.
50
+ * @typeParam TValueComponent - The type of the value component extending `ValueComponent`.
51
+ * @typeParam Property - The key of the plugin setting that the component is bound to.
52
+ * @typeParam UIValueType - The inferred type of the UI value based on the value component's type.
53
+ *
54
+ * @param valueComponent - The component that will display and interact with the setting value.
55
+ * @param property - The property key in `PluginSettings` to bind to the component.
56
+ * @param options - Configuration options.
57
+ * @param options.autoSave - If true, saves the plugin settings automatically after the component value changes.
58
+ * @param options.settingToUIValueConverter - A function that converts the setting value to the value used by the UI component.
59
+ * @param options.uiToSettingValueConverter - A function that converts the UI component's value back to the setting value.
60
+ *
61
+ * @returns The `TValueComponent` instance that was bound to the property.
58
62
  */
59
- bindValueComponent(valueComponent, pluginSettings, property, autoSave = true) {
60
- valueComponent.setValue(pluginSettings[property]).onChange(async (newValue) => {
61
- pluginSettings[property] = newValue;
63
+ bindValueComponent(valueComponent, property, {
64
+ autoSave,
65
+ settingToUIValueConverter,
66
+ uiToSettingValueConverter
67
+ }) {
68
+ const pluginSettings = this.plugin.settingsCopy;
69
+ valueComponent.setValue(settingToUIValueConverter(pluginSettings[property])).onChange(async (newValue) => {
70
+ pluginSettings[property] = uiToSettingValueConverter(newValue);
62
71
  if (autoSave) {
63
72
  await this.plugin.saveSettings(pluginSettings);
64
73
  }
@@ -70,4 +79,4 @@ class PluginSettingsTabBase extends import_obsidian.PluginSettingTab {
70
79
  0 && (module.exports = {
71
80
  PluginSettingsTabBase
72
81
  });
73
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc1RhYkJhc2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9faW1wb3J0X21ldGFfdXJsID0gZ2xvYmFsVGhpc1tcImltcG9ydC5tZXRhLnVybFwiXSA/PyAoKCk9PnJlcXVpcmUoXCJub2RlOnVybFwiKS5wYXRoVG9GaWxlVVJMKF9fZmlsZW5hbWUpKSgpO1xuY29uc3QgX19wcm9jZXNzID0gZ2xvYmFsVGhpc1tcInByb2Nlc3NcIl0gPz8ge1xuICBcImN3ZFwiOiAoKT0+XCIvXCIsXG4gIFwiZW52XCI6IHt9LFxuICBcInBsYXRmb3JtXCI6IFwiYW5kcm9pZFwiXG59O1xuLyoqXG4gKiBAZmlsZSBUaGlzIG1vZHVsZSBkZWZpbmVzIGEgYmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgcGx1Z2luIHNldHRpbmcgdGFicyBpbiBPYnNpZGlhbi5cbiAqIEl0IHByb3ZpZGVzIGEgdXRpbGl0eSBtZXRob2QgdG8gYmluZCB2YWx1ZSBjb21wb25lbnRzIHRvIHBsdWdpbiBzZXR0aW5ncyBhbmQgaGFuZGxlIGNoYW5nZXMuXG4gKi9cblxuaW1wb3J0IHsgUGx1Z2luU2V0dGluZ1RhYiB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgUGx1Z2luQmFzZSB9IGZyb20gXCIuL1BsdWdpbkJhc2UudHNcIjtcbmltcG9ydCB0eXBlIHsgS2V5c01hdGNoaW5nIH0gZnJvbSBcIi4uLy4uL0B0eXBlcy50c1wiO1xuXG5pbnRlcmZhY2UgVmFsdWVDb21wb25lbnQ8VD4ge1xuICBzZXRWYWx1ZSh2YWx1ZTogVCk6IHRoaXM7XG4gIG9uQ2hhbmdlKGNhbGxiYWNrOiAobmV3VmFsdWU6IFQpID0+IFByb21pc2U8dm9pZD4pOiB0aGlzO1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5ncyB0YWJzIGluIE9ic2lkaWFuLlxuICogUHJvdmlkZXMgYSBtZXRob2QgZm9yIGJpbmRpbmcgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsaW5nIGNoYW5nZXMuXG4gKlxuICogQHRlbXBsYXRlIFRQbHVnaW4gLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHRoYXQgZXh0ZW5kcyBQbHVnaW5CYXNlLlxuICogQHRlbXBsYXRlIFBsdWdpblNldHRpbmdzIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyBvYmplY3QuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQbHVnaW5TZXR0aW5nc1RhYkJhc2U8XG4gIFRQbHVnaW4gZXh0ZW5kcyBQbHVnaW5CYXNlPFBsdWdpblNldHRpbmdzPixcbiAgUGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Rcbj4gZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUGx1Z2luU2V0dGluZ3NUYWJCYXNlLlxuICAgKlxuICAgKiBAcGFyYW0ge1RQbHVnaW59IHBsdWdpbiAtIFRoZSBwbHVnaW4gaW5zdGFuY2UgdG8gd2hpY2ggdGhpcyBzZXR0aW5ncyB0YWIgYmVsb25ncy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgb3ZlcnJpZGUgcGx1Z2luOiBUUGx1Z2luKSB7XG4gICAgc3VwZXIocGx1Z2luLmFwcCwgcGx1Z2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyBhIHZhbHVlIGNvbXBvbmVudCB0byBhIHNwZWNpZmljIHByb3BlcnR5IGluIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gICAqIFVwZGF0ZXMgdGhlIHBsdWdpbiBzZXR0aW5ncyB3aGVuIHRoZSB2YWx1ZSBjb21wb25lbnQncyB2YWx1ZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgVFZhbHVlQ29tcG9uZW50IC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHRlbXBsYXRlIFByb3BlcnR5IC0gVGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBwbHVnaW4gc2V0dGluZ3MgdGhhdCB0aGUgdmFsdWUgY29tcG9uZW50IGlzIGJvdW5kIHRvLlxuICAgKiBAcGFyYW0ge1RWYWx1ZUNvbXBvbmVudH0gdmFsdWVDb21wb25lbnQgLSBUaGUgdmFsdWUgY29tcG9uZW50IHRvIGJpbmQuXG4gICAqIEBwYXJhbSB7UGx1Z2luU2V0dGluZ3N9IHBsdWdpblNldHRpbmdzIC0gVGhlIHBsdWdpbiBzZXR0aW5ncyBvYmplY3QuXG4gICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IGluIHRoZSBwbHVnaW4gc2V0dGluZ3MgdG8gYmluZCB0aGUgdmFsdWUgY29tcG9uZW50IHRvLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthdXRvU2F2ZT10cnVlXSAtIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBzYXZlIHNldHRpbmdzIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMuXG4gICAqIEByZXR1cm5zIHtUVmFsdWVDb21wb25lbnR9IFRoZSBib3VuZCB2YWx1ZSBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYmluZFZhbHVlQ29tcG9uZW50PFxuICAgIFRWYWx1ZUNvbXBvbmVudCBleHRlbmRzIFZhbHVlQ29tcG9uZW50PHVua25vd24+LFxuICAgIFByb3BlcnR5IGV4dGVuZHMgS2V5c01hdGNoaW5nPFBsdWdpblNldHRpbmdzLCBQcm9wZXJ0eVR5cGU+LFxuICAgIFByb3BlcnR5VHlwZSA9IFRWYWx1ZUNvbXBvbmVudCBleHRlbmRzIFZhbHVlQ29tcG9uZW50PGluZmVyIFA+ID8gUCA6IG5ldmVyLFxuICA+KFxuICAgIHZhbHVlQ29tcG9uZW50OiBUVmFsdWVDb21wb25lbnQsXG4gICAgcGx1Z2luU2V0dGluZ3M6IFBsdWdpblNldHRpbmdzLFxuICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICBhdXRvU2F2ZTogYm9vbGVhbiA9IHRydWVcbiAgKTogVFZhbHVlQ29tcG9uZW50IHtcbiAgICB2YWx1ZUNvbXBvbmVudFxuICAgICAgLnNldFZhbHVlKHBsdWdpblNldHRpbmdzW3Byb3BlcnR5XSlcbiAgICAgIC5vbkNoYW5nZShhc3luYyAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgcGx1Z2luU2V0dGluZ3NbcHJvcGVydHldID0gbmV3VmFsdWUgYXMgUGx1Z2luU2V0dGluZ3NbUHJvcGVydHldO1xuICAgICAgICBpZiAoYXV0b1NhdmUpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MocGx1Z2luU2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICByZXR1cm4gdmFsdWVDb21wb25lbnQ7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVdBLHNCQUFpQztBQUNqQyx3QkFBMkI7QUFaM0IsTUFBTSxvQkFBb0IsV0FBVyxpQkFBaUIsTUFBTSxNQUFJLFFBQVEsVUFBVSxFQUFFLGNBQWMsVUFBVSxHQUFHO0FBQy9HLE1BQU0sWUFBWSxXQUFXLFNBQVMsS0FBSztBQUFBLEVBQ3pDLE9BQU8sTUFBSTtBQUFBLEVBQ1gsT0FBTyxDQUFDO0FBQUEsRUFDUixZQUFZO0FBQ2Q7QUFzQk8sTUFBZSw4QkFHWixpQ0FBaUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNbEIsWUFBNEIsUUFBaUI7QUFDbEQsVUFBTSxPQUFPLEtBQUssTUFBTTtBQURTO0FBQUEsRUFFbkM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWNVLG1CQUtSLGdCQUNBLGdCQUNBLFVBQ0EsV0FBb0IsTUFDSDtBQUNqQixtQkFDRyxTQUFTLGVBQWUsUUFBUSxDQUFDLEVBQ2pDLFNBQVMsT0FBTyxhQUFhO0FBQzVCLHFCQUFlLFFBQVEsSUFBSTtBQUMzQixVQUFJLFVBQVU7QUFDWixjQUFNLEtBQUssT0FBTyxhQUFhLGNBQWM7QUFBQSxNQUMvQztBQUFBLElBQ0YsQ0FBQztBQUNILFdBQU87QUFBQSxFQUNUO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
82
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc1RhYkJhc2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9faW1wb3J0X21ldGFfdXJsID0gZ2xvYmFsVGhpc1tcImltcG9ydC5tZXRhLnVybFwiXSA/PyAoKCk9PnJlcXVpcmUoXCJub2RlOnVybFwiKS5wYXRoVG9GaWxlVVJMKF9fZmlsZW5hbWUpKSgpO1xuY29uc3QgX19wcm9jZXNzID0gZ2xvYmFsVGhpc1tcInByb2Nlc3NcIl0gPz8ge1xuICBcImN3ZFwiOiAoKT0+XCIvXCIsXG4gIFwiZW52XCI6IHt9LFxuICBcInBsYXRmb3JtXCI6IFwiYW5kcm9pZFwiXG59O1xuLyoqXG4gKiBAZmlsZSBUaGlzIG1vZHVsZSBkZWZpbmVzIGEgYmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgcGx1Z2luIHNldHRpbmcgdGFicyBpbiBPYnNpZGlhbi5cbiAqIEl0IHByb3ZpZGVzIGEgdXRpbGl0eSBtZXRob2QgdG8gYmluZCB2YWx1ZSBjb21wb25lbnRzIHRvIHBsdWdpbiBzZXR0aW5ncyBhbmQgaGFuZGxlIGNoYW5nZXMuXG4gKi9cblxuaW1wb3J0IHsgUGx1Z2luU2V0dGluZ1RhYiB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgUGx1Z2luQmFzZSB9IGZyb20gXCIuL1BsdWdpbkJhc2UudHNcIjtcbmltcG9ydCB0eXBlIHsgS2V5c01hdGNoaW5nIH0gZnJvbSBcIi4uLy4uL0B0eXBlcy50c1wiO1xuXG5pbnRlcmZhY2UgVmFsdWVDb21wb25lbnQ8VD4ge1xuICBzZXRWYWx1ZSh2YWx1ZTogVCk6IHRoaXM7XG4gIG9uQ2hhbmdlKGNhbGxiYWNrOiAobmV3VmFsdWU6IFQpID0+IFByb21pc2U8dm9pZD4pOiB0aGlzO1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5ncyB0YWJzIGluIE9ic2lkaWFuLlxuICogUHJvdmlkZXMgYSBtZXRob2QgZm9yIGJpbmRpbmcgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsaW5nIGNoYW5nZXMuXG4gKlxuICogQHRlbXBsYXRlIFRQbHVnaW4gLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHRoYXQgZXh0ZW5kcyBQbHVnaW5CYXNlLlxuICogQHRlbXBsYXRlIFBsdWdpblNldHRpbmdzIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyBvYmplY3QuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQbHVnaW5TZXR0aW5nc1RhYkJhc2U8XG4gIFRQbHVnaW4gZXh0ZW5kcyBQbHVnaW5CYXNlPFBsdWdpblNldHRpbmdzPixcbiAgUGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Rcbj4gZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUGx1Z2luU2V0dGluZ3NUYWJCYXNlLlxuICAgKlxuICAgKiBAcGFyYW0ge1RQbHVnaW59IHBsdWdpbiAtIFRoZSBwbHVnaW4gaW5zdGFuY2UgdG8gd2hpY2ggdGhpcyBzZXR0aW5ncyB0YWIgYmVsb25ncy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgb3ZlcnJpZGUgcGx1Z2luOiBUUGx1Z2luKSB7XG4gICAgc3VwZXIocGx1Z2luLmFwcCwgcGx1Z2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyBhIHZhbHVlIGNvbXBvbmVudCB0byBhIHByb3BlcnR5IGluIHRoZSBwbHVnaW4gc2V0dGluZ3Mgd2l0aCBvcHRpb25hbCBhdXRvbWF0aWMgc2F2aW5nIGFuZCB2YWx1ZSBjb252ZXJzaW9uLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQgZXh0ZW5kaW5nIGBWYWx1ZUNvbXBvbmVudGAuXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHkgLSBUaGUga2V5IG9mIHRoZSBwbHVnaW4gc2V0dGluZyB0aGF0IHRoZSBjb21wb25lbnQgaXMgYm91bmQgdG8uXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHlUeXBlIC0gVGhlIGluZmVycmVkIHR5cGUgb2YgdGhlIHByb3BlcnR5IGJhc2VkIG9uIHRoZSB2YWx1ZSBjb21wb25lbnQncyB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVDb21wb25lbnQgLSBUaGUgY29tcG9uZW50IHRoYXQgd2lsbCBkaXNwbGF5IGFuZCBpbnRlcmFjdCB3aXRoIHRoZSBzZXR0aW5nIHZhbHVlLlxuICAgKiBAcGFyYW0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IGluIGBQbHVnaW5TZXR0aW5nc2AgdG8gYmluZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAgICogQHBhcmFtIG9wdGlvbnMuYXV0b1NhdmUgLSBJZiB0cnVlLCBzYXZlcyB0aGUgcGx1Z2luIHNldHRpbmdzIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGNvbXBvbmVudCB2YWx1ZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgYFRWYWx1ZUNvbXBvbmVudGAgaW5zdGFuY2UgdGhhdCB3YXMgYm91bmQgdG8gdGhlIHByb3BlcnR5LlxuICAgKi9cbiAgcHJvdGVjdGVkIGJpbmRWYWx1ZUNvbXBvbmVudDxcbiAgICBUVmFsdWVDb21wb25lbnQgZXh0ZW5kcyBWYWx1ZUNvbXBvbmVudDx1bmtub3duPixcbiAgICBQcm9wZXJ0eSBleHRlbmRzIEtleXNNYXRjaGluZzxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZVR5cGU+LFxuICAgIFVJVmFsdWVUeXBlID0gVFZhbHVlQ29tcG9uZW50IGV4dGVuZHMgVmFsdWVDb21wb25lbnQ8aW5mZXIgUD4gPyBQIDogbmV2ZXIsXG4gID4oXG4gICAgdmFsdWVDb21wb25lbnQ6IFRWYWx1ZUNvbXBvbmVudCxcbiAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGF1dG9TYXZlPzogYm9vbGVhblxuICAgIH1cbiAgKTogVFZhbHVlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBCaW5kcyBhIHZhbHVlIGNvbXBvbmVudCB0byBhIHByb3BlcnR5IGluIHRoZSBwbHVnaW4gc2V0dGluZ3Mgd2l0aCBhdXRvbWF0aWMgc2F2aW5nIGFuZCBjdXN0b20gdmFsdWUgY29udmVyc2lvbi5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUVmFsdWVDb21wb25lbnQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgY29tcG9uZW50IGV4dGVuZGluZyBgVmFsdWVDb21wb25lbnRgLlxuICAgKiBAdHlwZVBhcmFtIFByb3BlcnR5IC0gVGhlIGtleSBvZiB0aGUgcGx1Z2luIHNldHRpbmcgdGhhdCB0aGUgY29tcG9uZW50IGlzIGJvdW5kIHRvLlxuICAgKiBAdHlwZVBhcmFtIFVJVmFsdWVUeXBlIC0gVGhlIGluZmVycmVkIHR5cGUgb2YgdGhlIFVJIHZhbHVlIGJhc2VkIG9uIHRoZSB2YWx1ZSBjb21wb25lbnQncyB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVDb21wb25lbnQgLSBUaGUgY29tcG9uZW50IHRoYXQgd2lsbCBkaXNwbGF5IGFuZCBpbnRlcmFjdCB3aXRoIHRoZSBzZXR0aW5nIHZhbHVlLlxuICAgKiBAcGFyYW0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IGluIGBQbHVnaW5TZXR0aW5nc2AgdG8gYmluZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAgICogQHBhcmFtIG9wdGlvbnMuYXV0b1NhdmUgLSBJZiB0cnVlLCBzYXZlcyB0aGUgcGx1Z2luIHNldHRpbmdzIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGNvbXBvbmVudCB2YWx1ZSBjaGFuZ2VzLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5zZXR0aW5nVG9VSVZhbHVlQ29udmVydGVyIC0gQSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIHRoZSBzZXR0aW5nIHZhbHVlIHRvIHRoZSB2YWx1ZSB1c2VkIGJ5IHRoZSBVSSBjb21wb25lbnQuXG4gICAqIEBwYXJhbSBvcHRpb25zLnVpVG9TZXR0aW5nVmFsdWVDb252ZXJ0ZXIgLSBBIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgdGhlIFVJIGNvbXBvbmVudCdzIHZhbHVlIGJhY2sgdG8gdGhlIHNldHRpbmcgdmFsdWUuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBgVFZhbHVlQ29tcG9uZW50YCBpbnN0YW5jZSB0aGF0IHdhcyBib3VuZCB0byB0aGUgcHJvcGVydHkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYmluZFZhbHVlQ29tcG9uZW50PFxuICAgIFRWYWx1ZUNvbXBvbmVudCBleHRlbmRzIFZhbHVlQ29tcG9uZW50PHVua25vd24+LFxuICAgIFByb3BlcnR5IGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3MsXG4gICAgVUlWYWx1ZVR5cGUgPSBUVmFsdWVDb21wb25lbnQgZXh0ZW5kcyBWYWx1ZUNvbXBvbmVudDxpbmZlciBQPiA/IFAgOiBuZXZlcixcbiAgPihcbiAgICB2YWx1ZUNvbXBvbmVudDogVFZhbHVlQ29tcG9uZW50LFxuICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICBvcHRpb25zOiB7XG4gICAgICBhdXRvU2F2ZT86IGJvb2xlYW4sXG4gICAgICBzZXR0aW5nVG9VSVZhbHVlQ29udmVydGVyOiAocHJvcGVydHlWYWx1ZTogUGx1Z2luU2V0dGluZ3NbUHJvcGVydHldKSA9PiBVSVZhbHVlVHlwZSxcbiAgICAgIHVpVG9TZXR0aW5nVmFsdWVDb252ZXJ0ZXI6ICh1aVZhbHVlOiBVSVZhbHVlVHlwZSkgPT4gUGx1Z2luU2V0dGluZ3NbUHJvcGVydHldXG4gICAgfVxuICApOiBUVmFsdWVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIGBiaW5kVmFsdWVDb21wb25lbnRgIHRoYXQgaGFuZGxlcyBib3RoIG92ZXJsb2Fkcy5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUVmFsdWVDb21wb25lbnQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgY29tcG9uZW50IGV4dGVuZGluZyBgVmFsdWVDb21wb25lbnRgLlxuICAgKiBAdHlwZVBhcmFtIFByb3BlcnR5IC0gVGhlIGtleSBvZiB0aGUgcGx1Z2luIHNldHRpbmcgdGhhdCB0aGUgY29tcG9uZW50IGlzIGJvdW5kIHRvLlxuICAgKiBAdHlwZVBhcmFtIFVJVmFsdWVUeXBlIC0gVGhlIGluZmVycmVkIHR5cGUgb2YgdGhlIFVJIHZhbHVlIGJhc2VkIG9uIHRoZSB2YWx1ZSBjb21wb25lbnQncyB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVDb21wb25lbnQgLSBUaGUgY29tcG9uZW50IHRoYXQgd2lsbCBkaXNwbGF5IGFuZCBpbnRlcmFjdCB3aXRoIHRoZSBzZXR0aW5nIHZhbHVlLlxuICAgKiBAcGFyYW0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkga2V5IGluIGBQbHVnaW5TZXR0aW5nc2AgdG8gYmluZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAgICogQHBhcmFtIG9wdGlvbnMuYXV0b1NhdmUgLSBJZiB0cnVlLCBzYXZlcyB0aGUgcGx1Z2luIHNldHRpbmdzIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGNvbXBvbmVudCB2YWx1ZSBjaGFuZ2VzLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5zZXR0aW5nVG9VSVZhbHVlQ29udmVydGVyIC0gQSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIHRoZSBzZXR0aW5nIHZhbHVlIHRvIHRoZSB2YWx1ZSB1c2VkIGJ5IHRoZSBVSSBjb21wb25lbnQuXG4gICAqIEBwYXJhbSBvcHRpb25zLnVpVG9TZXR0aW5nVmFsdWVDb252ZXJ0ZXIgLSBBIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgdGhlIFVJIGNvbXBvbmVudCdzIHZhbHVlIGJhY2sgdG8gdGhlIHNldHRpbmcgdmFsdWUuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBgVFZhbHVlQ29tcG9uZW50YCBpbnN0YW5jZSB0aGF0IHdhcyBib3VuZCB0byB0aGUgcHJvcGVydHkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYmluZFZhbHVlQ29tcG9uZW50PFxuICAgIFRWYWx1ZUNvbXBvbmVudCBleHRlbmRzIFZhbHVlQ29tcG9uZW50PHVua25vd24+LFxuICAgIFByb3BlcnR5IGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3MsXG4gICAgVUlWYWx1ZVR5cGUgPSBUVmFsdWVDb21wb25lbnQgZXh0ZW5kcyBWYWx1ZUNvbXBvbmVudDxpbmZlciBQPiA/IFAgOiBuZXZlcixcbiAgPihcbiAgICB2YWx1ZUNvbXBvbmVudDogVFZhbHVlQ29tcG9uZW50LFxuICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICB7XG4gICAgICBhdXRvU2F2ZSxcbiAgICAgIHNldHRpbmdUb1VJVmFsdWVDb252ZXJ0ZXIsXG4gICAgICB1aVRvU2V0dGluZ1ZhbHVlQ29udmVydGVyXG4gICAgfToge1xuICAgICAgYXV0b1NhdmU/OiBib29sZWFuLFxuICAgICAgc2V0dGluZ1RvVUlWYWx1ZUNvbnZlcnRlcjogKHByb3BlcnR5VmFsdWU6IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5XSkgPT4gVUlWYWx1ZVR5cGUsXG4gICAgICB1aVRvU2V0dGluZ1ZhbHVlQ29udmVydGVyOiAodWlWYWx1ZTogVUlWYWx1ZVR5cGUpID0+IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5XVxuICAgIH1cbiAgKTogVFZhbHVlQ29tcG9uZW50IHtcbiAgICBjb25zdCBwbHVnaW5TZXR0aW5ncyA9IHRoaXMucGx1Z2luLnNldHRpbmdzQ29weTtcbiAgICAodmFsdWVDb21wb25lbnQgYXMgVmFsdWVDb21wb25lbnQ8VUlWYWx1ZVR5cGU+KVxuICAgICAgLnNldFZhbHVlKHNldHRpbmdUb1VJVmFsdWVDb252ZXJ0ZXIocGx1Z2luU2V0dGluZ3NbcHJvcGVydHldKSlcbiAgICAgIC5vbkNoYW5nZShhc3luYyAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgcGx1Z2luU2V0dGluZ3NbcHJvcGVydHldID0gdWlUb1NldHRpbmdWYWx1ZUNvbnZlcnRlcihuZXdWYWx1ZSk7XG4gICAgICAgIGlmIChhdXRvU2F2ZSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncyhwbHVnaW5TZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZUNvbXBvbmVudDtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBV0Esc0JBQWlDO0FBQ2pDLHdCQUEyQjtBQVozQixNQUFNLG9CQUFvQixXQUFXLGlCQUFpQixNQUFNLE1BQUksUUFBUSxVQUFVLEVBQUUsY0FBYyxVQUFVLEdBQUc7QUFDL0csTUFBTSxZQUFZLFdBQVcsU0FBUyxLQUFLO0FBQUEsRUFDekMsT0FBTyxNQUFJO0FBQUEsRUFDWCxPQUFPLENBQUM7QUFBQSxFQUNSLFlBQVk7QUFDZDtBQXNCTyxNQUFlLDhCQUdaLGlDQUFpQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1sQixZQUE0QixRQUFpQjtBQUNsRCxVQUFNLE9BQU8sS0FBSyxNQUFNO0FBRFM7QUFBQSxFQUVuQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUEwRVUsbUJBS1IsZ0JBQ0EsVUFDQTtBQUFBLElBQ0U7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsR0FLaUI7QUFDakIsVUFBTSxpQkFBaUIsS0FBSyxPQUFPO0FBQ25DLElBQUMsZUFDRSxTQUFTLDBCQUEwQixlQUFlLFFBQVEsQ0FBQyxDQUFDLEVBQzVELFNBQVMsT0FBTyxhQUFhO0FBQzVCLHFCQUFlLFFBQVEsSUFBSSwwQkFBMEIsUUFBUTtBQUM3RCxVQUFJLFVBQVU7QUFDWixjQUFNLEtBQUssT0FBTyxhQUFhLGNBQWM7QUFBQSxNQUMvQztBQUFBLElBQ0YsQ0FBQztBQUNILFdBQU87QUFBQSxFQUNUO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -25,17 +25,42 @@ export declare abstract class PluginSettingsTabBase<TPlugin extends PluginBase<P
25
25
  */
26
26
  constructor(plugin: TPlugin);
27
27
  /**
28
- * Binds a value component to a specific property in the plugin settings.
29
- * Updates the plugin settings when the value component's value changes.
28
+ * Binds a value component to a property in the plugin settings with optional automatic saving and value conversion.
30
29
  *
31
- * @template TValueComponent - The type of the value component.
32
- * @template Property - The type of the property in the plugin settings that the value component is bound to.
33
- * @param {TValueComponent} valueComponent - The value component to bind.
34
- * @param {PluginSettings} pluginSettings - The plugin settings object.
35
- * @param {Property} property - The property in the plugin settings to bind the value component to.
36
- * @param {boolean} [autoSave=true] - Whether to automatically save settings when the value changes.
37
- * @returns {TValueComponent} The bound value component.
30
+ * @typeParam TValueComponent - The type of the value component extending `ValueComponent`.
31
+ * @typeParam Property - The key of the plugin setting that the component is bound to.
32
+ * @typeParam PropertyType - The inferred type of the property based on the value component's type.
33
+ *
34
+ * @param valueComponent - The component that will display and interact with the setting value.
35
+ * @param property - The property key in `PluginSettings` to bind to the component.
36
+ * @param options - Configuration options.
37
+ * @param options.autoSave - If true, saves the plugin settings automatically after the component value changes.
38
+ *
39
+ * @returns The `TValueComponent` instance that was bound to the property.
40
+ */
41
+ protected bindValueComponent<TValueComponent extends ValueComponent<unknown>, Property extends KeysMatching<PluginSettings, UIValueType>, UIValueType = TValueComponent extends ValueComponent<infer P> ? P : never>(valueComponent: TValueComponent, property: Property, options?: {
42
+ autoSave?: boolean;
43
+ }): TValueComponent;
44
+ /**
45
+ * Binds a value component to a property in the plugin settings with automatic saving and custom value conversion.
46
+ *
47
+ * @typeParam TValueComponent - The type of the value component extending `ValueComponent`.
48
+ * @typeParam Property - The key of the plugin setting that the component is bound to.
49
+ * @typeParam UIValueType - The inferred type of the UI value based on the value component's type.
50
+ *
51
+ * @param valueComponent - The component that will display and interact with the setting value.
52
+ * @param property - The property key in `PluginSettings` to bind to the component.
53
+ * @param options - Configuration options.
54
+ * @param options.autoSave - If true, saves the plugin settings automatically after the component value changes.
55
+ * @param options.settingToUIValueConverter - A function that converts the setting value to the value used by the UI component.
56
+ * @param options.uiToSettingValueConverter - A function that converts the UI component's value back to the setting value.
57
+ *
58
+ * @returns The `TValueComponent` instance that was bound to the property.
38
59
  */
39
- protected bindValueComponent<TValueComponent extends ValueComponent<unknown>, Property extends KeysMatching<PluginSettings, PropertyType>, PropertyType = TValueComponent extends ValueComponent<infer P> ? P : never>(valueComponent: TValueComponent, pluginSettings: PluginSettings, property: Property, autoSave?: boolean): TValueComponent;
60
+ protected bindValueComponent<TValueComponent extends ValueComponent<unknown>, Property extends keyof PluginSettings, UIValueType = TValueComponent extends ValueComponent<infer P> ? P : never>(valueComponent: TValueComponent, property: Property, options: {
61
+ autoSave?: boolean;
62
+ settingToUIValueConverter: (propertyValue: PluginSettings[Property]) => UIValueType;
63
+ uiToSettingValueConverter: (uiValue: UIValueType) => PluginSettings[Property];
64
+ }): TValueComponent;
40
65
  }
41
66
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-dev-utils",
3
- "version": "1.6.0",
3
+ "version": "1.7.1",
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",