@real1ty-obsidian-plugins/utils 1.2.1 → 1.2.2
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-utils.js +1 -1
- package/dist/async-utils.js.map +1 -0
- package/dist/batch-operations.js +1 -1
- package/dist/batch-operations.js.map +1 -0
- package/dist/child-reference-utils.js +1 -1
- package/dist/child-reference-utils.js.map +1 -0
- package/dist/date-recurrence-utils.js +1 -1
- package/dist/date-recurrence-utils.js.map +1 -0
- package/dist/date-utils.js +1 -1
- package/dist/date-utils.js.map +1 -0
- package/dist/evaluator-base.js +1 -1
- package/dist/evaluator-base.js.map +1 -0
- package/dist/file-operations.js +1 -1
- package/dist/file-operations.js.map +1 -0
- package/dist/file-utils.js +1 -1
- package/dist/file-utils.js.map +1 -0
- package/dist/generate.js +1 -1
- package/dist/generate.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -0
- package/dist/link-parser.js +1 -1
- package/dist/link-parser.js.map +1 -0
- package/dist/settings-store.js +1 -1
- package/dist/settings-store.js.map +1 -0
- package/dist/string-utils.js +1 -1
- package/dist/string-utils.js.map +1 -0
- package/dist/templater-utils.js +1 -1
- package/dist/templater-utils.js.map +1 -0
- package/dist/testing/index.js +1 -1
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mocks/obsidian.js +1 -1
- package/dist/testing/mocks/obsidian.js.map +1 -0
- package/dist/testing/mocks/utils.js +1 -1
- package/dist/testing/mocks/utils.js.map +1 -0
- package/dist/testing/setup.js +1 -1
- package/dist/testing/setup.js.map +1 -0
- package/package.json +5 -2
package/dist/async-utils.js
CHANGED
|
@@ -105,4 +105,4 @@ export function onceAsyncResettable(fn) {
|
|
|
105
105
|
},
|
|
106
106
|
};
|
|
107
107
|
}
|
|
108
|
-
//# sourceMappingURL=
|
|
108
|
+
//# sourceMappingURL=async-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-utils.js","sourceRoot":"","sources":["../src/async-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,SAAS,CAAI,EAAoB;IAChD,IAAI,OAAO,GAAsB,IAAI,CAAC;IAEtC,OAAO,GAAG,EAAE;QACX,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,IAAI,CAAC;gBACJ,OAAO,GAAG,EAAE,EAAE,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,kDAAkD;gBAClD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjC,CAAC;QACF,CAAC;QACD,OAAO,OAAO,CAAC;IAChB,CAAC,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,cAAc,CAC7B,EAAwC;IAExC,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IAElD,OAAO,CAAC,GAAG,IAAW,EAAE,EAAE;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAEjC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAC7B,CAAC;QAED,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;IACxB,CAAC,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,mBAAmB,CAAI,EAAoB;IAI1D,IAAI,OAAO,GAAsB,IAAI,CAAC;IAEtC,OAAO;QACN,OAAO,EAAE,GAAG,EAAE;YACb,IAAI,CAAC,OAAO,EAAE,CAAC;gBACd,IAAI,CAAC;oBACJ,OAAO,GAAG,EAAE,EAAE,CAAC;gBAChB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,kDAAkD;oBAClD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACjC,CAAC;YACF,CAAC;YACD,OAAO,OAAO,CAAC;QAChB,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACX,OAAO,GAAG,IAAI,CAAC;QAChB,CAAC;KACD,CAAC;AACH,CAAC","sourcesContent":["/**\n * Creates a function that ensures an async operation runs only once,\n * returning the same promise for concurrent calls.\n *\n * Useful for initialization patterns where you want to ensure\n * expensive async operations (like indexing, API calls, etc.)\n * only happen once even if called multiple times.\n *\n * @param fn The async function to memoize\n * @returns A function that returns the same promise on subsequent calls\n *\n * @example\n * ```typescript\n * const initializeOnce = onceAsync(async () => {\n * await heavyInitialization();\n * console.log(\"Initialized!\");\n * });\n *\n * // All these calls will share the same promise\n * await initializeOnce();\n * await initializeOnce(); // Won't run again\n * await initializeOnce(); // Won't run again\n * ```\n */\nexport function onceAsync<T>(fn: () => Promise<T>): () => Promise<T> {\n\tlet promise: Promise<T> | null = null;\n\n\treturn () => {\n\t\tif (!promise) {\n\t\t\ttry {\n\t\t\t\tpromise = fn();\n\t\t\t} catch (error) {\n\t\t\t\t// Convert synchronous errors to rejected promises\n\t\t\t\tpromise = Promise.reject(error);\n\t\t\t}\n\t\t}\n\t\treturn promise;\n\t};\n}\n\n/**\n * Creates a function that ensures an async operation runs only once per key,\n * useful for caching expensive operations with different parameters.\n *\n * @param fn The async function to memoize\n * @returns A function that memoizes results by key\n *\n * @example\n * ```typescript\n * const fetchUserOnce = onceAsyncKeyed(async (userId: string) => {\n * return await api.getUser(userId);\n * });\n *\n * // Each unique userId will only be fetched once\n * await fetchUserOnce(\"user1\");\n * await fetchUserOnce(\"user1\"); // Returns cached promise\n * await fetchUserOnce(\"user2\"); // New fetch for different key\n * ```\n */\nexport function onceAsyncKeyed<TArgs extends readonly unknown[], TReturn>(\n\tfn: (...args: TArgs) => Promise<TReturn>\n): (...args: TArgs) => Promise<TReturn> {\n\tconst cache = new Map<string, Promise<TReturn>>();\n\n\treturn (...args: TArgs) => {\n\t\tconst key = JSON.stringify(args);\n\n\t\tif (!cache.has(key)) {\n\t\t\tcache.set(key, fn(...args));\n\t\t}\n\n\t\treturn cache.get(key)!;\n\t};\n}\n\n/**\n * Creates a resettable version of onceAsync that can be cleared and re-run.\n *\n * @param fn The async function to memoize\n * @returns Object with execute and reset methods\n *\n * @example\n * ```typescript\n * const { execute: initialize, reset } = onceAsyncResettable(async () => {\n * await heavyInitialization();\n * });\n *\n * await initialize(); // Runs\n * await initialize(); // Cached\n *\n * reset(); // Clear cache\n * await initialize(); // Runs again\n * ```\n */\nexport function onceAsyncResettable<T>(fn: () => Promise<T>): {\n\texecute: () => Promise<T>;\n\treset: () => void;\n} {\n\tlet promise: Promise<T> | null = null;\n\n\treturn {\n\t\texecute: () => {\n\t\t\tif (!promise) {\n\t\t\t\ttry {\n\t\t\t\t\tpromise = fn();\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Convert synchronous errors to rejected promises\n\t\t\t\t\tpromise = Promise.reject(error);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn promise;\n\t\t},\n\t\treset: () => {\n\t\t\tpromise = null;\n\t\t},\n\t};\n}\n"]}
|
package/dist/batch-operations.js
CHANGED
|
@@ -28,4 +28,4 @@ export function showBatchOperationResult(operation, successCount, errorCount) {
|
|
|
28
28
|
new Notice(`${operation}: ${successCount} succeeded, ${errorCount} failed. Check console for details.`);
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
|
-
//# sourceMappingURL=
|
|
31
|
+
//# sourceMappingURL=batch-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-operations.js","sourceRoot":"","sources":["../src/batch-operations.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAYlC,MAAM,UAAgB,iBAAiB;yDACtC,KAAU,EACV,cAAsB,EACtB,OAAmC,EACnC,aAAsB,IAAI;QAE1B,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACJ,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;gBACpB,YAAY,EAAE,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,GAAG,cAAc,0BAA0B,EAAE,KAAK,CAAC,CAAC;gBAClE,UAAU,EAAE,CAAC;YACd,CAAC;QACF,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YAChB,wBAAwB,CAAC,cAAc,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;QACpE,CAAC;QAED,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;IACrC,CAAC;CAAA;AAED,MAAM,UAAU,wBAAwB,CACvC,SAAiB,EACjB,YAAoB,EACpB,UAAkB;IAElB,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACtB,IAAI,MAAM,CACT,GAAG,SAAS,KAAK,YAAY,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,yBAAyB,CAC3F,CAAC;IACH,CAAC;SAAM,CAAC;QACP,IAAI,MAAM,CACT,GAAG,SAAS,KAAK,YAAY,eAAe,UAAU,qCAAqC,CAC3F,CAAC;IACH,CAAC;AACF,CAAC","sourcesContent":["import { Notice } from \"obsidian\";\n\nexport interface BatchOperationOptions {\n\tcloseAfter?: boolean;\n\tcallOnComplete?: boolean;\n}\n\nexport interface BatchOperationResult {\n\tsuccessCount: number;\n\terrorCount: number;\n}\n\nexport async function runBatchOperation<T>(\n\titems: T[],\n\toperationLabel: string,\n\thandler: (item: T) => Promise<void>,\n\tshowResult: boolean = true\n): Promise<BatchOperationResult> {\n\tlet successCount = 0;\n\tlet errorCount = 0;\n\n\tfor (const item of items) {\n\t\ttry {\n\t\t\tawait handler(item);\n\t\t\tsuccessCount++;\n\t\t} catch (error) {\n\t\t\tconsole.error(`${operationLabel}: error processing item:`, error);\n\t\t\terrorCount++;\n\t\t}\n\t}\n\n\tif (showResult) {\n\t\tshowBatchOperationResult(operationLabel, successCount, errorCount);\n\t}\n\n\treturn { successCount, errorCount };\n}\n\nexport function showBatchOperationResult(\n\toperation: string,\n\tsuccessCount: number,\n\terrorCount: number\n): void {\n\tif (errorCount === 0) {\n\t\tnew Notice(\n\t\t\t`${operation}: ${successCount} item${successCount === 1 ? \"\" : \"s\"} processed successfully`\n\t\t);\n\t} else {\n\t\tnew Notice(\n\t\t\t`${operation}: ${successCount} succeeded, ${errorCount} failed. Check console for details.`\n\t\t);\n\t}\n}\n"]}
|
|
@@ -54,4 +54,4 @@ export function normalizeChildReferences(childRefs, vault, currentFileDirectory)
|
|
|
54
54
|
return normalizeChildReference(childRef, vault, currentFileDirectory);
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
|
-
//# sourceMappingURL=
|
|
57
|
+
//# sourceMappingURL=child-reference-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"child-reference-utils.js","sourceRoot":"","sources":["../src/child-reference-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAMxD,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACpD,MAAM,cAAc,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACjD,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACX,CAAC;IACD,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,QAAgB;IACxD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,uBAAuB,CACtC,QAAgB,EAChB,KAAmB,EACnB,oBAA6B;IAE7B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAEnD,qDAAqD;IACrD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,uEAAuE;QACvE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,oBAAoB,KAAK,SAAS,EAAE,CAAC;YACnE,2EAA2E;YAC3E,MAAM,aAAa,GAAG,oBAAoB;gBACzC,CAAC,CAAC,GAAG,oBAAoB,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,EAAE;gBACrF,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;oBACzB,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC,GAAG,QAAQ,KAAK,CAAC;YACrB,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;YACxD,IAAI,IAAI,YAAY,KAAK,EAAE,CAAC;gBAC3B,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;QACF,CAAC;QACD,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,qDAAqD;IACrD,IAAI,wBAAwB,CAAC,QAAQ,CAAC,IAAI,oBAAoB,EAAE,CAAC;QAChE,MAAM,YAAY,GAAG,GAAG,oBAAoB,IAAI,QAAQ,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;QACvD,IAAI,IAAI,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACF,CAAC;IAED,mFAAmF;IACnF,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,IAAI,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,wBAAwB,CACvC,SAAmB,EACnB,KAAmB,EACnB,oBAA6B;IAE7B,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QACjC,OAAO,uBAAuB,CAAC,QAAQ,EAAE,KAAK,EAAE,oBAAoB,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import { TFile } from \"obsidian\";\nimport { createFileLink } from \"./file-operations\";\nimport { extractFilePathFromLink } from \"./link-parser\";\n\nexport interface VaultAdapter {\n\tgetAbstractFileByPath(path: string): TFile | null;\n}\n\nexport function extractDirectoryPath(filePath: string): string {\n\tconst lastSlashIndex = filePath.lastIndexOf(\"/\");\n\tif (lastSlashIndex === -1) {\n\t\treturn \"\";\n\t}\n\treturn filePath.substring(0, lastSlashIndex);\n}\n\nexport function isRelativeChildReference(childRef: string): boolean {\n\tconst filePath = extractFilePathFromLink(childRef);\n\tif (!filePath) {\n\t\treturn !childRef.includes(\"/\");\n\t}\n\treturn !filePath.includes(\"/\");\n}\n\nexport function normalizeChildReference(\n\tchildRef: string,\n\tvault: VaultAdapter,\n\tcurrentFileDirectory?: string\n): string {\n\tconst filePath = extractFilePathFromLink(childRef);\n\n\t// Handle plain text references (not wrapped in [[]])\n\tif (!filePath) {\n\t\t// If it's not a link format, check if it should be converted to a link\n\t\tif (!childRef.includes(\"/\") && currentFileDirectory !== undefined) {\n\t\t\t// This is a plain text reference that might need to be converted to a link\n\t\t\tconst potentialPath = currentFileDirectory\n\t\t\t\t? `${currentFileDirectory}/${childRef.endsWith(\".md\") ? childRef : `${childRef}.md`}`\n\t\t\t\t: childRef.endsWith(\".md\")\n\t\t\t\t\t? childRef\n\t\t\t\t\t: `${childRef}.md`;\n\t\t\tconst file = vault.getAbstractFileByPath(potentialPath);\n\t\t\tif (file instanceof TFile) {\n\t\t\t\treturn createFileLink(file);\n\t\t\t}\n\t\t}\n\t\treturn childRef;\n\t}\n\n\t// Handle relative references by making them absolute\n\tif (isRelativeChildReference(childRef) && currentFileDirectory) {\n\t\tconst absolutePath = `${currentFileDirectory}/${filePath}`;\n\t\tconst file = vault.getAbstractFileByPath(absolutePath);\n\t\tif (file instanceof TFile) {\n\t\t\treturn createFileLink(file);\n\t\t}\n\t}\n\n\t// For absolute references or when no directory context, try to find the file as-is\n\tconst file = vault.getAbstractFileByPath(filePath);\n\tif (file instanceof TFile) {\n\t\treturn createFileLink(file);\n\t}\n\n\treturn childRef;\n}\n\nexport function normalizeChildReferences(\n\tchildRefs: string[],\n\tvault: VaultAdapter,\n\tcurrentFileDirectory?: string\n): string[] {\n\treturn childRefs.map((childRef) => {\n\t\treturn normalizeChildReference(childRef, vault, currentFileDirectory);\n\t});\n}\n"]}
|
|
@@ -164,4 +164,4 @@ export function calculateRecurringInstanceDateTime(nextInstanceDateTime, nodeRec
|
|
|
164
164
|
return nextInstanceDateTime.startOf("day");
|
|
165
165
|
}
|
|
166
166
|
}
|
|
167
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yZWN1cnJlbmNlLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RhdGUtcmVjdXJyZW5jZS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFhQSxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBNEI7SUFDekQsTUFBTSxFQUFFLENBQUM7SUFDVCxNQUFNLEVBQUUsQ0FBQztJQUNULE9BQU8sRUFBRSxDQUFDO0lBQ1YsU0FBUyxFQUFFLENBQUM7SUFDWixRQUFRLEVBQUUsQ0FBQztJQUNYLE1BQU0sRUFBRSxDQUFDO0lBQ1QsUUFBUSxFQUFFLENBQUM7Q0FDWCxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQ2hDLFdBQXFCLEVBQ3JCLGNBQThCLEVBQzlCLFFBQW9CO0lBRXBCLFFBQVEsY0FBYyxFQUFFLENBQUM7UUFDeEIsS0FBSyxPQUFPO1lBQ1gsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsS0FBSyxRQUFRO1lBQ1osSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsT0FBTyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDeEQsQ0FBQztZQUNELE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLEtBQUssV0FBVztZQUNmLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLE9BQU8seUJBQXlCLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3pELENBQUM7WUFDRCxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QyxLQUFLLFNBQVM7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QUVELE9BQU8sb0JBQW9CLENBQUMsR0FBRyxDQUFDO2dCQUMvQixHQUFHLEVBQUUsb0JBQW9CLENBQUMsR0FBRztnQkFDN0IsSUFBSSxFQUFFLG9CQUFvQixDQUFDLElBQUk7Z0JBQy9CLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxNQUFNO2dCQUNuQyxNQUFNLEVBQUUsQ0FBQztnQkFDVCxXQUFXLEVBQUUsQ0FBQzthQUNkLENBQUMsQ0FBQztRQUNKLENBQUM7UUFFRCxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDZixJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE9BQU8sb0JBQW9CO3FCQUN6QixHQUFHLENBQUM7b0JBQ0osS0FBSyxFQUFFLG9CQUFvQixDQUFDLEtBQUs7b0JBQ2pDLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQyxHQUFHO2lCQUM3QixDQUFDO3FCQUNELE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsQixDQUFDO1lBRUQsT0FBTyxvQkFBb0IsQ0FBQyxHQUFHLENBQUM7Z0JBQy9CLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxLQUFLO2dCQUNqQyxHQUFHLEVBQUUsb0JBQW9CLENBQUMsR0FBRztnQkFDN0IsSUFBSSxFQUFFLG9CQUFvQixDQUFDLElBQUk7Z0JBQy9CLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxNQUFNO2dCQUNuQyxNQUFNLEVBQUUsQ0FBQztnQkFDVCxXQUFXLEVBQUUsQ0FBQzthQUNkLENBQUMsQ0FBQztRQUNKLENBQUM7UUFFRDtZQUNDLE9BQU8sb0JBQW9CLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUM7QUFDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEYXRlVGltZSB9IGZyb20gXCJsdXhvblwiO1xuXG5leHBvcnQgdHlwZSBSZWN1cnJlbmNlVHlwZSA9IFwiZGFpbHlcIiB8IFwid2Vla2x5XCIgfCBcImJpLXdlZWtseVwiIHwgXCJtb250aGx5XCIgfCBcImJpLW1vbnRobHlcIiB8IFwieWVhcmx5XCI7XG5cbmV4cG9ydCB0eXBlIFdlZWtkYXkgPVxuXHR8IFwic3VuZGF5XCJcblx0fCBcIm1vbmRheVwiXG5cdHwgXCJ0dWVzZGF5XCJcblx0fCBcIndlZG5lc2RheVwiXG5cdHwgXCJ0aHVyc2RheVwiXG5cdHwgXCJmcmlkYXlcIlxuXHR8IFwic2F0dXJkYXlcIjtcblxuZXhwb3J0IGNvbnN0IFdFRUtEQVlfVE9fTlVNQkVSOiBSZWNvcmQ8V2Vla2RheSwgbnVtYmVyPiA9IHtcblx0c3VuZGF5OiAwLFxuXHRtb25kYXk6IDEsXG5cdHR1ZXNkYXk6IDIsXG5cdHdlZG5lc2RheTogMyxcblx0dGh1cnNkYXk6IDQsXG5cdGZyaWRheTogNSxcblx0c2F0dXJkYXk6IDYsXG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIG5leHQgb2NjdXJyZW5jZSBkYXRlIGJhc2VkIG9uIHJlY3VycmVuY2UgdHlwZSBhbmQgb3B0aW9uYWwgd2Vla2RheXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5leHRPY2N1cnJlbmNlKFxuXHRjdXJyZW50RGF0ZTogRGF0ZVRpbWUsXG5cdHJlY3VycmVuY2VUeXBlOiBSZWN1cnJlbmNlVHlwZSxcblx0d2Vla2RheXM/OiBXZWVrZGF5W11cbik6IERhdGVUaW1lIHtcblx0c3dpdGNoIChyZWN1cnJlbmNlVHlwZSkge1xuXHRcdGNhc2UgXCJkYWlseVwiOlxuXHRcdFx0cmV0dXJuIGN1cnJlbnREYXRlLnBsdXMoeyBkYXlzOiAxIH0pO1xuXHRcdGNhc2UgXCJ3ZWVrbHlcIjpcblx0XHRcdGlmICh3ZWVrZGF5cyAmJiB3ZWVrZGF5cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiBnZXROZXh0V2Vla2RheU9jY3VycmVuY2UoY3VycmVudERhdGUsIHdlZWtkYXlzKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBjdXJyZW50RGF0ZS5wbHVzKHsgd2Vla3M6IDEgfSk7XG5cdFx0Y2FzZSBcImJpLXdlZWtseVwiOlxuXHRcdFx0aWYgKHdlZWtkYXlzICYmIHdlZWtkYXlzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0dXJuIGdldE5leHRCaVdlZWtseU9jY3VycmVuY2UoY3VycmVudERhdGUsIHdlZWtkYXlzKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBjdXJyZW50RGF0ZS5wbHVzKHsgd2Vla3M6IDIgfSk7XG5cdFx0Y2FzZSBcIm1vbnRobHlcIjpcblx0XHRcdHJldHVybiBjdXJyZW50RGF0ZS5wbHVzKHsgbW9udGhzOiAxIH0pO1xuXHRcdGNhc2UgXCJiaS1tb250aGx5XCI6XG5cdFx0XHRyZXR1cm4gY3VycmVudERhdGUucGx1cyh7IG1vbnRoczogMiB9KTtcblx0XHRjYXNlIFwieWVhcmx5XCI6XG5cdFx0XHRyZXR1cm4gY3VycmVudERhdGUucGx1cyh7IHllYXJzOiAxIH0pO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gY3VycmVudERhdGUucGx1cyh7IGRheXM6IDEgfSk7XG5cdH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBkYXRlIG1hdGNoZXMgYW55IG9mIHRoZSBzcGVjaWZpZWQgd2Vla2RheXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZU9uV2Vla2RheXMoZGF0ZTogRGF0ZVRpbWUsIHdlZWtkYXlzOiBXZWVrZGF5W10pOiBib29sZWFuIHtcblx0Y29uc3QgZGF0ZVdlZWtkYXkgPSBkYXRlLndlZWtkYXk7XG5cdGNvbnN0IGx1eG9uV2Vla2RheXMgPSB3ZWVrZGF5cy5tYXAoKGRheSkgPT4ge1xuXHRcdGNvbnN0IGRheU51bWJlciA9IFdFRUtEQVlfVE9fTlVNQkVSW2RheV07XG5cdFx0cmV0dXJuIGRheU51bWJlciA9PT0gMCA/IDcgOiBkYXlOdW1iZXI7IC8vIENvbnZlcnQgU3VuZGF5IGZyb20gMCB0byA3IGZvciBMdXhvblxuXHR9KTtcblxuXHRyZXR1cm4gbHV4b25XZWVrZGF5cy5pbmNsdWRlcyhkYXRlV2Vla2RheSk7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIG5leHQgb2NjdXJyZW5jZSBvbiBzcGVjaWZpZWQgd2Vla2RheXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5leHRXZWVrZGF5T2NjdXJyZW5jZShjdXJyZW50RGF0ZTogRGF0ZVRpbWUsIHdlZWtkYXlzOiBXZWVrZGF5W10pOiBEYXRlVGltZSB7XG5cdGNvbnN0IGN1cnJlbnRXZWVrZGF5ID0gY3VycmVudERhdGUud2Vla2RheTtcblx0Y29uc3QgbHV4b25XZWVrZGF5cyA9IHdlZWtkYXlzLm1hcCgoZGF5KSA9PiB7XG5cdFx0Y29uc3QgZGF5TnVtYmVyID0gV0VFS0RBWV9UT19OVU1CRVJbZGF5XTtcblx0XHRyZXR1cm4gZGF5TnVtYmVyID09PSAwID8gNyA6IGRheU51bWJlcjsgLy8gQ29udmVydCBTdW5kYXkgZnJvbSAwIHRvIDcgZm9yIEx1eG9uXG5cdH0pO1xuXG5cdC8vIEZpbmQgbmV4dCB3ZWVrZGF5IGluIHRoZSBjdXJyZW50IHdlZWsgKGFmdGVyIHRvZGF5KVxuXHRjb25zdCBuZXh0V2Vla2RheSA9IGx1eG9uV2Vla2RheXMuZmluZCgoZGF5KSA9PiBkYXkgPiBjdXJyZW50V2Vla2RheSk7XG5cdGlmIChuZXh0V2Vla2RheSkge1xuXHRcdHJldHVybiBjdXJyZW50RGF0ZS5zZXQoeyB3ZWVrZGF5OiBuZXh0V2Vla2RheSBhcyAxIHwgMiB8IDMgfCA0IHwgNSB8IDYgfCA3IH0pO1xuXHR9XG5cblx0Ly8gTm8gbW9yZSB3ZWVrZGF5cyB0aGlzIHdlZWssIGdvIHRvIGZpcnN0IHdlZWtkYXkgb2YgbmV4dCB3ZWVrXG5cdGNvbnN0IGZpcnN0V2Vla2RheSA9IE1hdGgubWluKC4uLmx1eG9uV2Vla2RheXMpO1xuXHRyZXR1cm4gY3VycmVudERhdGUucGx1cyh7IHdlZWtzOiAxIH0pLnNldCh7IHdlZWtkYXk6IGZpcnN0V2Vla2RheSBhcyAxIHwgMiB8IDMgfCA0IHwgNSB8IDYgfCA3IH0pO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBuZXh0IGJpLXdlZWtseSBvY2N1cnJlbmNlIG9uIHNwZWNpZmllZCB3ZWVrZGF5c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV4dEJpV2Vla2x5T2NjdXJyZW5jZShjdXJyZW50RGF0ZTogRGF0ZVRpbWUsIHdlZWtkYXlzOiBXZWVrZGF5W10pOiBEYXRlVGltZSB7XG5cdGNvbnN0IG5leHRXZWVrbHkgPSBnZXROZXh0V2Vla2RheU9jY3VycmVuY2UoY3VycmVudERhdGUsIHdlZWtkYXlzKTtcblx0Ly8gQWRkIG9uZSBtb3JlIHdlZWsgdG8gbWFrZSBpdCBiaS13ZWVrbHlcblx0cmV0dXJuIG5leHRXZWVrbHkucGx1cyh7IHdlZWtzOiAxIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24qIGl0ZXJhdGVPY2N1cnJlbmNlc0luUmFuZ2UoXG5cdHN0YXJ0RGF0ZTogRGF0ZVRpbWUsXG5cdHJydWxlczogeyB0eXBlOiBSZWN1cnJlbmNlVHlwZTsgd2Vla2RheXM/OiBXZWVrZGF5W10gfSxcblx0cmFuZ2VTdGFydDogRGF0ZVRpbWUsXG5cdHJhbmdlRW5kOiBEYXRlVGltZVxuKTogR2VuZXJhdG9yPERhdGVUaW1lLCB2b2lkLCB1bmtub3duPiB7XG5cdGxldCBjdXJyZW50RGF0ZSA9IHN0YXJ0RGF0ZSA+PSByYW5nZVN0YXJ0ID8gc3RhcnREYXRlIDogcmFuZ2VTdGFydDtcblxuXHR3aGlsZSAoY3VycmVudERhdGUgPD0gcmFuZ2VFbmQpIHtcblx0XHQvLyBDaGVjayBpZiBjdXJyZW50IGRhdGUgc2hvdWxkIGhhdmUgYW4gZXZlbnRcblx0XHRsZXQgc2hvdWxkQWRkRXZlbnQgPSBmYWxzZTtcblxuXHRcdGlmIChycnVsZXMudHlwZSA9PT0gXCJkYWlseVwiKSB7XG5cdFx0XHRzaG91bGRBZGRFdmVudCA9IHRydWU7XG5cdFx0fSBlbHNlIGlmIChycnVsZXMudHlwZSA9PT0gXCJ3ZWVrbHlcIiB8fCBycnVsZXMudHlwZSA9PT0gXCJiaS13ZWVrbHlcIikge1xuXHRcdFx0aWYgKHJydWxlcy53ZWVrZGF5cyAmJiBycnVsZXMud2Vla2RheXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRzaG91bGRBZGRFdmVudCA9IGlzRGF0ZU9uV2Vla2RheXMoY3VycmVudERhdGUsIHJydWxlcy53ZWVrZGF5cyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzaG91bGRBZGRFdmVudCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNob3VsZEFkZEV2ZW50ID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoc2hvdWxkQWRkRXZlbnQpIHtcblx0XHRcdHlpZWxkIGN1cnJlbnREYXRlO1xuXHRcdH1cblxuXHRcdGNvbnN0IG5leHREYXRlID0gZ2V0TmV4dE9jY3VycmVuY2UoY3VycmVudERhdGUsIHJydWxlcy50eXBlLCBycnVsZXMud2Vla2RheXMpO1xuXG5cdFx0aWYgKG5leHREYXRlIDw9IHJhbmdlRW5kKSB7XG5cdFx0XHRjdXJyZW50RGF0ZSA9IG5leHREYXRlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIGEgRGF0ZVRpbWUgZm9yIGEgc3BlY2lmaWMgZGF0ZSB3aXRoIG9wdGlvbmFsIHRpbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZUluc3RhbmNlRGF0ZVRpbWUoaW5zdGFuY2VEYXRlOiBEYXRlVGltZSwgdGltZVN0cmluZz86IHN0cmluZyk6IERhdGVUaW1lIHtcblx0aWYgKCF0aW1lU3RyaW5nKSB7XG5cdFx0cmV0dXJuIGluc3RhbmNlRGF0ZS5zdGFydE9mKFwiZGF5XCIpO1xuXHR9XG5cblx0Y29uc3QgW2hvdXJzLCBtaW51dGVzXSA9IHRpbWVTdHJpbmcuc3BsaXQoXCI6XCIpLm1hcChOdW1iZXIpO1xuXHRyZXR1cm4gaW5zdGFuY2VEYXRlLnNldCh7IGhvdXI6IGhvdXJzLCBtaW51dGU6IG1pbnV0ZXMsIHNlY29uZDogMCwgbWlsbGlzZWNvbmQ6IDAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVSZWN1cnJpbmdJbnN0YW5jZURhdGVUaW1lKFxuXHRuZXh0SW5zdGFuY2VEYXRlVGltZTogRGF0ZVRpbWUsXG5cdG5vZGVSZWN1cmluZ0V2ZW50RGF0ZVRpbWU6IERhdGVUaW1lLFxuXHRyZWN1cnJlbmNlVHlwZTogUmVjdXJyZW5jZVR5cGUsXG5cdGFsbERheT86IGJvb2xlYW5cbik6IERhdGVUaW1lIHtcblx0Ly8gQ29udmVydCB0aGUgb3JpZ2luYWwgZXZlbnQgdGltZSB0byB0aGUgdGFyZ2V0IHRpbWV6b25lIG9uY2UgdG8gcHJlc2VydmUgbG9jYWwgdGltZVxuXHRjb25zdCBvcmlnaW5hbEluVGFyZ2V0Wm9uZSA9IG5vZGVSZWN1cmluZ0V2ZW50RGF0ZVRpbWUuc2V0Wm9uZShuZXh0SW5zdGFuY2VEYXRlVGltZS56b25lKTtcblxuXHRzd2l0Y2ggKHJlY3VycmVuY2VUeXBlKSB7XG5cdFx0Y2FzZSBcImRhaWx5XCI6XG5cdFx0Y2FzZSBcIndlZWtseVwiOlxuXHRcdGNhc2UgXCJiaS13ZWVrbHlcIjoge1xuXHRcdFx0aWYgKGFsbERheSkge1xuXHRcdFx0XHRyZXR1cm4gbmV4dEluc3RhbmNlRGF0ZVRpbWUuc3RhcnRPZihcImRheVwiKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG5leHRJbnN0YW5jZURhdGVUaW1lLnNldCh7XG5cdFx0XHRcdGhvdXI6IG9yaWdpbmFsSW5UYXJnZXRab25lLmhvdXIsXG5cdFx0XHRcdG1pbnV0ZTogb3JpZ2luYWxJblRhcmdldFpvbmUubWludXRlLFxuXHRcdFx0XHRzZWNvbmQ6IDAsXG5cdFx0XHRcdG1pbGxpc2Vjb25kOiAwLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Y2FzZSBcIm1vbnRobHlcIjpcblx0XHRjYXNlIFwiYmktbW9udGhseVwiOiB7XG5cdFx0XHRpZiAoYWxsRGF5KSB7XG5cdFx0XHRcdHJldHVybiBuZXh0SW5zdGFuY2VEYXRlVGltZS5zZXQoeyBkYXk6IG9yaWdpbmFsSW5UYXJnZXRab25lLmRheSB9KS5zdGFydE9mKFwiZGF5XCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbmV4dEluc3RhbmNlRGF0ZVRpbWUuc2V0KHtcblx0XHRcdFx0ZGF5OiBvcmlnaW5hbEluVGFyZ2V0Wm9uZS5kYXksXG5cdFx0XHRcdGhvdXI6IG9yaWdpbmFsSW5UYXJnZXRab25lLmhvdXIsXG5cdFx0XHRcdG1pbnV0ZTogb3JpZ2luYWxJblRhcmdldFpvbmUubWludXRlLFxuXHRcdFx0XHRzZWNvbmQ6IDAsXG5cdFx0XHRcdG1pbGxpc2Vjb25kOiAwLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Y2FzZSBcInllYXJseVwiOiB7XG5cdFx0XHRpZiAoYWxsRGF5KSB7XG5cdFx0XHRcdHJldHVybiBuZXh0SW5zdGFuY2VEYXRlVGltZVxuXHRcdFx0XHRcdC5zZXQoe1xuXHRcdFx0XHRcdFx0bW9udGg6IG9yaWdpbmFsSW5UYXJnZXRab25lLm1vbnRoLFxuXHRcdFx0XHRcdFx0ZGF5OiBvcmlnaW5hbEluVGFyZ2V0Wm9uZS5kYXksXG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuc3RhcnRPZihcImRheVwiKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG5leHRJbnN0YW5jZURhdGVUaW1lLnNldCh7XG5cdFx0XHRcdG1vbnRoOiBvcmlnaW5hbEluVGFyZ2V0Wm9uZS5tb250aCxcblx0XHRcdFx0ZGF5OiBvcmlnaW5hbEluVGFyZ2V0Wm9uZS5kYXksXG5cdFx0XHRcdGhvdXI6IG9yaWdpbmFsSW5UYXJnZXRab25lLmhvdXIsXG5cdFx0XHRcdG1pbnV0ZTogb3JpZ2luYWxJblRhcmdldFpvbmUubWludXRlLFxuXHRcdFx0XHRzZWNvbmQ6IDAsXG5cdFx0XHRcdG1pbGxpc2Vjb25kOiAwLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiBuZXh0SW5zdGFuY2VEYXRlVGltZS5zdGFydE9mKFwiZGF5XCIpO1xuXHR9XG59XG4iXX0=
|
|
167
|
+
//# sourceMappingURL=date-recurrence-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-recurrence-utils.js","sourceRoot":"","sources":["../src/date-recurrence-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DateTime } from \"luxon\";\n\nexport type RecurrenceType = \"daily\" | \"weekly\" | \"bi-weekly\" | \"monthly\" | \"bi-monthly\" | \"yearly\";\n\nexport type Weekday =\n\t| \"sunday\"\n\t| \"monday\"\n\t| \"tuesday\"\n\t| \"wednesday\"\n\t| \"thursday\"\n\t| \"friday\"\n\t| \"saturday\";\n\nexport const WEEKDAY_TO_NUMBER: Record<Weekday, number> = {\n\tsunday: 0,\n\tmonday: 1,\n\ttuesday: 2,\n\twednesday: 3,\n\tthursday: 4,\n\tfriday: 5,\n\tsaturday: 6,\n};\n\n/**\n * Calculates the next occurrence date based on recurrence type and optional weekdays\n */\nexport function getNextOccurrence(\n\tcurrentDate: DateTime,\n\trecurrenceType: RecurrenceType,\n\tweekdays?: Weekday[]\n): DateTime {\n\tswitch (recurrenceType) {\n\t\tcase \"daily\":\n\t\t\treturn currentDate.plus({ days: 1 });\n\t\tcase \"weekly\":\n\t\t\tif (weekdays && weekdays.length > 0) {\n\t\t\t\treturn getNextWeekdayOccurrence(currentDate, weekdays);\n\t\t\t}\n\t\t\treturn currentDate.plus({ weeks: 1 });\n\t\tcase \"bi-weekly\":\n\t\t\tif (weekdays && weekdays.length > 0) {\n\t\t\t\treturn getNextBiWeeklyOccurrence(currentDate, weekdays);\n\t\t\t}\n\t\t\treturn currentDate.plus({ weeks: 2 });\n\t\tcase \"monthly\":\n\t\t\treturn currentDate.plus({ months: 1 });\n\t\tcase \"bi-monthly\":\n\t\t\treturn currentDate.plus({ months: 2 });\n\t\tcase \"yearly\":\n\t\t\treturn currentDate.plus({ years: 1 });\n\t\tdefault:\n\t\t\treturn currentDate.plus({ days: 1 });\n\t}\n}\n\n/**\n * Checks if a given date matches any of the specified weekdays\n */\nexport function isDateOnWeekdays(date: DateTime, weekdays: Weekday[]): boolean {\n\tconst dateWeekday = date.weekday;\n\tconst luxonWeekdays = weekdays.map((day) => {\n\t\tconst dayNumber = WEEKDAY_TO_NUMBER[day];\n\t\treturn dayNumber === 0 ? 7 : dayNumber; // Convert Sunday from 0 to 7 for Luxon\n\t});\n\n\treturn luxonWeekdays.includes(dateWeekday);\n}\n\n/**\n * Finds the next occurrence on specified weekdays\n */\nexport function getNextWeekdayOccurrence(currentDate: DateTime, weekdays: Weekday[]): DateTime {\n\tconst currentWeekday = currentDate.weekday;\n\tconst luxonWeekdays = weekdays.map((day) => {\n\t\tconst dayNumber = WEEKDAY_TO_NUMBER[day];\n\t\treturn dayNumber === 0 ? 7 : dayNumber; // Convert Sunday from 0 to 7 for Luxon\n\t});\n\n\t// Find next weekday in the current week (after today)\n\tconst nextWeekday = luxonWeekdays.find((day) => day > currentWeekday);\n\tif (nextWeekday) {\n\t\treturn currentDate.set({ weekday: nextWeekday as 1 | 2 | 3 | 4 | 5 | 6 | 7 });\n\t}\n\n\t// No more weekdays this week, go to first weekday of next week\n\tconst firstWeekday = Math.min(...luxonWeekdays);\n\treturn currentDate.plus({ weeks: 1 }).set({ weekday: firstWeekday as 1 | 2 | 3 | 4 | 5 | 6 | 7 });\n}\n\n/**\n * Finds the next bi-weekly occurrence on specified weekdays\n */\nexport function getNextBiWeeklyOccurrence(currentDate: DateTime, weekdays: Weekday[]): DateTime {\n\tconst nextWeekly = getNextWeekdayOccurrence(currentDate, weekdays);\n\t// Add one more week to make it bi-weekly\n\treturn nextWeekly.plus({ weeks: 1 });\n}\n\nexport function* iterateOccurrencesInRange(\n\tstartDate: DateTime,\n\trrules: { type: RecurrenceType; weekdays?: Weekday[] },\n\trangeStart: DateTime,\n\trangeEnd: DateTime\n): Generator<DateTime, void, unknown> {\n\tlet currentDate = startDate >= rangeStart ? startDate : rangeStart;\n\n\twhile (currentDate <= rangeEnd) {\n\t\t// Check if current date should have an event\n\t\tlet shouldAddEvent = false;\n\n\t\tif (rrules.type === \"daily\") {\n\t\t\tshouldAddEvent = true;\n\t\t} else if (rrules.type === \"weekly\" || rrules.type === \"bi-weekly\") {\n\t\t\tif (rrules.weekdays && rrules.weekdays.length > 0) {\n\t\t\t\tshouldAddEvent = isDateOnWeekdays(currentDate, rrules.weekdays);\n\t\t\t} else {\n\t\t\t\tshouldAddEvent = true;\n\t\t\t}\n\t\t} else {\n\t\t\tshouldAddEvent = true;\n\t\t}\n\n\t\tif (shouldAddEvent) {\n\t\t\tyield currentDate;\n\t\t}\n\n\t\tconst nextDate = getNextOccurrence(currentDate, rrules.type, rrules.weekdays);\n\n\t\tif (nextDate <= rangeEnd) {\n\t\t\tcurrentDate = nextDate;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/**\n * Calculates a DateTime for a specific date with optional time\n */\nexport function calculateInstanceDateTime(instanceDate: DateTime, timeString?: string): DateTime {\n\tif (!timeString) {\n\t\treturn instanceDate.startOf(\"day\");\n\t}\n\n\tconst [hours, minutes] = timeString.split(\":\").map(Number);\n\treturn instanceDate.set({ hour: hours, minute: minutes, second: 0, millisecond: 0 });\n}\n\nexport function calculateRecurringInstanceDateTime(\n\tnextInstanceDateTime: DateTime,\n\tnodeRecuringEventDateTime: DateTime,\n\trecurrenceType: RecurrenceType,\n\tallDay?: boolean\n): DateTime {\n\t// Convert the original event time to the target timezone once to preserve local time\n\tconst originalInTargetZone = nodeRecuringEventDateTime.setZone(nextInstanceDateTime.zone);\n\n\tswitch (recurrenceType) {\n\t\tcase \"daily\":\n\t\tcase \"weekly\":\n\t\tcase \"bi-weekly\": {\n\t\t\tif (allDay) {\n\t\t\t\treturn nextInstanceDateTime.startOf(\"day\");\n\t\t\t}\n\n\t\t\treturn nextInstanceDateTime.set({\n\t\t\t\thour: originalInTargetZone.hour,\n\t\t\t\tminute: originalInTargetZone.minute,\n\t\t\t\tsecond: 0,\n\t\t\t\tmillisecond: 0,\n\t\t\t});\n\t\t}\n\n\t\tcase \"monthly\":\n\t\tcase \"bi-monthly\": {\n\t\t\tif (allDay) {\n\t\t\t\treturn nextInstanceDateTime.set({ day: originalInTargetZone.day }).startOf(\"day\");\n\t\t\t}\n\n\t\t\treturn nextInstanceDateTime.set({\n\t\t\t\tday: originalInTargetZone.day,\n\t\t\t\thour: originalInTargetZone.hour,\n\t\t\t\tminute: originalInTargetZone.minute,\n\t\t\t\tsecond: 0,\n\t\t\t\tmillisecond: 0,\n\t\t\t});\n\t\t}\n\n\t\tcase \"yearly\": {\n\t\t\tif (allDay) {\n\t\t\t\treturn nextInstanceDateTime\n\t\t\t\t\t.set({\n\t\t\t\t\t\tmonth: originalInTargetZone.month,\n\t\t\t\t\t\tday: originalInTargetZone.day,\n\t\t\t\t\t})\n\t\t\t\t\t.startOf(\"day\");\n\t\t\t}\n\n\t\t\treturn nextInstanceDateTime.set({\n\t\t\t\tmonth: originalInTargetZone.month,\n\t\t\t\tday: originalInTargetZone.day,\n\t\t\t\thour: originalInTargetZone.hour,\n\t\t\t\tminute: originalInTargetZone.minute,\n\t\t\t\tsecond: 0,\n\t\t\t\tmillisecond: 0,\n\t\t\t});\n\t\t}\n\n\t\tdefault:\n\t\t\treturn nextInstanceDateTime.startOf(\"day\");\n\t}\n}\n"]}
|
package/dist/date-utils.js
CHANGED
|
@@ -102,4 +102,4 @@ export const parseDateTimeString = (value) => {
|
|
|
102
102
|
return dt;
|
|
103
103
|
return undefined;
|
|
104
104
|
};
|
|
105
|
-
//# sourceMappingURL=
|
|
105
|
+
//# sourceMappingURL=date-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-utils.js","sourceRoot":"","sources":["../src/date-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { DateTime } from \"luxon\";\n\nexport const formatDateTimeForInput = (dateString: string): string => {\n\tif (!dateString) return \"\";\n\n\ttry {\n\t\tconst date = new Date(dateString);\n\t\t// Format for datetime-local input (YYYY-MM-DDTHH:mm)\n\t\tconst year = date.getFullYear();\n\t\tconst month = String(date.getMonth() + 1).padStart(2, \"0\");\n\t\tconst day = String(date.getDate()).padStart(2, \"0\");\n\t\tconst hours = String(date.getHours()).padStart(2, \"0\");\n\t\tconst minutes = String(date.getMinutes()).padStart(2, \"0\");\n\n\t\treturn `${year}-${month}-${day}T${hours}:${minutes}`;\n\t} catch {\n\t\treturn \"\";\n\t}\n};\n\nexport const formatDateForInput = (dateString: string): string => {\n\tif (!dateString) return \"\";\n\n\ttry {\n\t\tconst date = new Date(dateString);\n\t\tconst year = date.getFullYear();\n\t\tconst month = String(date.getMonth() + 1).padStart(2, \"0\");\n\t\tconst day = String(date.getDate()).padStart(2, \"0\");\n\n\t\treturn `${year}-${month}-${day}`;\n\t} catch {\n\t\treturn \"\";\n\t}\n};\n\n/**\n * Converts input value to ISO string, handling edge cases where\n * browser datetime-local inputs behave differently across platforms.\n * Returns null for invalid dates to prevent silent failures.\n */\nexport const inputValueToISOString = (inputValue: string): string | null => {\n\ttry {\n\t\treturn new Date(inputValue).toISOString();\n\t} catch {\n\t\treturn null;\n\t}\n};\n\nexport const formatDuration = (minutes: number): string => {\n\tconst hours = Math.floor(minutes / 60);\n\tconst mins = minutes % 60;\n\treturn `${String(hours).padStart(2, \"0\")}:${String(mins).padStart(2, \"0\")}:00`;\n};\n\n/**\n * Parse time string from datetime value - returns DateTime object\n * Rejects plain HH:mm format, requires full datetime\n */\nexport const parseTimeString = (value: string | null): DateTime | undefined => {\n\tif (value === null) return undefined;\n\n\tconst v = value.trim();\n\n\t// Reject plain HH:mm format - require full datetime\n\tif (/^\\d{2}:\\d{2}$/.test(v)) {\n\t\treturn undefined; // Reject plain time format\n\t}\n\n\t// Try ISO format first (most common) - EXACT same logic as recurring events\n\tlet dt = DateTime.fromISO(v, { setZone: true }); // ISO: with/without seconds, Z/offset, T\n\tif (!dt.isValid) dt = DateTime.fromSQL(v, { setZone: true }); // \"YYYY-MM-DD HH:mm[:ss]\" etc.\n\tif (!dt.isValid) dt = DateTime.fromFormat(v, \"yyyy-MM-dd HH:mm\", { setZone: true });\n\n\treturn dt.isValid ? dt : undefined;\n};\n\n/**\n * Parse and validate datetime strings for event parsing\n * Supports multiple formats including date-only and datetime formats\n */\nexport const parseDateTimeString = (value: string | null): DateTime | undefined => {\n\tif (value === null) return undefined;\n\n\tconst v = value.trim();\n\tif (!v) return undefined;\n\n\t// Try multiple datetime formats in order of preference\n\tlet dt: DateTime;\n\n\t// 1. Try ISO format first (most common)\n\tdt = DateTime.fromISO(v, { setZone: true });\n\tif (dt.isValid) return dt;\n\n\t// 2. Try SQL format (YYYY-MM-DD HH:mm:ss)\n\tdt = DateTime.fromSQL(v, { setZone: true });\n\tif (dt.isValid) return dt;\n\n\t// 3. Try common format with space (YYYY-MM-DD HH:mm)\n\tdt = DateTime.fromFormat(v, \"yyyy-MM-dd HH:mm\", { setZone: true });\n\tif (dt.isValid) return dt;\n\n\t// 4. Try date-only format (YYYY-MM-DD) - treat as start of day\n\tdt = DateTime.fromFormat(v, \"yyyy-MM-dd\", { setZone: true });\n\tif (dt.isValid) return dt;\n\n\t// 5. Try ISO date format (YYYY-MM-DD)\n\tdt = DateTime.fromISO(v, { setZone: true });\n\tif (dt.isValid) return dt;\n\n\treturn undefined;\n};\n"]}
|
package/dist/evaluator-base.js
CHANGED
|
@@ -81,4 +81,4 @@ export class BaseEvaluator {
|
|
|
81
81
|
}));
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
|
-
//# sourceMappingURL=
|
|
84
|
+
//# sourceMappingURL=evaluator-base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator-base.js","sourceRoot":"","sources":["../src/evaluator-base.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BehaviorSubject, Subscription } from \"rxjs\";\n\nexport interface BaseRule {\n\tid: string;\n\texpression: string;\n\tenabled: boolean;\n}\n\n/**\n * Generic base class for evaluating JavaScript expressions against frontmatter objects.\n * Provides reactive compilation of rules via RxJS subscription and safe evaluation.\n */\nexport abstract class BaseEvaluator<TRule extends BaseRule, TSettings> {\n\tprotected compiledRules: Array<\n\t\tTRule & { fn: (frontmatter: Record<string, unknown>) => boolean }\n\t> = [];\n\tprivate settingsSubscription: Subscription | null = null;\n\n\tconstructor(settingsStore: BehaviorSubject<TSettings>) {\n\t\tconst initialRules = this.extractRules(settingsStore.value);\n\t\tthis.compileRules(initialRules);\n\n\t\tthis.settingsSubscription = settingsStore.subscribe((settings) => {\n\t\t\tconst newRules = this.extractRules(settings);\n\t\t\tthis.compileRules(newRules);\n\t\t});\n\t}\n\n\t/**\n\t * Extract rules from settings object. Must be implemented by subclasses.\n\t */\n\tprotected abstract extractRules(settings: TSettings): TRule[];\n\n\t/**\n\t * Compile rules into executable functions with error handling.\n\t */\n\tprivate compileRules(rules: TRule[]): void {\n\t\tthis.compiledRules = [];\n\n\t\tfor (const rule of rules) {\n\t\t\tif (!rule.enabled || !rule.expression.trim()) continue;\n\n\t\t\ttry {\n\t\t\t\tconst cleanExpression = rule.expression.trim();\n\n\t\t\t\t// Create a function that takes 'fm' (frontmatter) as parameter\n\t\t\t\t// and evaluates the expression in that context\n\t\t\t\tconst fn = new Function(\"fm\", `return (${cleanExpression});`) as (\n\t\t\t\t\tfrontmatter: Record<string, unknown>\n\t\t\t\t) => boolean;\n\n\t\t\t\t// Test the function with a dummy object to catch syntax errors early\n\t\t\t\tfn({});\n\n\t\t\t\tthis.compiledRules.push({\n\t\t\t\t\t...rule,\n\t\t\t\t\texpression: cleanExpression,\n\t\t\t\t\tfn,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(`Invalid rule expression \"${rule.expression}\":`, error);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Evaluate a single rule against frontmatter. Returns the result or undefined if error.\n\t */\n\tprotected evaluateRule(\n\t\trule: TRule & { fn: (frontmatter: Record<string, unknown>) => boolean },\n\t\tfrontmatter: Record<string, unknown>\n\t): boolean | undefined {\n\t\ttry {\n\t\t\treturn rule.fn(frontmatter);\n\t\t} catch (error) {\n\t\t\tconsole.warn(`Error evaluating rule \"${rule.expression}\":`, error);\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Convert evaluation result to boolean - only explicit true is considered truthy.\n\t */\n\tprotected isTruthy(result: boolean | undefined): boolean {\n\t\treturn result === true;\n\t}\n\n\t/**\n\t * Clean up subscriptions and compiled rules.\n\t */\n\tdestroy(): void {\n\t\tif (this.settingsSubscription) {\n\t\t\tthis.settingsSubscription.unsubscribe();\n\t\t\tthis.settingsSubscription = null;\n\t\t}\n\t\tthis.compiledRules = [];\n\t}\n\n\t/**\n\t * Get the number of active (compiled) rules.\n\t */\n\tgetActiveRuleCount(): number {\n\t\treturn this.compiledRules.length;\n\t}\n\n\t/**\n\t * Get information about all rules including their validity.\n\t */\n\tgetRuleInfo(): Array<{ expression: string; isValid: boolean; enabled: boolean }> {\n\t\tconst validExpressions = new Set(this.compiledRules.map((r) => r.expression));\n\n\t\treturn this.compiledRules.map((rule) => ({\n\t\t\texpression: rule.expression,\n\t\t\tisValid: validExpressions.has(rule.expression),\n\t\t\tenabled: rule.enabled,\n\t\t}));\n\t}\n}\n"]}
|
package/dist/file-operations.js
CHANGED
|
@@ -157,4 +157,4 @@ export const duplicateFileWithNewZettelId = (app, file, zettelIdProp) => __await
|
|
|
157
157
|
}
|
|
158
158
|
return newFile;
|
|
159
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=
|
|
160
|
+
//# sourceMappingURL=file-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-operations.js","sourceRoot":"","sources":["../src/file-operations.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { type App, Notice, TFile } from \"obsidian\";\nimport { extractFilePathFromLink } from \"./link-parser\";\n\nexport const fromRoot = (relativePath: string): string => {\n\treturn path.resolve(__dirname, `../../../${relativePath}`);\n};\n\nexport const getActiveFileOrThrow = (app: App): TFile => {\n\tconst activeFile: TFile | null = app.workspace.getActiveFile();\n\tif (!activeFile) {\n\t\tnew Notice(`⚠️ Open a note first.`);\n\t\tthrow new Error(`Open a note first.`);\n\t}\n\treturn activeFile;\n};\n\nexport const getTemplateContent = async (app: App, templatePath: string): Promise<string> => {\n\tconst templateFile = app.vault.getAbstractFileByPath(templatePath);\n\tif (!templateFile) {\n\t\tnew Notice(`❌ Template not found: ${templatePath}`);\n\t\tthrow new Error(`Template not found: ${templatePath}`);\n\t}\n\n\treturn await app.vault.read(templateFile as TFile);\n};\n\nexport const ensureFolderExists = async (app: App, folderPath: string): Promise<void> => {\n\tif (!app.vault.getAbstractFileByPath(folderPath)) {\n\t\tawait app.vault.createFolder(folderPath).catch(() => {});\n\t}\n};\n\nexport const openFileInNewLeaf = async (app: App, file: TFile): Promise<void> => {\n\tawait app.workspace.getLeaf(true).openFile(file);\n};\n\nexport const getNoteFilesFromDir = async (directoryPath: string): Promise<string[]> => {\n\tconst files = await fs.readdir(directoryPath);\n\tconst directoryName = path.basename(directoryPath);\n\n\treturn files.filter((file) => {\n\t\tif (!file.endsWith(\".md\")) return false;\n\n\t\tconst fileNameWithoutExt = path.parse(file).name;\n\t\tif (fileNameWithoutExt === directoryName) {\n\t\t\tconsole.log(`⏭️ Skipping directory-level file: ${file}`);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t});\n};\n\nexport const getTargetFileFromLink = (app: App, relationshipLink: string): TFile | null => {\n\tconst targetFilePath = extractFilePathFromLink(relationshipLink);\n\tif (!targetFilePath) {\n\t\tconsole.warn(`Failed to extract file path from link: ${relationshipLink}`);\n\t\treturn null;\n\t}\n\n\tconst targetFile = app.vault.getAbstractFileByPath(targetFilePath) as TFile;\n\tif (!targetFile) {\n\t\tconsole.warn(`Target file not found for link: ${relationshipLink}`);\n\t\treturn null;\n\t}\n\n\treturn targetFile;\n};\n\nexport const createFileLink = (file: TFile): string => {\n\tconst folder = file.parent?.path && file.parent.path !== \"/\" ? file.parent.path : \"\";\n\treturn folder ? `[[${folder}/${file.basename}|${file.basename}]]` : `[[${file.basename}]]`;\n};\n\nexport const normalizeArray = (value: string | string[] | undefined): string[] => {\n\tif (!value) {\n\t\treturn [];\n\t}\n\tif (typeof value === \"string\") {\n\t\treturn [value];\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn value;\n\t}\n\treturn [];\n};\n\nexport const arraysEqual = (a: string[], b: string[]): boolean => {\n\treturn a.length === b.length && a.every((val, index) => val === b[index]);\n};\n\n/**\n * Normalizes frontmatter content by converting quoted numeric _ZettelIDs to numbers.\n * This handles edge cases where YAML parsers treat numeric strings inconsistently.\n */\nexport const normalizeContent = (content: string): string => {\n\tlet normalized = content;\n\tlet hasChanges = false;\n\n\t// Normalize _ZettelID: \"string\" → number (remove quotes)\n\tconst zettelIdMatch = normalized.match(/^_ZettelID:\\s*\"(\\d+)\"/m);\n\tif (zettelIdMatch) {\n\t\tconst [fullMatch, numericId] = zettelIdMatch;\n\t\tconst replacement = `_ZettelID: ${numericId}`;\n\t\tnormalized = normalized.replace(fullMatch, replacement);\n\t\thasChanges = true;\n\t\tconsole.log(` ✅ _ZettelID: \"${numericId}\" → ${numericId}`);\n\t}\n\n\treturn hasChanges ? normalized : content;\n};\n\n/**\n * Safely performs a file operation with error handling and file validation.\n * Reduces boilerplate for common file operations.\n */\nexport const withFileOperation = async <T>(\n\tapp: App,\n\tevent: any,\n\toperation: (file: TFile) => Promise<T>,\n\terrorMessage: string = \"Operation failed\"\n): Promise<T | null> => {\n\ttry {\n\t\tconst filePath = event.extendedProps.filePath;\n\t\tconst file = app.vault.getAbstractFileByPath(filePath);\n\n\t\tif (!(file instanceof TFile)) {\n\t\t\tnew Notice(\"Could not find the file\");\n\t\t\treturn null;\n\t\t}\n\n\t\treturn await operation(file);\n\t} catch (error) {\n\t\tconsole.error(`Error in file operation:`, error);\n\t\tnew Notice(errorMessage);\n\t\treturn null;\n\t}\n};\n\n/**\n * Safely performs a file operation by file path with error handling and file validation.\n */\nexport const withFile = async <T>(\n\tapp: App,\n\tfilePath: string,\n\toperation: (file: TFile) => Promise<T>,\n\terrorMessage: string = \"Operation failed\"\n): Promise<T | null> => {\n\ttry {\n\t\tconst file = app.vault.getAbstractFileByPath(filePath);\n\n\t\tif (!(file instanceof TFile)) {\n\t\t\tnew Notice(\"Could not find the file\");\n\t\t\treturn null;\n\t\t}\n\n\t\treturn await operation(file);\n\t} catch (error) {\n\t\tconsole.error(`Error in file operation:`, error);\n\t\tnew Notice(errorMessage);\n\t\treturn null;\n\t}\n};\n\n/**\n * Duplicates a file with a new ZettelID, preserving the original content\n * but updating the ZettelID in frontmatter if configured.\n */\nexport const duplicateFileWithNewZettelId = async (\n\tapp: App,\n\tfile: TFile,\n\tzettelIdProp?: string\n): Promise<TFile> => {\n\tconst content = await app.vault.read(file);\n\tconst { generateZettelId } = await import(\"./generate\");\n\tconst { generateUniqueFilePath } = await import(\"./file-utils\");\n\n\tconst parentPath = file.parent?.path || \"\";\n\tconst baseNameWithoutZettel = file.basename.replace(/-\\d{14}$/, \"\");\n\tconst zettelId = generateZettelId();\n\tconst newBasename = `${baseNameWithoutZettel}-${zettelId}`;\n\tconst newFilePath = generateUniqueFilePath(app, parentPath, newBasename);\n\n\t// Create the new file with original content\n\tconst newFile = await app.vault.create(newFilePath, content);\n\n\t// Update the ZettelID in frontmatter if configured\n\tif (zettelIdProp) {\n\t\tawait app.fileManager.processFrontMatter(newFile, (fm) => {\n\t\t\tfm[zettelIdProp] = zettelId;\n\t\t});\n\t}\n\n\treturn newFile;\n};\n"]}
|
package/dist/file-utils.js
CHANGED
|
@@ -22,4 +22,4 @@ export const isFileInConfiguredDirectory = (filePath, directory) => {
|
|
|
22
22
|
const normalizedDir = directory.endsWith("/") ? directory.slice(0, -1) : directory;
|
|
23
23
|
return filePath.startsWith(`${normalizedDir}/`) || filePath === normalizedDir;
|
|
24
24
|
};
|
|
25
|
-
//# sourceMappingURL=
|
|
25
|
+
//# sourceMappingURL=file-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../src/file-utils.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACrC,GAAQ,EACR,MAAc,EACd,QAAgB,EAChB,YAAoB,IAAI,EACf,EAAE;IACX,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,IAAI,QAAQ,GAAG,GAAG,UAAU,GAAG,QAAQ,IAAI,SAAS,EAAE,CAAC;IACvD,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,OAAO,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClD,QAAQ,GAAG,GAAG,UAAU,GAAG,QAAQ,IAAI,OAAO,EAAE,IAAI,SAAS,EAAE,CAAC;IACjE,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAa,EAAU,EAAE;IAC5D,OAAO,KAAK;SACV,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,qCAAqC;SAClE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,8BAA8B;SACnD,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,uCAAuC;SAC3D,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,kCAAkC;SACxD,WAAW,EAAE,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAAgB,EAAU,EAAE;IAC/D,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,QAAgB,EAAE,SAAiB,EAAW,EAAE;IAC3F,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnF,OAAO,QAAQ,CAAC,UAAU,CAAC,GAAG,aAAa,GAAG,CAAC,IAAI,QAAQ,KAAK,aAAa,CAAC;AAC/E,CAAC,CAAC","sourcesContent":["import type { App } from \"obsidian\";\n\nexport const generateUniqueFilePath = (\n\tapp: App,\n\tfolder: string,\n\tbaseName: string,\n\textension: string = \"md\"\n): string => {\n\tconst folderPath = folder ? `${folder}/` : \"\";\n\tlet filePath = `${folderPath}${baseName}.${extension}`;\n\tlet counter = 1;\n\n\twhile (app.vault.getAbstractFileByPath(filePath)) {\n\t\tfilePath = `${folderPath}${baseName} ${counter++}.${extension}`;\n\t}\n\n\treturn filePath;\n};\n\nexport const sanitizeForFilename = (input: string): string => {\n\treturn input\n\t\t.replace(/[<>:\"/\\\\|?*]/g, \"\") // Remove invalid filename characters\n\t\t.replace(/\\s+/g, \"-\") // Replace spaces with hyphens\n\t\t.replace(/-+/g, \"-\") // Replace multiple hyphens with single\n\t\t.replace(/^-|-$/g, \"\") // Remove leading/trailing hyphens\n\t\t.toLowerCase();\n};\n\nexport const getFilenameFromPath = (filePath: string): string => {\n\treturn filePath.split(\"/\").pop() || \"Unknown\";\n};\n\nexport const isFileInConfiguredDirectory = (filePath: string, directory: string): boolean => {\n\tconst normalizedDir = directory.endsWith(\"/\") ? directory.slice(0, -1) : directory;\n\treturn filePath.startsWith(`${normalizedDir}/`) || filePath === normalizedDir;\n};\n"]}
|
package/dist/generate.js
CHANGED
|
@@ -10,4 +10,4 @@ export const generateTimestamps = () => {
|
|
|
10
10
|
const uniqueZettelId = generateZettelId();
|
|
11
11
|
return { startDate: formattedStartDate, zettelId: uniqueZettelId };
|
|
12
12
|
};
|
|
13
|
-
//# sourceMappingURL=
|
|
13
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAW,EAAE;IAC5C,MAAM,gBAAgB,GAAG,IAAI,IAAI,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACxE,OAAO,MAAM,CACZ,GAAG,gBAAgB,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,GAAG,WAAW,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,GAAG,WAAW,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC,GAAG,WAAW,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC,EAAE,CACjQ,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAkB,EAAE;IACrD,MAAM,WAAW,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAChF,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;IAE/B,MAAM,kBAAkB,GAAW,GAAG,WAAW,CAAC,WAAW,EAAE,IAAI,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;IACnJ,MAAM,cAAc,GAAW,gBAAgB,EAAE,CAAC;IAElD,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;AACpE,CAAC,CAAC","sourcesContent":["export interface TimestampData {\n\tstartDate: string;\n\tzettelId: number;\n}\n\nexport const generateZettelId = (): number => {\n\tconst currentTimestamp = new Date();\n\tconst padWithZero = (number: number) => String(number).padStart(2, \"0\");\n\treturn Number(\n\t\t`${currentTimestamp.getFullYear()}${padWithZero(currentTimestamp.getMonth() + 1)}${padWithZero(currentTimestamp.getDate())}${padWithZero(currentTimestamp.getHours())}${padWithZero(currentTimestamp.getMinutes())}${padWithZero(currentTimestamp.getSeconds())}`\n\t);\n};\n\nexport const generateTimestamps = (): TimestampData => {\n\tconst padWithZero = (number: number): string => String(number).padStart(2, \"0\");\n\tconst currentDate = new Date();\n\n\tconst formattedStartDate: string = `${currentDate.getFullYear()}-${padWithZero(currentDate.getMonth() + 1)}-${padWithZero(currentDate.getDate())}`;\n\tconst uniqueZettelId: number = generateZettelId();\n\n\treturn { startDate: formattedStartDate, zettelId: uniqueZettelId };\n};\n"]}
|
package/dist/index.js
CHANGED
|
@@ -11,4 +11,4 @@ export * from "./link-parser";
|
|
|
11
11
|
export * from "./settings-store";
|
|
12
12
|
export * from "./string-utils";
|
|
13
13
|
export * from "./templater-utils";
|
|
14
|
-
//# sourceMappingURL=
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","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","sourcesContent":["export * from \"./async-utils\";\nexport * from \"./batch-operations\";\nexport * from \"./child-reference-utils\";\nexport * from \"./date-recurrence-utils\";\nexport * from \"./date-utils\";\nexport * from \"./evaluator-base\";\nexport * from \"./file-operations\";\nexport * from \"./file-utils\";\nexport * from \"./generate\";\nexport * from \"./link-parser\";\nexport * from \"./settings-store\";\nexport * from \"./string-utils\";\nexport * from \"./templater-utils\";\n"]}
|
package/dist/link-parser.js
CHANGED
|
@@ -16,4 +16,4 @@ export const extractFilePathFromLink = (link) => {
|
|
|
16
16
|
return null;
|
|
17
17
|
return filePath.endsWith(".md") ? filePath : `${filePath}.md`;
|
|
18
18
|
};
|
|
19
|
-
//# sourceMappingURL=
|
|
19
|
+
//# sourceMappingURL=link-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-parser.js","sourceRoot":"","sources":["../src/link-parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,IAAY,EAAiB,EAAE;IACtE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpE,OAAO,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,CAAC;AAC/D,CAAC,CAAC","sourcesContent":["/**\n * Handles different link formats and edge cases:\n * [[FileName]] -> FileName.md\n * [[Folder/FileName]] -> Folder/FileName.md\n * [[Folder/FileName|DisplayName]] -> Folder/FileName.md\n * Normalizes paths and handles malformed links gracefully.\n */\nexport const extractFilePathFromLink = (link: string): string | null => {\n\tconst match = link.match(/\\[\\[([^|\\]]+?)(?:\\|.*?)?\\]\\]/);\n\tif (!match) return null;\n\n\tconst filePath = match[1].trim();\n\tif (!filePath) return null;\n\n\tif (filePath.includes(\"[[\") || filePath.includes(\"]]\")) return null;\n\n\treturn filePath.endsWith(\".md\") ? filePath : `${filePath}.md`;\n};\n"]}
|
package/dist/settings-store.js
CHANGED
|
@@ -76,4 +76,4 @@ export class SettingsStore {
|
|
|
76
76
|
return JSON.stringify(this.currentSettings) !== JSON.stringify(defaults);
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
|
-
//# sourceMappingURL=
|
|
79
|
+
//# sourceMappingURL=settings-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-store.js","sourceRoot":"","sources":["../src/settings-store.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Plugin } from \"obsidian\";\nimport { BehaviorSubject } from \"rxjs\";\nimport type { z } from \"zod\";\n\nexport class SettingsStore<TSchema extends z.ZodTypeAny> {\n\tprivate plugin: Plugin;\n\tprivate schema: TSchema;\n\tpublic readonly settings$: BehaviorSubject<z.infer<TSchema>>;\n\n\tconstructor(plugin: Plugin, schema: TSchema) {\n\t\tthis.plugin = plugin;\n\t\tthis.schema = schema;\n\t\tthis.settings$ = new BehaviorSubject<z.infer<TSchema>>(schema.parse({}));\n\t}\n\n\tget currentSettings(): z.infer<TSchema> {\n\t\treturn this.settings$.value;\n\t}\n\n\tasync loadSettings(): Promise<void> {\n\t\ttry {\n\t\t\tconst data = await this.plugin.loadData();\n\t\t\tconst sanitized = this.schema.parse(data ?? {});\n\t\t\tthis.settings$.next(sanitized);\n\n\t\t\t// Save back if data was sanitized/normalized\n\t\t\tif (JSON.stringify(sanitized) !== JSON.stringify(data ?? {})) {\n\t\t\t\tawait this.saveSettings();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to load settings, using defaults:\", error);\n\t\t\tthis.settings$.next(this.schema.parse({}));\n\t\t\tawait this.saveSettings();\n\t\t}\n\t}\n\n\tasync saveSettings(): Promise<void> {\n\t\tawait this.plugin.saveData(this.currentSettings);\n\t}\n\n\tasync updateSettings(updater: (settings: z.infer<TSchema>) => z.infer<TSchema>): Promise<void> {\n\t\ttry {\n\t\t\tconst newSettings = updater(this.currentSettings);\n\t\t\tconst validated = this.schema.parse(newSettings);\n\n\t\t\tthis.settings$.next(validated);\n\t\t\tawait this.saveSettings();\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to update settings:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync resetSettings(): Promise<void> {\n\t\tthis.settings$.next(this.schema.parse({}));\n\t\tawait this.saveSettings();\n\t}\n\n\tasync updateProperty<K extends keyof z.infer<TSchema>>(\n\t\tkey: K,\n\t\tvalue: z.infer<TSchema>[K]\n\t): Promise<void> {\n\t\tawait this.updateSettings((settings) => {\n\t\t\tconst updated = Object.assign({}, settings);\n\t\t\t(updated as any)[key] = value;\n\t\t\treturn updated;\n\t\t});\n\t}\n\n\tasync updateProperties(updates: Partial<z.infer<TSchema>>): Promise<void> {\n\t\tawait this.updateSettings((settings) => {\n\t\t\treturn Object.assign({}, settings, updates);\n\t\t});\n\t}\n\n\tgetDefaults(): z.infer<TSchema> {\n\t\treturn this.schema.parse({});\n\t}\n\n\thasCustomizations(): boolean {\n\t\tconst defaults = this.getDefaults();\n\t\treturn JSON.stringify(this.currentSettings) !== JSON.stringify(defaults);\n\t}\n}\n"]}
|
package/dist/string-utils.js
CHANGED
|
@@ -22,4 +22,4 @@ export const pluralize = (count) => {
|
|
|
22
22
|
export const getWeekDirection = (weeks) => {
|
|
23
23
|
return weeks > 0 ? "next" : "previous";
|
|
24
24
|
};
|
|
25
|
-
//# sourceMappingURL=
|
|
25
|
+
//# sourceMappingURL=string-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-utils.js","sourceRoot":"","sources":["../src/string-utils.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"]}
|
package/dist/templater-utils.js
CHANGED
|
@@ -48,4 +48,4 @@ export function createFromTemplate(app_1, templatePath_1, targetFolder_1, filena
|
|
|
48
48
|
}
|
|
49
49
|
});
|
|
50
50
|
}
|
|
51
|
-
//# sourceMappingURL=
|
|
51
|
+
//# sourceMappingURL=templater-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templater-utils.js","sourceRoot":"","sources":["../src/templater-utils.ts"],"names":[],"mappings":";AAAA,OAAO,EAAY,MAAM,EAAE,aAAa,EAAc,MAAM,UAAU,CAAC;AAEvE,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAa1C,SAAe,gBAAgB;yDAAC,GAAQ,EAAE,SAAS,GAAG,IAAI;;QACzD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QAE3E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,SAAS,EAAE,CAAC;YACzC,MAAM,IAAI,GAAQ,MAAA,MAAC,GAAW,CAAC,OAAO,0CAAE,SAAS,mDAAG,YAAY,CAAC,CAAC;YAClE,MAAM,GAAG,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,mCAAI,IAAI,CAAC;YAEpC,MAAM,QAAQ,GAAyB,MAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,6BAA6B,0CAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YACrF,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;gBACpC,OAAO,EAAE,6BAA6B,EAAE,QAAQ,EAAE,CAAC;YACpD,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;CAAA;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAQ;;IAC5C,MAAM,QAAQ,GAAG,MAAA,MAAC,GAAW,CAAC,OAAO,0CAAE,SAAS,mDAAG,YAAY,CAAC,CAAC;IACjE,OAAO,CAAC,CAAC,QAAQ,CAAC;AACnB,CAAC;AAED,MAAM,UAAgB,kBAAkB;yDACvC,GAAQ,EACR,YAAoB,EACpB,YAAqB,EACrB,QAAiB,EACjB,WAAW,GAAG,KAAK;QAEnB,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YACtE,IAAI,MAAM,CACT,0FAA0F,CAC1F,CAAC;YACF,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;QAC1E,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,uBAAuB,YAAY,EAAE,CAAC,CAAC;YACrD,IAAI,MAAM,CAAC,4BAA4B,YAAY,2CAA2C,CAAC,CAAC;YAChG,OAAO,IAAI,CAAC;QACb,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,6BAA6B,CAC5D,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,WAAW,CACX,CAAC;YAEF,OAAO,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,IAAI,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;YAC3D,IAAI,MAAM,CAAC,8EAA8E,CAAC,CAAC;YAC3F,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;CAAA","sourcesContent":["import { type App, Notice, normalizePath, type TFile } from \"obsidian\";\n\nconst TEMPLATER_ID = \"templater-obsidian\";\n\ntype CreateFn = (\n\ttemplateFile: TFile,\n\tfolder?: string,\n\tfilename?: string,\n\topenNewNote?: boolean\n) => Promise<TFile | undefined>;\n\ninterface TemplaterLike {\n\tcreate_new_note_from_template: CreateFn;\n}\n\nasync function waitForTemplater(app: App, timeoutMs = 8000): Promise<TemplaterLike | null> {\n\tawait new Promise<void>((resolve) => app.workspace.onLayoutReady(resolve));\n\n\tconst started = Date.now();\n\twhile (Date.now() - started < timeoutMs) {\n\t\tconst plug: any = (app as any).plugins?.getPlugin?.(TEMPLATER_ID);\n\t\tconst api = plug?.templater ?? null;\n\n\t\tconst createFn: CreateFn | undefined = api?.create_new_note_from_template?.bind(api);\n\t\tif (typeof createFn === \"function\") {\n\t\t\treturn { create_new_note_from_template: createFn };\n\t\t}\n\t\tawait new Promise((r) => setTimeout(r, 150));\n\t}\n\treturn null;\n}\n\nexport function isTemplaterAvailable(app: App): boolean {\n\tconst instance = (app as any).plugins?.getPlugin?.(TEMPLATER_ID);\n\treturn !!instance;\n}\n\nexport async function createFromTemplate(\n\tapp: App,\n\ttemplatePath: string,\n\ttargetFolder?: string,\n\tfilename?: string,\n\topenNewNote = false\n): Promise<TFile | null> {\n\tconst templater = await waitForTemplater(app);\n\tif (!templater) {\n\t\tconsole.warn(\"Templater isn't ready yet (or not installed/enabled).\");\n\t\tnew Notice(\n\t\t\t\"Templater plugin is not available or enabled. Please ensure it is installed and enabled.\"\n\t\t);\n\t\treturn null;\n\t}\n\n\tconst templateFile = app.vault.getFileByPath(normalizePath(templatePath));\n\tif (!templateFile) {\n\t\tconsole.error(`Template not found: ${templatePath}`);\n\t\tnew Notice(`Template file not found: ${templatePath}. Please ensure the template file exists.`);\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst newFile = await templater.create_new_note_from_template(\n\t\t\ttemplateFile,\n\t\t\ttargetFolder,\n\t\t\tfilename,\n\t\t\topenNewNote\n\t\t);\n\n\t\treturn newFile ?? null;\n\t} catch (error) {\n\t\tconsole.error(\"Error creating file from template:\", error);\n\t\tnew Notice(\"Error creating file from template. Please ensure the template file is valid.\");\n\t\treturn null;\n\t}\n}\n"]}
|
package/dist/testing/index.js
CHANGED
|
@@ -3,4 +3,4 @@ export * from "./mocks/obsidian";
|
|
|
3
3
|
export { createMockApp, createMockFile, createMockFileCache, Modal, Notice, Plugin, PluginSettingTab, Setting, TFile, } from "./mocks/obsidian";
|
|
4
4
|
export * from "./mocks/utils";
|
|
5
5
|
export { mockFileOperations, mockLinkParser, resetAllMocks, setupDefaultMockImplementations, setupMockImplementation, setupMockReturnValue, verifyMockCalls, } from "./mocks/utils";
|
|
6
|
-
//# sourceMappingURL=
|
|
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"]}
|
|
@@ -217,4 +217,4 @@ export function createMockFileCache(frontmatter) {
|
|
|
217
217
|
listItems: [],
|
|
218
218
|
};
|
|
219
219
|
}
|
|
220
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzaWRpYW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9tb2Nrcy9vYnNpZGlhbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRTVCLHlCQUF5QjtBQUN6QixNQUFNLE9BQU8sTUFBTTtJQUtsQixZQUFZLEdBQVEsRUFBRSxRQUFhO1FBS25DLHNCQUFzQjtRQUN0QixrQkFBYSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN4QixrQkFBYSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN4QixhQUFRLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLGFBQVEsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEQsV0FBTSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNqQixhQUFRLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBRW5CLGFBQWE7UUFDYixrQkFBYSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN4QixxQkFBZ0IsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDM0IsZUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyQixrQkFBYSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUV4QixnQkFBZ0I7UUFDaEIscUJBQWdCLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzNCLHVCQUFrQixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM3Qiw0QkFBdUIsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDbEMsa0NBQTZCLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxD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LElBQUksT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFFBQVEsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsSUFBSSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsU0FBUyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO0lBQ3BDLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNiLENBQUM7QUFFRCxtQ0FBbUM7QUFDbkMsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFdBQWlDO0lBQ3BFLE9BQU87UUFDTixXQUFXLEVBQUUsV0FBVyxJQUFJLEVBQUU7UUFDOUIsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUNsRixRQUFRLEVBQUUsRUFBRTtRQUNaLFFBQVEsRUFBRSxFQUFFO1FBQ1osS0FBSyxFQUFFLEVBQUU7UUFDVCxNQUFNLEVBQUUsRUFBRTtRQUNWLElBQUksRUFBRSxFQUFFO1FBQ1IsU0FBUyxFQUFFLEVBQUU7S0FDYixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHZpIH0gZnJvbSBcInZpdGVzdFwiO1xuXG4vLyBCYXNlIFBsdWdpbiBjbGFzcyBtb2NrXG5leHBvcnQgY2xhc3MgUGx1Z2luIHtcblx0YXBwOiBhbnk7XG5cdG1hbmlmZXN0OiBhbnk7XG5cdHNldHRpbmdzOiBhbnk7XG5cblx0Y29uc3RydWN0b3IoYXBwOiBhbnksIG1hbmlmZXN0OiBhbnkpIHtcblx0XHR0aGlzLmFwcCA9IGFwcDtcblx0XHR0aGlzLm1hbmlmZXN0ID0gbWFuaWZlc3Q7XG5cdH1cblxuXHQvLyBDb3JlIHBsdWdpbiBtZXRob2RzXG5cdGFkZFNldHRpbmdUYWIgPSB2aS5mbigpO1xuXHRyZWdpc3RlckV2ZW50ID0gdmkuZm4oKTtcblx0bG9hZERhdGEgPSB2aS5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHt9KTtcblx0c2F2ZURhdGEgPSB2aS5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCk7XG5cdG9ubG9hZCA9IHZpLmZuKCk7XG5cdG9udW5sb2FkID0gdmkuZm4oKTtcblxuXHQvLyBVSSBtZXRob2RzXG5cdGFkZFJpYmJvbkljb24gPSB2aS5mbigpO1xuXHRhZGRTdGF0dXNCYXJJdGVtID0gdmkuZm4oKTtcblx0YWRkQ29tbWFuZCA9IHZpLmZuKCk7XG5cdHJlbW92ZUNvbW1hbmQgPSB2aS5mbigpO1xuXG5cdC8vIEV2ZW50IG1ldGhvZHNcblx0cmVnaXN0ZXJEb21FdmVudCA9IHZpLmZuKCk7XG5cdHJlZ2lzdGVyQ29kZU1pcnJvciA9IHZpLmZuKCk7XG5cdHJlZ2lzdGVyRWRpdG9yRXh0ZW5zaW9uID0gdmkuZm4oKTtcblx0cmVnaXN0ZXJNYXJrZG93blBvc3RQcm9jZXNzb3IgPSB2aS5mbigpO1xuXHRyZWdpc3Rlck1hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yID0gdmkuZm4oKTtcblx0cmVnaXN0ZXJPYnNpZGlhblByb3RvY29sSGFuZGxlciA9IHZpLmZuKCk7XG5cdHJlZ2lzdGVyRWRpdG9yU3VnZ2VzdCA9IHZpLmZuKCk7XG5cdHJlZ2lzdGVySG92ZXJMaW5rU291cmNlID0gdmkuZm4oKTtcblxuXHQvLyBJbnRlcnZhbCBtZXRob2RzXG5cdHJlZ2lzdGVySW50ZXJ2YWwgPSB2aS5mbigpO1xuXG5cdC8vIFZpZXcgYW5kIGV4dGVuc2lvbiBtZXRob2RzXG5cdHJlZ2lzdGVyVmlldyA9IHZpLmZuKCk7XG5cdHJlZ2lzdGVyRXh0ZW5zaW9ucyA9IHZpLmZuKCk7XG5cblx0Ly8gTGlmZWN5Y2xlIG1ldGhvZHNcblx0b25Vc2VyRW5hYmxlID0gdmkuZm4oKTtcblx0bG9hZCA9IHZpLmZuKCk7XG5cdHVubG9hZCA9IHZpLmZuKCk7XG5cblx0Ly8gT3RoZXIgbWV0aG9kc1xuXHRhZGRDaGlsZCA9IHZpLmZuKCk7XG5cdHJlbW92ZUNoaWxkID0gdmkuZm4oKTtcblx0cmVnaXN0ZXIgPSB2aS5mbigpO1xufVxuXG4vLyBQbHVnaW5TZXR0aW5nVGFiIG1vY2tcbmV4cG9ydCBjbGFzcyBQbHVnaW5TZXR0aW5nVGFiIHtcblx0YXBwOiBhbnk7XG5cdHBsdWdpbjogYW55O1xuXHRjb250YWluZXJFbDogSFRNTEVsZW1lbnQ7XG5cblx0Y29uc3RydWN0b3IoYXBwOiBhbnksIHBsdWdpbjogYW55KSB7XG5cdFx0dGhpcy5hcHAgPSBhcHA7XG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XG5cdFx0dGhpcy5jb250YWluZXJFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdH1cblxuXHRkaXNwbGF5ID0gdmkuZm4oKTtcbn1cblxuLy8gSXRlbVZpZXcgbW9ja1xuZXhwb3J0IGNsYXNzIEl0ZW1WaWV3IHtcblx0YXBwOiBhbnk7XG5cdGxlYWY6IGFueTtcblx0Y29udGFpbmVyRWw6IEhUTUxFbGVtZW50O1xuXG5cdGNvbnN0cnVjdG9yKGxlYWY6IGFueSkge1xuXHRcdHRoaXMubGVhZiA9IGxlYWY7XG5cdFx0dGhpcy5hcHAgPSBsZWFmPy5hcHA7XG5cdFx0dGhpcy5jb250YWluZXJFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdH1cblxuXHQvLyBEb24ndCBvdmVycmlkZSBvbk9wZW4vb25DbG9zZSAtIGxldCBzdWJjbGFzc2VzIGltcGxlbWVudCB0aGVtXG5cdC8vIFRoZXNlIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkIGJ5IE1vdW50YWJsZVZpZXcgbWl4aW5cblxuXHQvLyBEb24ndCBwcm92aWRlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciB0aGVzZSBtZXRob2RzXG5cdC8vIExldCBzdWJjbGFzc2VzIGltcGxlbWVudCB0aGVtXG5cdGdldFZpZXdUeXBlKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIFwibW9jay12aWV3XCI7XG5cdH1cblxuXHRnZXREaXNwbGF5VGV4dCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiBcIk1vY2sgVmlld1wiO1xuXHR9XG5cblx0Z2V0SWNvbigpOiBzdHJpbmcge1xuXHRcdHJldHVybiBcIm1vY2staWNvblwiO1xuXHR9XG5cblx0Z2V0U3RhdGUgPSB2aS5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7fSk7XG5cdHNldFN0YXRlID0gdmkuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh1bmRlZmluZWQpO1xufVxuXG4vLyBTZXR0aW5nIGNvbXBvbmVudCBtb2NrXG5leHBvcnQgY2xhc3MgU2V0dGluZyB7XG5cdHNldHRpbmdFbDogSFRNTEVsZW1lbnQ7XG5cdG5hbWVFbDogSFRNTEVsZW1lbnQ7XG5cdGRlc2NFbDogSFRNTEVsZW1lbnQ7XG5cdGNvbnRyb2xFbDogSFRNTEVsZW1lbnQ7XG5cblx0Y29uc3RydWN0b3IoX2NvbnRhaW5lckVsOiBIVE1MRWxlbWVudCkge1xuXHRcdHRoaXMuc2V0dGluZ0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHR0aGlzLm5hbWVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0dGhpcy5kZXNjRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdHRoaXMuY29udHJvbEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0fVxuXG5cdHNldE5hbWUgPSB2aS5mbigpLm1vY2tSZXR1cm5UaGlzKCk7XG5cdHNldERlc2MgPSB2aS5mbigpLm1vY2tSZXR1cm5UaGlzKCk7XG5cdGFkZFRleHQgPSB2aS5mbigpLm1vY2tSZXR1cm5UaGlzKCk7XG5cdGFkZFRleHRBcmVhID0gdmkuZm4oKS5tb2NrUmV0dXJuVGhpcygpO1xufVxuXG4vLyBURm9sZGVyIG1vY2tcbmV4cG9ydCBjbGFzcyBURm9sZGVyIHtcblx0cGF0aDogc3RyaW5nO1xuXHRuYW1lOiBzdHJpbmc7XG5cdGNoaWxkcmVuOiBhbnlbXTtcblx0dmF1bHQ6IGFueTtcblx0cGFyZW50OiBURm9sZGVyIHwgbnVsbDtcblxuXHRjb25zdHJ1Y3RvcihwYXRoOiBzdHJpbmcpIHtcblx0XHR0aGlzLnBhdGggPSBwYXRoO1xuXHRcdHRoaXMubmFtZSA9IHBhdGguc3BsaXQoXCIvXCIpLnBvcCgpIHx8IFwiXCI7XG5cdFx0dGhpcy5jaGlsZHJlbiA9IFtdO1xuXHRcdHRoaXMudmF1bHQgPSB7fTtcblx0XHR0aGlzLnBhcmVudCA9IG51bGw7XG5cdH1cblxuXHRpc1Jvb3QoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMucGF0aCA9PT0gXCJcIiB8fCB0aGlzLnBhdGggPT09IFwiL1wiO1xuXHR9XG59XG5cbi8vIFRGaWxlIG1vY2sgd2l0aCBmdWxsIGludGVyZmFjZVxuZXhwb3J0IGNsYXNzIFRGaWxlIHtcblx0cGF0aDogc3RyaW5nO1xuXHRuYW1lOiBzdHJpbmc7XG5cdGJhc2VuYW1lOiBzdHJpbmc7XG5cdGV4dGVuc2lvbjogc3RyaW5nO1xuXHRzdGF0OiBhbnk7XG5cdHZhdWx0OiBhbnk7XG5cdHBhcmVudDogVEZvbGRlciB8IG51bGw7XG5cblx0Y29uc3RydWN0b3IocGF0aDogc3RyaW5nLCBwYXJlbnRQYXRoPzogc3RyaW5nKSB7XG5cdFx0dGhpcy5wYXRoID0gcGF0aDtcblx0XHR0aGlzLm5hbWUgPSBwYXRoLnNwbGl0KFwiL1wiKS5wb3AoKSB8fCBcIlwiO1xuXHRcdHRoaXMuYmFzZW5hbWUgPSB0aGlzLm5hbWUucmVwbGFjZSgvXFwuW14vLl0rJC8sIFwiXCIpOyAvLyBSZW1vdmUgZXh0ZW5zaW9uXG5cdFx0dGhpcy5leHRlbnNpb24gPSBwYXRoLnNwbGl0KFwiLlwiKS5wb3AoKSB8fCBcIm1kXCI7XG5cdFx0dGhpcy5zdGF0ID0ge307XG5cdFx0dGhpcy52YXVsdCA9IHt9O1xuXG5cdFx0Ly8gU2V0IHBhcmVudCBiYXNlZCBvbiBwYXRoIG9yIGV4cGxpY2l0IHBhcmVudFBhdGhcblx0XHRpZiAocGFyZW50UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLnBhcmVudCA9IHBhcmVudFBhdGggPyBuZXcgVEZvbGRlcihwYXJlbnRQYXRoKSA6IG51bGw7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIERlcml2ZSBwYXJlbnQgZnJvbSBwYXRoXG5cdFx0XHRjb25zdCBsYXN0U2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcblx0XHRcdGlmIChsYXN0U2xhc2ggPiAwKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50ID0gbmV3IFRGb2xkZXIocGF0aC5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnBhcmVudCA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8vIE1vZGFsIG1vY2tcbmV4cG9ydCBjbGFzcyBNb2RhbCB7XG5cdGFwcDogYW55O1xuXHRjb250YWluZXJFbDogSFRNTEVsZW1lbnQ7XG5cdHRpdGxlRWw6IEhUTUxFbGVtZW50O1xuXHRjb250ZW50RWw6IEhUTUxFbGVtZW50O1xuXG5cdGNvbnN0cnVjdG9yKGFwcDogYW55KSB7XG5cdFx0dGhpcy5hcHAgPSBhcHA7XG5cdFx0dGhpcy5jb250YWluZXJFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0dGhpcy50aXRsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHR0aGlzLmNvbnRlbnRFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdH1cblxuXHRvcGVuID0gdmkuZm4oKTtcblx0Y2xvc2UgPSB2aS5mbigpO1xuXHRvbk9wZW4gPSB2aS5mbigpO1xuXHRvbkNsb3NlID0gdmkuZm4oKTtcbn1cblxuLy8gTm90aWNlIG1vY2tcbmV4cG9ydCBjbGFzcyBOb3RpY2Uge1xuXHRjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcblx0XHRjb25zb2xlLmxvZyhgTm90aWNlOiAke21lc3NhZ2V9YCk7XG5cdH1cbn1cblxuLy8gTWFya2Rvd25SZW5kZXJlciBtb2NrXG5leHBvcnQgY29uc3QgTWFya2Rvd25SZW5kZXJlciA9IHtcblx0cmVuZGVyOiB2aS5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCksXG59O1xuXG4vLyBEZWJvdW5jZSBmdW5jdGlvbiBtb2NrXG5leHBvcnQgZnVuY3Rpb24gZGVib3VuY2U8VCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55Pihcblx0ZnVuYzogVCxcblx0d2FpdDogbnVtYmVyLFxuXHRpbW1lZGlhdGU/OiBib29sZWFuXG4pOiBUIHtcblx0bGV0IHRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG5cblx0cmV0dXJuICgoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4ge1xuXHRcdGNvbnN0IGxhdGVyID0gKCkgPT4ge1xuXHRcdFx0dGltZW91dCA9IG51bGw7XG5cdFx0XHRpZiAoIWltbWVkaWF0ZSkgZnVuYyguLi5hcmdzKTtcblx0XHR9O1xuXG5cdFx0Y29uc3QgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiAhdGltZW91dDtcblxuXHRcdGlmICh0aW1lb3V0ICE9PSBudWxsKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGltZW91dCk7XG5cdFx0fVxuXG5cdFx0dGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuXG5cdFx0aWYgKGNhbGxOb3cpIGZ1bmMoLi4uYXJncyk7XG5cdH0pIGFzIFQ7XG59XG5cbi8vIEFwcCBtb2NrXG5leHBvcnQgY29uc3QgQXBwID0gdmkuZm4oKTtcblxuLy8gTW9jayBpbnRlcmZhY2VzIGZvciBUeXBlU2NyaXB0XG5leHBvcnQgaW50ZXJmYWNlIE1vY2tBcHAge1xuXHRmaWxlTWFuYWdlcjoge1xuXHRcdHByb2Nlc3NGcm9udE1hdHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgdmkuZm4+O1xuXHR9O1xuXHRtZXRhZGF0YUNhY2hlOiB7XG5cdFx0Z2V0RmlsZUNhY2hlOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj47XG5cdH07XG5cdHZhdWx0OiB7XG5cdFx0Z2V0QWJzdHJhY3RGaWxlQnlQYXRoOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj47XG5cdFx0b246IFJldHVyblR5cGU8dHlwZW9mIHZpLmZuPjtcblx0XHRyZWFkOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj47XG5cdFx0bW9kaWZ5OiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj47XG5cdFx0Y3JlYXRlOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj47XG5cdFx0ZGVsZXRlOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj47XG5cdFx0cmVuYW1lOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj47XG5cdFx0Z2V0RmlsZXM6IFJldHVyblR5cGU8dHlwZW9mIHZpLmZuPjtcblx0XHRnZXRNYXJrZG93bkZpbGVzOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj47XG5cdFx0Z2V0Rm9sZGVyQnlQYXRoOiBSZXR1cm5UeXBlPHR5cGVvZiB2aS5mbj47XG5cdH07XG5cdHdvcmtzcGFjZToge1xuXHRcdGdldEFjdGl2ZUZpbGU6IFJldHVyblR5cGU8dHlwZW9mIHZpLmZuPjtcblx0XHRvbjogUmV0dXJuVHlwZTx0eXBlb2YgdmkuZm4+O1xuXHR9O1xufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgZnVsbHkgbW9ja2VkIGFwcFxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tBcHAoKTogTW9ja0FwcCB7XG5cdHJldHVybiB7XG5cdFx0ZmlsZU1hbmFnZXI6IHtcblx0XHRcdHByb2Nlc3NGcm9udE1hdHRlcjogdmkuZm4oKSxcblx0XHR9LFxuXHRcdG1ldGFkYXRhQ2FjaGU6IHtcblx0XHRcdGdldEZpbGVDYWNoZTogdmkuZm4oKSxcblx0XHR9LFxuXHRcdHZhdWx0OiB7XG5cdFx0XHRnZXRBYnN0cmFjdEZpbGVCeVBhdGg6IHZpLmZuKCksXG5cdFx0XHRvbjogdmkuZm4oKSxcblx0XHRcdHJlYWQ6IHZpLmZuKCksXG5cdFx0XHRtb2RpZnk6IHZpLmZuKCksXG5cdFx0XHRjcmVhdGU6IHZpLmZuKCksXG5cdFx0XHRkZWxldGU6IHZpLmZuKCksXG5cdFx0XHRyZW5hbWU6IHZpLmZuKCksXG5cdFx0XHRnZXRGaWxlczogdmkuZm4oKS5tb2NrUmV0dXJuVmFsdWUoW10pLFxuXHRcdFx0Z2V0TWFya2Rvd25GaWxlczogdmkuZm4oKS5tb2NrUmV0dXJuVmFsdWUoW10pLFxuXHRcdFx0Z2V0Rm9sZGVyQnlQYXRoOiB2aS5mbigpLFxuXHRcdH0sXG5cdFx0d29ya3NwYWNlOiB7XG5cdFx0XHRnZXRBY3RpdmVGaWxlOiB2aS5mbigpLFxuXHRcdFx0b246IHZpLmZuKCksXG5cdFx0fSxcblx0fTtcbn1cblxuLy8gSGVscGVyIHRvIGNyZWF0ZSBtb2NrIFRGaWxlIGluc3RhbmNlc1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tGaWxlKFxuXHRwYXRoOiBzdHJpbmcsXG5cdG9wdGlvbnM/OiB7XG5cdFx0YmFzZW5hbWU/OiBzdHJpbmc7XG5cdFx0cGFyZW50UGF0aD86IHN0cmluZztcblx0XHRleHRlbnNpb24/OiBzdHJpbmc7XG5cdH1cbik6IFRGaWxlIHtcblx0Y29uc3QgZmlsZSA9IG5ldyBURmlsZShwYXRoLCBvcHRpb25zPy5wYXJlbnRQYXRoKTtcblx0aWYgKG9wdGlvbnM/LmJhc2VuYW1lKSB7XG5cdFx0ZmlsZS5iYXNlbmFtZSA9IG9wdGlvbnMuYmFzZW5hbWU7XG5cdH1cblx0aWYgKG9wdGlvbnM/LmV4dGVuc2lvbikge1xuXHRcdGZpbGUuZXh0ZW5zaW9uID0gb3B0aW9ucy5leHRlbnNpb247XG5cdH1cblx0cmV0dXJuIGZpbGU7XG59XG5cbi8vIEhlbHBlciB0byBjcmVhdGUgbW9jayBmaWxlIGNhY2hlXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0ZpbGVDYWNoZShmcm9udG1hdHRlcj86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcblx0cmV0dXJuIHtcblx0XHRmcm9udG1hdHRlcjogZnJvbnRtYXR0ZXIgfHwge30sXG5cdFx0ZnJvbnRtYXR0ZXJQb3NpdGlvbjogZnJvbnRtYXR0ZXIgPyB7IHN0YXJ0OiB7IGxpbmU6IDAgfSwgZW5kOiB7IGxpbmU6IDMgfSB9IDogbnVsbCxcblx0XHRzZWN0aW9uczogW10sXG5cdFx0aGVhZGluZ3M6IFtdLFxuXHRcdGxpbmtzOiBbXSxcblx0XHRlbWJlZHM6IFtdLFxuXHRcdHRhZ3M6IFtdLFxuXHRcdGxpc3RJdGVtczogW10sXG5cdH07XG59XG4iXX0=
|
|
220
|
+
//# 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// 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"]}
|
|
@@ -82,4 +82,4 @@ export function verifyMockCalls(mockName, expectedCalls) {
|
|
|
82
82
|
expect(mock).toHaveBeenNthCalledWith(index + 1, ...args);
|
|
83
83
|
});
|
|
84
84
|
}
|
|
85
|
-
//# sourceMappingURL=
|
|
85
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/testing/mocks/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEpC,wBAAwB;AACxB,MAAM,CAAC,MAAM,kBAAkB,GAAG;IACjC,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;IACpB,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;IACvB,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;CACvB,CAAC;AAEF,oBAAoB;AACpB,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,uBAAuB,EAAE,EAAE,CAAC,EAAE,EAAE;CAChC,CAAC;AAEF,8DAA8D;AAC9D,MAAM,UAAU,+BAA+B;IAC9C,+BAA+B;IAC/B,kBAAkB,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,GAAG,EAAE,EAAE,CAC5D,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAC3C,CAAC;IAEF,kBAAkB,CAAC,WAAW,CAAC,kBAAkB,CAChD,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CACjD,CAAC;IAEF,kBAAkB,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;;QAC7D,IAAI,CAAC,IAAI;YAAE,OAAO,kBAAkB,CAAC;QAErC,MAAM,QAAQ,GACb,IAAI,CAAC,QAAQ;aACb,MAAA,MAAA,IAAI,CAAC,IAAI,0CACN,KAAK,CAAC,GAAG,EACV,GAAG,EAAE,0CACJ,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;YAC3B,EAAE,CAAC;QACJ,MAAM,UAAU,GAAG,MAAA,IAAI,CAAC,MAAM,0CAAE,IAAI,CAAC;QAErC,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;YAC5D,OAAO,KAAK,QAAQ,IAAI,CAAC;QAC1B,CAAC;QAED,OAAO,KAAK,UAAU,IAAI,QAAQ,IAAI,QAAQ,IAAI,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,2BAA2B;IAC3B,cAAc,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;QAClE,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAEnD,mCAAmC;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACjD,IAAI,SAAS,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC7B,iCAAiC;YACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAE3B,mCAAmC;YACnC,OAAO,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,CAAC;QAC/D,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,kBAAkB;AAClB,MAAM,UAAU,aAAa;IAC5B,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAClD,IAAI,CAAC,SAAS,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,uBAAuB,CACtC,QAAuE,EACvE,cAAuC;IAEvC,IAAI,QAAQ,IAAI,kBAAkB,EAAE,CAAC;QACnC,kBAA0B,CAAC,QAAQ,CAAC,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;IAC1E,CAAC;SAAM,IAAI,QAAQ,IAAI,cAAc,EAAE,CAAC;QACtC,cAAsB,CAAC,QAAQ,CAAC,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;IACtE,CAAC;AACF,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,oBAAoB,CACnC,QAAuE,EACvE,KAAU;IAEV,IAAI,QAAQ,IAAI,kBAAkB,EAAE,CAAC;QACnC,kBAA0B,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC;SAAM,IAAI,QAAQ,IAAI,cAAc,EAAE,CAAC;QACtC,cAAsB,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC;AACF,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU,eAAe,CAC9B,QAAuE,EACvE,aAAsB;IAEtB,MAAM,IAAI,GACT,QAAQ,IAAI,kBAAkB;QAC7B,CAAC,CAAE,kBAA0B,CAAC,QAAQ,CAAC;QACvC,CAAC,CAAE,cAAsB,CAAC,QAAQ,CAAC,CAAC;IAEtC,MAAM,CAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACzD,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACrC,MAAM,CAAC,IAAI,CAAC,CAAC,uBAAuB,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import { expect, vi } from \"vitest\";\n\n// File operations mocks\nexport const mockFileOperations = {\n\tarraysEqual: vi.fn(),\n\tnormalizeArray: vi.fn(),\n\tcreateFileLink: vi.fn(),\n};\n\n// Link parser mocks\nexport const mockLinkParser = {\n\textractFilePathFromLink: vi.fn(),\n};\n\n// Default mock implementations that match the actual behavior\nexport function setupDefaultMockImplementations() {\n\t// Set up file operations mocks\n\tmockFileOperations.normalizeArray.mockImplementation((arr) =>\n\t\tArray.isArray(arr) ? arr : arr ? [arr] : []\n\t);\n\n\tmockFileOperations.arraysEqual.mockImplementation(\n\t\t(a, b) => JSON.stringify(a) === JSON.stringify(b)\n\t);\n\n\tmockFileOperations.createFileLink.mockImplementation((file) => {\n\t\tif (!file) return \"[[Unknown File]]\";\n\n\t\tconst basename =\n\t\t\tfile.basename ||\n\t\t\tfile.path\n\t\t\t\t?.split(\"/\")\n\t\t\t\t.pop()\n\t\t\t\t?.replace(/\\.[^/.]+$/, \"\") ||\n\t\t\t\"\";\n\t\tconst parentPath = file.parent?.path;\n\n\t\tif (!parentPath || parentPath === \"/\" || parentPath === \"\") {\n\t\t\treturn `[[${basename}]]`;\n\t\t}\n\n\t\treturn `[[${parentPath}/${basename}|${basename}]]`;\n\t});\n\n\t// Set up link parser mocks\n\tmockLinkParser.extractFilePathFromLink.mockImplementation((link) => {\n\t\tif (!link || typeof link !== \"string\") return null;\n\n\t\t// Handle text that contains a link\n\t\tconst linkMatch = link.match(/\\[\\[([^\\]]+)\\]\\]/);\n\t\tif (linkMatch) {\n\t\t\tconst content = linkMatch[1];\n\t\t\t// Remove display name if present\n\t\t\tconst filePart = content.split(\"|\")[0].trim();\n\t\t\tif (!filePart) return null;\n\n\t\t\t// Add .md extension if not present\n\t\t\treturn filePart.endsWith(\".md\") ? filePart : `${filePart}.md`;\n\t\t}\n\n\t\treturn null;\n\t});\n}\n\n// Reset all mocks\nexport function resetAllMocks() {\n\tObject.values(mockFileOperations).forEach((mock) => {\n\t\tmock.mockReset();\n\t});\n\tObject.values(mockLinkParser).forEach((mock) => {\n\t\tmock.mockReset();\n\t});\n}\n\n// Helper to setup mocks with specific implementations\nexport function setupMockImplementation(\n\tmockName: keyof typeof mockFileOperations | keyof typeof mockLinkParser,\n\timplementation: (...args: any[]) => any\n) {\n\tif (mockName in mockFileOperations) {\n\t\t(mockFileOperations as any)[mockName].mockImplementation(implementation);\n\t} else if (mockName in mockLinkParser) {\n\t\t(mockLinkParser as any)[mockName].mockImplementation(implementation);\n\t}\n}\n\n// Helper to setup mock return values\nexport function setupMockReturnValue(\n\tmockName: keyof typeof mockFileOperations | keyof typeof mockLinkParser,\n\tvalue: any\n) {\n\tif (mockName in mockFileOperations) {\n\t\t(mockFileOperations as any)[mockName].mockReturnValue(value);\n\t} else if (mockName in mockLinkParser) {\n\t\t(mockLinkParser as any)[mockName].mockReturnValue(value);\n\t}\n}\n\n// Helper to verify mock calls\nexport function verifyMockCalls(\n\tmockName: keyof typeof mockFileOperations | keyof typeof mockLinkParser,\n\texpectedCalls: any[][]\n) {\n\tconst mock =\n\t\tmockName in mockFileOperations\n\t\t\t? (mockFileOperations as any)[mockName]\n\t\t\t: (mockLinkParser as any)[mockName];\n\n\texpect(mock).toHaveBeenCalledTimes(expectedCalls.length);\n\texpectedCalls.forEach((args, index) => {\n\t\texpect(mock).toHaveBeenNthCalledWith(index + 1, ...args);\n\t});\n}\n"]}
|
package/dist/testing/setup.js
CHANGED
|
@@ -15,4 +15,4 @@ export function setupTestEnvironment() {
|
|
|
15
15
|
vi.clearAllMocks();
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
|
-
//# sourceMappingURL=
|
|
18
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/testing/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEnE,4DAA4D;AAC5D,MAAM,UAAU,oBAAoB;IACnC,yBAAyB;IACzB,EAAE,CAAC,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC;IAC7E,EAAE,CAAC,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC;IAErE,sCAAsC;IACtC,EAAE,CAAC,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE,CAAC,CAAC;QAChD,+BAA+B,EAAE,MAAM,cAAc;SAAG;KACxD,CAAC,CAAC,CAAC;IAEJ,0BAA0B;IAC1B,OAAO,GAAG,EAAE;QACX,EAAE,CAAC,aAAa,EAAE,CAAC;IACpB,CAAC,CAAC;AACH,CAAC","sourcesContent":["import { vi } from \"vitest\";\nimport { mockFileOperations, mockLinkParser } from \"./mocks/utils\";\n\n// Global test setup that can be imported once per test file\nexport function setupTestEnvironment() {\n\t// Mock the utils modules\n\tvi.mock(\"@obsidian-plugins/utils/file-operations\", () => mockFileOperations);\n\tvi.mock(\"@obsidian-plugins/utils/link-parser\", () => mockLinkParser);\n\n\t// Mock any plugin-specific components\n\tvi.mock(\"../src/components/settings-tab\", () => ({\n\t\tTreePropertiesManagerSettingTab: class MockSettingTab {},\n\t}));\n\n\t// Return cleanup function\n\treturn () => {\n\t\tvi.clearAllMocks();\n\t};\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@real1ty-obsidian-plugins/utils",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"description": "Shared utilities for Obsidian plugins",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -20,7 +20,10 @@
|
|
|
20
20
|
}
|
|
21
21
|
},
|
|
22
22
|
"files": [
|
|
23
|
-
"dist
|
|
23
|
+
"dist/**/*.js",
|
|
24
|
+
"dist/**/*.d.ts",
|
|
25
|
+
"dist/**/*.js.map",
|
|
26
|
+
"dist/**/*.d.ts.map",
|
|
24
27
|
"README.md",
|
|
25
28
|
"LICENSE"
|
|
26
29
|
],
|