@mnaoumov/obsidian-lib 10.8.0 → 10.10.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 +4 -0
- package/codemirror/editor-mode-extension/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +42 -1
- package/dist/lib/cjs/__merged.d.cts +7 -2
- package/dist/lib/cjs/code-block-render-handoff.cjs +2 -5
- package/dist/lib/cjs/codemirror/editor-mode-extension.cjs +180 -0
- package/dist/lib/cjs/codemirror/editor-mode-extension.d.cts +50 -0
- package/dist/lib/cjs/codemirror/index.cjs +4 -1
- package/dist/lib/cjs/codemirror/index.d.cts +1 -0
- package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +4 -7
- package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +2 -2
- package/dist/lib/cjs/community-plugins.cjs +2 -2
- package/dist/lib/cjs/components/all-windows-event-component.cjs +86 -14
- package/dist/lib/cjs/components/all-windows-event-component.d.cts +54 -3
- package/dist/lib/cjs/components/monkey-around-component.cjs +1 -1
- package/dist/lib/cjs/components/plugin-notice-component.cjs +2 -6
- package/dist/lib/cjs/components/plugin-settings-component.cjs +4 -3
- package/dist/lib/cjs/components/plugin-settings-component.d.cts +2 -1
- package/dist/lib/cjs/components/style-sheet-component.cjs +1 -4
- package/dist/lib/cjs/css-class.cjs +7 -1
- package/dist/lib/cjs/css-class.d.cts +24 -0
- package/dist/lib/cjs/data-stores/shared-data-store.cjs +15 -4
- package/dist/lib/cjs/desktop-bulk-operation-git.cjs +5 -5
- package/dist/lib/cjs/folder-note.cjs +5 -5
- package/dist/lib/cjs/formula-function.cjs +152 -0
- package/dist/lib/cjs/formula-function.d.cts +98 -0
- package/dist/lib/cjs/frontmatter-formatting.cjs +2 -2
- package/dist/lib/cjs/generated-during-build.cjs +2 -2
- package/dist/lib/cjs/i18n/i18n.cjs +38 -10
- package/dist/lib/cjs/i18n/i18n.d.cts +29 -2
- package/dist/lib/cjs/i18n/locales/en.cjs +13 -1
- package/dist/lib/cjs/i18n/locales/en.d.cts +12 -0
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +12 -0
- package/dist/lib/cjs/index.cjs +7 -1
- package/dist/lib/cjs/index.d.cts +2 -0
- package/dist/lib/cjs/link.cjs +12 -12
- package/dist/lib/cjs/markdown.cjs +7 -7
- package/dist/lib/cjs/modals/code-block-builder.cjs +486 -0
- package/dist/lib/cjs/modals/code-block-builder.d.cts +321 -0
- package/dist/lib/cjs/modals/index.cjs +4 -1
- package/dist/lib/cjs/modals/index.d.cts +1 -0
- package/dist/lib/cjs/plugin/index.cjs +4 -1
- package/dist/lib/cjs/plugin/index.d.cts +1 -0
- package/dist/lib/cjs/plugin/plugin-async-cleanup.cjs +189 -0
- package/dist/lib/cjs/plugin/plugin-async-cleanup.d.cts +111 -0
- package/dist/lib/cjs/plugin/plugin.cjs +47 -2
- package/dist/lib/cjs/plugin/plugin.d.cts +25 -1
- package/dist/lib/cjs/vault.cjs +2 -2
- package/dist/lib/cjs/virtual-file.cjs +340 -0
- package/dist/lib/cjs/virtual-file.d.cts +48 -0
- package/dist/lib/esm/__merged.d.mts +7 -2
- package/dist/lib/esm/__merged.mjs +48 -2
- package/dist/lib/esm/code-block-render-handoff.mjs +2 -5
- package/dist/lib/esm/codemirror/editor-mode-extension.d.mts +50 -0
- package/dist/lib/esm/codemirror/editor-mode-extension.mjs +93 -0
- package/dist/lib/esm/codemirror/index.d.mts +1 -0
- package/dist/lib/esm/codemirror/index.mjs +3 -1
- package/dist/lib/esm/codemirror/inline-token-widgets.mjs +3 -9
- package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.mjs +2 -2
- package/dist/lib/esm/community-plugins.mjs +2 -2
- package/dist/lib/esm/components/all-windows-event-component.d.mts +54 -3
- package/dist/lib/esm/components/all-windows-event-component.mjs +87 -14
- package/dist/lib/esm/components/monkey-around-component.mjs +1 -1
- package/dist/lib/esm/components/plugin-notice-component.mjs +2 -6
- package/dist/lib/esm/components/plugin-settings-component.d.mts +2 -1
- package/dist/lib/esm/components/plugin-settings-component.mjs +4 -3
- package/dist/lib/esm/components/style-sheet-component.mjs +1 -4
- package/dist/lib/esm/css-class.d.mts +24 -0
- package/dist/lib/esm/css-class.mjs +7 -1
- package/dist/lib/esm/data-stores/shared-data-store.mjs +15 -4
- package/dist/lib/esm/desktop-bulk-operation-git.mjs +5 -5
- package/dist/lib/esm/folder-note.mjs +5 -5
- package/dist/lib/esm/formula-function.d.mts +98 -0
- package/dist/lib/esm/formula-function.mjs +62 -0
- package/dist/lib/esm/frontmatter-formatting.mjs +2 -2
- package/dist/lib/esm/generated-during-build.mjs +2 -2
- package/dist/lib/esm/i18n/i18n.d.mts +29 -2
- package/dist/lib/esm/i18n/i18n.mjs +40 -10
- package/dist/lib/esm/i18n/locales/en.d.mts +12 -0
- package/dist/lib/esm/i18n/locales/en.mjs +13 -1
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +12 -0
- package/dist/lib/esm/index.d.mts +2 -0
- package/dist/lib/esm/index.mjs +5 -1
- package/dist/lib/esm/link.mjs +12 -12
- package/dist/lib/esm/markdown.mjs +7 -7
- package/dist/lib/esm/modals/code-block-builder.d.mts +321 -0
- package/dist/lib/esm/modals/code-block-builder.mjs +408 -0
- package/dist/lib/esm/modals/index.d.mts +1 -0
- package/dist/lib/esm/modals/index.mjs +3 -1
- package/dist/lib/esm/plugin/index.d.mts +1 -0
- package/dist/lib/esm/plugin/index.mjs +3 -1
- package/dist/lib/esm/plugin/plugin-async-cleanup.d.mts +111 -0
- package/dist/lib/esm/plugin/plugin-async-cleanup.mjs +96 -0
- package/dist/lib/esm/plugin/plugin.d.mts +25 -1
- package/dist/lib/esm/plugin/plugin.mjs +52 -2
- package/dist/lib/esm/vault.mjs +2 -2
- package/dist/lib/esm/virtual-file.d.mts +48 -0
- package/dist/lib/esm/virtual-file.mjs +264 -0
- package/dist/styles.css +31 -1
- package/modals/code-block-builder/package.json +6 -0
- package/package.json +5 -5
- package/plugin/plugin-async-cleanup/package.json +6 -0
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
(function () {
|
|
6
|
+
function ensureDisposeSymbols(symbolConstructor = Symbol) {
|
|
7
|
+
symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
|
|
8
|
+
symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function ensureBrowserProcess() {
|
|
12
|
+
const browserProcess = {
|
|
13
|
+
browser: true,
|
|
14
|
+
cwd() {
|
|
15
|
+
return "/";
|
|
16
|
+
},
|
|
17
|
+
env: {},
|
|
18
|
+
platform: "android"
|
|
19
|
+
};
|
|
20
|
+
const existingProcess = globalThis.process;
|
|
21
|
+
if (!existingProcess) {
|
|
22
|
+
globalThis.process = browserProcess;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (existingProcess.versions?.node) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const existingProcessRecord = existingProcess;
|
|
29
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
30
|
+
existingProcessRecord[key] ??= value;
|
|
31
|
+
}
|
|
32
|
+
existingProcessRecord["browser"] = true;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
ensureDisposeSymbols();
|
|
36
|
+
ensureBrowserProcess();
|
|
37
|
+
})();
|
|
38
|
+
(function patchObsidianRequire() {
|
|
39
|
+
const originalRequire = require;
|
|
40
|
+
if (!originalRequire || originalRequire.__isPatched) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
require = Object.assign(
|
|
44
|
+
(id) => requirePatched(id),
|
|
45
|
+
originalRequire,
|
|
46
|
+
{
|
|
47
|
+
__isPatched: true
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
function extractDefault($module) {
|
|
51
|
+
return $module && $module.__esModule && "default" in $module ? $module.default : $module;
|
|
52
|
+
}
|
|
53
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
|
|
54
|
+
"@codemirror/autocomplete",
|
|
55
|
+
"@codemirror/collab",
|
|
56
|
+
"@codemirror/commands",
|
|
57
|
+
"@codemirror/language",
|
|
58
|
+
"@codemirror/lint",
|
|
59
|
+
"@codemirror/search",
|
|
60
|
+
"@codemirror/state",
|
|
61
|
+
"@codemirror/text",
|
|
62
|
+
"@codemirror/view",
|
|
63
|
+
"@lezer/common",
|
|
64
|
+
"@lezer/highlight",
|
|
65
|
+
"@lezer/lr",
|
|
66
|
+
"obsidian"
|
|
67
|
+
]);
|
|
68
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
|
|
69
|
+
"@codemirror/closebrackets",
|
|
70
|
+
"@codemirror/comment",
|
|
71
|
+
"@codemirror/fold",
|
|
72
|
+
"@codemirror/gutter",
|
|
73
|
+
"@codemirror/highlight",
|
|
74
|
+
"@codemirror/history",
|
|
75
|
+
"@codemirror/matchbrackets",
|
|
76
|
+
"@codemirror/panel",
|
|
77
|
+
"@codemirror/rangeset",
|
|
78
|
+
"@codemirror/rectangular-selection",
|
|
79
|
+
"@codemirror/stream-parser",
|
|
80
|
+
"@codemirror/tooltip"
|
|
81
|
+
]);
|
|
82
|
+
function requirePatched(id) {
|
|
83
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
84
|
+
return originalRequire?.(id);
|
|
85
|
+
}
|
|
86
|
+
const app = globalThis.app;
|
|
87
|
+
if (app?.isMobile) {
|
|
88
|
+
if (id === "process" || id === "node:process") {
|
|
89
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
90
|
+
return process;
|
|
91
|
+
}
|
|
92
|
+
} else {
|
|
93
|
+
const $module = originalRequire?.(id);
|
|
94
|
+
if ($module) {
|
|
95
|
+
return extractDefault($module);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
99
|
+
return {};
|
|
100
|
+
}
|
|
101
|
+
})();
|
|
102
|
+
|
|
103
|
+
"use strict";
|
|
104
|
+
var __defProp = Object.defineProperty;
|
|
105
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
106
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
107
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
108
|
+
var __export = (target, all) => {
|
|
109
|
+
for (var name in all)
|
|
110
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
111
|
+
};
|
|
112
|
+
var __copyProps = (to, from, except, desc) => {
|
|
113
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
114
|
+
for (let key of __getOwnPropNames(from))
|
|
115
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
116
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
117
|
+
}
|
|
118
|
+
return to;
|
|
119
|
+
};
|
|
120
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
121
|
+
var virtual_file_exports = {};
|
|
122
|
+
__export(virtual_file_exports, {
|
|
123
|
+
registerVirtualFile: () => registerVirtualFile
|
|
124
|
+
});
|
|
125
|
+
module.exports = __toCommonJS(virtual_file_exports);
|
|
126
|
+
var import_state = require('@codemirror/state');
|
|
127
|
+
var import_disposable = require('@mnaoumov/typescript-lib/disposable');
|
|
128
|
+
var import_implementations = require('@obsidian-typings/obsidian-public-latest/implementations');
|
|
129
|
+
var import_obsidian = require('obsidian');
|
|
130
|
+
var import_monkey_around_component = require('./components/monkey-around-component.cjs');
|
|
131
|
+
var import_editor = require('./editor.cjs');
|
|
132
|
+
var import_file_system = require('./file-system.cjs');
|
|
133
|
+
var import_metadata_cache = require('./metadata-cache.cjs');
|
|
134
|
+
var import_obsidian_lib_state = require('./obsidian-lib-state.cjs');
|
|
135
|
+
async function registerVirtualFile(params) {
|
|
136
|
+
const { app, content } = params;
|
|
137
|
+
const path = (0, import_obsidian.normalizePath)(params.path);
|
|
138
|
+
if (!path || path === "/" || params.path.split(/[\\/]/).some((part) => part === "." || part === "..") || /^[\\/]|:/.test(params.path)) {
|
|
139
|
+
throw new Error("A virtual file requires a vault-relative file path");
|
|
140
|
+
}
|
|
141
|
+
const reservations = (0, import_obsidian_lib_state.getObsidianLibState)("virtualFilePathsV1", /* @__PURE__ */ new Set()).value;
|
|
142
|
+
const key = path.toLowerCase();
|
|
143
|
+
if (reservations.has(key) || app.vault.getAbstractFileByPathInsensitive(path)) {
|
|
144
|
+
throw new Error(`File already exists: ${path}`);
|
|
145
|
+
}
|
|
146
|
+
const parent = (0, import_implementations.parentFolderPath)(path);
|
|
147
|
+
if (parent && parent !== "/" && !app.vault.getFolderByPath(parent)) {
|
|
148
|
+
throw new Error(`Parent folder does not exist: ${parent}`);
|
|
149
|
+
}
|
|
150
|
+
reservations.add(key);
|
|
151
|
+
try {
|
|
152
|
+
if (await app.vault.adapter.exists(path)) {
|
|
153
|
+
throw new Error(`File already exists: ${path}`);
|
|
154
|
+
}
|
|
155
|
+
const cache = path.endsWith(".md") ? await (0, import_metadata_cache.parseMetadata)(app, content) : {};
|
|
156
|
+
if (app.vault.getAbstractFileByPathInsensitive(path)) {
|
|
157
|
+
throw new Error(`File already exists: ${path}`);
|
|
158
|
+
}
|
|
159
|
+
return installVirtualFile({ app, cache, content, path, reservations });
|
|
160
|
+
} catch (error) {
|
|
161
|
+
reservations.delete(key);
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function installVirtualFile(params) {
|
|
166
|
+
const { app, cache, content, path, reservations } = params;
|
|
167
|
+
const file = (0, import_file_system.getFile)({ app, pathOrFile: path, shouldIncludeNonExisting: true });
|
|
168
|
+
const bytes = new TextEncoder().encode(content);
|
|
169
|
+
file.stat = { ctime: Date.now(), mtime: Date.now(), size: bytes.byteLength };
|
|
170
|
+
const url = window.URL.createObjectURL(new Blob([bytes], { type: path.endsWith(".md") ? "text/markdown;charset=utf-8" : "text/plain;charset=utf-8" }));
|
|
171
|
+
const patches = new import_monkey_around_component.MonkeyAroundComponent();
|
|
172
|
+
patches.load();
|
|
173
|
+
const metadata = (0, import_metadata_cache.registerFileCacheForNonExistingFile)({ app, cache, pathOrFile: file });
|
|
174
|
+
app.vault.fileMap[path] = file;
|
|
175
|
+
app.metadataCache.uniqueFileLookup.add(file.name.toLowerCase(), file);
|
|
176
|
+
patches.registerMethodPatch({ $object: app.vault, methodName: "read", patchHandler: ({ fallback, originalArguments: [target] }) => target === file ? Promise.resolve(content) : fallback() });
|
|
177
|
+
patches.registerMethodPatch({ $object: app.vault, methodName: "cachedRead", patchHandler: ({ fallback, originalArguments: [target] }) => target === file ? Promise.resolve(content) : fallback() });
|
|
178
|
+
patches.registerMethodPatch({ $object: app.vault, methodName: "readBinary", patchHandler: ({ fallback, originalArguments: [target] }) => target === file ? Promise.resolve(new Uint8Array(bytes).buffer) : fallback() });
|
|
179
|
+
patches.registerMethodPatch({ $object: app.vault, methodName: "getResourcePath", patchHandler: ({ fallback, originalArguments: [target] }) => target === file ? url : fallback() });
|
|
180
|
+
patches.registerMethodPatch({ $object: app.vault.adapter, methodName: "read", patchHandler: ({ fallback, originalArguments: [target] }) => isMatching(target) ? Promise.resolve(content) : fallback() });
|
|
181
|
+
patches.registerMethodPatch({ $object: app.vault.adapter, methodName: "readBinary", patchHandler: ({ fallback, originalArguments: [target] }) => isMatching(target) ? Promise.resolve(new Uint8Array(bytes).buffer) : fallback() });
|
|
182
|
+
patches.registerMethodPatch({ $object: app.vault.adapter, methodName: "getResourcePath", patchHandler: ({ fallback, originalArguments: [target] }) => isMatching(target) ? url : fallback() });
|
|
183
|
+
for (const methodName of ["append", "appendBinary", "modify", "modifyBinary", "process", "delete", "trash"]) {
|
|
184
|
+
patches.registerMethodPatch({
|
|
185
|
+
$object: app.vault,
|
|
186
|
+
methodName,
|
|
187
|
+
patchHandler: ({ fallback, originalArguments: [target] }) => {
|
|
188
|
+
assertWritable(target.path);
|
|
189
|
+
return fallback();
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
patches.registerMethodPatch({
|
|
194
|
+
$object: app.vault,
|
|
195
|
+
methodName: "rename",
|
|
196
|
+
patchHandler: ({ fallback, originalArguments: [target, destination] }) => {
|
|
197
|
+
assertWritable(target.path);
|
|
198
|
+
assertWritable(destination);
|
|
199
|
+
return fallback();
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
for (const methodName of ["create", "createBinary", "createFolder"]) {
|
|
203
|
+
patches.registerMethodPatch({
|
|
204
|
+
$object: app.vault,
|
|
205
|
+
methodName,
|
|
206
|
+
patchHandler: ({ fallback, originalArguments: [target] }) => {
|
|
207
|
+
assertWritable(target);
|
|
208
|
+
return fallback();
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
patches.registerMethodPatch({
|
|
213
|
+
$object: app.vault,
|
|
214
|
+
methodName: "copy",
|
|
215
|
+
patchHandler: ({ fallback, originalArguments: [, destination] }) => {
|
|
216
|
+
assertWritable(destination);
|
|
217
|
+
return fallback();
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
for (const methodName of ["write", "writeBinary", "append", "appendBinary", "process", "remove", "rmdir", "trashLocal", "trashSystem", "mkdir"]) {
|
|
221
|
+
patches.registerMethodPatch({
|
|
222
|
+
$object: app.vault.adapter,
|
|
223
|
+
methodName,
|
|
224
|
+
patchHandler: ({ fallback, originalArguments: [target] }) => {
|
|
225
|
+
assertWritable(target);
|
|
226
|
+
return fallback();
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
patches.registerMethodPatch({
|
|
231
|
+
$object: app.vault.adapter,
|
|
232
|
+
methodName: "rename",
|
|
233
|
+
patchHandler: ({ fallback, originalArguments: [target, destination] }) => {
|
|
234
|
+
assertWritable(target);
|
|
235
|
+
assertWritable(destination);
|
|
236
|
+
return fallback();
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
patches.registerMethodPatch({
|
|
240
|
+
$object: app.vault.adapter,
|
|
241
|
+
methodName: "copy",
|
|
242
|
+
patchHandler: ({ fallback, originalArguments: [, destination] }) => {
|
|
243
|
+
assertWritable(destination);
|
|
244
|
+
return fallback();
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
patches.registerMethodPatch({
|
|
248
|
+
$object: app.fileManager,
|
|
249
|
+
methodName: "renameFile",
|
|
250
|
+
patchHandler: ({ fallback, originalArguments: [target, destination] }) => {
|
|
251
|
+
assertWritable(target.path);
|
|
252
|
+
assertWritable(destination);
|
|
253
|
+
return fallback();
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
patches.registerMethodPatch({
|
|
257
|
+
$object: app.fileManager,
|
|
258
|
+
methodName: "trashFile",
|
|
259
|
+
patchHandler: ({ fallback, originalArguments: [target] }) => {
|
|
260
|
+
assertWritable(target.path);
|
|
261
|
+
return fallback();
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
patches.registerMethodPatch({
|
|
265
|
+
$object: import_obsidian.MarkdownView.prototype,
|
|
266
|
+
methodName: "setViewData",
|
|
267
|
+
patchHandler: ({ fallback, originalThis }) => {
|
|
268
|
+
fallback();
|
|
269
|
+
if (originalThis.file === file) {
|
|
270
|
+
protectEditor(originalThis);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
patches.registerMethodPatch({
|
|
275
|
+
$object: import_obsidian.MarkdownView.prototype,
|
|
276
|
+
methodName: "onLoadFile",
|
|
277
|
+
patchHandler: async ({ fallback, originalThis }) => {
|
|
278
|
+
await fallback();
|
|
279
|
+
if (originalThis.file === file) {
|
|
280
|
+
protectEditor(originalThis);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
patches.registerMethodPatch({
|
|
285
|
+
$object: import_obsidian.MarkdownView.prototype,
|
|
286
|
+
methodName: "setMode",
|
|
287
|
+
patchHandler: async ({ fallback, originalThis }) => {
|
|
288
|
+
const result = await fallback();
|
|
289
|
+
if (originalThis.file === file) {
|
|
290
|
+
protectEditor(originalThis);
|
|
291
|
+
}
|
|
292
|
+
return result;
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
const disposable = new import_disposable.CallbackDisposable({
|
|
296
|
+
callback: () => {
|
|
297
|
+
app.workspace.iterateAllLeaves((leaf) => {
|
|
298
|
+
if ("file" in leaf.view && leaf.view.file === file) {
|
|
299
|
+
leaf.detach();
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
app.metadataCache.uniqueFileLookup.remove(file.name.toLowerCase(), file);
|
|
303
|
+
if (app.vault.fileMap[path] === file) {
|
|
304
|
+
Reflect.deleteProperty(app.vault.fileMap, path);
|
|
305
|
+
metadata[Symbol.dispose]();
|
|
306
|
+
}
|
|
307
|
+
patches.unload();
|
|
308
|
+
window.URL.revokeObjectURL(url);
|
|
309
|
+
reservations.delete(path.toLowerCase());
|
|
310
|
+
},
|
|
311
|
+
multipleDisposeBehavior: import_disposable.MultipleDisposeBehavior.Ignore
|
|
312
|
+
});
|
|
313
|
+
return {
|
|
314
|
+
content,
|
|
315
|
+
file,
|
|
316
|
+
[Symbol.dispose]: () => {
|
|
317
|
+
disposable[Symbol.dispose]();
|
|
318
|
+
}
|
|
319
|
+
};
|
|
320
|
+
function isMatching(target) {
|
|
321
|
+
return (0, import_obsidian.normalizePath)(target).toLowerCase() === path.toLowerCase();
|
|
322
|
+
}
|
|
323
|
+
function protectEditor(view) {
|
|
324
|
+
(0, import_editor.toggleEditorReadOnly)(view.editor, true);
|
|
325
|
+
view.editor.cm.dispatch({
|
|
326
|
+
effects: import_state.StateEffect.appendConfig.of(import_state.EditorState.changeFilter.of(() => view.file !== file))
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
function assertWritable(target) {
|
|
330
|
+
const normalized = (0, import_obsidian.normalizePath)(target).toLowerCase();
|
|
331
|
+
if (isMatching(target) || path.toLowerCase().startsWith(`${normalized}/`) || normalized === "/") {
|
|
332
|
+
throw new Error(`Virtual file is read-only: ${path}`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
337
|
+
0 && (module.exports = {
|
|
338
|
+
registerVirtualFile
|
|
339
|
+
});
|
|
340
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92aXJ0dWFsLWZpbGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICogRGlzcG9zYWJsZSwgcmVhZC1vbmx5IGZpbGVzIGJhY2tlZCBieSBtZW1vcnkgaW5zdGVhZCBvZiB0aGUgdmF1bHQgYWRhcHRlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBFZGl0b3JTdGF0ZSxcbiAgU3RhdGVFZmZlY3Rcbn0gZnJvbSAnQGNvZGVtaXJyb3Ivc3RhdGUnO1xuaW1wb3J0IHtcbiAgQ2FsbGJhY2tEaXNwb3NhYmxlLFxuICBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvclxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGlzcG9zYWJsZSc7XG5pbXBvcnQgeyBwYXJlbnRGb2xkZXJQYXRoIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgTWFya2Rvd25WaWV3LFxuICBub3JtYWxpemVQYXRoXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgTW9ua2V5QXJvdW5kQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IHRvZ2dsZUVkaXRvclJlYWRPbmx5IH0gZnJvbSAnLi9lZGl0b3IudHMnO1xuaW1wb3J0IHsgZ2V0RmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgcGFyc2VNZXRhZGF0YSxcbiAgcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGVcbn0gZnJvbSAnLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYlN0YXRlIH0gZnJvbSAnLi9vYnNpZGlhbi1saWItc3RhdGUudHMnO1xuXG4vKipcblBhcmFtZXRlcnMgZm9yIHtAbGluayByZWdpc3RlclZpcnR1YWxGaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlclZpcnR1YWxGaWxlUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBhcHAgd2hvc2UgcmVzb2x2ZXIgYW5kIHJlYWQgbWV0aG9kcyBzZXJ2ZSB0aGUgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICAvKipcbiAgSW1tdXRhYmxlIFVURi04IHRleHQsIGFsc28gYXZhaWxhYmxlIHN5bmNocm9ub3VzbHkgb24gdGhlIHJlZ2lzdHJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcbiAgLyoqXG4gIFVub2NjdXBpZWQgdmF1bHQtcmVsYXRpdmUgZmlsZSBwYXRoIGluIGFuIGV4aXN0aW5nIGZvbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuLyoqXG5BIG1lbW9yeSBmaWxlIGFuZCBpdHMgbGlmZXRpbWUuIERpc3Bvc2UgaXQgYmVmb3JlIGl0cyBvd25pbmcgcGx1Z2luIHVubG9hZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlydHVhbEZpbGUgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgLyoqXG4gIFRoZSBpbW11dGFibGUgdGV4dDsgYWNjZXNzaW5nIGl0IHJlcXVpcmVzIG5vIGFzeW5jaHJvbm91cyByZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuICAvKipcbiAgVGhlIGZpbGUgYWNjZXB0ZWQgYnkgT2JzaWRpYW4ncyBsaW5rIHJlc29sdmVyIGFuZCBmaWxlIHZpZXdzLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZTogVEZpbGU7XG59XG5cbmludGVyZmFjZSBJbnN0YWxsVmlydHVhbEZpbGVQYXJhbXMgZXh0ZW5kcyBSZWdpc3RlclZpcnR1YWxGaWxlUGFyYW1zIHtcbiAgcmVhZG9ubHkgY2FjaGU6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgcGFyc2VNZXRhZGF0YT4+IHwgUmVjb3JkPHN0cmluZywgbmV2ZXI+O1xuICByZWFkb25seSByZXNlcnZhdGlvbnM6IFNldDxzdHJpbmc+O1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBpbW11dGFibGUgdGV4dCBhcyBhIGZpbGUgd2l0aG91dCB3cml0aW5nIHRvIHRoZSBhZGFwdGVyLlxuICpcbiAqIFRoZSBwYXJlbnQgZm9sZGVyIG11c3QgZXhpc3QuIE1hcmtkb3duIHZpZXdzIGFyZSByZWFkLW9ubHk7IHZhdWx0IGFuZCBhZGFwdGVyIG11dGF0aW9ucyBvZiB0aGVcbiAqIHBhdGggb3IgaXRzIGFuY2VzdG9ycyB0aHJvdy4gUmF3IGZpbGVzeXN0ZW0gYWNjZXNzIGFuZCB0aGlyZC1wYXJ0eSB2aWV3cyBhcmUgb3V0c2lkZSB0aGlzIGNvbnRyYWN0LlxuICogUmVzb3VyY2UgVVJMcyB1c2UgVVRGLTggYmxvYnMuIERpc3Bvc2luZyBjbG9zZXMgdmlld3Mgb2YgdGhpcyBmaWxlIGFuZCByZXZva2VzIGl0cyBVUkwuIE5vIGNyZWF0ZVxuICogb3IgZGVsZXRlIGV2ZW50cyBhcmUgZW1pdHRlZCwgc28gaW5kZXhlcnMgYW5kIHN5bmNocm9uaXphdGlvbiBuZXZlciB0cmVhdCBpdCBhcyBhIHBlcnNpc3RlZCBmaWxlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgYXBwLCBwYXRoIGFuZCBpbW11dGFibGUgdGV4dC5cbiAqIEByZXR1cm5zIFRoZSByZWdpc3RlcmVkIGZpbGUsIHN5bmNocm9ub3VzIGNvbnRlbnQgYW5kIGlkZW1wb3RlbnQgZGlzcG9zYWwgY2FsbGJhY2suXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdpc3RlclZpcnR1YWxGaWxlKHBhcmFtczogUmVnaXN0ZXJWaXJ0dWFsRmlsZVBhcmFtcyk6IFByb21pc2U8VmlydHVhbEZpbGU+IHtcbiAgY29uc3QgeyBhcHAsIGNvbnRlbnQgfSA9IHBhcmFtcztcbiAgY29uc3QgcGF0aCA9IG5vcm1hbGl6ZVBhdGgocGFyYW1zLnBhdGgpO1xuICBpZiAoIXBhdGggfHwgcGF0aCA9PT0gJy8nIHx8IHBhcmFtcy5wYXRoLnNwbGl0KC9bXFxcXC9dLykuc29tZSgocGFydCkgPT4gcGFydCA9PT0gJy4nIHx8IHBhcnQgPT09ICcuLicpIHx8IC9eW1xcXFwvXXw6Ly50ZXN0KHBhcmFtcy5wYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQSB2aXJ0dWFsIGZpbGUgcmVxdWlyZXMgYSB2YXVsdC1yZWxhdGl2ZSBmaWxlIHBhdGgnKTtcbiAgfVxuICBjb25zdCByZXNlcnZhdGlvbnMgPSBnZXRPYnNpZGlhbkxpYlN0YXRlKCd2aXJ0dWFsRmlsZVBhdGhzVjEnLCBuZXcgU2V0PHN0cmluZz4oKSkudmFsdWU7XG4gIGNvbnN0IGtleSA9IHBhdGgudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJlc2VydmF0aW9ucy5oYXMoa2V5KSB8fCBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoSW5zZW5zaXRpdmUocGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgYWxyZWFkeSBleGlzdHM6ICR7cGF0aH1gKTtcbiAgfVxuICBjb25zdCBwYXJlbnQgPSBwYXJlbnRGb2xkZXJQYXRoKHBhdGgpO1xuICBpZiAocGFyZW50ICYmIHBhcmVudCAhPT0gJy8nICYmICFhcHAudmF1bHQuZ2V0Rm9sZGVyQnlQYXRoKHBhcmVudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBhcmVudCBmb2xkZXIgZG9lcyBub3QgZXhpc3Q6ICR7cGFyZW50fWApO1xuICB9XG4gIHJlc2VydmF0aW9ucy5hZGQoa2V5KTtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKHBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgYWxyZWFkeSBleGlzdHM6ICR7cGF0aH1gKTtcbiAgICB9XG4gICAgY29uc3QgY2FjaGUgPSBwYXRoLmVuZHNXaXRoKCcubWQnKSA/IGF3YWl0IHBhcnNlTWV0YWRhdGEoYXBwLCBjb250ZW50KSA6IHt9O1xuICAgIC8vIFJlY2hlY2sgYWZ0ZXIgYXN5bmNocm9ub3VzIHdvcmssIGJlZm9yZSBwdWJsaXNoaW5nIGFueXRoaW5nIHRvIHRoZSByZXNvbHZlci5cbiAgICBpZiAoYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aEluc2Vuc2l0aXZlKHBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgYWxyZWFkeSBleGlzdHM6ICR7cGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbGxWaXJ0dWFsRmlsZSh7IGFwcCwgY2FjaGUsIGNvbnRlbnQsIHBhdGgsIHJlc2VydmF0aW9ucyB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXNlcnZhdGlvbnMuZGVsZXRlKGtleSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbFZpcnR1YWxGaWxlKHBhcmFtczogSW5zdGFsbFZpcnR1YWxGaWxlUGFyYW1zKTogVmlydHVhbEZpbGUge1xuICBjb25zdCB7IGFwcCwgY2FjaGUsIGNvbnRlbnQsIHBhdGgsIHJlc2VydmF0aW9ucyB9ID0gcGFyYW1zO1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBjb25zdCBieXRlcyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShjb250ZW50KTtcbiAgZmlsZS5zdGF0ID0geyBjdGltZTogRGF0ZS5ub3coKSwgbXRpbWU6IERhdGUubm93KCksIHNpemU6IGJ5dGVzLmJ5dGVMZW5ndGggfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBUaGlzIGlzIHRoZSBicm93c2VyJ3MgQmxvYiBVUkwgQVBJIGluIE9ic2lkaWFuLCBub3QgTm9kZSdzIGltcGxlbWVudGF0aW9uLlxuICBjb25zdCB1cmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbYnl0ZXNdLCB7IHR5cGU6IHBhdGguZW5kc1dpdGgoJy5tZCcpID8gJ3RleHQvbWFya2Rvd247Y2hhcnNldD11dGYtOCcgOiAndGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04JyB9KSk7XG4gIGNvbnN0IHBhdGNoZXMgPSBuZXcgTW9ua2V5QXJvdW5kQ29tcG9uZW50KCk7XG4gIHBhdGNoZXMubG9hZCgpO1xuICBjb25zdCBtZXRhZGF0YSA9IHJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlKHsgYXBwLCBjYWNoZSwgcGF0aE9yRmlsZTogZmlsZSB9KTtcbiAgYXBwLnZhdWx0LmZpbGVNYXBbcGF0aF0gPSBmaWxlO1xuICBhcHAubWV0YWRhdGFDYWNoZS51bmlxdWVGaWxlTG9va3VwLmFkZChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKSwgZmlsZSk7XG5cbiAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHsgJG9iamVjdDogYXBwLnZhdWx0LCBtZXRob2ROYW1lOiAncmVhZCcsIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbdGFyZ2V0XSB9KSA9PiB0YXJnZXQgPT09IGZpbGUgPyBQcm9taXNlLnJlc29sdmUoY29udGVudCkgOiBmYWxsYmFjaygpIH0pO1xuICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goeyAkb2JqZWN0OiBhcHAudmF1bHQsIG1ldGhvZE5hbWU6ICdjYWNoZWRSZWFkJywgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFt0YXJnZXRdIH0pID0+IHRhcmdldCA9PT0gZmlsZSA/IFByb21pc2UucmVzb2x2ZShjb250ZW50KSA6IGZhbGxiYWNrKCkgfSk7XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7ICRvYmplY3Q6IGFwcC52YXVsdCwgbWV0aG9kTmFtZTogJ3JlYWRCaW5hcnknLCBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3RhcmdldF0gfSkgPT4gdGFyZ2V0ID09PSBmaWxlID8gUHJvbWlzZS5yZXNvbHZlKG5ldyBVaW50OEFycmF5KGJ5dGVzKS5idWZmZXIpIDogZmFsbGJhY2soKSB9KTtcbiAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHsgJG9iamVjdDogYXBwLnZhdWx0LCBtZXRob2ROYW1lOiAnZ2V0UmVzb3VyY2VQYXRoJywgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFt0YXJnZXRdIH0pID0+IHRhcmdldCA9PT0gZmlsZSA/IHVybCA6IGZhbGxiYWNrKCkgfSk7XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7ICRvYmplY3Q6IGFwcC52YXVsdC5hZGFwdGVyLCBtZXRob2ROYW1lOiAncmVhZCcsIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbdGFyZ2V0XSB9KSA9PiBpc01hdGNoaW5nKHRhcmdldCkgPyBQcm9taXNlLnJlc29sdmUoY29udGVudCkgOiBmYWxsYmFjaygpIH0pO1xuICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goeyAkb2JqZWN0OiBhcHAudmF1bHQuYWRhcHRlciwgbWV0aG9kTmFtZTogJ3JlYWRCaW5hcnknLCBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3RhcmdldF0gfSkgPT4gaXNNYXRjaGluZyh0YXJnZXQpID8gUHJvbWlzZS5yZXNvbHZlKG5ldyBVaW50OEFycmF5KGJ5dGVzKS5idWZmZXIpIDogZmFsbGJhY2soKSB9KTtcbiAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHsgJG9iamVjdDogYXBwLnZhdWx0LmFkYXB0ZXIsIG1ldGhvZE5hbWU6ICdnZXRSZXNvdXJjZVBhdGgnLCBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3RhcmdldF0gfSkgPT4gaXNNYXRjaGluZyh0YXJnZXQpID8gdXJsIDogZmFsbGJhY2soKSB9KTtcblxuICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgb2YgWydhcHBlbmQnLCAnYXBwZW5kQmluYXJ5JywgJ21vZGlmeScsICdtb2RpZnlCaW5hcnknLCAncHJvY2VzcycsICdkZWxldGUnLCAndHJhc2gnXSBhcyBjb25zdCkge1xuICAgIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgICAkb2JqZWN0OiBhcHAudmF1bHQsXG4gICAgICBtZXRob2ROYW1lLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFt0YXJnZXRdIH0pID0+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGFibGUodGFyZ2V0LnBhdGgpO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICRvYmplY3Q6IGFwcC52YXVsdCxcbiAgICBtZXRob2ROYW1lOiAncmVuYW1lJyxcbiAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3RhcmdldCwgZGVzdGluYXRpb25dIH0pID0+IHtcbiAgICAgIGFzc2VydFdyaXRhYmxlKHRhcmdldC5wYXRoKTtcbiAgICAgIGFzc2VydFdyaXRhYmxlKGRlc3RpbmF0aW9uKTtcbiAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgIH1cbiAgfSk7XG4gIGZvciAoY29uc3QgbWV0aG9kTmFtZSBvZiBbJ2NyZWF0ZScsICdjcmVhdGVCaW5hcnknLCAnY3JlYXRlRm9sZGVyJ10gYXMgY29uc3QpIHtcbiAgICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogYXBwLnZhdWx0LFxuICAgICAgbWV0aG9kTmFtZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbdGFyZ2V0XSB9KSA9PiB7XG4gICAgICAgIGFzc2VydFdyaXRhYmxlKHRhcmdldCk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgJG9iamVjdDogYXBwLnZhdWx0LFxuICAgIG1ldGhvZE5hbWU6ICdjb3B5JyxcbiAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogWywgZGVzdGluYXRpb25dIH0pID0+IHtcbiAgICAgIGFzc2VydFdyaXRhYmxlKGRlc3RpbmF0aW9uKTtcbiAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgIH1cbiAgfSk7XG4gIGZvciAoY29uc3QgbWV0aG9kTmFtZSBvZiBbJ3dyaXRlJywgJ3dyaXRlQmluYXJ5JywgJ2FwcGVuZCcsICdhcHBlbmRCaW5hcnknLCAncHJvY2VzcycsICdyZW1vdmUnLCAncm1kaXInLCAndHJhc2hMb2NhbCcsICd0cmFzaFN5c3RlbScsICdta2RpciddIGFzIGNvbnN0KSB7XG4gICAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAgICRvYmplY3Q6IGFwcC52YXVsdC5hZGFwdGVyLFxuICAgICAgbWV0aG9kTmFtZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbdGFyZ2V0XSB9KSA9PiB7XG4gICAgICAgIGFzc2VydFdyaXRhYmxlKHRhcmdldCk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgJG9iamVjdDogYXBwLnZhdWx0LmFkYXB0ZXIsXG4gICAgbWV0aG9kTmFtZTogJ3JlbmFtZScsXG4gICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFt0YXJnZXQsIGRlc3RpbmF0aW9uXSB9KSA9PiB7XG4gICAgICBhc3NlcnRXcml0YWJsZSh0YXJnZXQpO1xuICAgICAgYXNzZXJ0V3JpdGFibGUoZGVzdGluYXRpb24pO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgfVxuICB9KTtcbiAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAkb2JqZWN0OiBhcHAudmF1bHQuYWRhcHRlcixcbiAgICBtZXRob2ROYW1lOiAnY29weScsXG4gICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFssIGRlc3RpbmF0aW9uXSB9KSA9PiB7XG4gICAgICBhc3NlcnRXcml0YWJsZShkZXN0aW5hdGlvbik7XG4gICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICB9XG4gIH0pO1xuICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICRvYmplY3Q6IGFwcC5maWxlTWFuYWdlcixcbiAgICBtZXRob2ROYW1lOiAncmVuYW1lRmlsZScsXG4gICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFt0YXJnZXQsIGRlc3RpbmF0aW9uXSB9KSA9PiB7XG4gICAgICBhc3NlcnRXcml0YWJsZSh0YXJnZXQucGF0aCk7XG4gICAgICBhc3NlcnRXcml0YWJsZShkZXN0aW5hdGlvbik7XG4gICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICB9XG4gIH0pO1xuICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICRvYmplY3Q6IGFwcC5maWxlTWFuYWdlcixcbiAgICBtZXRob2ROYW1lOiAndHJhc2hGaWxlJyxcbiAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3RhcmdldF0gfSkgPT4ge1xuICAgICAgYXNzZXJ0V3JpdGFibGUodGFyZ2V0LnBhdGgpO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgfVxuICB9KTtcbiAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAkb2JqZWN0OiBNYXJrZG93blZpZXcucHJvdG90eXBlLFxuICAgIG1ldGhvZE5hbWU6ICdzZXRWaWV3RGF0YScsXG4gICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxUaGlzIH0pID0+IHtcbiAgICAgIGZhbGxiYWNrKCk7XG4gICAgICBpZiAob3JpZ2luYWxUaGlzLmZpbGUgPT09IGZpbGUpIHtcbiAgICAgICAgcHJvdGVjdEVkaXRvcihvcmlnaW5hbFRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgJG9iamVjdDogTWFya2Rvd25WaWV3LnByb3RvdHlwZSxcbiAgICBtZXRob2ROYW1lOiAnb25Mb2FkRmlsZScsXG4gICAgcGF0Y2hIYW5kbGVyOiBhc3luYyAoeyBmYWxsYmFjaywgb3JpZ2luYWxUaGlzIH0pID0+IHtcbiAgICAgIGF3YWl0IGZhbGxiYWNrKCk7XG4gICAgICBpZiAob3JpZ2luYWxUaGlzLmZpbGUgPT09IGZpbGUpIHtcbiAgICAgICAgcHJvdGVjdEVkaXRvcihvcmlnaW5hbFRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgJG9iamVjdDogTWFya2Rvd25WaWV3LnByb3RvdHlwZSxcbiAgICBtZXRob2ROYW1lOiAnc2V0TW9kZScsXG4gICAgcGF0Y2hIYW5kbGVyOiBhc3luYyAoeyBmYWxsYmFjaywgb3JpZ2luYWxUaGlzIH0pID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tY29uZnVzaW5nLXZvaWQtZXhwcmVzc2lvbiAtLSBPYnNpZGlhbiByZXR1cm5zIGEgYm9vbGVhbiBkZXNwaXRlIGl0cyB2b2lkIGRlY2xhcmF0aW9uOyBzZXRTdGF0ZSBjb25zdW1lcyB0aGF0IHJlc3VsdC5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZhbGxiYWNrKCk7XG4gICAgICBpZiAob3JpZ2luYWxUaGlzLmZpbGUgPT09IGZpbGUpIHtcbiAgICAgICAgcHJvdGVjdEVkaXRvcihvcmlnaW5hbFRoaXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGRpc3Bvc2FibGUgPSBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgYXBwLndvcmtzcGFjZS5pdGVyYXRlQWxsTGVhdmVzKChsZWFmKSA9PiB7XG4gICAgICAgIGlmICgnZmlsZScgaW4gbGVhZi52aWV3ICYmIGxlYWYudmlldy5maWxlID09PSBmaWxlKSB7XG4gICAgICAgICAgbGVhZi5kZXRhY2goKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhcHAubWV0YWRhdGFDYWNoZS51bmlxdWVGaWxlTG9va3VwLnJlbW92ZShmaWxlLm5hbWUudG9Mb3dlckNhc2UoKSwgZmlsZSk7XG4gICAgICBpZiAoYXBwLnZhdWx0LmZpbGVNYXBbcGF0aF0gPT09IGZpbGUpIHtcbiAgICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShhcHAudmF1bHQuZmlsZU1hcCwgcGF0aCk7XG4gICAgICAgIG1ldGFkYXRhW1N5bWJvbC5kaXNwb3NlXSgpO1xuICAgICAgfVxuICAgICAgcGF0Y2hlcy51bmxvYWQoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlIFVSTCBiZWxvbmdzIHRvIHRoZSBicm93c2VyIHJlYWxtIHRoYXQgY3JlYXRlZCBpdC5cbiAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgICByZXNlcnZhdGlvbnMuZGVsZXRlKHBhdGgudG9Mb3dlckNhc2UoKSk7XG4gICAgfSxcbiAgICBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlXG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGNvbnRlbnQsXG4gICAgZmlsZSxcbiAgICBbU3ltYm9sLmRpc3Bvc2VdOiAoKTogdm9pZCA9PiB7XG4gICAgICBkaXNwb3NhYmxlW1N5bWJvbC5kaXNwb3NlXSgpO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBpc01hdGNoaW5nKHRhcmdldDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVBhdGgodGFyZ2V0KS50b0xvd2VyQ2FzZSgpID09PSBwYXRoLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICBmdW5jdGlvbiBwcm90ZWN0RWRpdG9yKHZpZXc6IE1hcmtkb3duVmlldyk6IHZvaWQge1xuICAgIHRvZ2dsZUVkaXRvclJlYWRPbmx5KHZpZXcuZWRpdG9yLCB0cnVlKTtcbiAgICAvLyBBIHZpcnR1YWwgZmlsZSBpcyBpbW11dGFibGUgZXZlbiB0byBwcm9ncmFtbWF0aWMgZWRpdG9yIHRyYW5zYWN0aW9ucy4gVGhlIG9yZGluYXJ5IHJlc291cmNlXG4gICAgLy8gbG9jayBwZXJtaXRzIHRob3NlIGZvciByb2xsYmFjazsgdGhpcyByZWdpc3RyYXRpb24gaGFzIG5vIHdyaXRhYmxlIGJ1ZmZlciB0byByb2xsIGJhY2suXG4gICAgdmlldy5lZGl0b3IuY20uZGlzcGF0Y2goe1xuICAgICAgZWZmZWN0czogU3RhdGVFZmZlY3QuYXBwZW5kQ29uZmlnLm9mKEVkaXRvclN0YXRlLmNoYW5nZUZpbHRlci5vZigoKSA9PiB2aWV3LmZpbGUgIT09IGZpbGUpKVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gYXNzZXJ0V3JpdGFibGUodGFyZ2V0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUGF0aCh0YXJnZXQpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGlzTWF0Y2hpbmcodGFyZ2V0KSB8fCBwYXRoLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChgJHtub3JtYWxpemVkfS9gKSB8fCBub3JtYWxpemVkID09PSAnLycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVmlydHVhbCBmaWxlIGlzIHJlYWQtb25seTogJHtwYXRofWApO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBVUEsbUJBR087QUFDUCx3QkFHTztBQUNQLDZCQUFpQztBQUNqQyxzQkFHTztBQUVQLHFDQUFzQztBQUN0QyxvQkFBcUM7QUFDckMseUJBQXdCO0FBQ3hCLDRCQUdPO0FBQ1AsZ0NBQW9DO0FBa0RwQyxlQUFzQixvQkFBb0IsUUFBeUQ7QUFDakcsUUFBTSxFQUFFLEtBQUssUUFBUSxJQUFJO0FBQ3pCLFFBQU0sV0FBTywrQkFBYyxPQUFPLElBQUk7QUFDdEMsTUFBSSxDQUFDLFFBQVEsU0FBUyxPQUFPLE9BQU8sS0FBSyxNQUFNLE9BQU8sRUFBRSxLQUFLLENBQUMsU0FBUyxTQUFTLE9BQU8sU0FBUyxJQUFJLEtBQUssV0FBVyxLQUFLLE9BQU8sSUFBSSxHQUFHO0FBQ3JJLFVBQU0sSUFBSSxNQUFNLG9EQUFvRDtBQUFBLEVBQ3RFO0FBQ0EsUUFBTSxtQkFBZSwrQ0FBb0Isc0JBQXNCLG9CQUFJLElBQVksQ0FBQyxFQUFFO0FBQ2xGLFFBQU0sTUFBTSxLQUFLLFlBQVk7QUFDN0IsTUFBSSxhQUFhLElBQUksR0FBRyxLQUFLLElBQUksTUFBTSxpQ0FBaUMsSUFBSSxHQUFHO0FBQzdFLFVBQU0sSUFBSSxNQUFNLHdCQUF3QixJQUFJLEVBQUU7QUFBQSxFQUNoRDtBQUNBLFFBQU0sYUFBUyx5Q0FBaUIsSUFBSTtBQUNwQyxNQUFJLFVBQVUsV0FBVyxPQUFPLENBQUMsSUFB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
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/// <reference path="./library-references.d.cts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
* Disposable, read-only files backed by memory instead of the vault adapter.
|
|
5
|
+
*/
|
|
6
|
+
import type { App, TFile } from 'obsidian' with { 'resolution-mode': 'import' };
|
|
7
|
+
/**
|
|
8
|
+
Parameters for {@link registerVirtualFile}.
|
|
9
|
+
*/
|
|
10
|
+
export interface RegisterVirtualFileParams {
|
|
11
|
+
/**
|
|
12
|
+
The app whose resolver and read methods serve the file.
|
|
13
|
+
*/
|
|
14
|
+
readonly app: App;
|
|
15
|
+
/**
|
|
16
|
+
Immutable UTF-8 text, also available synchronously on the registration.
|
|
17
|
+
*/
|
|
18
|
+
readonly content: string;
|
|
19
|
+
/**
|
|
20
|
+
Unoccupied vault-relative file path in an existing folder.
|
|
21
|
+
*/
|
|
22
|
+
readonly path: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
A memory file and its lifetime. Dispose it before its owning plugin unloads.
|
|
26
|
+
*/
|
|
27
|
+
export interface VirtualFile extends Disposable {
|
|
28
|
+
/**
|
|
29
|
+
The immutable text; accessing it requires no asynchronous read.
|
|
30
|
+
*/
|
|
31
|
+
readonly content: string;
|
|
32
|
+
/**
|
|
33
|
+
The file accepted by Obsidian's link resolver and file views.
|
|
34
|
+
*/
|
|
35
|
+
readonly file: TFile;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Registers immutable text as a file without writing to the adapter.
|
|
39
|
+
*
|
|
40
|
+
* The parent folder must exist. Markdown views are read-only; vault and adapter mutations of the
|
|
41
|
+
* path or its ancestors throw. Raw filesystem access and third-party views are outside this contract.
|
|
42
|
+
* Resource URLs use UTF-8 blobs. Disposing closes views of this file and revokes its URL. No create
|
|
43
|
+
* or delete events are emitted, so indexers and synchronization never treat it as a persisted file.
|
|
44
|
+
*
|
|
45
|
+
* @param params - The app, path and immutable text.
|
|
46
|
+
* @returns The registered file, synchronous content and idempotent disposal callback.
|
|
47
|
+
*/
|
|
48
|
+
export declare function registerVirtualFile(params: RegisterVirtualFileParams): Promise<VirtualFile>;
|
|
@@ -17,6 +17,7 @@ export { getCanvasReferences } from './canvas.mjs';
|
|
|
17
17
|
export { CaseInsensitiveFileIndex, getCaseInsensitiveFileIndex, setCaseInsensitiveFileIndex, unsetCaseInsensitiveFileIndex } from './case-insensitive-file-index.mjs';
|
|
18
18
|
export { createCodeBlockRegExp } from './code-block-reg-exp.mjs';
|
|
19
19
|
export { captureCodeBlockFocus, claimCodeBlockRenderHandoff, CODE_BLOCK_RENDER_HANDOFF_LIFETIME_IN_MILLISECONDS, recordCodeBlockRenderHandoff, restoreCodeBlockFocus } from './code-block-render-handoff.mjs';
|
|
20
|
+
export { createLivePreviewOnlyExtension, createSourceModeOnlyExtension, isLivePreview } from './codemirror/editor-mode-extension.mjs';
|
|
20
21
|
export { createIncrementalParseStateField } from './codemirror/incremental-parse-state-field.mjs';
|
|
21
22
|
export { createInlineTokenWidgetsExtension, execAll, toGlobalRegExp } from './codemirror/inline-token-widgets.mjs';
|
|
22
23
|
export { dispatchToAllMarkdownEditorViews, getAllMarkdownEditorViews } from './codemirror/markdown-editor-views.mjs';
|
|
@@ -40,7 +41,7 @@ export { UnlockActiveNoteCommandHandler } from './command-handlers/unlock-active
|
|
|
40
41
|
export { PluginCommandRegistrar } from './command-registrar.mjs';
|
|
41
42
|
export { configureCommunityPlugin, ConfigureCommunityPluginResult, disableCommunityPlugin, enableCommunityPlugin, getCommunityPluginRepo, getLatestReleaseVersion, installCommunityPlugin, installConfigureEnableCommunityPlugin, PluginEnableRefusedError, searchCommunityPlugins, toggleEnableCommunityPlugin, toggleInstallCommunityPlugin, uninstallCommunityPlugin, updateCommunityPlugin, UpdateCommunityPluginResult } from './community-plugins.mjs';
|
|
42
43
|
export { AbortSignalComponent } from './components/abort-signal-component.mjs';
|
|
43
|
-
export { AllWindowsEventComponent } from './components/all-windows-event-component.mjs';
|
|
44
|
+
export { AllWindowsEventComponent, forEachWindow, registerBodyClass } from './components/all-windows-event-component.mjs';
|
|
44
45
|
export { AsyncErrorHandlerComponent } from './components/async-error-handler-component.mjs';
|
|
45
46
|
export { registerAsyncEvent } from './components/async-events-component.mjs';
|
|
46
47
|
export { BulkOperationCommitComponent } from './components/bulk-operation-commit-component.mjs';
|
|
@@ -106,6 +107,7 @@ export { revealInFileExplorer } from './file-explorer.mjs';
|
|
|
106
107
|
export { addAlias, deleteAlias, processFrontmatter, waitForPendingLinkUpdates } from './file-manager.mjs';
|
|
107
108
|
export { asArrayOfFiles, asArrayOfFolders, asFile, asFileOrNull, asFolder, asFolderOrNull, BASE_FILE_EXTENSION, CANVAS_FILE_EXTENSION, checkExtension, doesExist, FileSystemType, getAbstractFile, getAbstractFileOrNull, getBasename, getExtension, getFile, getFileOrNull, getFileSystemType, getFolder, getFolderOrNull, getMarkdownFiles, getOrCreateFile, getOrCreateFolder, getPath, isAbstractFile, isBaseFile, isCanvasFile, isFile, isFolder, isMarkdownFile, isNote, isPathOrFile, isTreatedAsAttachment, MARKDOWN_FILE_EXTENSION, MissingPathTreatment, trimMarkdownExtension } from './file-system.mjs';
|
|
108
109
|
export { FOLDER_NOTES_PLUGIN_ID, FolderNoteLocation, getFolderNoteFolder, resolveFolderNote, resolveFolderNoteConfig } from './folder-note.mjs';
|
|
110
|
+
export { createFormulaFunction, createFormulaFunctionParameter, registerFormulaFunction } from './formula-function.mjs';
|
|
109
111
|
export { enableFrontmatterFormattingPreservation, preserveFrontmatterFormatting } from './frontmatter-formatting.mjs';
|
|
110
112
|
export { isFrontmatterLinkCacheWithOffsets, toFrontmatterLinkCacheWithOffsets } from './frontmatter-link-cache-with-offsets.mjs';
|
|
111
113
|
export { checkIsPlainObject, parseFrontmatter, registerFrontmatterFormattingPreserver, removeEmptyFrontmatterValues, setFrontmatter } from './frontmatter.mjs';
|
|
@@ -115,7 +117,7 @@ export { loadGitRenames, parseGitRenameLog } from './git-rename-history.mjs';
|
|
|
115
117
|
export { formatHotkey, getHotkeyFromKeyboardEvent, isSameHotkey } from './hotkey.mjs';
|
|
116
118
|
export { PluginHoverLinkSourceRegistrar } from './hover-link-source-registrar.mjs';
|
|
117
119
|
export { appendCodeBlock, appendTextOrFragmentClone, applySpellcheckMode, asCodeBlock, createFragmentWithCodeBlocks } from './html-element.mjs';
|
|
118
|
-
export { DEFAULT_NS, initI18N, t } from './i18n/i18n.mjs';
|
|
120
|
+
export { DEFAULT_NS, getLanguagesToLoad, initI18N, t } from './i18n/i18n.mjs';
|
|
119
121
|
export { en } from './i18n/locales/en.mjs';
|
|
120
122
|
export { DEFAULT_LANGUAGE, defaultTranslationsMap } from './i18n/locales/translations-map.mjs';
|
|
121
123
|
export { createInlineTokenPostProcessor, DEFAULT_INLINE_TOKEN_SKIP_SELECTOR, registerInlineTokenRenderer } from './inline-token-renderer.mjs';
|
|
@@ -136,6 +138,7 @@ export { addSingleChoiceMenuItems } from './menu.mjs';
|
|
|
136
138
|
export { ADVANCED_METADATA_CACHE_PLUGIN_ID, BACKLINK_CACHE_PLUGIN_ID, CachedMetadataExFeature, ensureMetadataCacheReady, getBacklinksForFileOrPath, getBacklinksForFileSafe, getCacheSafe, getFrontmatterSafe, getReferences, hasBacklinkCachePlugin, isCachedMetadataEx, parseMetadata, registerFileCacheForNonExistingFile, registerFiles, unregisterFileCacheForNonExistingFile, unregisterFiles } from './metadata-cache.mjs';
|
|
137
139
|
export { getMobileAppInfo } from './mobile-app-info.mjs';
|
|
138
140
|
export { alert } from './modals/alert.mjs';
|
|
141
|
+
export { formatCodeBlock, showCodeBlockBuilder } from './modals/code-block-builder.mjs';
|
|
139
142
|
export { confirm } from './modals/confirm.mjs';
|
|
140
143
|
export { MinimizableModal } from './modals/minimizable-modal.mjs';
|
|
141
144
|
export { ModalCommandBuilder, ModalCommandsRenderMode } from './modals/modal-command-builder.mjs';
|
|
@@ -155,6 +158,7 @@ export { PathSettings, pathsValidator } from './path-settings.mjs';
|
|
|
155
158
|
export { printToPdf } from './pdf.mjs';
|
|
156
159
|
export { PluginCliHandlerRegistrar } from './plugin-cli-handler-registrar.mjs';
|
|
157
160
|
export { findPluginApi, getValidatePluginApiPayloadsDebugSwitch, PluginApiPayloadKind, PluginApiRevokedError, PluginApiUnavailabilityReason, PluginApiUnavailableError, PluginApiValidationError, publishPluginApi, watchPluginApi } from './plugin/plugin-api.mjs';
|
|
161
|
+
export { DEFAULT_PLUGIN_ASYNC_CLEANUP_TIMEOUT_IN_MILLISECONDS, didPluginAsyncCleanupsSettle, hasPendingPluginAsyncCleanups, PLUGIN_ASYNC_CLEANUPS_STATE_KEY, registerPluginAsyncCleanup, trackPluginAsyncCleanup } from './plugin/plugin-async-cleanup.mjs';
|
|
158
162
|
export { addPluginCssClasses, initDebugController, initPluginContext } from './plugin/plugin-context.mjs';
|
|
159
163
|
export { PluginEventSourceImpl } from './plugin/plugin-event-source.mjs';
|
|
160
164
|
export { getInstalledPluginState, getInstalledPluginVersion, installAndEnablePlugin, InstalledPluginState, updatePlugin } from './plugin/plugin-install-state.mjs';
|
|
@@ -217,6 +221,7 @@ export { deleteIfNotUsed, DeleteIfNotUsedResult } from './vault-delete.mjs';
|
|
|
217
221
|
export { VaultTransaction } from './vault-transaction.mjs';
|
|
218
222
|
export { cleanupEmptyFolders, copySafe, createFolderSafe, CreateFolderSafeResult, createTemporaryFile, createTemporaryFolder, deleteEmptyFolder, deleteEmptyFolderHierarchy, getAbstractFilePathSafe, getAvailablePath, getFilePathSafe, getFolderPathSafe, getMarkdownFilesSorted, getNoteFilesSorted, getOrCreateAbstractFileSafe, getOrCreateFileSafe, getOrCreateFolderSafe, getSafeRenamePath, InvokeFileActionSafeResult, invokeWithFileSystemLock, isChild, isChildOrSelf, isEmptyFolder, listSafe, process, readSafe, renameSafe, saveNote, trashSafe } from './vault.mjs';
|
|
219
223
|
export { PluginViewRegistrar } from './view-registrar.mjs';
|
|
224
|
+
export { registerVirtualFile } from './virtual-file.mjs';
|
|
220
225
|
export { ensureLayoutReady, getAllContainers, getAllDomWindows, getMainWindow, switchToMainWindow, switchToWindow } from './workspace.mjs';
|
|
221
226
|
export { abortSignalAny, abortSignalNever, abortSignalTimeout, getSharedAbortController, getSharedAbortSignal, INFINITE_TIMEOUT, onAbort, ResettableAbortController, waitForAbort } from '@mnaoumov/typescript-lib/abort-controller';
|
|
222
227
|
export { createAggregateError } from '@mnaoumov/typescript-lib/aggregate-error';
|