obsidian-dev-utils 22.1.1-beta.2 → 22.1.1-beta.20
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 +102 -0
- package/dist/dprint.json +1 -0
- package/dist/lib/cjs/Library.cjs +1 -1
- package/dist/lib/cjs/Object.cjs +38 -3
- package/dist/lib/cjs/Object.d.cts +16 -6
- package/dist/lib/cjs/ScriptUtils/CliUtils.cjs +1 -2
- package/dist/lib/cjs/ScriptUtils/CliUtils.d.cts +3 -2
- package/dist/lib/cjs/ScriptUtils/cli.cjs +1 -1
- package/dist/lib/cjs/String.cjs +1 -1
- package/dist/lib/cjs/String.d.cts +2 -1
- package/dist/lib/cjs/Transformers/Transformer.cjs +9 -2
- package/dist/lib/cjs/Type.cjs +24 -0
- package/dist/lib/cjs/Type.d.cts +12 -0
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/Callout.cjs +1 -1
- package/dist/lib/cjs/obsidian/Callout.d.cts +2 -1
- package/dist/lib/cjs/obsidian/Components/MultipleTextComponent.cjs +29 -2
- package/dist/lib/cjs/obsidian/Components/MultipleTextComponent.d.cts +20 -1
- package/dist/lib/cjs/obsidian/Components/TextBasedComponent.cjs +60 -0
- package/dist/lib/cjs/obsidian/Components/TextBasedComponent.d.cts +30 -0
- package/dist/lib/cjs/obsidian/Components/TypedTextComponent.cjs +27 -3
- package/dist/lib/cjs/obsidian/Components/TypedTextComponent.d.cts +19 -1
- package/dist/lib/cjs/obsidian/Components/index.cjs +4 -1
- package/dist/lib/cjs/obsidian/Components/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/FileManager.cjs +1 -1
- package/dist/lib/cjs/obsidian/FileManager.d.cts +2 -1
- package/dist/lib/cjs/obsidian/Link.cjs +1 -1
- package/dist/lib/cjs/obsidian/Link.d.cts +4 -3
- package/dist/lib/cjs/obsidian/Markdown.cjs +5 -8
- package/dist/lib/cjs/obsidian/Modals/Prompt.cjs +1 -1
- package/dist/lib/cjs/obsidian/Modals/Prompt.d.cts +2 -1
- package/dist/lib/cjs/obsidian/MonkeyAround.cjs +1 -1
- package/dist/lib/cjs/obsidian/MonkeyAround.d.cts +2 -2
- package/dist/lib/cjs/obsidian/Plugin/PluginBase.cjs +31 -2
- package/dist/lib/cjs/obsidian/Plugin/PluginBase.d.cts +15 -3
- package/dist/lib/cjs/obsidian/Plugin/PluginSettingsManagerBase.cjs +186 -62
- package/dist/lib/cjs/obsidian/Plugin/PluginSettingsManagerBase.d.cts +42 -21
- package/dist/lib/cjs/obsidian/Plugin/PluginSettingsTabBase.cjs +33 -20
- package/dist/lib/cjs/obsidian/Plugin/PluginSettingsTabBase.d.cts +20 -17
- package/dist/lib/cjs/obsidian/RenameDeleteHandler.cjs +75 -75
- package/dist/lib/cjs/obsidian/ValidationMessage.cjs +38 -0
- package/dist/lib/cjs/obsidian/ValidationMessage.d.cts +16 -0
- package/dist/lib/cjs/obsidian/index.cjs +4 -1
- package/dist/lib/cjs/obsidian/index.d.cts +1 -0
- package/dist/lib/esm/Library.mjs +1 -1
- package/dist/lib/esm/Object.d.mts +16 -6
- package/dist/lib/esm/Object.mjs +36 -3
- package/dist/lib/esm/ScriptUtils/CliUtils.d.mts +3 -2
- package/dist/lib/esm/ScriptUtils/CliUtils.mjs +1 -2
- package/dist/lib/esm/ScriptUtils/cli.mjs +1 -1
- package/dist/lib/esm/String.d.mts +2 -1
- package/dist/lib/esm/String.mjs +1 -1
- package/dist/lib/esm/Transformers/Transformer.mjs +9 -2
- package/dist/lib/esm/Type.d.mts +12 -0
- package/dist/lib/esm/Type.mjs +8 -0
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/obsidian/Callout.d.mts +2 -1
- package/dist/lib/esm/obsidian/Callout.mjs +1 -1
- package/dist/lib/esm/obsidian/Components/MultipleTextComponent.d.mts +20 -1
- package/dist/lib/esm/obsidian/Components/MultipleTextComponent.mjs +29 -2
- package/dist/lib/esm/obsidian/Components/TextBasedComponent.d.mts +30 -0
- package/dist/lib/esm/obsidian/Components/TextBasedComponent.mjs +36 -0
- package/dist/lib/esm/obsidian/Components/TypedTextComponent.d.mts +19 -1
- package/dist/lib/esm/obsidian/Components/TypedTextComponent.mjs +27 -3
- package/dist/lib/esm/obsidian/Components/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/Components/index.mjs +3 -1
- package/dist/lib/esm/obsidian/FileManager.d.mts +2 -1
- package/dist/lib/esm/obsidian/FileManager.mjs +1 -1
- package/dist/lib/esm/obsidian/Link.d.mts +4 -3
- package/dist/lib/esm/obsidian/Link.mjs +1 -1
- package/dist/lib/esm/obsidian/Markdown.mjs +5 -8
- package/dist/lib/esm/obsidian/Modals/Prompt.d.mts +2 -1
- package/dist/lib/esm/obsidian/Modals/Prompt.mjs +1 -1
- package/dist/lib/esm/obsidian/MonkeyAround.d.mts +2 -2
- package/dist/lib/esm/obsidian/MonkeyAround.mjs +1 -1
- package/dist/lib/esm/obsidian/Plugin/PluginBase.d.mts +15 -3
- package/dist/lib/esm/obsidian/Plugin/PluginBase.mjs +35 -3
- package/dist/lib/esm/obsidian/Plugin/PluginSettingsManagerBase.d.mts +42 -21
- package/dist/lib/esm/obsidian/Plugin/PluginSettingsManagerBase.mjs +186 -63
- package/dist/lib/esm/obsidian/Plugin/PluginSettingsTabBase.d.mts +20 -17
- package/dist/lib/esm/obsidian/Plugin/PluginSettingsTabBase.mjs +36 -20
- package/dist/lib/esm/obsidian/RenameDeleteHandler.mjs +75 -75
- package/dist/lib/esm/obsidian/ValidationMessage.d.mts +16 -0
- package/dist/lib/esm/obsidian/ValidationMessage.mjs +14 -0
- package/dist/lib/esm/obsidian/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/index.mjs +3 -1
- package/obsidian/Components/TextBasedComponent/package.json +6 -0
- package/obsidian/ValidationMessage/package.json +6 -0
- package/package.json +4 -4
@@ -1,30 +1,24 @@
|
|
1
|
-
import type {
|
2
|
-
import {
|
3
|
-
import type { StringKeys } from '../../Object.mjs';
|
1
|
+
import type { App } from 'obsidian';
|
2
|
+
import type { Promisable, ReadonlyDeep } from 'type-fest';
|
4
3
|
import type { Transformer } from '../../Transformers/Transformer.mjs';
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
readonly defaultValue: PluginSettings[Property];
|
9
|
-
validationMessage: string;
|
10
|
-
private value;
|
11
|
-
constructor(manager: PluginSettingsManagerBase<PluginSettings>, property: Property, defaultValue: PluginSettings[Property]);
|
12
|
-
clear(): void;
|
13
|
-
get(): PluginSettings[Property];
|
14
|
-
getSafe(): PluginSettings[Property];
|
15
|
-
set(value: PluginSettings[Property] | undefined): Promise<void>;
|
16
|
-
}
|
4
|
+
import type { MaybeReturn, StringKeys } from '../../Type.mjs';
|
5
|
+
import type { PluginBase } from './PluginBase.mjs';
|
6
|
+
type Validator<T> = (value: T) => Promisable<MaybeReturn<string>>;
|
17
7
|
/**
|
18
8
|
* Base class for managing plugin settings.
|
19
9
|
*
|
20
10
|
* @typeParam PluginSettings - The type representing the plugin settings object.
|
21
11
|
*/
|
22
12
|
export declare abstract class PluginSettingsManagerBase<PluginSettings extends object> {
|
23
|
-
|
13
|
+
readonly plugin: PluginBase<PluginSettings>;
|
14
|
+
readonly app: App;
|
24
15
|
readonly safeSettings: ReadonlyDeep<PluginSettings>;
|
16
|
+
private defaultSettings;
|
25
17
|
private properties;
|
26
|
-
|
27
|
-
|
18
|
+
private validators;
|
19
|
+
constructor(plugin: PluginBase<PluginSettings>);
|
20
|
+
editAndSave(editor: (settings: PluginSettings) => Promisable<void>): Promise<void>;
|
21
|
+
getProperty<PropertyName extends StringKeys<PluginSettings>>(propertyName: PropertyName): PluginSettingsProperty<PluginSettings[PropertyName]>;
|
28
22
|
loadFromFile(): Promise<void>;
|
29
23
|
/**
|
30
24
|
* Saves the new plugin settings.
|
@@ -32,10 +26,37 @@ export declare abstract class PluginSettingsManagerBase<PluginSettings extends o
|
|
32
26
|
* @returns A promise that resolves when the settings are saved.
|
33
27
|
*/
|
34
28
|
saveToFile(): Promise<void>;
|
35
|
-
|
29
|
+
protected addValidator<PropertyName extends StringKeys<PluginSettings>>(propertyName: PropertyName, validator: Validator<PluginSettings[PropertyName]>): void;
|
30
|
+
protected addValidators(): void;
|
36
31
|
protected abstract createDefaultSettings(): PluginSettings;
|
37
32
|
protected getTransformer(): Transformer;
|
38
|
-
protected
|
39
|
-
|
33
|
+
protected onLoadRecord(_record: Record<string, unknown>): Promisable<void>;
|
34
|
+
protected onSavingRecord(_record: Record<string, unknown>): Promisable<void>;
|
35
|
+
private getSavedSettings;
|
36
|
+
private prepareRecordToSave;
|
37
|
+
}
|
38
|
+
/**
|
39
|
+
* A property of a plugin settings.
|
40
|
+
*
|
41
|
+
* @typeParam T - The type of the property.
|
42
|
+
*/
|
43
|
+
export declare class PluginSettingsProperty<T> {
|
44
|
+
private readonly propertyName;
|
45
|
+
readonly defaultValue: T;
|
46
|
+
private readonly validator;
|
47
|
+
get currentValue(): T;
|
48
|
+
get lastSavedValue(): T;
|
49
|
+
get safeValue(): T;
|
50
|
+
get validationMessage(): string;
|
51
|
+
private _currentValue;
|
52
|
+
private _lastSavedValue;
|
53
|
+
private _validationMessage;
|
54
|
+
constructor(propertyName: string, defaultValue: T, validator: Validator<T>);
|
55
|
+
reset(): void;
|
56
|
+
save(): boolean;
|
57
|
+
setValidationMessage(validationMessage: string): void;
|
58
|
+
setValue(value: T): void;
|
59
|
+
setValueAndValidate(value: T): Promise<void>;
|
60
|
+
private showWarning;
|
40
61
|
}
|
41
62
|
export {};
|
@@ -5,8 +5,9 @@ if you want to view the source, please visit the github repository of this plugi
|
|
5
5
|
|
6
6
|
(function initEsm(){if(globalThis.process){return}const browserProcess={browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"};globalThis.process=browserProcess})();
|
7
7
|
|
8
|
-
import {
|
9
|
-
import {
|
8
|
+
import { Notice } from "obsidian";
|
9
|
+
import { noop } from "../../Function.mjs";
|
10
|
+
import { getAllKeys } from "../../Object.mjs";
|
10
11
|
import { DateTransformer } from "../../Transformers/DateTransformer.mjs";
|
11
12
|
import { DurationTransformer } from "../../Transformers/DurationTransformer.mjs";
|
12
13
|
import { GroupTransformer } from "../../Transformers/GroupTransformer.mjs";
|
@@ -16,68 +17,94 @@ const defaultTransformer = new GroupTransformer([
|
|
16
17
|
new DateTransformer(),
|
17
18
|
new DurationTransformer()
|
18
19
|
]);
|
19
|
-
class
|
20
|
-
constructor(
|
21
|
-
this.
|
22
|
-
this.property = property;
|
23
|
-
this.defaultValue = defaultValue;
|
24
|
-
}
|
25
|
-
validationMessage = "";
|
26
|
-
value;
|
27
|
-
clear() {
|
28
|
-
this.value = void 0;
|
29
|
-
this.validationMessage = "";
|
20
|
+
class ProxyHandlerBase {
|
21
|
+
constructor(properties) {
|
22
|
+
this.properties = properties;
|
30
23
|
}
|
31
|
-
get() {
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
24
|
+
get(target, prop) {
|
25
|
+
const record = target;
|
26
|
+
if (typeof prop !== "string") {
|
27
|
+
return record[prop];
|
28
|
+
}
|
29
|
+
const property = this.properties.get(prop);
|
30
|
+
if (!property) {
|
31
|
+
return record[prop];
|
32
|
+
}
|
33
|
+
return this.getPropertyValue(property);
|
36
34
|
}
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
35
|
+
}
|
36
|
+
class EditableSettingsProxyHandler extends ProxyHandlerBase {
|
37
|
+
validationPromise = Promise.resolve();
|
38
|
+
set(target, prop, value) {
|
39
|
+
const record = target;
|
40
|
+
if (typeof prop !== "string") {
|
41
|
+
record[prop] = value;
|
42
|
+
return true;
|
43
|
+
}
|
44
|
+
const property = this.properties.get(prop);
|
45
|
+
if (!property) {
|
46
|
+
record[prop] = value;
|
47
|
+
return true;
|
41
48
|
}
|
49
|
+
property.setValue(value);
|
50
|
+
this.validationPromise = this.validationPromise.then(() => property.setValueAndValidate(value));
|
51
|
+
return true;
|
52
|
+
}
|
53
|
+
getPropertyValue(property) {
|
54
|
+
return property.currentValue;
|
42
55
|
}
|
43
56
|
}
|
44
57
|
class PropertiesMap extends Map {
|
45
|
-
getTyped(
|
46
|
-
const property = super.get(
|
58
|
+
getTyped(propertyName) {
|
59
|
+
const property = super.get(propertyName);
|
47
60
|
if (!property) {
|
48
|
-
throw new Error(`Property ${String(
|
61
|
+
throw new Error(`Property ${String(propertyName)} not found`);
|
49
62
|
}
|
50
63
|
return property;
|
51
64
|
}
|
52
|
-
setTyped(
|
53
|
-
return super.set(
|
65
|
+
setTyped(propertyName, value) {
|
66
|
+
return super.set(propertyName, value);
|
67
|
+
}
|
68
|
+
}
|
69
|
+
class SafeSettingsProxyHandler extends ProxyHandlerBase {
|
70
|
+
getPropertyValue(property) {
|
71
|
+
return property.safeValue;
|
54
72
|
}
|
55
73
|
}
|
56
74
|
class PluginSettingsManagerBase {
|
57
75
|
constructor(plugin) {
|
58
76
|
this.plugin = plugin;
|
59
|
-
|
77
|
+
this.app = plugin.app;
|
78
|
+
this.defaultSettings = this.createDefaultSettings();
|
79
|
+
this.addValidators();
|
60
80
|
this.properties = new PropertiesMap();
|
61
|
-
for (const
|
62
|
-
this.properties.set(
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
return this.properties.get(prop);
|
70
|
-
}
|
71
|
-
});
|
81
|
+
for (const propertyName of getAllKeys(this.defaultSettings)) {
|
82
|
+
this.properties.set(
|
83
|
+
propertyName,
|
84
|
+
new PluginSettingsProperty(propertyName, this.defaultSettings[propertyName], this.validators.get(propertyName) ?? noop)
|
85
|
+
);
|
86
|
+
}
|
87
|
+
this.validators.clear();
|
88
|
+
this.safeSettings = new Proxy(this.defaultSettings, new SafeSettingsProxyHandler(this.properties));
|
72
89
|
}
|
90
|
+
app;
|
73
91
|
safeSettings;
|
92
|
+
defaultSettings;
|
74
93
|
properties;
|
75
|
-
|
76
|
-
|
94
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
95
|
+
validators = /* @__PURE__ */ new Map();
|
96
|
+
async editAndSave(editor) {
|
97
|
+
const editableSettings = new Proxy(this.defaultSettings, new EditableSettingsProxyHandler(this.properties));
|
98
|
+
await editor(editableSettings);
|
99
|
+
await editableSettings.validationPromise;
|
100
|
+
await this.saveToFile();
|
101
|
+
}
|
102
|
+
getProperty(propertyName) {
|
103
|
+
return this.properties.getTyped(propertyName);
|
77
104
|
}
|
78
105
|
async loadFromFile() {
|
79
106
|
for (const property of this.properties.values()) {
|
80
|
-
property.
|
107
|
+
property.reset();
|
81
108
|
}
|
82
109
|
const data = await this.plugin.loadData();
|
83
110
|
if (data === void 0 || data === null) {
|
@@ -89,19 +116,28 @@ class PluginSettingsManagerBase {
|
|
89
116
|
return;
|
90
117
|
}
|
91
118
|
let record = data;
|
119
|
+
const originalJson = JSON.stringify(record);
|
92
120
|
record = this.getTransformer().transformObjectRecursively(record);
|
93
|
-
await this.
|
94
|
-
for (const [
|
95
|
-
const
|
96
|
-
if (!
|
97
|
-
console.warn(`Unknown property: ${
|
121
|
+
await this.onLoadRecord(record);
|
122
|
+
for (const [propertyName, value] of Object.entries(record)) {
|
123
|
+
const property = this.properties.get(propertyName);
|
124
|
+
if (!property) {
|
125
|
+
console.warn(`Unknown property: ${propertyName}`);
|
98
126
|
continue;
|
99
127
|
}
|
100
|
-
if (typeof value !== typeof
|
101
|
-
console.warn(
|
128
|
+
if (typeof value !== typeof property.defaultValue) {
|
129
|
+
console.warn("Invalid value type", {
|
130
|
+
propertyName,
|
131
|
+
propertyType: typeof property.defaultValue,
|
132
|
+
value
|
133
|
+
});
|
102
134
|
continue;
|
103
135
|
}
|
104
|
-
await
|
136
|
+
await property.setValueAndValidate(value);
|
137
|
+
}
|
138
|
+
const newJson = JSON.stringify(await this.prepareRecordToSave());
|
139
|
+
if (newJson !== originalJson) {
|
140
|
+
await this.saveToFile();
|
105
141
|
}
|
106
142
|
}
|
107
143
|
/**
|
@@ -110,28 +146,115 @@ class PluginSettingsManagerBase {
|
|
110
146
|
* @returns A promise that resolves when the settings are saved.
|
111
147
|
*/
|
112
148
|
async saveToFile() {
|
113
|
-
const
|
114
|
-
|
149
|
+
const oldSettings = this.getSavedSettings();
|
150
|
+
let hasChanges = false;
|
151
|
+
for (const property of this.properties.values()) {
|
152
|
+
hasChanges ||= property.save();
|
153
|
+
}
|
154
|
+
if (!hasChanges) {
|
155
|
+
return;
|
156
|
+
}
|
157
|
+
await this.plugin.saveData(await this.prepareRecordToSave());
|
158
|
+
await this.plugin.onSaveSettings(this.getSavedSettings(), oldSettings);
|
159
|
+
}
|
160
|
+
addValidator(propertyName, validator) {
|
161
|
+
this.validators.set(propertyName, validator);
|
115
162
|
}
|
116
|
-
|
117
|
-
|
118
|
-
await noopAsync();
|
163
|
+
addValidators() {
|
164
|
+
noop();
|
119
165
|
}
|
120
166
|
getTransformer() {
|
121
167
|
return defaultTransformer;
|
122
168
|
}
|
123
|
-
|
124
|
-
|
169
|
+
onLoadRecord(_record) {
|
170
|
+
noop();
|
125
171
|
}
|
126
|
-
|
172
|
+
onSavingRecord(_record) {
|
173
|
+
noop();
|
174
|
+
}
|
175
|
+
getSavedSettings() {
|
176
|
+
const savedSettings = {};
|
177
|
+
for (const [propertyName, property] of this.properties.entries()) {
|
178
|
+
savedSettings[propertyName] = property.lastSavedValue;
|
179
|
+
}
|
180
|
+
const proto = Object.getPrototypeOf(this.defaultSettings);
|
181
|
+
Object.setPrototypeOf(savedSettings, proto);
|
182
|
+
return savedSettings;
|
183
|
+
}
|
184
|
+
async prepareRecordToSave() {
|
127
185
|
const settings = {};
|
128
|
-
for (const [
|
129
|
-
settings[
|
186
|
+
for (const [propertyName, property] of this.properties.entries()) {
|
187
|
+
settings[propertyName] = property.currentValue;
|
130
188
|
}
|
131
|
-
|
189
|
+
await this.onSavingRecord(settings);
|
190
|
+
return this.getTransformer().transformObjectRecursively(settings);
|
191
|
+
}
|
192
|
+
}
|
193
|
+
class PluginSettingsProperty {
|
194
|
+
constructor(propertyName, defaultValue, validator) {
|
195
|
+
this.propertyName = propertyName;
|
196
|
+
this.defaultValue = defaultValue;
|
197
|
+
this.validator = validator;
|
198
|
+
this._lastSavedValue = defaultValue;
|
199
|
+
this._currentValue = defaultValue;
|
200
|
+
}
|
201
|
+
get currentValue() {
|
202
|
+
return this._currentValue;
|
203
|
+
}
|
204
|
+
get lastSavedValue() {
|
205
|
+
return this._lastSavedValue;
|
206
|
+
}
|
207
|
+
get safeValue() {
|
208
|
+
return this._validationMessage ? this.defaultValue : this._currentValue;
|
209
|
+
}
|
210
|
+
get validationMessage() {
|
211
|
+
return this._validationMessage;
|
212
|
+
}
|
213
|
+
_currentValue;
|
214
|
+
_lastSavedValue;
|
215
|
+
_validationMessage = "";
|
216
|
+
reset() {
|
217
|
+
this._currentValue = this.defaultValue;
|
218
|
+
this._validationMessage = "";
|
219
|
+
}
|
220
|
+
save() {
|
221
|
+
if (this._lastSavedValue === this._currentValue) {
|
222
|
+
return false;
|
223
|
+
}
|
224
|
+
this._lastSavedValue = this._currentValue;
|
225
|
+
return true;
|
226
|
+
}
|
227
|
+
setValidationMessage(validationMessage) {
|
228
|
+
this._validationMessage = validationMessage;
|
229
|
+
this.showWarning();
|
230
|
+
}
|
231
|
+
setValue(value) {
|
232
|
+
this._currentValue = value;
|
233
|
+
}
|
234
|
+
async setValueAndValidate(value) {
|
235
|
+
this.setValue(value);
|
236
|
+
if (this._currentValue === void 0) {
|
237
|
+
return;
|
238
|
+
}
|
239
|
+
this._validationMessage = await this.validator(this._currentValue) ?? "";
|
240
|
+
this.showWarning(value);
|
241
|
+
}
|
242
|
+
showWarning(value) {
|
243
|
+
if (!this._validationMessage) {
|
244
|
+
return;
|
245
|
+
}
|
246
|
+
const warningMessage = `Could not set plugin setting: ${this.propertyName}. Using default value instead.`;
|
247
|
+
new Notice(warningMessage);
|
248
|
+
console.warn(warningMessage, {
|
249
|
+
defaultValue: this.defaultValue,
|
250
|
+
propertyName: this.propertyName,
|
251
|
+
validationMessage: this._validationMessage,
|
252
|
+
value
|
253
|
+
});
|
132
254
|
}
|
133
255
|
}
|
134
256
|
export {
|
135
|
-
PluginSettingsManagerBase
|
257
|
+
PluginSettingsManagerBase,
|
258
|
+
PluginSettingsProperty
|
136
259
|
};
|
137
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc01hbmFnZXJCYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IFJlYWRvbmx5RGVlcCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBTdHJpbmdLZXlzIH0gZnJvbSAnLi4vLi4vT2JqZWN0LnRzJztcbmltcG9ydCB0eXBlIHsgVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi9UcmFuc2Zvcm1lcnMvVHJhbnNmb3JtZXIudHMnO1xuXG5pbXBvcnQgeyBub29wQXN5bmMgfSBmcm9tICcuLi8uLi9GdW5jdGlvbi50cyc7XG5pbXBvcnQgeyBEYXRlVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi9UcmFuc2Zvcm1lcnMvRGF0ZVRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IER1cmF0aW9uVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi9UcmFuc2Zvcm1lcnMvRHVyYXRpb25UcmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBHcm91cFRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL0dyb3VwVHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgU2tpcFByaXZhdGVQcm9wZXJ0eVRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL1NraXBQcml2YXRlUHJvcGVydHlUcmFuc2Zvcm1lci50cyc7XG5cbmNvbnN0IGRlZmF1bHRUcmFuc2Zvcm1lciA9IG5ldyBHcm91cFRyYW5zZm9ybWVyKFtcbiAgbmV3IFNraXBQcml2YXRlUHJvcGVydHlUcmFuc2Zvcm1lcigpLFxuICBuZXcgRGF0ZVRyYW5zZm9ybWVyKCksXG4gIG5ldyBEdXJhdGlvblRyYW5zZm9ybWVyKClcbl0pO1xuXG5jbGFzcyBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0LCBQcm9wZXJ0eSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+PiB7XG4gIHB1YmxpYyB2YWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuICBwcml2YXRlIHZhbHVlOiBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eV0gfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWFuYWdlcjogUGx1Z2luU2V0dGluZ3NNYW5hZ2VyQmFzZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZTogUGx1Z2luU2V0dGluZ3NbUHJvcGVydHldXG4gICkge31cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG4gIH1cblxuICBwdWJsaWMgZ2V0KCk6IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5XSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWUgPz8gdGhpcy5kZWZhdWx0VmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2FmZSgpOiBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eV0ge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID8gdGhpcy5kZWZhdWx0VmFsdWUgOiB0aGlzLmdldCgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNldCh2YWx1ZTogUGx1Z2luU2V0dGluZ3NbUHJvcGVydHldIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2UgPSAoYXdhaXQgdGhpcy5tYW5hZ2VyLnZhbGlkYXRlKHRoaXMucHJvcGVydHksIHRoaXMudmFsdWUpIGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gJyc7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFByb3BlcnRpZXNNYXA8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgTWFwPHN0cmluZywgUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxQbHVnaW5TZXR0aW5ncywgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+PiB7XG4gIHB1YmxpYyBnZXRUeXBlZDxQcm9wZXJ0eSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+PihrZXk6IFByb3BlcnR5KTogUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxQbHVnaW5TZXR0aW5ncywgUHJvcGVydHk+IHtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IHN1cGVyLmdldChrZXkpO1xuICAgIGlmICghcHJvcGVydHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgJHtTdHJpbmcoa2V5KX0gbm90IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BlcnR5IGFzIFBsdWdpblNldHRpbmdzUHJvcGVydHk8UGx1Z2luU2V0dGluZ3MsIFByb3BlcnR5PjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRUeXBlZDxQcm9wZXJ0eSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+PihrZXk6IFByb3BlcnR5LCB2YWx1ZTogUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxQbHVnaW5TZXR0aW5ncywgUHJvcGVydHk+KTogdGhpcyB7XG4gICAgcmV0dXJuIHN1cGVyLnNldChrZXksIHZhbHVlKTtcbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIG1hbmFnaW5nIHBsdWdpbiBzZXR0aW5ncy5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHR5cGUgcmVwcmVzZW50aW5nIHRoZSBwbHVnaW4gc2V0dGluZ3Mgb2JqZWN0LlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUGx1Z2luU2V0dGluZ3NNYW5hZ2VyQmFzZTxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4ge1xuICBwdWJsaWMgcmVhZG9ubHkgc2FmZVNldHRpbmdzOiBSZWFkb25seURlZXA8UGx1Z2luU2V0dGluZ3M+O1xuXG4gIHByaXZhdGUgcHJvcGVydGllczogUHJvcGVydGllc01hcDxQbHVnaW5TZXR0aW5ncz47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcGx1Z2luOiBQbHVnaW4pIHtcbiAgICBjb25zdCBkZWZhdWx0U2V0dGluZ3MgPSB0aGlzLmNyZWF0ZURlZmF1bHRTZXR0aW5ncygpO1xuICAgIHRoaXMucHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzTWFwPFBsdWdpblNldHRpbmdzPigpO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZGVmYXVsdFNldHRpbmdzKSBhcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPltdKSB7XG4gICAgICB0aGlzLnByb3BlcnRpZXMuc2V0KGtleSwgbmV3IFBsdWdpblNldHRpbmdzUHJvcGVydHkodGhpcywga2V5LCBkZWZhdWx0U2V0dGluZ3Nba2V5XSkpO1xuICAgIH1cblxuICAgIHRoaXMuc2FmZVNldHRpbmdzID0gbmV3IFByb3h5KGRlZmF1bHRTZXR0aW5ncywge1xuICAgICAgZ2V0OiAoX3RhcmdldCwgcHJvcCk6IHVua25vd24gPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuZ2V0KHByb3ApO1xuICAgICAgfVxuICAgIH0pIGFzIFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5ncz47XG4gIH1cblxuICBwdWJsaWMgZ2V0UHJvcGVydHk8UHJvcGVydHkgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPj4ocHJvcGVydHk6IFByb3BlcnR5KTogUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxQbHVnaW5TZXR0aW5ncywgUHJvcGVydHk+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmdldFR5cGVkKHByb3BlcnR5KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2FkRnJvbUZpbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiB0aGlzLnByb3BlcnRpZXMudmFsdWVzKCkpIHtcbiAgICAgIHByb3BlcnR5LmNsZWFyKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMucGx1Z2luLmxvYWREYXRhKCkgYXMgdW5rbm93bjtcblxuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQgfHwgZGF0YSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgY29uc3QgdHlwZSA9IEFycmF5LmlzQXJyYXkoZGF0YSkgPyAnQXJyYXknIDogdHlwZW9mIGRhdGE7XG4gICAgICBjb25zb2xlLmVycm9yKGBJbnZhbGlkIGRhdGEgdHlwZS4gRXhwZWN0ZWQgT2JqZWN0LCBnb3Q6ICR7dHlwZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmVjb3JkID0gZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICByZWNvcmQgPSB0aGlzLmdldFRyYW5zZm9ybWVyKCkudHJhbnNmb3JtT2JqZWN0UmVjdXJzaXZlbHkocmVjb3JkKTtcbiAgICBhd2FpdCB0aGlzLnByZXBhcmVSZWNvcmQocmVjb3JkKTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCkpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5T2JqID0gdGhpcy5wcm9wZXJ0aWVzLmdldChrZXkpO1xuICAgICAgaWYgKCFwcm9wZXJ0eU9iaikge1xuICAgICAgICBjb25zb2xlLndhcm4oYFVua25vd24gcHJvcGVydHk6ICR7a2V5fWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gdHlwZW9mIHByb3BlcnR5T2JqLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYEludmFsaWQgdmFsdWUgdHlwZS4gRXhwZWN0ZWQgJHt0eXBlb2YgcHJvcGVydHlPYmouZGVmYXVsdFZhbHVlfSwgZ290OiAke3R5cGVvZiB2YWx1ZX1gKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHByb3BlcnR5T2JqLnNldCh2YWx1ZSBhcyBQbHVnaW5TZXR0aW5nc1tTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPl0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB0aGUgbmV3IHBsdWdpbiBzZXR0aW5ncy5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIHNhdmVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNhdmVUb0ZpbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybU9iamVjdFJlY3Vyc2l2ZWx5KHRoaXMuZ2V0U2V0dGluZ3MoKSk7XG4gICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEocmVjb3JkKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW52YWxpZC12b2lkLXR5cGVcbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlPFByb3BlcnR5IGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+KF9wcm9wZXJ0eTogUHJvcGVydHksIF92YWx1ZTogUGx1Z2luU2V0dGluZ3NbUHJvcGVydHldKTogUHJvbWlzZTxzdHJpbmcgfCB2b2lkPiB7XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY3JlYXRlRGVmYXVsdFNldHRpbmdzKCk6IFBsdWdpblNldHRpbmdzO1xuXG4gIHByb3RlY3RlZCBnZXRUcmFuc2Zvcm1lcigpOiBUcmFuc2Zvcm1lciB7XG4gICAgcmV0dXJuIGRlZmF1bHRUcmFuc2Zvcm1lcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBwcmVwYXJlUmVjb3JkKF9yZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gIH1cblxuICBwcml2YXRlIGdldFNldHRpbmdzKCk6IFJlY29yZDxTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPiwgdW5rbm93bj4ge1xuICAgIGNvbnN0IHNldHRpbmdzOiBSZWNvcmQ8U3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4sIHVua25vd24+ID0ge30gYXMgUmVjb3JkPFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+LCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHByb3BlcnR5XSBvZiB0aGlzLnByb3BlcnRpZXMuZW50cmllcygpKSB7XG4gICAgICBzZXR0aW5nc1trZXkgYXMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5dID0gcHJvcGVydHkuZ2V0KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNldHRpbmdzO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBRUEsU0FBUyxjQUFjO0FBS3ZCLFNBQVMsaUJBQWlCO0FBQzFCLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsc0NBQXNDO0FBRS9DLE1BQU0scUJBQXFCLElBQUksaUJBQWlCO0FBQUEsRUFDOUMsSUFBSSwrQkFBK0I7QUFBQSxFQUNuQyxJQUFJLGdCQUFn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
|
260
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc01hbmFnZXJCYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHtcbiAgUHJvbWlzYWJsZSxcbiAgUmVhZG9ubHlEZWVwXG59IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IE5vdGljZSB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL1RyYW5zZm9ybWVycy9UcmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIE1heWJlUmV0dXJuLFxuICBTdHJpbmdLZXlzXG59IGZyb20gJy4uLy4uL1R5cGUudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5CYXNlIH0gZnJvbSAnLi9QbHVnaW5CYXNlLnRzJztcblxuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4uLy4uL0Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IGdldEFsbEtleXMgfSBmcm9tICcuLi8uLi9PYmplY3QudHMnO1xuaW1wb3J0IHsgRGF0ZVRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL0RhdGVUcmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBEdXJhdGlvblRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL0R1cmF0aW9uVHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgR3JvdXBUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL1RyYW5zZm9ybWVycy9Hcm91cFRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IFNraXBQcml2YXRlUHJvcGVydHlUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL1RyYW5zZm9ybWVycy9Ta2lwUHJpdmF0ZVByb3BlcnR5VHJhbnNmb3JtZXIudHMnO1xuXG5jb25zdCBkZWZhdWx0VHJhbnNmb3JtZXIgPSBuZXcgR3JvdXBUcmFuc2Zvcm1lcihbXG4gIG5ldyBTa2lwUHJpdmF0ZVByb3BlcnR5VHJhbnNmb3JtZXIoKSxcbiAgbmV3IERhdGVUcmFuc2Zvcm1lcigpLFxuICBuZXcgRHVyYXRpb25UcmFuc2Zvcm1lcigpXG5dKTtcblxudHlwZSBWYWxpZGF0b3I8VD4gPSAodmFsdWU6IFQpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbmFic3RyYWN0IGNsYXNzIFByb3h5SGFuZGxlckJhc2U8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGltcGxlbWVudHMgUHJveHlIYW5kbGVyPFBsdWdpblNldHRpbmdzPiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcGVydGllczogUHJvcGVydGllc01hcDxQbHVnaW5TZXR0aW5ncz4pIHt9XG5cbiAgcHVibGljIGdldCh0YXJnZXQ6IFBsdWdpblNldHRpbmdzLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiB1bmtub3duIHtcbiAgICBjb25zdCByZWNvcmQgPSB0YXJnZXQgYXMgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj47XG4gICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHJlY29yZFtwcm9wXTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucHJvcGVydGllcy5nZXQocHJvcCk7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIHJlY29yZFtwcm9wXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5OiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PHVua25vd24+KTogdW5rbm93bjtcbn1cblxuY2xhc3MgRWRpdGFibGVTZXR0aW5nc1Byb3h5SGFuZGxlcjxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBQcm94eUhhbmRsZXJCYXNlPFBsdWdpblNldHRpbmdzPiB7XG4gIHByaXZhdGUgdmFsaWRhdGlvblByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgcHVibGljIHNldCh0YXJnZXQ6IFBsdWdpblNldHRpbmdzLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVjb3JkID0gdGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+O1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmVjb3JkW3Byb3BdID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucHJvcGVydGllcy5nZXQocHJvcCk7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgcmVjb3JkW3Byb3BdID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgdGhpcy52YWxpZGF0aW9uUHJvbWlzZSA9IHRoaXMudmFsaWRhdGlvblByb21pc2UudGhlbigoKSA9PiBwcm9wZXJ0eS5zZXRWYWx1ZUFuZFZhbGlkYXRlKHZhbHVlKSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5OiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PHVua25vd24+KTogdW5rbm93biB7XG4gICAgcmV0dXJuIHByb3BlcnR5LmN1cnJlbnRWYWx1ZTtcbiAgfVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuY2xhc3MgUHJvcGVydGllc01hcDxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBNYXA8c3RyaW5nLCBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PGFueT4+IHtcbiAgcHVibGljIGdldFR5cGVkPFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+Pihwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZSk6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8UGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXT4ge1xuICAgIGNvbnN0IHByb3BlcnR5ID0gc3VwZXIuZ2V0KHByb3BlcnR5TmFtZSk7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9wZXJ0eSAke1N0cmluZyhwcm9wZXJ0eU5hbWUpfSBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcGVydHkgYXMgUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRUeXBlZDxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPj4oXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgdmFsdWU6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8UGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXT5cbiAgKTogdGhpcyB7XG4gICAgcmV0dXJuIHN1cGVyLnNldChwcm9wZXJ0eU5hbWUsIHZhbHVlKTtcbiAgfVxufVxuXG5jbGFzcyBTYWZlU2V0dGluZ3NQcm94eUhhbmRsZXI8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgUHJveHlIYW5kbGVyQmFzZTxQbHVnaW5TZXR0aW5ncz4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eTogUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTx1bmtub3duPik6IHVua25vd24ge1xuICAgIHJldHVybiBwcm9wZXJ0eS5zYWZlVmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBtYW5hZ2luZyBwbHVnaW4gc2V0dGluZ3MuXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIHJlcHJlc2VudGluZyB0aGUgcGx1Z2luIHNldHRpbmdzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpblNldHRpbmdzTWFuYWdlckJhc2U8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgcHVibGljIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwdWJsaWMgcmVhZG9ubHkgc2FmZVNldHRpbmdzOiBSZWFkb25seURlZXA8UGx1Z2luU2V0dGluZ3M+O1xuXG4gIHByaXZhdGUgZGVmYXVsdFNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncztcbiAgcHJpdmF0ZSBwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzTWFwPFBsdWdpblNldHRpbmdzPjtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSB2YWxpZGF0b3JzOiBNYXA8c3RyaW5nLCBWYWxpZGF0b3I8YW55Pj4gPSBuZXcgTWFwPHN0cmluZywgVmFsaWRhdG9yPGFueT4+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBwbHVnaW46IFBsdWdpbkJhc2U8UGx1Z2luU2V0dGluZ3M+KSB7XG4gICAgdGhpcy5hcHAgPSBwbHVnaW4uYXBwO1xuICAgIHRoaXMuZGVmYXVsdFNldHRpbmdzID0gdGhpcy5jcmVhdGVEZWZhdWx0U2V0dGluZ3MoKTtcblxuICAgIHRoaXMuYWRkVmFsaWRhdG9ycygpO1xuXG4gICAgdGhpcy5wcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXNNYXA8UGx1Z2luU2V0dGluZ3M+KCk7XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiBnZXRBbGxLZXlzKHRoaXMuZGVmYXVsdFNldHRpbmdzKSkge1xuICAgICAgdGhpcy5wcm9wZXJ0aWVzLnNldChcbiAgICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgICBuZXcgUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRoaXMuZGVmYXVsdFNldHRpbmdzW3Byb3BlcnR5TmFtZV0sIHRoaXMudmFsaWRhdG9ycy5nZXQocHJvcGVydHlOYW1lKSA/PyBub29wKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbGlkYXRvcnMuY2xlYXIoKTtcblxuICAgIHRoaXMuc2FmZVNldHRpbmdzID0gbmV3IFByb3h5KHRoaXMuZGVmYXVsdFNldHRpbmdzLCBuZXcgU2FmZVNldHRpbmdzUHJveHlIYW5kbGVyPFBsdWdpblNldHRpbmdzPih0aGlzLnByb3BlcnRpZXMpKSBhcyBSZWFkb25seURlZXA8UGx1Z2luU2V0dGluZ3M+O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGVkaXRBbmRTYXZlKGVkaXRvcjogKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncykgPT4gUHJvbWlzYWJsZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGVkaXRhYmxlU2V0dGluZ3MgPSBuZXcgUHJveHkodGhpcy5kZWZhdWx0U2V0dGluZ3MsIG5ldyBFZGl0YWJsZVNldHRpbmdzUHJveHlIYW5kbGVyPFBsdWdpblNldHRpbmdzPih0aGlzLnByb3BlcnRpZXMpKSBhcyB7XG4gICAgICB2YWxpZGF0aW9uUHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcbiAgICB9ICYgUGx1Z2luU2V0dGluZ3M7XG4gICAgYXdhaXQgZWRpdG9yKGVkaXRhYmxlU2V0dGluZ3MpO1xuICAgIGF3YWl0IGVkaXRhYmxlU2V0dGluZ3MudmFsaWRhdGlvblByb21pc2U7XG4gICAgYXdhaXQgdGhpcy5zYXZlVG9GaWxlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UHJvcGVydHk8UHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+KHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lKTogUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXRUeXBlZChwcm9wZXJ0eU5hbWUpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWRGcm9tRmlsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHRoaXMucHJvcGVydGllcy52YWx1ZXMoKSkge1xuICAgICAgcHJvcGVydHkucmVzZXQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5wbHVnaW4ubG9hZERhdGEoKSBhcyB1bmtub3duO1xuXG4gICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCB8fCBkYXRhID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBjb25zdCB0eXBlID0gQXJyYXkuaXNBcnJheShkYXRhKSA/ICdBcnJheScgOiB0eXBlb2YgZGF0YTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgZGF0YSB0eXBlLiBFeHBlY3RlZCBPYmplY3QsIGdvdDogJHt0eXBlfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCByZWNvcmQgPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IG9yaWdpbmFsSnNvbiA9IEpTT04uc3RyaW5naWZ5KHJlY29yZCk7XG4gICAgcmVjb3JkID0gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybU9iamVjdFJlY3Vyc2l2ZWx5KHJlY29yZCk7XG4gICAgYXdhaXQgdGhpcy5vbkxvYWRSZWNvcmQocmVjb3JkKTtcblxuICAgIGZvciAoY29uc3QgW3Byb3BlcnR5TmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCkpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5wcm9wZXJ0aWVzLmdldChwcm9wZXJ0eU5hbWUpO1xuICAgICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFVua25vd24gcHJvcGVydHk6ICR7cHJvcGVydHlOYW1lfWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gdHlwZW9mIHByb3BlcnR5LmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgdmFsdWUgdHlwZScsIHtcbiAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgcHJvcGVydHlUeXBlOiB0eXBlb2YgcHJvcGVydHkuZGVmYXVsdFZhbHVlLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgcHJvcGVydHkuc2V0VmFsdWVBbmRWYWxpZGF0ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3SnNvbiA9IEpTT04uc3RyaW5naWZ5KGF3YWl0IHRoaXMucHJlcGFyZVJlY29yZFRvU2F2ZSgpKTtcblxuICAgIGlmIChuZXdKc29uICE9PSBvcmlnaW5hbEpzb24pIHtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZVRvRmlsZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB0aGUgbmV3IHBsdWdpbiBzZXR0aW5ncy5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIHNhdmVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNhdmVUb0ZpbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb2xkU2V0dGluZ3MgPSB0aGlzLmdldFNhdmVkU2V0dGluZ3MoKTtcblxuICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHRoaXMucHJvcGVydGllcy52YWx1ZXMoKSkge1xuICAgICAgaGFzQ2hhbmdlcyB8fD0gcHJvcGVydHkuc2F2ZSgpO1xuICAgIH1cblxuICAgIGlmICghaGFzQ2hhbmdlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKGF3YWl0IHRoaXMucHJlcGFyZVJlY29yZFRvU2F2ZSgpKTtcbiAgICBhd2FpdCB0aGlzLnBsdWdpbi5vblNhdmVTZXR0aW5ncyh0aGlzLmdldFNhdmVkU2V0dGluZ3MoKSwgb2xkU2V0dGluZ3MpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZFZhbGlkYXRvcjxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPj4oXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgdmFsaWRhdG9yOiBWYWxpZGF0b3I8UGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXT5cbiAgKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0b3JzLnNldChwcm9wZXJ0eU5hbWUsIHZhbGlkYXRvcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkVmFsaWRhdG9ycygpOiB2b2lkIHtcbiAgICBub29wKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY3JlYXRlRGVmYXVsdFNldHRpbmdzKCk6IFBsdWdpblNldHRpbmdzO1xuXG4gIHByb3RlY3RlZCBnZXRUcmFuc2Zvcm1lcigpOiBUcmFuc2Zvcm1lciB7XG4gICAgcmV0dXJuIGRlZmF1bHRUcmFuc2Zvcm1lcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkxvYWRSZWNvcmQoX3JlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNhYmxlPHZvaWQ+IHtcbiAgICBub29wKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TYXZpbmdSZWNvcmQoX3JlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNhYmxlPHZvaWQ+IHtcbiAgICBub29wKCk7XG4gIH1cblxuICBwcml2YXRlIGdldFNhdmVkU2V0dGluZ3MoKTogUGx1Z2luU2V0dGluZ3Mge1xuICAgIGNvbnN0IHNhdmVkU2V0dGluZ3M6IFBhcnRpYWw8UGx1Z2luU2V0dGluZ3M+ID0ge307XG4gICAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCBwcm9wZXJ0eV0gb2YgdGhpcy5wcm9wZXJ0aWVzLmVudHJpZXMoKSkge1xuICAgICAgc2F2ZWRTZXR0aW5nc1twcm9wZXJ0eU5hbWUgYXMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5dID0gcHJvcGVydHkubGFzdFNhdmVkVmFsdWUgYXMgUGx1Z2luU2V0dGluZ3NbU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5dIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzLmRlZmF1bHRTZXR0aW5ncykgYXMgb2JqZWN0O1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihzYXZlZFNldHRpbmdzLCBwcm90byk7XG4gICAgcmV0dXJuIHNhdmVkU2V0dGluZ3MgYXMgUGx1Z2luU2V0dGluZ3M7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVSZWNvcmRUb1NhdmUoKTogUHJvbWlzZTxSZWNvcmQ8U3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4sIHVua25vd24+PiB7XG4gICAgY29uc3Qgc2V0dGluZ3M6IFJlY29yZDxTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPiwgdW5rbm93bj4gPSB7fSBhcyBSZWNvcmQ8U3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4sIHVua25vd24+O1xuICAgIGZvciAoY29uc3QgW3Byb3BlcnR5TmFtZSwgcHJvcGVydHldIG9mIHRoaXMucHJvcGVydGllcy5lbnRyaWVzKCkpIHtcbiAgICAgIHNldHRpbmdzW3Byb3BlcnR5TmFtZSBhcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPl0gPSBwcm9wZXJ0eS5jdXJyZW50VmFsdWUgYXMgdW5rbm93bjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLm9uU2F2aW5nUmVjb3JkKHNldHRpbmdzKTtcblxuICAgIHJldHVybiB0aGlzLmdldFRyYW5zZm9ybWVyKCkudHJhbnNmb3JtT2JqZWN0UmVjdXJzaXZlbHkoc2V0dGluZ3MpO1xuICB9XG59XG5cbi8qKlxuICogQSBwcm9wZXJ0eSBvZiBhIHBsdWdpbiBzZXR0aW5ncy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PFQ+IHtcbiAgcHVibGljIGdldCBjdXJyZW50VmFsdWUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbGFzdFNhdmVkVmFsdWUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX2xhc3RTYXZlZFZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBzYWZlVmFsdWUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlID8gdGhpcy5kZWZhdWx0VmFsdWUgOiB0aGlzLl9jdXJyZW50VmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZhbGlkYXRpb25NZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3VycmVudFZhbHVlOiBUO1xuXG4gIHByaXZhdGUgX2xhc3RTYXZlZFZhbHVlOiBUO1xuXG4gIHByaXZhdGUgX3ZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHB1YmxpYyByZWFkb25seSBkZWZhdWx0VmFsdWU6IFQsIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdG9yOiBWYWxpZGF0b3I8VD4pIHtcbiAgICB0aGlzLl9sYXN0U2F2ZWRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICB0aGlzLl9jdXJyZW50VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fY3VycmVudFZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWU7XG4gICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2UgPSAnJztcbiAgfVxuXG4gIHB1YmxpYyBzYXZlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9sYXN0U2F2ZWRWYWx1ZSA9PT0gdGhpcy5fY3VycmVudFZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5fbGFzdFNhdmVkVmFsdWUgPSB0aGlzLl9jdXJyZW50VmFsdWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgc2V0VmFsaWRhdGlvbk1lc3NhZ2UodmFsaWRhdGlvbk1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlID0gdmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgdGhpcy5zaG93V2FybmluZygpO1xuICB9XG5cbiAgcHVibGljIHNldFZhbHVlKHZhbHVlOiBUKTogdm9pZCB7XG4gICAgdGhpcy5fY3VycmVudFZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0VmFsdWVBbmRWYWxpZGF0ZSh2YWx1ZTogVCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2V0VmFsdWUodmFsdWUpO1xuICAgIGlmICh0aGlzLl9jdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlID0gKGF3YWl0IHRoaXMudmFsaWRhdG9yKHRoaXMuX2N1cnJlbnRWYWx1ZSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/PyAnJztcbiAgICB0aGlzLnNob3dXYXJuaW5nKHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd1dhcm5pbmcodmFsdWU/OiBUKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl92YWxpZGF0aW9uTWVzc2FnZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdhcm5pbmdNZXNzYWdlID0gYENvdWxkIG5vdCBzZXQgcGx1Z2luIHNldHRpbmc6ICR7dGhpcy5wcm9wZXJ0eU5hbWV9LiBVc2luZyBkZWZhdWx0IHZhbHVlIGluc3RlYWQuYDtcbiAgICBuZXcgTm90aWNlKHdhcm5pbmdNZXNzYWdlKTtcbiAgICBjb25zb2xlLndhcm4od2FybmluZ01lc3NhZ2UsIHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogdGhpcy5kZWZhdWx0VmFsdWUsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHRoaXMucHJvcGVydHlOYW1lLFxuICAgICAgdmFsaWRhdGlvbk1lc3NhZ2U6IHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlLFxuICAgICAgdmFsdWVcbiAgICB9KTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7OztBQU1BLFNBQVMsY0FBYztBQVN2QixTQUFTLFlBQVk7QUFDckIsU0FBUyxrQkFBa0I7QUFDM0IsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUywyQkFBMkI7QUFDcEMsU0FBUyx3QkFBd0I7QUFDakMsU0FBUyxzQ0FBc0M7QUFFL0MsTUFBTSxxQkFBcUIsSUFBSSxpQkFBaUI7QUFBQSxFQUM5QyxJQUFJLCtCQUErQjtBQUFBLEVBQ25DLElBQUksZ0JBQWdCO0FBQUEsRUFDcEIsSUFBSSxvQkFBb0I7QUFDMUIsQ0FBQztBQUlELE1BQWUsaUJBQXdGO0FBQUEsRUFDOUYsWUFBK0IsWUFBMkM7QUFBM0M7QUFBQSxFQUE0QztBQUFBLEVBRTNFLElBQUksUUFBd0IsTUFBZ0M7QUFDakUsVUFBTSxTQUFTO0FBQ2YsUUFBSSxPQUFPLFNBQVMsVUFBVTtBQUM1QixhQUFPLE9BQU8sSUFBSTtBQUFBLElBQ3BC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
|
@@ -3,45 +3,48 @@
|
|
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 { ConditionalKeys, Promisable
|
6
|
+
import type { ConditionalKeys, Promisable } from 'type-fest';
|
7
7
|
import { PluginSettingTab } from 'obsidian';
|
8
|
-
import type { StringKeys } from '../../
|
8
|
+
import type { StringKeys } from '../../Type.mjs';
|
9
9
|
import type { ValueComponentWithChangeTracking } from '../Components/ValueComponentWithChangeTracking.mjs';
|
10
|
+
import type { ValidationMessageHolder } from '../ValidationMessage.mjs';
|
10
11
|
import type { PluginBase } from './PluginBase.mjs';
|
11
12
|
/**
|
12
13
|
* Options for binding a value component to a plugin setting.
|
13
14
|
*/
|
14
|
-
export interface BindOptions {
|
15
|
+
export interface BindOptions<T> {
|
15
16
|
/**
|
16
17
|
* A callback function that is called when the value of the component changes.
|
17
18
|
*/
|
18
|
-
onChanged?(): Promisable<void>;
|
19
|
+
onChanged?(newValue: T | undefined, oldValue: T): Promisable<void>;
|
19
20
|
/**
|
20
|
-
*
|
21
|
+
* Whether to reset the setting when the component value is empty. Default is `true`.
|
22
|
+
* Applicable only to text-based components.
|
23
|
+
*/
|
24
|
+
shouldResetSettingWhenComponentIsEmpty?: boolean;
|
25
|
+
/**
|
26
|
+
* Whether to show the validation message when the component value is invalid. Default is `true`.
|
21
27
|
*/
|
22
28
|
shouldShowValidationMessage?: boolean;
|
23
29
|
}
|
24
30
|
/**
|
25
31
|
* Extended options for binding a value component to a plugin setting.
|
26
32
|
*/
|
27
|
-
export interface BindOptionsExtended<PluginSettings extends object, UIValue,
|
33
|
+
export interface BindOptionsExtended<PluginSettings extends object, UIValue, PropertyName extends StringKeys<PluginSettings>> extends BindOptions<PluginSettings[PropertyName]> {
|
28
34
|
/**
|
29
35
|
* Converts the UI component's value back to the plugin settings value.
|
30
36
|
* @param uiValue - The value of the UI component.
|
31
37
|
* @returns The value to set on the plugin settings.
|
32
38
|
*/
|
33
|
-
componentToPluginSettingsValueConverter: (uiValue: UIValue) => PluginSettings[
|
39
|
+
componentToPluginSettingsValueConverter: (uiValue: UIValue) => PluginSettings[PropertyName] | ValidationMessageHolder;
|
34
40
|
/**
|
35
41
|
* Converts the plugin settings value to the value used by the UI component.
|
36
42
|
* @param pluginSettingsValue - The value of the property in the plugin settings.
|
37
43
|
* @returns The value to set on the UI component.
|
38
44
|
*/
|
39
|
-
pluginSettingsToComponentValueConverter: (pluginSettingsValue: PluginSettings[
|
40
|
-
}
|
41
|
-
type ExtractPluginSettings<T extends PluginBase<any>> = WritableDeep<T['settings']>;
|
42
|
-
interface ValidationMessageHolder {
|
43
|
-
validationMessage: string;
|
45
|
+
pluginSettingsToComponentValueConverter: (pluginSettingsValue: PluginSettings[PropertyName]) => UIValue;
|
44
46
|
}
|
47
|
+
type ExtractPluginSettings<Plugin extends PluginBase<any>> = Plugin['__pluginSettingsType'];
|
45
48
|
/**
|
46
49
|
* Base class for creating plugin settings tabs in Obsidian.
|
47
50
|
* Provides a method for binding value components to plugin settings and handling changes.
|
@@ -57,23 +60,23 @@ export declare abstract class PluginSettingsTabBase<TPlugin extends PluginBase<a
|
|
57
60
|
* @typeParam UIValue - The type of the value of the UI component.
|
58
61
|
* @typeParam TValueComponent - The type of the value component.
|
59
62
|
* @param valueComponent - The value component to bind.
|
60
|
-
* @param
|
63
|
+
* @param propertyName - The property of the plugin settings to bind to.
|
61
64
|
* @param options - The options for binding the value component.
|
62
65
|
* @returns The value component.
|
63
66
|
*/
|
64
|
-
bind<UIValue, TValueComponent>(valueComponent: TValueComponent & ValueComponentWithChangeTracking<UIValue>,
|
67
|
+
bind<UIValue, TValueComponent>(valueComponent: TValueComponent & ValueComponentWithChangeTracking<UIValue>, propertyName: ConditionalKeys<ExtractPluginSettings<TPlugin>, UIValue>, options?: BindOptions<UIValue>): TValueComponent;
|
65
68
|
/**
|
66
69
|
* Binds a value component to a plugin setting.
|
67
70
|
*
|
68
71
|
* @typeParam UIValue - The type of the value of the UI component.
|
69
72
|
* @typeParam TValueComponent - The type of the value component.
|
70
|
-
* @typeParam
|
73
|
+
* @typeParam PropertyName - The property name of the plugin settings to bind to.
|
71
74
|
* @param valueComponent - The value component to bind.
|
72
|
-
* @param
|
75
|
+
* @param propertyName - The property name of the plugin settings to bind to.
|
73
76
|
* @param options - The options for binding the value component.
|
74
77
|
* @returns The value component.
|
75
78
|
*/
|
76
|
-
bind<UIValue, TValueComponent,
|
79
|
+
bind<UIValue, TValueComponent, PropertyName extends StringKeys<ExtractPluginSettings<TPlugin>>>(valueComponent: TValueComponent & ValueComponentWithChangeTracking<UIValue>, propertyName: PropertyName, options: BindOptionsExtended<ExtractPluginSettings<TPlugin>, UIValue, PropertyName>): TValueComponent;
|
77
80
|
hide(): void;
|
78
81
|
}
|
79
82
|
export {};
|