@real1ty-obsidian-plugins/utils 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/async-utils.d.ts +69 -0
  2. package/dist/async-utils.d.ts.map +1 -0
  3. package/dist/async-utils.js +108 -0
  4. package/dist/batch-operations.d.ts +11 -0
  5. package/dist/batch-operations.d.ts.map +1 -0
  6. package/dist/batch-operations.js +31 -0
  7. package/dist/child-reference-utils.d.ts +9 -0
  8. package/dist/child-reference-utils.d.ts.map +1 -0
  9. package/dist/child-reference-utils.js +57 -0
  10. package/dist/date-recurrence-utils.d.ts +30 -0
  11. package/dist/date-recurrence-utils.d.ts.map +1 -0
  12. package/dist/date-recurrence-utils.js +167 -0
  13. package/dist/date-utils.d.ts +21 -0
  14. package/dist/date-utils.d.ts.map +1 -0
  15. package/dist/date-utils.js +105 -0
  16. package/dist/evaluator-base.d.ts +52 -0
  17. package/dist/evaluator-base.d.ts.map +1 -0
  18. package/dist/evaluator-base.js +84 -0
  19. package/dist/file-operations.d.ts +31 -0
  20. package/dist/file-operations.d.ts.map +1 -0
  21. package/dist/file-operations.js +160 -0
  22. package/dist/file-utils.d.ts +6 -0
  23. package/dist/file-utils.d.ts.map +1 -0
  24. package/dist/file-utils.js +25 -0
  25. package/dist/generate.d.ts +7 -0
  26. package/dist/generate.d.ts.map +1 -0
  27. package/dist/generate.js +13 -0
  28. package/dist/index.d.ts +14 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +14 -0
  31. package/dist/link-parser.d.ts +9 -0
  32. package/dist/link-parser.d.ts.map +1 -0
  33. package/dist/link-parser.js +19 -0
  34. package/dist/settings-store.d.ts +19 -0
  35. package/dist/settings-store.d.ts.map +1 -0
  36. package/dist/settings-store.js +79 -0
  37. package/dist/string-utils.d.ts +5 -0
  38. package/dist/string-utils.d.ts.map +1 -0
  39. package/dist/string-utils.js +25 -0
  40. package/dist/templater-utils.d.ts +4 -0
  41. package/dist/templater-utils.d.ts.map +1 -0
  42. package/dist/templater-utils.js +51 -0
  43. package/dist/testing/index.d.ts +5 -0
  44. package/dist/testing/index.d.ts.map +1 -0
  45. package/dist/testing/index.js +6 -0
  46. package/dist/testing/mocks/obsidian.d.ts +149 -0
  47. package/dist/testing/mocks/obsidian.d.ts.map +1 -0
  48. package/dist/testing/mocks/obsidian.js +220 -0
  49. package/dist/testing/mocks/utils.d.ts +14 -0
  50. package/dist/testing/mocks/utils.d.ts.map +1 -0
  51. package/dist/testing/mocks/utils.js +85 -0
  52. package/dist/testing/setup.d.ts +2 -0
  53. package/dist/testing/setup.d.ts.map +1 -0
  54. package/dist/testing/setup.js +18 -0
  55. package/package.json +3 -3
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Handles different link formats and edge cases:
3
+ * [[FileName]] -> FileName.md
4
+ * [[Folder/FileName]] -> Folder/FileName.md
5
+ * [[Folder/FileName|DisplayName]] -> Folder/FileName.md
6
+ * Normalizes paths and handles malformed links gracefully.
7
+ */
8
+ export const extractFilePathFromLink = (link) => {
9
+ const match = link.match(/\[\[([^|\]]+?)(?:\|.*?)?\]\]/);
10
+ if (!match)
11
+ return null;
12
+ const filePath = match[1].trim();
13
+ if (!filePath)
14
+ return null;
15
+ if (filePath.includes("[[") || filePath.includes("]]"))
16
+ return null;
17
+ return filePath.endsWith(".md") ? filePath : `${filePath}.md`;
18
+ };
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluay1wYXJzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbGluay1wYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxJQUFZLEVBQWlCLEVBQUU7SUFDdEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQ3pELElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFeEIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2pDLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFM0IsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFcEUsT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxLQUFLLENBQUM7QUFDL0QsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBIYW5kbGVzIGRpZmZlcmVudCBsaW5rIGZvcm1hdHMgYW5kIGVkZ2UgY2FzZXM6XG4gKiBbW0ZpbGVOYW1lXV0gLT4gRmlsZU5hbWUubWRcbiAqIFtbRm9sZGVyL0ZpbGVOYW1lXV0gLT4gRm9sZGVyL0ZpbGVOYW1lLm1kXG4gKiBbW0ZvbGRlci9GaWxlTmFtZXxEaXNwbGF5TmFtZV1dIC0+IEZvbGRlci9GaWxlTmFtZS5tZFxuICogTm9ybWFsaXplcyBwYXRocyBhbmQgaGFuZGxlcyBtYWxmb3JtZWQgbGlua3MgZ3JhY2VmdWxseS5cbiAqL1xuZXhwb3J0IGNvbnN0IGV4dHJhY3RGaWxlUGF0aEZyb21MaW5rID0gKGxpbms6IHN0cmluZyk6IHN0cmluZyB8IG51bGwgPT4ge1xuXHRjb25zdCBtYXRjaCA9IGxpbmsubWF0Y2goL1xcW1xcWyhbXnxcXF1dKz8pKD86XFx8Lio/KT9cXF1cXF0vKTtcblx0aWYgKCFtYXRjaCkgcmV0dXJuIG51bGw7XG5cblx0Y29uc3QgZmlsZVBhdGggPSBtYXRjaFsxXS50cmltKCk7XG5cdGlmICghZmlsZVBhdGgpIHJldHVybiBudWxsO1xuXG5cdGlmIChmaWxlUGF0aC5pbmNsdWRlcyhcIltbXCIpIHx8IGZpbGVQYXRoLmluY2x1ZGVzKFwiXV1cIikpIHJldHVybiBudWxsO1xuXG5cdHJldHVybiBmaWxlUGF0aC5lbmRzV2l0aChcIi5tZFwiKSA/IGZpbGVQYXRoIDogYCR7ZmlsZVBhdGh9Lm1kYDtcbn07XG4iXX0=
@@ -0,0 +1,19 @@
1
+ import type { Plugin } from "obsidian";
2
+ import { BehaviorSubject } from "rxjs";
3
+ import type { z } from "zod";
4
+ export declare class SettingsStore<TSchema extends z.ZodTypeAny> {
5
+ private plugin;
6
+ private schema;
7
+ readonly settings$: BehaviorSubject<z.infer<TSchema>>;
8
+ constructor(plugin: Plugin, schema: TSchema);
9
+ get currentSettings(): z.infer<TSchema>;
10
+ loadSettings(): Promise<void>;
11
+ saveSettings(): Promise<void>;
12
+ updateSettings(updater: (settings: z.infer<TSchema>) => z.infer<TSchema>): Promise<void>;
13
+ resetSettings(): Promise<void>;
14
+ updateProperty<K extends keyof z.infer<TSchema>>(key: K, value: z.infer<TSchema>[K]): Promise<void>;
15
+ updateProperties(updates: Partial<z.infer<TSchema>>): Promise<void>;
16
+ getDefaults(): z.infer<TSchema>;
17
+ hasCustomizations(): boolean;
18
+ }
19
+ //# sourceMappingURL=settings-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-store.d.ts","sourceRoot":"","sources":["../src/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;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,79 @@
1
+ import { __awaiter } from "tslib";
2
+ import { BehaviorSubject } from "rxjs";
3
+ export class SettingsStore {
4
+ constructor(plugin, schema) {
5
+ this.plugin = plugin;
6
+ this.schema = schema;
7
+ this.settings$ = new BehaviorSubject(schema.parse({}));
8
+ }
9
+ get currentSettings() {
10
+ return this.settings$.value;
11
+ }
12
+ loadSettings() {
13
+ return __awaiter(this, void 0, void 0, function* () {
14
+ try {
15
+ const data = yield this.plugin.loadData();
16
+ const sanitized = this.schema.parse(data !== null && data !== void 0 ? data : {});
17
+ this.settings$.next(sanitized);
18
+ // Save back if data was sanitized/normalized
19
+ if (JSON.stringify(sanitized) !== JSON.stringify(data !== null && data !== void 0 ? data : {})) {
20
+ yield this.saveSettings();
21
+ }
22
+ }
23
+ catch (error) {
24
+ console.error("Failed to load settings, using defaults:", error);
25
+ this.settings$.next(this.schema.parse({}));
26
+ yield this.saveSettings();
27
+ }
28
+ });
29
+ }
30
+ saveSettings() {
31
+ return __awaiter(this, void 0, void 0, function* () {
32
+ yield this.plugin.saveData(this.currentSettings);
33
+ });
34
+ }
35
+ updateSettings(updater) {
36
+ return __awaiter(this, void 0, void 0, function* () {
37
+ try {
38
+ const newSettings = updater(this.currentSettings);
39
+ const validated = this.schema.parse(newSettings);
40
+ this.settings$.next(validated);
41
+ yield this.saveSettings();
42
+ }
43
+ catch (error) {
44
+ console.error("Failed to update settings:", error);
45
+ throw error;
46
+ }
47
+ });
48
+ }
49
+ resetSettings() {
50
+ return __awaiter(this, void 0, void 0, function* () {
51
+ this.settings$.next(this.schema.parse({}));
52
+ yield this.saveSettings();
53
+ });
54
+ }
55
+ updateProperty(key, value) {
56
+ return __awaiter(this, void 0, void 0, function* () {
57
+ yield this.updateSettings((settings) => {
58
+ const updated = Object.assign({}, settings);
59
+ updated[key] = value;
60
+ return updated;
61
+ });
62
+ });
63
+ }
64
+ updateProperties(updates) {
65
+ return __awaiter(this, void 0, void 0, function* () {
66
+ yield this.updateSettings((settings) => {
67
+ return Object.assign({}, settings, updates);
68
+ });
69
+ });
70
+ }
71
+ getDefaults() {
72
+ return this.schema.parse({});
73
+ }
74
+ hasCustomizations() {
75
+ const defaults = this.getDefaults();
76
+ return JSON.stringify(this.currentSettings) !== JSON.stringify(defaults);
77
+ }
78
+ }
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZ3Mtc3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2V0dGluZ3Mtc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHdkMsTUFBTSxPQUFPLGFBQWE7SUFLekIsWUFBWSxNQUFjLEVBQUUsTUFBZTtRQUMxQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksZUFBZSxDQUFtQixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVELElBQUksZUFBZTtRQUNsQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO0lBQzdCLENBQUM7SUFFSyxZQUFZOztZQUNqQixJQUFJLENBQUM7Z0JBQ0osTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUMxQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLGFBQUosSUFBSSxjQUFKLElBQUksR0FBSSxFQUFFLENBQUMsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBRS9CLDZDQUE2QztnQkFDN0MsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxhQUFKLElBQUksY0FBSixJQUFJLEdBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDOUQsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQzNCLENBQUM7WUFDRixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDakUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDM0MsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDM0IsQ0FBQztRQUNGLENBQUM7S0FBQTtJQUVLLFlBQVk7O1lBQ2pCLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2xELENBQUM7S0FBQTtJQUVLLGNBQWMsQ0FBQyxPQUF5RDs7WUFDN0UsSUFBSSxDQUFDO2dCQUNKLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ2xELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUVqRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDL0IsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDM0IsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ25ELE1BQU0sS0FBSyxDQUFDO1lBQ2IsQ0FBQztRQUNGLENBQUM7S0FBQTtJQUVLLGFBQWE7O1lBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0MsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDM0IsQ0FBQztLQUFBO0lBRUssY0FBYyxDQUNuQixHQUFNLEVBQ04sS0FBMEI7O1lBRTFCLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUN0QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDM0MsT0FBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDOUIsT0FBTyxPQUFPLENBQUM7WUFDaEIsQ0FBQyxDQUFDLENBQUM7UUFDSixDQUFDO0tBQUE7SUFFSyxnQkFBZ0IsQ0FBQyxPQUFrQzs7WUFDeEQsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ3RDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLENBQUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQztLQUFBO0lBRUQsV0FBVztRQUNWLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELGlCQUFpQjtRQUNoQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFFLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHR5cGUgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NTdG9yZTxUU2NoZW1hIGV4dGVuZHMgei5ab2RUeXBlQW55PiB7XG5cdHByaXZhdGUgcGx1Z2luOiBQbHVnaW47XG5cdHByaXZhdGUgc2NoZW1hOiBUU2NoZW1hO1xuXHRwdWJsaWMgcmVhZG9ubHkgc2V0dGluZ3MkOiBCZWhhdmlvclN1YmplY3Q8ei5pbmZlcjxUU2NoZW1hPj47XG5cblx0Y29uc3RydWN0b3IocGx1Z2luOiBQbHVnaW4sIHNjaGVtYTogVFNjaGVtYSkge1xuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xuXHRcdHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuXHRcdHRoaXMuc2V0dGluZ3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx6LmluZmVyPFRTY2hlbWE+PihzY2hlbWEucGFyc2Uoe30pKTtcblx0fVxuXG5cdGdldCBjdXJyZW50U2V0dGluZ3MoKTogei5pbmZlcjxUU2NoZW1hPiB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0dGluZ3MkLnZhbHVlO1xuXHR9XG5cblx0YXN5bmMgbG9hZFNldHRpbmdzKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5wbHVnaW4ubG9hZERhdGEoKTtcblx0XHRcdGNvbnN0IHNhbml0aXplZCA9IHRoaXMuc2NoZW1hLnBhcnNlKGRhdGEgPz8ge30pO1xuXHRcdFx0dGhpcy5zZXR0aW5ncyQubmV4dChzYW5pdGl6ZWQpO1xuXG5cdFx0XHQvLyBTYXZlIGJhY2sgaWYgZGF0YSB3YXMgc2FuaXRpemVkL25vcm1hbGl6ZWRcblx0XHRcdGlmIChKU09OLnN0cmluZ2lmeShzYW5pdGl6ZWQpICE9PSBKU09OLnN0cmluZ2lmeShkYXRhID8/IHt9KSkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGxvYWQgc2V0dGluZ3MsIHVzaW5nIGRlZmF1bHRzOlwiLCBlcnJvcik7XG5cdFx0XHR0aGlzLnNldHRpbmdzJC5uZXh0KHRoaXMuc2NoZW1hLnBhcnNlKHt9KSk7XG5cdFx0XHRhd2FpdCB0aGlzLnNhdmVTZXR0aW5ncygpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLmN1cnJlbnRTZXR0aW5ncyk7XG5cdH1cblxuXHRhc3luYyB1cGRhdGVTZXR0aW5ncyh1cGRhdGVyOiAoc2V0dGluZ3M6IHouaW5mZXI8VFNjaGVtYT4pID0+IHouaW5mZXI8VFNjaGVtYT4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgbmV3U2V0dGluZ3MgPSB1cGRhdGVyKHRoaXMuY3VycmVudFNldHRpbmdzKTtcblx0XHRcdGNvbnN0IHZhbGlkYXRlZCA9IHRoaXMuc2NoZW1hLnBhcnNlKG5ld1NldHRpbmdzKTtcblxuXHRcdFx0dGhpcy5zZXR0aW5ncyQubmV4dCh2YWxpZGF0ZWQpO1xuXHRcdFx0YXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcIkZhaWxlZCB0byB1cGRhdGUgc2V0dGluZ3M6XCIsIGVycm9yKTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIHJlc2V0U2V0dGluZ3MoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5zZXR0aW5ncyQubmV4dCh0aGlzLnNjaGVtYS5wYXJzZSh7fSkpO1xuXHRcdGF3YWl0IHRoaXMuc2F2ZVNldHRpbmdzKCk7XG5cdH1cblxuXHRhc3luYyB1cGRhdGVQcm9wZXJ0eTxLIGV4dGVuZHMga2V5b2Ygei5pbmZlcjxUU2NoZW1hPj4oXG5cdFx0a2V5OiBLLFxuXHRcdHZhbHVlOiB6LmluZmVyPFRTY2hlbWE+W0tdXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGF3YWl0IHRoaXMudXBkYXRlU2V0dGluZ3MoKHNldHRpbmdzKSA9PiB7XG5cdFx0XHRjb25zdCB1cGRhdGVkID0gT2JqZWN0LmFzc2lnbih7fSwgc2V0dGluZ3MpO1xuXHRcdFx0KHVwZGF0ZWQgYXMgYW55KVtrZXldID0gdmFsdWU7XG5cdFx0XHRyZXR1cm4gdXBkYXRlZDtcblx0XHR9KTtcblx0fVxuXG5cdGFzeW5jIHVwZGF0ZVByb3BlcnRpZXModXBkYXRlczogUGFydGlhbDx6LmluZmVyPFRTY2hlbWE+Pik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGF3YWl0IHRoaXMudXBkYXRlU2V0dGluZ3MoKHNldHRpbmdzKSA9PiB7XG5cdFx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc2V0dGluZ3MsIHVwZGF0ZXMpO1xuXHRcdH0pO1xuXHR9XG5cblx0Z2V0RGVmYXVsdHMoKTogei5pbmZlcjxUU2NoZW1hPiB7XG5cdFx0cmV0dXJuIHRoaXMuc2NoZW1hLnBhcnNlKHt9KTtcblx0fVxuXG5cdGhhc0N1c3RvbWl6YXRpb25zKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGRlZmF1bHRzID0gdGhpcy5nZXREZWZhdWx0cygpO1xuXHRcdHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLmN1cnJlbnRTZXR0aW5ncykgIT09IEpTT04uc3RyaW5naWZ5KGRlZmF1bHRzKTtcblx0fVxufVxuIl19
@@ -0,0 +1,5 @@
1
+ export declare const capitalize: (str: string) => string;
2
+ export declare const generateDuplicatedTitle: (originalTitle: string) => string;
3
+ export declare const pluralize: (count: number) => string;
4
+ export declare const getWeekDirection: (weeks: number) => "next" | "previous";
5
+ //# sourceMappingURL=string-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string-utils.d.ts","sourceRoot":"","sources":["../src/string-utils.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,25 @@
1
+ export const capitalize = (str) => {
2
+ if (!str)
3
+ return str;
4
+ return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
5
+ };
6
+ export const generateDuplicatedTitle = (originalTitle) => {
7
+ // Check if title already has a counter pattern like " (2)", " - Copy", etc.
8
+ const counterMatch = originalTitle.match(/^(.*?)(?:\s*\((\d+)\)|\s*-?\s*Copy(?:\s*(\d+))?)$/);
9
+ if (counterMatch) {
10
+ const baseName = counterMatch[1];
11
+ const existingCounter = counterMatch[2] || counterMatch[3];
12
+ const nextCounter = existingCounter ? parseInt(existingCounter, 10) + 1 : 2;
13
+ return `${baseName} (${nextCounter})`;
14
+ }
15
+ else {
16
+ return `${originalTitle} (2)`;
17
+ }
18
+ };
19
+ export const pluralize = (count) => {
20
+ return count === 1 ? "" : "s";
21
+ };
22
+ export const getWeekDirection = (weeks) => {
23
+ return weeks > 0 ? "next" : "previous";
24
+ };
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0cmluZy11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFXLEVBQVUsRUFBRTtJQUNqRCxJQUFJLENBQUMsR0FBRztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3JCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ2pFLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsYUFBcUIsRUFBVSxFQUFFO0lBQ3hFLDRFQUE0RTtJQUM1RSxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFFOUYsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNsQixNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRCxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsT0FBTyxHQUFHLFFBQVEsS0FBSyxXQUFXLEdBQUcsQ0FBQztJQUN2QyxDQUFDO1NBQU0sQ0FBQztRQUNQLE9BQU8sR0FBRyxhQUFhLE1BQU0sQ0FBQztJQUMvQixDQUFDO0FBQ0YsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBYSxFQUFVLEVBQUU7SUFDbEQsT0FBTyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUMvQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEtBQWEsRUFBdUIsRUFBRTtJQUN0RSxPQUFPLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0FBQ3hDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBjYXBpdGFsaXplID0gKHN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcblx0aWYgKCFzdHIpIHJldHVybiBzdHI7XG5cdHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUR1cGxpY2F0ZWRUaXRsZSA9IChvcmlnaW5hbFRpdGxlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuXHQvLyBDaGVjayBpZiB0aXRsZSBhbHJlYWR5IGhhcyBhIGNvdW50ZXIgcGF0dGVybiBsaWtlIFwiICgyKVwiLCBcIiAtIENvcHlcIiwgZXRjLlxuXHRjb25zdCBjb3VudGVyTWF0Y2ggPSBvcmlnaW5hbFRpdGxlLm1hdGNoKC9eKC4qPykoPzpcXHMqXFwoKFxcZCspXFwpfFxccyotP1xccypDb3B5KD86XFxzKihcXGQrKSk/KSQvKTtcblxuXHRpZiAoY291bnRlck1hdGNoKSB7XG5cdFx0Y29uc3QgYmFzZU5hbWUgPSBjb3VudGVyTWF0Y2hbMV07XG5cdFx0Y29uc3QgZXhpc3RpbmdDb3VudGVyID0gY291bnRlck1hdGNoWzJdIHx8IGNvdW50ZXJNYXRjaFszXTtcblx0XHRjb25zdCBuZXh0Q291bnRlciA9IGV4aXN0aW5nQ291bnRlciA/IHBhcnNlSW50KGV4aXN0aW5nQ291bnRlciwgMTApICsgMSA6IDI7XG5cdFx0cmV0dXJuIGAke2Jhc2VOYW1lfSAoJHtuZXh0Q291bnRlcn0pYDtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gYCR7b3JpZ2luYWxUaXRsZX0gKDIpYDtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IHBsdXJhbGl6ZSA9IChjb3VudDogbnVtYmVyKTogc3RyaW5nID0+IHtcblx0cmV0dXJuIGNvdW50ID09PSAxID8gXCJcIiA6IFwic1wiO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFdlZWtEaXJlY3Rpb24gPSAod2Vla3M6IG51bWJlcik6IFwibmV4dFwiIHwgXCJwcmV2aW91c1wiID0+IHtcblx0cmV0dXJuIHdlZWtzID4gMCA/IFwibmV4dFwiIDogXCJwcmV2aW91c1wiO1xufTtcbiJdfQ==
@@ -0,0 +1,4 @@
1
+ import { type App, type TFile } from "obsidian";
2
+ export declare function isTemplaterAvailable(app: App): boolean;
3
+ export declare function createFromTemplate(app: App, templatePath: string, targetFolder?: string, filename?: string, openNewNote?: boolean): Promise<TFile | null>;
4
+ //# sourceMappingURL=templater-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templater-utils.d.ts","sourceRoot":"","sources":["../src/templater-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAyB,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;AAgCvE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAGtD;AAED,wBAAsB,kBAAkB,CACvC,GAAG,EAAE,GAAG,EACR,YAAY,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,MAAM,EACjB,WAAW,UAAQ,GACjB,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CA+BvB"}
@@ -0,0 +1,51 @@
1
+ import { __awaiter } from "tslib";
2
+ import { Notice, normalizePath } from "obsidian";
3
+ const TEMPLATER_ID = "templater-obsidian";
4
+ function waitForTemplater(app_1) {
5
+ return __awaiter(this, arguments, void 0, function* (app, timeoutMs = 8000) {
6
+ var _a, _b, _c, _d;
7
+ yield new Promise((resolve) => app.workspace.onLayoutReady(resolve));
8
+ const started = Date.now();
9
+ while (Date.now() - started < timeoutMs) {
10
+ const plug = (_b = (_a = app.plugins) === null || _a === void 0 ? void 0 : _a.getPlugin) === null || _b === void 0 ? void 0 : _b.call(_a, TEMPLATER_ID);
11
+ const api = (_c = plug === null || plug === void 0 ? void 0 : plug.templater) !== null && _c !== void 0 ? _c : null;
12
+ const createFn = (_d = api === null || api === void 0 ? void 0 : api.create_new_note_from_template) === null || _d === void 0 ? void 0 : _d.bind(api);
13
+ if (typeof createFn === "function") {
14
+ return { create_new_note_from_template: createFn };
15
+ }
16
+ yield new Promise((r) => setTimeout(r, 150));
17
+ }
18
+ return null;
19
+ });
20
+ }
21
+ export function isTemplaterAvailable(app) {
22
+ var _a, _b;
23
+ const instance = (_b = (_a = app.plugins) === null || _a === void 0 ? void 0 : _a.getPlugin) === null || _b === void 0 ? void 0 : _b.call(_a, TEMPLATER_ID);
24
+ return !!instance;
25
+ }
26
+ export function createFromTemplate(app_1, templatePath_1, targetFolder_1, filename_1) {
27
+ return __awaiter(this, arguments, void 0, function* (app, templatePath, targetFolder, filename, openNewNote = false) {
28
+ const templater = yield waitForTemplater(app);
29
+ if (!templater) {
30
+ console.warn("Templater isn't ready yet (or not installed/enabled).");
31
+ new Notice("Templater plugin is not available or enabled. Please ensure it is installed and enabled.");
32
+ return null;
33
+ }
34
+ const templateFile = app.vault.getFileByPath(normalizePath(templatePath));
35
+ if (!templateFile) {
36
+ console.error(`Template not found: ${templatePath}`);
37
+ new Notice(`Template file not found: ${templatePath}. Please ensure the template file exists.`);
38
+ return null;
39
+ }
40
+ try {
41
+ const newFile = yield templater.create_new_note_from_template(templateFile, targetFolder, filename, openNewNote);
42
+ return newFile !== null && newFile !== void 0 ? newFile : null;
43
+ }
44
+ catch (error) {
45
+ console.error("Error creating file from template:", error);
46
+ new Notice("Error creating file from template. Please ensure the template file is valid.");
47
+ return null;
48
+ }
49
+ });
50
+ }
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVyLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RlbXBsYXRlci11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFZLE1BQU0sRUFBRSxhQUFhLEVBQWMsTUFBTSxVQUFVLENBQUM7QUFFdkUsTUFBTSxZQUFZLEdBQUcsb0JBQW9CLENBQUM7QUFhMUMsU0FBZSxnQkFBZ0I7eURBQUMsR0FBUSxFQUFFLFNBQVMsR0FBRyxJQUFJOztRQUN6RCxNQUFNLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRTNFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMzQixPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLEdBQUcsU0FBUyxFQUFFLENBQUM7WUFDekMsTUFBTSxJQUFJLEdBQVEsTUFBQSxNQUFDLEdBQVcsQ0FBQyxPQUFPLDBDQUFFLFNBQVMsbURBQUcsWUFBWSxDQUFDLENBQUM7WUFDbEUsTUFBTSxHQUFHLEdBQUcsTUFBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsU0FBUyxtQ0FBSSxJQUFJLENBQUM7WUFFcEMsTUFBTSxRQUFRLEdBQXlCLE1BQUEsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLDZCQUE2QiwwQ0FBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckYsSUFBSSxPQUFPLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDcEMsT0FBTyxFQUFFLDZCQUE2QixFQUFFLFFBQVEsRUFBRSxDQUFDO1lBQ3BELENBQUM7WUFDRCxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztDQUFBO0FBRUQsTUFBTSxVQUFVLG9CQUFvQixDQUFDLEdBQVE7O0lBQzVDLE1BQU0sUUFBUSxHQUFHLE1BQUEsTUFBQyxHQUFXLENBQUMsT0FBTywwQ0FBRSxTQUFTLG1EQUFHLFlBQVksQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQztBQUNuQixDQUFDO0FBRUQsTUFBTSxVQUFnQixrQkFBa0I7eURBQ3ZDLEdBQVEsRUFDUixZQUFvQixFQUNwQixZQUFxQixFQUNyQixRQUFpQixFQUNqQixXQUFXLEdBQUcsS0FBSztRQUVuQixNQUFNLFNBQVMsR0FBRyxNQUFNLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLHVEQUF1RCxDQUFDLENBQUM7WUFDdEUsSUFBSSxNQUFNLENBQ1QsMEZBQTBGLENBQzFGLENBQUM7WUFDRixPQUFPLElBQUksQ0FBQztRQUNiLENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUNyRCxJQUFJLE1BQU0sQ0FBQyw0QkFBNEIsWUFBWSwyQ0FBMkMsQ0FBQyxDQUFDO1lBQ2hHLE9BQU8sSUFBSSxDQUFDO1FBQ2IsQ0FBQztRQUVELElBQUksQ0FBQztZQUNKLE1BQU0sT0FBTyxHQUFHLE1BQU0sU0FBUyxDQUFDLDZCQUE2QixDQUM1RCxZQUFZLEVBQ1osWUFBWSxFQUNaLFFBQVEsRUFDUixXQUFXLENBQ1gsQ0FBQztZQUVGLE9BQU8sT0FBTyxhQUFQLE9BQU8sY0FBUCxPQUFPLEdBQUksSUFBSSxDQUFDO1FBQ3hCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDM0QsSUFBSSxNQUFNLENBQUMsOEVBQThFLENBQUMsQ0FBQztZQUMzRixPQUFPLElBQUksQ0FBQztRQUNiLENBQUM7SUFDRixDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEFwcCwgTm90aWNlLCBub3JtYWxpemVQYXRoLCB0eXBlIFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmNvbnN0IFRFTVBMQVRFUl9JRCA9IFwidGVtcGxhdGVyLW9ic2lkaWFuXCI7XG5cbnR5cGUgQ3JlYXRlRm4gPSAoXG5cdHRlbXBsYXRlRmlsZTogVEZpbGUsXG5cdGZvbGRlcj86IHN0cmluZyxcblx0ZmlsZW5hbWU/OiBzdHJpbmcsXG5cdG9wZW5OZXdOb3RlPzogYm9vbGVhblxuKSA9PiBQcm9taXNlPFRGaWxlIHwgdW5kZWZpbmVkPjtcblxuaW50ZXJmYWNlIFRlbXBsYXRlckxpa2Uge1xuXHRjcmVhdGVfbmV3X25vdGVfZnJvbV90ZW1wbGF0ZTogQ3JlYXRlRm47XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JUZW1wbGF0ZXIoYXBwOiBBcHAsIHRpbWVvdXRNcyA9IDgwMDApOiBQcm9taXNlPFRlbXBsYXRlckxpa2UgfCBudWxsPiB7XG5cdGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiBhcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkocmVzb2x2ZSkpO1xuXG5cdGNvbnN0IHN0YXJ0ZWQgPSBEYXRlLm5vdygpO1xuXHR3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0ZWQgPCB0aW1lb3V0TXMpIHtcblx0XHRjb25zdCBwbHVnOiBhbnkgPSAoYXBwIGFzIGFueSkucGx1Z2lucz8uZ2V0UGx1Z2luPy4oVEVNUExBVEVSX0lEKTtcblx0XHRjb25zdCBhcGkgPSBwbHVnPy50ZW1wbGF0ZXIgPz8gbnVsbDtcblxuXHRcdGNvbnN0IGNyZWF0ZUZuOiBDcmVhdGVGbiB8IHVuZGVmaW5lZCA9IGFwaT8uY3JlYXRlX25ld19ub3RlX2Zyb21fdGVtcGxhdGU/LmJpbmQoYXBpKTtcblx0XHRpZiAodHlwZW9mIGNyZWF0ZUZuID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdHJldHVybiB7IGNyZWF0ZV9uZXdfbm90ZV9mcm9tX3RlbXBsYXRlOiBjcmVhdGVGbiB9O1xuXHRcdH1cblx0XHRhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCAxNTApKTtcblx0fVxuXHRyZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGVtcGxhdGVyQXZhaWxhYmxlKGFwcDogQXBwKTogYm9vbGVhbiB7XG5cdGNvbnN0IGluc3RhbmNlID0gKGFwcCBhcyBhbnkpLnBsdWdpbnM/LmdldFBsdWdpbj8uKFRFTVBMQVRFUl9JRCk7XG5cdHJldHVybiAhIWluc3RhbmNlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRnJvbVRlbXBsYXRlKFxuXHRhcHA6IEFwcCxcblx0dGVtcGxhdGVQYXRoOiBzdHJpbmcsXG5cdHRhcmdldEZvbGRlcj86IHN0cmluZyxcblx0ZmlsZW5hbWU/OiBzdHJpbmcsXG5cdG9wZW5OZXdOb3RlID0gZmFsc2Vcbik6IFByb21pc2U8VEZpbGUgfCBudWxsPiB7XG5cdGNvbnN0IHRlbXBsYXRlciA9IGF3YWl0IHdhaXRGb3JUZW1wbGF0ZXIoYXBwKTtcblx0aWYgKCF0ZW1wbGF0ZXIpIHtcblx0XHRjb25zb2xlLndhcm4oXCJUZW1wbGF0ZXIgaXNuJ3QgcmVhZHkgeWV0IChvciBub3QgaW5zdGFsbGVkL2VuYWJsZWQpLlwiKTtcblx0XHRuZXcgTm90aWNlKFxuXHRcdFx0XCJUZW1wbGF0ZXIgcGx1Z2luIGlzIG5vdCBhdmFpbGFibGUgb3IgZW5hYmxlZC4gUGxlYXNlIGVuc3VyZSBpdCBpcyBpbnN0YWxsZWQgYW5kIGVuYWJsZWQuXCJcblx0XHQpO1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Y29uc3QgdGVtcGxhdGVGaWxlID0gYXBwLnZhdWx0LmdldEZpbGVCeVBhdGgobm9ybWFsaXplUGF0aCh0ZW1wbGF0ZVBhdGgpKTtcblx0aWYgKCF0ZW1wbGF0ZUZpbGUpIHtcblx0XHRjb25zb2xlLmVycm9yKGBUZW1wbGF0ZSBub3QgZm91bmQ6ICR7dGVtcGxhdGVQYXRofWApO1xuXHRcdG5ldyBOb3RpY2UoYFRlbXBsYXRlIGZpbGUgbm90IGZvdW5kOiAke3RlbXBsYXRlUGF0aH0uIFBsZWFzZSBlbnN1cmUgdGhlIHRlbXBsYXRlIGZpbGUgZXhpc3RzLmApO1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0dHJ5IHtcblx0XHRjb25zdCBuZXdGaWxlID0gYXdhaXQgdGVtcGxhdGVyLmNyZWF0ZV9uZXdfbm90ZV9mcm9tX3RlbXBsYXRlKFxuXHRcdFx0dGVtcGxhdGVGaWxlLFxuXHRcdFx0dGFyZ2V0Rm9sZGVyLFxuXHRcdFx0ZmlsZW5hbWUsXG5cdFx0XHRvcGVuTmV3Tm90ZVxuXHRcdCk7XG5cblx0XHRyZXR1cm4gbmV3RmlsZSA/PyBudWxsO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdGNvbnNvbGUuZXJyb3IoXCJFcnJvciBjcmVhdGluZyBmaWxlIGZyb20gdGVtcGxhdGU6XCIsIGVycm9yKTtcblx0XHRuZXcgTm90aWNlKFwiRXJyb3IgY3JlYXRpbmcgZmlsZSBmcm9tIHRlbXBsYXRlLiBQbGVhc2UgZW5zdXJlIHRoZSB0ZW1wbGF0ZSBmaWxlIGlzIHZhbGlkLlwiKTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxufVxuIl19
@@ -0,0 +1,5 @@
1
+ export * from "./mocks/obsidian";
2
+ export { createMockApp, createMockFile, createMockFileCache, Modal, Notice, Plugin, PluginSettingTab, Setting, TFile, } from "./mocks/obsidian";
3
+ export * from "./mocks/utils";
4
+ export { mockFileOperations, mockLinkParser, resetAllMocks, setupDefaultMockImplementations, setupMockImplementation, setupMockReturnValue, verifyMockCalls, } from "./mocks/utils";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AAEjC,OAAO,EACN,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,KAAK,EACL,MAAM,EACN,MAAM,EACN,gBAAgB,EAChB,OAAO,EACP,KAAK,GACL,MAAM,kBAAkB,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,OAAO,EACN,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,+BAA+B,EAC/B,uBAAuB,EACvB,oBAAoB,EACpB,eAAe,GACf,MAAM,eAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from "./mocks/obsidian";
2
+ // Re-export commonly used combinations
3
+ export { createMockApp, createMockFile, createMockFileCache, Modal, Notice, Plugin, PluginSettingTab, Setting, TFile, } from "./mocks/obsidian";
4
+ export * from "./mocks/utils";
5
+ export { mockFileOperations, mockLinkParser, resetAllMocks, setupDefaultMockImplementations, setupMockImplementation, setupMockReturnValue, verifyMockCalls, } from "./mocks/utils";
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLHVDQUF1QztBQUN2QyxPQUFPLEVBQ04sYUFBYSxFQUNiLGNBQWMsRUFDZCxtQkFBbUIsRUFDbkIsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxLQUFLLEdBQ0wsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixjQUFjLGVBQWUsQ0FBQztBQUM5QixPQUFPLEVBQ04sa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxhQUFhLEVBQ2IsK0JBQStCLEVBQy9CLHVCQUF1QixFQUN2QixvQkFBb0IsRUFDcEIsZUFBZSxHQUNmLE1BQU0sZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vbW9ja3Mvb2JzaWRpYW5cIjtcbi8vIFJlLWV4cG9ydCBjb21tb25seSB1c2VkIGNvbWJpbmF0aW9uc1xuZXhwb3J0IHtcblx0Y3JlYXRlTW9ja0FwcCxcblx0Y3JlYXRlTW9ja0ZpbGUsXG5cdGNyZWF0ZU1vY2tGaWxlQ2FjaGUsXG5cdE1vZGFsLFxuXHROb3RpY2UsXG5cdFBsdWdpbixcblx0UGx1Z2luU2V0dGluZ1RhYixcblx0U2V0dGluZyxcblx0VEZpbGUsXG59IGZyb20gXCIuL21vY2tzL29ic2lkaWFuXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2Nrcy91dGlsc1wiO1xuZXhwb3J0IHtcblx0bW9ja0ZpbGVPcGVyYXRpb25zLFxuXHRtb2NrTGlua1BhcnNlcixcblx0cmVzZXRBbGxNb2Nrcyxcblx0c2V0dXBEZWZhdWx0TW9ja0ltcGxlbWVudGF0aW9ucyxcblx0c2V0dXBNb2NrSW1wbGVtZW50YXRpb24sXG5cdHNldHVwTW9ja1JldHVyblZhbHVlLFxuXHR2ZXJpZnlNb2NrQ2FsbHMsXG59IGZyb20gXCIuL21vY2tzL3V0aWxzXCI7XG4iXX0=
@@ -0,0 +1,149 @@
1
+ import { vi } from "vitest";
2
+ export declare class Plugin {
3
+ app: any;
4
+ manifest: any;
5
+ settings: any;
6
+ constructor(app: any, manifest: any);
7
+ addSettingTab: import("vitest").Mock<(...args: any[]) => any>;
8
+ registerEvent: import("vitest").Mock<(...args: any[]) => any>;
9
+ loadData: import("vitest").Mock<(...args: any[]) => any>;
10
+ saveData: import("vitest").Mock<(...args: any[]) => any>;
11
+ onload: import("vitest").Mock<(...args: any[]) => any>;
12
+ onunload: import("vitest").Mock<(...args: any[]) => any>;
13
+ addRibbonIcon: import("vitest").Mock<(...args: any[]) => any>;
14
+ addStatusBarItem: import("vitest").Mock<(...args: any[]) => any>;
15
+ addCommand: import("vitest").Mock<(...args: any[]) => any>;
16
+ removeCommand: import("vitest").Mock<(...args: any[]) => any>;
17
+ registerDomEvent: import("vitest").Mock<(...args: any[]) => any>;
18
+ registerCodeMirror: import("vitest").Mock<(...args: any[]) => any>;
19
+ registerEditorExtension: import("vitest").Mock<(...args: any[]) => any>;
20
+ registerMarkdownPostProcessor: import("vitest").Mock<(...args: any[]) => any>;
21
+ registerMarkdownCodeBlockProcessor: import("vitest").Mock<(...args: any[]) => any>;
22
+ registerObsidianProtocolHandler: import("vitest").Mock<(...args: any[]) => any>;
23
+ registerEditorSuggest: import("vitest").Mock<(...args: any[]) => any>;
24
+ registerHoverLinkSource: import("vitest").Mock<(...args: any[]) => any>;
25
+ registerInterval: import("vitest").Mock<(...args: any[]) => any>;
26
+ registerView: import("vitest").Mock<(...args: any[]) => any>;
27
+ registerExtensions: import("vitest").Mock<(...args: any[]) => any>;
28
+ onUserEnable: import("vitest").Mock<(...args: any[]) => any>;
29
+ load: import("vitest").Mock<(...args: any[]) => any>;
30
+ unload: import("vitest").Mock<(...args: any[]) => any>;
31
+ addChild: import("vitest").Mock<(...args: any[]) => any>;
32
+ removeChild: import("vitest").Mock<(...args: any[]) => any>;
33
+ register: import("vitest").Mock<(...args: any[]) => any>;
34
+ }
35
+ export declare class PluginSettingTab {
36
+ app: any;
37
+ plugin: any;
38
+ containerEl: HTMLElement;
39
+ constructor(app: any, plugin: any);
40
+ display: import("vitest").Mock<(...args: any[]) => any>;
41
+ }
42
+ export declare class ItemView {
43
+ app: any;
44
+ leaf: any;
45
+ containerEl: HTMLElement;
46
+ constructor(leaf: any);
47
+ getViewType(): string;
48
+ getDisplayText(): string;
49
+ getIcon(): string;
50
+ getState: import("vitest").Mock<(...args: any[]) => any>;
51
+ setState: import("vitest").Mock<(...args: any[]) => any>;
52
+ }
53
+ export declare class Setting {
54
+ settingEl: HTMLElement;
55
+ nameEl: HTMLElement;
56
+ descEl: HTMLElement;
57
+ controlEl: HTMLElement;
58
+ constructor(_containerEl: HTMLElement);
59
+ setName: import("vitest").Mock<(...args: any[]) => any>;
60
+ setDesc: import("vitest").Mock<(...args: any[]) => any>;
61
+ addText: import("vitest").Mock<(...args: any[]) => any>;
62
+ addTextArea: import("vitest").Mock<(...args: any[]) => any>;
63
+ }
64
+ export declare class TFolder {
65
+ path: string;
66
+ name: string;
67
+ children: any[];
68
+ vault: any;
69
+ parent: TFolder | null;
70
+ constructor(path: string);
71
+ isRoot(): boolean;
72
+ }
73
+ export declare class TFile {
74
+ path: string;
75
+ name: string;
76
+ basename: string;
77
+ extension: string;
78
+ stat: any;
79
+ vault: any;
80
+ parent: TFolder | null;
81
+ constructor(path: string, parentPath?: string);
82
+ }
83
+ export declare class Modal {
84
+ app: any;
85
+ containerEl: HTMLElement;
86
+ titleEl: HTMLElement;
87
+ contentEl: HTMLElement;
88
+ constructor(app: any);
89
+ open: import("vitest").Mock<(...args: any[]) => any>;
90
+ close: import("vitest").Mock<(...args: any[]) => any>;
91
+ onOpen: import("vitest").Mock<(...args: any[]) => any>;
92
+ onClose: import("vitest").Mock<(...args: any[]) => any>;
93
+ }
94
+ export declare class Notice {
95
+ constructor(message: string);
96
+ }
97
+ export declare const MarkdownRenderer: {
98
+ render: import("vitest").Mock<(...args: any[]) => any>;
99
+ };
100
+ export declare function debounce<T extends (...args: any[]) => any>(func: T, wait: number, immediate?: boolean): T;
101
+ export declare const App: import("vitest").Mock<(...args: any[]) => any>;
102
+ export interface MockApp {
103
+ fileManager: {
104
+ processFrontMatter: ReturnType<typeof vi.fn>;
105
+ };
106
+ metadataCache: {
107
+ getFileCache: ReturnType<typeof vi.fn>;
108
+ };
109
+ vault: {
110
+ getAbstractFileByPath: ReturnType<typeof vi.fn>;
111
+ on: ReturnType<typeof vi.fn>;
112
+ read: ReturnType<typeof vi.fn>;
113
+ modify: ReturnType<typeof vi.fn>;
114
+ create: ReturnType<typeof vi.fn>;
115
+ delete: ReturnType<typeof vi.fn>;
116
+ rename: ReturnType<typeof vi.fn>;
117
+ getFiles: ReturnType<typeof vi.fn>;
118
+ getMarkdownFiles: ReturnType<typeof vi.fn>;
119
+ getFolderByPath: ReturnType<typeof vi.fn>;
120
+ };
121
+ workspace: {
122
+ getActiveFile: ReturnType<typeof vi.fn>;
123
+ on: ReturnType<typeof vi.fn>;
124
+ };
125
+ }
126
+ export declare function createMockApp(): MockApp;
127
+ export declare function createMockFile(path: string, options?: {
128
+ basename?: string;
129
+ parentPath?: string;
130
+ extension?: string;
131
+ }): TFile;
132
+ export declare function createMockFileCache(frontmatter?: Record<string, any>): {
133
+ frontmatter: Record<string, any>;
134
+ frontmatterPosition: {
135
+ start: {
136
+ line: number;
137
+ };
138
+ end: {
139
+ line: number;
140
+ };
141
+ } | null;
142
+ sections: never[];
143
+ headings: never[];
144
+ links: never[];
145
+ embeds: never[];
146
+ tags: never[];
147
+ listItems: never[];
148
+ };
149
+ //# sourceMappingURL=obsidian.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obsidian.d.ts","sourceRoot":"","sources":["../../../src/testing/mocks/obsidian.ts"],"names":[],"mappings":"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"}