@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,220 @@
1
+ import { vi } from "vitest";
2
+ // Base Plugin class mock
3
+ export class Plugin {
4
+ constructor(app, manifest) {
5
+ // Core plugin methods
6
+ this.addSettingTab = vi.fn();
7
+ this.registerEvent = vi.fn();
8
+ this.loadData = vi.fn().mockResolvedValue({});
9
+ this.saveData = vi.fn().mockResolvedValue(undefined);
10
+ this.onload = vi.fn();
11
+ this.onunload = vi.fn();
12
+ // UI methods
13
+ this.addRibbonIcon = vi.fn();
14
+ this.addStatusBarItem = vi.fn();
15
+ this.addCommand = vi.fn();
16
+ this.removeCommand = vi.fn();
17
+ // Event methods
18
+ this.registerDomEvent = vi.fn();
19
+ this.registerCodeMirror = vi.fn();
20
+ this.registerEditorExtension = vi.fn();
21
+ this.registerMarkdownPostProcessor = vi.fn();
22
+ this.registerMarkdownCodeBlockProcessor = vi.fn();
23
+ this.registerObsidianProtocolHandler = vi.fn();
24
+ this.registerEditorSuggest = vi.fn();
25
+ this.registerHoverLinkSource = vi.fn();
26
+ // Interval methods
27
+ this.registerInterval = vi.fn();
28
+ // View and extension methods
29
+ this.registerView = vi.fn();
30
+ this.registerExtensions = vi.fn();
31
+ // Lifecycle methods
32
+ this.onUserEnable = vi.fn();
33
+ this.load = vi.fn();
34
+ this.unload = vi.fn();
35
+ // Other methods
36
+ this.addChild = vi.fn();
37
+ this.removeChild = vi.fn();
38
+ this.register = vi.fn();
39
+ this.app = app;
40
+ this.manifest = manifest;
41
+ }
42
+ }
43
+ // PluginSettingTab mock
44
+ export class PluginSettingTab {
45
+ constructor(app, plugin) {
46
+ this.display = vi.fn();
47
+ this.app = app;
48
+ this.plugin = plugin;
49
+ this.containerEl = document.createElement("div");
50
+ }
51
+ }
52
+ // ItemView mock
53
+ export class ItemView {
54
+ constructor(leaf) {
55
+ this.getState = vi.fn().mockReturnValue({});
56
+ this.setState = vi.fn().mockResolvedValue(undefined);
57
+ this.leaf = leaf;
58
+ this.app = leaf === null || leaf === void 0 ? void 0 : leaf.app;
59
+ this.containerEl = document.createElement("div");
60
+ }
61
+ // Don't override onOpen/onClose - let subclasses implement them
62
+ // These methods are implemented by MountableView mixin
63
+ // Don't provide default implementations for these methods
64
+ // Let subclasses implement them
65
+ getViewType() {
66
+ return "mock-view";
67
+ }
68
+ getDisplayText() {
69
+ return "Mock View";
70
+ }
71
+ getIcon() {
72
+ return "mock-icon";
73
+ }
74
+ }
75
+ // Setting component mock
76
+ export class Setting {
77
+ constructor(_containerEl) {
78
+ this.setName = vi.fn().mockReturnThis();
79
+ this.setDesc = vi.fn().mockReturnThis();
80
+ this.addText = vi.fn().mockReturnThis();
81
+ this.addTextArea = vi.fn().mockReturnThis();
82
+ this.settingEl = document.createElement("div");
83
+ this.nameEl = document.createElement("div");
84
+ this.descEl = document.createElement("div");
85
+ this.controlEl = document.createElement("div");
86
+ }
87
+ }
88
+ // TFolder mock
89
+ export class TFolder {
90
+ constructor(path) {
91
+ this.path = path;
92
+ this.name = path.split("/").pop() || "";
93
+ this.children = [];
94
+ this.vault = {};
95
+ this.parent = null;
96
+ }
97
+ isRoot() {
98
+ return this.path === "" || this.path === "/";
99
+ }
100
+ }
101
+ // TFile mock with full interface
102
+ export class TFile {
103
+ constructor(path, parentPath) {
104
+ this.path = path;
105
+ this.name = path.split("/").pop() || "";
106
+ this.basename = this.name.replace(/\.[^/.]+$/, ""); // Remove extension
107
+ this.extension = path.split(".").pop() || "md";
108
+ this.stat = {};
109
+ this.vault = {};
110
+ // Set parent based on path or explicit parentPath
111
+ if (parentPath !== undefined) {
112
+ this.parent = parentPath ? new TFolder(parentPath) : null;
113
+ }
114
+ else {
115
+ // Derive parent from path
116
+ const lastSlash = path.lastIndexOf("/");
117
+ if (lastSlash > 0) {
118
+ this.parent = new TFolder(path.substring(0, lastSlash));
119
+ }
120
+ else {
121
+ this.parent = null;
122
+ }
123
+ }
124
+ }
125
+ }
126
+ // Modal mock
127
+ export class Modal {
128
+ constructor(app) {
129
+ this.open = vi.fn();
130
+ this.close = vi.fn();
131
+ this.onOpen = vi.fn();
132
+ this.onClose = vi.fn();
133
+ this.app = app;
134
+ this.containerEl = document.createElement("div");
135
+ this.titleEl = document.createElement("div");
136
+ this.contentEl = document.createElement("div");
137
+ }
138
+ }
139
+ // Notice mock
140
+ export class Notice {
141
+ constructor(message) {
142
+ console.log(`Notice: ${message}`);
143
+ }
144
+ }
145
+ // MarkdownRenderer mock
146
+ export const MarkdownRenderer = {
147
+ render: vi.fn().mockResolvedValue(undefined),
148
+ };
149
+ // Debounce function mock
150
+ export function debounce(func, wait, immediate) {
151
+ let timeout = null;
152
+ return ((...args) => {
153
+ const later = () => {
154
+ timeout = null;
155
+ if (!immediate)
156
+ func(...args);
157
+ };
158
+ const callNow = immediate && !timeout;
159
+ if (timeout !== null) {
160
+ clearTimeout(timeout);
161
+ }
162
+ timeout = setTimeout(later, wait);
163
+ if (callNow)
164
+ func(...args);
165
+ });
166
+ }
167
+ // App mock
168
+ export const App = vi.fn();
169
+ // Helper function to create a fully mocked app
170
+ export function createMockApp() {
171
+ return {
172
+ fileManager: {
173
+ processFrontMatter: vi.fn(),
174
+ },
175
+ metadataCache: {
176
+ getFileCache: vi.fn(),
177
+ },
178
+ vault: {
179
+ getAbstractFileByPath: vi.fn(),
180
+ on: vi.fn(),
181
+ read: vi.fn(),
182
+ modify: vi.fn(),
183
+ create: vi.fn(),
184
+ delete: vi.fn(),
185
+ rename: vi.fn(),
186
+ getFiles: vi.fn().mockReturnValue([]),
187
+ getMarkdownFiles: vi.fn().mockReturnValue([]),
188
+ getFolderByPath: vi.fn(),
189
+ },
190
+ workspace: {
191
+ getActiveFile: vi.fn(),
192
+ on: vi.fn(),
193
+ },
194
+ };
195
+ }
196
+ // Helper to create mock TFile instances
197
+ export function createMockFile(path, options) {
198
+ const file = new TFile(path, options === null || options === void 0 ? void 0 : options.parentPath);
199
+ if (options === null || options === void 0 ? void 0 : options.basename) {
200
+ file.basename = options.basename;
201
+ }
202
+ if (options === null || options === void 0 ? void 0 : options.extension) {
203
+ file.extension = options.extension;
204
+ }
205
+ return file;
206
+ }
207
+ // Helper to create mock file cache
208
+ export function createMockFileCache(frontmatter) {
209
+ return {
210
+ frontmatter: frontmatter || {},
211
+ frontmatterPosition: frontmatter ? { start: { line: 0 }, end: { line: 3 } } : null,
212
+ sections: [],
213
+ headings: [],
214
+ links: [],
215
+ embeds: [],
216
+ tags: [],
217
+ listItems: [],
218
+ };
219
+ }
220
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzaWRpYW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9tb2Nrcy9vYnNpZGlhbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRTVCLHlCQUF5QjtBQUN6QixNQUFNLE9BQU8sTUFBTTtJQUtsQixZQUFZLEdBQVEsRUFBRSxRQUFhO1FBS25DLHNCQUFzQjtRQUN0QixrQkFBYSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN4QixrQkFBYSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN4QixhQUFRLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLGFBQVEsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEQsV0FBTSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNqQixhQUFRLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBRW5CLGFBQWE7UUFDYixrQkFBYSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN4QixxQkFBZ0IsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDM0IsZUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyQixrQkFBYSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUV4QixnQkFBZ0I7UUFDaEIscUJBQWdCLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzNCLHVCQUFrQixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM3Qiw0QkFBdUIsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDbEMsa0NBQTZCLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxD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LElBQUksT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFFBQVEsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsSUFBSSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsU0FBUyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO0lBQ3BDLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNiLENBQUM7QUFFRCxtQ0FBbUM7QUFDbkMsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFdBQWlDO0lBQ3BFLE9BQU87UUFDTixXQUFXLEVBQUUsV0FBVyxJQUFJLEVBQUU7UUFDOUIsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUNsRixRQUFRLEVBQUUsRUFBRTtRQUNaLFFBQVEsRUFBRSxFQUFFO1FBQ1osS0FBSyxFQUFFLEVBQUU7UUFDVCxNQUFNLEVBQUUsRUFBRTtRQUNWLElBQUksRUFBRSxFQUFFO1FBQ1IsU0FBUyxFQUFFLEVBQUU7S0FDYixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHZpIH0gZnJvbSBcInZpdGVzdFwiO1xuXG4vLyBCYXNlIFBsdWdpbiBjbGFzcyBtb2NrXG5leHBvcnQgY2xhc3MgUGx1Z2luIHtcblx0YXBwOiBhbnk7XG5cdG1hbmlmZXN0OiBhbnk7XG5cdHNldHRpbmdzOiBhbnk7XG5cblx0Y29uc3RydWN0b3IoYXBwOiBhbnksIG1hbmlmZXN0OiBhbnkpIHtcblx0XHR0aGlzLmFwcCA9IGFwcDtcblx0XHR0aGlzLm1hbmlmZXN0ID0gbWFuaWZlc3Q7XG5cdH1cblxuXHQvLyBDb3JlIHBsdWdpbiBtZXRob2RzXG5cdGFkZFNldHRpbmdUYWIgPSB2aS5mbigpO1xuXHRyZWdpc3RlckV2ZW50ID0gdmkuZm4oKTtcblx0bG9hZERhdGEgPSB2aS5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHt9KTtcblx0c2F2ZURhdGEgPSB2aS5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCk7XG5cdG9ubG9hZCA9IHZpLmZuKCk7XG5cdG9udW5sb2FkID0gdmkuZm4oKTtcblxuXHQvLyBVSSBtZXRob2RzXG5cdGFkZFJpYmJvbkljb24gPSB2aS5mbigpO1xuXHRhZGRTdGF0dXNCYXJJdGVtID0gdmkuZm4oKTtcblx0YWRkQ29tbWFuZCA9IHZpLmZuKCk7XG5cdHJlbW92ZUNvbW1hbmQgPSB2aS5mbigpO1xuXG5cdC8vIEV2ZW50IG1ldGhvZHNcblx0cmVnaXN0ZXJEb21FdmVudCA9IHZpLmZuKCk7XG5cdHJlZ2lzdGVyQ29kZU1pcnJvciA9IHZpLmZuKCk7XG5cdHJlZ2lzdGVyRWRpdG9yRXh0ZW5zaW9uID0gdmkuZm4oKTtcblx0cmVnaXN0ZXJNYXJrZG93blBvc3RQcm9jZXNzb3IgPSB2aS5mbigpO1xuXHRyZWdpc3Rlck1hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yID0gdmkuZm4oKTtcblx0cmVnaXN0ZXJPYnNpZGlhblByb3RvY29sSGFuZGxlciA9IHZpLmZuKCk7XG5cdHJlZ2lzdGVyRWRpdG9yU3VnZ2VzdCA9IHZpLmZuKCk7XG5cdHJlZ2lzdGVySG92ZXJMaW5rU291cmNlID0gdmkuZm4oKTtcblxuXHQvLyBJbnRlcnZhbCBtZXRob2RzXG5cdHJlZ2lzdGVySW50ZXJ2YWwgPSB2aS5mbigpO1xuXG5cdC8vIFZpZXcgYW5kIGV4dGVuc2lvbiBtZXRob2RzXG5cdHJlZ2lzdGVyVmlldyA9IHZpLmZuKCk7XG5cdHJlZ2lzdGVyRXh0ZW5zaW9ucyA9IHZpLmZuKCk7XG5cblx0Ly8gTGlmZWN5Y2xlIG1ldGhvZHNcblx0b25Vc2VyRW5hYmxlID0gdmkuZm4oKTtcblx0bG9hZCA9IHZpLmZuKCk7XG5cdHVubG9hZCA9IHZpLmZuKCk7XG5cblx0Ly8gT3RoZXIgbWV0aG9kc1xuXHRhZGRDaGlsZCA9IHZpLmZuKCk7XG5cdHJlbW92ZUNoaWxkID0gdmkuZm4oKTtcblx0cmVnaXN0ZXIgPSB2aS5mbigpO1xufVxuXG4vLyBQbHVnaW5TZXR0aW5nVGFiIG1vY2tcbmV4cG9ydCBjbGFzcyBQbHVnaW5TZXR0aW5nVGFiIHtcblx0YXBwOiBhbnk7XG5cdHBsdWdpbjogYW55O1xuXHRjb250YWluZXJFbDogSFRNTEVsZW1lbnQ7XG5cblx0Y29uc3RydWN0b3IoYXBwOiBhbnksIHBsdWdpbjogYW55KSB7XG5cdFx0dGhpcy5hcHAgPSBhcHA7XG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XG5cdFx0dGhpcy5jb250YWluZXJFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdH1cblxuXHRkaXNwbGF5ID0gdmkuZm4oKTtcbn1cblxuLy8gSXRlbVZpZXcgbW9ja1xuZXhwb3J0IGNsYXNzIEl0ZW1WaWV3IHtcblx0YXBwOiBhbnk7XG5cdGxlYWY6IGFueTtcblx0Y29udGFpbmVyRWw6IEhUTUxFbGVtZW50O1xuXG5cdGNvbnN0cnVjdG9yKGxlYWY6IGFueSkge1xuXHRcdHRoaXMubGVhZiA9IGxlYWY7XG5cdFx0dGhpcy5hcHAgPSBsZWFmPy5hcHA7XG5cdFx0dGhpcy5jb250YWluZXJFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdH1cblxuXHQvLyBEb24ndCBvdmVycmlkZSBvbk9wZW4vb25DbG9zZSAtIGxldCBzdWJjbGFzc2VzIGltcGxlbWVudCB0aGVtXG5cdC8vIFRoZXNlIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkIGJ5IE1vdW50YWJsZVZpZXcgbWl4aW5cblxuXHQvLyBEb24ndCBwcm92aWRlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciB0aGVzZSBtZXRob2RzXG5cdC8vIExldCBzdWJjbGFzc2VzIGltcGxlbWVudCB0aGVtXG5cdGdldFZpZXdUeXBlKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIFwibW9jay12aWV3XCI7XG5cdH1cblxuXHRnZXREaXNwbGF5VGV4dCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiBcIk1vY2sgVmlld1wiO1xuXHR9XG5cblx0Z2V0SWNvbigpOiBzdHJpbmcge1xuXHRcdHJldHVybiBcIm1vY2staWNvblwiO1xuXHR9XG5cblx0Z2V0U3RhdGUgPSB2aS5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7fSk7XG5cdHNldFN0YXRlID0gdmkuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh1bmRlZmluZWQpO1xufVxuXG4vLyBTZXR0aW5nIGNvbXBvbmVudCBtb2NrXG5leHBvcnQgY2xhc3MgU2V0dGluZyB7XG5cdHNldHRpbmdFbDogSFRNTEVsZW1lbnQ7XG5cdG5hbWVFbDogSFRNTEVsZW1lbnQ7XG5cdGRlc2NFbDogSFRNTEVsZW1lbnQ7XG5cdGNvbnRyb2xFbDogSFRNTEVsZW1lbnQ7XG5cblx0Y29uc3RydWN0b3IoX2NvbnRhaW5lckVsOiBIVE1MRWxlbWVudCkge1xuXHRcdHRoaXMuc2V0dGluZ0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHR0aGlzLm5hbWVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0dGhpcy5kZXNjRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdHRoaXMuY29udHJvbEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0fVxuXG5cdHNldE5hbWUgPSB2aS5mbigpLm1vY2tSZXR1cm5UaGlzKCk7XG5cdHNldERlc2MgPSB2aS5mbigpLm1vY2tSZXR1cm5UaGlzKCk7XG5cdGFkZFRleHQgPSB2aS5mbigpLm1vY2tSZXR1cm5UaGlzKCk7XG5cdGFkZFRleHRBcmVhID0gdmkuZm4oKS5tb2NrUmV0dXJuVGhpcygpO1xufVxuXG4vLyBURm9sZGVyIG1vY2tcbmV4cG9ydCBjbGFzcyBURm9sZGVyIHtcblx0cGF0aDogc3RyaW5nO1xuXHRuYW1lOiBzdHJpbmc7XG5cdGNoaWxkcmVuOiBhbnlbXTtcblx0dmF1bHQ6IGFueTtcblx0cGFyZW50OiBURm9sZGVyIHwgbnVsbDtcblxuXHRjb25zdHJ1Y3RvcihwYXRoOiBzdHJpbmcpIHtcblx0XHR0aGlzLnBhdGggPSBwYXRoO1xuXHRcdHRoaXMubmFtZSA9IHBhdGguc3BsaXQoXCIvXCIpLnBvcCgpIHx8IFwiXCI7XG5cdFx0dGhpcy5jaGlsZHJlbiA9IFtdO1xuXHRcdHRoaXMudmF1bHQgPSB7fTtcblx0XHR0aGlzLnBhcmVudCA9IG51bGw7XG5cdH1cblxuXHRpc1Jvb3QoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMucGF0aCA9PT0gXCJcIiB8fCB0aGlzLnBhdGggPT09IFwiL1wiO1xuXHR9XG59XG5cbi8vIFRGaWxlIG1vY2sgd2l0aCBmdWxsIGludGVyZmFjZVxuZXhwb3J0IGNsYXNzIFRGaWxlIHtcblx0cGF0aDogc3RyaW5nO1xuXHRuYW1lOiBzdHJpbmc7XG5cdGJhc2VuYW1lOiBzdHJpbmc7XG5cdGV4dGVuc2lvbjogc3RyaW5nO1xuXHRzdGF0OiBhbnk7XG5cdHZhdWx0OiBhbnk7XG5cdHBhcmVudDogVEZvbGRlciB8IG51bGw7XG5cblx0Y29uc3RydWN0b3IocGF0aDogc3RyaW5nLCBwYXJlbnRQYXRoPzogc3RyaW5nKSB7XG5cdFx0dGhpcy5wYXRoID0gcGF0aDtcblx0XHR0aGlzLm5hbWUgPSBwYXRoLnNwbGl0KFwiL1wiKS5wb3AoKSB8fCBcIlwiO1xuXHRcdHRoaXMuYmFzZW5hbWUgPSB0aGlzLm5hbWUucmVwbGFjZSgvXFwuW14vLl0rJC8sIFwiXCIpOyAvLyBSZW1vdmUgZXh0ZW5zaW9uXG5cdFx0dGhpcy5leHRlbnNpb24gPSBwYXRoLnNwbGl0KFwiLlwiKS5wb3AoKSB8fCBcIm1kXCI7XG5cdFx0dGhpcy5zdGF0ID0ge307XG5cdFx0dGhpcy52YXVsdCA9IHt9O1xuXG5cdFx0Ly8gU2V0IHBhcmVudCBiYXNlZCBvbiBwYXRoIG9yIGV4cGxpY2l0IHBhcmVudFBhdGhcblx0XHRpZiAocGFyZW50UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLnBhcmVudCA9IHBhcmVudFBhdGggPyBuZXcgVEZvbGRlcihwYXJlbnRQYXRoKSA6IG51bGw7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIERlcml2ZSBwYXJlbnQgZnJvbSBwYXRoXG5cdFx0XHRjb25zdCBsYXN0U2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcblx0XHRcdGlmIChsYXN0U2xhc2ggPiAwKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50ID0gbmV3IFRGb2xkZXIocGF0aC5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnBhcmVudCA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8vIE1vZGFsIG1vY2tcbmV4cG9ydCBjbGFzcyBNb2RhbCB7XG5cdGFwcDogYW55O1xuXHRjb250YWluZXJFbDogSFRNTEVsZW1lbnQ7XG5cdHRpdGxlRWw6IEhUTUxFbGVtZW50O1xuXHRjb250ZW50RWw6IEhUTUxFbGVtZW50O1xuXG5cdGNvbnN0cnVjdG9yKGFwcDogYW55KSB7XG5cdFx0dGhpcy5hcHAgPSBhcHA7XG5cdFx0dGhpcy5jb250YWluZXJFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0dGhpcy50aXRsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHR0aGlzLmNvbnRlbnRFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdH1cblxuXHRvcGVuID0gdmkuZm4oKTtcblx0Y2xvc2UgPSB2aS5mbigpO1xuXHRvbk9wZW4gPSB2aS5mbigpO1xuXHRvbkNsb3NlID0gdmkuZm4oKTtcbn1cblxuLy8gTm90aWNlIG1vY2tcbmV4cG9ydCBjbGFzcyBOb3RpY2Uge1xuXHRjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcblx0XHRjb25zb2xlLmxvZyhgTm90aWNlOiAke21lc3NhZ2V9YCk7XG5cdH1cbn1cblxuLy8gTWFya2Rvd25SZW5kZXJlciBtb2NrXG5leHBvcnQgY29uc3QgTWFya2Rvd25SZW5kZXJlciA9IHtcblx0cmVuZGVyOiB2aS5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCksXG59O1xuXG4vLyBEZWJvdW5jZSBmdW5jdGlvbiBtb2NrXG5leHBvcnQgZnVuY3Rpb24gZGVib3VuY2U8VCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55Pihcblx0ZnVuYzogVCxcblx0d2FpdDogbnVtYmVyLFxuXHRpbW1lZGlhdGU/OiBib29sZWFuXG4pOiBUIHtcblx0bGV0IHRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG5cblx0cmV0dXJuICgoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4ge1xuXHRcdGNvbnN0IGxhdGVyID0gKCkgPT4ge1xuXHRcdFx0dGltZW91dCA9IG51bGw7XG5cdFx0XHRpZiAoIWltbWVkaWF0ZSkgZnVuYyguLi5hcmdzKTtcblx0XHR9O1xuXG5cdFx0Y29uc3QgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiAhdGltZW91dDtcblxuXHRcdGlmICh0aW1lb3V0ICE9PSBudWxsKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGltZW91dCk7XG5cdFx0fVxuXG5cdFx0dGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuXG5cdFx0aWYgKGNhbGxOb3cpIGZ1bmMoLi4uYXJncyk7XG5cdH0pIGFzIFQ7XG59XG5cbi8vIEFwcCBtb2NrXG5leHBvcnQgY29uc3QgQXBwID0gdmkuZm4oKTtcblxuLy8gTW9jayBpbnRlcmZhY2VzIGZvciBUeXBlU2NyaXB0XG5leHBvcnQgaW50ZXJmYWNlIE1vY2tBcHAge1xuXHRmaWxlTWFuYWdlcjoge1xuXHRcdHByb2Nlc3NGcm9udE1hdHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgdmkuZm4+O1xuXHR9O1xuXHRtZXRhZGF0YUNhY2hlOiB7XG5cdFx0Z2V0RmlsZUNhY2hlOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj47XG5cdH07XG5cdHZhdWx0OiB7XG5cdFx0Z2V0QWJzdHJhY3RGaWxlQnlQYXRoOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj47XG5cdFx0b246IFJldHVyblR5cGU8dHlwZW9mIHZpLmZuPjtcblx0XHRyZWFkOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj47XG5cdFx0bW9kaWZ5OiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj47XG5cdFx0Y3JlYXRlOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj47XG5cdFx0ZGVsZXRlOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj47XG5cdFx0cmVuYW1lOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj47XG5cdFx0Z2V0RmlsZXM6IFJldHVyblR5cGU8dHlwZW9mIHZpLmZuPjtcblx0XHRnZXRNYXJrZG93bkZpbGVzOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj47XG5cdFx0Z2V0Rm9sZGVyQnlQYXRoOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj47XG5cdH07XG5cdHdvcmtzcGFjZToge1xuXHRcdGdldEFjdGl2ZUZpbGU6IFJldHVyblR5cGU8dHlwZW9mIHZpLmZuPjtcblx0XHRvbjogUmV0dXJuVHlwZTx0eXBlb2YgdmkuZm4+O1xuXHR9O1xufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgZnVsbHkgbW9ja2VkIGFwcFxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tBcHAoKTogTW9ja0FwcCB7XG5cdHJldHVybiB7XG5cdFx0ZmlsZU1hbmFnZXI6IHtcblx0XHRcdHByb2Nlc3NGcm9udE1hdHRlcjogdmkuZm4oKSxcblx0XHR9LFxuXHRcdG1ldGFkYXRhQ2FjaGU6IHtcblx0XHRcdGdldEZpbGVDYWNoZTogdmkuZm4oKSxcblx0XHR9LFxuXHRcdHZhdWx0OiB7XG5cdFx0XHRnZXRBYnN0cmFjdEZpbGVCeVBhdGg6IHZpLmZuKCksXG5cdFx0XHRvbjogdmkuZm4oKSxcblx0XHRcdHJlYWQ6IHZpLmZuKCksXG5cdFx0XHRtb2RpZnk6IHZpLmZuKCksXG5cdFx0XHRjcmVhdGU6IHZpLmZuKCksXG5cdFx0XHRkZWxldGU6IHZpLmZuKCksXG5cdFx0XHRyZW5hbWU6IHZpLmZuKCksXG5cdFx0XHRnZXRGaWxlczogdmkuZm4oKS5tb2NrUmV0dXJuVmFsdWUoW10pLFxuXHRcdFx0Z2V0TWFya2Rvd25GaWxlczogdmkuZm4oKS5tb2NrUmV0dXJuVmFsdWUoW10pLFxuXHRcdFx0Z2V0Rm9sZGVyQnlQYXRoOiB2aS5mbigpLFxuXHRcdH0sXG5cdFx0d29ya3NwYWNlOiB7XG5cdFx0XHRnZXRBY3RpdmVGaWxlOiB2aS5mbigpLFxuXHRcdFx0b246IHZpLmZuKCksXG5cdFx0fSxcblx0fTtcbn1cblxuLy8gSGVscGVyIHRvIGNyZWF0ZSBtb2NrIFRGaWxlIGluc3RhbmNlc1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tGaWxlKFxuXHRwYXRoOiBzdHJpbmcsXG5cdG9wdGlvbnM/OiB7XG5cdFx0YmFzZW5hbWU/OiBzdHJpbmc7XG5cdFx0cGFyZW50UGF0aD86IHN0cmluZztcblx0XHRleHRlbnNpb24/OiBzdHJpbmc7XG5cdH1cbik6IFRGaWxlIHtcblx0Y29uc3QgZmlsZSA9IG5ldyBURmlsZShwYXRoLCBvcHRpb25zPy5wYXJlbnRQYXRoKTtcblx0aWYgKG9wdGlvbnM/LmJhc2VuYW1lKSB7XG5cdFx0ZmlsZS5iYXNlbmFtZSA9IG9wdGlvbnMuYmFzZW5hbWU7XG5cdH1cblx0aWYgKG9wdGlvbnM/LmV4dGVuc2lvbikge1xuXHRcdGZpbGUuZXh0ZW5zaW9uID0gb3B0aW9ucy5leHRlbnNpb247XG5cdH1cblx0cmV0dXJuIGZpbGU7XG59XG5cbi8vIEhlbHBlciB0byBjcmVhdGUgbW9jayBmaWxlIGNhY2hlXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0ZpbGVDYWNoZShmcm9udG1hdHRlcj86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcblx0cmV0dXJuIHtcblx0XHRmcm9udG1hdHRlcjogZnJvbnRtYXR0ZXIgfHwge30sXG5cdFx0ZnJvbnRtYXR0ZXJQb3NpdGlvbjogZnJvbnRtYXR0ZXIgPyB7IHN0YXJ0OiB7IGxpbmU6IDAgfSwgZW5kOiB7IGxpbmU6IDMgfSB9IDogbnVsbCxcblx0XHRzZWN0aW9uczogW10sXG5cdFx0aGVhZGluZ3M6IFtdLFxuXHRcdGxpbmtzOiBbXSxcblx0XHRlbWJlZHM6IFtdLFxuXHRcdHRhZ3M6IFtdLFxuXHRcdGxpc3RJdGVtczogW10sXG5cdH07XG59XG4iXX0=
@@ -0,0 +1,14 @@
1
+ export declare const mockFileOperations: {
2
+ arraysEqual: import("vitest").Mock<(...args: any[]) => any>;
3
+ normalizeArray: import("vitest").Mock<(...args: any[]) => any>;
4
+ createFileLink: import("vitest").Mock<(...args: any[]) => any>;
5
+ };
6
+ export declare const mockLinkParser: {
7
+ extractFilePathFromLink: import("vitest").Mock<(...args: any[]) => any>;
8
+ };
9
+ export declare function setupDefaultMockImplementations(): void;
10
+ export declare function resetAllMocks(): void;
11
+ export declare function setupMockImplementation(mockName: keyof typeof mockFileOperations | keyof typeof mockLinkParser, implementation: (...args: any[]) => any): void;
12
+ export declare function setupMockReturnValue(mockName: keyof typeof mockFileOperations | keyof typeof mockLinkParser, value: any): void;
13
+ export declare function verifyMockCalls(mockName: keyof typeof mockFileOperations | keyof typeof mockLinkParser, expectedCalls: any[][]): void;
14
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/testing/mocks/utils.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,kBAAkB;;;;CAI9B,CAAC;AAGF,eAAO,MAAM,cAAc;;CAE1B,CAAC;AAGF,wBAAgB,+BAA+B,SA+C9C;AAGD,wBAAgB,aAAa,SAO5B;AAGD,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,MAAM,OAAO,kBAAkB,GAAG,MAAM,OAAO,cAAc,EACvE,cAAc,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,QAOvC;AAGD,wBAAgB,oBAAoB,CACnC,QAAQ,EAAE,MAAM,OAAO,kBAAkB,GAAG,MAAM,OAAO,cAAc,EACvE,KAAK,EAAE,GAAG,QAOV;AAGD,wBAAgB,eAAe,CAC9B,QAAQ,EAAE,MAAM,OAAO,kBAAkB,GAAG,MAAM,OAAO,cAAc,EACvE,aAAa,EAAE,GAAG,EAAE,EAAE,QAWtB"}
@@ -0,0 +1,85 @@
1
+ import { expect, vi } from "vitest";
2
+ // File operations mocks
3
+ export const mockFileOperations = {
4
+ arraysEqual: vi.fn(),
5
+ normalizeArray: vi.fn(),
6
+ createFileLink: vi.fn(),
7
+ };
8
+ // Link parser mocks
9
+ export const mockLinkParser = {
10
+ extractFilePathFromLink: vi.fn(),
11
+ };
12
+ // Default mock implementations that match the actual behavior
13
+ export function setupDefaultMockImplementations() {
14
+ // Set up file operations mocks
15
+ mockFileOperations.normalizeArray.mockImplementation((arr) => Array.isArray(arr) ? arr : arr ? [arr] : []);
16
+ mockFileOperations.arraysEqual.mockImplementation((a, b) => JSON.stringify(a) === JSON.stringify(b));
17
+ mockFileOperations.createFileLink.mockImplementation((file) => {
18
+ var _a, _b, _c;
19
+ if (!file)
20
+ return "[[Unknown File]]";
21
+ const basename = file.basename ||
22
+ ((_b = (_a = file.path) === null || _a === void 0 ? void 0 : _a.split("/").pop()) === null || _b === void 0 ? void 0 : _b.replace(/\.[^/.]+$/, "")) ||
23
+ "";
24
+ const parentPath = (_c = file.parent) === null || _c === void 0 ? void 0 : _c.path;
25
+ if (!parentPath || parentPath === "/" || parentPath === "") {
26
+ return `[[${basename}]]`;
27
+ }
28
+ return `[[${parentPath}/${basename}|${basename}]]`;
29
+ });
30
+ // Set up link parser mocks
31
+ mockLinkParser.extractFilePathFromLink.mockImplementation((link) => {
32
+ if (!link || typeof link !== "string")
33
+ return null;
34
+ // Handle text that contains a link
35
+ const linkMatch = link.match(/\[\[([^\]]+)\]\]/);
36
+ if (linkMatch) {
37
+ const content = linkMatch[1];
38
+ // Remove display name if present
39
+ const filePart = content.split("|")[0].trim();
40
+ if (!filePart)
41
+ return null;
42
+ // Add .md extension if not present
43
+ return filePart.endsWith(".md") ? filePart : `${filePart}.md`;
44
+ }
45
+ return null;
46
+ });
47
+ }
48
+ // Reset all mocks
49
+ export function resetAllMocks() {
50
+ Object.values(mockFileOperations).forEach((mock) => {
51
+ mock.mockReset();
52
+ });
53
+ Object.values(mockLinkParser).forEach((mock) => {
54
+ mock.mockReset();
55
+ });
56
+ }
57
+ // Helper to setup mocks with specific implementations
58
+ export function setupMockImplementation(mockName, implementation) {
59
+ if (mockName in mockFileOperations) {
60
+ mockFileOperations[mockName].mockImplementation(implementation);
61
+ }
62
+ else if (mockName in mockLinkParser) {
63
+ mockLinkParser[mockName].mockImplementation(implementation);
64
+ }
65
+ }
66
+ // Helper to setup mock return values
67
+ export function setupMockReturnValue(mockName, value) {
68
+ if (mockName in mockFileOperations) {
69
+ mockFileOperations[mockName].mockReturnValue(value);
70
+ }
71
+ else if (mockName in mockLinkParser) {
72
+ mockLinkParser[mockName].mockReturnValue(value);
73
+ }
74
+ }
75
+ // Helper to verify mock calls
76
+ export function verifyMockCalls(mockName, expectedCalls) {
77
+ const mock = mockName in mockFileOperations
78
+ ? mockFileOperations[mockName]
79
+ : mockLinkParser[mockName];
80
+ expect(mock).toHaveBeenCalledTimes(expectedCalls.length);
81
+ expectedCalls.forEach((args, index) => {
82
+ expect(mock).toHaveBeenNthCalledWith(index + 1, ...args);
83
+ });
84
+ }
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9tb2Nrcy91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVwQyx3QkFBd0I7QUFDeEIsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDakMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDcEIsY0FBYyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDdkIsY0FBYyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Q0FDdkIsQ0FBQztBQUVGLG9CQUFvQjtBQUNwQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDN0IsdUJBQXVCLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtDQUNoQyxDQUFDO0FBRUYsOERBQThEO0FBQzlELE1BQU0sVUFBVSwrQkFBK0I7SUFDOUMsK0JBQStCO0lBQy9CLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQzVELEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQzNDLENBQUM7SUFFRixrQkFBa0IsQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQ2hELENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUNqRCxDQUFDO0lBRUYsa0JBQWtCLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7O1FBQzdELElBQUksQ0FBQyxJ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Q0FBQyxRQUFRLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUQsQ0FBQztBQUNGLENBQUM7QUFFRCw4QkFBOEI7QUFDOUIsTUFBTSxVQUFVLGVBQWUsQ0FDOUIsUUFBdUUsRUFDdkUsYUFBc0I7SUFFdEIsTUFBTSxJQUFJLEdBQ1QsUUFBUSxJQUFJLGtCQUFrQjtRQUM3QixDQUFDLENBQUUsa0JBQTBCLENBQUMsUUFBUSxDQUFDO1FBQ3ZDLENBQUMsQ0FBRSxjQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXRDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekQsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsdUJBQXVCLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzFELENBQUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4cGVjdCwgdmkgfSBmcm9tIFwidml0ZXN0XCI7XG5cbi8vIEZpbGUgb3BlcmF0aW9ucyBtb2Nrc1xuZXhwb3J0IGNvbnN0IG1vY2tGaWxlT3BlcmF0aW9ucyA9IHtcblx0YXJyYXlzRXF1YWw6IHZpLmZuKCksXG5cdG5vcm1hbGl6ZUFycmF5OiB2aS5mbigpLFxuXHRjcmVhdGVGaWxlTGluazogdmkuZm4oKSxcbn07XG5cbi8vIExpbmsgcGFyc2VyIG1vY2tzXG5leHBvcnQgY29uc3QgbW9ja0xpbmtQYXJzZXIgPSB7XG5cdGV4dHJhY3RGaWxlUGF0aEZyb21MaW5rOiB2aS5mbigpLFxufTtcblxuLy8gRGVmYXVsdCBtb2NrIGltcGxlbWVudGF0aW9ucyB0aGF0IG1hdGNoIHRoZSBhY3R1YWwgYmVoYXZpb3JcbmV4cG9ydCBmdW5jdGlvbiBzZXR1cERlZmF1bHRNb2NrSW1wbGVtZW50YXRpb25zKCkge1xuXHQvLyBTZXQgdXAgZmlsZSBvcGVyYXRpb25zIG1vY2tzXG5cdG1vY2tGaWxlT3BlcmF0aW9ucy5ub3JtYWxpemVBcnJheS5tb2NrSW1wbGVtZW50YXRpb24oKGFycikgPT5cblx0XHRBcnJheS5pc0FycmF5KGFycikgPyBhcnIgOiBhcnIgPyBbYXJyXSA6IFtdXG5cdCk7XG5cblx0bW9ja0ZpbGVPcGVyYXRpb25zLmFycmF5c0VxdWFsLm1vY2tJbXBsZW1lbnRhdGlvbihcblx0XHQoYSwgYikgPT4gSlNPTi5zdHJpbmdpZnkoYSkgPT09IEpTT04uc3RyaW5naWZ5KGIpXG5cdCk7XG5cblx0bW9ja0ZpbGVPcGVyYXRpb25zLmNyZWF0ZUZpbGVMaW5rLm1vY2tJbXBsZW1lbnRhdGlvbigoZmlsZSkgPT4ge1xuXHRcdGlmICghZmlsZSkgcmV0dXJuIFwiW1tVbmtub3duIEZpbGVdXVwiO1xuXG5cdFx0Y29uc3QgYmFzZW5hbWUgPVxuXHRcdFx0ZmlsZS5iYXNlbmFtZSB8fFxuXHRcdFx0ZmlsZS5wYXRoXG5cdFx0XHRcdD8uc3BsaXQoXCIvXCIpXG5cdFx0XHRcdC5wb3AoKVxuXHRcdFx0XHQ/LnJlcGxhY2UoL1xcLlteLy5dKyQvLCBcIlwiKSB8fFxuXHRcdFx0XCJcIjtcblx0XHRjb25zdCBwYXJlbnRQYXRoID0gZmlsZS5wYXJlbnQ/LnBhdGg7XG5cblx0XHRpZiAoIXBhcmVudFBhdGggfHwgcGFyZW50UGF0aCA9PT0gXCIvXCIgfHwgcGFyZW50UGF0aCA9PT0gXCJcIikge1xuXHRcdFx0cmV0dXJuIGBbWyR7YmFzZW5hbWV9XV1gO1xuXHRcdH1cblxuXHRcdHJldHVybiBgW1ske3BhcmVudFBhdGh9LyR7YmFzZW5hbWV9fCR7YmFzZW5hbWV9XV1gO1xuXHR9KTtcblxuXHQvLyBTZXQgdXAgbGluayBwYXJzZXIgbW9ja3Ncblx0bW9ja0xpbmtQYXJzZXIuZXh0cmFjdEZpbGVQYXRoRnJvbUxpbmsubW9ja0ltcGxlbWVudGF0aW9uKChsaW5rKSA9PiB7XG5cdFx0aWYgKCFsaW5rIHx8IHR5cGVvZiBsaW5rICE9PSBcInN0cmluZ1wiKSByZXR1cm4gbnVsbDtcblxuXHRcdC8vIEhhbmRsZSB0ZXh0IHRoYXQgY29udGFpbnMgYSBsaW5rXG5cdFx0Y29uc3QgbGlua01hdGNoID0gbGluay5tYXRjaCgvXFxbXFxbKFteXFxdXSspXFxdXFxdLyk7XG5cdFx0aWYgKGxpbmtNYXRjaCkge1xuXHRcdFx0Y29uc3QgY29udGVudCA9IGxpbmtNYXRjaFsxXTtcblx0XHRcdC8vIFJlbW92ZSBkaXNwbGF5IG5hbWUgaWYgcHJlc2VudFxuXHRcdFx0Y29uc3QgZmlsZVBhcnQgPSBjb250ZW50LnNwbGl0KFwifFwiKVswXS50cmltKCk7XG5cdFx0XHRpZiAoIWZpbGVQYXJ0KSByZXR1cm4gbnVsbDtcblxuXHRcdFx0Ly8gQWRkIC5tZCBleHRlbnNpb24gaWYgbm90IHByZXNlbnRcblx0XHRcdHJldHVybiBmaWxlUGFydC5lbmRzV2l0aChcIi5tZFwiKSA/IGZpbGVQYXJ0IDogYCR7ZmlsZVBhcnR9Lm1kYDtcblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fSk7XG59XG5cbi8vIFJlc2V0IGFsbCBtb2Nrc1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0QWxsTW9ja3MoKSB7XG5cdE9iamVjdC52YWx1ZXMobW9ja0ZpbGVPcGVyYXRpb25zKS5mb3JFYWNoKChtb2NrKSA9PiB7XG5cdFx0bW9jay5tb2NrUmVzZXQoKTtcblx0fSk7XG5cdE9iamVjdC52YWx1ZXMobW9ja0xpbmtQYXJzZXIpLmZvckVhY2goKG1vY2spID0+IHtcblx0XHRtb2NrLm1vY2tSZXNldCgpO1xuXHR9KTtcbn1cblxuLy8gSGVscGVyIHRvIHNldHVwIG1vY2tzIHdpdGggc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBNb2NrSW1wbGVtZW50YXRpb24oXG5cdG1vY2tOYW1lOiBrZXlvZiB0eXBlb2YgbW9ja0ZpbGVPcGVyYXRpb25zIHwga2V5b2YgdHlwZW9mIG1vY2tMaW5rUGFyc2VyLFxuXHRpbXBsZW1lbnRhdGlvbjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbikge1xuXHRpZiAobW9ja05hbWUgaW4gbW9ja0ZpbGVPcGVyYXRpb25zKSB7XG5cdFx0KG1vY2tGaWxlT3BlcmF0aW9ucyBhcyBhbnkpW21vY2tOYW1lXS5tb2NrSW1wbGVtZW50YXRpb24oaW1wbGVtZW50YXRpb24pO1xuXHR9IGVsc2UgaWYgKG1vY2tOYW1lIGluIG1vY2tMaW5rUGFyc2VyKSB7XG5cdFx0KG1vY2tMaW5rUGFyc2VyIGFzIGFueSlbbW9ja05hbWVdLm1vY2tJbXBsZW1lbnRhdGlvbihpbXBsZW1lbnRhdGlvbik7XG5cdH1cbn1cblxuLy8gSGVscGVyIHRvIHNldHVwIG1vY2sgcmV0dXJuIHZhbHVlc1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwTW9ja1JldHVyblZhbHVlKFxuXHRtb2NrTmFtZToga2V5b2YgdHlwZW9mIG1vY2tGaWxlT3BlcmF0aW9ucyB8IGtleW9mIHR5cGVvZiBtb2NrTGlua1BhcnNlcixcblx0dmFsdWU6IGFueVxuKSB7XG5cdGlmIChtb2NrTmFtZSBpbiBtb2NrRmlsZU9wZXJhdGlvbnMpIHtcblx0XHQobW9ja0ZpbGVPcGVyYXRpb25zIGFzIGFueSlbbW9ja05hbWVdLm1vY2tSZXR1cm5WYWx1ZSh2YWx1ZSk7XG5cdH0gZWxzZSBpZiAobW9ja05hbWUgaW4gbW9ja0xpbmtQYXJzZXIpIHtcblx0XHQobW9ja0xpbmtQYXJzZXIgYXMgYW55KVttb2NrTmFtZV0ubW9ja1JldHVyblZhbHVlKHZhbHVlKTtcblx0fVxufVxuXG4vLyBIZWxwZXIgdG8gdmVyaWZ5IG1vY2sgY2FsbHNcbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlNb2NrQ2FsbHMoXG5cdG1vY2tOYW1lOiBrZXlvZiB0eXBlb2YgbW9ja0ZpbGVPcGVyYXRpb25zIHwga2V5b2YgdHlwZW9mIG1vY2tMaW5rUGFyc2VyLFxuXHRleHBlY3RlZENhbGxzOiBhbnlbXVtdXG4pIHtcblx0Y29uc3QgbW9jayA9XG5cdFx0bW9ja05hbWUgaW4gbW9ja0ZpbGVPcGVyYXRpb25zXG5cdFx0XHQ/IChtb2NrRmlsZU9wZXJhdGlvbnMgYXMgYW55KVttb2NrTmFtZV1cblx0XHRcdDogKG1vY2tMaW5rUGFyc2VyIGFzIGFueSlbbW9ja05hbWVdO1xuXG5cdGV4cGVjdChtb2NrKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoZXhwZWN0ZWRDYWxscy5sZW5ndGgpO1xuXHRleHBlY3RlZENhbGxzLmZvckVhY2goKGFyZ3MsIGluZGV4KSA9PiB7XG5cdFx0ZXhwZWN0KG1vY2spLnRvSGF2ZUJlZW5OdGhDYWxsZWRXaXRoKGluZGV4ICsgMSwgLi4uYXJncyk7XG5cdH0pO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export declare function setupTestEnvironment(): () => void;
2
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/testing/setup.ts"],"names":[],"mappings":"AAIA,wBAAgB,oBAAoB,eAcnC"}
@@ -0,0 +1,18 @@
1
+ import { vi } from "vitest";
2
+ import { mockFileOperations, mockLinkParser } from "./mocks/utils";
3
+ // Global test setup that can be imported once per test file
4
+ export function setupTestEnvironment() {
5
+ // Mock the utils modules
6
+ vi.mock("@obsidian-plugins/utils/file-operations", () => mockFileOperations);
7
+ vi.mock("@obsidian-plugins/utils/link-parser", () => mockLinkParser);
8
+ // Mock any plugin-specific components
9
+ vi.mock("../src/components/settings-tab", () => ({
10
+ TreePropertiesManagerSettingTab: class MockSettingTab {
11
+ },
12
+ }));
13
+ // Return cleanup function
14
+ return () => {
15
+ vi.clearAllMocks();
16
+ };
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9zZXR1cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkUsNERBQTREO0FBQzVELE1BQU0sVUFBVSxvQkFBb0I7SUFDbkMseUJBQXlCO0lBQ3pCLEVBQUUsQ0FBQyxJQUFJLENBQUMseUNBQXlDLEVBQUUsR0FBRyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUM3RSxFQUFFLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxFQUFFLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRXJFLHNDQUFzQztJQUN0QyxFQUFFLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDaEQsK0JBQStCLEVBQUUsTUFBTSxjQUFjO1NBQUc7S0FDeEQsQ0FBQyxDQUFDLENBQUM7SUFFSiwwQkFBMEI7SUFDMUIsT0FBTyxHQUFHLEVBQUU7UUFDWCxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDcEIsQ0FBQyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHZpIH0gZnJvbSBcInZpdGVzdFwiO1xuaW1wb3J0IHsgbW9ja0ZpbGVPcGVyYXRpb25zLCBtb2NrTGlua1BhcnNlciB9IGZyb20gXCIuL21vY2tzL3V0aWxzXCI7XG5cbi8vIEdsb2JhbCB0ZXN0IHNldHVwIHRoYXQgY2FuIGJlIGltcG9ydGVkIG9uY2UgcGVyIHRlc3QgZmlsZVxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwVGVzdEVudmlyb25tZW50KCkge1xuXHQvLyBNb2NrIHRoZSB1dGlscyBtb2R1bGVzXG5cdHZpLm1vY2soXCJAb2JzaWRpYW4tcGx1Z2lucy91dGlscy9maWxlLW9wZXJhdGlvbnNcIiwgKCkgPT4gbW9ja0ZpbGVPcGVyYXRpb25zKTtcblx0dmkubW9jayhcIkBvYnNpZGlhbi1wbHVnaW5zL3V0aWxzL2xpbmstcGFyc2VyXCIsICgpID0+IG1vY2tMaW5rUGFyc2VyKTtcblxuXHQvLyBNb2NrIGFueSBwbHVnaW4tc3BlY2lmaWMgY29tcG9uZW50c1xuXHR2aS5tb2NrKFwiLi4vc3JjL2NvbXBvbmVudHMvc2V0dGluZ3MtdGFiXCIsICgpID0+ICh7XG5cdFx0VHJlZVByb3BlcnRpZXNNYW5hZ2VyU2V0dGluZ1RhYjogY2xhc3MgTW9ja1NldHRpbmdUYWIge30sXG5cdH0pKTtcblxuXHQvLyBSZXR1cm4gY2xlYW51cCBmdW5jdGlvblxuXHRyZXR1cm4gKCkgPT4ge1xuXHRcdHZpLmNsZWFyQWxsTW9ja3MoKTtcblx0fTtcbn1cbiJdfQ==
package/package.json ADDED
@@ -0,0 +1,112 @@
1
+ {
2
+ "name": "@real1ty-obsidian-plugins/utils",
3
+ "version": "1.0.0",
4
+ "description": "Shared utilities for Obsidian plugins",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./testing": {
14
+ "types": "./dist/testing/index.d.ts",
15
+ "import": "./dist/testing/index.js"
16
+ },
17
+ "./*": {
18
+ "types": "./dist/*.d.ts",
19
+ "import": "./dist/*.js"
20
+ }
21
+ },
22
+ "files": [
23
+ "dist/**/*",
24
+ "README.md",
25
+ "LICENSE"
26
+ ],
27
+ "keywords": [
28
+ "obsidian",
29
+ "utilities",
30
+ "plugins",
31
+ "typescript"
32
+ ],
33
+ "author": "Real1ty",
34
+ "license": "MIT",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/Real1tyy/Real1ty-Obsidian-Plugins",
38
+ "directory": "libs/utils"
39
+ },
40
+ "publishConfig": {
41
+ "access": "public",
42
+ "registry": "https://registry.npmjs.org/"
43
+ },
44
+ "devDependencies": {
45
+ "@types/luxon": "^3.7.1",
46
+ "typescript": "5.9.2",
47
+ "vitest": "^2.0.5"
48
+ },
49
+ "dependencies": {
50
+ "gray-matter": "^4.0.3",
51
+ "luxon": "^3.7.2",
52
+ "obsidian": "^1.8.7",
53
+ "rxjs": "^7.8.2",
54
+ "tslib": "2.8.1",
55
+ "zod": "^4.1.5"
56
+ },
57
+ "nx": {
58
+ "sourceRoot": "libs/utils/src",
59
+ "targets": {
60
+ "build": {
61
+ "executor": "nx:run-commands",
62
+ "options": {
63
+ "command": "pnpm build",
64
+ "cwd": "{projectRoot}"
65
+ }
66
+ },
67
+ "test": {
68
+ "executor": "nx:run-commands",
69
+ "options": {
70
+ "command": "pnpm test",
71
+ "cwd": "{projectRoot}"
72
+ }
73
+ },
74
+ "test:watch": {
75
+ "executor": "nx:run-commands",
76
+ "options": {
77
+ "command": "pnpm test:watch",
78
+ "cwd": "{projectRoot}"
79
+ }
80
+ },
81
+ "typecheck": {
82
+ "executor": "nx:run-commands",
83
+ "options": {
84
+ "command": "pnpm typecheck",
85
+ "cwd": "{projectRoot}"
86
+ }
87
+ },
88
+ "clean": {
89
+ "executor": "nx:run-commands",
90
+ "options": {
91
+ "command": "pnpm clean",
92
+ "cwd": "{projectRoot}"
93
+ }
94
+ }
95
+ },
96
+ "tags": [
97
+ "type:lib",
98
+ "scope:shared"
99
+ ]
100
+ },
101
+ "scripts": {
102
+ "build": "tsc",
103
+ "dev": "tsc --watch",
104
+ "test": "vitest run",
105
+ "test:watch": "vitest watch",
106
+ "typecheck": "tsc -noEmit",
107
+ "clean": "rm -rf dist",
108
+ "minor-release": "pnpm version minor && pnpm publish",
109
+ "major-release": "pnpm version major && pnpm publish",
110
+ "breaking-release": "pnpm version major && pnpm publish"
111
+ }
112
+ }