@real1ty-obsidian-plugins/utils 2.28.0 → 2.30.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/package.json +1 -1
- package/src/core/history.ts +45 -0
- package/src/core/index.ts +1 -0
- package/src/settings/settings-ui-builder.ts +0 -1
- package/dist/async/async.d.ts +0 -69
- package/dist/async/async.d.ts.map +0 -1
- package/dist/async/async.js +0 -108
- package/dist/async/async.js.map +0 -1
- package/dist/async/batch-operations.d.ts +0 -21
- package/dist/async/batch-operations.d.ts.map +0 -1
- package/dist/async/batch-operations.js +0 -60
- package/dist/async/batch-operations.js.map +0 -1
- package/dist/async/change-notifier.d.ts +0 -13
- package/dist/async/change-notifier.d.ts.map +0 -1
- package/dist/async/change-notifier.js +0 -26
- package/dist/async/change-notifier.js.map +0 -1
- package/dist/async/debounced-notifier.d.ts +0 -26
- package/dist/async/debounced-notifier.d.ts.map +0 -1
- package/dist/async/debounced-notifier.js +0 -50
- package/dist/async/debounced-notifier.js.map +0 -1
- package/dist/async/index.d.ts +0 -5
- package/dist/async/index.d.ts.map +0 -1
- package/dist/async/index.js +0 -5
- package/dist/async/index.js.map +0 -1
- package/dist/components/frontmatter-propagation-modal.d.ts +0 -17
- package/dist/components/frontmatter-propagation-modal.d.ts.map +0 -1
- package/dist/components/frontmatter-propagation-modal.js +0 -85
- package/dist/components/frontmatter-propagation-modal.js.map +0 -1
- package/dist/components/index.d.ts +0 -5
- package/dist/components/index.d.ts.map +0 -1
- package/dist/components/index.js +0 -5
- package/dist/components/index.js.map +0 -1
- package/dist/components/input-managers/base.d.ts +0 -30
- package/dist/components/input-managers/base.d.ts.map +0 -1
- package/dist/components/input-managers/base.js +0 -115
- package/dist/components/input-managers/base.js.map +0 -1
- package/dist/components/input-managers/expression.d.ts +0 -12
- package/dist/components/input-managers/expression.d.ts.map +0 -1
- package/dist/components/input-managers/expression.js +0 -56
- package/dist/components/input-managers/expression.js.map +0 -1
- package/dist/components/input-managers/index.d.ts +0 -4
- package/dist/components/input-managers/index.d.ts.map +0 -1
- package/dist/components/input-managers/index.js +0 -4
- package/dist/components/input-managers/index.js.map +0 -1
- package/dist/components/input-managers/search.d.ts +0 -6
- package/dist/components/input-managers/search.d.ts.map +0 -1
- package/dist/components/input-managers/search.js +0 -16
- package/dist/components/input-managers/search.js.map +0 -1
- package/dist/components/registered-events-component.d.ts +0 -30
- package/dist/components/registered-events-component.d.ts.map +0 -1
- package/dist/components/registered-events-component.js +0 -43
- package/dist/components/registered-events-component.js.map +0 -1
- package/dist/components/whats-new-modal.d.ts +0 -64
- package/dist/components/whats-new-modal.d.ts.map +0 -1
- package/dist/components/whats-new-modal.js +0 -139
- package/dist/components/whats-new-modal.js.map +0 -1
- package/dist/core/color-utils.d.ts +0 -17
- package/dist/core/color-utils.d.ts.map +0 -1
- package/dist/core/color-utils.js +0 -29
- package/dist/core/color-utils.js.map +0 -1
- package/dist/core/css-utils.d.ts +0 -39
- package/dist/core/css-utils.d.ts.map +0 -1
- package/dist/core/css-utils.js +0 -60
- package/dist/core/css-utils.js.map +0 -1
- package/dist/core/evaluator/base.d.ts +0 -22
- package/dist/core/evaluator/base.d.ts.map +0 -1
- package/dist/core/evaluator/base.js +0 -67
- package/dist/core/evaluator/base.js.map +0 -1
- package/dist/core/evaluator/color.d.ts +0 -19
- package/dist/core/evaluator/color.d.ts.map +0 -1
- package/dist/core/evaluator/color.js +0 -25
- package/dist/core/evaluator/color.js.map +0 -1
- package/dist/core/evaluator/excluded.d.ts +0 -32
- package/dist/core/evaluator/excluded.d.ts.map +0 -1
- package/dist/core/evaluator/excluded.js +0 -41
- package/dist/core/evaluator/excluded.js.map +0 -1
- package/dist/core/evaluator/filter.d.ts +0 -15
- package/dist/core/evaluator/filter.d.ts.map +0 -1
- package/dist/core/evaluator/filter.js +0 -27
- package/dist/core/evaluator/filter.js.map +0 -1
- package/dist/core/evaluator/included.d.ts +0 -36
- package/dist/core/evaluator/included.d.ts.map +0 -1
- package/dist/core/evaluator/included.js +0 -51
- package/dist/core/evaluator/included.js.map +0 -1
- package/dist/core/evaluator/index.d.ts +0 -6
- package/dist/core/evaluator/index.d.ts.map +0 -1
- package/dist/core/evaluator/index.js +0 -6
- package/dist/core/evaluator/index.js.map +0 -1
- package/dist/core/expression-utils.d.ts +0 -17
- package/dist/core/expression-utils.d.ts.map +0 -1
- package/dist/core/expression-utils.js +0 -40
- package/dist/core/expression-utils.js.map +0 -1
- package/dist/core/frontmatter-value.d.ts +0 -157
- package/dist/core/frontmatter-value.d.ts.map +0 -1
- package/dist/core/frontmatter-value.js +0 -417
- package/dist/core/frontmatter-value.js.map +0 -1
- package/dist/core/generate.d.ts +0 -7
- package/dist/core/generate.d.ts.map +0 -1
- package/dist/core/generate.js +0 -13
- package/dist/core/generate.js.map +0 -1
- package/dist/core/index.d.ts +0 -10
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -10
- package/dist/core/index.js.map +0 -1
- package/dist/core/indexer.d.ts +0 -109
- package/dist/core/indexer.d.ts.map +0 -1
- package/dist/core/indexer.js +0 -185
- package/dist/core/indexer.js.map +0 -1
- package/dist/core/property-renderer.d.ts +0 -9
- package/dist/core/property-renderer.d.ts.map +0 -1
- package/dist/core/property-renderer.js +0 -42
- package/dist/core/property-renderer.js.map +0 -1
- package/dist/core/validation.d.ts +0 -13
- package/dist/core/validation.d.ts.map +0 -1
- package/dist/core/validation.js +0 -27
- package/dist/core/validation.js.map +0 -1
- package/dist/date/date-recurrence.d.ts +0 -30
- package/dist/date/date-recurrence.d.ts.map +0 -1
- package/dist/date/date-recurrence.js +0 -188
- package/dist/date/date-recurrence.js.map +0 -1
- package/dist/date/date.d.ts +0 -21
- package/dist/date/date.d.ts.map +0 -1
- package/dist/date/date.js +0 -105
- package/dist/date/date.js.map +0 -1
- package/dist/date/index.d.ts +0 -3
- package/dist/date/index.d.ts.map +0 -1
- package/dist/date/index.js +0 -3
- package/dist/date/index.js.map +0 -1
- package/dist/file/child-reference.d.ts +0 -9
- package/dist/file/child-reference.d.ts.map +0 -1
- package/dist/file/child-reference.js +0 -57
- package/dist/file/child-reference.js.map +0 -1
- package/dist/file/file-operations.d.ts +0 -31
- package/dist/file/file-operations.d.ts.map +0 -1
- package/dist/file/file-operations.js +0 -160
- package/dist/file/file-operations.js.map +0 -1
- package/dist/file/file-utils.d.ts +0 -33
- package/dist/file/file-utils.d.ts.map +0 -1
- package/dist/file/file-utils.js +0 -76
- package/dist/file/file-utils.js.map +0 -1
- package/dist/file/file.d.ts +0 -332
- package/dist/file/file.d.ts.map +0 -1
- package/dist/file/file.js +0 -559
- package/dist/file/file.js.map +0 -1
- package/dist/file/frontmatter-diff.d.ts +0 -38
- package/dist/file/frontmatter-diff.d.ts.map +0 -1
- package/dist/file/frontmatter-diff.js +0 -162
- package/dist/file/frontmatter-diff.js.map +0 -1
- package/dist/file/frontmatter-propagation.d.ts +0 -4
- package/dist/file/frontmatter-propagation.d.ts.map +0 -1
- package/dist/file/frontmatter-propagation.js +0 -28
- package/dist/file/frontmatter-propagation.js.map +0 -1
- package/dist/file/frontmatter-serialization.d.ts +0 -21
- package/dist/file/frontmatter-serialization.d.ts.map +0 -1
- package/dist/file/frontmatter-serialization.js +0 -57
- package/dist/file/frontmatter-serialization.js.map +0 -1
- package/dist/file/frontmatter.d.ts +0 -15
- package/dist/file/frontmatter.d.ts.map +0 -1
- package/dist/file/frontmatter.js +0 -68
- package/dist/file/frontmatter.js.map +0 -1
- package/dist/file/index.d.ts +0 -13
- package/dist/file/index.d.ts.map +0 -1
- package/dist/file/index.js +0 -13
- package/dist/file/index.js.map +0 -1
- package/dist/file/link-parser.d.ts +0 -63
- package/dist/file/link-parser.d.ts.map +0 -1
- package/dist/file/link-parser.js +0 -137
- package/dist/file/link-parser.js.map +0 -1
- package/dist/file/property-utils.d.ts +0 -55
- package/dist/file/property-utils.d.ts.map +0 -1
- package/dist/file/property-utils.js +0 -90
- package/dist/file/property-utils.js.map +0 -1
- package/dist/file/templater-service.d.ts +0 -16
- package/dist/file/templater-service.d.ts.map +0 -1
- package/dist/file/templater-service.js +0 -37
- package/dist/file/templater-service.js.map +0 -1
- package/dist/file/templater.d.ts +0 -28
- package/dist/file/templater.d.ts.map +0 -1
- package/dist/file/templater.js +0 -126
- package/dist/file/templater.js.map +0 -1
- package/dist/index.d.ts +0 -9
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -17
- package/dist/index.js.map +0 -1
- package/dist/inputs/index.d.ts +0 -2
- package/dist/inputs/index.d.ts.map +0 -1
- package/dist/inputs/index.js +0 -2
- package/dist/inputs/index.js.map +0 -1
- package/dist/inputs/input-filter-manager.d.ts +0 -72
- package/dist/inputs/input-filter-manager.d.ts.map +0 -1
- package/dist/inputs/input-filter-manager.js +0 -140
- package/dist/inputs/input-filter-manager.js.map +0 -1
- package/dist/settings/index.d.ts +0 -3
- package/dist/settings/index.d.ts.map +0 -1
- package/dist/settings/index.js +0 -3
- package/dist/settings/index.js.map +0 -1
- package/dist/settings/settings-store.d.ts +0 -20
- package/dist/settings/settings-store.d.ts.map +0 -1
- package/dist/settings/settings-store.js +0 -82
- package/dist/settings/settings-store.js.map +0 -1
- package/dist/settings/settings-ui-builder.d.ts +0 -74
- package/dist/settings/settings-ui-builder.d.ts.map +0 -1
- package/dist/settings/settings-ui-builder.js +0 -437
- package/dist/settings/settings-ui-builder.js.map +0 -1
- package/dist/string/changelog-parser.d.ts +0 -17
- package/dist/string/changelog-parser.d.ts.map +0 -1
- package/dist/string/changelog-parser.js +0 -77
- package/dist/string/changelog-parser.js.map +0 -1
- package/dist/string/filename-utils.d.ts +0 -46
- package/dist/string/filename-utils.d.ts.map +0 -1
- package/dist/string/filename-utils.js +0 -65
- package/dist/string/filename-utils.js.map +0 -1
- package/dist/string/index.d.ts +0 -4
- package/dist/string/index.d.ts.map +0 -1
- package/dist/string/index.js +0 -4
- package/dist/string/index.js.map +0 -1
- package/dist/string/string.d.ts +0 -5
- package/dist/string/string.d.ts.map +0 -1
- package/dist/string/string.js +0 -25
- package/dist/string/string.js.map +0 -1
- package/dist/testing/index.d.ts +0 -5
- package/dist/testing/index.d.ts.map +0 -1
- package/dist/testing/index.js +0 -6
- package/dist/testing/index.js.map +0 -1
- package/dist/testing/mocks/obsidian.d.ts +0 -150
- package/dist/testing/mocks/obsidian.d.ts.map +0 -1
- package/dist/testing/mocks/obsidian.js +0 -226
- package/dist/testing/mocks/obsidian.js.map +0 -1
- package/dist/testing/mocks/utils.d.ts +0 -14
- package/dist/testing/mocks/utils.d.ts.map +0 -1
- package/dist/testing/mocks/utils.js +0 -85
- package/dist/testing/mocks/utils.js.map +0 -1
- package/dist/testing/setup.d.ts +0 -2
- package/dist/testing/setup.d.ts.map +0 -1
- package/dist/testing/setup.js +0 -18
- package/dist/testing/setup.js.map +0 -1
|
@@ -1,437 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Notice, Setting } from "obsidian";
|
|
3
|
-
export class SettingsUIBuilder {
|
|
4
|
-
constructor(settingsStore) {
|
|
5
|
-
this.settingsStore = settingsStore;
|
|
6
|
-
}
|
|
7
|
-
get settings() {
|
|
8
|
-
return this.settingsStore.currentSettings;
|
|
9
|
-
}
|
|
10
|
-
get schema() {
|
|
11
|
-
return this.settingsStore.validationSchema;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Gets a nested property value using dot notation (e.g., "basesView.tasksDirectory")
|
|
15
|
-
*/
|
|
16
|
-
getNestedValue(key) {
|
|
17
|
-
const keys = key.split(".");
|
|
18
|
-
let value = this.settings;
|
|
19
|
-
for (const k of keys) {
|
|
20
|
-
if (value === undefined || value === null) {
|
|
21
|
-
return undefined;
|
|
22
|
-
}
|
|
23
|
-
value = value[k];
|
|
24
|
-
}
|
|
25
|
-
return value;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Sets a nested property value using dot notation and returns updated settings
|
|
29
|
-
*/
|
|
30
|
-
setNestedValue(key, value) {
|
|
31
|
-
const keys = key.split(".");
|
|
32
|
-
const newSettings = JSON.parse(JSON.stringify(this.settings)); // Deep clone
|
|
33
|
-
let current = newSettings;
|
|
34
|
-
// Navigate to the parent of the target property
|
|
35
|
-
for (let i = 0; i < keys.length - 1; i++) {
|
|
36
|
-
const k = keys[i];
|
|
37
|
-
if (!(k in current)) {
|
|
38
|
-
current[k] = {};
|
|
39
|
-
}
|
|
40
|
-
current = current[k];
|
|
41
|
-
}
|
|
42
|
-
// Set the final property
|
|
43
|
-
const lastKey = keys[keys.length - 1];
|
|
44
|
-
current[lastKey] = value;
|
|
45
|
-
return newSettings;
|
|
46
|
-
}
|
|
47
|
-
updateSetting(key, value) {
|
|
48
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
49
|
-
const newSettings = this.setNestedValue(key, value);
|
|
50
|
-
const result = this.schema.safeParse(newSettings);
|
|
51
|
-
if (!result.success) {
|
|
52
|
-
const errors = result.error.issues
|
|
53
|
-
.map((e) => `${String(e.path.join("."))}${e.path.length > 0 ? ": " : ""}${e.message}`)
|
|
54
|
-
.join(", ");
|
|
55
|
-
new Notice(`Validation failed: ${errors}`, 5000);
|
|
56
|
-
throw new Error(`Validation failed: ${errors}`);
|
|
57
|
-
}
|
|
58
|
-
yield this.settingsStore.updateSettings(() => newSettings);
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
inferSliderBounds(key) {
|
|
62
|
-
var _a, _b, _c, _d, _e;
|
|
63
|
-
try {
|
|
64
|
-
// Navigate nested schema using dot notation
|
|
65
|
-
const keys = key.split(".");
|
|
66
|
-
let fieldSchema = this.schema.shape;
|
|
67
|
-
for (const k of keys) {
|
|
68
|
-
if (!fieldSchema)
|
|
69
|
-
return {};
|
|
70
|
-
// Unwrap nested schemas
|
|
71
|
-
while ((_a = fieldSchema._def) === null || _a === void 0 ? void 0 : _a.innerType) {
|
|
72
|
-
fieldSchema = fieldSchema._def.innerType;
|
|
73
|
-
}
|
|
74
|
-
fieldSchema = (_c = (_b = fieldSchema.shape) === null || _b === void 0 ? void 0 : _b[k]) !== null && _c !== void 0 ? _c : fieldSchema[k];
|
|
75
|
-
}
|
|
76
|
-
if (!fieldSchema)
|
|
77
|
-
return {};
|
|
78
|
-
let innerSchema = fieldSchema;
|
|
79
|
-
while ((_d = innerSchema._def) === null || _d === void 0 ? void 0 : _d.innerType) {
|
|
80
|
-
innerSchema = innerSchema._def.innerType;
|
|
81
|
-
}
|
|
82
|
-
if (((_e = innerSchema._def) === null || _e === void 0 ? void 0 : _e.typeName) === "ZodNumber") {
|
|
83
|
-
const checks = innerSchema._def.checks || [];
|
|
84
|
-
let min;
|
|
85
|
-
let max;
|
|
86
|
-
for (const check of checks) {
|
|
87
|
-
if (check.kind === "min") {
|
|
88
|
-
min = check.value;
|
|
89
|
-
}
|
|
90
|
-
if (check.kind === "max") {
|
|
91
|
-
max = check.value;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
return { min, max };
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
catch (error) {
|
|
98
|
-
console.warn(`Failed to infer slider bounds for key ${key}:`, error);
|
|
99
|
-
}
|
|
100
|
-
return {};
|
|
101
|
-
}
|
|
102
|
-
inferArrayItemType(key) {
|
|
103
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
104
|
-
try {
|
|
105
|
-
// Navigate nested schema using dot notation
|
|
106
|
-
const keys = key.split(".");
|
|
107
|
-
let fieldSchema = this.schema.shape;
|
|
108
|
-
for (const k of keys) {
|
|
109
|
-
if (!fieldSchema)
|
|
110
|
-
return undefined;
|
|
111
|
-
// Unwrap nested schemas
|
|
112
|
-
while ((_a = fieldSchema._def) === null || _a === void 0 ? void 0 : _a.innerType) {
|
|
113
|
-
fieldSchema = fieldSchema._def.innerType;
|
|
114
|
-
}
|
|
115
|
-
fieldSchema = (_c = (_b = fieldSchema.shape) === null || _b === void 0 ? void 0 : _b[k]) !== null && _c !== void 0 ? _c : fieldSchema[k];
|
|
116
|
-
}
|
|
117
|
-
if (!fieldSchema)
|
|
118
|
-
return undefined;
|
|
119
|
-
let innerSchema = fieldSchema;
|
|
120
|
-
while ((_d = innerSchema._def) === null || _d === void 0 ? void 0 : _d.innerType) {
|
|
121
|
-
innerSchema = innerSchema._def.innerType;
|
|
122
|
-
}
|
|
123
|
-
if (((_e = innerSchema._def) === null || _e === void 0 ? void 0 : _e.typeName) === "ZodArray") {
|
|
124
|
-
const elementType = innerSchema._def.type;
|
|
125
|
-
if (((_f = elementType._def) === null || _f === void 0 ? void 0 : _f.typeName) === "ZodNumber") {
|
|
126
|
-
return "number";
|
|
127
|
-
}
|
|
128
|
-
if (((_g = elementType._def) === null || _g === void 0 ? void 0 : _g.typeName) === "ZodString") {
|
|
129
|
-
return "string";
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
catch (error) {
|
|
134
|
-
console.warn(`Failed to infer array item type for key ${key}:`, error);
|
|
135
|
-
}
|
|
136
|
-
return undefined;
|
|
137
|
-
}
|
|
138
|
-
addToggle(containerEl, config) {
|
|
139
|
-
const { key, name, desc } = config;
|
|
140
|
-
const value = this.getNestedValue(key);
|
|
141
|
-
new Setting(containerEl)
|
|
142
|
-
.setName(name)
|
|
143
|
-
.setDesc(desc)
|
|
144
|
-
.addToggle((toggle) => toggle.setValue(Boolean(value)).onChange((newValue) => __awaiter(this, void 0, void 0, function* () {
|
|
145
|
-
yield this.updateSetting(key, newValue);
|
|
146
|
-
})));
|
|
147
|
-
}
|
|
148
|
-
addSlider(containerEl, config) {
|
|
149
|
-
var _a, _b, _c, _d;
|
|
150
|
-
const { key, name, desc, step = 1, commitOnChange = false } = config;
|
|
151
|
-
const value = this.getNestedValue(key);
|
|
152
|
-
const inferredBounds = this.inferSliderBounds(key);
|
|
153
|
-
const min = (_b = (_a = config.min) !== null && _a !== void 0 ? _a : inferredBounds.min) !== null && _b !== void 0 ? _b : 0;
|
|
154
|
-
const max = (_d = (_c = config.max) !== null && _c !== void 0 ? _c : inferredBounds.max) !== null && _d !== void 0 ? _d : 100;
|
|
155
|
-
new Setting(containerEl)
|
|
156
|
-
.setName(name)
|
|
157
|
-
.setDesc(desc)
|
|
158
|
-
.addSlider((slider) => {
|
|
159
|
-
slider.setLimits(min, max, step).setValue(Number(value)).setDynamicTooltip();
|
|
160
|
-
if (commitOnChange) {
|
|
161
|
-
// Reactive: commit on every change
|
|
162
|
-
slider.onChange((newValue) => __awaiter(this, void 0, void 0, function* () {
|
|
163
|
-
yield this.updateSetting(key, newValue);
|
|
164
|
-
}));
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
// Commit only when user finishes dragging
|
|
168
|
-
const commit = (newValue) => __awaiter(this, void 0, void 0, function* () {
|
|
169
|
-
try {
|
|
170
|
-
yield this.updateSetting(key, newValue);
|
|
171
|
-
}
|
|
172
|
-
catch (error) {
|
|
173
|
-
new Notice(`Invalid input: ${error}`, 5000);
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
// Update tooltip during drag for visual feedback
|
|
177
|
-
slider.onChange((newValue) => {
|
|
178
|
-
slider.sliderEl.setAttribute("aria-valuenow", String(newValue));
|
|
179
|
-
});
|
|
180
|
-
// Commit on mouse up
|
|
181
|
-
slider.sliderEl.addEventListener("mouseup", () => {
|
|
182
|
-
void commit(Number(slider.sliderEl.value));
|
|
183
|
-
});
|
|
184
|
-
// Commit on keyboard navigation
|
|
185
|
-
slider.sliderEl.addEventListener("keyup", (e) => {
|
|
186
|
-
if (["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", "Home", "End"].includes(e.key)) {
|
|
187
|
-
void commit(Number(slider.sliderEl.value));
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
return slider;
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
addText(containerEl, config) {
|
|
195
|
-
const { key, name, desc, placeholder = "", commitOnChange = false } = config;
|
|
196
|
-
const value = this.getNestedValue(key);
|
|
197
|
-
new Setting(containerEl)
|
|
198
|
-
.setName(name)
|
|
199
|
-
.setDesc(desc)
|
|
200
|
-
.addText((text) => {
|
|
201
|
-
text.setPlaceholder(placeholder);
|
|
202
|
-
text.setValue(String(value !== null && value !== void 0 ? value : ""));
|
|
203
|
-
if (commitOnChange) {
|
|
204
|
-
// Reactive: commit on every change
|
|
205
|
-
text.onChange((newValue) => __awaiter(this, void 0, void 0, function* () {
|
|
206
|
-
yield this.updateSetting(key, newValue);
|
|
207
|
-
}));
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
// Commit only on blur or Ctrl/Cmd+Enter
|
|
211
|
-
const commit = (inputValue) => __awaiter(this, void 0, void 0, function* () {
|
|
212
|
-
try {
|
|
213
|
-
yield this.updateSetting(key, inputValue);
|
|
214
|
-
}
|
|
215
|
-
catch (error) {
|
|
216
|
-
new Notice(`Invalid input: ${error}`, 5000);
|
|
217
|
-
}
|
|
218
|
-
});
|
|
219
|
-
text.inputEl.addEventListener("blur", () => void commit(text.inputEl.value));
|
|
220
|
-
text.inputEl.addEventListener("keydown", (e) => {
|
|
221
|
-
if (e.key === "Enter" && (e.ctrlKey || e.metaKey)) {
|
|
222
|
-
e.preventDefault();
|
|
223
|
-
void commit(text.inputEl.value);
|
|
224
|
-
}
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
});
|
|
228
|
-
}
|
|
229
|
-
addDropdown(containerEl, config) {
|
|
230
|
-
const { key, name, desc, options } = config;
|
|
231
|
-
const value = this.getNestedValue(key);
|
|
232
|
-
new Setting(containerEl)
|
|
233
|
-
.setName(name)
|
|
234
|
-
.setDesc(desc)
|
|
235
|
-
.addDropdown((dropdown) => dropdown
|
|
236
|
-
.addOptions(options)
|
|
237
|
-
.setValue(String(value))
|
|
238
|
-
.onChange((newValue) => __awaiter(this, void 0, void 0, function* () {
|
|
239
|
-
yield this.updateSetting(key, newValue);
|
|
240
|
-
})));
|
|
241
|
-
}
|
|
242
|
-
addTextArray(containerEl, config) {
|
|
243
|
-
var _a, _b, _c, _d;
|
|
244
|
-
const { key, name, desc, placeholder = "", arrayDelimiter = ", ", multiline = false, commitOnChange = false, } = config;
|
|
245
|
-
const value = this.getNestedValue(key);
|
|
246
|
-
const inferredItemType = (_b = (_a = config.itemType) !== null && _a !== void 0 ? _a : this.inferArrayItemType(key)) !== null && _b !== void 0 ? _b : "string";
|
|
247
|
-
const parser = (_c = config.parser) !== null && _c !== void 0 ? _c : ((input) => {
|
|
248
|
-
if (inferredItemType === "number") {
|
|
249
|
-
const num = Number(input);
|
|
250
|
-
if (Number.isNaN(num)) {
|
|
251
|
-
throw new Error(`Invalid number: ${input}`);
|
|
252
|
-
}
|
|
253
|
-
return num;
|
|
254
|
-
}
|
|
255
|
-
return input;
|
|
256
|
-
});
|
|
257
|
-
const validator = (_d = config.validator) !== null && _d !== void 0 ? _d : ((_item) => true);
|
|
258
|
-
const setting = new Setting(containerEl).setName(name).setDesc(desc);
|
|
259
|
-
if (multiline) {
|
|
260
|
-
setting.addTextArea((text) => {
|
|
261
|
-
text.setPlaceholder(placeholder);
|
|
262
|
-
text.setValue(Array.isArray(value) ? value.join("\n") : "");
|
|
263
|
-
const commit = (inputValue) => __awaiter(this, void 0, void 0, function* () {
|
|
264
|
-
const lines = inputValue
|
|
265
|
-
.split("\n")
|
|
266
|
-
.map((s) => s.trim())
|
|
267
|
-
.filter((s) => s.length > 0);
|
|
268
|
-
try {
|
|
269
|
-
const items = lines.map(parser).filter(validator);
|
|
270
|
-
yield this.updateSetting(key, items);
|
|
271
|
-
}
|
|
272
|
-
catch (error) {
|
|
273
|
-
new Notice(`Invalid input: ${error}`, 5000);
|
|
274
|
-
}
|
|
275
|
-
});
|
|
276
|
-
if (commitOnChange) {
|
|
277
|
-
// Reactive: commit on every change
|
|
278
|
-
text.onChange((inputValue) => __awaiter(this, void 0, void 0, function* () {
|
|
279
|
-
yield commit(inputValue);
|
|
280
|
-
}));
|
|
281
|
-
}
|
|
282
|
-
else {
|
|
283
|
-
// Commit only on blur or Ctrl/Cmd+Enter
|
|
284
|
-
text.inputEl.addEventListener("blur", () => void commit(text.inputEl.value));
|
|
285
|
-
text.inputEl.addEventListener("keydown", (e) => {
|
|
286
|
-
if (e.key === "Enter" && (e.ctrlKey || e.metaKey)) {
|
|
287
|
-
e.preventDefault();
|
|
288
|
-
void commit(text.inputEl.value);
|
|
289
|
-
}
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
text.inputEl.rows = 5;
|
|
293
|
-
text.inputEl.classList.add("settings-ui-builder-textarea");
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
else {
|
|
297
|
-
setting.addText((text) => {
|
|
298
|
-
text.setPlaceholder(placeholder);
|
|
299
|
-
text.setValue(Array.isArray(value) ? value.join(arrayDelimiter) : "");
|
|
300
|
-
const commit = (inputValue) => __awaiter(this, void 0, void 0, function* () {
|
|
301
|
-
const tokens = inputValue
|
|
302
|
-
.split(",")
|
|
303
|
-
.map((s) => s.trim())
|
|
304
|
-
.filter((s) => s.length > 0);
|
|
305
|
-
try {
|
|
306
|
-
const items = tokens.map(parser).filter(validator);
|
|
307
|
-
yield this.updateSetting(key, items);
|
|
308
|
-
}
|
|
309
|
-
catch (error) {
|
|
310
|
-
new Notice(`Invalid input: ${error}`, 5000);
|
|
311
|
-
}
|
|
312
|
-
});
|
|
313
|
-
if (commitOnChange) {
|
|
314
|
-
// Reactive: commit on every change
|
|
315
|
-
text.onChange((inputValue) => __awaiter(this, void 0, void 0, function* () {
|
|
316
|
-
yield commit(inputValue);
|
|
317
|
-
}));
|
|
318
|
-
}
|
|
319
|
-
else {
|
|
320
|
-
// Commit only on blur or Ctrl/Cmd+Enter
|
|
321
|
-
text.inputEl.addEventListener("blur", () => void commit(text.inputEl.value));
|
|
322
|
-
text.inputEl.addEventListener("keydown", (e) => {
|
|
323
|
-
if (e.key === "Enter" && (e.ctrlKey || e.metaKey)) {
|
|
324
|
-
e.preventDefault();
|
|
325
|
-
void commit(text.inputEl.value);
|
|
326
|
-
}
|
|
327
|
-
});
|
|
328
|
-
}
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
/**
|
|
333
|
-
* Advanced array manager with add/remove buttons for each item
|
|
334
|
-
*/
|
|
335
|
-
addArrayManager(containerEl, config) {
|
|
336
|
-
var _a;
|
|
337
|
-
const { key, name, desc, placeholder = "", addButtonText = "Add", removeButtonText = "Remove", emptyArrayFallback = [], preventEmpty = false, itemDescriptionFn, onBeforeAdd, onBeforeRemove, quickActions = [], } = config;
|
|
338
|
-
// Section heading
|
|
339
|
-
new Setting(containerEl).setName(name).setHeading();
|
|
340
|
-
// Description
|
|
341
|
-
if (desc) {
|
|
342
|
-
const descEl = containerEl.createDiv("setting-item-description");
|
|
343
|
-
descEl.setText(desc);
|
|
344
|
-
}
|
|
345
|
-
// Container for list items
|
|
346
|
-
const listContainer = containerEl.createDiv("settings-array-manager-list");
|
|
347
|
-
const render = () => {
|
|
348
|
-
var _a;
|
|
349
|
-
listContainer.empty();
|
|
350
|
-
const currentItems = (_a = this.getNestedValue(key)) !== null && _a !== void 0 ? _a : [];
|
|
351
|
-
for (const item of currentItems) {
|
|
352
|
-
const itemSetting = new Setting(listContainer).setName(String(item)).addButton((button) => button
|
|
353
|
-
.setButtonText(removeButtonText)
|
|
354
|
-
.setWarning()
|
|
355
|
-
.onClick(() => __awaiter(this, void 0, void 0, function* () {
|
|
356
|
-
let newItems = currentItems.filter((i) => i !== item);
|
|
357
|
-
// Apply custom logic before removal
|
|
358
|
-
if (onBeforeRemove) {
|
|
359
|
-
newItems = yield onBeforeRemove(item, currentItems);
|
|
360
|
-
}
|
|
361
|
-
// Prevent empty array if configured
|
|
362
|
-
if (preventEmpty && newItems.length === 0) {
|
|
363
|
-
newItems = Array.isArray(emptyArrayFallback)
|
|
364
|
-
? emptyArrayFallback
|
|
365
|
-
: [emptyArrayFallback];
|
|
366
|
-
}
|
|
367
|
-
yield this.updateSetting(key, newItems);
|
|
368
|
-
render();
|
|
369
|
-
})));
|
|
370
|
-
// Add custom description for each item if provided
|
|
371
|
-
if (itemDescriptionFn) {
|
|
372
|
-
itemSetting.setDesc(itemDescriptionFn(item));
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
};
|
|
376
|
-
render();
|
|
377
|
-
// Add new item section
|
|
378
|
-
const inputId = `settings-array-manager-input-${key}`;
|
|
379
|
-
new Setting(containerEl)
|
|
380
|
-
.setName(`Add ${name.toLowerCase()}`)
|
|
381
|
-
.setDesc(`Enter a new value`)
|
|
382
|
-
.addText((text) => {
|
|
383
|
-
text.setPlaceholder(placeholder);
|
|
384
|
-
text.inputEl.id = inputId;
|
|
385
|
-
})
|
|
386
|
-
.addButton((button) => button
|
|
387
|
-
.setButtonText(addButtonText)
|
|
388
|
-
.setCta()
|
|
389
|
-
.onClick(() => __awaiter(this, void 0, void 0, function* () {
|
|
390
|
-
var _a;
|
|
391
|
-
// Use document.getElementById instead of querySelector to avoid CSS selector issues with dots
|
|
392
|
-
const input = document.getElementById(inputId);
|
|
393
|
-
if (!input) {
|
|
394
|
-
console.error(`Input element not found: ${inputId}`);
|
|
395
|
-
return;
|
|
396
|
-
}
|
|
397
|
-
const newItem = input.value.trim();
|
|
398
|
-
if (!newItem) {
|
|
399
|
-
return;
|
|
400
|
-
}
|
|
401
|
-
const currentItems = (_a = this.getNestedValue(key)) !== null && _a !== void 0 ? _a : [];
|
|
402
|
-
let newItems = [...currentItems];
|
|
403
|
-
// Apply custom logic before adding
|
|
404
|
-
if (onBeforeAdd) {
|
|
405
|
-
newItems = yield onBeforeAdd(newItem, currentItems);
|
|
406
|
-
}
|
|
407
|
-
else {
|
|
408
|
-
// Default behavior: add if not exists
|
|
409
|
-
if (!newItems.includes(newItem)) {
|
|
410
|
-
newItems.push(newItem);
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
yield this.updateSetting(key, newItems);
|
|
414
|
-
input.value = "";
|
|
415
|
-
render();
|
|
416
|
-
})));
|
|
417
|
-
// Quick actions
|
|
418
|
-
for (const quickAction of quickActions) {
|
|
419
|
-
const currentItems = (_a = this.getNestedValue(key)) !== null && _a !== void 0 ? _a : [];
|
|
420
|
-
// Check condition if provided
|
|
421
|
-
if (quickAction.condition && !quickAction.condition(currentItems)) {
|
|
422
|
-
continue;
|
|
423
|
-
}
|
|
424
|
-
new Setting(containerEl)
|
|
425
|
-
.setName(quickAction.name)
|
|
426
|
-
.setDesc(quickAction.desc)
|
|
427
|
-
.addButton((button) => button.setButtonText(quickAction.buttonText).onClick(() => __awaiter(this, void 0, void 0, function* () {
|
|
428
|
-
var _a;
|
|
429
|
-
const currentItems = (_a = this.getNestedValue(key)) !== null && _a !== void 0 ? _a : [];
|
|
430
|
-
const newItems = yield quickAction.action(currentItems);
|
|
431
|
-
yield this.updateSetting(key, newItems);
|
|
432
|
-
render();
|
|
433
|
-
})));
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
//# sourceMappingURL=settings-ui-builder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settings-ui-builder.js","sourceRoot":"","sources":["../../src/settings/settings-ui-builder.ts"],"names":[],"mappings":"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","sourcesContent":["import { Notice, Setting } from \"obsidian\";\nimport type { ZodArray, ZodNumber, ZodObject, ZodRawShape, z } from \"zod\";\nimport type { SettingsStore } from \"./settings-store\";\n\ninterface BaseSettingConfig {\n\tkey: string;\n\tname: string;\n\tdesc: string;\n}\n\ninterface TextSettingConfig extends BaseSettingConfig {\n\tplaceholder?: string;\n\tcommitOnChange?: boolean;\n}\n\ninterface SliderSettingConfig extends BaseSettingConfig {\n\tmin?: number;\n\tmax?: number;\n\tstep?: number;\n\tcommitOnChange?: boolean;\n}\n\ninterface DropdownSettingConfig extends BaseSettingConfig {\n\toptions: Record<string, string>;\n}\n\ninterface ArraySettingConfig<T = string> extends BaseSettingConfig {\n\tplaceholder?: string;\n\tarrayDelimiter?: string;\n\tmultiline?: boolean;\n\tcommitOnChange?: boolean;\n\titemType?: \"string\" | \"number\";\n\tparser?: (input: string) => T;\n\tvalidator?: (item: T) => boolean;\n}\n\ninterface ArrayManagerConfig extends BaseSettingConfig {\n\tplaceholder?: string;\n\taddButtonText?: string;\n\tremoveButtonText?: string;\n\temptyArrayFallback?: unknown;\n\tpreventEmpty?: boolean;\n\titemDescriptionFn?: (item: unknown) => string;\n\tonBeforeAdd?: (newItem: unknown, currentItems: unknown[]) => unknown[] | Promise<unknown[]>;\n\tonBeforeRemove?: (\n\t\titemToRemove: unknown,\n\t\tcurrentItems: unknown[]\n\t) => unknown[] | Promise<unknown[]>;\n\tquickActions?: Array<{\n\t\tname: string;\n\t\tdesc: string;\n\t\tbuttonText: string;\n\t\tcondition?: (currentItems: unknown[]) => boolean;\n\t\taction: (currentItems: unknown[]) => unknown[] | Promise<unknown[]>;\n\t}>;\n}\n\nexport class SettingsUIBuilder<TSchema extends ZodObject<ZodRawShape>> {\n\tconstructor(private settingsStore: SettingsStore<TSchema>) {}\n\n\tprivate get settings(): z.infer<TSchema> {\n\t\treturn this.settingsStore.currentSettings;\n\t}\n\n\tprivate get schema(): TSchema {\n\t\treturn this.settingsStore.validationSchema;\n\t}\n\n\t/**\n\t * Gets a nested property value using dot notation (e.g., \"basesView.tasksDirectory\")\n\t */\n\tprivate getNestedValue(key: string): unknown {\n\t\tconst keys = key.split(\".\");\n\t\tlet value: any = this.settings;\n\n\t\tfor (const k of keys) {\n\t\t\tif (value === undefined || value === null) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tvalue = value[k];\n\t\t}\n\n\t\treturn value;\n\t}\n\n\t/**\n\t * Sets a nested property value using dot notation and returns updated settings\n\t */\n\tprivate setNestedValue(key: string, value: unknown): z.infer<TSchema> {\n\t\tconst keys = key.split(\".\");\n\t\tconst newSettings = JSON.parse(JSON.stringify(this.settings)); // Deep clone\n\n\t\tlet current: any = newSettings;\n\n\t\t// Navigate to the parent of the target property\n\t\tfor (let i = 0; i < keys.length - 1; i++) {\n\t\t\tconst k = keys[i];\n\t\t\tif (!(k in current)) {\n\t\t\t\tcurrent[k] = {};\n\t\t\t}\n\t\t\tcurrent = current[k];\n\t\t}\n\n\t\t// Set the final property\n\t\tconst lastKey = keys[keys.length - 1];\n\t\tcurrent[lastKey] = value;\n\n\t\treturn newSettings;\n\t}\n\n\tprivate async updateSetting(key: string, value: unknown): Promise<void> {\n\t\tconst newSettings = this.setNestedValue(key, value);\n\n\t\tconst result = this.schema.safeParse(newSettings);\n\n\t\tif (!result.success) {\n\t\t\tconst errors = result.error.issues\n\t\t\t\t.map((e) => `${String(e.path.join(\".\"))}${e.path.length > 0 ? \": \" : \"\"}${e.message}`)\n\t\t\t\t.join(\", \");\n\t\t\tnew Notice(`Validation failed: ${errors}`, 5000);\n\t\t\tthrow new Error(`Validation failed: ${errors}`);\n\t\t}\n\n\t\tawait this.settingsStore.updateSettings(() => newSettings);\n\t}\n\n\tprivate inferSliderBounds(key: string): { min?: number; max?: number; step?: number } {\n\t\ttry {\n\t\t\t// Navigate nested schema using dot notation\n\t\t\tconst keys = key.split(\".\");\n\t\t\tlet fieldSchema: any = this.schema.shape;\n\n\t\t\tfor (const k of keys) {\n\t\t\t\tif (!fieldSchema) return {};\n\n\t\t\t\t// Unwrap nested schemas\n\t\t\t\twhile ((fieldSchema as any)._def?.innerType) {\n\t\t\t\t\tfieldSchema = (fieldSchema as any)._def.innerType;\n\t\t\t\t}\n\n\t\t\t\tfieldSchema = (fieldSchema as any).shape?.[k] ?? (fieldSchema as any)[k];\n\t\t\t}\n\n\t\t\tif (!fieldSchema) return {};\n\n\t\t\tlet innerSchema = fieldSchema;\n\t\t\twhile ((innerSchema as any)._def?.innerType) {\n\t\t\t\tinnerSchema = (innerSchema as any)._def.innerType;\n\t\t\t}\n\n\t\t\tif ((innerSchema as any)._def?.typeName === \"ZodNumber\") {\n\t\t\t\tconst checks = ((innerSchema as ZodNumber)._def as any).checks || [];\n\t\t\t\tlet min: number | undefined;\n\t\t\t\tlet max: number | undefined;\n\n\t\t\t\tfor (const check of checks) {\n\t\t\t\t\tif ((check as any).kind === \"min\") {\n\t\t\t\t\t\tmin = (check as any).value;\n\t\t\t\t\t}\n\t\t\t\t\tif ((check as any).kind === \"max\") {\n\t\t\t\t\t\tmax = (check as any).value;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn { min, max };\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(`Failed to infer slider bounds for key ${key}:`, error);\n\t\t}\n\n\t\treturn {};\n\t}\n\n\tprivate inferArrayItemType(key: string): \"string\" | \"number\" | undefined {\n\t\ttry {\n\t\t\t// Navigate nested schema using dot notation\n\t\t\tconst keys = key.split(\".\");\n\t\t\tlet fieldSchema: any = this.schema.shape;\n\n\t\t\tfor (const k of keys) {\n\t\t\t\tif (!fieldSchema) return undefined;\n\n\t\t\t\t// Unwrap nested schemas\n\t\t\t\twhile ((fieldSchema as any)._def?.innerType) {\n\t\t\t\t\tfieldSchema = (fieldSchema as any)._def.innerType;\n\t\t\t\t}\n\n\t\t\t\tfieldSchema = (fieldSchema as any).shape?.[k] ?? (fieldSchema as any)[k];\n\t\t\t}\n\n\t\t\tif (!fieldSchema) return undefined;\n\n\t\t\tlet innerSchema = fieldSchema;\n\t\t\twhile ((innerSchema as any)._def?.innerType) {\n\t\t\t\tinnerSchema = (innerSchema as any)._def.innerType;\n\t\t\t}\n\n\t\t\tif ((innerSchema as any)._def?.typeName === \"ZodArray\") {\n\t\t\t\tconst elementType = ((innerSchema as ZodArray<any>)._def as any).type;\n\t\t\t\tif ((elementType as any)._def?.typeName === \"ZodNumber\") {\n\t\t\t\t\treturn \"number\";\n\t\t\t\t}\n\t\t\t\tif ((elementType as any)._def?.typeName === \"ZodString\") {\n\t\t\t\t\treturn \"string\";\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(`Failed to infer array item type for key ${key}:`, error);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\taddToggle(containerEl: HTMLElement, config: BaseSettingConfig): void {\n\t\tconst { key, name, desc } = config;\n\t\tconst value = this.getNestedValue(key);\n\n\t\tnew Setting(containerEl)\n\t\t\t.setName(name)\n\t\t\t.setDesc(desc)\n\t\t\t.addToggle((toggle) =>\n\t\t\t\ttoggle.setValue(Boolean(value)).onChange(async (newValue) => {\n\t\t\t\t\tawait this.updateSetting(key, newValue);\n\t\t\t\t})\n\t\t\t);\n\t}\n\n\taddSlider(containerEl: HTMLElement, config: SliderSettingConfig): void {\n\t\tconst { key, name, desc, step = 1, commitOnChange = false } = config;\n\t\tconst value = this.getNestedValue(key);\n\n\t\tconst inferredBounds = this.inferSliderBounds(key);\n\t\tconst min = config.min ?? inferredBounds.min ?? 0;\n\t\tconst max = config.max ?? inferredBounds.max ?? 100;\n\n\t\tnew Setting(containerEl)\n\t\t\t.setName(name)\n\t\t\t.setDesc(desc)\n\t\t\t.addSlider((slider) => {\n\t\t\t\tslider.setLimits(min, max, step).setValue(Number(value)).setDynamicTooltip();\n\n\t\t\t\tif (commitOnChange) {\n\t\t\t\t\t// Reactive: commit on every change\n\t\t\t\t\tslider.onChange(async (newValue) => {\n\t\t\t\t\t\tawait this.updateSetting(key, newValue);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Commit only when user finishes dragging\n\t\t\t\t\tconst commit = async (newValue: number) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait this.updateSetting(key, newValue);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tnew Notice(`Invalid input: ${error}`, 5000);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\t// Update tooltip during drag for visual feedback\n\t\t\t\t\tslider.onChange((newValue) => {\n\t\t\t\t\t\tslider.sliderEl.setAttribute(\"aria-valuenow\", String(newValue));\n\t\t\t\t\t});\n\n\t\t\t\t\t// Commit on mouse up\n\t\t\t\t\tslider.sliderEl.addEventListener(\"mouseup\", () => {\n\t\t\t\t\t\tvoid commit(Number(slider.sliderEl.value));\n\t\t\t\t\t});\n\n\t\t\t\t\t// Commit on keyboard navigation\n\t\t\t\t\tslider.sliderEl.addEventListener(\"keyup\", (e: KeyboardEvent) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t[\"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\", \"Home\", \"End\"].includes(e.key)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tvoid commit(Number(slider.sliderEl.value));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn slider;\n\t\t\t});\n\t}\n\n\taddText(containerEl: HTMLElement, config: TextSettingConfig): void {\n\t\tconst { key, name, desc, placeholder = \"\", commitOnChange = false } = config;\n\t\tconst value = this.getNestedValue(key);\n\n\t\tnew Setting(containerEl)\n\t\t\t.setName(name)\n\t\t\t.setDesc(desc)\n\t\t\t.addText((text) => {\n\t\t\t\ttext.setPlaceholder(placeholder);\n\t\t\t\ttext.setValue(String(value ?? \"\"));\n\n\t\t\t\tif (commitOnChange) {\n\t\t\t\t\t// Reactive: commit on every change\n\t\t\t\t\ttext.onChange(async (newValue) => {\n\t\t\t\t\t\tawait this.updateSetting(key, newValue);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Commit only on blur or Ctrl/Cmd+Enter\n\t\t\t\t\tconst commit = async (inputValue: string) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait this.updateSetting(key, inputValue);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tnew Notice(`Invalid input: ${error}`, 5000);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\ttext.inputEl.addEventListener(\"blur\", () => void commit(text.inputEl.value));\n\t\t\t\t\ttext.inputEl.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n\t\t\t\t\t\tif (e.key === \"Enter\" && (e.ctrlKey || e.metaKey)) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tvoid commit(text.inputEl.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\taddDropdown(containerEl: HTMLElement, config: DropdownSettingConfig): void {\n\t\tconst { key, name, desc, options } = config;\n\t\tconst value = this.getNestedValue(key);\n\n\t\tnew Setting(containerEl)\n\t\t\t.setName(name)\n\t\t\t.setDesc(desc)\n\t\t\t.addDropdown((dropdown) =>\n\t\t\t\tdropdown\n\t\t\t\t\t.addOptions(options)\n\t\t\t\t\t.setValue(String(value))\n\t\t\t\t\t.onChange(async (newValue) => {\n\t\t\t\t\t\tawait this.updateSetting(key, newValue);\n\t\t\t\t\t})\n\t\t\t);\n\t}\n\n\taddTextArray<T = string>(containerEl: HTMLElement, config: ArraySettingConfig<T>): void {\n\t\tconst {\n\t\t\tkey,\n\t\t\tname,\n\t\t\tdesc,\n\t\t\tplaceholder = \"\",\n\t\t\tarrayDelimiter = \", \",\n\t\t\tmultiline = false,\n\t\t\tcommitOnChange = false,\n\t\t} = config;\n\t\tconst value = this.getNestedValue(key) as T[];\n\n\t\tconst inferredItemType = config.itemType ?? this.inferArrayItemType(key) ?? \"string\";\n\t\tconst parser =\n\t\t\tconfig.parser ??\n\t\t\t((input: string) => {\n\t\t\t\tif (inferredItemType === \"number\") {\n\t\t\t\t\tconst num = Number(input);\n\t\t\t\t\tif (Number.isNaN(num)) {\n\t\t\t\t\t\tthrow new Error(`Invalid number: ${input}`);\n\t\t\t\t\t}\n\t\t\t\t\treturn num as T;\n\t\t\t\t}\n\t\t\t\treturn input as T;\n\t\t\t});\n\n\t\tconst validator = config.validator ?? ((_item: T) => true);\n\n\t\tconst setting = new Setting(containerEl).setName(name).setDesc(desc);\n\n\t\tif (multiline) {\n\t\t\tsetting.addTextArea((text) => {\n\t\t\t\ttext.setPlaceholder(placeholder);\n\t\t\t\ttext.setValue(Array.isArray(value) ? value.join(\"\\n\") : \"\");\n\n\t\t\t\tconst commit = async (inputValue: string) => {\n\t\t\t\t\tconst lines = inputValue\n\t\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t\t.map((s) => s.trim())\n\t\t\t\t\t\t.filter((s) => s.length > 0);\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst items = lines.map(parser).filter(validator);\n\t\t\t\t\t\tawait this.updateSetting(key, items);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tnew Notice(`Invalid input: ${error}`, 5000);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tif (commitOnChange) {\n\t\t\t\t\t// Reactive: commit on every change\n\t\t\t\t\ttext.onChange(async (inputValue) => {\n\t\t\t\t\t\tawait commit(inputValue);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Commit only on blur or Ctrl/Cmd+Enter\n\t\t\t\t\ttext.inputEl.addEventListener(\"blur\", () => void commit(text.inputEl.value));\n\t\t\t\t\ttext.inputEl.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n\t\t\t\t\t\tif (e.key === \"Enter\" && (e.ctrlKey || e.metaKey)) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tvoid commit(text.inputEl.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\ttext.inputEl.rows = 5;\n\t\t\t\ttext.inputEl.classList.add(\"settings-ui-builder-textarea\");\n\t\t\t});\n\t\t} else {\n\t\t\tsetting.addText((text) => {\n\t\t\t\ttext.setPlaceholder(placeholder);\n\t\t\t\ttext.setValue(Array.isArray(value) ? value.join(arrayDelimiter) : \"\");\n\n\t\t\t\tconst commit = async (inputValue: string) => {\n\t\t\t\t\tconst tokens = inputValue\n\t\t\t\t\t\t.split(\",\")\n\t\t\t\t\t\t.map((s) => s.trim())\n\t\t\t\t\t\t.filter((s) => s.length > 0);\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst items = tokens.map(parser).filter(validator);\n\t\t\t\t\t\tawait this.updateSetting(key, items);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tnew Notice(`Invalid input: ${error}`, 5000);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tif (commitOnChange) {\n\t\t\t\t\t// Reactive: commit on every change\n\t\t\t\t\ttext.onChange(async (inputValue) => {\n\t\t\t\t\t\tawait commit(inputValue);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Commit only on blur or Ctrl/Cmd+Enter\n\t\t\t\t\ttext.inputEl.addEventListener(\"blur\", () => void commit(text.inputEl.value));\n\t\t\t\t\ttext.inputEl.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n\t\t\t\t\t\tif (e.key === \"Enter\" && (e.ctrlKey || e.metaKey)) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tvoid commit(text.inputEl.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Advanced array manager with add/remove buttons for each item\n\t */\n\taddArrayManager(containerEl: HTMLElement, config: ArrayManagerConfig): void {\n\t\tconst {\n\t\t\tkey,\n\t\t\tname,\n\t\t\tdesc,\n\t\t\tplaceholder = \"\",\n\t\t\taddButtonText = \"Add\",\n\t\t\tremoveButtonText = \"Remove\",\n\t\t\temptyArrayFallback = [],\n\t\t\tpreventEmpty = false,\n\t\t\titemDescriptionFn,\n\t\t\tonBeforeAdd,\n\t\t\tonBeforeRemove,\n\t\t\tquickActions = [],\n\t\t} = config;\n\n\t\t// Section heading\n\t\tnew Setting(containerEl).setName(name).setHeading();\n\n\t\t// Description\n\t\tif (desc) {\n\t\t\tconst descEl = containerEl.createDiv(\"setting-item-description\");\n\t\t\tdescEl.setText(desc);\n\t\t}\n\n\t\t// Container for list items\n\t\tconst listContainer = containerEl.createDiv(\"settings-array-manager-list\");\n\n\t\tconst render = () => {\n\t\t\tlistContainer.empty();\n\n\t\t\tconst currentItems = (this.getNestedValue(key) as unknown[]) ?? [];\n\n\t\t\tfor (const item of currentItems) {\n\t\t\t\tconst itemSetting = new Setting(listContainer).setName(String(item)).addButton((button) =>\n\t\t\t\t\tbutton\n\t\t\t\t\t\t.setButtonText(removeButtonText)\n\t\t\t\t\t\t.setWarning()\n\t\t\t\t\t\t.onClick(async () => {\n\t\t\t\t\t\t\tlet newItems = currentItems.filter((i) => i !== item);\n\n\t\t\t\t\t\t\t// Apply custom logic before removal\n\t\t\t\t\t\t\tif (onBeforeRemove) {\n\t\t\t\t\t\t\t\tnewItems = await onBeforeRemove(item, currentItems);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Prevent empty array if configured\n\t\t\t\t\t\t\tif (preventEmpty && newItems.length === 0) {\n\t\t\t\t\t\t\t\tnewItems = Array.isArray(emptyArrayFallback)\n\t\t\t\t\t\t\t\t\t? emptyArrayFallback\n\t\t\t\t\t\t\t\t\t: [emptyArrayFallback];\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tawait this.updateSetting(key, newItems);\n\t\t\t\t\t\t\trender();\n\t\t\t\t\t\t})\n\t\t\t\t);\n\n\t\t\t\t// Add custom description for each item if provided\n\t\t\t\tif (itemDescriptionFn) {\n\t\t\t\t\titemSetting.setDesc(itemDescriptionFn(item));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\trender();\n\n\t\t// Add new item section\n\t\tconst inputId = `settings-array-manager-input-${key}`;\n\t\tnew Setting(containerEl)\n\t\t\t.setName(`Add ${name.toLowerCase()}`)\n\t\t\t.setDesc(`Enter a new value`)\n\t\t\t.addText((text) => {\n\t\t\t\ttext.setPlaceholder(placeholder);\n\t\t\t\ttext.inputEl.id = inputId;\n\t\t\t})\n\t\t\t.addButton((button) =>\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(addButtonText)\n\t\t\t\t\t.setCta()\n\t\t\t\t\t.onClick(async () => {\n\t\t\t\t\t\t// Use document.getElementById instead of querySelector to avoid CSS selector issues with dots\n\t\t\t\t\t\tconst input = document.getElementById(inputId) as HTMLInputElement;\n\t\t\t\t\t\tif (!input) {\n\t\t\t\t\t\t\tconsole.error(`Input element not found: ${inputId}`);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst newItem = input.value.trim();\n\n\t\t\t\t\t\tif (!newItem) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst currentItems = (this.getNestedValue(key) as unknown[]) ?? [];\n\t\t\t\t\t\tlet newItems = [...currentItems];\n\n\t\t\t\t\t\t// Apply custom logic before adding\n\t\t\t\t\t\tif (onBeforeAdd) {\n\t\t\t\t\t\t\tnewItems = await onBeforeAdd(newItem, currentItems);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Default behavior: add if not exists\n\t\t\t\t\t\t\tif (!newItems.includes(newItem)) {\n\t\t\t\t\t\t\t\tnewItems.push(newItem);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait this.updateSetting(key, newItems);\n\t\t\t\t\t\tinput.value = \"\";\n\t\t\t\t\t\trender();\n\t\t\t\t\t})\n\t\t\t);\n\n\t\t// Quick actions\n\t\tfor (const quickAction of quickActions) {\n\t\t\tconst currentItems = (this.getNestedValue(key) as unknown[]) ?? [];\n\n\t\t\t// Check condition if provided\n\t\t\tif (quickAction.condition && !quickAction.condition(currentItems)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tnew Setting(containerEl)\n\t\t\t\t.setName(quickAction.name)\n\t\t\t\t.setDesc(quickAction.desc)\n\t\t\t\t.addButton((button) =>\n\t\t\t\t\tbutton.setButtonText(quickAction.buttonText).onClick(async () => {\n\t\t\t\t\t\tconst currentItems = (this.getNestedValue(key) as unknown[]) ?? [];\n\t\t\t\t\t\tconst newItems = await quickAction.action(currentItems);\n\t\t\t\t\t\tawait this.updateSetting(key, newItems);\n\t\t\t\t\t\trender();\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t}\n\t}\n}\n"]}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
interface VersionSection {
|
|
2
|
-
version: string;
|
|
3
|
-
content: string;
|
|
4
|
-
}
|
|
5
|
-
/**
|
|
6
|
-
* Parses changelog markdown content into version sections.
|
|
7
|
-
* Each section starts with "## X.Y.Z" heading.
|
|
8
|
-
*/
|
|
9
|
-
export declare function parseChangelog(changelogContent: string): VersionSection[];
|
|
10
|
-
/**
|
|
11
|
-
* Gets all changelog sections between fromVersion (exclusive) and toVersion (inclusive).
|
|
12
|
-
* Sections are returned in reverse chronological order (newest first).
|
|
13
|
-
*/
|
|
14
|
-
export declare function getChangelogSince(changelogContent: string, fromVersion: string, toVersion: string): VersionSection[];
|
|
15
|
-
export declare function formatChangelogSections(sections: VersionSection[]): string;
|
|
16
|
-
export type { VersionSection };
|
|
17
|
-
//# sourceMappingURL=changelog-parser.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"changelog-parser.d.ts","sourceRoot":"","sources":["../../src/string/changelog-parser.ts"],"names":[],"mappings":"AAAA,UAAU,cAAc;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,gBAAgB,EAAE,MAAM,GAAG,cAAc,EAAE,CAiCzE;AAyBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAChC,gBAAgB,EAAE,MAAM,EACxB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GACf,cAAc,EAAE,CAQlB;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAY1E;AAED,YAAY,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Parses changelog markdown content into version sections.
|
|
3
|
-
* Each section starts with "## X.Y.Z" heading.
|
|
4
|
-
*/
|
|
5
|
-
export function parseChangelog(changelogContent) {
|
|
6
|
-
const sections = [];
|
|
7
|
-
const lines = changelogContent.split("\n");
|
|
8
|
-
let currentVersion = null;
|
|
9
|
-
let currentContent = [];
|
|
10
|
-
for (const line of lines) {
|
|
11
|
-
const versionMatch = line.match(/^##\s+(\d+\.\d+\.\d+)/);
|
|
12
|
-
if (versionMatch) {
|
|
13
|
-
if (currentVersion !== null) {
|
|
14
|
-
sections.push({
|
|
15
|
-
version: currentVersion,
|
|
16
|
-
content: currentContent.join("\n").trim(),
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
currentVersion = versionMatch[1];
|
|
20
|
-
currentContent = [];
|
|
21
|
-
}
|
|
22
|
-
else if (currentVersion !== null) {
|
|
23
|
-
currentContent.push(line);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
if (currentVersion !== null && currentContent.length > 0) {
|
|
27
|
-
sections.push({
|
|
28
|
-
version: currentVersion,
|
|
29
|
-
content: currentContent.join("\n").trim(),
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
return sections;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Compares two semantic version strings.
|
|
36
|
-
* Returns:
|
|
37
|
-
* - negative if v1 < v2
|
|
38
|
-
* - 0 if v1 === v2
|
|
39
|
-
* - positive if v1 > v2
|
|
40
|
-
*/
|
|
41
|
-
function compareVersions(v1, v2) {
|
|
42
|
-
const parts1 = v1.split(".").map(Number);
|
|
43
|
-
const parts2 = v2.split(".").map(Number);
|
|
44
|
-
for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
|
|
45
|
-
const num1 = parts1[i] || 0;
|
|
46
|
-
const num2 = parts2[i] || 0;
|
|
47
|
-
if (num1 !== num2) {
|
|
48
|
-
return num1 - num2;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return 0;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Gets all changelog sections between fromVersion (exclusive) and toVersion (inclusive).
|
|
55
|
-
* Sections are returned in reverse chronological order (newest first).
|
|
56
|
-
*/
|
|
57
|
-
export function getChangelogSince(changelogContent, fromVersion, toVersion) {
|
|
58
|
-
const allSections = parseChangelog(changelogContent);
|
|
59
|
-
return allSections.filter((section) => {
|
|
60
|
-
const isAfterFrom = compareVersions(section.version, fromVersion) > 0;
|
|
61
|
-
const isBeforeOrEqualTo = compareVersions(section.version, toVersion) <= 0;
|
|
62
|
-
return isAfterFrom && isBeforeOrEqualTo;
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
export function formatChangelogSections(sections) {
|
|
66
|
-
if (sections.length === 0) {
|
|
67
|
-
return "No changes found.";
|
|
68
|
-
}
|
|
69
|
-
return sections
|
|
70
|
-
.map((section) => {
|
|
71
|
-
// Escape Dataview inline queries to prevent parsing errors
|
|
72
|
-
const content = section.content.replace(/`=([^`]+)`/g, "`\\=$1`");
|
|
73
|
-
return `## ${section.version}\n\n${content}`;
|
|
74
|
-
})
|
|
75
|
-
.join("\n\n");
|
|
76
|
-
}
|
|
77
|
-
//# sourceMappingURL=changelog-parser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"changelog-parser.js","sourceRoot":"","sources":["../../src/string/changelog-parser.ts"],"names":[],"mappings":"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","sourcesContent":["interface VersionSection {\n\tversion: string;\n\tcontent: string;\n}\n\n/**\n * Parses changelog markdown content into version sections.\n * Each section starts with \"## X.Y.Z\" heading.\n */\nexport function parseChangelog(changelogContent: string): VersionSection[] {\n\tconst sections: VersionSection[] = [];\n\tconst lines = changelogContent.split(\"\\n\");\n\n\tlet currentVersion: string | null = null;\n\tlet currentContent: string[] = [];\n\n\tfor (const line of lines) {\n\t\tconst versionMatch = line.match(/^##\\s+(\\d+\\.\\d+\\.\\d+)/);\n\n\t\tif (versionMatch) {\n\t\t\tif (currentVersion !== null) {\n\t\t\t\tsections.push({\n\t\t\t\t\tversion: currentVersion,\n\t\t\t\t\tcontent: currentContent.join(\"\\n\").trim(),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tcurrentVersion = versionMatch[1];\n\t\t\tcurrentContent = [];\n\t\t} else if (currentVersion !== null) {\n\t\t\tcurrentContent.push(line);\n\t\t}\n\t}\n\n\tif (currentVersion !== null && currentContent.length > 0) {\n\t\tsections.push({\n\t\t\tversion: currentVersion,\n\t\t\tcontent: currentContent.join(\"\\n\").trim(),\n\t\t});\n\t}\n\n\treturn sections;\n}\n\n/**\n * Compares two semantic version strings.\n * Returns:\n * - negative if v1 < v2\n * - 0 if v1 === v2\n * - positive if v1 > v2\n */\nfunction compareVersions(v1: string, v2: string): number {\n\tconst parts1 = v1.split(\".\").map(Number);\n\tconst parts2 = v2.split(\".\").map(Number);\n\n\tfor (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {\n\t\tconst num1 = parts1[i] || 0;\n\t\tconst num2 = parts2[i] || 0;\n\n\t\tif (num1 !== num2) {\n\t\t\treturn num1 - num2;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n/**\n * Gets all changelog sections between fromVersion (exclusive) and toVersion (inclusive).\n * Sections are returned in reverse chronological order (newest first).\n */\nexport function getChangelogSince(\n\tchangelogContent: string,\n\tfromVersion: string,\n\ttoVersion: string\n): VersionSection[] {\n\tconst allSections = parseChangelog(changelogContent);\n\n\treturn allSections.filter((section) => {\n\t\tconst isAfterFrom = compareVersions(section.version, fromVersion) > 0;\n\t\tconst isBeforeOrEqualTo = compareVersions(section.version, toVersion) <= 0;\n\t\treturn isAfterFrom && isBeforeOrEqualTo;\n\t});\n}\n\nexport function formatChangelogSections(sections: VersionSection[]): string {\n\tif (sections.length === 0) {\n\t\treturn \"No changes found.\";\n\t}\n\n\treturn sections\n\t\t.map((section) => {\n\t\t\t// Escape Dataview inline queries to prevent parsing errors\n\t\t\tconst content = section.content.replace(/`=([^`]+)`/g, \"`\\\\=$1`\");\n\t\t\treturn `## ${section.version}\\n\\n${content}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nexport type { VersionSection };\n"]}
|