generated from obsidianmd/obsidian-sample-plugin
-
-
Notifications
You must be signed in to change notification settings - Fork 190
/
UserScriptFunctions.ts
86 lines (78 loc) · 2.75 KB
/
UserScriptFunctions.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import { TFile } from "obsidian";
import TemplaterPlugin from "main";
import { IGenerateObject } from "../IGenerateObject";
import { get_tfiles_from_folder } from "utils/Utils";
import { errorWrapperSync, TemplaterError } from "utils/Error";
export class UserScriptFunctions implements IGenerateObject {
constructor(private plugin: TemplaterPlugin) {}
async generate_user_script_functions(): Promise<
Map<string, () => unknown>
> {
const user_script_functions: Map<string, () => unknown> = new Map();
const files = errorWrapperSync(
() =>
get_tfiles_from_folder(
this.plugin.settings.user_scripts_folder
),
`Couldn't find user script folder "${this.plugin.settings.user_scripts_folder}"`
);
if (!files) {
return new Map();
}
for (const file of files) {
if (file.extension.toLowerCase() === "js") {
await this.load_user_script_function(
file,
user_script_functions
);
}
}
return user_script_functions;
}
async load_user_script_function(
file: TFile,
user_script_functions: Map<string, () => unknown>
): Promise<void> {
const req = (s: string) => {
return window.require && window.require(s);
};
const exp: Record<string, unknown> = {};
const mod = {
exports: exp,
};
const file_content = await app.vault.read(file);
try {
const wrapping_fn = window.eval(
"(function anonymous(require, module, exports){" +
file_content +
"\n})"
);
wrapping_fn(req, mod, exp);
} catch (err) {
throw new TemplaterError(
`Failed to load user script at "${file.path}".`,
err.message
);
}
const user_function = exp["default"] || mod.exports;
if (!user_function) {
throw new TemplaterError(
`Failed to load user script at "${file.path}". No exports detected.`
);
}
if (!(user_function instanceof Function)) {
throw new TemplaterError(
`Failed to load user script at "${file.path}". Default export is not a function.`
);
}
user_script_functions.set(
`${file.basename}`,
user_function as () => unknown
);
}
async generate_object(): Promise<Record<string, unknown>> {
const user_script_functions =
await this.generate_user_script_functions();
return Object.fromEntries(user_script_functions);
}
}