@real1ty-obsidian-plugins/utils 2.2.3 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -9
- package/dist/{async-utils.d.ts → async/async.d.ts} +1 -1
- package/dist/async/async.d.ts.map +1 -0
- package/dist/{async-utils.js → async/async.js} +1 -1
- package/dist/async/async.js.map +1 -0
- package/dist/async/batch-operations.d.ts.map +1 -0
- package/dist/async/batch-operations.js.map +1 -0
- package/dist/async/index.d.ts +3 -0
- package/dist/async/index.d.ts.map +1 -0
- package/dist/async/index.js +3 -0
- package/dist/async/index.js.map +1 -0
- package/dist/core/evaluator-base.d.ts.map +1 -0
- package/dist/core/evaluator-base.js.map +1 -0
- package/dist/core/generate.d.ts.map +1 -0
- package/dist/core/generate.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/{date-recurrence-utils.d.ts → date/date-recurrence.d.ts} +1 -1
- package/dist/date/date-recurrence.d.ts.map +1 -0
- package/dist/{date-recurrence-utils.js → date/date-recurrence.js} +1 -1
- package/dist/date/date-recurrence.js.map +1 -0
- package/dist/{date-utils.d.ts → date/date.d.ts} +1 -1
- package/dist/date/date.d.ts.map +1 -0
- package/dist/{date-utils.js → date/date.js} +1 -1
- package/dist/date/date.js.map +1 -0
- package/dist/date/index.d.ts +3 -0
- package/dist/date/index.d.ts.map +1 -0
- package/dist/date/index.js +3 -0
- package/dist/date/index.js.map +1 -0
- package/dist/{child-reference-utils.d.ts → file/child-reference.d.ts} +1 -1
- package/dist/file/child-reference.d.ts.map +1 -0
- package/dist/{child-reference-utils.js → file/child-reference.js} +1 -1
- package/dist/file/child-reference.js.map +1 -0
- package/dist/file/file-operations.d.ts.map +1 -0
- package/dist/{file-operations.js → file/file-operations.js} +2 -2
- package/dist/file/file-operations.js.map +1 -0
- package/dist/file/file.d.ts +263 -0
- package/dist/file/file.d.ts.map +1 -0
- package/dist/file/file.js +466 -0
- package/dist/file/file.js.map +1 -0
- package/dist/{frontmatter-utils.d.ts → file/frontmatter.d.ts} +1 -1
- package/dist/file/frontmatter.d.ts.map +1 -0
- package/dist/{frontmatter-utils.js → file/frontmatter.js} +1 -1
- package/dist/file/frontmatter.js.map +1 -0
- package/dist/file/index.d.ts +7 -0
- package/dist/file/index.d.ts.map +1 -0
- package/dist/file/index.js +7 -0
- package/dist/file/index.js.map +1 -0
- package/dist/file/link-parser.d.ts.map +1 -0
- package/dist/file/link-parser.js.map +1 -0
- package/dist/{templater-utils.d.ts → file/templater.d.ts} +1 -1
- package/dist/file/templater.d.ts.map +1 -0
- package/dist/{templater-utils.js → file/templater.js} +1 -1
- package/dist/file/templater.js.map +1 -0
- package/dist/index.d.ts +6 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -15
- package/dist/index.js.map +1 -1
- package/dist/settings/index.d.ts +3 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +3 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/settings-store.d.ts.map +1 -0
- package/dist/settings/settings-store.js.map +1 -0
- package/dist/settings/settings-ui-builder.d.ts.map +1 -0
- package/dist/settings/settings-ui-builder.js.map +1 -0
- package/dist/string/index.d.ts +2 -0
- package/dist/string/index.d.ts.map +1 -0
- package/dist/string/index.js +2 -0
- package/dist/string/index.js.map +1 -0
- package/dist/{string-utils.d.ts → string/string.d.ts} +1 -1
- package/dist/string/string.d.ts.map +1 -0
- package/dist/{string-utils.js → string/string.js} +1 -1
- package/dist/string/string.js.map +1 -0
- package/dist/testing/mocks/obsidian.d.ts +1 -0
- package/dist/testing/mocks/obsidian.d.ts.map +1 -1
- package/dist/testing/mocks/obsidian.js +6 -0
- package/dist/testing/mocks/obsidian.js.map +1 -1
- package/package.json +3 -5
- package/src/async/async.ts +117 -0
- package/src/async/batch-operations.ts +53 -0
- package/src/async/index.ts +2 -0
- package/src/core/evaluator-base.ts +118 -0
- package/src/core/generate.ts +22 -0
- package/src/core/index.ts +2 -0
- package/src/date/date-recurrence.ts +244 -0
- package/src/date/date.ts +111 -0
- package/src/date/index.ts +2 -0
- package/src/file/child-reference.ts +76 -0
- package/src/file/file-operations.ts +197 -0
- package/src/file/file.ts +570 -0
- package/src/file/frontmatter.ts +80 -0
- package/src/file/index.ts +6 -0
- package/src/file/link-parser.ts +18 -0
- package/src/file/templater.ts +75 -0
- package/src/index.ts +14 -0
- package/src/settings/index.ts +2 -0
- package/src/settings/settings-store.ts +88 -0
- package/src/settings/settings-ui-builder.ts +507 -0
- package/src/string/index.ts +1 -0
- package/src/string/string.ts +26 -0
- package/src/testing/index.ts +23 -0
- package/src/testing/mocks/obsidian.ts +331 -0
- package/src/testing/mocks/utils.ts +113 -0
- package/src/testing/setup.ts +19 -0
- package/dist/async-utils.d.ts.map +0 -1
- package/dist/async-utils.js.map +0 -1
- package/dist/batch-operations.d.ts.map +0 -1
- package/dist/batch-operations.js.map +0 -1
- package/dist/child-reference-utils.d.ts.map +0 -1
- package/dist/child-reference-utils.js.map +0 -1
- package/dist/date-recurrence-utils.d.ts.map +0 -1
- package/dist/date-recurrence-utils.js.map +0 -1
- package/dist/date-utils.d.ts.map +0 -1
- package/dist/date-utils.js.map +0 -1
- package/dist/evaluator-base.d.ts.map +0 -1
- package/dist/evaluator-base.js.map +0 -1
- package/dist/file-operations.d.ts.map +0 -1
- package/dist/file-operations.js.map +0 -1
- package/dist/file-utils.d.ts +0 -6
- package/dist/file-utils.d.ts.map +0 -1
- package/dist/file-utils.js +0 -25
- package/dist/file-utils.js.map +0 -1
- package/dist/frontmatter-utils.d.ts.map +0 -1
- package/dist/frontmatter-utils.js.map +0 -1
- package/dist/generate.d.ts.map +0 -1
- package/dist/generate.js.map +0 -1
- package/dist/link-parser.d.ts.map +0 -1
- package/dist/link-parser.js.map +0 -1
- package/dist/settings-store.d.ts.map +0 -1
- package/dist/settings-store.js.map +0 -1
- package/dist/settings-ui-builder.d.ts.map +0 -1
- package/dist/settings-ui-builder.js.map +0 -1
- package/dist/string-utils.d.ts.map +0 -1
- package/dist/string-utils.js.map +0 -1
- package/dist/templater-utils.d.ts.map +0 -1
- package/dist/templater-utils.js.map +0 -1
- /package/dist/{batch-operations.d.ts → async/batch-operations.d.ts} +0 -0
- /package/dist/{batch-operations.js → async/batch-operations.js} +0 -0
- /package/dist/{evaluator-base.d.ts → core/evaluator-base.d.ts} +0 -0
- /package/dist/{evaluator-base.js → core/evaluator-base.js} +0 -0
- /package/dist/{generate.d.ts → core/generate.d.ts} +0 -0
- /package/dist/{generate.js → core/generate.js} +0 -0
- /package/dist/{file-operations.d.ts → file/file-operations.d.ts} +0 -0
- /package/dist/{link-parser.d.ts → file/link-parser.d.ts} +0 -0
- /package/dist/{link-parser.js → file/link-parser.js} +0 -0
- /package/dist/{settings-store.d.ts → settings/settings-store.d.ts} +0 -0
- /package/dist/{settings-store.js → settings/settings-store.js} +0 -0
- /package/dist/{settings-ui-builder.d.ts → settings/settings-ui-builder.d.ts} +0 -0
- /package/dist/{settings-ui-builder.js → settings/settings-ui-builder.js} +0 -0
|
@@ -1 +0,0 @@
|
|
|
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.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { App } from "obsidian";
|
|
2
|
-
export declare const generateUniqueFilePath: (app: App, folder: string, baseName: string, extension?: string) => string;
|
|
3
|
-
export declare const sanitizeForFilename: (input: string) => string;
|
|
4
|
-
export declare const getFilenameFromPath: (filePath: string) => string;
|
|
5
|
-
export declare const isFileInConfiguredDirectory: (filePath: string, directory: string) => boolean;
|
|
6
|
-
//# sourceMappingURL=file-utils.d.ts.map
|
package/dist/file-utils.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../src/file-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC,eAAO,MAAM,sBAAsB,GAClC,KAAK,GAAG,EACR,QAAQ,MAAM,EACd,UAAU,MAAM,EAChB,YAAW,MAAa,KACtB,MAUF,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,OAAO,MAAM,KAAG,MAOnD,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,UAAU,MAAM,KAAG,MAEtD,CAAC;AAEF,eAAO,MAAM,2BAA2B,GAAI,UAAU,MAAM,EAAE,WAAW,MAAM,KAAG,OAGjF,CAAC"}
|
package/dist/file-utils.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
export const generateUniqueFilePath = (app, folder, baseName, extension = "md") => {
|
|
2
|
-
const folderPath = folder ? `${folder}/` : "";
|
|
3
|
-
let filePath = `${folderPath}${baseName}.${extension}`;
|
|
4
|
-
let counter = 1;
|
|
5
|
-
while (app.vault.getAbstractFileByPath(filePath)) {
|
|
6
|
-
filePath = `${folderPath}${baseName} ${counter++}.${extension}`;
|
|
7
|
-
}
|
|
8
|
-
return filePath;
|
|
9
|
-
};
|
|
10
|
-
export const sanitizeForFilename = (input) => {
|
|
11
|
-
return input
|
|
12
|
-
.replace(/[<>:"/\\|?*]/g, "") // Remove invalid filename characters
|
|
13
|
-
.replace(/\s+/g, "-") // Replace spaces with hyphens
|
|
14
|
-
.replace(/-+/g, "-") // Replace multiple hyphens with single
|
|
15
|
-
.replace(/^-|-$/g, "") // Remove leading/trailing hyphens
|
|
16
|
-
.toLowerCase();
|
|
17
|
-
};
|
|
18
|
-
export const getFilenameFromPath = (filePath) => {
|
|
19
|
-
return filePath.split("/").pop() || "Unknown";
|
|
20
|
-
};
|
|
21
|
-
export const isFileInConfiguredDirectory = (filePath, directory) => {
|
|
22
|
-
const normalizedDir = directory.endsWith("/") ? directory.slice(0, -1) : directory;
|
|
23
|
-
return filePath.startsWith(`${normalizedDir}/`) || filePath === normalizedDir;
|
|
24
|
-
};
|
|
25
|
-
//# sourceMappingURL=file-utils.js.map
|
package/dist/file-utils.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"frontmatter-utils.d.ts","sourceRoot":"","sources":["../src/frontmatter-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAkBhE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAsClE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQ9F"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"frontmatter-utils.js","sourceRoot":"","sources":["../src/frontmatter-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACvD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC3C,OAAO,EAAE,CAAC;IACX,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACd,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACxD,eAAe;IACf,IAAI,WAAW,KAAK,EAAE,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACX,CAAC;IAED,+CAA+C;IAC/C,IACC,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC1D,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC1D,WAAW,KAAK,MAAM,EACrB,CAAC;QACF,IAAI,CAAC;YACJ,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChC,CAAC;QAAC,WAAM,CAAC;YACR,wCAAwC;YACxC,OAAO,WAAW,CAAC;QACpB,CAAC;IACF,CAAC;IAED,iBAAiB;IACjB,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACd,CAAC;IAED,gDAAgD;IAChD,IAAI,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,GAAG,CAAC;QACZ,CAAC;IACF,CAAC;IAED,4CAA4C;IAC5C,OAAO,WAAW,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA8B;IACpE,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,GAAG,CAAC,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC","sourcesContent":["/**\n * Serializes a frontmatter value to a string representation for display in input fields.\n * Converts arrays, objects, booleans, and numbers to their string representations.\n */\nexport function serializeFrontmatterValue(value: unknown): string {\n\tif (value === null || value === undefined) {\n\t\treturn \"\";\n\t}\n\n\tif (typeof value === \"string\") {\n\t\treturn value;\n\t}\n\n\tif (typeof value === \"number\" || typeof value === \"boolean\") {\n\t\treturn String(value);\n\t}\n\n\tif (Array.isArray(value) || typeof value === \"object\") {\n\t\treturn JSON.stringify(value);\n\t}\n\n\treturn String(value);\n}\n\n/**\n * Parses a string value back to its original frontmatter type.\n * Detects and converts to: arrays, objects, booleans, numbers, or keeps as string.\n */\nexport function parseFrontmatterValue(stringValue: string): unknown {\n\t// Empty string\n\tif (stringValue === \"\") {\n\t\treturn \"\";\n\t}\n\n\t// Try to parse as JSON (arrays, objects, null)\n\tif (\n\t\t(stringValue.startsWith(\"[\") && stringValue.endsWith(\"]\")) ||\n\t\t(stringValue.startsWith(\"{\") && stringValue.endsWith(\"}\")) ||\n\t\tstringValue === \"null\"\n\t) {\n\t\ttry {\n\t\t\treturn JSON.parse(stringValue);\n\t\t} catch {\n\t\t\t// If JSON parse fails, return as string\n\t\t\treturn stringValue;\n\t\t}\n\t}\n\n\t// Parse booleans\n\tif (stringValue === \"true\") {\n\t\treturn true;\n\t}\n\tif (stringValue === \"false\") {\n\t\treturn false;\n\t}\n\n\t// Parse numbers (including integers and floats)\n\tif (/^-?\\d+(\\.\\d+)?$/.test(stringValue)) {\n\t\tconst num = Number(stringValue);\n\t\tif (!Number.isNaN(num)) {\n\t\t\treturn num;\n\t\t}\n\t}\n\n\t// Return as string if no other type matches\n\treturn stringValue;\n}\n\n/**\n * Converts a record of string values back to their original frontmatter types.\n */\nexport function parseFrontmatterRecord(record: Record<string, string>): Record<string, unknown> {\n\tconst parsed: Record<string, unknown> = {};\n\n\tfor (const [key, value] of Object.entries(record)) {\n\t\tparsed[key] = parseFrontmatterValue(value);\n\t}\n\n\treturn parsed;\n}\n"]}
|
package/dist/generate.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,gBAAgB,QAAO,MAMnC,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAO,aAQrC,CAAC"}
|
package/dist/generate.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"link-parser.d.ts","sourceRoot":"","sources":["../src/link-parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,IAU/D,CAAC"}
|
package/dist/link-parser.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settings-store.d.ts","sourceRoot":"","sources":["../src/settings-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AACvC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,qBAAa,aAAa,CAAC,OAAO,SAAS,CAAC,CAAC,UAAU;IACtD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAU;IACxB,SAAgB,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAEjD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IAM3C,IAAI,eAAe,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAEtC;IAED,IAAI,gBAAgB,IAAI,OAAO,CAE9B;IAEK,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB7B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,cAAc,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxF,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EACpD,GAAG,EAAE,CAAC,EACN,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,IAAI,CAAC;IAQV,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzE,WAAW,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IAI/B,iBAAiB,IAAI,OAAO;CAI5B"}
|
|
@@ -1 +0,0 @@
|
|
|
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\tget validationSchema(): TSchema {\n\t\treturn this.schema;\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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settings-ui-builder.d.ts","sourceRoot":"","sources":["../src/settings-ui-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settings-ui-builder.js","sourceRoot":"","sources":["../src/settings-ui-builder.ts"],"names":[],"mappings":"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","sourcesContent":["import { Notice, Setting } from \"obsidian\";\nimport type { ZodArray, ZodNumber, ZodObject, ZodRawShape, z } from \"zod\";\nimport type { SettingsStore } from \"./settings-store\";\n\ninterface BaseSettingConfig {\n\tkey: string;\n\tname: string;\n\tdesc: string;\n}\n\ninterface TextSettingConfig extends BaseSettingConfig {\n\tplaceholder?: string;\n\tcommitOnChange?: boolean;\n}\n\ninterface SliderSettingConfig extends BaseSettingConfig {\n\tmin?: number;\n\tmax?: number;\n\tstep?: number;\n\tcommitOnChange?: boolean;\n}\n\ninterface DropdownSettingConfig extends BaseSettingConfig {\n\toptions: Record<string, string>;\n}\n\ninterface ArraySettingConfig<T = string> extends BaseSettingConfig {\n\tplaceholder?: string;\n\tarrayDelimiter?: string;\n\tmultiline?: boolean;\n\tcommitOnChange?: boolean;\n\titemType?: \"string\" | \"number\";\n\tparser?: (input: string) => T;\n\tvalidator?: (item: T) => boolean;\n}\n\ninterface ArrayManagerConfig extends BaseSettingConfig {\n\tplaceholder?: string;\n\taddButtonText?: string;\n\tremoveButtonText?: string;\n\temptyArrayFallback?: unknown;\n\tpreventEmpty?: boolean;\n\titemDescriptionFn?: (item: unknown) => string;\n\tonBeforeAdd?: (newItem: unknown, currentItems: unknown[]) => unknown[] | Promise<unknown[]>;\n\tonBeforeRemove?: (\n\t\titemToRemove: unknown,\n\t\tcurrentItems: unknown[]\n\t) => unknown[] | Promise<unknown[]>;\n\tquickActions?: Array<{\n\t\tname: string;\n\t\tdesc: string;\n\t\tbuttonText: string;\n\t\tcondition?: (currentItems: unknown[]) => boolean;\n\t\taction: (currentItems: unknown[]) => unknown[] | Promise<unknown[]>;\n\t}>;\n}\n\nexport class SettingsUIBuilder<TSchema extends ZodObject<ZodRawShape>> {\n\tconstructor(private settingsStore: SettingsStore<TSchema>) {}\n\n\tprivate get settings(): z.infer<TSchema> {\n\t\treturn this.settingsStore.currentSettings;\n\t}\n\n\tprivate get schema(): TSchema {\n\t\treturn this.settingsStore.validationSchema;\n\t}\n\n\tprivate async updateSetting(key: keyof z.infer<TSchema>, value: unknown): Promise<void> {\n\t\tconst newSettings = {\n\t\t\t...this.settings,\n\t\t\t[key]: value,\n\t\t} as z.infer<TSchema>;\n\n\t\tconst result = this.schema.safeParse(newSettings);\n\n\t\tif (!result.success) {\n\t\t\tconst errors = result.error.issues\n\t\t\t\t.map((e) => `${String(e.path.join(\".\"))}${e.path.length > 0 ? \": \" : \"\"}${e.message}`)\n\t\t\t\t.join(\", \");\n\t\t\tnew Notice(`Validation failed: ${errors}`, 5000);\n\t\t\tthrow new Error(`Validation failed: ${errors}`);\n\t\t}\n\n\t\tawait this.settingsStore.updateSettings(() => newSettings);\n\t}\n\n\tprivate inferSliderBounds(key: string): { min?: number; max?: number; step?: number } {\n\t\ttry {\n\t\t\tconst fieldSchema = (this.schema.shape as any)[key];\n\t\t\tif (!fieldSchema) return {};\n\n\t\t\tlet innerSchema = fieldSchema;\n\t\t\twhile ((innerSchema as any)._def?.innerType) {\n\t\t\t\tinnerSchema = (innerSchema as any)._def.innerType;\n\t\t\t}\n\n\t\t\tif ((innerSchema as any)._def?.typeName === \"ZodNumber\") {\n\t\t\t\tconst checks = ((innerSchema as ZodNumber)._def as any).checks || [];\n\t\t\t\tlet min: number | undefined;\n\t\t\t\tlet max: number | undefined;\n\n\t\t\t\tfor (const check of checks) {\n\t\t\t\t\tif ((check as any).kind === \"min\") {\n\t\t\t\t\t\tmin = (check as any).value;\n\t\t\t\t\t}\n\t\t\t\t\tif ((check as any).kind === \"max\") {\n\t\t\t\t\t\tmax = (check as any).value;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn { min, max };\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(`Failed to infer slider bounds for key ${key}:`, error);\n\t\t}\n\n\t\treturn {};\n\t}\n\n\tprivate inferArrayItemType(key: string): \"string\" | \"number\" | undefined {\n\t\ttry {\n\t\t\tconst fieldSchema = (this.schema.shape as any)[key];\n\t\t\tif (!fieldSchema) return undefined;\n\n\t\t\tlet innerSchema = fieldSchema;\n\t\t\twhile ((innerSchema as any)._def?.innerType) {\n\t\t\t\tinnerSchema = (innerSchema as any)._def.innerType;\n\t\t\t}\n\n\t\t\tif ((innerSchema as any)._def?.typeName === \"ZodArray\") {\n\t\t\t\tconst elementType = ((innerSchema as ZodArray<any>)._def as any).type;\n\t\t\t\tif ((elementType as any)._def?.typeName === \"ZodNumber\") {\n\t\t\t\t\treturn \"number\";\n\t\t\t\t}\n\t\t\t\tif ((elementType as any)._def?.typeName === \"ZodString\") {\n\t\t\t\t\treturn \"string\";\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(`Failed to infer array item type for key ${key}:`, error);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\taddToggle(containerEl: HTMLElement, config: BaseSettingConfig): void {\n\t\tconst { key, name, desc } = config;\n\t\tconst value = this.settings[key as keyof z.infer<TSchema>];\n\n\t\tnew Setting(containerEl)\n\t\t\t.setName(name)\n\t\t\t.setDesc(desc)\n\t\t\t.addToggle((toggle) =>\n\t\t\t\ttoggle.setValue(Boolean(value)).onChange(async (newValue) => {\n\t\t\t\t\tawait this.updateSetting(key as keyof z.infer<TSchema>, newValue);\n\t\t\t\t})\n\t\t\t);\n\t}\n\n\taddSlider(containerEl: HTMLElement, config: SliderSettingConfig): void {\n\t\tconst { key, name, desc, step = 1, commitOnChange = false } = config;\n\t\tconst value = this.settings[key as keyof z.infer<TSchema>];\n\n\t\tconst inferredBounds = this.inferSliderBounds(key);\n\t\tconst min = config.min ?? inferredBounds.min ?? 0;\n\t\tconst max = config.max ?? inferredBounds.max ?? 100;\n\n\t\tnew Setting(containerEl)\n\t\t\t.setName(name)\n\t\t\t.setDesc(desc)\n\t\t\t.addSlider((slider) => {\n\t\t\t\tslider.setLimits(min, max, step).setValue(Number(value)).setDynamicTooltip();\n\n\t\t\t\tif (commitOnChange) {\n\t\t\t\t\t// Reactive: commit on every change\n\t\t\t\t\tslider.onChange(async (newValue) => {\n\t\t\t\t\t\tawait this.updateSetting(key as keyof z.infer<TSchema>, newValue);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Commit only when user finishes dragging\n\t\t\t\t\tconst commit = async (newValue: number) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait this.updateSetting(key as keyof z.infer<TSchema>, newValue);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tnew Notice(`Invalid input: ${error}`, 5000);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\t// Update tooltip during drag for visual feedback\n\t\t\t\t\tslider.onChange((newValue) => {\n\t\t\t\t\t\tslider.sliderEl.setAttribute(\"aria-valuenow\", String(newValue));\n\t\t\t\t\t});\n\n\t\t\t\t\t// Commit on mouse up\n\t\t\t\t\tslider.sliderEl.addEventListener(\"mouseup\", () => {\n\t\t\t\t\t\tvoid commit(Number(slider.sliderEl.value));\n\t\t\t\t\t});\n\n\t\t\t\t\t// Commit on keyboard navigation\n\t\t\t\t\tslider.sliderEl.addEventListener(\"keyup\", (e: KeyboardEvent) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t[\"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\", \"Home\", \"End\"].includes(e.key)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tvoid commit(Number(slider.sliderEl.value));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn slider;\n\t\t\t});\n\t}\n\n\taddText(containerEl: HTMLElement, config: TextSettingConfig): void {\n\t\tconst { key, name, desc, placeholder = \"\", commitOnChange = false } = config;\n\t\tconst value = this.settings[key as keyof z.infer<TSchema>];\n\n\t\tnew Setting(containerEl)\n\t\t\t.setName(name)\n\t\t\t.setDesc(desc)\n\t\t\t.addText((text) => {\n\t\t\t\ttext.setPlaceholder(placeholder);\n\t\t\t\ttext.setValue(String(value ?? \"\"));\n\n\t\t\t\tif (commitOnChange) {\n\t\t\t\t\t// Reactive: commit on every change\n\t\t\t\t\ttext.onChange(async (newValue) => {\n\t\t\t\t\t\tawait this.updateSetting(key as keyof z.infer<TSchema>, newValue);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Commit only on blur or Ctrl/Cmd+Enter\n\t\t\t\t\tconst commit = async (inputValue: string) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait this.updateSetting(key as keyof z.infer<TSchema>, inputValue);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tnew Notice(`Invalid input: ${error}`, 5000);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\ttext.inputEl.addEventListener(\"blur\", () => void commit(text.inputEl.value));\n\t\t\t\t\ttext.inputEl.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n\t\t\t\t\t\tif (e.key === \"Enter\" && (e.ctrlKey || e.metaKey)) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tvoid commit(text.inputEl.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\taddDropdown(containerEl: HTMLElement, config: DropdownSettingConfig): void {\n\t\tconst { key, name, desc, options } = config;\n\t\tconst value = this.settings[key as keyof z.infer<TSchema>];\n\n\t\tnew Setting(containerEl)\n\t\t\t.setName(name)\n\t\t\t.setDesc(desc)\n\t\t\t.addDropdown((dropdown) =>\n\t\t\t\tdropdown\n\t\t\t\t\t.addOptions(options)\n\t\t\t\t\t.setValue(String(value))\n\t\t\t\t\t.onChange(async (newValue) => {\n\t\t\t\t\t\tawait this.updateSetting(key as keyof z.infer<TSchema>, newValue);\n\t\t\t\t\t})\n\t\t\t);\n\t}\n\n\taddTextArray<T = string>(containerEl: HTMLElement, config: ArraySettingConfig<T>): void {\n\t\tconst {\n\t\t\tkey,\n\t\t\tname,\n\t\t\tdesc,\n\t\t\tplaceholder = \"\",\n\t\t\tarrayDelimiter = \", \",\n\t\t\tmultiline = false,\n\t\t\tcommitOnChange = false,\n\t\t} = config;\n\t\tconst value = this.settings[key as keyof z.infer<TSchema>] as T[];\n\n\t\tconst inferredItemType = config.itemType ?? this.inferArrayItemType(key) ?? \"string\";\n\t\tconst parser =\n\t\t\tconfig.parser ??\n\t\t\t((input: string) => {\n\t\t\t\tif (inferredItemType === \"number\") {\n\t\t\t\t\tconst num = Number(input);\n\t\t\t\t\tif (Number.isNaN(num)) {\n\t\t\t\t\t\tthrow new Error(`Invalid number: ${input}`);\n\t\t\t\t\t}\n\t\t\t\t\treturn num as T;\n\t\t\t\t}\n\t\t\t\treturn input as T;\n\t\t\t});\n\n\t\tconst validator = config.validator ?? ((_item: T) => true);\n\n\t\tconst setting = new Setting(containerEl).setName(name).setDesc(desc);\n\n\t\tif (multiline) {\n\t\t\tsetting.addTextArea((text) => {\n\t\t\t\ttext.setPlaceholder(placeholder);\n\t\t\t\ttext.setValue(Array.isArray(value) ? value.join(\"\\n\") : \"\");\n\n\t\t\t\tconst commit = async (inputValue: string) => {\n\t\t\t\t\tconst lines = inputValue\n\t\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t\t.map((s) => s.trim())\n\t\t\t\t\t\t.filter((s) => s.length > 0);\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst items = lines.map(parser).filter(validator);\n\t\t\t\t\t\tawait this.updateSetting(key as keyof z.infer<TSchema>, items);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tnew Notice(`Invalid input: ${error}`, 5000);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tif (commitOnChange) {\n\t\t\t\t\t// Reactive: commit on every change\n\t\t\t\t\ttext.onChange(async (inputValue) => {\n\t\t\t\t\t\tawait commit(inputValue);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Commit only on blur or Ctrl/Cmd+Enter\n\t\t\t\t\ttext.inputEl.addEventListener(\"blur\", () => void commit(text.inputEl.value));\n\t\t\t\t\ttext.inputEl.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n\t\t\t\t\t\tif (e.key === \"Enter\" && (e.ctrlKey || e.metaKey)) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tvoid commit(text.inputEl.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\ttext.inputEl.rows = 5;\n\t\t\t\ttext.inputEl.classList.add(\"settings-ui-builder-textarea\");\n\t\t\t});\n\t\t} else {\n\t\t\tsetting.addText((text) => {\n\t\t\t\ttext.setPlaceholder(placeholder);\n\t\t\t\ttext.setValue(Array.isArray(value) ? value.join(arrayDelimiter) : \"\");\n\n\t\t\t\tconst commit = async (inputValue: string) => {\n\t\t\t\t\tconst tokens = inputValue\n\t\t\t\t\t\t.split(\",\")\n\t\t\t\t\t\t.map((s) => s.trim())\n\t\t\t\t\t\t.filter((s) => s.length > 0);\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst items = tokens.map(parser).filter(validator);\n\t\t\t\t\t\tawait this.updateSetting(key as keyof z.infer<TSchema>, items);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tnew Notice(`Invalid input: ${error}`, 5000);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tif (commitOnChange) {\n\t\t\t\t\t// Reactive: commit on every change\n\t\t\t\t\ttext.onChange(async (inputValue) => {\n\t\t\t\t\t\tawait commit(inputValue);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Commit only on blur or Ctrl/Cmd+Enter\n\t\t\t\t\ttext.inputEl.addEventListener(\"blur\", () => void commit(text.inputEl.value));\n\t\t\t\t\ttext.inputEl.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n\t\t\t\t\t\tif (e.key === \"Enter\" && (e.ctrlKey || e.metaKey)) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tvoid commit(text.inputEl.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Advanced array manager with add/remove buttons for each item\n\t * Similar to the directory settings pattern\n\t */\n\taddArrayManager(containerEl: HTMLElement, config: ArrayManagerConfig): void {\n\t\tconst {\n\t\t\tkey,\n\t\t\tname,\n\t\t\tdesc,\n\t\t\tplaceholder = \"\",\n\t\t\taddButtonText = \"Add\",\n\t\t\tremoveButtonText = \"Remove\",\n\t\t\temptyArrayFallback = [],\n\t\t\tpreventEmpty = false,\n\t\t\titemDescriptionFn,\n\t\t\tonBeforeAdd,\n\t\t\tonBeforeRemove,\n\t\t\tquickActions = [],\n\t\t} = config;\n\n\t\t// Section heading\n\t\tnew Setting(containerEl).setName(name).setHeading();\n\n\t\t// Description\n\t\tif (desc) {\n\t\t\tconst descEl = containerEl.createDiv(\"setting-item-description\");\n\t\t\tdescEl.setText(desc);\n\t\t}\n\n\t\t// Container for list items\n\t\tconst listContainer = containerEl.createDiv(\"settings-array-manager-list\");\n\n\t\tconst render = () => {\n\t\t\tlistContainer.empty();\n\n\t\t\tconst currentItems = (this.settings[key as keyof z.infer<TSchema>] as unknown[]) ?? [];\n\n\t\t\tfor (const item of currentItems) {\n\t\t\t\tconst itemSetting = new Setting(listContainer).setName(String(item)).addButton((button) =>\n\t\t\t\t\tbutton\n\t\t\t\t\t\t.setButtonText(removeButtonText)\n\t\t\t\t\t\t.setWarning()\n\t\t\t\t\t\t.onClick(async () => {\n\t\t\t\t\t\t\tlet newItems = currentItems.filter((i) => i !== item);\n\n\t\t\t\t\t\t\t// Apply custom logic before removal\n\t\t\t\t\t\t\tif (onBeforeRemove) {\n\t\t\t\t\t\t\t\tnewItems = await onBeforeRemove(item, currentItems);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Prevent empty array if configured\n\t\t\t\t\t\t\tif (preventEmpty && newItems.length === 0) {\n\t\t\t\t\t\t\t\tnewItems = Array.isArray(emptyArrayFallback)\n\t\t\t\t\t\t\t\t\t? emptyArrayFallback\n\t\t\t\t\t\t\t\t\t: [emptyArrayFallback];\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tawait this.updateSetting(key as keyof z.infer<TSchema>, newItems);\n\t\t\t\t\t\t\trender();\n\t\t\t\t\t\t})\n\t\t\t\t);\n\n\t\t\t\t// Add custom description for each item if provided\n\t\t\t\tif (itemDescriptionFn) {\n\t\t\t\t\titemSetting.setDesc(itemDescriptionFn(item));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\trender();\n\n\t\t// Add new item section\n\t\tconst inputId = `settings-array-manager-input-${key}`;\n\t\tnew Setting(containerEl)\n\t\t\t.setName(`Add ${name.toLowerCase()}`)\n\t\t\t.setDesc(`Enter a new value`)\n\t\t\t.addText((text) => {\n\t\t\t\ttext.setPlaceholder(placeholder);\n\t\t\t\ttext.inputEl.id = inputId;\n\t\t\t})\n\t\t\t.addButton((button) =>\n\t\t\t\tbutton\n\t\t\t\t\t.setButtonText(addButtonText)\n\t\t\t\t\t.setCta()\n\t\t\t\t\t.onClick(async () => {\n\t\t\t\t\t\tconst input = containerEl.querySelector(`#${inputId}`) as HTMLInputElement;\n\t\t\t\t\t\tconst newItem = input.value.trim();\n\n\t\t\t\t\t\tif (!newItem) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst currentItems = (this.settings[key as keyof z.infer<TSchema>] as unknown[]) ?? [];\n\t\t\t\t\t\tlet newItems = [...currentItems];\n\n\t\t\t\t\t\t// Apply custom logic before adding\n\t\t\t\t\t\tif (onBeforeAdd) {\n\t\t\t\t\t\t\tnewItems = await onBeforeAdd(newItem, currentItems);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Default behavior: add if not exists\n\t\t\t\t\t\t\tif (!newItems.includes(newItem)) {\n\t\t\t\t\t\t\t\tnewItems.push(newItem);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait this.updateSetting(key as keyof z.infer<TSchema>, newItems);\n\t\t\t\t\t\tinput.value = \"\";\n\t\t\t\t\t\trender();\n\t\t\t\t\t})\n\t\t\t);\n\n\t\t// Quick actions\n\t\tfor (const quickAction of quickActions) {\n\t\t\tconst currentItems = (this.settings[key as keyof z.infer<TSchema>] as unknown[]) ?? [];\n\n\t\t\t// Check condition if provided\n\t\t\tif (quickAction.condition && !quickAction.condition(currentItems)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tnew Setting(containerEl)\n\t\t\t\t.setName(quickAction.name)\n\t\t\t\t.setDesc(quickAction.desc)\n\t\t\t\t.addButton((button) =>\n\t\t\t\t\tbutton.setButtonText(quickAction.buttonText).onClick(async () => {\n\t\t\t\t\t\tconst currentItems = (this.settings[key as keyof z.infer<TSchema>] as unknown[]) ?? [];\n\t\t\t\t\t\tconst newItems = await quickAction.action(currentItems);\n\t\t\t\t\t\tawait this.updateSetting(key as keyof z.infer<TSchema>, newItems);\n\t\t\t\t\t\trender();\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t}\n\t}\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"string-utils.d.ts","sourceRoot":"","sources":["../src/string-utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG,MAGxC,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,eAAe,MAAM,KAAG,MAY/D,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,KAAG,MAEzC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,KAAG,MAAM,GAAG,UAEzD,CAAC"}
|
package/dist/string-utils.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"templater-utils.d.ts","sourceRoot":"","sources":["../src/templater-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAyB,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;AAgCvE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAGtD;AAED,wBAAsB,kBAAkB,CACvC,GAAG,EAAE,GAAG,EACR,YAAY,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,MAAM,EACjB,WAAW,UAAQ,GACjB,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CA+BvB"}
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|