@real1ty-obsidian-plugins/utils 2.2.2 → 2.3.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/README.md +29 -9
- package/dist/{async-utils.d.ts → async/async.d.ts} +1 -1
- package/dist/async/async.d.ts.map +1 -0
- package/dist/{async-utils.js → async/async.js} +1 -1
- package/dist/async/async.js.map +1 -0
- package/dist/async/batch-operations.d.ts.map +1 -0
- package/dist/async/batch-operations.js.map +1 -0
- package/dist/async/index.d.ts +3 -0
- package/dist/async/index.d.ts.map +1 -0
- package/dist/async/index.js +3 -0
- package/dist/async/index.js.map +1 -0
- package/dist/core/evaluator-base.d.ts.map +1 -0
- package/dist/core/evaluator-base.js.map +1 -0
- package/dist/core/generate.d.ts.map +1 -0
- package/dist/core/generate.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/{date-recurrence-utils.d.ts → date/date-recurrence.d.ts} +1 -1
- package/dist/date/date-recurrence.d.ts.map +1 -0
- package/dist/{date-recurrence-utils.js → date/date-recurrence.js} +1 -1
- package/dist/date/date-recurrence.js.map +1 -0
- package/dist/{date-utils.d.ts → date/date.d.ts} +1 -1
- package/dist/date/date.d.ts.map +1 -0
- package/dist/{date-utils.js → date/date.js} +1 -1
- package/dist/date/date.js.map +1 -0
- package/dist/date/index.d.ts +3 -0
- package/dist/date/index.d.ts.map +1 -0
- package/dist/date/index.js +3 -0
- package/dist/date/index.js.map +1 -0
- package/dist/{child-reference-utils.d.ts → file/child-reference.d.ts} +1 -1
- package/dist/file/child-reference.d.ts.map +1 -0
- package/dist/{child-reference-utils.js → file/child-reference.js} +1 -1
- package/dist/file/child-reference.js.map +1 -0
- package/dist/file/file-operations.d.ts.map +1 -0
- package/dist/{file-operations.js → file/file-operations.js} +2 -2
- package/dist/file/file-operations.js.map +1 -0
- package/dist/file/file.d.ts +263 -0
- package/dist/file/file.d.ts.map +1 -0
- package/dist/file/file.js +466 -0
- package/dist/file/file.js.map +1 -0
- package/dist/{frontmatter-utils.d.ts → file/frontmatter.d.ts} +1 -1
- package/dist/file/frontmatter.d.ts.map +1 -0
- package/dist/{frontmatter-utils.js → file/frontmatter.js} +1 -1
- package/dist/file/frontmatter.js.map +1 -0
- package/dist/file/index.d.ts +7 -0
- package/dist/file/index.d.ts.map +1 -0
- package/dist/file/index.js +7 -0
- package/dist/file/index.js.map +1 -0
- package/dist/file/link-parser.d.ts.map +1 -0
- package/dist/file/link-parser.js.map +1 -0
- package/dist/{templater-utils.d.ts → file/templater.d.ts} +1 -1
- package/dist/file/templater.d.ts.map +1 -0
- package/dist/{templater-utils.js → file/templater.js} +1 -1
- package/dist/file/templater.js.map +1 -0
- package/dist/index.d.ts +6 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -15
- package/dist/index.js.map +1 -1
- package/dist/settings/index.d.ts +3 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +3 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/settings-store.d.ts.map +1 -0
- package/dist/settings/settings-store.js.map +1 -0
- package/dist/{settings-ui-builder.d.ts → settings/settings-ui-builder.d.ts} +3 -0
- package/dist/settings/settings-ui-builder.d.ts.map +1 -0
- package/dist/{settings-ui-builder.js → settings/settings-ui-builder.js} +97 -25
- package/dist/settings/settings-ui-builder.js.map +1 -0
- package/dist/string/index.d.ts +2 -0
- package/dist/string/index.d.ts.map +1 -0
- package/dist/string/index.js +2 -0
- package/dist/string/index.js.map +1 -0
- package/dist/{string-utils.d.ts → string/string.d.ts} +1 -1
- package/dist/string/string.d.ts.map +1 -0
- package/dist/{string-utils.js → string/string.js} +1 -1
- package/dist/string/string.js.map +1 -0
- package/dist/testing/mocks/obsidian.d.ts +1 -0
- package/dist/testing/mocks/obsidian.d.ts.map +1 -1
- package/dist/testing/mocks/obsidian.js +6 -0
- package/dist/testing/mocks/obsidian.js.map +1 -1
- package/package.json +1 -1
- package/dist/async-utils.d.ts.map +0 -1
- package/dist/async-utils.js.map +0 -1
- package/dist/batch-operations.d.ts.map +0 -1
- package/dist/batch-operations.js.map +0 -1
- package/dist/child-reference-utils.d.ts.map +0 -1
- package/dist/child-reference-utils.js.map +0 -1
- package/dist/date-recurrence-utils.d.ts.map +0 -1
- package/dist/date-recurrence-utils.js.map +0 -1
- package/dist/date-utils.d.ts.map +0 -1
- package/dist/date-utils.js.map +0 -1
- package/dist/evaluator-base.d.ts.map +0 -1
- package/dist/evaluator-base.js.map +0 -1
- package/dist/file-operations.d.ts.map +0 -1
- package/dist/file-operations.js.map +0 -1
- package/dist/file-utils.d.ts +0 -6
- package/dist/file-utils.d.ts.map +0 -1
- package/dist/file-utils.js +0 -25
- package/dist/file-utils.js.map +0 -1
- package/dist/frontmatter-utils.d.ts.map +0 -1
- package/dist/frontmatter-utils.js.map +0 -1
- package/dist/generate.d.ts.map +0 -1
- package/dist/generate.js.map +0 -1
- package/dist/link-parser.d.ts.map +0 -1
- package/dist/link-parser.js.map +0 -1
- package/dist/settings-store.d.ts.map +0 -1
- package/dist/settings-store.js.map +0 -1
- package/dist/settings-ui-builder.d.ts.map +0 -1
- package/dist/settings-ui-builder.js.map +0 -1
- package/dist/string-utils.d.ts.map +0 -1
- package/dist/string-utils.js.map +0 -1
- package/dist/templater-utils.d.ts.map +0 -1
- package/dist/templater-utils.js.map +0 -1
- /package/dist/{batch-operations.d.ts → async/batch-operations.d.ts} +0 -0
- /package/dist/{batch-operations.js → async/batch-operations.js} +0 -0
- /package/dist/{evaluator-base.d.ts → core/evaluator-base.d.ts} +0 -0
- /package/dist/{evaluator-base.js → core/evaluator-base.js} +0 -0
- /package/dist/{generate.d.ts → core/generate.d.ts} +0 -0
- /package/dist/{generate.js → core/generate.js} +0 -0
- /package/dist/{file-operations.d.ts → file/file-operations.d.ts} +0 -0
- /package/dist/{link-parser.d.ts → file/link-parser.d.ts} +0 -0
- /package/dist/{link-parser.js → file/link-parser.js} +0 -0
- /package/dist/{settings-store.d.ts → settings/settings-store.d.ts} +0 -0
- /package/dist/{settings-store.js → settings/settings-store.js} +0 -0
package/dist/index.d.ts
CHANGED
|
@@ -1,16 +1,7 @@
|
|
|
1
|
-
export * from "./async
|
|
2
|
-
export * from "./
|
|
3
|
-
export * from "./
|
|
4
|
-
export * from "./
|
|
5
|
-
export * from "./
|
|
6
|
-
export * from "./
|
|
7
|
-
export * from "./file-operations";
|
|
8
|
-
export * from "./file-utils";
|
|
9
|
-
export * from "./frontmatter-utils";
|
|
10
|
-
export * from "./generate";
|
|
11
|
-
export * from "./link-parser";
|
|
12
|
-
export * from "./settings-store";
|
|
13
|
-
export * from "./settings-ui-builder";
|
|
14
|
-
export * from "./string-utils";
|
|
15
|
-
export * from "./templater-utils";
|
|
1
|
+
export * from "./async";
|
|
2
|
+
export * from "./core";
|
|
3
|
+
export * from "./date";
|
|
4
|
+
export * from "./file";
|
|
5
|
+
export * from "./settings";
|
|
6
|
+
export * from "./string";
|
|
16
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,SAAS,CAAC;AAExB,cAAc,QAAQ,CAAC;AAGvB,cAAc,QAAQ,CAAC;AAEvB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAE3B,cAAc,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export * from "./
|
|
4
|
-
|
|
5
|
-
export * from "./
|
|
6
|
-
|
|
7
|
-
export * from "./
|
|
8
|
-
|
|
9
|
-
export * from "./
|
|
10
|
-
export * from "./
|
|
11
|
-
|
|
12
|
-
export * from "./
|
|
13
|
-
export * from "./settings-ui-builder";
|
|
14
|
-
export * from "./string-utils";
|
|
15
|
-
export * from "./templater-utils";
|
|
1
|
+
// Settings
|
|
2
|
+
// Async utilities
|
|
3
|
+
export * from "./async";
|
|
4
|
+
// Core utilities
|
|
5
|
+
export * from "./core";
|
|
6
|
+
// Date operations
|
|
7
|
+
export * from "./date";
|
|
8
|
+
// File operations
|
|
9
|
+
export * from "./file";
|
|
10
|
+
export * from "./settings";
|
|
11
|
+
// String utilities
|
|
12
|
+
export * from "./string";
|
|
16
13
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,WAAW;AAEX,kBAAkB;AAClB,cAAc,SAAS,CAAC;AACxB,iBAAiB;AACjB,cAAc,QAAQ,CAAC;AAEvB,kBAAkB;AAClB,cAAc,QAAQ,CAAC;AACvB,kBAAkB;AAClB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,mBAAmB;AACnB,cAAc,UAAU,CAAC","sourcesContent":["// Settings\n\n// Async utilities\nexport * from \"./async\";\n// Core utilities\nexport * from \"./core\";\n\n// Date operations\nexport * from \"./date\";\n// File operations\nexport * from \"./file\";\nexport * from \"./settings\";\n// String utilities\nexport * from \"./string\";\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/settings/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/settings/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC","sourcesContent":["export * from \"./settings-store\";\nexport * from \"./settings-ui-builder\";\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-store.d.ts","sourceRoot":"","sources":["../../src/settings/settings-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AACvC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,qBAAa,aAAa,CAAC,OAAO,SAAS,CAAC,CAAC,UAAU;IACtD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAU;IACxB,SAAgB,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAEjD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IAM3C,IAAI,eAAe,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAEtC;IAED,IAAI,gBAAgB,IAAI,OAAO,CAE9B;IAEK,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB7B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,cAAc,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxF,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EACpD,GAAG,EAAE,CAAC,EACN,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,IAAI,CAAC;IAQV,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzE,WAAW,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IAI/B,iBAAiB,IAAI,OAAO;CAI5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-store.js","sourceRoot":"","sources":["../../src/settings/settings-store.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Plugin } from \"obsidian\";\nimport { BehaviorSubject } from \"rxjs\";\nimport type { z } from \"zod\";\n\nexport class SettingsStore<TSchema extends z.ZodTypeAny> {\n\tprivate plugin: Plugin;\n\tprivate schema: TSchema;\n\tpublic readonly settings$: BehaviorSubject<z.infer<TSchema>>;\n\n\tconstructor(plugin: Plugin, schema: TSchema) {\n\t\tthis.plugin = plugin;\n\t\tthis.schema = schema;\n\t\tthis.settings$ = new BehaviorSubject<z.infer<TSchema>>(schema.parse({}));\n\t}\n\n\tget currentSettings(): z.infer<TSchema> {\n\t\treturn this.settings$.value;\n\t}\n\n\tget validationSchema(): TSchema {\n\t\treturn this.schema;\n\t}\n\n\tasync loadSettings(): Promise<void> {\n\t\ttry {\n\t\t\tconst data = await this.plugin.loadData();\n\t\t\tconst sanitized = this.schema.parse(data ?? {});\n\t\t\tthis.settings$.next(sanitized);\n\n\t\t\t// Save back if data was sanitized/normalized\n\t\t\tif (JSON.stringify(sanitized) !== JSON.stringify(data ?? {})) {\n\t\t\t\tawait this.saveSettings();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to load settings, using defaults:\", error);\n\t\t\tthis.settings$.next(this.schema.parse({}));\n\t\t\tawait this.saveSettings();\n\t\t}\n\t}\n\n\tasync saveSettings(): Promise<void> {\n\t\tawait this.plugin.saveData(this.currentSettings);\n\t}\n\n\tasync updateSettings(updater: (settings: z.infer<TSchema>) => z.infer<TSchema>): Promise<void> {\n\t\ttry {\n\t\t\tconst newSettings = updater(this.currentSettings);\n\t\t\tconst validated = this.schema.parse(newSettings);\n\n\t\t\tthis.settings$.next(validated);\n\t\t\tawait this.saveSettings();\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to update settings:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync resetSettings(): Promise<void> {\n\t\tthis.settings$.next(this.schema.parse({}));\n\t\tawait this.saveSettings();\n\t}\n\n\tasync updateProperty<K extends keyof z.infer<TSchema>>(\n\t\tkey: K,\n\t\tvalue: z.infer<TSchema>[K]\n\t): Promise<void> {\n\t\tawait this.updateSettings((settings) => {\n\t\t\tconst updated = Object.assign({}, settings);\n\t\t\t(updated as any)[key] = value;\n\t\t\treturn updated;\n\t\t});\n\t}\n\n\tasync updateProperties(updates: Partial<z.infer<TSchema>>): Promise<void> {\n\t\tawait this.updateSettings((settings) => {\n\t\t\treturn Object.assign({}, settings, updates);\n\t\t});\n\t}\n\n\tgetDefaults(): z.infer<TSchema> {\n\t\treturn this.schema.parse({});\n\t}\n\n\thasCustomizations(): boolean {\n\t\tconst defaults = this.getDefaults();\n\t\treturn JSON.stringify(this.currentSettings) !== JSON.stringify(defaults);\n\t}\n}\n"]}
|
|
@@ -7,11 +7,13 @@ interface BaseSettingConfig {
|
|
|
7
7
|
}
|
|
8
8
|
interface TextSettingConfig extends BaseSettingConfig {
|
|
9
9
|
placeholder?: string;
|
|
10
|
+
commitOnChange?: boolean;
|
|
10
11
|
}
|
|
11
12
|
interface SliderSettingConfig extends BaseSettingConfig {
|
|
12
13
|
min?: number;
|
|
13
14
|
max?: number;
|
|
14
15
|
step?: number;
|
|
16
|
+
commitOnChange?: boolean;
|
|
15
17
|
}
|
|
16
18
|
interface DropdownSettingConfig extends BaseSettingConfig {
|
|
17
19
|
options: Record<string, string>;
|
|
@@ -20,6 +22,7 @@ interface ArraySettingConfig<T = string> extends BaseSettingConfig {
|
|
|
20
22
|
placeholder?: string;
|
|
21
23
|
arrayDelimiter?: string;
|
|
22
24
|
multiline?: boolean;
|
|
25
|
+
commitOnChange?: boolean;
|
|
23
26
|
itemType?: "string" | "number";
|
|
24
27
|
parser?: (input: string) => T;
|
|
25
28
|
validator?: (item: T) => boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-ui-builder.d.ts","sourceRoot":"","sources":["../../src/settings/settings-ui-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -91,7 +91,7 @@ export class SettingsUIBuilder {
|
|
|
91
91
|
}
|
|
92
92
|
addSlider(containerEl, config) {
|
|
93
93
|
var _a, _b, _c, _d;
|
|
94
|
-
const { key, name, desc, step = 1 } = config;
|
|
94
|
+
const { key, name, desc, step = 1, commitOnChange = false } = config;
|
|
95
95
|
const value = this.settings[key];
|
|
96
96
|
const inferredBounds = this.inferSliderBounds(key);
|
|
97
97
|
const min = (_b = (_a = config.min) !== null && _a !== void 0 ? _a : inferredBounds.min) !== null && _b !== void 0 ? _b : 0;
|
|
@@ -100,28 +100,75 @@ export class SettingsUIBuilder {
|
|
|
100
100
|
.setName(name)
|
|
101
101
|
.setDesc(desc)
|
|
102
102
|
.addSlider((slider) => {
|
|
103
|
-
slider
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
.
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
103
|
+
slider.setLimits(min, max, step).setValue(Number(value)).setDynamicTooltip();
|
|
104
|
+
if (commitOnChange) {
|
|
105
|
+
// Reactive: commit on every change
|
|
106
|
+
slider.onChange((newValue) => __awaiter(this, void 0, void 0, function* () {
|
|
107
|
+
yield this.updateSetting(key, newValue);
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
// Commit only when user finishes dragging
|
|
112
|
+
const commit = (newValue) => __awaiter(this, void 0, void 0, function* () {
|
|
113
|
+
try {
|
|
114
|
+
yield this.updateSetting(key, newValue);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
new Notice(`Invalid input: ${error}`, 5000);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
// Update tooltip during drag for visual feedback
|
|
121
|
+
slider.onChange((newValue) => {
|
|
122
|
+
slider.sliderEl.setAttribute("aria-valuenow", String(newValue));
|
|
123
|
+
});
|
|
124
|
+
// Commit on mouse up
|
|
125
|
+
slider.sliderEl.addEventListener("mouseup", () => {
|
|
126
|
+
void commit(Number(slider.sliderEl.value));
|
|
127
|
+
});
|
|
128
|
+
// Commit on keyboard navigation
|
|
129
|
+
slider.sliderEl.addEventListener("keyup", (e) => {
|
|
130
|
+
if (["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", "Home", "End"].includes(e.key)) {
|
|
131
|
+
void commit(Number(slider.sliderEl.value));
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
110
135
|
return slider;
|
|
111
136
|
});
|
|
112
137
|
}
|
|
113
138
|
addText(containerEl, config) {
|
|
114
|
-
const { key, name, desc, placeholder = "" } = config;
|
|
139
|
+
const { key, name, desc, placeholder = "", commitOnChange = false } = config;
|
|
115
140
|
const value = this.settings[key];
|
|
116
141
|
new Setting(containerEl)
|
|
117
142
|
.setName(name)
|
|
118
143
|
.setDesc(desc)
|
|
119
|
-
.addText((text) =>
|
|
120
|
-
.setPlaceholder(placeholder)
|
|
121
|
-
.setValue(String(value !== null && value !== void 0 ? value : ""))
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
144
|
+
.addText((text) => {
|
|
145
|
+
text.setPlaceholder(placeholder);
|
|
146
|
+
text.setValue(String(value !== null && value !== void 0 ? value : ""));
|
|
147
|
+
if (commitOnChange) {
|
|
148
|
+
// Reactive: commit on every change
|
|
149
|
+
text.onChange((newValue) => __awaiter(this, void 0, void 0, function* () {
|
|
150
|
+
yield this.updateSetting(key, newValue);
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
// Commit only on blur or Ctrl/Cmd+Enter
|
|
155
|
+
const commit = (inputValue) => __awaiter(this, void 0, void 0, function* () {
|
|
156
|
+
try {
|
|
157
|
+
yield this.updateSetting(key, inputValue);
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
new Notice(`Invalid input: ${error}`, 5000);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
text.inputEl.addEventListener("blur", () => void commit(text.inputEl.value));
|
|
164
|
+
text.inputEl.addEventListener("keydown", (e) => {
|
|
165
|
+
if (e.key === "Enter" && (e.ctrlKey || e.metaKey)) {
|
|
166
|
+
e.preventDefault();
|
|
167
|
+
void commit(text.inputEl.value);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
});
|
|
125
172
|
}
|
|
126
173
|
addDropdown(containerEl, config) {
|
|
127
174
|
const { key, name, desc, options } = config;
|
|
@@ -138,7 +185,7 @@ export class SettingsUIBuilder {
|
|
|
138
185
|
}
|
|
139
186
|
addTextArray(containerEl, config) {
|
|
140
187
|
var _a, _b, _c, _d;
|
|
141
|
-
const { key, name, desc, placeholder = "", arrayDelimiter = ", ", multiline = false } = config;
|
|
188
|
+
const { key, name, desc, placeholder = "", arrayDelimiter = ", ", multiline = false, commitOnChange = false, } = config;
|
|
142
189
|
const value = this.settings[key];
|
|
143
190
|
const inferredItemType = (_b = (_a = config.itemType) !== null && _a !== void 0 ? _a : this.inferArrayItemType(key)) !== null && _b !== void 0 ? _b : "string";
|
|
144
191
|
const parser = (_c = config.parser) !== null && _c !== void 0 ? _c : ((input) => {
|
|
@@ -170,13 +217,22 @@ export class SettingsUIBuilder {
|
|
|
170
217
|
new Notice(`Invalid input: ${error}`, 5000);
|
|
171
218
|
}
|
|
172
219
|
});
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
220
|
+
if (commitOnChange) {
|
|
221
|
+
// Reactive: commit on every change
|
|
222
|
+
text.onChange((inputValue) => __awaiter(this, void 0, void 0, function* () {
|
|
223
|
+
yield commit(inputValue);
|
|
224
|
+
}));
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
// Commit only on blur or Ctrl/Cmd+Enter
|
|
228
|
+
text.inputEl.addEventListener("blur", () => void commit(text.inputEl.value));
|
|
229
|
+
text.inputEl.addEventListener("keydown", (e) => {
|
|
230
|
+
if (e.key === "Enter" && (e.ctrlKey || e.metaKey)) {
|
|
231
|
+
e.preventDefault();
|
|
232
|
+
void commit(text.inputEl.value);
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
}
|
|
180
236
|
text.inputEl.rows = 5;
|
|
181
237
|
text.inputEl.classList.add("settings-ui-builder-textarea");
|
|
182
238
|
});
|
|
@@ -185,7 +241,7 @@ export class SettingsUIBuilder {
|
|
|
185
241
|
setting.addText((text) => {
|
|
186
242
|
text.setPlaceholder(placeholder);
|
|
187
243
|
text.setValue(Array.isArray(value) ? value.join(arrayDelimiter) : "");
|
|
188
|
-
|
|
244
|
+
const commit = (inputValue) => __awaiter(this, void 0, void 0, function* () {
|
|
189
245
|
const tokens = inputValue
|
|
190
246
|
.split(",")
|
|
191
247
|
.map((s) => s.trim())
|
|
@@ -197,7 +253,23 @@ export class SettingsUIBuilder {
|
|
|
197
253
|
catch (error) {
|
|
198
254
|
new Notice(`Invalid input: ${error}`, 5000);
|
|
199
255
|
}
|
|
200
|
-
})
|
|
256
|
+
});
|
|
257
|
+
if (commitOnChange) {
|
|
258
|
+
// Reactive: commit on every change
|
|
259
|
+
text.onChange((inputValue) => __awaiter(this, void 0, void 0, function* () {
|
|
260
|
+
yield commit(inputValue);
|
|
261
|
+
}));
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
// Commit only on blur or Ctrl/Cmd+Enter
|
|
265
|
+
text.inputEl.addEventListener("blur", () => void commit(text.inputEl.value));
|
|
266
|
+
text.inputEl.addEventListener("keydown", (e) => {
|
|
267
|
+
if (e.key === "Enter" && (e.ctrlKey || e.metaKey)) {
|
|
268
|
+
e.preventDefault();
|
|
269
|
+
void commit(text.inputEl.value);
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
}
|
|
201
273
|
});
|
|
202
274
|
}
|
|
203
275
|
}
|
|
@@ -0,0 +1 @@
|
|
|
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\tprivate async updateSetting(key: keyof z.infer<TSchema>, value: unknown): Promise<void> {\n\t\tconst newSettings = {\n\t\t\t...this.settings,\n\t\t\t[key]: value,\n\t\t} as z.infer<TSchema>;\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\tconst fieldSchema = (this.schema.shape as any)[key];\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\tconst fieldSchema = (this.schema.shape as any)[key];\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.settings[key as keyof z.infer<TSchema>];\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 as keyof z.infer<TSchema>, 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.settings[key as keyof z.infer<TSchema>];\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 as keyof z.infer<TSchema>, 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 as keyof z.infer<TSchema>, 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.settings[key as keyof z.infer<TSchema>];\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 as keyof z.infer<TSchema>, 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 as keyof z.infer<TSchema>, 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.settings[key as keyof z.infer<TSchema>];\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 as keyof z.infer<TSchema>, 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.settings[key as keyof z.infer<TSchema>] 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 as keyof z.infer<TSchema>, 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 as keyof z.infer<TSchema>, 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 * Similar to the directory settings pattern\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.settings[key as keyof z.infer<TSchema>] 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 as keyof z.infer<TSchema>, 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\tconst input = containerEl.querySelector(`#${inputId}`) as HTMLInputElement;\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.settings[key as keyof z.infer<TSchema>] 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 as keyof z.infer<TSchema>, 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.settings[key as keyof z.infer<TSchema>] 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.settings[key as keyof z.infer<TSchema>] as unknown[]) ?? [];\n\t\t\t\t\t\tconst newItems = await quickAction.action(currentItems);\n\t\t\t\t\t\tawait this.updateSetting(key as keyof z.infer<TSchema>, 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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/string/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/string/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC","sourcesContent":["export * from \"./string\";\n"]}
|
|
@@ -2,4 +2,4 @@ export declare const capitalize: (str: string) => string;
|
|
|
2
2
|
export declare const generateDuplicatedTitle: (originalTitle: string) => string;
|
|
3
3
|
export declare const pluralize: (count: number) => string;
|
|
4
4
|
export declare const getWeekDirection: (weeks: number) => "next" | "previous";
|
|
5
|
-
//# sourceMappingURL=string
|
|
5
|
+
//# sourceMappingURL=string.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/string/string.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG,MAGxC,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,eAAe,MAAM,KAAG,MAY/D,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,KAAG,MAEzC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,KAAG,MAAM,GAAG,UAEzD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/string/string.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAU,EAAE;IACjD,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IACrB,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AACjE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,aAAqB,EAAU,EAAE;IACxE,4EAA4E;IAC5E,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAE9F,IAAI,YAAY,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,eAAe,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,OAAO,GAAG,QAAQ,KAAK,WAAW,GAAG,CAAC;IACvC,CAAC;SAAM,CAAC;QACP,OAAO,GAAG,aAAa,MAAM,CAAC;IAC/B,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAU,EAAE;IAClD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAuB,EAAE;IACtE,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;AACxC,CAAC,CAAC","sourcesContent":["export const capitalize = (str: string): string => {\n\tif (!str) return str;\n\treturn str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n};\n\nexport const generateDuplicatedTitle = (originalTitle: string): string => {\n\t// Check if title already has a counter pattern like \" (2)\", \" - Copy\", etc.\n\tconst counterMatch = originalTitle.match(/^(.*?)(?:\\s*\\((\\d+)\\)|\\s*-?\\s*Copy(?:\\s*(\\d+))?)$/);\n\n\tif (counterMatch) {\n\t\tconst baseName = counterMatch[1];\n\t\tconst existingCounter = counterMatch[2] || counterMatch[3];\n\t\tconst nextCounter = existingCounter ? parseInt(existingCounter, 10) + 1 : 2;\n\t\treturn `${baseName} (${nextCounter})`;\n\t} else {\n\t\treturn `${originalTitle} (2)`;\n\t}\n};\n\nexport const pluralize = (count: number): string => {\n\treturn count === 1 ? \"\" : \"s\";\n};\n\nexport const getWeekDirection = (weeks: number): \"next\" | \"previous\" => {\n\treturn weeks > 0 ? \"next\" : \"previous\";\n};\n"]}
|
|
@@ -98,6 +98,7 @@ export declare const MarkdownRenderer: {
|
|
|
98
98
|
render: import("vitest").Mock<(...args: any[]) => any>;
|
|
99
99
|
};
|
|
100
100
|
export declare function debounce<T extends (...args: any[]) => any>(func: T, wait: number, immediate?: boolean): T;
|
|
101
|
+
export declare function normalizePath(path: string): string;
|
|
101
102
|
export declare const App: import("vitest").Mock<(...args: any[]) => any>;
|
|
102
103
|
export interface MockApp {
|
|
103
104
|
fileManager: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"obsidian.d.ts","sourceRoot":"","sources":["../../../src/testing/mocks/obsidian.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"obsidian.d.ts","sourceRoot":"","sources":["../../../src/testing/mocks/obsidian.ts"],"names":[],"mappings":"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"}
|
|
@@ -164,6 +164,12 @@ export function debounce(func, wait, immediate) {
|
|
|
164
164
|
func(...args);
|
|
165
165
|
});
|
|
166
166
|
}
|
|
167
|
+
// normalizePath mock - simple path normalization for tests
|
|
168
|
+
export function normalizePath(path) {
|
|
169
|
+
// Basic normalization: replace backslashes with forward slashes
|
|
170
|
+
// and remove duplicate slashes
|
|
171
|
+
return path.replace(/\\/g, "/").replace(/\/+/g, "/");
|
|
172
|
+
}
|
|
167
173
|
// App mock
|
|
168
174
|
export const App = vi.fn();
|
|
169
175
|
// Helper function to create a fully mocked app
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"obsidian.js","sourceRoot":"","sources":["../../../src/testing/mocks/obsidian.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE5B,yBAAyB;AACzB,MAAM,OAAO,MAAM;IAKlB,YAAY,GAAQ,EAAE,QAAa;QAKnC,sBAAsB;QACtB,kBAAa,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACxB,kBAAa,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACxB,aAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACzC,aAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAChD,WAAM,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACjB,aAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAEnB,aAAa;QACb,kBAAa,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACxB,qBAAgB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,eAAU,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACrB,kBAAa,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAExB,gBAAgB;QAChB,qBAAgB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,uBAAkB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,4BAAuB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,kCAA6B,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,uCAAkC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,oCAA+B,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,0BAAqB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,4BAAuB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAElC,mBAAmB;QACnB,qBAAgB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAE3B,6BAA6B;QAC7B,iBAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACvB,uBAAkB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAE7B,oBAAoB;QACpB,iBAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACvB,SAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACf,WAAM,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAEjB,gBAAgB;QAChB,aAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACnB,gBAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACtB,aAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QA3ClB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC1B,CAAC;CA0CD;AAED,wBAAwB;AACxB,MAAM,OAAO,gBAAgB;IAK5B,YAAY,GAAQ,EAAE,MAAW;QAMjC,YAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QALjB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;CAGD;AAED,gBAAgB;AAChB,MAAM,OAAO,QAAQ;IAKpB,YAAY,IAAS;QAuBrB,aAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACvC,aAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAvB/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,GAAG,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,gEAAgE;IAChE,uDAAuD;IAEvD,0DAA0D;IAC1D,gCAAgC;IAChC,WAAW;QACV,OAAO,WAAW,CAAC;IACpB,CAAC;IAED,cAAc;QACb,OAAO,WAAW,CAAC;IACpB,CAAC;IAED,OAAO;QACN,OAAO,WAAW,CAAC;IACpB,CAAC;CAID;AAED,yBAAyB;AACzB,MAAM,OAAO,OAAO;IAMnB,YAAY,YAAyB;QAOrC,YAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE,CAAC;QACnC,YAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE,CAAC;QACnC,YAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE,CAAC;QACnC,gBAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE,CAAC;QATtC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;CAMD;AAED,eAAe;AACf,MAAM,OAAO,OAAO;IAOnB,YAAY,IAAY;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,MAAM;QACL,OAAO,IAAI,CAAC,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC;IAC9C,CAAC;CACD;AAED,iCAAiC;AACjC,MAAM,OAAO,KAAK;IASjB,YAAY,IAAY,EAAE,UAAmB;QAC5C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB;QACvE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAEhB,kDAAkD;QAClD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3D,CAAC;aAAM,CAAC;YACP,0BAA0B;YAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;YACzD,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACpB,CAAC;QACF,CAAC;IACF,CAAC;CACD;AAED,aAAa;AACb,MAAM,OAAO,KAAK;IAMjB,YAAY,GAAQ;QAOpB,SAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACf,UAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAChB,WAAM,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACjB,YAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QATjB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;CAMD;AAED,cAAc;AACd,MAAM,OAAO,MAAM;IAClB,YAAY,OAAe;QAC1B,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;IACnC,CAAC;CACD;AAED,wBAAwB;AACxB,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC/B,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;CAC5C,CAAC;AAEF,yBAAyB;AACzB,MAAM,UAAU,QAAQ,CACvB,IAAO,EACP,IAAY,EACZ,SAAmB;IAEnB,IAAI,OAAO,GAAyC,IAAI,CAAC;IAEzD,OAAO,CAAC,CAAC,GAAG,IAAmB,EAAE,EAAE;QAClC,MAAM,KAAK,GAAG,GAAG,EAAE;YAClB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,SAAS;gBAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,SAAS,IAAI,CAAC,OAAO,CAAC;QAEtC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACtB,YAAY,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QAED,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAElC,IAAI,OAAO;YAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAM,CAAC;AACT,CAAC;AAED,WAAW;AACX,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AA4B3B,+CAA+C;AAC/C,MAAM,UAAU,aAAa;IAC5B,OAAO;QACN,WAAW,EAAE;YACZ,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE;SAC3B;QACD,aAAa,EAAE;YACd,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;SACrB;QACD,KAAK,EAAE;YACN,qBAAqB,EAAE,EAAE,CAAC,EAAE,EAAE;YAC9B,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;YACX,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;YACb,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;YACf,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;YACf,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;YACf,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;YACf,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;YACrC,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;YAC7C,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;SACxB;QACD,SAAS,EAAE;YACV,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;YACtB,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;SACX;KACD,CAAC;AACH,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,cAAc,CAC7B,IAAY,EACZ,OAIC;IAED,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,CAAC,CAAC;IAClD,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,CAAC;IACD,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,EAAE,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACpC,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,mBAAmB,CAAC,WAAiC;IACpE,OAAO;QACN,WAAW,EAAE,WAAW,IAAI,EAAE;QAC9B,mBAAmB,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;QAClF,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,EAAE;QACR,SAAS,EAAE,EAAE;KACb,CAAC;AACH,CAAC","sourcesContent":["import { vi } from \"vitest\";\n\n// Base Plugin class mock\nexport class Plugin {\n\tapp: any;\n\tmanifest: any;\n\tsettings: any;\n\n\tconstructor(app: any, manifest: any) {\n\t\tthis.app = app;\n\t\tthis.manifest = manifest;\n\t}\n\n\t// Core plugin methods\n\taddSettingTab = vi.fn();\n\tregisterEvent = vi.fn();\n\tloadData = vi.fn().mockResolvedValue({});\n\tsaveData = vi.fn().mockResolvedValue(undefined);\n\tonload = vi.fn();\n\tonunload = vi.fn();\n\n\t// UI methods\n\taddRibbonIcon = vi.fn();\n\taddStatusBarItem = vi.fn();\n\taddCommand = vi.fn();\n\tremoveCommand = vi.fn();\n\n\t// Event methods\n\tregisterDomEvent = vi.fn();\n\tregisterCodeMirror = vi.fn();\n\tregisterEditorExtension = vi.fn();\n\tregisterMarkdownPostProcessor = vi.fn();\n\tregisterMarkdownCodeBlockProcessor = vi.fn();\n\tregisterObsidianProtocolHandler = vi.fn();\n\tregisterEditorSuggest = vi.fn();\n\tregisterHoverLinkSource = vi.fn();\n\n\t// Interval methods\n\tregisterInterval = vi.fn();\n\n\t// View and extension methods\n\tregisterView = vi.fn();\n\tregisterExtensions = vi.fn();\n\n\t// Lifecycle methods\n\tonUserEnable = vi.fn();\n\tload = vi.fn();\n\tunload = vi.fn();\n\n\t// Other methods\n\taddChild = vi.fn();\n\tremoveChild = vi.fn();\n\tregister = vi.fn();\n}\n\n// PluginSettingTab mock\nexport class PluginSettingTab {\n\tapp: any;\n\tplugin: any;\n\tcontainerEl: HTMLElement;\n\n\tconstructor(app: any, plugin: any) {\n\t\tthis.app = app;\n\t\tthis.plugin = plugin;\n\t\tthis.containerEl = document.createElement(\"div\");\n\t}\n\n\tdisplay = vi.fn();\n}\n\n// ItemView mock\nexport class ItemView {\n\tapp: any;\n\tleaf: any;\n\tcontainerEl: HTMLElement;\n\n\tconstructor(leaf: any) {\n\t\tthis.leaf = leaf;\n\t\tthis.app = leaf?.app;\n\t\tthis.containerEl = document.createElement(\"div\");\n\t}\n\n\t// Don't override onOpen/onClose - let subclasses implement them\n\t// These methods are implemented by MountableView mixin\n\n\t// Don't provide default implementations for these methods\n\t// Let subclasses implement them\n\tgetViewType(): string {\n\t\treturn \"mock-view\";\n\t}\n\n\tgetDisplayText(): string {\n\t\treturn \"Mock View\";\n\t}\n\n\tgetIcon(): string {\n\t\treturn \"mock-icon\";\n\t}\n\n\tgetState = vi.fn().mockReturnValue({});\n\tsetState = vi.fn().mockResolvedValue(undefined);\n}\n\n// Setting component mock\nexport class Setting {\n\tsettingEl: HTMLElement;\n\tnameEl: HTMLElement;\n\tdescEl: HTMLElement;\n\tcontrolEl: HTMLElement;\n\n\tconstructor(_containerEl: HTMLElement) {\n\t\tthis.settingEl = document.createElement(\"div\");\n\t\tthis.nameEl = document.createElement(\"div\");\n\t\tthis.descEl = document.createElement(\"div\");\n\t\tthis.controlEl = document.createElement(\"div\");\n\t}\n\n\tsetName = vi.fn().mockReturnThis();\n\tsetDesc = vi.fn().mockReturnThis();\n\taddText = vi.fn().mockReturnThis();\n\taddTextArea = vi.fn().mockReturnThis();\n}\n\n// TFolder mock\nexport class TFolder {\n\tpath: string;\n\tname: string;\n\tchildren: any[];\n\tvault: any;\n\tparent: TFolder | null;\n\n\tconstructor(path: string) {\n\t\tthis.path = path;\n\t\tthis.name = path.split(\"/\").pop() || \"\";\n\t\tthis.children = [];\n\t\tthis.vault = {};\n\t\tthis.parent = null;\n\t}\n\n\tisRoot(): boolean {\n\t\treturn this.path === \"\" || this.path === \"/\";\n\t}\n}\n\n// TFile mock with full interface\nexport class TFile {\n\tpath: string;\n\tname: string;\n\tbasename: string;\n\textension: string;\n\tstat: any;\n\tvault: any;\n\tparent: TFolder | null;\n\n\tconstructor(path: string, parentPath?: string) {\n\t\tthis.path = path;\n\t\tthis.name = path.split(\"/\").pop() || \"\";\n\t\tthis.basename = this.name.replace(/\\.[^/.]+$/, \"\"); // Remove extension\n\t\tthis.extension = path.split(\".\").pop() || \"md\";\n\t\tthis.stat = {};\n\t\tthis.vault = {};\n\n\t\t// Set parent based on path or explicit parentPath\n\t\tif (parentPath !== undefined) {\n\t\t\tthis.parent = parentPath ? new TFolder(parentPath) : null;\n\t\t} else {\n\t\t\t// Derive parent from path\n\t\t\tconst lastSlash = path.lastIndexOf(\"/\");\n\t\t\tif (lastSlash > 0) {\n\t\t\t\tthis.parent = new TFolder(path.substring(0, lastSlash));\n\t\t\t} else {\n\t\t\t\tthis.parent = null;\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Modal mock\nexport class Modal {\n\tapp: any;\n\tcontainerEl: HTMLElement;\n\ttitleEl: HTMLElement;\n\tcontentEl: HTMLElement;\n\n\tconstructor(app: any) {\n\t\tthis.app = app;\n\t\tthis.containerEl = document.createElement(\"div\");\n\t\tthis.titleEl = document.createElement(\"div\");\n\t\tthis.contentEl = document.createElement(\"div\");\n\t}\n\n\topen = vi.fn();\n\tclose = vi.fn();\n\tonOpen = vi.fn();\n\tonClose = vi.fn();\n}\n\n// Notice mock\nexport class Notice {\n\tconstructor(message: string) {\n\t\tconsole.log(`Notice: ${message}`);\n\t}\n}\n\n// MarkdownRenderer mock\nexport const MarkdownRenderer = {\n\trender: vi.fn().mockResolvedValue(undefined),\n};\n\n// Debounce function mock\nexport function debounce<T extends (...args: any[]) => any>(\n\tfunc: T,\n\twait: number,\n\timmediate?: boolean\n): T {\n\tlet timeout: ReturnType<typeof setTimeout> | null = null;\n\n\treturn ((...args: Parameters<T>) => {\n\t\tconst later = () => {\n\t\t\ttimeout = null;\n\t\t\tif (!immediate) func(...args);\n\t\t};\n\n\t\tconst callNow = immediate && !timeout;\n\n\t\tif (timeout !== null) {\n\t\t\tclearTimeout(timeout);\n\t\t}\n\n\t\ttimeout = setTimeout(later, wait);\n\n\t\tif (callNow) func(...args);\n\t}) as T;\n}\n\n// App mock\nexport const App = vi.fn();\n\n// Mock interfaces for TypeScript\nexport interface MockApp {\n\tfileManager: {\n\t\tprocessFrontMatter: ReturnType<typeof vi.fn>;\n\t};\n\tmetadataCache: {\n\t\tgetFileCache: ReturnType<typeof vi.fn>;\n\t};\n\tvault: {\n\t\tgetAbstractFileByPath: ReturnType<typeof vi.fn>;\n\t\ton: ReturnType<typeof vi.fn>;\n\t\tread: ReturnType<typeof vi.fn>;\n\t\tmodify: ReturnType<typeof vi.fn>;\n\t\tcreate: ReturnType<typeof vi.fn>;\n\t\tdelete: ReturnType<typeof vi.fn>;\n\t\trename: ReturnType<typeof vi.fn>;\n\t\tgetFiles: ReturnType<typeof vi.fn>;\n\t\tgetMarkdownFiles: ReturnType<typeof vi.fn>;\n\t\tgetFolderByPath: ReturnType<typeof vi.fn>;\n\t};\n\tworkspace: {\n\t\tgetActiveFile: ReturnType<typeof vi.fn>;\n\t\ton: ReturnType<typeof vi.fn>;\n\t};\n}\n\n// Helper function to create a fully mocked app\nexport function createMockApp(): MockApp {\n\treturn {\n\t\tfileManager: {\n\t\t\tprocessFrontMatter: vi.fn(),\n\t\t},\n\t\tmetadataCache: {\n\t\t\tgetFileCache: vi.fn(),\n\t\t},\n\t\tvault: {\n\t\t\tgetAbstractFileByPath: vi.fn(),\n\t\t\ton: vi.fn(),\n\t\t\tread: vi.fn(),\n\t\t\tmodify: vi.fn(),\n\t\t\tcreate: vi.fn(),\n\t\t\tdelete: vi.fn(),\n\t\t\trename: vi.fn(),\n\t\t\tgetFiles: vi.fn().mockReturnValue([]),\n\t\t\tgetMarkdownFiles: vi.fn().mockReturnValue([]),\n\t\t\tgetFolderByPath: vi.fn(),\n\t\t},\n\t\tworkspace: {\n\t\t\tgetActiveFile: vi.fn(),\n\t\t\ton: vi.fn(),\n\t\t},\n\t};\n}\n\n// Helper to create mock TFile instances\nexport function createMockFile(\n\tpath: string,\n\toptions?: {\n\t\tbasename?: string;\n\t\tparentPath?: string;\n\t\textension?: string;\n\t}\n): TFile {\n\tconst file = new TFile(path, options?.parentPath);\n\tif (options?.basename) {\n\t\tfile.basename = options.basename;\n\t}\n\tif (options?.extension) {\n\t\tfile.extension = options.extension;\n\t}\n\treturn file;\n}\n\n// Helper to create mock file cache\nexport function createMockFileCache(frontmatter?: Record<string, any>) {\n\treturn {\n\t\tfrontmatter: frontmatter || {},\n\t\tfrontmatterPosition: frontmatter ? { start: { line: 0 }, end: { line: 3 } } : null,\n\t\tsections: [],\n\t\theadings: [],\n\t\tlinks: [],\n\t\tembeds: [],\n\t\ttags: [],\n\t\tlistItems: [],\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"obsidian.js","sourceRoot":"","sources":["../../../src/testing/mocks/obsidian.ts"],"names":[],"mappings":"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","sourcesContent":["import { vi } from \"vitest\";\n\n// Base Plugin class mock\nexport class Plugin {\n\tapp: any;\n\tmanifest: any;\n\tsettings: any;\n\n\tconstructor(app: any, manifest: any) {\n\t\tthis.app = app;\n\t\tthis.manifest = manifest;\n\t}\n\n\t// Core plugin methods\n\taddSettingTab = vi.fn();\n\tregisterEvent = vi.fn();\n\tloadData = vi.fn().mockResolvedValue({});\n\tsaveData = vi.fn().mockResolvedValue(undefined);\n\tonload = vi.fn();\n\tonunload = vi.fn();\n\n\t// UI methods\n\taddRibbonIcon = vi.fn();\n\taddStatusBarItem = vi.fn();\n\taddCommand = vi.fn();\n\tremoveCommand = vi.fn();\n\n\t// Event methods\n\tregisterDomEvent = vi.fn();\n\tregisterCodeMirror = vi.fn();\n\tregisterEditorExtension = vi.fn();\n\tregisterMarkdownPostProcessor = vi.fn();\n\tregisterMarkdownCodeBlockProcessor = vi.fn();\n\tregisterObsidianProtocolHandler = vi.fn();\n\tregisterEditorSuggest = vi.fn();\n\tregisterHoverLinkSource = vi.fn();\n\n\t// Interval methods\n\tregisterInterval = vi.fn();\n\n\t// View and extension methods\n\tregisterView = vi.fn();\n\tregisterExtensions = vi.fn();\n\n\t// Lifecycle methods\n\tonUserEnable = vi.fn();\n\tload = vi.fn();\n\tunload = vi.fn();\n\n\t// Other methods\n\taddChild = vi.fn();\n\tremoveChild = vi.fn();\n\tregister = vi.fn();\n}\n\n// PluginSettingTab mock\nexport class PluginSettingTab {\n\tapp: any;\n\tplugin: any;\n\tcontainerEl: HTMLElement;\n\n\tconstructor(app: any, plugin: any) {\n\t\tthis.app = app;\n\t\tthis.plugin = plugin;\n\t\tthis.containerEl = document.createElement(\"div\");\n\t}\n\n\tdisplay = vi.fn();\n}\n\n// ItemView mock\nexport class ItemView {\n\tapp: any;\n\tleaf: any;\n\tcontainerEl: HTMLElement;\n\n\tconstructor(leaf: any) {\n\t\tthis.leaf = leaf;\n\t\tthis.app = leaf?.app;\n\t\tthis.containerEl = document.createElement(\"div\");\n\t}\n\n\t// Don't override onOpen/onClose - let subclasses implement them\n\t// These methods are implemented by MountableView mixin\n\n\t// Don't provide default implementations for these methods\n\t// Let subclasses implement them\n\tgetViewType(): string {\n\t\treturn \"mock-view\";\n\t}\n\n\tgetDisplayText(): string {\n\t\treturn \"Mock View\";\n\t}\n\n\tgetIcon(): string {\n\t\treturn \"mock-icon\";\n\t}\n\n\tgetState = vi.fn().mockReturnValue({});\n\tsetState = vi.fn().mockResolvedValue(undefined);\n}\n\n// Setting component mock\nexport class Setting {\n\tsettingEl: HTMLElement;\n\tnameEl: HTMLElement;\n\tdescEl: HTMLElement;\n\tcontrolEl: HTMLElement;\n\n\tconstructor(_containerEl: HTMLElement) {\n\t\tthis.settingEl = document.createElement(\"div\");\n\t\tthis.nameEl = document.createElement(\"div\");\n\t\tthis.descEl = document.createElement(\"div\");\n\t\tthis.controlEl = document.createElement(\"div\");\n\t}\n\n\tsetName = vi.fn().mockReturnThis();\n\tsetDesc = vi.fn().mockReturnThis();\n\taddText = vi.fn().mockReturnThis();\n\taddTextArea = vi.fn().mockReturnThis();\n}\n\n// TFolder mock\nexport class TFolder {\n\tpath: string;\n\tname: string;\n\tchildren: any[];\n\tvault: any;\n\tparent: TFolder | null;\n\n\tconstructor(path: string) {\n\t\tthis.path = path;\n\t\tthis.name = path.split(\"/\").pop() || \"\";\n\t\tthis.children = [];\n\t\tthis.vault = {};\n\t\tthis.parent = null;\n\t}\n\n\tisRoot(): boolean {\n\t\treturn this.path === \"\" || this.path === \"/\";\n\t}\n}\n\n// TFile mock with full interface\nexport class TFile {\n\tpath: string;\n\tname: string;\n\tbasename: string;\n\textension: string;\n\tstat: any;\n\tvault: any;\n\tparent: TFolder | null;\n\n\tconstructor(path: string, parentPath?: string) {\n\t\tthis.path = path;\n\t\tthis.name = path.split(\"/\").pop() || \"\";\n\t\tthis.basename = this.name.replace(/\\.[^/.]+$/, \"\"); // Remove extension\n\t\tthis.extension = path.split(\".\").pop() || \"md\";\n\t\tthis.stat = {};\n\t\tthis.vault = {};\n\n\t\t// Set parent based on path or explicit parentPath\n\t\tif (parentPath !== undefined) {\n\t\t\tthis.parent = parentPath ? new TFolder(parentPath) : null;\n\t\t} else {\n\t\t\t// Derive parent from path\n\t\t\tconst lastSlash = path.lastIndexOf(\"/\");\n\t\t\tif (lastSlash > 0) {\n\t\t\t\tthis.parent = new TFolder(path.substring(0, lastSlash));\n\t\t\t} else {\n\t\t\t\tthis.parent = null;\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Modal mock\nexport class Modal {\n\tapp: any;\n\tcontainerEl: HTMLElement;\n\ttitleEl: HTMLElement;\n\tcontentEl: HTMLElement;\n\n\tconstructor(app: any) {\n\t\tthis.app = app;\n\t\tthis.containerEl = document.createElement(\"div\");\n\t\tthis.titleEl = document.createElement(\"div\");\n\t\tthis.contentEl = document.createElement(\"div\");\n\t}\n\n\topen = vi.fn();\n\tclose = vi.fn();\n\tonOpen = vi.fn();\n\tonClose = vi.fn();\n}\n\n// Notice mock\nexport class Notice {\n\tconstructor(message: string) {\n\t\tconsole.log(`Notice: ${message}`);\n\t}\n}\n\n// MarkdownRenderer mock\nexport const MarkdownRenderer = {\n\trender: vi.fn().mockResolvedValue(undefined),\n};\n\n// Debounce function mock\nexport function debounce<T extends (...args: any[]) => any>(\n\tfunc: T,\n\twait: number,\n\timmediate?: boolean\n): T {\n\tlet timeout: ReturnType<typeof setTimeout> | null = null;\n\n\treturn ((...args: Parameters<T>) => {\n\t\tconst later = () => {\n\t\t\ttimeout = null;\n\t\t\tif (!immediate) func(...args);\n\t\t};\n\n\t\tconst callNow = immediate && !timeout;\n\n\t\tif (timeout !== null) {\n\t\t\tclearTimeout(timeout);\n\t\t}\n\n\t\ttimeout = setTimeout(later, wait);\n\n\t\tif (callNow) func(...args);\n\t}) as T;\n}\n\n// normalizePath mock - simple path normalization for tests\nexport function normalizePath(path: string): string {\n\t// Basic normalization: replace backslashes with forward slashes\n\t// and remove duplicate slashes\n\treturn path.replace(/\\\\/g, \"/\").replace(/\\/+/g, \"/\");\n}\n\n// App mock\nexport const App = vi.fn();\n\n// Mock interfaces for TypeScript\nexport interface MockApp {\n\tfileManager: {\n\t\tprocessFrontMatter: ReturnType<typeof vi.fn>;\n\t};\n\tmetadataCache: {\n\t\tgetFileCache: ReturnType<typeof vi.fn>;\n\t};\n\tvault: {\n\t\tgetAbstractFileByPath: ReturnType<typeof vi.fn>;\n\t\ton: ReturnType<typeof vi.fn>;\n\t\tread: ReturnType<typeof vi.fn>;\n\t\tmodify: ReturnType<typeof vi.fn>;\n\t\tcreate: ReturnType<typeof vi.fn>;\n\t\tdelete: ReturnType<typeof vi.fn>;\n\t\trename: ReturnType<typeof vi.fn>;\n\t\tgetFiles: ReturnType<typeof vi.fn>;\n\t\tgetMarkdownFiles: ReturnType<typeof vi.fn>;\n\t\tgetFolderByPath: ReturnType<typeof vi.fn>;\n\t};\n\tworkspace: {\n\t\tgetActiveFile: ReturnType<typeof vi.fn>;\n\t\ton: ReturnType<typeof vi.fn>;\n\t};\n}\n\n// Helper function to create a fully mocked app\nexport function createMockApp(): MockApp {\n\treturn {\n\t\tfileManager: {\n\t\t\tprocessFrontMatter: vi.fn(),\n\t\t},\n\t\tmetadataCache: {\n\t\t\tgetFileCache: vi.fn(),\n\t\t},\n\t\tvault: {\n\t\t\tgetAbstractFileByPath: vi.fn(),\n\t\t\ton: vi.fn(),\n\t\t\tread: vi.fn(),\n\t\t\tmodify: vi.fn(),\n\t\t\tcreate: vi.fn(),\n\t\t\tdelete: vi.fn(),\n\t\t\trename: vi.fn(),\n\t\t\tgetFiles: vi.fn().mockReturnValue([]),\n\t\t\tgetMarkdownFiles: vi.fn().mockReturnValue([]),\n\t\t\tgetFolderByPath: vi.fn(),\n\t\t},\n\t\tworkspace: {\n\t\t\tgetActiveFile: vi.fn(),\n\t\t\ton: vi.fn(),\n\t\t},\n\t};\n}\n\n// Helper to create mock TFile instances\nexport function createMockFile(\n\tpath: string,\n\toptions?: {\n\t\tbasename?: string;\n\t\tparentPath?: string;\n\t\textension?: string;\n\t}\n): TFile {\n\tconst file = new TFile(path, options?.parentPath);\n\tif (options?.basename) {\n\t\tfile.basename = options.basename;\n\t}\n\tif (options?.extension) {\n\t\tfile.extension = options.extension;\n\t}\n\treturn file;\n}\n\n// Helper to create mock file cache\nexport function createMockFileCache(frontmatter?: Record<string, any>) {\n\treturn {\n\t\tfrontmatter: frontmatter || {},\n\t\tfrontmatterPosition: frontmatter ? { start: { line: 0 }, end: { line: 3 } } : null,\n\t\tsections: [],\n\t\theadings: [],\n\t\tlinks: [],\n\t\tembeds: [],\n\t\ttags: [],\n\t\tlistItems: [],\n\t};\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"async-utils.d.ts","sourceRoot":"","sources":["../src/async-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,CAcnE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,KAAK,SAAS,SAAS,OAAO,EAAE,EAAE,OAAO,EACvE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,GACtC,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAYtC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG;IAC7D,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1B,KAAK,EAAE,MAAM,IAAI,CAAC;CAClB,CAmBA"}
|
package/dist/async-utils.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"async-utils.js","sourceRoot":"","sources":["../src/async-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,SAAS,CAAI,EAAoB;IAChD,IAAI,OAAO,GAAsB,IAAI,CAAC;IAEtC,OAAO,GAAG,EAAE;QACX,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,IAAI,CAAC;gBACJ,OAAO,GAAG,EAAE,EAAE,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,kDAAkD;gBAClD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjC,CAAC;QACF,CAAC;QACD,OAAO,OAAO,CAAC;IAChB,CAAC,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,cAAc,CAC7B,EAAwC;IAExC,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IAElD,OAAO,CAAC,GAAG,IAAW,EAAE,EAAE;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAEjC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAC7B,CAAC;QAED,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;IACxB,CAAC,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,mBAAmB,CAAI,EAAoB;IAI1D,IAAI,OAAO,GAAsB,IAAI,CAAC;IAEtC,OAAO;QACN,OAAO,EAAE,GAAG,EAAE;YACb,IAAI,CAAC,OAAO,EAAE,CAAC;gBACd,IAAI,CAAC;oBACJ,OAAO,GAAG,EAAE,EAAE,CAAC;gBAChB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,kDAAkD;oBAClD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACjC,CAAC;YACF,CAAC;YACD,OAAO,OAAO,CAAC;QAChB,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACX,OAAO,GAAG,IAAI,CAAC;QAChB,CAAC;KACD,CAAC;AACH,CAAC","sourcesContent":["/**\n * Creates a function that ensures an async operation runs only once,\n * returning the same promise for concurrent calls.\n *\n * Useful for initialization patterns where you want to ensure\n * expensive async operations (like indexing, API calls, etc.)\n * only happen once even if called multiple times.\n *\n * @param fn The async function to memoize\n * @returns A function that returns the same promise on subsequent calls\n *\n * @example\n * ```typescript\n * const initializeOnce = onceAsync(async () => {\n * await heavyInitialization();\n * console.log(\"Initialized!\");\n * });\n *\n * // All these calls will share the same promise\n * await initializeOnce();\n * await initializeOnce(); // Won't run again\n * await initializeOnce(); // Won't run again\n * ```\n */\nexport function onceAsync<T>(fn: () => Promise<T>): () => Promise<T> {\n\tlet promise: Promise<T> | null = null;\n\n\treturn () => {\n\t\tif (!promise) {\n\t\t\ttry {\n\t\t\t\tpromise = fn();\n\t\t\t} catch (error) {\n\t\t\t\t// Convert synchronous errors to rejected promises\n\t\t\t\tpromise = Promise.reject(error);\n\t\t\t}\n\t\t}\n\t\treturn promise;\n\t};\n}\n\n/**\n * Creates a function that ensures an async operation runs only once per key,\n * useful for caching expensive operations with different parameters.\n *\n * @param fn The async function to memoize\n * @returns A function that memoizes results by key\n *\n * @example\n * ```typescript\n * const fetchUserOnce = onceAsyncKeyed(async (userId: string) => {\n * return await api.getUser(userId);\n * });\n *\n * // Each unique userId will only be fetched once\n * await fetchUserOnce(\"user1\");\n * await fetchUserOnce(\"user1\"); // Returns cached promise\n * await fetchUserOnce(\"user2\"); // New fetch for different key\n * ```\n */\nexport function onceAsyncKeyed<TArgs extends readonly unknown[], TReturn>(\n\tfn: (...args: TArgs) => Promise<TReturn>\n): (...args: TArgs) => Promise<TReturn> {\n\tconst cache = new Map<string, Promise<TReturn>>();\n\n\treturn (...args: TArgs) => {\n\t\tconst key = JSON.stringify(args);\n\n\t\tif (!cache.has(key)) {\n\t\t\tcache.set(key, fn(...args));\n\t\t}\n\n\t\treturn cache.get(key)!;\n\t};\n}\n\n/**\n * Creates a resettable version of onceAsync that can be cleared and re-run.\n *\n * @param fn The async function to memoize\n * @returns Object with execute and reset methods\n *\n * @example\n * ```typescript\n * const { execute: initialize, reset } = onceAsyncResettable(async () => {\n * await heavyInitialization();\n * });\n *\n * await initialize(); // Runs\n * await initialize(); // Cached\n *\n * reset(); // Clear cache\n * await initialize(); // Runs again\n * ```\n */\nexport function onceAsyncResettable<T>(fn: () => Promise<T>): {\n\texecute: () => Promise<T>;\n\treset: () => void;\n} {\n\tlet promise: Promise<T> | null = null;\n\n\treturn {\n\t\texecute: () => {\n\t\t\tif (!promise) {\n\t\t\t\ttry {\n\t\t\t\t\tpromise = fn();\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Convert synchronous errors to rejected promises\n\t\t\t\t\tpromise = Promise.reject(error);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn promise;\n\t\t},\n\t\treset: () => {\n\t\t\tpromise = null;\n\t\t},\n\t};\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"batch-operations.d.ts","sourceRoot":"","sources":["../src/batch-operations.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,qBAAqB;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,iBAAiB,CAAC,CAAC,EACxC,KAAK,EAAE,CAAC,EAAE,EACV,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,EACnC,UAAU,GAAE,OAAc,GACxB,OAAO,CAAC,oBAAoB,CAAC,CAmB/B;AAED,wBAAgB,wBAAwB,CACvC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GAChB,IAAI,CAUN"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"batch-operations.js","sourceRoot":"","sources":["../src/batch-operations.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAYlC,MAAM,UAAgB,iBAAiB;yDACtC,KAAU,EACV,cAAsB,EACtB,OAAmC,EACnC,aAAsB,IAAI;QAE1B,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACJ,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;gBACpB,YAAY,EAAE,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,GAAG,cAAc,0BAA0B,EAAE,KAAK,CAAC,CAAC;gBAClE,UAAU,EAAE,CAAC;YACd,CAAC;QACF,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YAChB,wBAAwB,CAAC,cAAc,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;QACpE,CAAC;QAED,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;IACrC,CAAC;CAAA;AAED,MAAM,UAAU,wBAAwB,CACvC,SAAiB,EACjB,YAAoB,EACpB,UAAkB;IAElB,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACtB,IAAI,MAAM,CACT,GAAG,SAAS,KAAK,YAAY,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,yBAAyB,CAC3F,CAAC;IACH,CAAC;SAAM,CAAC;QACP,IAAI,MAAM,CACT,GAAG,SAAS,KAAK,YAAY,eAAe,UAAU,qCAAqC,CAC3F,CAAC;IACH,CAAC;AACF,CAAC","sourcesContent":["import { Notice } from \"obsidian\";\n\nexport interface BatchOperationOptions {\n\tcloseAfter?: boolean;\n\tcallOnComplete?: boolean;\n}\n\nexport interface BatchOperationResult {\n\tsuccessCount: number;\n\terrorCount: number;\n}\n\nexport async function runBatchOperation<T>(\n\titems: T[],\n\toperationLabel: string,\n\thandler: (item: T) => Promise<void>,\n\tshowResult: boolean = true\n): Promise<BatchOperationResult> {\n\tlet successCount = 0;\n\tlet errorCount = 0;\n\n\tfor (const item of items) {\n\t\ttry {\n\t\t\tawait handler(item);\n\t\t\tsuccessCount++;\n\t\t} catch (error) {\n\t\t\tconsole.error(`${operationLabel}: error processing item:`, error);\n\t\t\terrorCount++;\n\t\t}\n\t}\n\n\tif (showResult) {\n\t\tshowBatchOperationResult(operationLabel, successCount, errorCount);\n\t}\n\n\treturn { successCount, errorCount };\n}\n\nexport function showBatchOperationResult(\n\toperation: string,\n\tsuccessCount: number,\n\terrorCount: number\n): void {\n\tif (errorCount === 0) {\n\t\tnew Notice(\n\t\t\t`${operation}: ${successCount} item${successCount === 1 ? \"\" : \"s\"} processed successfully`\n\t\t);\n\t} else {\n\t\tnew Notice(\n\t\t\t`${operation}: ${successCount} succeeded, ${errorCount} failed. Check console for details.`\n\t\t);\n\t}\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"child-reference-utils.d.ts","sourceRoot":"","sources":["../src/child-reference-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAIjC,MAAM,WAAW,YAAY;IAC5B,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC;CAClD;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAM7D;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMlE;AAED,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,EACnB,oBAAoB,CAAC,EAAE,MAAM,GAC3B,MAAM,CAqCR;AAED,wBAAgB,wBAAwB,CACvC,SAAS,EAAE,MAAM,EAAE,EACnB,KAAK,EAAE,YAAY,EACnB,oBAAoB,CAAC,EAAE,MAAM,GAC3B,MAAM,EAAE,CAIV"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"child-reference-utils.js","sourceRoot":"","sources":["../src/child-reference-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAMxD,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACpD,MAAM,cAAc,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACjD,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACX,CAAC;IACD,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,QAAgB;IACxD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,uBAAuB,CACtC,QAAgB,EAChB,KAAmB,EACnB,oBAA6B;IAE7B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAEnD,qDAAqD;IACrD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,uEAAuE;QACvE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,oBAAoB,KAAK,SAAS,EAAE,CAAC;YACnE,2EAA2E;YAC3E,MAAM,aAAa,GAAG,oBAAoB;gBACzC,CAAC,CAAC,GAAG,oBAAoB,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,EAAE;gBACrF,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;oBACzB,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC,GAAG,QAAQ,KAAK,CAAC;YACrB,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;YACxD,IAAI,IAAI,YAAY,KAAK,EAAE,CAAC;gBAC3B,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;QACF,CAAC;QACD,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,qDAAqD;IACrD,IAAI,wBAAwB,CAAC,QAAQ,CAAC,IAAI,oBAAoB,EAAE,CAAC;QAChE,MAAM,YAAY,GAAG,GAAG,oBAAoB,IAAI,QAAQ,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;QACvD,IAAI,IAAI,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACF,CAAC;IAED,mFAAmF;IACnF,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,IAAI,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,wBAAwB,CACvC,SAAmB,EACnB,KAAmB,EACnB,oBAA6B;IAE7B,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QACjC,OAAO,uBAAuB,CAAC,QAAQ,EAAE,KAAK,EAAE,oBAAoB,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import { TFile } from \"obsidian\";\nimport { createFileLink } from \"./file-operations\";\nimport { extractFilePathFromLink } from \"./link-parser\";\n\nexport interface VaultAdapter {\n\tgetAbstractFileByPath(path: string): TFile | null;\n}\n\nexport function extractDirectoryPath(filePath: string): string {\n\tconst lastSlashIndex = filePath.lastIndexOf(\"/\");\n\tif (lastSlashIndex === -1) {\n\t\treturn \"\";\n\t}\n\treturn filePath.substring(0, lastSlashIndex);\n}\n\nexport function isRelativeChildReference(childRef: string): boolean {\n\tconst filePath = extractFilePathFromLink(childRef);\n\tif (!filePath) {\n\t\treturn !childRef.includes(\"/\");\n\t}\n\treturn !filePath.includes(\"/\");\n}\n\nexport function normalizeChildReference(\n\tchildRef: string,\n\tvault: VaultAdapter,\n\tcurrentFileDirectory?: string\n): string {\n\tconst filePath = extractFilePathFromLink(childRef);\n\n\t// Handle plain text references (not wrapped in [[]])\n\tif (!filePath) {\n\t\t// If it's not a link format, check if it should be converted to a link\n\t\tif (!childRef.includes(\"/\") && currentFileDirectory !== undefined) {\n\t\t\t// This is a plain text reference that might need to be converted to a link\n\t\t\tconst potentialPath = currentFileDirectory\n\t\t\t\t? `${currentFileDirectory}/${childRef.endsWith(\".md\") ? childRef : `${childRef}.md`}`\n\t\t\t\t: childRef.endsWith(\".md\")\n\t\t\t\t\t? childRef\n\t\t\t\t\t: `${childRef}.md`;\n\t\t\tconst file = vault.getAbstractFileByPath(potentialPath);\n\t\t\tif (file instanceof TFile) {\n\t\t\t\treturn createFileLink(file);\n\t\t\t}\n\t\t}\n\t\treturn childRef;\n\t}\n\n\t// Handle relative references by making them absolute\n\tif (isRelativeChildReference(childRef) && currentFileDirectory) {\n\t\tconst absolutePath = `${currentFileDirectory}/${filePath}`;\n\t\tconst file = vault.getAbstractFileByPath(absolutePath);\n\t\tif (file instanceof TFile) {\n\t\t\treturn createFileLink(file);\n\t\t}\n\t}\n\n\t// For absolute references or when no directory context, try to find the file as-is\n\tconst file = vault.getAbstractFileByPath(filePath);\n\tif (file instanceof TFile) {\n\t\treturn createFileLink(file);\n\t}\n\n\treturn childRef;\n}\n\nexport function normalizeChildReferences(\n\tchildRefs: string[],\n\tvault: VaultAdapter,\n\tcurrentFileDirectory?: string\n): string[] {\n\treturn childRefs.map((childRef) => {\n\t\treturn normalizeChildReference(childRef, vault, currentFileDirectory);\n\t});\n}\n"]}
|