@real1ty-obsidian-plugins/utils 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +90 -0
  3. package/dist/async-utils.d.ts +69 -0
  4. package/dist/async-utils.d.ts.map +1 -0
  5. package/dist/async-utils.js +108 -0
  6. package/dist/batch-operations.d.ts +11 -0
  7. package/dist/batch-operations.d.ts.map +1 -0
  8. package/dist/batch-operations.js +31 -0
  9. package/dist/child-reference-utils.d.ts +9 -0
  10. package/dist/child-reference-utils.d.ts.map +1 -0
  11. package/dist/child-reference-utils.js +57 -0
  12. package/dist/date-recurrence-utils.d.ts +32 -0
  13. package/dist/date-recurrence-utils.d.ts.map +1 -0
  14. package/dist/date-recurrence-utils.js +117 -0
  15. package/dist/date-utils.d.ts +20 -0
  16. package/dist/date-utils.d.ts.map +1 -0
  17. package/dist/date-utils.js +105 -0
  18. package/dist/evaluator-base.d.ts +52 -0
  19. package/dist/evaluator-base.d.ts.map +1 -0
  20. package/dist/evaluator-base.js +84 -0
  21. package/dist/file-operations.d.ts +31 -0
  22. package/dist/file-operations.d.ts.map +1 -0
  23. package/dist/file-operations.js +160 -0
  24. package/dist/file-utils.d.ts +6 -0
  25. package/dist/file-utils.d.ts.map +1 -0
  26. package/dist/file-utils.js +25 -0
  27. package/dist/generate.d.ts +7 -0
  28. package/dist/generate.d.ts.map +1 -0
  29. package/dist/generate.js +13 -0
  30. package/dist/index.d.ts +14 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +14 -0
  33. package/dist/link-parser.d.ts +9 -0
  34. package/dist/link-parser.d.ts.map +1 -0
  35. package/dist/link-parser.js +19 -0
  36. package/dist/settings-store.d.ts +19 -0
  37. package/dist/settings-store.d.ts.map +1 -0
  38. package/dist/settings-store.js +79 -0
  39. package/dist/string-utils.d.ts +5 -0
  40. package/dist/string-utils.d.ts.map +1 -0
  41. package/dist/string-utils.js +25 -0
  42. package/dist/templater-utils.d.ts +4 -0
  43. package/dist/templater-utils.d.ts.map +1 -0
  44. package/dist/templater-utils.js +51 -0
  45. package/dist/testing/index.d.ts +5 -0
  46. package/dist/testing/index.d.ts.map +1 -0
  47. package/dist/testing/index.js +6 -0
  48. package/dist/testing/mocks/obsidian.d.ts +149 -0
  49. package/dist/testing/mocks/obsidian.d.ts.map +1 -0
  50. package/dist/testing/mocks/obsidian.js +220 -0
  51. package/dist/testing/mocks/utils.d.ts +14 -0
  52. package/dist/testing/mocks/utils.d.ts.map +1 -0
  53. package/dist/testing/mocks/utils.js +85 -0
  54. package/dist/testing/setup.d.ts +2 -0
  55. package/dist/testing/setup.d.ts.map +1 -0
  56. package/dist/testing/setup.js +18 -0
  57. package/package.json +112 -0
