@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.
Files changed (236) hide show
  1. package/package.json +1 -1
  2. package/src/core/history.ts +45 -0
  3. package/src/core/index.ts +1 -0
  4. package/src/settings/settings-ui-builder.ts +0 -1
  5. package/dist/async/async.d.ts +0 -69
  6. package/dist/async/async.d.ts.map +0 -1
  7. package/dist/async/async.js +0 -108
  8. package/dist/async/async.js.map +0 -1
  9. package/dist/async/batch-operations.d.ts +0 -21
  10. package/dist/async/batch-operations.d.ts.map +0 -1
  11. package/dist/async/batch-operations.js +0 -60
  12. package/dist/async/batch-operations.js.map +0 -1
  13. package/dist/async/change-notifier.d.ts +0 -13
  14. package/dist/async/change-notifier.d.ts.map +0 -1
  15. package/dist/async/change-notifier.js +0 -26
  16. package/dist/async/change-notifier.js.map +0 -1
  17. package/dist/async/debounced-notifier.d.ts +0 -26
  18. package/dist/async/debounced-notifier.d.ts.map +0 -1
  19. package/dist/async/debounced-notifier.js +0 -50
  20. package/dist/async/debounced-notifier.js.map +0 -1
  21. package/dist/async/index.d.ts +0 -5
  22. package/dist/async/index.d.ts.map +0 -1
  23. package/dist/async/index.js +0 -5
  24. package/dist/async/index.js.map +0 -1
  25. package/dist/components/frontmatter-propagation-modal.d.ts +0 -17
  26. package/dist/components/frontmatter-propagation-modal.d.ts.map +0 -1
  27. package/dist/components/frontmatter-propagation-modal.js +0 -85
  28. package/dist/components/frontmatter-propagation-modal.js.map +0 -1
  29. package/dist/components/index.d.ts +0 -5
  30. package/dist/components/index.d.ts.map +0 -1
  31. package/dist/components/index.js +0 -5
  32. package/dist/components/index.js.map +0 -1
  33. package/dist/components/input-managers/base.d.ts +0 -30
  34. package/dist/components/input-managers/base.d.ts.map +0 -1
  35. package/dist/components/input-managers/base.js +0 -115
  36. package/dist/components/input-managers/base.js.map +0 -1
  37. package/dist/components/input-managers/expression.d.ts +0 -12
  38. package/dist/components/input-managers/expression.d.ts.map +0 -1
  39. package/dist/components/input-managers/expression.js +0 -56
  40. package/dist/components/input-managers/expression.js.map +0 -1
  41. package/dist/components/input-managers/index.d.ts +0 -4
  42. package/dist/components/input-managers/index.d.ts.map +0 -1
  43. package/dist/components/input-managers/index.js +0 -4
  44. package/dist/components/input-managers/index.js.map +0 -1
  45. package/dist/components/input-managers/search.d.ts +0 -6
  46. package/dist/components/input-managers/search.d.ts.map +0 -1
  47. package/dist/components/input-managers/search.js +0 -16
  48. package/dist/components/input-managers/search.js.map +0 -1
  49. package/dist/components/registered-events-component.d.ts +0 -30
  50. package/dist/components/registered-events-component.d.ts.map +0 -1
  51. package/dist/components/registered-events-component.js +0 -43
  52. package/dist/components/registered-events-component.js.map +0 -1
  53. package/dist/components/whats-new-modal.d.ts +0 -64
  54. package/dist/components/whats-new-modal.d.ts.map +0 -1
  55. package/dist/components/whats-new-modal.js +0 -139
  56. package/dist/components/whats-new-modal.js.map +0 -1
  57. package/dist/core/color-utils.d.ts +0 -17
  58. package/dist/core/color-utils.d.ts.map +0 -1
  59. package/dist/core/color-utils.js +0 -29
  60. package/dist/core/color-utils.js.map +0 -1
  61. package/dist/core/css-utils.d.ts +0 -39
  62. package/dist/core/css-utils.d.ts.map +0 -1
  63. package/dist/core/css-utils.js +0 -60
  64. package/dist/core/css-utils.js.map +0 -1
  65. package/dist/core/evaluator/base.d.ts +0 -22
  66. package/dist/core/evaluator/base.d.ts.map +0 -1
  67. package/dist/core/evaluator/base.js +0 -67
  68. package/dist/core/evaluator/base.js.map +0 -1
  69. package/dist/core/evaluator/color.d.ts +0 -19
  70. package/dist/core/evaluator/color.d.ts.map +0 -1
  71. package/dist/core/evaluator/color.js +0 -25
  72. package/dist/core/evaluator/color.js.map +0 -1
  73. package/dist/core/evaluator/excluded.d.ts +0 -32
  74. package/dist/core/evaluator/excluded.d.ts.map +0 -1
  75. package/dist/core/evaluator/excluded.js +0 -41
  76. package/dist/core/evaluator/excluded.js.map +0 -1
  77. package/dist/core/evaluator/filter.d.ts +0 -15
  78. package/dist/core/evaluator/filter.d.ts.map +0 -1
  79. package/dist/core/evaluator/filter.js +0 -27
  80. package/dist/core/evaluator/filter.js.map +0 -1
  81. package/dist/core/evaluator/included.d.ts +0 -36
  82. package/dist/core/evaluator/included.d.ts.map +0 -1
  83. package/dist/core/evaluator/included.js +0 -51
  84. package/dist/core/evaluator/included.js.map +0 -1
  85. package/dist/core/evaluator/index.d.ts +0 -6
  86. package/dist/core/evaluator/index.d.ts.map +0 -1
  87. package/dist/core/evaluator/index.js +0 -6
  88. package/dist/core/evaluator/index.js.map +0 -1
  89. package/dist/core/expression-utils.d.ts +0 -17
  90. package/dist/core/expression-utils.d.ts.map +0 -1
  91. package/dist/core/expression-utils.js +0 -40
  92. package/dist/core/expression-utils.js.map +0 -1
  93. package/dist/core/frontmatter-value.d.ts +0 -157
  94. package/dist/core/frontmatter-value.d.ts.map +0 -1
  95. package/dist/core/frontmatter-value.js +0 -417
  96. package/dist/core/frontmatter-value.js.map +0 -1
  97. package/dist/core/generate.d.ts +0 -7
  98. package/dist/core/generate.d.ts.map +0 -1
  99. package/dist/core/generate.js +0 -13
  100. package/dist/core/generate.js.map +0 -1
  101. package/dist/core/index.d.ts +0 -10
  102. package/dist/core/index.d.ts.map +0 -1
  103. package/dist/core/index.js +0 -10
  104. package/dist/core/index.js.map +0 -1
  105. package/dist/core/indexer.d.ts +0 -109
  106. package/dist/core/indexer.d.ts.map +0 -1
  107. package/dist/core/indexer.js +0 -185
  108. package/dist/core/indexer.js.map +0 -1
  109. package/dist/core/property-renderer.d.ts +0 -9
  110. package/dist/core/property-renderer.d.ts.map +0 -1
  111. package/dist/core/property-renderer.js +0 -42
  112. package/dist/core/property-renderer.js.map +0 -1
  113. package/dist/core/validation.d.ts +0 -13
  114. package/dist/core/validation.d.ts.map +0 -1
  115. package/dist/core/validation.js +0 -27
  116. package/dist/core/validation.js.map +0 -1
  117. package/dist/date/date-recurrence.d.ts +0 -30
  118. package/dist/date/date-recurrence.d.ts.map +0 -1
  119. package/dist/date/date-recurrence.js +0 -188
  120. package/dist/date/date-recurrence.js.map +0 -1
  121. package/dist/date/date.d.ts +0 -21
  122. package/dist/date/date.d.ts.map +0 -1
  123. package/dist/date/date.js +0 -105
  124. package/dist/date/date.js.map +0 -1
  125. package/dist/date/index.d.ts +0 -3
  126. package/dist/date/index.d.ts.map +0 -1
  127. package/dist/date/index.js +0 -3
  128. package/dist/date/index.js.map +0 -1
  129. package/dist/file/child-reference.d.ts +0 -9
  130. package/dist/file/child-reference.d.ts.map +0 -1
  131. package/dist/file/child-reference.js +0 -57
  132. package/dist/file/child-reference.js.map +0 -1
  133. package/dist/file/file-operations.d.ts +0 -31
  134. package/dist/file/file-operations.d.ts.map +0 -1
  135. package/dist/file/file-operations.js +0 -160
  136. package/dist/file/file-operations.js.map +0 -1
  137. package/dist/file/file-utils.d.ts +0 -33
  138. package/dist/file/file-utils.d.ts.map +0 -1
  139. package/dist/file/file-utils.js +0 -76
  140. package/dist/file/file-utils.js.map +0 -1
  141. package/dist/file/file.d.ts +0 -332
  142. package/dist/file/file.d.ts.map +0 -1
  143. package/dist/file/file.js +0 -559
  144. package/dist/file/file.js.map +0 -1
  145. package/dist/file/frontmatter-diff.d.ts +0 -38
  146. package/dist/file/frontmatter-diff.d.ts.map +0 -1
  147. package/dist/file/frontmatter-diff.js +0 -162
  148. package/dist/file/frontmatter-diff.js.map +0 -1
  149. package/dist/file/frontmatter-propagation.d.ts +0 -4
  150. package/dist/file/frontmatter-propagation.d.ts.map +0 -1
  151. package/dist/file/frontmatter-propagation.js +0 -28
  152. package/dist/file/frontmatter-propagation.js.map +0 -1
  153. package/dist/file/frontmatter-serialization.d.ts +0 -21
  154. package/dist/file/frontmatter-serialization.d.ts.map +0 -1
  155. package/dist/file/frontmatter-serialization.js +0 -57
  156. package/dist/file/frontmatter-serialization.js.map +0 -1
  157. package/dist/file/frontmatter.d.ts +0 -15
  158. package/dist/file/frontmatter.d.ts.map +0 -1
  159. package/dist/file/frontmatter.js +0 -68
  160. package/dist/file/frontmatter.js.map +0 -1
  161. package/dist/file/index.d.ts +0 -13
  162. package/dist/file/index.d.ts.map +0 -1
  163. package/dist/file/index.js +0 -13
  164. package/dist/file/index.js.map +0 -1
  165. package/dist/file/link-parser.d.ts +0 -63
  166. package/dist/file/link-parser.d.ts.map +0 -1
  167. package/dist/file/link-parser.js +0 -137
  168. package/dist/file/link-parser.js.map +0 -1
  169. package/dist/file/property-utils.d.ts +0 -55
  170. package/dist/file/property-utils.d.ts.map +0 -1
  171. package/dist/file/property-utils.js +0 -90
  172. package/dist/file/property-utils.js.map +0 -1
  173. package/dist/file/templater-service.d.ts +0 -16
  174. package/dist/file/templater-service.d.ts.map +0 -1
  175. package/dist/file/templater-service.js +0 -37
  176. package/dist/file/templater-service.js.map +0 -1
  177. package/dist/file/templater.d.ts +0 -28
  178. package/dist/file/templater.d.ts.map +0 -1
  179. package/dist/file/templater.js +0 -126
  180. package/dist/file/templater.js.map +0 -1
  181. package/dist/index.d.ts +0 -9
  182. package/dist/index.d.ts.map +0 -1
  183. package/dist/index.js +0 -17
  184. package/dist/index.js.map +0 -1
  185. package/dist/inputs/index.d.ts +0 -2
  186. package/dist/inputs/index.d.ts.map +0 -1
  187. package/dist/inputs/index.js +0 -2
  188. package/dist/inputs/index.js.map +0 -1
  189. package/dist/inputs/input-filter-manager.d.ts +0 -72
  190. package/dist/inputs/input-filter-manager.d.ts.map +0 -1
  191. package/dist/inputs/input-filter-manager.js +0 -140
  192. package/dist/inputs/input-filter-manager.js.map +0 -1
  193. package/dist/settings/index.d.ts +0 -3
  194. package/dist/settings/index.d.ts.map +0 -1
  195. package/dist/settings/index.js +0 -3
  196. package/dist/settings/index.js.map +0 -1
  197. package/dist/settings/settings-store.d.ts +0 -20
  198. package/dist/settings/settings-store.d.ts.map +0 -1
  199. package/dist/settings/settings-store.js +0 -82
  200. package/dist/settings/settings-store.js.map +0 -1
  201. package/dist/settings/settings-ui-builder.d.ts +0 -74
  202. package/dist/settings/settings-ui-builder.d.ts.map +0 -1
  203. package/dist/settings/settings-ui-builder.js +0 -437
  204. package/dist/settings/settings-ui-builder.js.map +0 -1
  205. package/dist/string/changelog-parser.d.ts +0 -17
  206. package/dist/string/changelog-parser.d.ts.map +0 -1
  207. package/dist/string/changelog-parser.js +0 -77
  208. package/dist/string/changelog-parser.js.map +0 -1
  209. package/dist/string/filename-utils.d.ts +0 -46
  210. package/dist/string/filename-utils.d.ts.map +0 -1
  211. package/dist/string/filename-utils.js +0 -65
  212. package/dist/string/filename-utils.js.map +0 -1
  213. package/dist/string/index.d.ts +0 -4
  214. package/dist/string/index.d.ts.map +0 -1
  215. package/dist/string/index.js +0 -4
  216. package/dist/string/index.js.map +0 -1
  217. package/dist/string/string.d.ts +0 -5
  218. package/dist/string/string.d.ts.map +0 -1
  219. package/dist/string/string.js +0 -25
  220. package/dist/string/string.js.map +0 -1
  221. package/dist/testing/index.d.ts +0 -5
  222. package/dist/testing/index.d.ts.map +0 -1
  223. package/dist/testing/index.js +0 -6
  224. package/dist/testing/index.js.map +0 -1
  225. package/dist/testing/mocks/obsidian.d.ts +0 -150
  226. package/dist/testing/mocks/obsidian.d.ts.map +0 -1
  227. package/dist/testing/mocks/obsidian.js +0 -226
  228. package/dist/testing/mocks/obsidian.js.map +0 -1
  229. package/dist/testing/mocks/utils.d.ts +0 -14
  230. package/dist/testing/mocks/utils.d.ts.map +0 -1
  231. package/dist/testing/mocks/utils.js +0 -85
  232. package/dist/testing/mocks/utils.js.map +0 -1
  233. package/dist/testing/setup.d.ts +0 -2
  234. package/dist/testing/setup.d.ts.map +0 -1
  235. package/dist/testing/setup.js +0 -18
  236. 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"]}