@real1ty-obsidian-plugins/utils 2.30.0 → 2.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/async/async.d.ts +69 -0
- package/dist/async/async.d.ts.map +1 -0
- package/dist/async/async.js +108 -0
- package/dist/async/async.js.map +1 -0
- package/dist/async/batch-operations.d.ts +21 -0
- package/dist/async/batch-operations.d.ts.map +1 -0
- package/dist/async/batch-operations.js +60 -0
- package/dist/async/batch-operations.js.map +1 -0
- package/dist/async/change-notifier.d.ts +13 -0
- package/dist/async/change-notifier.d.ts.map +1 -0
- package/dist/async/change-notifier.js +26 -0
- package/dist/async/change-notifier.js.map +1 -0
- package/dist/async/debounced-notifier.d.ts +26 -0
- package/dist/async/debounced-notifier.d.ts.map +1 -0
- package/dist/async/debounced-notifier.js +50 -0
- package/dist/async/debounced-notifier.js.map +1 -0
- package/dist/async/index.d.ts +5 -0
- package/dist/async/index.d.ts.map +1 -0
- package/dist/async/index.js +5 -0
- package/dist/async/index.js.map +1 -0
- package/dist/components/frontmatter-propagation-modal.d.ts +17 -0
- package/dist/components/frontmatter-propagation-modal.d.ts.map +1 -0
- package/dist/components/frontmatter-propagation-modal.js +85 -0
- package/dist/components/frontmatter-propagation-modal.js.map +1 -0
- package/dist/components/index.d.ts +5 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +5 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/input-managers/base.d.ts +30 -0
- package/dist/components/input-managers/base.d.ts.map +1 -0
- package/dist/components/input-managers/base.js +115 -0
- package/dist/components/input-managers/base.js.map +1 -0
- package/dist/components/input-managers/expression.d.ts +12 -0
- package/dist/components/input-managers/expression.d.ts.map +1 -0
- package/dist/components/input-managers/expression.js +56 -0
- package/dist/components/input-managers/expression.js.map +1 -0
- package/dist/components/input-managers/index.d.ts +4 -0
- package/dist/components/input-managers/index.d.ts.map +1 -0
- package/dist/components/input-managers/index.js +4 -0
- package/dist/components/input-managers/index.js.map +1 -0
- package/dist/components/input-managers/search.d.ts +6 -0
- package/dist/components/input-managers/search.d.ts.map +1 -0
- package/dist/components/input-managers/search.js +16 -0
- package/dist/components/input-managers/search.js.map +1 -0
- package/dist/components/registered-events-component.d.ts +30 -0
- package/dist/components/registered-events-component.d.ts.map +1 -0
- package/dist/components/registered-events-component.js +43 -0
- package/dist/components/registered-events-component.js.map +1 -0
- package/dist/components/whats-new-modal.d.ts +315 -0
- package/dist/components/whats-new-modal.d.ts.map +1 -0
- package/dist/components/whats-new-modal.js +426 -0
- package/dist/components/whats-new-modal.js.map +1 -0
- package/dist/core/color-utils.d.ts +17 -0
- package/dist/core/color-utils.d.ts.map +1 -0
- package/dist/core/color-utils.js +29 -0
- package/dist/core/color-utils.js.map +1 -0
- package/dist/core/css-utils.d.ts +39 -0
- package/dist/core/css-utils.d.ts.map +1 -0
- package/dist/core/css-utils.js +60 -0
- package/dist/core/css-utils.js.map +1 -0
- package/dist/core/evaluator/base.d.ts +22 -0
- package/dist/core/evaluator/base.d.ts.map +1 -0
- package/dist/core/evaluator/base.js +67 -0
- package/dist/core/evaluator/base.js.map +1 -0
- package/dist/core/evaluator/color.d.ts +19 -0
- package/dist/core/evaluator/color.d.ts.map +1 -0
- package/dist/core/evaluator/color.js +25 -0
- package/dist/core/evaluator/color.js.map +1 -0
- package/dist/core/evaluator/excluded.d.ts +32 -0
- package/dist/core/evaluator/excluded.d.ts.map +1 -0
- package/dist/core/evaluator/excluded.js +41 -0
- package/dist/core/evaluator/excluded.js.map +1 -0
- package/dist/core/evaluator/filter.d.ts +15 -0
- package/dist/core/evaluator/filter.d.ts.map +1 -0
- package/dist/core/evaluator/filter.js +27 -0
- package/dist/core/evaluator/filter.js.map +1 -0
- package/dist/core/evaluator/included.d.ts +36 -0
- package/dist/core/evaluator/included.d.ts.map +1 -0
- package/dist/core/evaluator/included.js +51 -0
- package/dist/core/evaluator/included.js.map +1 -0
- package/dist/core/evaluator/index.d.ts +6 -0
- package/dist/core/evaluator/index.d.ts.map +1 -0
- package/dist/core/evaluator/index.js +6 -0
- package/dist/core/evaluator/index.js.map +1 -0
- package/dist/core/expression-utils.d.ts +17 -0
- package/dist/core/expression-utils.d.ts.map +1 -0
- package/dist/core/expression-utils.js +40 -0
- package/dist/core/expression-utils.js.map +1 -0
- package/dist/core/frontmatter-value.d.ts +157 -0
- package/dist/core/frontmatter-value.d.ts.map +1 -0
- package/dist/core/frontmatter-value.js +417 -0
- package/dist/core/frontmatter-value.js.map +1 -0
- package/dist/core/generate.d.ts +7 -0
- package/dist/core/generate.d.ts.map +1 -0
- package/dist/core/generate.js +13 -0
- package/dist/core/generate.js.map +1 -0
- package/dist/core/history.d.ts +12 -0
- package/dist/core/history.d.ts.map +1 -0
- package/dist/core/history.js +39 -0
- package/dist/core/history.js.map +1 -0
- package/dist/core/index.d.ts +11 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +11 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/indexer.d.ts +109 -0
- package/dist/core/indexer.d.ts.map +1 -0
- package/dist/core/indexer.js +185 -0
- package/dist/core/indexer.js.map +1 -0
- package/dist/core/property-renderer.d.ts +9 -0
- package/dist/core/property-renderer.d.ts.map +1 -0
- package/dist/core/property-renderer.js +42 -0
- package/dist/core/property-renderer.js.map +1 -0
- package/dist/core/validation.d.ts +13 -0
- package/dist/core/validation.d.ts.map +1 -0
- package/dist/core/validation.js +27 -0
- package/dist/core/validation.js.map +1 -0
- package/dist/date/date-recurrence.d.ts +30 -0
- package/dist/date/date-recurrence.d.ts.map +1 -0
- package/dist/date/date-recurrence.js +188 -0
- package/dist/date/date-recurrence.js.map +1 -0
- package/dist/date/date.d.ts +21 -0
- package/dist/date/date.d.ts.map +1 -0
- package/dist/date/date.js +105 -0
- package/dist/date/date.js.map +1 -0
- package/dist/date/index.d.ts +3 -0
- package/dist/date/index.d.ts.map +1 -0
- package/dist/date/index.js +3 -0
- package/dist/date/index.js.map +1 -0
- package/dist/file/child-reference.d.ts +9 -0
- package/dist/file/child-reference.d.ts.map +1 -0
- package/dist/file/child-reference.js +57 -0
- package/dist/file/child-reference.js.map +1 -0
- package/dist/file/file-operations.d.ts +31 -0
- package/dist/file/file-operations.d.ts.map +1 -0
- package/dist/file/file-operations.js +160 -0
- package/dist/file/file-operations.js.map +1 -0
- package/dist/file/file-utils.d.ts +33 -0
- package/dist/file/file-utils.d.ts.map +1 -0
- package/dist/file/file-utils.js +76 -0
- package/dist/file/file-utils.js.map +1 -0
- package/dist/file/file.d.ts +332 -0
- package/dist/file/file.d.ts.map +1 -0
- package/dist/file/file.js +559 -0
- package/dist/file/file.js.map +1 -0
- package/dist/file/frontmatter-diff.d.ts +38 -0
- package/dist/file/frontmatter-diff.d.ts.map +1 -0
- package/dist/file/frontmatter-diff.js +162 -0
- package/dist/file/frontmatter-diff.js.map +1 -0
- package/dist/file/frontmatter-propagation.d.ts +4 -0
- package/dist/file/frontmatter-propagation.d.ts.map +1 -0
- package/dist/file/frontmatter-propagation.js +28 -0
- package/dist/file/frontmatter-propagation.js.map +1 -0
- package/dist/file/frontmatter-serialization.d.ts +21 -0
- package/dist/file/frontmatter-serialization.d.ts.map +1 -0
- package/dist/file/frontmatter-serialization.js +57 -0
- package/dist/file/frontmatter-serialization.js.map +1 -0
- package/dist/file/frontmatter.d.ts +15 -0
- package/dist/file/frontmatter.d.ts.map +1 -0
- package/dist/file/frontmatter.js +68 -0
- package/dist/file/frontmatter.js.map +1 -0
- package/dist/file/index.d.ts +13 -0
- package/dist/file/index.d.ts.map +1 -0
- package/dist/file/index.js +13 -0
- package/dist/file/index.js.map +1 -0
- package/dist/file/link-parser.d.ts +63 -0
- package/dist/file/link-parser.d.ts.map +1 -0
- package/dist/file/link-parser.js +137 -0
- package/dist/file/link-parser.js.map +1 -0
- package/dist/file/property-utils.d.ts +55 -0
- package/dist/file/property-utils.d.ts.map +1 -0
- package/dist/file/property-utils.js +90 -0
- package/dist/file/property-utils.js.map +1 -0
- package/dist/file/templater-service.d.ts +16 -0
- package/dist/file/templater-service.d.ts.map +1 -0
- package/dist/file/templater-service.js +37 -0
- package/dist/file/templater-service.js.map +1 -0
- package/dist/file/templater.d.ts +28 -0
- package/dist/file/templater.d.ts.map +1 -0
- package/dist/file/templater.js +126 -0
- package/dist/file/templater.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/inputs/index.d.ts +2 -0
- package/dist/inputs/index.d.ts.map +1 -0
- package/dist/inputs/index.js +2 -0
- package/dist/inputs/index.js.map +1 -0
- package/dist/inputs/input-filter-manager.d.ts +72 -0
- package/dist/inputs/input-filter-manager.d.ts.map +1 -0
- package/dist/inputs/input-filter-manager.js +140 -0
- package/dist/inputs/input-filter-manager.js.map +1 -0
- package/dist/settings/index.d.ts +3 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +3 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/settings-store.d.ts +20 -0
- package/dist/settings/settings-store.d.ts.map +1 -0
- package/dist/settings/settings-store.js +82 -0
- package/dist/settings/settings-store.js.map +1 -0
- package/dist/settings/settings-ui-builder.d.ts +74 -0
- package/dist/settings/settings-ui-builder.d.ts.map +1 -0
- package/dist/settings/settings-ui-builder.js +436 -0
- package/dist/settings/settings-ui-builder.js.map +1 -0
- package/dist/string/changelog-parser.d.ts +17 -0
- package/dist/string/changelog-parser.d.ts.map +1 -0
- package/dist/string/changelog-parser.js +77 -0
- package/dist/string/changelog-parser.js.map +1 -0
- package/dist/string/filename-utils.d.ts +46 -0
- package/dist/string/filename-utils.d.ts.map +1 -0
- package/dist/string/filename-utils.js +65 -0
- package/dist/string/filename-utils.js.map +1 -0
- package/dist/string/index.d.ts +4 -0
- package/dist/string/index.d.ts.map +1 -0
- package/dist/string/index.js +4 -0
- package/dist/string/index.js.map +1 -0
- package/dist/string/string.d.ts +5 -0
- package/dist/string/string.d.ts.map +1 -0
- package/dist/string/string.js +25 -0
- package/dist/string/string.js.map +1 -0
- package/dist/testing/index.d.ts +5 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +6 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mocks/obsidian.d.ts +150 -0
- package/dist/testing/mocks/obsidian.d.ts.map +1 -0
- package/dist/testing/mocks/obsidian.js +226 -0
- package/dist/testing/mocks/obsidian.js.map +1 -0
- package/dist/testing/mocks/utils.d.ts +14 -0
- package/dist/testing/mocks/utils.d.ts.map +1 -0
- package/dist/testing/mocks/utils.js +85 -0
- package/dist/testing/mocks/utils.js.map +1 -0
- package/dist/testing/setup.d.ts +2 -0
- package/dist/testing/setup.d.ts.map +1 -0
- package/dist/testing/setup.js +18 -0
- package/dist/testing/setup.js.map +1 -0
- package/package.json +1 -1
- package/src/components/whats-new-modal.ts +306 -2
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalizes a directory path for consistent comparison.
|
|
3
|
+
*
|
|
4
|
+
* - Trims whitespace
|
|
5
|
+
* - Removes leading and trailing slashes
|
|
6
|
+
* - Converts empty/whitespace-only strings to empty string
|
|
7
|
+
*
|
|
8
|
+
* Examples:
|
|
9
|
+
* - "tasks/" → "tasks"
|
|
10
|
+
* - "/tasks" → "tasks"
|
|
11
|
+
* - "/tasks/" → "tasks"
|
|
12
|
+
* - " tasks " → "tasks"
|
|
13
|
+
* - "" → ""
|
|
14
|
+
* - " " → ""
|
|
15
|
+
* - "tasks/homework" → "tasks/homework"
|
|
16
|
+
*/
|
|
17
|
+
export declare const normalizeDirectoryPath: (directory: string) => string;
|
|
18
|
+
/**
|
|
19
|
+
* Extracts the date and suffix (everything after the date) from a physical instance filename.
|
|
20
|
+
* Physical instance format: "[title] [date]-[ZETTELID]"
|
|
21
|
+
*
|
|
22
|
+
* @param basename - The filename without extension
|
|
23
|
+
* @returns Object with dateStr and suffix, or null if no date found
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* extractDateAndSuffix("My Event 2025-01-15-ABC123") // { dateStr: "2025-01-15", suffix: "-ABC123" }
|
|
27
|
+
* extractDateAndSuffix("Invalid filename") // null
|
|
28
|
+
*/
|
|
29
|
+
export declare const extractDateAndSuffix: (basename: string) => {
|
|
30
|
+
dateStr: string;
|
|
31
|
+
suffix: string;
|
|
32
|
+
} | null;
|
|
33
|
+
/**
|
|
34
|
+
* Rebuilds a physical instance filename with a new title while preserving the date and zettel ID.
|
|
35
|
+
* Physical instance format: "[title] [date]-[ZETTELID]"
|
|
36
|
+
*
|
|
37
|
+
* @param currentBasename - Current filename without extension
|
|
38
|
+
* @param newTitle - New title (with or without zettel ID - will be stripped)
|
|
39
|
+
* @returns New filename, or null if current filename format is invalid
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* rebuildPhysicalInstanceFilename("Old Title 2025-01-15-ABC123", "New Title-XYZ789")
|
|
43
|
+
* // Returns: "New Title 2025-01-15-ABC123"
|
|
44
|
+
*/
|
|
45
|
+
export declare const rebuildPhysicalInstanceFilename: (currentBasename: string, newTitle: string) => string | null;
|
|
46
|
+
//# sourceMappingURL=filename-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filename-utils.d.ts","sourceRoot":"","sources":["../../src/string/filename-utils.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,sBAAsB,GAAI,WAAW,MAAM,KAAG,MAE1D,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,oBAAoB,GAChC,UAAU,MAAM,KACd;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAWxC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,+BAA+B,GAC3C,iBAAiB,MAAM,EACvB,UAAU,MAAM,KACd,MAAM,GAAG,IAaX,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { sanitizeFilenamePreserveSpaces } from "../file/file";
|
|
2
|
+
/**
|
|
3
|
+
* Normalizes a directory path for consistent comparison.
|
|
4
|
+
*
|
|
5
|
+
* - Trims whitespace
|
|
6
|
+
* - Removes leading and trailing slashes
|
|
7
|
+
* - Converts empty/whitespace-only strings to empty string
|
|
8
|
+
*
|
|
9
|
+
* Examples:
|
|
10
|
+
* - "tasks/" → "tasks"
|
|
11
|
+
* - "/tasks" → "tasks"
|
|
12
|
+
* - "/tasks/" → "tasks"
|
|
13
|
+
* - " tasks " → "tasks"
|
|
14
|
+
* - "" → ""
|
|
15
|
+
* - " " → ""
|
|
16
|
+
* - "tasks/homework" → "tasks/homework"
|
|
17
|
+
*/
|
|
18
|
+
export const normalizeDirectoryPath = (directory) => {
|
|
19
|
+
return directory.trim().replace(/^\/+|\/+$/g, "");
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Extracts the date and suffix (everything after the date) from a physical instance filename.
|
|
23
|
+
* Physical instance format: "[title] [date]-[ZETTELID]"
|
|
24
|
+
*
|
|
25
|
+
* @param basename - The filename without extension
|
|
26
|
+
* @returns Object with dateStr and suffix, or null if no date found
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* extractDateAndSuffix("My Event 2025-01-15-ABC123") // { dateStr: "2025-01-15", suffix: "-ABC123" }
|
|
30
|
+
* extractDateAndSuffix("Invalid filename") // null
|
|
31
|
+
*/
|
|
32
|
+
export const extractDateAndSuffix = (basename) => {
|
|
33
|
+
const dateMatch = basename.match(/(\d{4}-\d{2}-\d{2})/);
|
|
34
|
+
if (!dateMatch) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const dateStr = dateMatch[1];
|
|
38
|
+
const dateIndex = basename.indexOf(dateStr);
|
|
39
|
+
const suffix = basename.substring(dateIndex + dateStr.length);
|
|
40
|
+
return { dateStr, suffix };
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Rebuilds a physical instance filename with a new title while preserving the date and zettel ID.
|
|
44
|
+
* Physical instance format: "[title] [date]-[ZETTELID]"
|
|
45
|
+
*
|
|
46
|
+
* @param currentBasename - Current filename without extension
|
|
47
|
+
* @param newTitle - New title (with or without zettel ID - will be stripped)
|
|
48
|
+
* @returns New filename, or null if current filename format is invalid
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* rebuildPhysicalInstanceFilename("Old Title 2025-01-15-ABC123", "New Title-XYZ789")
|
|
52
|
+
* // Returns: "New Title 2025-01-15-ABC123"
|
|
53
|
+
*/
|
|
54
|
+
export const rebuildPhysicalInstanceFilename = (currentBasename, newTitle) => {
|
|
55
|
+
const dateAndSuffix = extractDateAndSuffix(currentBasename);
|
|
56
|
+
if (!dateAndSuffix) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
const { dateStr, suffix } = dateAndSuffix;
|
|
60
|
+
// Remove any zettel ID from the new title (just in case)
|
|
61
|
+
const newTitleClean = newTitle.replace(/-[A-Z0-9]{6}$/, "");
|
|
62
|
+
const newTitleSanitized = sanitizeFilenamePreserveSpaces(newTitleClean);
|
|
63
|
+
return `${newTitleSanitized} ${dateStr}${suffix}`;
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=filename-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filename-utils.js","sourceRoot":"","sources":["../../src/string/filename-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AAE9D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,SAAiB,EAAU,EAAE;IACnE,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CACnC,QAAgB,EAC6B,EAAE;IAC/C,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACxD,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAC9C,eAAuB,EACvB,QAAgB,EACA,EAAE;IAClB,MAAM,aAAa,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAC;IAC5D,IAAI,CAAC,aAAa,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC;IAE1C,yDAAyD;IACzD,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAC5D,MAAM,iBAAiB,GAAG,8BAA8B,CAAC,aAAa,CAAC,CAAC;IAExE,OAAO,GAAG,iBAAiB,IAAI,OAAO,GAAG,MAAM,EAAE,CAAC;AACnD,CAAC,CAAC","sourcesContent":["import { sanitizeFilenamePreserveSpaces } from \"../file/file\";\n\n/**\n * Normalizes a directory path for consistent comparison.\n *\n * - Trims whitespace\n * - Removes leading and trailing slashes\n * - Converts empty/whitespace-only strings to empty string\n *\n * Examples:\n * - \"tasks/\" → \"tasks\"\n * - \"/tasks\" → \"tasks\"\n * - \"/tasks/\" → \"tasks\"\n * - \" tasks \" → \"tasks\"\n * - \"\" → \"\"\n * - \" \" → \"\"\n * - \"tasks/homework\" → \"tasks/homework\"\n */\nexport const normalizeDirectoryPath = (directory: string): string => {\n\treturn directory.trim().replace(/^\\/+|\\/+$/g, \"\");\n};\n\n/**\n * Extracts the date and suffix (everything after the date) from a physical instance filename.\n * Physical instance format: \"[title] [date]-[ZETTELID]\"\n *\n * @param basename - The filename without extension\n * @returns Object with dateStr and suffix, or null if no date found\n *\n * @example\n * extractDateAndSuffix(\"My Event 2025-01-15-ABC123\") // { dateStr: \"2025-01-15\", suffix: \"-ABC123\" }\n * extractDateAndSuffix(\"Invalid filename\") // null\n */\nexport const extractDateAndSuffix = (\n\tbasename: string\n): { dateStr: string; suffix: string } | null => {\n\tconst dateMatch = basename.match(/(\\d{4}-\\d{2}-\\d{2})/);\n\tif (!dateMatch) {\n\t\treturn null;\n\t}\n\n\tconst dateStr = dateMatch[1];\n\tconst dateIndex = basename.indexOf(dateStr);\n\tconst suffix = basename.substring(dateIndex + dateStr.length);\n\n\treturn { dateStr, suffix };\n};\n\n/**\n * Rebuilds a physical instance filename with a new title while preserving the date and zettel ID.\n * Physical instance format: \"[title] [date]-[ZETTELID]\"\n *\n * @param currentBasename - Current filename without extension\n * @param newTitle - New title (with or without zettel ID - will be stripped)\n * @returns New filename, or null if current filename format is invalid\n *\n * @example\n * rebuildPhysicalInstanceFilename(\"Old Title 2025-01-15-ABC123\", \"New Title-XYZ789\")\n * // Returns: \"New Title 2025-01-15-ABC123\"\n */\nexport const rebuildPhysicalInstanceFilename = (\n\tcurrentBasename: string,\n\tnewTitle: string\n): string | null => {\n\tconst dateAndSuffix = extractDateAndSuffix(currentBasename);\n\tif (!dateAndSuffix) {\n\t\treturn null;\n\t}\n\n\tconst { dateStr, suffix } = dateAndSuffix;\n\n\t// Remove any zettel ID from the new title (just in case)\n\tconst newTitleClean = newTitle.replace(/-[A-Z0-9]{6}$/, \"\");\n\tconst newTitleSanitized = sanitizeFilenamePreserveSpaces(newTitleClean);\n\n\treturn `${newTitleSanitized} ${dateStr}${suffix}`;\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/string/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/string/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC","sourcesContent":["export * from \"./changelog-parser\";\nexport * from \"./filename-utils\";\nexport * from \"./string\";\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const capitalize: (str: string) => string;
|
|
2
|
+
export declare const generateDuplicatedTitle: (originalTitle: string) => string;
|
|
3
|
+
export declare const pluralize: (count: number) => string;
|
|
4
|
+
export declare const getWeekDirection: (weeks: number) => "next" | "previous";
|
|
5
|
+
//# sourceMappingURL=string.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/string/string.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG,MAGxC,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,eAAe,MAAM,KAAG,MAY/D,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,KAAG,MAEzC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,KAAG,MAAM,GAAG,UAEzD,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export const capitalize = (str) => {
|
|
2
|
+
if (!str)
|
|
3
|
+
return str;
|
|
4
|
+
return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
|
|
5
|
+
};
|
|
6
|
+
export const generateDuplicatedTitle = (originalTitle) => {
|
|
7
|
+
// Check if title already has a counter pattern like " (2)", " - Copy", etc.
|
|
8
|
+
const counterMatch = originalTitle.match(/^(.*?)(?:\s*\((\d+)\)|\s*-?\s*Copy(?:\s*(\d+))?)$/);
|
|
9
|
+
if (counterMatch) {
|
|
10
|
+
const baseName = counterMatch[1];
|
|
11
|
+
const existingCounter = counterMatch[2] || counterMatch[3];
|
|
12
|
+
const nextCounter = existingCounter ? parseInt(existingCounter, 10) + 1 : 2;
|
|
13
|
+
return `${baseName} (${nextCounter})`;
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
return `${originalTitle} (2)`;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
export const pluralize = (count) => {
|
|
20
|
+
return count === 1 ? "" : "s";
|
|
21
|
+
};
|
|
22
|
+
export const getWeekDirection = (weeks) => {
|
|
23
|
+
return weeks > 0 ? "next" : "previous";
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=string.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/string/string.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAU,EAAE;IACjD,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IACrB,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AACjE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,aAAqB,EAAU,EAAE;IACxE,4EAA4E;IAC5E,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAE9F,IAAI,YAAY,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,eAAe,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,OAAO,GAAG,QAAQ,KAAK,WAAW,GAAG,CAAC;IACvC,CAAC;SAAM,CAAC;QACP,OAAO,GAAG,aAAa,MAAM,CAAC;IAC/B,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAU,EAAE;IAClD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAuB,EAAE;IACtE,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;AACxC,CAAC,CAAC","sourcesContent":["export const capitalize = (str: string): string => {\n\tif (!str) return str;\n\treturn str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n};\n\nexport const generateDuplicatedTitle = (originalTitle: string): string => {\n\t// Check if title already has a counter pattern like \" (2)\", \" - Copy\", etc.\n\tconst counterMatch = originalTitle.match(/^(.*?)(?:\\s*\\((\\d+)\\)|\\s*-?\\s*Copy(?:\\s*(\\d+))?)$/);\n\n\tif (counterMatch) {\n\t\tconst baseName = counterMatch[1];\n\t\tconst existingCounter = counterMatch[2] || counterMatch[3];\n\t\tconst nextCounter = existingCounter ? parseInt(existingCounter, 10) + 1 : 2;\n\t\treturn `${baseName} (${nextCounter})`;\n\t} else {\n\t\treturn `${originalTitle} (2)`;\n\t}\n};\n\nexport const pluralize = (count: number): string => {\n\treturn count === 1 ? \"\" : \"s\";\n};\n\nexport const getWeekDirection = (weeks: number): \"next\" | \"previous\" => {\n\treturn weeks > 0 ? \"next\" : \"previous\";\n};\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from "./mocks/obsidian";
|
|
2
|
+
export { createMockApp, createMockFile, createMockFileCache, Modal, Notice, Plugin, PluginSettingTab, Setting, TFile, } from "./mocks/obsidian";
|
|
3
|
+
export * from "./mocks/utils";
|
|
4
|
+
export { mockFileOperations, mockLinkParser, resetAllMocks, setupDefaultMockImplementations, setupMockImplementation, setupMockReturnValue, verifyMockCalls, } from "./mocks/utils";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AAEjC,OAAO,EACN,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,KAAK,EACL,MAAM,EACN,MAAM,EACN,gBAAgB,EAChB,OAAO,EACP,KAAK,GACL,MAAM,kBAAkB,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,OAAO,EACN,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,+BAA+B,EAC/B,uBAAuB,EACvB,oBAAoB,EACpB,eAAe,GACf,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from "./mocks/obsidian";
|
|
2
|
+
// Re-export commonly used combinations
|
|
3
|
+
export { createMockApp, createMockFile, createMockFileCache, Modal, Notice, Plugin, PluginSettingTab, Setting, TFile, } from "./mocks/obsidian";
|
|
4
|
+
export * from "./mocks/utils";
|
|
5
|
+
export { mockFileOperations, mockLinkParser, resetAllMocks, setupDefaultMockImplementations, setupMockImplementation, setupMockReturnValue, verifyMockCalls, } from "./mocks/utils";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,uCAAuC;AACvC,OAAO,EACN,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,KAAK,EACL,MAAM,EACN,MAAM,EACN,gBAAgB,EAChB,OAAO,EACP,KAAK,GACL,MAAM,kBAAkB,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,OAAO,EACN,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,+BAA+B,EAC/B,uBAAuB,EACvB,oBAAoB,EACpB,eAAe,GACf,MAAM,eAAe,CAAC","sourcesContent":["export * from \"./mocks/obsidian\";\n// Re-export commonly used combinations\nexport {\n\tcreateMockApp,\n\tcreateMockFile,\n\tcreateMockFileCache,\n\tModal,\n\tNotice,\n\tPlugin,\n\tPluginSettingTab,\n\tSetting,\n\tTFile,\n} from \"./mocks/obsidian\";\nexport * from \"./mocks/utils\";\nexport {\n\tmockFileOperations,\n\tmockLinkParser,\n\tresetAllMocks,\n\tsetupDefaultMockImplementations,\n\tsetupMockImplementation,\n\tsetupMockReturnValue,\n\tverifyMockCalls,\n} from \"./mocks/utils\";\n"]}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { vi } from "vitest";
|
|
2
|
+
export declare class Plugin {
|
|
3
|
+
app: any;
|
|
4
|
+
manifest: any;
|
|
5
|
+
settings: any;
|
|
6
|
+
constructor(app: any, manifest: any);
|
|
7
|
+
addSettingTab: import("vitest").Mock<(...args: any[]) => any>;
|
|
8
|
+
registerEvent: import("vitest").Mock<(...args: any[]) => any>;
|
|
9
|
+
loadData: import("vitest").Mock<(...args: any[]) => any>;
|
|
10
|
+
saveData: import("vitest").Mock<(...args: any[]) => any>;
|
|
11
|
+
onload: import("vitest").Mock<(...args: any[]) => any>;
|
|
12
|
+
onunload: import("vitest").Mock<(...args: any[]) => any>;
|
|
13
|
+
addRibbonIcon: import("vitest").Mock<(...args: any[]) => any>;
|
|
14
|
+
addStatusBarItem: import("vitest").Mock<(...args: any[]) => any>;
|
|
15
|
+
addCommand: import("vitest").Mock<(...args: any[]) => any>;
|
|
16
|
+
removeCommand: import("vitest").Mock<(...args: any[]) => any>;
|
|
17
|
+
registerDomEvent: import("vitest").Mock<(...args: any[]) => any>;
|
|
18
|
+
registerCodeMirror: import("vitest").Mock<(...args: any[]) => any>;
|
|
19
|
+
registerEditorExtension: import("vitest").Mock<(...args: any[]) => any>;
|
|
20
|
+
registerMarkdownPostProcessor: import("vitest").Mock<(...args: any[]) => any>;
|
|
21
|
+
registerMarkdownCodeBlockProcessor: import("vitest").Mock<(...args: any[]) => any>;
|
|
22
|
+
registerObsidianProtocolHandler: import("vitest").Mock<(...args: any[]) => any>;
|
|
23
|
+
registerEditorSuggest: import("vitest").Mock<(...args: any[]) => any>;
|
|
24
|
+
registerHoverLinkSource: import("vitest").Mock<(...args: any[]) => any>;
|
|
25
|
+
registerInterval: import("vitest").Mock<(...args: any[]) => any>;
|
|
26
|
+
registerView: import("vitest").Mock<(...args: any[]) => any>;
|
|
27
|
+
registerExtensions: import("vitest").Mock<(...args: any[]) => any>;
|
|
28
|
+
onUserEnable: import("vitest").Mock<(...args: any[]) => any>;
|
|
29
|
+
load: import("vitest").Mock<(...args: any[]) => any>;
|
|
30
|
+
unload: import("vitest").Mock<(...args: any[]) => any>;
|
|
31
|
+
addChild: import("vitest").Mock<(...args: any[]) => any>;
|
|
32
|
+
removeChild: import("vitest").Mock<(...args: any[]) => any>;
|
|
33
|
+
register: import("vitest").Mock<(...args: any[]) => any>;
|
|
34
|
+
}
|
|
35
|
+
export declare class PluginSettingTab {
|
|
36
|
+
app: any;
|
|
37
|
+
plugin: any;
|
|
38
|
+
containerEl: HTMLElement;
|
|
39
|
+
constructor(app: any, plugin: any);
|
|
40
|
+
display: import("vitest").Mock<(...args: any[]) => any>;
|
|
41
|
+
}
|
|
42
|
+
export declare class ItemView {
|
|
43
|
+
app: any;
|
|
44
|
+
leaf: any;
|
|
45
|
+
containerEl: HTMLElement;
|
|
46
|
+
constructor(leaf: any);
|
|
47
|
+
getViewType(): string;
|
|
48
|
+
getDisplayText(): string;
|
|
49
|
+
getIcon(): string;
|
|
50
|
+
getState: import("vitest").Mock<(...args: any[]) => any>;
|
|
51
|
+
setState: import("vitest").Mock<(...args: any[]) => any>;
|
|
52
|
+
}
|
|
53
|
+
export declare class Setting {
|
|
54
|
+
settingEl: HTMLElement;
|
|
55
|
+
nameEl: HTMLElement;
|
|
56
|
+
descEl: HTMLElement;
|
|
57
|
+
controlEl: HTMLElement;
|
|
58
|
+
constructor(_containerEl: HTMLElement);
|
|
59
|
+
setName: import("vitest").Mock<(...args: any[]) => any>;
|
|
60
|
+
setDesc: import("vitest").Mock<(...args: any[]) => any>;
|
|
61
|
+
addText: import("vitest").Mock<(...args: any[]) => any>;
|
|
62
|
+
addTextArea: import("vitest").Mock<(...args: any[]) => any>;
|
|
63
|
+
}
|
|
64
|
+
export declare class TFolder {
|
|
65
|
+
path: string;
|
|
66
|
+
name: string;
|
|
67
|
+
children: any[];
|
|
68
|
+
vault: any;
|
|
69
|
+
parent: TFolder | null;
|
|
70
|
+
constructor(path: string);
|
|
71
|
+
isRoot(): boolean;
|
|
72
|
+
}
|
|
73
|
+
export declare class TFile {
|
|
74
|
+
path: string;
|
|
75
|
+
name: string;
|
|
76
|
+
basename: string;
|
|
77
|
+
extension: string;
|
|
78
|
+
stat: any;
|
|
79
|
+
vault: any;
|
|
80
|
+
parent: TFolder | null;
|
|
81
|
+
constructor(path: string, parentPath?: string);
|
|
82
|
+
}
|
|
83
|
+
export declare class Modal {
|
|
84
|
+
app: any;
|
|
85
|
+
containerEl: HTMLElement;
|
|
86
|
+
titleEl: HTMLElement;
|
|
87
|
+
contentEl: HTMLElement;
|
|
88
|
+
constructor(app: any);
|
|
89
|
+
open: import("vitest").Mock<(...args: any[]) => any>;
|
|
90
|
+
close: import("vitest").Mock<(...args: any[]) => any>;
|
|
91
|
+
onOpen: import("vitest").Mock<(...args: any[]) => any>;
|
|
92
|
+
onClose: import("vitest").Mock<(...args: any[]) => any>;
|
|
93
|
+
}
|
|
94
|
+
export declare class Notice {
|
|
95
|
+
constructor(message: string);
|
|
96
|
+
}
|
|
97
|
+
export declare const MarkdownRenderer: {
|
|
98
|
+
render: import("vitest").Mock<(...args: any[]) => any>;
|
|
99
|
+
};
|
|
100
|
+
export declare function debounce<T extends (...args: any[]) => any>(func: T, wait: number, immediate?: boolean): T;
|
|
101
|
+
export declare function normalizePath(path: string): string;
|
|
102
|
+
export declare const App: import("vitest").Mock<(...args: any[]) => any>;
|
|
103
|
+
export interface MockApp {
|
|
104
|
+
fileManager: {
|
|
105
|
+
processFrontMatter: ReturnType<typeof vi.fn>;
|
|
106
|
+
};
|
|
107
|
+
metadataCache: {
|
|
108
|
+
getFileCache: ReturnType<typeof vi.fn>;
|
|
109
|
+
};
|
|
110
|
+
vault: {
|
|
111
|
+
getAbstractFileByPath: ReturnType<typeof vi.fn>;
|
|
112
|
+
on: ReturnType<typeof vi.fn>;
|
|
113
|
+
read: ReturnType<typeof vi.fn>;
|
|
114
|
+
modify: ReturnType<typeof vi.fn>;
|
|
115
|
+
create: ReturnType<typeof vi.fn>;
|
|
116
|
+
delete: ReturnType<typeof vi.fn>;
|
|
117
|
+
rename: ReturnType<typeof vi.fn>;
|
|
118
|
+
getFiles: ReturnType<typeof vi.fn>;
|
|
119
|
+
getMarkdownFiles: ReturnType<typeof vi.fn>;
|
|
120
|
+
getFolderByPath: ReturnType<typeof vi.fn>;
|
|
121
|
+
};
|
|
122
|
+
workspace: {
|
|
123
|
+
getActiveFile: ReturnType<typeof vi.fn>;
|
|
124
|
+
on: ReturnType<typeof vi.fn>;
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
export declare function createMockApp(): MockApp;
|
|
128
|
+
export declare function createMockFile(path: string, options?: {
|
|
129
|
+
basename?: string;
|
|
130
|
+
parentPath?: string;
|
|
131
|
+
extension?: string;
|
|
132
|
+
}): TFile;
|
|
133
|
+
export declare function createMockFileCache(frontmatter?: Record<string, any>): {
|
|
134
|
+
frontmatter: Record<string, any>;
|
|
135
|
+
frontmatterPosition: {
|
|
136
|
+
start: {
|
|
137
|
+
line: number;
|
|
138
|
+
};
|
|
139
|
+
end: {
|
|
140
|
+
line: number;
|
|
141
|
+
};
|
|
142
|
+
} | null;
|
|
143
|
+
sections: never[];
|
|
144
|
+
headings: never[];
|
|
145
|
+
links: never[];
|
|
146
|
+
embeds: never[];
|
|
147
|
+
tags: never[];
|
|
148
|
+
listItems: never[];
|
|
149
|
+
};
|
|
150
|
+
//# sourceMappingURL=obsidian.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obsidian.d.ts","sourceRoot":"","sources":["../../../src/testing/mocks/obsidian.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,226 @@
|
|
|
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
|
+
// normalizePath mock - simple path normalization for tests
|
|
168
|
+
export function normalizePath(path) {
|
|
169
|
+
// Basic normalization: replace backslashes with forward slashes
|
|
170
|
+
// and remove duplicate slashes
|
|
171
|
+
return path.replace(/\\/g, "/").replace(/\/+/g, "/");
|
|
172
|
+
}
|
|
173
|
+
// App mock
|
|
174
|
+
export const App = vi.fn();
|
|
175
|
+
// Helper function to create a fully mocked app
|
|
176
|
+
export function createMockApp() {
|
|
177
|
+
return {
|
|
178
|
+
fileManager: {
|
|
179
|
+
processFrontMatter: vi.fn(),
|
|
180
|
+
},
|
|
181
|
+
metadataCache: {
|
|
182
|
+
getFileCache: vi.fn(),
|
|
183
|
+
},
|
|
184
|
+
vault: {
|
|
185
|
+
getAbstractFileByPath: vi.fn(),
|
|
186
|
+
on: vi.fn(),
|
|
187
|
+
read: vi.fn(),
|
|
188
|
+
modify: vi.fn(),
|
|
189
|
+
create: vi.fn(),
|
|
190
|
+
delete: vi.fn(),
|
|
191
|
+
rename: vi.fn(),
|
|
192
|
+
getFiles: vi.fn().mockReturnValue([]),
|
|
193
|
+
getMarkdownFiles: vi.fn().mockReturnValue([]),
|
|
194
|
+
getFolderByPath: vi.fn(),
|
|
195
|
+
},
|
|
196
|
+
workspace: {
|
|
197
|
+
getActiveFile: vi.fn(),
|
|
198
|
+
on: vi.fn(),
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
// Helper to create mock TFile instances
|
|
203
|
+
export function createMockFile(path, options) {
|
|
204
|
+
const file = new TFile(path, options === null || options === void 0 ? void 0 : options.parentPath);
|
|
205
|
+
if (options === null || options === void 0 ? void 0 : options.basename) {
|
|
206
|
+
file.basename = options.basename;
|
|
207
|
+
}
|
|
208
|
+
if (options === null || options === void 0 ? void 0 : options.extension) {
|
|
209
|
+
file.extension = options.extension;
|
|
210
|
+
}
|
|
211
|
+
return file;
|
|
212
|
+
}
|
|
213
|
+
// Helper to create mock file cache
|
|
214
|
+
export function createMockFileCache(frontmatter) {
|
|
215
|
+
return {
|
|
216
|
+
frontmatter: frontmatter || {},
|
|
217
|
+
frontmatterPosition: frontmatter ? { start: { line: 0 }, end: { line: 3 } } : null,
|
|
218
|
+
sections: [],
|
|
219
|
+
headings: [],
|
|
220
|
+
links: [],
|
|
221
|
+
embeds: [],
|
|
222
|
+
tags: [],
|
|
223
|
+
listItems: [],
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=obsidian.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obsidian.js","sourceRoot":"","sources":["../../../src/testing/mocks/obsidian.ts"],"names":[],"mappings":"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","sourcesContent":["import { vi } from \"vitest\";\n\n// Base Plugin class mock\nexport class Plugin {\n\tapp: any;\n\tmanifest: any;\n\tsettings: any;\n\n\tconstructor(app: any, manifest: any) {\n\t\tthis.app = app;\n\t\tthis.manifest = manifest;\n\t}\n\n\t// Core plugin methods\n\taddSettingTab = vi.fn();\n\tregisterEvent = vi.fn();\n\tloadData = vi.fn().mockResolvedValue({});\n\tsaveData = vi.fn().mockResolvedValue(undefined);\n\tonload = vi.fn();\n\tonunload = vi.fn();\n\n\t// UI methods\n\taddRibbonIcon = vi.fn();\n\taddStatusBarItem = vi.fn();\n\taddCommand = vi.fn();\n\tremoveCommand = vi.fn();\n\n\t// Event methods\n\tregisterDomEvent = vi.fn();\n\tregisterCodeMirror = vi.fn();\n\tregisterEditorExtension = vi.fn();\n\tregisterMarkdownPostProcessor = vi.fn();\n\tregisterMarkdownCodeBlockProcessor = vi.fn();\n\tregisterObsidianProtocolHandler = vi.fn();\n\tregisterEditorSuggest = vi.fn();\n\tregisterHoverLinkSource = vi.fn();\n\n\t// Interval methods\n\tregisterInterval = vi.fn();\n\n\t// View and extension methods\n\tregisterView = vi.fn();\n\tregisterExtensions = vi.fn();\n\n\t// Lifecycle methods\n\tonUserEnable = vi.fn();\n\tload = vi.fn();\n\tunload = vi.fn();\n\n\t// Other methods\n\taddChild = vi.fn();\n\tremoveChild = vi.fn();\n\tregister = vi.fn();\n}\n\n// PluginSettingTab mock\nexport class PluginSettingTab {\n\tapp: any;\n\tplugin: any;\n\tcontainerEl: HTMLElement;\n\n\tconstructor(app: any, plugin: any) {\n\t\tthis.app = app;\n\t\tthis.plugin = plugin;\n\t\tthis.containerEl = document.createElement(\"div\");\n\t}\n\n\tdisplay = vi.fn();\n}\n\n// ItemView mock\nexport class ItemView {\n\tapp: any;\n\tleaf: any;\n\tcontainerEl: HTMLElement;\n\n\tconstructor(leaf: any) {\n\t\tthis.leaf = leaf;\n\t\tthis.app = leaf?.app;\n\t\tthis.containerEl = document.createElement(\"div\");\n\t}\n\n\t// Don't override onOpen/onClose - let subclasses implement them\n\t// These methods are implemented by MountableView mixin\n\n\t// Don't provide default implementations for these methods\n\t// Let subclasses implement them\n\tgetViewType(): string {\n\t\treturn \"mock-view\";\n\t}\n\n\tgetDisplayText(): string {\n\t\treturn \"Mock View\";\n\t}\n\n\tgetIcon(): string {\n\t\treturn \"mock-icon\";\n\t}\n\n\tgetState = vi.fn().mockReturnValue({});\n\tsetState = vi.fn().mockResolvedValue(undefined);\n}\n\n// Setting component mock\nexport class Setting {\n\tsettingEl: HTMLElement;\n\tnameEl: HTMLElement;\n\tdescEl: HTMLElement;\n\tcontrolEl: HTMLElement;\n\n\tconstructor(_containerEl: HTMLElement) {\n\t\tthis.settingEl = document.createElement(\"div\");\n\t\tthis.nameEl = document.createElement(\"div\");\n\t\tthis.descEl = document.createElement(\"div\");\n\t\tthis.controlEl = document.createElement(\"div\");\n\t}\n\n\tsetName = vi.fn().mockReturnThis();\n\tsetDesc = vi.fn().mockReturnThis();\n\taddText = vi.fn().mockReturnThis();\n\taddTextArea = vi.fn().mockReturnThis();\n}\n\n// TFolder mock\nexport class TFolder {\n\tpath: string;\n\tname: string;\n\tchildren: any[];\n\tvault: any;\n\tparent: TFolder | null;\n\n\tconstructor(path: string) {\n\t\tthis.path = path;\n\t\tthis.name = path.split(\"/\").pop() || \"\";\n\t\tthis.children = [];\n\t\tthis.vault = {};\n\t\tthis.parent = null;\n\t}\n\n\tisRoot(): boolean {\n\t\treturn this.path === \"\" || this.path === \"/\";\n\t}\n}\n\n// TFile mock with full interface\nexport class TFile {\n\tpath: string;\n\tname: string;\n\tbasename: string;\n\textension: string;\n\tstat: any;\n\tvault: any;\n\tparent: TFolder | null;\n\n\tconstructor(path: string, parentPath?: string) {\n\t\tthis.path = path;\n\t\tthis.name = path.split(\"/\").pop() || \"\";\n\t\tthis.basename = this.name.replace(/\\.[^/.]+$/, \"\"); // Remove extension\n\t\tthis.extension = path.split(\".\").pop() || \"md\";\n\t\tthis.stat = {};\n\t\tthis.vault = {};\n\n\t\t// Set parent based on path or explicit parentPath\n\t\tif (parentPath !== undefined) {\n\t\t\tthis.parent = parentPath ? new TFolder(parentPath) : null;\n\t\t} else {\n\t\t\t// Derive parent from path\n\t\t\tconst lastSlash = path.lastIndexOf(\"/\");\n\t\t\tif (lastSlash > 0) {\n\t\t\t\tthis.parent = new TFolder(path.substring(0, lastSlash));\n\t\t\t} else {\n\t\t\t\tthis.parent = null;\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Modal mock\nexport class Modal {\n\tapp: any;\n\tcontainerEl: HTMLElement;\n\ttitleEl: HTMLElement;\n\tcontentEl: HTMLElement;\n\n\tconstructor(app: any) {\n\t\tthis.app = app;\n\t\tthis.containerEl = document.createElement(\"div\");\n\t\tthis.titleEl = document.createElement(\"div\");\n\t\tthis.contentEl = document.createElement(\"div\");\n\t}\n\n\topen = vi.fn();\n\tclose = vi.fn();\n\tonOpen = vi.fn();\n\tonClose = vi.fn();\n}\n\n// Notice mock\nexport class Notice {\n\tconstructor(message: string) {\n\t\tconsole.log(`Notice: ${message}`);\n\t}\n}\n\n// MarkdownRenderer mock\nexport const MarkdownRenderer = {\n\trender: vi.fn().mockResolvedValue(undefined),\n};\n\n// Debounce function mock\nexport function debounce<T extends (...args: any[]) => any>(\n\tfunc: T,\n\twait: number,\n\timmediate?: boolean\n): T {\n\tlet timeout: ReturnType<typeof setTimeout> | null = null;\n\n\treturn ((...args: Parameters<T>) => {\n\t\tconst later = () => {\n\t\t\ttimeout = null;\n\t\t\tif (!immediate) func(...args);\n\t\t};\n\n\t\tconst callNow = immediate && !timeout;\n\n\t\tif (timeout !== null) {\n\t\t\tclearTimeout(timeout);\n\t\t}\n\n\t\ttimeout = setTimeout(later, wait);\n\n\t\tif (callNow) func(...args);\n\t}) as T;\n}\n\n// normalizePath mock - simple path normalization for tests\nexport function normalizePath(path: string): string {\n\t// Basic normalization: replace backslashes with forward slashes\n\t// and remove duplicate slashes\n\treturn path.replace(/\\\\/g, \"/\").replace(/\\/+/g, \"/\");\n}\n\n// App mock\nexport const App = vi.fn();\n\n// Mock interfaces for TypeScript\nexport interface MockApp {\n\tfileManager: {\n\t\tprocessFrontMatter: ReturnType<typeof vi.fn>;\n\t};\n\tmetadataCache: {\n\t\tgetFileCache: ReturnType<typeof vi.fn>;\n\t};\n\tvault: {\n\t\tgetAbstractFileByPath: ReturnType<typeof vi.fn>;\n\t\ton: ReturnType<typeof vi.fn>;\n\t\tread: ReturnType<typeof vi.fn>;\n\t\tmodify: ReturnType<typeof vi.fn>;\n\t\tcreate: ReturnType<typeof vi.fn>;\n\t\tdelete: ReturnType<typeof vi.fn>;\n\t\trename: ReturnType<typeof vi.fn>;\n\t\tgetFiles: ReturnType<typeof vi.fn>;\n\t\tgetMarkdownFiles: ReturnType<typeof vi.fn>;\n\t\tgetFolderByPath: ReturnType<typeof vi.fn>;\n\t};\n\tworkspace: {\n\t\tgetActiveFile: ReturnType<typeof vi.fn>;\n\t\ton: ReturnType<typeof vi.fn>;\n\t};\n}\n\n// Helper function to create a fully mocked app\nexport function createMockApp(): MockApp {\n\treturn {\n\t\tfileManager: {\n\t\t\tprocessFrontMatter: vi.fn(),\n\t\t},\n\t\tmetadataCache: {\n\t\t\tgetFileCache: vi.fn(),\n\t\t},\n\t\tvault: {\n\t\t\tgetAbstractFileByPath: vi.fn(),\n\t\t\ton: vi.fn(),\n\t\t\tread: vi.fn(),\n\t\t\tmodify: vi.fn(),\n\t\t\tcreate: vi.fn(),\n\t\t\tdelete: vi.fn(),\n\t\t\trename: vi.fn(),\n\t\t\tgetFiles: vi.fn().mockReturnValue([]),\n\t\t\tgetMarkdownFiles: vi.fn().mockReturnValue([]),\n\t\t\tgetFolderByPath: vi.fn(),\n\t\t},\n\t\tworkspace: {\n\t\t\tgetActiveFile: vi.fn(),\n\t\t\ton: vi.fn(),\n\t\t},\n\t};\n}\n\n// Helper to create mock TFile instances\nexport function createMockFile(\n\tpath: string,\n\toptions?: {\n\t\tbasename?: string;\n\t\tparentPath?: string;\n\t\textension?: string;\n\t}\n): TFile {\n\tconst file = new TFile(path, options?.parentPath);\n\tif (options?.basename) {\n\t\tfile.basename = options.basename;\n\t}\n\tif (options?.extension) {\n\t\tfile.extension = options.extension;\n\t}\n\treturn file;\n}\n\n// Helper to create mock file cache\nexport function createMockFileCache(frontmatter?: Record<string, any>) {\n\treturn {\n\t\tfrontmatter: frontmatter || {},\n\t\tfrontmatterPosition: frontmatter ? { start: { line: 0 }, end: { line: 3 } } : null,\n\t\tsections: [],\n\t\theadings: [],\n\t\tlinks: [],\n\t\tembeds: [],\n\t\ttags: [],\n\t\tlistItems: [],\n\t};\n}\n"]}
|
|
@@ -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
|