@@ -0,0 +1,105 @@
1
+ import { DateTime } from "luxon";
2
+ export const formatDateTimeForInput = (dateString) => {
3
+ if (!dateString)
4
+ return "";
5
+ try {
6
+ const date = new Date(dateString);
7
+ // Format for datetime-local input (YYYY-MM-DDTHH:mm)
8
+ const year = date.getFullYear();
9
+ const month = String(date.getMonth() + 1).padStart(2, "0");
10
+ const day = String(date.getDate()).padStart(2, "0");
11
+ const hours = String(date.getHours()).padStart(2, "0");
12
+ const minutes = String(date.getMinutes()).padStart(2, "0");
13
+ return `${year}-${month}-${day}T${hours}:${minutes}`;
14
+ }
15
+ catch (_a) {
16
+ return "";
17
+ }
18
+ };
19
+ export const formatDateForInput = (dateString) => {
20
+ if (!dateString)
21
+ return "";
22
+ try {
23
+ const date = new Date(dateString);
24
+ const year = date.getFullYear();
25
+ const month = String(date.getMonth() + 1).padStart(2, "0");
26
+ const day = String(date.getDate()).padStart(2, "0");
27
+ return `${year}-${month}-${day}`;
28
+ }
29
+ catch (_a) {
30
+ return "";
31
+ }
32
+ };
33
+ /**
34
+ * Converts input value to ISO string, handling edge cases where
35
+ * browser datetime-local inputs behave differently across platforms.
36
+ * Returns null for invalid dates to prevent silent failures.
37
+ */
38
+ export const inputValueToISOString = (inputValue) => {
39
+ try {
40
+ return new Date(inputValue).toISOString();
41
+ }
42
+ catch (_a) {
43
+ return null;
44
+ }
45
+ };
46
+ export const formatDuration = (minutes) => {
47
+ const hours = Math.floor(minutes / 60);
48
+ const mins = minutes % 60;
49
+ return `${String(hours).padStart(2, "0")}:${String(mins).padStart(2, "0")}:00`;
50
+ };
51
+ /**
52
+ * Parse time string from datetime value - extracts HH:mm format
53
+ * Rejects plain HH:mm format, requires full datetime
54
+ */
55
+ export const parseTimeString = (value) => {
56
+ if (value === null)
57
+ return undefined;
58
+ const v = value.trim();
59
+ // Reject plain HH:mm format - require full datetime
60
+ if (/^\d{2}:\d{2}$/.test(v)) {
61
+ return undefined; // Reject plain time format
62
+ }
63
+ // Try ISO format first (most common) - EXACT same logic as recurring events
64
+ let dt = DateTime.fromISO(v, { setZone: true }); // ISO: with/without seconds, Z/offset, T
65
+ if (!dt.isValid)
66
+ dt = DateTime.fromSQL(v, { setZone: true }); // "YYYY-MM-DD HH:mm[:ss]" etc.
67
+ if (!dt.isValid)
68
+ dt = DateTime.fromFormat(v, "yyyy-MM-dd HH:mm", { setZone: true });
69
+ return dt.isValid ? dt.toFormat("HH:mm") : undefined;
70
+ };
71
+ /**
72
+ * Parse and validate datetime strings for event parsing
73
+ * Supports multiple formats including date-only and datetime formats
74
+ */
75
+ export const parseDateTimeString = (value) => {
76
+ if (value === null)
77
+ return undefined;
78
+ const v = value.trim();
79
+ if (!v)
80
+ return undefined;
81
+ // Try multiple datetime formats in order of preference
82
+ let dt;
83
+ // 1. Try ISO format first (most common)
84
+ dt = DateTime.fromISO(v, { setZone: true });
85
+ if (dt.isValid)
86
+ return dt.toISO({ suppressMilliseconds: true }) || undefined;
87
+ // 2. Try SQL format (YYYY-MM-DD HH:mm:ss)
88
+ dt = DateTime.fromSQL(v, { setZone: true });
89
+ if (dt.isValid)
90
+ return dt.toISO({ suppressMilliseconds: true }) || undefined;
91
+ // 3. Try common format with space (YYYY-MM-DD HH:mm)
92
+ dt = DateTime.fromFormat(v, "yyyy-MM-dd HH:mm", { setZone: true });
93
+ if (dt.isValid)
94
+ return dt.toISO({ suppressMilliseconds: true }) || undefined;
95
+ // 4. Try date-only format (YYYY-MM-DD) - treat as start of day
96
+ dt = DateTime.fromFormat(v, "yyyy-MM-dd", { setZone: true });
97
+ if (dt.isValid)
98
+ return dt.toISO({ suppressMilliseconds: true }) || undefined;
99
+ // 5. Try ISO date format (YYYY-MM-DD)
100
+ dt = DateTime.fromISO(v, { setZone: true });
101
+ if (dt.isValid)
102
+ return dt.toISO({ suppressMilliseconds: true }) || undefined;
103
+ return undefined;
104
+ };
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kYXRlLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFakMsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxVQUFrQixFQUFVLEVBQUU7SUFDcEUsSUFBSSxDQUFDLFVBQVU7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUUzQixJQUFJLENBQUM7UUFDSixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQyxxREFBcUQ7UUFDckQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN2RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUUzRCxPQUFPLEdBQUcsSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFBQyxXQUFNLENBQUM7UUFDUixPQUFPLEVBQUUsQ0FBQztJQUNYLENBQUM7QUFDRixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLFVBQWtCLEVBQVUsRUFBRTtJQUNoRSxJQUFJLENBQUMsVUFBVTtRQUFFLE9BQU8sRUFBRSxDQUFDO0lBRTNCLElBQUksQ0FBQztRQUNKLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDM0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFcEQsT0FBTyxHQUFHLElBQUksSUFBSSxLQUFLLElBQUksR0FBRyxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUFDLFdBQU0sQ0FBQztRQUNSLE9BQU8sRUFBRSxDQUFDO0lBQ1gsQ0FBQztBQUNGLENBQUMsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLFVBQWtCLEVBQWlCLEVBQUU7SUFDMUUsSUFBSSxDQUFDO1FBQ0osT0FBTyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBQUMsV0FBTSxDQUFDO1FBQ1IsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0FBQ0YsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsT0FBZSxFQUFVLEVBQUU7SUFDekQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDdkMsTUFBTSxJQUFJLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUMxQixPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQztBQUNoRixDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxLQUFvQixFQUFzQixFQUFFO0lBQzNFLElBQUksS0FBSyxLQUFLLElBQUk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUVyQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFdkIsb0RBQW9EO0lBQ3BELElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdCLE9BQU8sU0FBUyxDQUFDLENBQUMsMkJBQTJCO0lBQzlDLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLHlDQUF5QztJQUMxRixJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU87UUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLCtCQUErQjtJQUM3RixJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU87UUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUVwRixPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN0RCxDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLEtBQW9CLEVBQXNCLEVBQUU7SUFDL0UsSUFBSSxLQUFLLEtBQUssSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRXJDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2QixJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRXpCLHVEQUF1RDtJQUN2RCxJQUFJLEVBQVksQ0FBQztJQUVqQix3Q0FBd0M7SUFDeEMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUMsSUFBSSxFQUFFLENBQUMsT0FBTztRQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLG9CQUFvQixFQUFFLElBQUksRUFBRSxDQUFDLElBQUksU0FBUyxDQUFDO0lBRTdFLDBDQUEwQztJQUMxQyxFQUFFLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM1QyxJQUFJLEVBQUUsQ0FBQyxPQUFPO1FBQUUsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxTQUFTLENBQUM7SUFFN0UscURBQXFEO0lBQ3JELEVBQUUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLElBQUksRUFBRSxDQUFDLE9BQU87UUFBRSxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQztJQUU3RSwrREFBK0Q7SUFDL0QsRUFBRSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzdELElBQUksRUFBRSxDQUFDLE9BQU87UUFBRSxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQztJQUU3RSxzQ0FBc0M7SUFDdEMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUMsSUFBSSxFQUFFLENBQUMsT0FBTztRQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLG9CQUFvQixFQUFFLElBQUksRUFBRSxDQUFDLElBQUksU0FBUyxDQUFDO0lBRTdFLE9BQU8sU0FBUyxDQUFDO0FBQ2xCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSBcImx1eG9uXCI7XG5cbmV4cG9ydCBjb25zdCBmb3JtYXREYXRlVGltZUZvcklucHV0ID0gKGRhdGVTdHJpbmc6IHN0cmluZyk6IHN0cmluZyA9PiB7XG5cdGlmICghZGF0ZVN0cmluZykgcmV0dXJuIFwiXCI7XG5cblx0dHJ5IHtcblx0XHRjb25zdCBkYXRlID0gbmV3IERhdGUoZGF0ZVN0cmluZyk7XG5cdFx0Ly8gRm9ybWF0IGZvciBkYXRldGltZS1sb2NhbCBpbnB1dCAoWVlZWS1NTS1ERFRISDptbSlcblx0XHRjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuXHRcdGNvbnN0IG1vbnRoID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsIFwiMFwiKTtcblx0XHRjb25zdCBkYXkgPSBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsIFwiMFwiKTtcblx0XHRjb25zdCBob3VycyA9IFN0cmluZyhkYXRlLmdldEhvdXJzKCkpLnBhZFN0YXJ0KDIsIFwiMFwiKTtcblx0XHRjb25zdCBtaW51dGVzID0gU3RyaW5nKGRhdGUuZ2V0TWludXRlcygpKS5wYWRTdGFydCgyLCBcIjBcIik7XG5cblx0XHRyZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9VCR7aG91cnN9OiR7bWludXRlc31gO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gXCJcIjtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdERhdGVGb3JJbnB1dCA9IChkYXRlU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuXHRpZiAoIWRhdGVTdHJpbmcpIHJldHVybiBcIlwiO1xuXG5cdHRyeSB7XG5cdFx0Y29uc3QgZGF0ZSA9IG5ldyBEYXRlKGRhdGVTdHJpbmcpO1xuXHRcdGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG5cdFx0Y29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgXCIwXCIpO1xuXHRcdGNvbnN0IGRheSA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgXCIwXCIpO1xuXG5cdFx0cmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWA7XG5cdH0gY2F0Y2gge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGlucHV0IHZhbHVlIHRvIElTTyBzdHJpbmcsIGhhbmRsaW5nIGVkZ2UgY2FzZXMgd2hlcmVcbiAqIGJyb3dzZXIgZGF0ZXRpbWUtbG9jYWwgaW5wdXRzIGJlaGF2ZSBkaWZmZXJlbnRseSBhY3Jvc3MgcGxhdGZvcm1zLlxuICogUmV0dXJucyBudWxsIGZvciBpbnZhbGlkIGRhdGVzIHRvIHByZXZlbnQgc2lsZW50IGZhaWx1cmVzLlxuICovXG5leHBvcnQgY29uc3QgaW5wdXRWYWx1ZVRvSVNPU3RyaW5nID0gKGlucHV0VmFsdWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwgPT4ge1xuXHR0cnkge1xuXHRcdHJldHVybiBuZXcgRGF0ZShpbnB1dFZhbHVlKS50b0lTT1N0cmluZygpO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdER1cmF0aW9uID0gKG1pbnV0ZXM6IG51bWJlcik6IHN0cmluZyA9PiB7XG5cdGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcihtaW51dGVzIC8gNjApO1xuXHRjb25zdCBtaW5zID0gbWludXRlcyAlIDYwO1xuXHRyZXR1cm4gYCR7U3RyaW5nKGhvdXJzKS5wYWRTdGFydCgyLCBcIjBcIil9OiR7U3RyaW5nKG1pbnMpLnBhZFN0YXJ0KDIsIFwiMFwiKX06MDBgO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aW1lIHN0cmluZyBmcm9tIGRhdGV0aW1lIHZhbHVlIC0gZXh0cmFjdHMgSEg6bW0gZm9ybWF0XG4gKiBSZWplY3RzIHBsYWluIEhIOm1tIGZvcm1hdCwgcmVxdWlyZXMgZnVsbCBkYXRldGltZVxuICovXG5leHBvcnQgY29uc3QgcGFyc2VUaW1lU3RyaW5nID0gKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcblx0aWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuXG5cdGNvbnN0IHYgPSB2YWx1ZS50cmltKCk7XG5cblx0Ly8gUmVqZWN0IHBsYWluIEhIOm1tIGZvcm1hdCAtIHJlcXVpcmUgZnVsbCBkYXRldGltZVxuXHRpZiAoL15cXGR7Mn06XFxkezJ9JC8udGVzdCh2KSkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7IC8vIFJlamVjdCBwbGFpbiB0aW1lIGZvcm1hdFxuXHR9XG5cblx0Ly8gVHJ5IElTTyBmb3JtYXQgZmlyc3QgKG1vc3QgY29tbW9uKSAtIEVYQUNUIHNhbWUgbG9naWMgYXMgcmVjdXJyaW5nIGV2ZW50c1xuXHRsZXQgZHQgPSBEYXRlVGltZS5mcm9tSVNPKHYsIHsgc2V0Wm9uZTogdHJ1ZSB9KTsgLy8gSVNPOiB3aXRoL3dpdGhvdXQgc2Vjb25kcywgWi9vZmZzZXQsIFRcblx0aWYgKCFkdC5pc1ZhbGlkKSBkdCA9IERhdGVUaW1lLmZyb21TUUwodiwgeyBzZXRab25lOiB0cnVlIH0pOyAvLyBcIllZWVktTU0tREQgSEg6bW1bOnNzXVwiIGV0Yy5cblx0aWYgKCFkdC5pc1ZhbGlkKSBkdCA9IERhdGVUaW1lLmZyb21Gb3JtYXQodiwgXCJ5eXl5LU1NLWRkIEhIOm1tXCIsIHsgc2V0Wm9uZTogdHJ1ZSB9KTtcblxuXHRyZXR1cm4gZHQuaXNWYWxpZCA/IGR0LnRvRm9ybWF0KFwiSEg6bW1cIikgOiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFBhcnNlIGFuZCB2YWxpZGF0ZSBkYXRldGltZSBzdHJpbmdzIGZvciBldmVudCBwYXJzaW5nXG4gKiBTdXBwb3J0cyBtdWx0aXBsZSBmb3JtYXRzIGluY2x1ZGluZyBkYXRlLW9ubHkgYW5kIGRhdGV0aW1lIGZvcm1hdHNcbiAqL1xuZXhwb3J0IGNvbnN0IHBhcnNlRGF0ZVRpbWVTdHJpbmcgPSAodmFsdWU6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuXHRpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG5cblx0Y29uc3QgdiA9IHZhbHVlLnRyaW0oKTtcblx0aWYgKCF2KSByZXR1cm4gdW5kZWZpbmVkO1xuXG5cdC8vIFRyeSBtdWx0aXBsZSBkYXRldGltZSBmb3JtYXRzIGluIG9yZGVyIG9mIHByZWZlcmVuY2Vcblx0bGV0IGR0OiBEYXRlVGltZTtcblxuXHQvLyAxLiBUcnkgSVNPIGZvcm1hdCBmaXJzdCAobW9zdCBjb21tb24pXG5cdGR0ID0gRGF0ZVRpbWUuZnJvbUlTTyh2LCB7IHNldFpvbmU6IHRydWUgfSk7XG5cdGlmIChkdC5pc1ZhbGlkKSByZXR1cm4gZHQudG9JU08oeyBzdXBwcmVzc01pbGxpc2Vjb25kczogdHJ1ZSB9KSB8fCB1bmRlZmluZWQ7XG5cblx0Ly8gMi4gVHJ5IFNRTCBmb3JtYXQgKFlZWVktTU0tREQgSEg6bW06c3MpXG5cdGR0ID0gRGF0ZVRpbWUuZnJvbVNRTCh2LCB7IHNldFpvbmU6IHRydWUgfSk7XG5cdGlmIChkdC5pc1ZhbGlkKSByZXR1cm4gZHQudG9JU08oeyBzdXBwcmVzc01pbGxpc2Vjb25kczogdHJ1ZSB9KSB8fCB1bmRlZmluZWQ7XG5cblx0Ly8gMy4gVHJ5IGNvbW1vbiBmb3JtYXQgd2l0aCBzcGFjZSAoWVlZWS1NTS1ERCBISDptbSlcblx0ZHQgPSBEYXRlVGltZS5mcm9tRm9ybWF0KHYsIFwieXl5eS1NTS1kZCBISDptbVwiLCB7IHNldFpvbmU6IHRydWUgfSk7XG5cdGlmIChkdC5pc1ZhbGlkKSByZXR1cm4gZHQudG9JU08oeyBzdXBwcmVzc01pbGxpc2Vjb25kczogdHJ1ZSB9KSB8fCB1bmRlZmluZWQ7XG5cblx0Ly8gNC4gVHJ5IGRhdGUtb25seSBmb3JtYXQgKFlZWVktTU0tREQpIC0gdHJlYXQgYXMgc3RhcnQgb2YgZGF5XG5cdGR0ID0gRGF0ZVRpbWUuZnJvbUZvcm1hdCh2LCBcInl5eXktTU0tZGRcIiwgeyBzZXRab25lOiB0cnVlIH0pO1xuXHRpZiAoZHQuaXNWYWxpZCkgcmV0dXJuIGR0LnRvSVNPKHsgc3VwcHJlc3NNaWxsaXNlY29uZHM6IHRydWUgfSkgfHwgdW5kZWZpbmVkO1xuXG5cdC8vIDUuIFRyeSBJU08gZGF0ZSBmb3JtYXQgKFlZWVktTU0tREQpXG5cdGR0ID0gRGF0ZVRpbWUuZnJvbUlTTyh2LCB7IHNldFpvbmU6IHRydWUgfSk7XG5cdGlmIChkdC5pc1ZhbGlkKSByZXR1cm4gZHQudG9JU08oeyBzdXBwcmVzc01pbGxpc2Vjb25kczogdHJ1ZSB9KSB8fCB1bmRlZmluZWQ7XG5cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn07XG4iXX0=
@@ -0,0 +1,52 @@
1
+ import type { BehaviorSubject } from "rxjs";
2
+ export interface BaseRule {
3
+ id: string;
4
+ expression: string;
5
+ enabled: boolean;
6
+ }
7
+ /**
8
+ * Generic base class for evaluating JavaScript expressions against frontmatter objects.
9
+ * Provides reactive compilation of rules via RxJS subscription and safe evaluation.
10
+ */
11
+ export declare abstract class BaseEvaluator<TRule extends BaseRule, TSettings> {
12
+ protected compiledRules: Array<TRule & {
13
+ fn: (frontmatter: Record<string, unknown>) => boolean;
14
+ }>;
15
+ private settingsSubscription;
16
+ constructor(settingsStore: BehaviorSubject<TSettings>);
17
+ /**
18
+ * Extract rules from settings object. Must be implemented by subclasses.
19
+ */
20
+ protected abstract extractRules(settings: TSettings): TRule[];
21
+ /**
22
+ * Compile rules into executable functions with error handling.
23
+ */
24
+ private compileRules;
25
+ /**
26
+ * Evaluate a single rule against frontmatter. Returns the result or undefined if error.
27
+ */
28
+ protected evaluateRule(rule: TRule & {
29
+ fn: (frontmatter: Record<string, unknown>) => boolean;
30
+ }, frontmatter: Record<string, unknown>): boolean | undefined;
31
+ /**
32
+ * Convert evaluation result to boolean - only explicit true is considered truthy.
33
+ */
34
+ protected isTruthy(result: boolean | undefined): boolean;
35
+ /**
36
+ * Clean up subscriptions and compiled rules.
37
+ */
38
+ destroy(): void;
39
+ /**
40
+ * Get the number of active (compiled) rules.
41
+ */
42
+ getActiveRuleCount(): number;
43
+ /**
44
+ * Get information about all rules including their validity.
45
+ */
46
+ getRuleInfo(): Array<{
47
+ expression: string;
48
+ isValid: boolean;
49
+ enabled: boolean;
50
+ }>;
51
+ }
52
+ //# sourceMappingURL=evaluator-base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator-base.d.ts","sourceRoot":"","sources":["../src/evaluator-base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,MAAM,CAAC;AAE1D,MAAM,WAAW,QAAQ;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,8BAAsB,aAAa,CAAC,KAAK,SAAS,QAAQ,EAAE,SAAS;IACpE,SAAS,CAAC,aAAa,EAAE,KAAK,CAC7B,KAAK,GAAG;QAAE,EAAE,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAA;KAAE,CACjE,CAAM;IACP,OAAO,CAAC,oBAAoB,CAA6B;gBAE7C,aAAa,EAAE,eAAe,CAAC,SAAS,CAAC;IAUrD;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,GAAG,KAAK,EAAE;IAE7D;;OAEG;IACH,OAAO,CAAC,YAAY;IA6BpB;;OAEG;IACH,SAAS,CAAC,YAAY,CACrB,IAAI,EAAE,KAAK,GAAG;QAAE,EAAE,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAA;KAAE,EACvE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,GAAG,SAAS;IAStB;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO;IAIxD;;OAEG;IACH,OAAO,IAAI,IAAI;IAQf;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAI5B;;OAEG;IACH,WAAW,IAAI,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CAShF"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Generic base class for evaluating JavaScript expressions against frontmatter objects.
3
+ * Provides reactive compilation of rules via RxJS subscription and safe evaluation.
4
+ */
5
+ export class BaseEvaluator {
6
+ constructor(settingsStore) {
7
+ this.compiledRules = [];
8
+ this.settingsSubscription = null;
9
+ const initialRules = this.extractRules(settingsStore.value);
10
+ this.compileRules(initialRules);
11
+ this.settingsSubscription = settingsStore.subscribe((settings) => {
12
+ const newRules = this.extractRules(settings);
13
+ this.compileRules(newRules);
14
+ });
15
+ }
16
+ /**
17
+ * Compile rules into executable functions with error handling.
18
+ */
19
+ compileRules(rules) {
20
+ this.compiledRules = [];
21
+ for (const rule of rules) {
22
+ if (!rule.enabled || !rule.expression.trim())
23
+ continue;
24
+ try {
25
+ const cleanExpression = rule.expression.trim();
26
+ // Create a function that takes 'fm' (frontmatter) as parameter
27
+ // and evaluates the expression in that context
28
+ const fn = new Function("fm", `return (${cleanExpression});`);
29
+ // Test the function with a dummy object to catch syntax errors early
30
+ fn({});
31
+ this.compiledRules.push(Object.assign(Object.assign({}, rule), { expression: cleanExpression, fn }));
32
+ }
33
+ catch (error) {
34
+ console.warn(`Invalid rule expression "${rule.expression}":`, error);
35
+ }
36
+ }
37
+ }
38
+ /**
39
+ * Evaluate a single rule against frontmatter. Returns the result or undefined if error.
40
+ */
41
+ evaluateRule(rule, frontmatter) {
42
+ try {
43
+ return rule.fn(frontmatter);
44
+ }
45
+ catch (error) {
46
+ console.warn(`Error evaluating rule "${rule.expression}":`, error);
47
+ return undefined;
48
+ }
49
+ }
50
+ /**
51
+ * Convert evaluation result to boolean - only explicit true is considered truthy.
52
+ */
53
+ isTruthy(result) {
54
+ return result === true;
55
+ }
56
+ /**
57
+ * Clean up subscriptions and compiled rules.
58
+ */
59
+ destroy() {
60
+ if (this.settingsSubscription) {
61
+ this.settingsSubscription.unsubscribe();
62
+ this.settingsSubscription = null;
63
+ }
64
+ this.compiledRules = [];
65
+ }
66
+ /**
67
+ * Get the number of active (compiled) rules.
68
+ */
69
+ getActiveRuleCount() {
70
+ return this.compiledRules.length;
71
+ }
72
+ /**
73
+ * Get information about all rules including their validity.
74
+ */
75
+ getRuleInfo() {
76
+ const validExpressions = new Set(this.compiledRules.map((r) => r.expression));
77
+ return this.compiledRules.map((rule) => ({
78
+ expression: rule.expression,
79
+ isValid: validExpressions.has(rule.expression),
80
+ enabled: rule.enabled,
81
+ }));
82
+ }
83
+ }
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdG9yLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZXZhbHVhdG9yLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUE7OztHQUdHO0FBQ0gsTUFBTSxPQUFnQixhQUFhO0lBTWxDLFlBQVksYUFBeUM7UUFMM0Msa0JBQWEsR0FFbkIsRUFBRSxDQUFDO1FBQ0MseUJBQW9CLEdBQXdCLElBQUksQ0FBQztRQUd4RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWhDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDaEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQU9EOztPQUVHO0lBQ0ssWUFBWSxDQUFDLEtBQWM7UUFDbEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFFeEIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFO2dCQUFFLFNBQVM7WUFFdkQsSUFBSSxDQUFDO2dCQUNKLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBRS9DLCtEQUErRDtnQkFDL0QsK0NBQStDO2dCQUMvQyxNQUFNLEVBQUUsR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsV0FBVyxlQUFlLElBQUksQ0FFaEQsQ0FBQztnQkFFYixxRUFBcUU7Z0JBQ3JFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFFUCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksaUNBQ25CLElBQUksS0FDUCxVQUFVLEVBQUUsZUFBZSxFQUMzQixFQUFFLElBQ0QsQ0FBQztZQUNKLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLDRCQUE0QixJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEUsQ0FBQztRQUNGLENBQUM7SUFDRixDQUFDO0lBRUQ7O09BRUc7SUFDTyxZQUFZLENBQ3JCLElBQXVFLEVBQ3ZFLFdBQW9DO1FBRXBDLElBQUksQ0FBQztZQUNKLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLDBCQUEwQixJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkUsT0FBTyxTQUFTLENBQUM7UUFDbEIsQ0FBQztJQUNGLENBQUM7SUFFRDs7T0FFRztJQUNPLFFBQVEsQ0FBQyxNQUEyQjtRQUM3QyxPQUFPLE1BQU0sS0FBSyxJQUFJLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNOLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFDbEMsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQjtRQUNqQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDVixNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUU5RSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3hDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixPQUFPLEVBQUUsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDOUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1NBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJ1bGUge1xuXHRpZDogc3RyaW5nO1xuXHRleHByZXNzaW9uOiBzdHJpbmc7XG5cdGVuYWJsZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogR2VuZXJpYyBiYXNlIGNsYXNzIGZvciBldmFsdWF0aW5nIEphdmFTY3JpcHQgZXhwcmVzc2lvbnMgYWdhaW5zdCBmcm9udG1hdHRlciBvYmplY3RzLlxuICogUHJvdmlkZXMgcmVhY3RpdmUgY29tcGlsYXRpb24gb2YgcnVsZXMgdmlhIFJ4SlMgc3Vic2NyaXB0aW9uIGFuZCBzYWZlIGV2YWx1YXRpb24uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRXZhbHVhdG9yPFRSdWxlIGV4dGVuZHMgQmFzZVJ1bGUsIFRTZXR0aW5ncz4ge1xuXHRwcm90ZWN0ZWQgY29tcGlsZWRSdWxlczogQXJyYXk8XG5cdFx0VFJ1bGUgJiB7IGZuOiAoZnJvbnRtYXR0ZXI6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBib29sZWFuIH1cblx0PiA9IFtdO1xuXHRwcml2YXRlIHNldHRpbmdzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcblxuXHRjb25zdHJ1Y3RvcihzZXR0aW5nc1N0b3JlOiBCZWhhdmlvclN1YmplY3Q8VFNldHRpbmdzPikge1xuXHRcdGNvbnN0IGluaXRpYWxSdWxlcyA9IHRoaXMuZXh0cmFjdFJ1bGVzKHNldHRpbmdzU3RvcmUudmFsdWUpO1xuXHRcdHRoaXMuY29tcGlsZVJ1bGVzKGluaXRpYWxSdWxlcyk7XG5cblx0XHR0aGlzLnNldHRpbmdzU3Vic2NyaXB0aW9uID0gc2V0dGluZ3NTdG9yZS5zdWJzY3JpYmUoKHNldHRpbmdzKSA9PiB7XG5cdFx0XHRjb25zdCBuZXdSdWxlcyA9IHRoaXMuZXh0cmFjdFJ1bGVzKHNldHRpbmdzKTtcblx0XHRcdHRoaXMuY29tcGlsZVJ1bGVzKG5ld1J1bGVzKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeHRyYWN0IHJ1bGVzIGZyb20gc2V0dGluZ3Mgb2JqZWN0LiBNdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgZXh0cmFjdFJ1bGVzKHNldHRpbmdzOiBUU2V0dGluZ3MpOiBUUnVsZVtdO1xuXG5cdC8qKlxuXHQgKiBDb21waWxlIHJ1bGVzIGludG8gZXhlY3V0YWJsZSBmdW5jdGlvbnMgd2l0aCBlcnJvciBoYW5kbGluZy5cblx0ICovXG5cdHByaXZhdGUgY29tcGlsZVJ1bGVzKHJ1bGVzOiBUUnVsZVtdKTogdm9pZCB7XG5cdFx0dGhpcy5jb21waWxlZFJ1bGVzID0gW107XG5cblx0XHRmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcblx0XHRcdGlmICghcnVsZS5lbmFibGVkIHx8ICFydWxlLmV4cHJlc3Npb24udHJpbSgpKSBjb250aW51ZTtcblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgY2xlYW5FeHByZXNzaW9uID0gcnVsZS5leHByZXNzaW9uLnRyaW0oKTtcblxuXHRcdFx0XHQvLyBDcmVhdGUgYSBmdW5jdGlvbiB0aGF0IHRha2VzICdmbScgKGZyb250bWF0dGVyKSBhcyBwYXJhbWV0ZXJcblx0XHRcdFx0Ly8gYW5kIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBpbiB0aGF0IGNvbnRleHRcblx0XHRcdFx0Y29uc3QgZm4gPSBuZXcgRnVuY3Rpb24oXCJmbVwiLCBgcmV0dXJuICgke2NsZWFuRXhwcmVzc2lvbn0pO2ApIGFzIChcblx0XHRcdFx0XHRmcm9udG1hdHRlcjogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblx0XHRcdFx0KSA9PiBib29sZWFuO1xuXG5cdFx0XHRcdC8vIFRlc3QgdGhlIGZ1bmN0aW9uIHdpdGggYSBkdW1teSBvYmplY3QgdG8gY2F0Y2ggc3ludGF4IGVycm9ycyBlYXJseVxuXHRcdFx0XHRmbih7fSk7XG5cblx0XHRcdFx0dGhpcy5jb21waWxlZFJ1bGVzLnB1c2goe1xuXHRcdFx0XHRcdC4uLnJ1bGUsXG5cdFx0XHRcdFx0ZXhwcmVzc2lvbjogY2xlYW5FeHByZXNzaW9uLFxuXHRcdFx0XHRcdGZuLFxuXHRcdFx0XHR9KTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdGNvbnNvbGUud2FybihgSW52YWxpZCBydWxlIGV4cHJlc3Npb24gXCIke3J1bGUuZXhwcmVzc2lvbn1cIjpgLCBlcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEV2YWx1YXRlIGEgc2luZ2xlIHJ1bGUgYWdhaW5zdCBmcm9udG1hdHRlci4gUmV0dXJucyB0aGUgcmVzdWx0IG9yIHVuZGVmaW5lZCBpZiBlcnJvci5cblx0ICovXG5cdHByb3RlY3RlZCBldmFsdWF0ZVJ1bGUoXG5cdFx0cnVsZTogVFJ1bGUgJiB7IGZuOiAoZnJvbnRtYXR0ZXI6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBib29sZWFuIH0sXG5cdFx0ZnJvbnRtYXR0ZXI6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cdCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4gcnVsZS5mbihmcm9udG1hdHRlcik7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGNvbnNvbGUud2FybihgRXJyb3IgZXZhbHVhdGluZyBydWxlIFwiJHtydWxlLmV4cHJlc3Npb259XCI6YCwgZXJyb3IpO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydCBldmFsdWF0aW9uIHJlc3VsdCB0byBib29sZWFuIC0gb25seSBleHBsaWNpdCB0cnVlIGlzIGNvbnNpZGVyZWQgdHJ1dGh5LlxuXHQgKi9cblx0cHJvdGVjdGVkIGlzVHJ1dGh5KHJlc3VsdDogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiByZXN1bHQgPT09IHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogQ2xlYW4gdXAgc3Vic2NyaXB0aW9ucyBhbmQgY29tcGlsZWQgcnVsZXMuXG5cdCAqL1xuXHRkZXN0cm95KCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLnNldHRpbmdzU3Vic2NyaXB0aW9uKSB7XG5cdFx0XHR0aGlzLnNldHRpbmdzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG5cdFx0XHR0aGlzLnNldHRpbmdzU3Vic2NyaXB0aW9uID0gbnVsbDtcblx0XHR9XG5cdFx0dGhpcy5jb21waWxlZFJ1bGVzID0gW107XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBudW1iZXIgb2YgYWN0aXZlIChjb21waWxlZCkgcnVsZXMuXG5cdCAqL1xuXHRnZXRBY3RpdmVSdWxlQ291bnQoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5jb21waWxlZFJ1bGVzLmxlbmd0aDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYWxsIHJ1bGVzIGluY2x1ZGluZyB0aGVpciB2YWxpZGl0eS5cblx0ICovXG5cdGdldFJ1bGVJbmZvKCk6IEFycmF5PHsgZXhwcmVzc2lvbjogc3RyaW5nOyBpc1ZhbGlkOiBib29sZWFuOyBlbmFibGVkOiBib29sZWFuIH0+IHtcblx0XHRjb25zdCB2YWxpZEV4cHJlc3Npb25zID0gbmV3IFNldCh0aGlzLmNvbXBpbGVkUnVsZXMubWFwKChyKSA9PiByLmV4cHJlc3Npb24pKTtcblxuXHRcdHJldHVybiB0aGlzLmNvbXBpbGVkUnVsZXMubWFwKChydWxlKSA9PiAoe1xuXHRcdFx0ZXhwcmVzc2lvbjogcnVsZS5leHByZXNzaW9uLFxuXHRcdFx0aXNWYWxpZDogdmFsaWRFeHByZXNzaW9ucy5oYXMocnVsZS5leHByZXNzaW9uKSxcblx0XHRcdGVuYWJsZWQ6IHJ1bGUuZW5hYmxlZCxcblx0XHR9KSk7XG5cdH1cbn1cbiJdfQ==
@@ -0,0 +1,31 @@
1
+ import { type App, TFile } from "obsidian";
2
+ export declare const fromRoot: (relativePath: string) => string;
3
+ export declare const getActiveFileOrThrow: (app: App) => TFile;
4
+ export declare const getTemplateContent: (app: App, templatePath: string) => Promise<string>;
5
+ export declare const ensureFolderExists: (app: App, folderPath: string) => Promise<void>;
6
+ export declare const openFileInNewLeaf: (app: App, file: TFile) => Promise<void>;
7
+ export declare const getNoteFilesFromDir: (directoryPath: string) => Promise<string[]>;
8
+ export declare const getTargetFileFromLink: (app: App, relationshipLink: string) => TFile | null;
9
+ export declare const createFileLink: (file: TFile) => string;
10
+ export declare const normalizeArray: (value: string | string[] | undefined) => string[];
11
+ export declare const arraysEqual: (a: string[], b: string[]) => boolean;
12
+ /**
13
+ * Normalizes frontmatter content by converting quoted numeric _ZettelIDs to numbers.
14
+ * This handles edge cases where YAML parsers treat numeric strings inconsistently.
15
+ */
16
+ export declare const normalizeContent: (content: string) => string;
17
+ /**
18
+ * Safely performs a file operation with error handling and file validation.
19
+ * Reduces boilerplate for common file operations.
20
+ */
21
+ export declare const withFileOperation: <T>(app: App, event: any, operation: (file: TFile) => Promise<T>, errorMessage?: string) => Promise<T | null>;
22
+ /**
23
+ * Safely performs a file operation by file path with error handling and file validation.
24
+ */
25
+ export declare const withFile: <T>(app: App, filePath: string, operation: (file: TFile) => Promise<T>, errorMessage?: string) => Promise<T | null>;
26
+ /**
27
+ * Duplicates a file with a new ZettelID, preserving the original content
28
+ * but updating the ZettelID in frontmatter if configured.
29
+ */
30
+ export declare const duplicateFileWithNewZettelId: (app: App, file: TFile, zettelIdProp?: string) => Promise<TFile>;
31
+ //# sourceMappingURL=file-operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-operations.d.ts","sourceRoot":"","sources":["../src/file-operations.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,GAAG,EAAU,KAAK,EAAE,MAAM,UAAU,CAAC;AAGnD,eAAO,MAAM,QAAQ,GAAI,cAAc,MAAM,KAAG,MAE/C,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,KAAK,GAAG,KAAG,KAO/C,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAU,KAAK,GAAG,EAAE,cAAc,MAAM,KAAG,OAAO,CAAC,MAAM,CAQvF,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAU,KAAK,GAAG,EAAE,YAAY,MAAM,KAAG,OAAO,CAAC,IAAI,CAInF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,KAAK,GAAG,EAAE,MAAM,KAAK,KAAG,OAAO,CAAC,IAAI,CAE3E,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAU,eAAe,MAAM,KAAG,OAAO,CAAC,MAAM,EAAE,CAejF,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,KAAK,GAAG,EAAE,kBAAkB,MAAM,KAAG,KAAK,GAAG,IAclF,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,MAAM,KAAK,KAAG,MAG5C,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,KAAG,MAAM,EAW3E,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,GAAG,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,KAAG,OAEtD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,KAAG,MAelD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAU,CAAC,EACxC,KAAK,GAAG,EACR,OAAO,GAAG,EACV,WAAW,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,EACtC,eAAc,MAA2B,KACvC,OAAO,CAAC,CAAC,GAAG,IAAI,CAgBlB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAU,CAAC,EAC/B,KAAK,GAAG,EACR,UAAU,MAAM,EAChB,WAAW,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,EACtC,eAAc,MAA2B,KACvC,OAAO,CAAC,CAAC,GAAG,IAAI,CAelB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,4BAA4B,GACxC,KAAK,GAAG,EACR,MAAM,KAAK,EACX,eAAe,MAAM,KACnB,OAAO,CAAC,KAAK,CAsBf,CAAC"}
@@ -0,0 +1,160 @@
1
+ import { __awaiter } from "tslib";
2
+ import * as fs from "node:fs/promises";
3
+ import * as path from "node:path";
4
+ import { Notice, TFile } from "obsidian";
5
+ import { extractFilePathFromLink } from "./link-parser";
6
+ export const fromRoot = (relativePath) => {
7
+ return path.resolve(__dirname, `../../../${relativePath}`);
8
+ };
9
+ export const getActiveFileOrThrow = (app) => {
10
+ const activeFile = app.workspace.getActiveFile();
11
+ if (!activeFile) {
12
+ new Notice(`⚠️ Open a note first.`);
13
+ throw new Error(`Open a note first.`);
14
+ }
15
+ return activeFile;
16
+ };
17
+ export const getTemplateContent = (app, templatePath) => __awaiter(void 0, void 0, void 0, function* () {
18
+ const templateFile = app.vault.getAbstractFileByPath(templatePath);
19
+ if (!templateFile) {
20
+ new Notice(`❌ Template not found: ${templatePath}`);
21
+ throw new Error(`Template not found: ${templatePath}`);
22
+ }
23
+ return yield app.vault.read(templateFile);
24
+ });
25
+ export const ensureFolderExists = (app, folderPath) => __awaiter(void 0, void 0, void 0, function* () {
26
+ if (!app.vault.getAbstractFileByPath(folderPath)) {
27
+ yield app.vault.createFolder(folderPath).catch(() => { });
28
+ }
29
+ });
30
+ export const openFileInNewLeaf = (app, file) => __awaiter(void 0, void 0, void 0, function* () {
31
+ yield app.workspace.getLeaf(true).openFile(file);
32
+ });
33
+ export const getNoteFilesFromDir = (directoryPath) => __awaiter(void 0, void 0, void 0, function* () {
34
+ const files = yield fs.readdir(directoryPath);
35
+ const directoryName = path.basename(directoryPath);
36
+ return files.filter((file) => {
37
+ if (!file.endsWith(".md"))
38
+ return false;
39
+ const fileNameWithoutExt = path.parse(file).name;
40
+ if (fileNameWithoutExt === directoryName) {
41
+ console.log(`⏭️ Skipping directory-level file: ${file}`);
42
+ return false;
43
+ }
44
+ return true;
45
+ });
46
+ });
47
+ export const getTargetFileFromLink = (app, relationshipLink) => {
48
+ const targetFilePath = extractFilePathFromLink(relationshipLink);
49
+ if (!targetFilePath) {
50
+ console.warn(`Failed to extract file path from link: ${relationshipLink}`);
51
+ return null;
52
+ }
53
+ const targetFile = app.vault.getAbstractFileByPath(targetFilePath);
54
+ if (!targetFile) {
55
+ console.warn(`Target file not found for link: ${relationshipLink}`);
56
+ return null;
57
+ }
58
+ return targetFile;
59
+ };
60
+ export const createFileLink = (file) => {
61
+ var _a;
62
+ const folder = ((_a = file.parent) === null || _a === void 0 ? void 0 : _a.path) && file.parent.path !== "/" ? file.parent.path : "";
63
+ return folder ? `[[${folder}/${file.basename}|${file.basename}]]` : `[[${file.basename}]]`;
64
+ };
65
+ export const normalizeArray = (value) => {
66
+ if (!value) {
67
+ return [];
68
+ }
69
+ if (typeof value === "string") {
70
+ return [value];
71
+ }
72
+ if (Array.isArray(value)) {
73
+ return value;
74
+ }
75
+ return [];
76
+ };
77
+ export const arraysEqual = (a, b) => {
78
+ return a.length === b.length && a.every((val, index) => val === b[index]);
79
+ };
80
+ /**
81
+ * Normalizes frontmatter content by converting quoted numeric _ZettelIDs to numbers.
82
+ * This handles edge cases where YAML parsers treat numeric strings inconsistently.
83
+ */
84
+ export const normalizeContent = (content) => {
85
+ let normalized = content;
86
+ let hasChanges = false;
87
+ // Normalize _ZettelID: "string" → number (remove quotes)
88
+ const zettelIdMatch = normalized.match(/^_ZettelID:\s*"(\d+)"/m);
89
+ if (zettelIdMatch) {
90
+ const [fullMatch, numericId] = zettelIdMatch;
91
+ const replacement = `_ZettelID: ${numericId}`;
92
+ normalized = normalized.replace(fullMatch, replacement);
93
+ hasChanges = true;
94
+ console.log(` ✅ _ZettelID: "${numericId}" → ${numericId}`);
95
+ }
96
+ return hasChanges ? normalized : content;
97
+ };
98
+ /**
99
+ * Safely performs a file operation with error handling and file validation.
100
+ * Reduces boilerplate for common file operations.
101
+ */
102
+ export const withFileOperation = (app_1, event_1, operation_1, ...args_1) => __awaiter(void 0, [app_1, event_1, operation_1, ...args_1], void 0, function* (app, event, operation, errorMessage = "Operation failed") {
103
+ try {
104
+ const filePath = event.extendedProps.filePath;
105
+ const file = app.vault.getAbstractFileByPath(filePath);
106
+ if (!(file instanceof TFile)) {
107
+ new Notice("Could not find the file");
108
+ return null;
109
+ }
110
+ return yield operation(file);
111
+ }
112
+ catch (error) {
113
+ console.error(`Error in file operation:`, error);
114
+ new Notice(errorMessage);
115
+ return null;
116
+ }
117
+ });
118
+ /**
119
+ * Safely performs a file operation by file path with error handling and file validation.
120
+ */
121
+ export const withFile = (app_1, filePath_1, operation_1, ...args_1) => __awaiter(void 0, [app_1, filePath_1, operation_1, ...args_1], void 0, function* (app, filePath, operation, errorMessage = "Operation failed") {
122
+ try {
123
+ const file = app.vault.getAbstractFileByPath(filePath);
124
+ if (!(file instanceof TFile)) {
125
+ new Notice("Could not find the file");
126
+ return null;
127
+ }
128
+ return yield operation(file);
129
+ }
130
+ catch (error) {
131
+ console.error(`Error in file operation:`, error);
132
+ new Notice(errorMessage);
133
+ return null;
134
+ }
135
+ });
136
+ /**
137
+ * Duplicates a file with a new ZettelID, preserving the original content
138
+ * but updating the ZettelID in frontmatter if configured.
139
+ */
140
+ export const duplicateFileWithNewZettelId = (app, file, zettelIdProp) => __awaiter(void 0, void 0, void 0, function* () {
141
+ var _a;
142
+ const content = yield app.vault.read(file);
143
+ const { generateZettelId } = yield import("./generate");
144
+ const { generateUniqueFilePath } = yield import("./file-utils");
145
+ const parentPath = ((_a = file.parent) === null || _a === void 0 ? void 0 : _a.path) || "";
146
+ const baseNameWithoutZettel = file.basename.replace(/-\d{14}$/, "");
147
+ const zettelId = generateZettelId();
148
+ const newBasename = `${baseNameWithoutZettel}-${zettelId}`;
149
+ const newFilePath = generateUniqueFilePath(app, parentPath, newBasename);
150
+ // Create the new file with original content
151
+ const newFile = yield app.vault.create(newFilePath, content);
152
+ // Update the ZettelID in frontmatter if configured
153
+ if (zettelIdProp) {
154
+ yield app.fileManager.processFrontMatter(newFile, (fm) => {
155
+ fm[zettelIdProp] = zettelId;
156
+ });
157
+ }
158
+ return newFile;
159
+ });
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1vcGVyYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ZpbGUtb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2QyxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQVksTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsWUFBb0IsRUFBVSxFQUFFO0lBQ3hELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsWUFBWSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0FBQzVELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBUSxFQUFTLEVBQUU7SUFDdkQsTUFBTSxVQUFVLEdBQWlCLEdBQUcsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDL0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2pCLElBQUksTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxPQUFPLFVBQVUsQ0FBQztBQUNuQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFPLEdBQVEsRUFBRSxZQUFvQixFQUFtQixFQUFFO0lBQzNGLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbkUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ25CLElBQUksTUFBTSxDQUFDLDBCQUEwQixZQUFZLEVBQUUsQ0FBQyxDQUFD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LENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNwRSxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3BDLE1BQU0sV0FBVyxHQUFHLEdBQUcscUJBQXFCLElBQUksUUFBUSxFQUFFLENBQUM7SUFDM0QsTUFBTSxXQUFXLEdBQUcsc0JBQXNCLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUV6RSw0Q0FBNEM7SUFDNUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFN0QsbURBQW1EO0lBQ25ELElBQUksWUFBWSxFQUFFLENBQUM7UUFDbEIsTUFBTSxHQUFHLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ3hELEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDaEIsQ0FBQyxDQUFBLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyB0eXBlIEFwcCwgTm90aWNlLCBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgZXh0cmFjdEZpbGVQYXRoRnJvbUxpbmsgfSBmcm9tIFwiLi9saW5rLXBhcnNlclwiO1xuXG5leHBvcnQgY29uc3QgZnJvbVJvb3QgPSAocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuXHRyZXR1cm4gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgYC4uLy4uLy4uLyR7cmVsYXRpdmVQYXRofWApO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFjdGl2ZUZpbGVPclRocm93ID0gKGFwcDogQXBwKTogVEZpbGUgPT4ge1xuXHRjb25zdCBhY3RpdmVGaWxlOiBURmlsZSB8IG51bGwgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcblx0aWYgKCFhY3RpdmVGaWxlKSB7XG5cdFx0bmV3IE5vdGljZShg4pqg77iPICBPcGVuIGEgbm90ZSBmaXJzdC5gKTtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYE9wZW4gYSBub3RlIGZpcnN0LmApO1xuXHR9XG5cdHJldHVybiBhY3RpdmVGaWxlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRlbXBsYXRlQ29udGVudCA9IGFzeW5jIChhcHA6IEFwcCwgdGVtcGxhdGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuXHRjb25zdCB0ZW1wbGF0ZUZpbGUgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKHRlbXBsYXRlUGF0aCk7XG5cdGlmICghdGVtcGxhdGVGaWxlKSB7XG5cdFx0bmV3IE5vdGljZShg4p2MICBUZW1wbGF0ZSBub3QgZm91bmQ6ICR7dGVtcGxhdGVQYXRofWApO1xuXHRcdHRocm93IG5ldyBFcnJvcihgVGVtcGxhdGUgbm90IGZvdW5kOiAke3RlbXBsYXRlUGF0aH1gKTtcblx0fVxuXG5cdHJldHVybiBhd2FpdCBhcHAudmF1bHQucmVhZCh0ZW1wbGF0ZUZpbGUgYXMgVEZpbGUpO1xufTtcblxuZXhwb3J0IGNvbnN0IGVuc3VyZUZvbGRlckV4aXN0cyA9IGFzeW5jIChhcHA6IEFwcCwgZm9sZGVyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdGlmICghYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChmb2xkZXJQYXRoKSkge1xuXHRcdGF3YWl0IGFwcC52YXVsdC5jcmVhdGVGb2xkZXIoZm9sZGVyUGF0aCkuY2F0Y2goKCkgPT4ge30pO1xuXHR9XG59O1xuXG5leHBvcnQgY29uc3Qgb3BlbkZpbGVJbk5ld0xlYWYgPSBhc3luYyAoYXBwOiBBcHAsIGZpbGU6IFRGaWxlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdGF3YWl0IGFwcC53b3Jrc3BhY2UuZ2V0TGVhZih0cnVlKS5vcGVuRmlsZShmaWxlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXROb3RlRmlsZXNGcm9tRGlyID0gYXN5bmMgKGRpcmVjdG9yeVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+ID0+IHtcblx0Y29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpcmVjdG9yeVBhdGgpO1xuXHRjb25zdCBkaXJlY3RvcnlOYW1lID0gcGF0aC5iYXNlbmFtZShkaXJlY3RvcnlQYXRoKTtcblxuXHRyZXR1cm4gZmlsZXMuZmlsdGVyKChmaWxlKSA9PiB7XG5cdFx0aWYgKCFmaWxlLmVuZHNXaXRoKFwiLm1kXCIpKSByZXR1cm4gZmFsc2U7XG5cblx0XHRjb25zdCBmaWxlTmFtZVdpdGhvdXRFeHQgPSBwYXRoLnBhcnNlKGZpbGUpLm5hbWU7XG5cdFx0aWYgKGZpbGVOYW1lV2l0aG91dEV4dCA9PT0gZGlyZWN0b3J5TmFtZSkge1xuXHRcdFx0Y29uc29sZS5sb2coYOKPre+4jyBTa2lwcGluZyBkaXJlY3RvcnktbGV2ZWwgZmlsZTogJHtmaWxlfWApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUYXJnZXRGaWxlRnJvbUxpbmsgPSAoYXBwOiBBcHAsIHJlbGF0aW9uc2hpcExpbms6IHN0cmluZyk6IFRGaWxlIHwgbnVsbCA9PiB7XG5cdGNvbnN0IHRhcmdldEZpbGVQYXRoID0gZXh0cmFjdEZpbGVQYXRoRnJvbUxpbmsocmVsYXRpb25zaGlwTGluayk7XG5cdGlmICghdGFyZ2V0RmlsZVBhdGgpIHtcblx0XHRjb25zb2xlLndhcm4oYEZhaWxlZCB0byBleHRyYWN0IGZpbGUgcGF0aCBmcm9tIGxpbms6ICR7cmVsYXRpb25zaGlwTGlua31gKTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGNvbnN0IHRhcmdldEZpbGUgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKHRhcmdldEZpbGVQYXRoKSBhcyBURmlsZTtcblx0aWYgKCF0YXJnZXRGaWxlKSB7XG5cdFx0Y29uc29sZS53YXJuKGBUYXJnZXQgZmlsZSBub3QgZm91bmQgZm9yIGxpbms6ICR7cmVsYXRpb25zaGlwTGlua31gKTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdHJldHVybiB0YXJnZXRGaWxlO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUZpbGVMaW5rID0gKGZpbGU6IFRGaWxlKTogc3RyaW5nID0+IHtcblx0Y29uc3QgZm9sZGVyID0gZmlsZS5wYXJlbnQ/LnBhdGggJiYgZmlsZS5wYXJlbnQucGF0aCAhPT0gXCIvXCIgPyBmaWxlLnBhcmVudC5wYXRoIDogXCJcIjtcblx0cmV0dXJuIGZvbGRlciA/IGBbWyR7Zm9sZGVyfS8ke2ZpbGUuYmFzZW5hbWV9fCR7ZmlsZS5iYXNlbmFtZX1dXWAgOiBgW1ske2ZpbGUuYmFzZW5hbWV9XV1gO1xufTtcblxuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZUFycmF5ID0gKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdID0+IHtcblx0aWYgKCF2YWx1ZSkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXHRpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuIFt2YWx1ZV07XG5cdH1cblx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cdHJldHVybiBbXTtcbn07XG5cbmV4cG9ydCBjb25zdCBhcnJheXNFcXVhbCA9IChhOiBzdHJpbmdbXSwgYjogc3RyaW5nW10pOiBib29sZWFuID0+IHtcblx0cmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KCh2YWwsIGluZGV4KSA9PiB2YWwgPT09IGJbaW5kZXhdKTtcbn07XG5cbi8qKlxuICogTm9ybWFsaXplcyBmcm9udG1hdHRlciBjb250ZW50IGJ5IGNvbnZlcnRpbmcgcXVvdGVkIG51bWVyaWMgX1pldHRlbElEcyB0byBudW1iZXJzLlxuICogVGhpcyBoYW5kbGVzIGVkZ2UgY2FzZXMgd2hlcmUgWUFNTCBwYXJzZXJzIHRyZWF0IG51bWVyaWMgc3RyaW5ncyBpbmNvbnNpc3RlbnRseS5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZUNvbnRlbnQgPSAoY29udGVudDogc3RyaW5nKTogc3RyaW5nID0+IHtcblx0bGV0IG5vcm1hbGl6ZWQgPSBjb250ZW50O1xuXHRsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG5cdC8vIE5vcm1hbGl6ZSBfWmV0dGVsSUQ6IFwic3RyaW5nXCIg4oaSIG51bWJlciAocmVtb3ZlIHF1b3Rlcylcblx0Y29uc3QgemV0dGVsSWRNYXRjaCA9IG5vcm1hbGl6ZWQubWF0Y2goL15fWmV0dGVsSUQ6XFxzKlwiKFxcZCspXCIvbSk7XG5cdGlmICh6ZXR0ZWxJZE1hdGNoKSB7XG5cdFx0Y29uc3QgW2Z1bGxNYXRjaCwgbnVtZXJpY0lkXSA9IHpldHRlbElkTWF0Y2g7XG5cdFx0Y29uc3QgcmVwbGFjZW1lbnQgPSBgX1pldHRlbElEOiAke251bWVyaWNJZH1gO1xuXHRcdG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnJlcGxhY2UoZnVsbE1hdGNoLCByZXBsYWNlbWVudCk7XG5cdFx0aGFzQ2hhbmdlcyA9IHRydWU7XG5cdFx0Y29uc29sZS5sb2coYCAg4pyFIF9aZXR0ZWxJRDogXCIke251bWVyaWNJZH1cIiDihpIgJHtudW1lcmljSWR9YCk7XG5cdH1cblxuXHRyZXR1cm4gaGFzQ2hhbmdlcyA/IG5vcm1hbGl6ZWQgOiBjb250ZW50O1xufTtcblxuLyoqXG4gKiBTYWZlbHkgcGVyZm9ybXMgYSBmaWxlIG9wZXJhdGlvbiB3aXRoIGVycm9yIGhhbmRsaW5nIGFuZCBmaWxlIHZhbGlkYXRpb24uXG4gKiBSZWR1Y2VzIGJvaWxlcnBsYXRlIGZvciBjb21tb24gZmlsZSBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgY29uc3Qgd2l0aEZpbGVPcGVyYXRpb24gPSBhc3luYyA8VD4oXG5cdGFwcDogQXBwLFxuXHRldmVudDogYW55LFxuXHRvcGVyYXRpb246IChmaWxlOiBURmlsZSkgPT4gUHJvbWlzZTxUPixcblx0ZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBcIk9wZXJhdGlvbiBmYWlsZWRcIlxuKTogUHJvbWlzZTxUIHwgbnVsbD4gPT4ge1xuXHR0cnkge1xuXHRcdGNvbnN0IGZpbGVQYXRoID0gZXZlbnQuZXh0ZW5kZWRQcm9wcy5maWxlUGF0aDtcblx0XHRjb25zdCBmaWxlID0gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChmaWxlUGF0aCk7XG5cblx0XHRpZiAoIShmaWxlIGluc3RhbmNlb2YgVEZpbGUpKSB7XG5cdFx0XHRuZXcgTm90aWNlKFwiQ291bGQgbm90IGZpbmQgdGhlIGZpbGVcIik7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gYXdhaXQgb3BlcmF0aW9uKGZpbGUpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdGNvbnNvbGUuZXJyb3IoYEVycm9yIGluIGZpbGUgb3BlcmF0aW9uOmAsIGVycm9yKTtcblx0XHRuZXcgTm90aWNlKGVycm9yTWVzc2FnZSk7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cbn07XG5cbi8qKlxuICogU2FmZWx5IHBlcmZvcm1zIGEgZmlsZSBvcGVyYXRpb24gYnkgZmlsZSBwYXRoIHdpdGggZXJyb3IgaGFuZGxpbmcgYW5kIGZpbGUgdmFsaWRhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhGaWxlID0gYXN5bmMgPFQ+KFxuXHRhcHA6IEFwcCxcblx0ZmlsZVBhdGg6IHN0cmluZyxcblx0b3BlcmF0aW9uOiAoZmlsZTogVEZpbGUpID0+IFByb21pc2U8VD4sXG5cdGVycm9yTWVzc2FnZTogc3RyaW5nID0gXCJPcGVyYXRpb24gZmFpbGVkXCJcbik6IFByb21pc2U8VCB8IG51bGw+ID0+IHtcblx0dHJ5IHtcblx0XHRjb25zdCBmaWxlID0gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChmaWxlUGF0aCk7XG5cblx0XHRpZiAoIShmaWxlIGluc3RhbmNlb2YgVEZpbGUpKSB7XG5cdFx0XHRuZXcgTm90aWNlKFwiQ291bGQgbm90IGZpbmQgdGhlIGZpbGVcIik7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gYXdhaXQgb3BlcmF0aW9uKGZpbGUpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdGNvbnNvbGUuZXJyb3IoYEVycm9yIGluIGZpbGUgb3BlcmF0aW9uOmAsIGVycm9yKTtcblx0XHRuZXcgTm90aWNlKGVycm9yTWVzc2FnZSk7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cbn07XG5cbi8qKlxuICogRHVwbGljYXRlcyBhIGZpbGUgd2l0aCBhIG5ldyBaZXR0ZWxJRCwgcHJlc2VydmluZyB0aGUgb3JpZ2luYWwgY29udGVudFxuICogYnV0IHVwZGF0aW5nIHRoZSBaZXR0ZWxJRCBpbiBmcm9udG1hdHRlciBpZiBjb25maWd1cmVkLlxuICovXG5leHBvcnQgY29uc3QgZHVwbGljYXRlRmlsZVdpdGhOZXdaZXR0ZWxJZCA9IGFzeW5jIChcblx0YXBwOiBBcHAsXG5cdGZpbGU6IFRGaWxlLFxuXHR6ZXR0ZWxJZFByb3A/OiBzdHJpbmdcbik6IFByb21pc2U8VEZpbGU+ID0+IHtcblx0Y29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGZpbGUpO1xuXHRjb25zdCB7IGdlbmVyYXRlWmV0dGVsSWQgfSA9IGF3YWl0IGltcG9ydChcIi4vZ2VuZXJhdGVcIik7XG5cdGNvbnN0IHsgZ2VuZXJhdGVVbmlxdWVGaWxlUGF0aCB9ID0gYXdhaXQgaW1wb3J0KFwiLi9maWxlLXV0aWxzXCIpO1xuXG5cdGNvbnN0IHBhcmVudFBhdGggPSBmaWxlLnBhcmVudD8ucGF0aCB8fCBcIlwiO1xuXHRjb25zdCBiYXNlTmFtZVdpdGhvdXRaZXR0ZWwgPSBmaWxlLmJhc2VuYW1lLnJlcGxhY2UoLy1cXGR7MTR9JC8sIFwiXCIpO1xuXHRjb25zdCB6ZXR0ZWxJZCA9IGdlbmVyYXRlWmV0dGVsSWQoKTtcblx0Y29uc3QgbmV3QmFzZW5hbWUgPSBgJHtiYXNlTmFtZVdpdGhvdXRaZXR0ZWx9LSR7emV0dGVsSWR9YDtcblx0Y29uc3QgbmV3RmlsZVBhdGggPSBnZW5lcmF0ZVVuaXF1ZUZpbGVQYXRoKGFwcCwgcGFyZW50UGF0aCwgbmV3QmFzZW5hbWUpO1xuXG5cdC8vIENyZWF0ZSB0aGUgbmV3IGZpbGUgd2l0aCBvcmlnaW5hbCBjb250ZW50XG5cdGNvbnN0IG5ld0ZpbGUgPSBhd2FpdCBhcHAudmF1bHQuY3JlYXRlKG5ld0ZpbGVQYXRoLCBjb250ZW50KTtcblxuXHQvLyBVcGRhdGUgdGhlIFpldHRlbElEIGluIGZyb250bWF0dGVyIGlmIGNvbmZpZ3VyZWRcblx0aWYgKHpldHRlbElkUHJvcCkge1xuXHRcdGF3YWl0IGFwcC5maWxlTWFuYWdlci5wcm9jZXNzRnJvbnRNYXR0ZXIobmV3RmlsZSwgKGZtKSA9PiB7XG5cdFx0XHRmbVt6ZXR0ZWxJZFByb3BdID0gemV0dGVsSWQ7XG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gbmV3RmlsZTtcbn07XG4iXX0=
@@ -0,0 +1,6 @@
1
+ import type { App } from "obsidian";
2
+ export declare const generateUniqueFilePath: (app: App, folder: string, baseName: string, extension?: string) => string;
3
+ export declare const sanitizeForFilename: (input: string) => string;
4
+ export declare const getFilenameFromPath: (filePath: string) => string;
5
+ export declare const isFileInConfiguredDirectory: (filePath: string, directory: string) => boolean;
6
+ //# sourceMappingURL=file-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../src/file-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC,eAAO,MAAM,sBAAsB,GAClC,KAAK,GAAG,EACR,QAAQ,MAAM,EACd,UAAU,MAAM,EAChB,YAAW,MAAa,KACtB,MAUF,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,OAAO,MAAM,KAAG,MAOnD,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,UAAU,MAAM,KAAG,MAEtD,CAAC;AAEF,eAAO,MAAM,2BAA2B,GAAI,UAAU,MAAM,EAAE,WAAW,MAAM,KAAG,OAGjF,CAAC"}
@@ -0,0 +1,25 @@
1
+ export const generateUniqueFilePath = (app, folder, baseName, extension = "md") => {
2
+ const folderPath = folder ? `${folder}/` : "";
3
+ let filePath = `${folderPath}${baseName}.${extension}`;
4
+ let counter = 1;
5
+ while (app.vault.getAbstractFileByPath(filePath)) {
6
+ filePath = `${folderPath}${baseName} ${counter++}.${extension}`;
7
+ }
8
+ return filePath;
9
+ };
10
+ export const sanitizeForFilename = (input) => {
11
+ return input
12
+ .replace(/[<>:"/\\|?*]/g, "") // Remove invalid filename characters
13
+ .replace(/\s+/g, "-") // Replace spaces with hyphens
14
+ .replace(/-+/g, "-") // Replace multiple hyphens with single
15
+ .replace(/^-|-$/g, "") // Remove leading/trailing hyphens
16
+ .toLowerCase();
17
+ };
18
+ export const getFilenameFromPath = (filePath) => {
19
+ return filePath.split("/").pop() || "Unknown";
20
+ };
21
+ export const isFileInConfiguredDirectory = (filePath, directory) => {
22
+ const normalizedDir = directory.endsWith("/") ? directory.slice(0, -1) : directory;
23
+ return filePath.startsWith(`${normalizedDir}/`) || filePath === normalizedDir;
24
+ };
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9maWxlLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQ3JDLEdBQVEsRUFDUixNQUFjLEVBQ2QsUUFBZ0IsRUFDaEIsWUFBb0IsSUFBSSxFQUNmLEVBQUU7SUFDWCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM5QyxJQUFJLFFBQVEsR0FBRyxHQUFHLFVBQVUsR0FBRyxRQUFRLElBQUksU0FBUyxFQUFFLENBQUM7SUFDdkQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBRWhCLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ2xELFFBQVEsR0FBRyxHQUFHLFVBQVUsR0FBRyxRQUFRLElBQUksT0FBTyxFQUFFLElBQUksU0FBUyxFQUFFLENBQUM7SUFDakUsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsS0FBYSxFQUFVLEVBQUU7SUFDNUQsT0FBTyxLQUFLO1NBQ1YsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQyxxQ0FBcUM7U0FDbEUsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyw4QkFBOEI7U0FDbkQsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyx1Q0FBdUM7U0FDM0QsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxrQ0FBa0M7U0FDeEQsV0FBVyxFQUFFLENBQUM7QUFDakIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxRQUFnQixFQUFVLEVBQUU7SUFDL0QsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLFNBQVMsQ0FBQztBQUMvQyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLFFBQWdCLEVBQUUsU0FBaUIsRUFBVyxFQUFFO0lBQzNGLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNuRixPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxhQUFhLEdBQUcsQ0FBQyxJQUFJLFFBQVEsS0FBSyxhQUFhLENBQUM7QUFDL0UsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlVW5pcXVlRmlsZVBhdGggPSAoXG5cdGFwcDogQXBwLFxuXHRmb2xkZXI6IHN0cmluZyxcblx0YmFzZU5hbWU6IHN0cmluZyxcblx0ZXh0ZW5zaW9uOiBzdHJpbmcgPSBcIm1kXCJcbik6IHN0cmluZyA9PiB7XG5cdGNvbnN0IGZvbGRlclBhdGggPSBmb2xkZXIgPyBgJHtmb2xkZXJ9L2AgOiBcIlwiO1xuXHRsZXQgZmlsZVBhdGggPSBgJHtmb2xkZXJQYXRofSR7YmFzZU5hbWV9LiR7ZXh0ZW5zaW9ufWA7XG5cdGxldCBjb3VudGVyID0gMTtcblxuXHR3aGlsZSAoYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChmaWxlUGF0aCkpIHtcblx0XHRmaWxlUGF0aCA9IGAke2ZvbGRlclBhdGh9JHtiYXNlTmFtZX0gJHtjb3VudGVyKyt9LiR7ZXh0ZW5zaW9ufWA7XG5cdH1cblxuXHRyZXR1cm4gZmlsZVBhdGg7XG59O1xuXG5leHBvcnQgY29uc3Qgc2FuaXRpemVGb3JGaWxlbmFtZSA9IChpbnB1dDogc3RyaW5nKTogc3RyaW5nID0+IHtcblx0cmV0dXJuIGlucHV0XG5cdFx0LnJlcGxhY2UoL1s8PjpcIi9cXFxcfD8qXS9nLCBcIlwiKSAvLyBSZW1vdmUgaW52YWxpZCBmaWxlbmFtZSBjaGFyYWN0ZXJzXG5cdFx0LnJlcGxhY2UoL1xccysvZywgXCItXCIpIC8vIFJlcGxhY2Ugc3BhY2VzIHdpdGggaHlwaGVuc1xuXHRcdC5yZXBsYWNlKC8tKy9nLCBcIi1cIikgLy8gUmVwbGFjZSBtdWx0aXBsZSBoeXBoZW5zIHdpdGggc2luZ2xlXG5cdFx0LnJlcGxhY2UoL14tfC0kL2csIFwiXCIpIC8vIFJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIGh5cGhlbnNcblx0XHQudG9Mb3dlckNhc2UoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGaWxlbmFtZUZyb21QYXRoID0gKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuXHRyZXR1cm4gZmlsZVBhdGguc3BsaXQoXCIvXCIpLnBvcCgpIHx8IFwiVW5rbm93blwiO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzRmlsZUluQ29uZmlndXJlZERpcmVjdG9yeSA9IChmaWxlUGF0aDogc3RyaW5nLCBkaXJlY3Rvcnk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuXHRjb25zdCBub3JtYWxpemVkRGlyID0gZGlyZWN0b3J5LmVuZHNXaXRoKFwiL1wiKSA/IGRpcmVjdG9yeS5zbGljZSgwLCAtMSkgOiBkaXJlY3Rvcnk7XG5cdHJldHVybiBmaWxlUGF0aC5zdGFydHNXaXRoKGAke25vcm1hbGl6ZWREaXJ9L2ApIHx8IGZpbGVQYXRoID09PSBub3JtYWxpemVkRGlyO1xufTtcbiJdfQ==
@@ -0,0 +1,7 @@
1
+ export interface TimestampData {
2
+ startDate: string;
3
+ zettelId: number;
4
+ }
5
+ export declare const generateZettelId: () => number;
6
+ export declare const generateTimestamps: () => TimestampData;
7
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,gBAAgB,QAAO,MAMnC,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAO,aAQrC,CAAC"}
@@ -0,0 +1,13 @@
1
+ export const generateZettelId = () => {
2
+ const currentTimestamp = new Date();
3
+ const padWithZero = (number) => String(number).padStart(2, "0");
4
+ return Number(`${currentTimestamp.getFullYear()}${padWithZero(currentTimestamp.getMonth() + 1)}${padWithZero(currentTimestamp.getDate())}${padWithZero(currentTimestamp.getHours())}${padWithZero(currentTimestamp.getMinutes())}${padWithZero(currentTimestamp.getSeconds())}`);
5
+ };
6
+ export const generateTimestamps = () => {
7
+ const padWithZero = (number) => String(number).padStart(2, "0");
8
+ const currentDate = new Date();
9
+ const formattedStartDate = `${currentDate.getFullYear()}-${padWithZero(currentDate.getMonth() + 1)}-${padWithZero(currentDate.getDate())}`;
10
+ const uniqueZettelId = generateZettelId();
11
+ return { startDate: formattedStartDate, zettelId: uniqueZettelId };
12
+ };
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZ2VuZXJhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsR0FBVyxFQUFFO0lBQzVDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUNwQyxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQWMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEUsT0FBTyxNQUFNLENBQ1osR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsR0FBRyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FDalEsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEdBQWtCLEVBQUU7SUFDckQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFjLEVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2hGLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFFL0IsTUFBTSxrQkFBa0IsR0FBVyxHQUFHLFdBQVcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxXQUFXLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ25KLE1BQU0sY0FBYyxHQUFXLGdCQUFnQixFQUFFLENBQUM7SUFFbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLENBQUM7QUFDcEUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBUaW1lc3RhbXBEYXRhIHtcblx0c3RhcnREYXRlOiBzdHJpbmc7XG5cdHpldHRlbElkOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVpldHRlbElkID0gKCk6IG51bWJlciA9PiB7XG5cdGNvbnN0IGN1cnJlbnRUaW1lc3RhbXAgPSBuZXcgRGF0ZSgpO1xuXHRjb25zdCBwYWRXaXRoWmVybyA9IChudW1iZXI6IG51bWJlcikgPT4gU3RyaW5nKG51bWJlcikucGFkU3RhcnQoMiwgXCIwXCIpO1xuXHRyZXR1cm4gTnVtYmVyKFxuXHRcdGAke2N1cnJlbnRUaW1lc3RhbXAuZ2V0RnVsbFllYXIoKX0ke3BhZFdpdGhaZXJvKGN1cnJlbnRUaW1lc3RhbXAuZ2V0TW9udGgoKSArIDEpfSR7cGFkV2l0aFplcm8oY3VycmVudFRpbWVzdGFtcC5nZXREYXRlKCkpfSR7cGFkV2l0aFplcm8oY3VycmVudFRpbWVzdGFtcC5nZXRIb3VycygpKX0ke3BhZFdpdGhaZXJvKGN1cnJlbnRUaW1lc3RhbXAuZ2V0TWludXRlcygpKX0ke3BhZFdpdGhaZXJvKGN1cnJlbnRUaW1lc3RhbXAuZ2V0U2Vjb25kcygpKX1gXG5cdCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVUaW1lc3RhbXBzID0gKCk6IFRpbWVzdGFtcERhdGEgPT4ge1xuXHRjb25zdCBwYWRXaXRoWmVybyA9IChudW1iZXI6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcobnVtYmVyKS5wYWRTdGFydCgyLCBcIjBcIik7XG5cdGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTtcblxuXHRjb25zdCBmb3JtYXR0ZWRTdGFydERhdGU6IHN0cmluZyA9IGAke2N1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCl9LSR7cGFkV2l0aFplcm8oY3VycmVudERhdGUuZ2V0TW9udGgoKSArIDEpfS0ke3BhZFdpdGhaZXJvKGN1cnJlbnREYXRlLmdldERhdGUoKSl9YDtcblx0Y29uc3QgdW5pcXVlWmV0dGVsSWQ6IG51bWJlciA9IGdlbmVyYXRlWmV0dGVsSWQoKTtcblxuXHRyZXR1cm4geyBzdGFydERhdGU6IGZvcm1hdHRlZFN0YXJ0RGF0ZSwgemV0dGVsSWQ6IHVuaXF1ZVpldHRlbElkIH07XG59O1xuIl19
@@ -0,0 +1,14 @@
1
+ export * from "./async-utils";
2
+ export * from "./batch-operations";
3
+ export * from "./child-reference-utils";
4
+ export * from "./date-recurrence-utils";
5
+ export * from "./date-utils";
6
+ export * from "./evaluator-base";
7
+ export * from "./file-operations";
8
+ export * from "./file-utils";
9
+ export * from "./generate";
10
+ export * from "./link-parser";
11
+ export * from "./settings-store";
12
+ export * from "./string-utils";
13
+ export * from "./templater-utils";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ export * from "./async-utils";
2
+ export * from "./batch-operations";
3
+ export * from "./child-reference-utils";
4
+ export * from "./date-recurrence-utils";
5
+ export * from "./date-utils";
6
+ export * from "./evaluator-base";
7
+ export * from "./file-operations";
8
+ export * from "./file-utils";
9
+ export * from "./generate";
10
+ export * from "./link-parser";
11
+ export * from "./settings-store";
12
+ export * from "./string-utils";
13
+ export * from "./templater-utils";
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vYXN5bmMtdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2JhdGNoLW9wZXJhdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NoaWxkLXJlZmVyZW5jZS11dGlsc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGF0ZS1yZWN1cnJlbmNlLXV0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXRlLXV0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ldmFsdWF0b3ItYmFzZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmlsZS1vcGVyYXRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maWxlLXV0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGluay1wYXJzZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NldHRpbmdzLXN0b3JlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zdHJpbmctdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlbXBsYXRlci11dGlsc1wiO1xuIl19
@@ -0,0 +1,9 @@
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 declare const extractFilePathFromLink: (link: string) => string | null;
9
+ //# sourceMappingURL=link-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-parser.d.ts","sourceRoot":"","sources":["../src/link-parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,IAU/D,CAAC"}