@mnaoumov/obsidian-dev-toolkit 2.1.0 → 3.0.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 +5 -1
- package/bin/archive-demo-vault.mjs +8 -0
- package/bin/generate-coverage-badge.mjs +8 -0
- package/bundlers/esbuild-impl/feature-options/package.json +6 -0
- package/bundlers/obsidian-cli-reload/package.json +6 -0
- package/bundlers/obsidian-plugin-build/package.json +6 -0
- package/bundlers/obsidian-plugin-features/package.json +6 -0
- package/bundlers/obsidian-plugin-transforms/package.json +6 -0
- package/bundlers/obsidian-plugin-webpack-loader/package.json +6 -0
- package/bundlers/obsidian-plugins-folder-deployment/package.json +6 -0
- package/bundlers/parcel/package.json +6 -0
- package/bundlers/rollup/package.json +6 -0
- package/bundlers/rollup-compatible/package.json +6 -0
- package/bundlers/rollup-compatible-features/package.json +6 -0
- package/bundlers/vite/package.json +6 -0
- package/bundlers/webpack/package.json +6 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +3 -188
- package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.cts +2 -18
- package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.cjs +173 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.d.cts +60 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +4 -1
- package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +1 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +30 -82
- package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +7 -24
- package/dist/lib/cjs/bundlers/index.cjs +39 -3
- package/dist/lib/cjs/bundlers/index.d.cts +12 -0
- package/dist/lib/cjs/bundlers/obsidian-cli-reload.cjs +182 -0
- package/dist/lib/cjs/bundlers/obsidian-cli-reload.d.cts +37 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-build.cjs +278 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-build.d.cts +217 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-features.cjs +242 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-features.d.cts +186 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.cjs +306 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.d.cts +231 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.cjs +182 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.d.cts +47 -0
- package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.cjs +320 -0
- package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.d.cts +44 -0
- package/dist/lib/cjs/bundlers/parcel.cjs +462 -0
- package/dist/lib/cjs/bundlers/parcel.d.cts +128 -0
- package/dist/lib/cjs/bundlers/rollup-compatible-features.cjs +181 -0
- package/dist/lib/cjs/bundlers/rollup-compatible-features.d.cts +128 -0
- package/dist/lib/cjs/bundlers/rollup-compatible.cjs +138 -0
- package/dist/lib/cjs/bundlers/rollup-compatible.d.cts +84 -0
- package/dist/lib/cjs/bundlers/rollup.cjs +218 -0
- package/dist/lib/cjs/bundlers/rollup.d.cts +99 -0
- package/dist/lib/cjs/bundlers/vite.cjs +229 -0
- package/dist/lib/cjs/bundlers/vite.d.cts +105 -0
- package/dist/lib/cjs/bundlers/webpack.cjs +354 -0
- package/dist/lib/cjs/bundlers/webpack.d.cts +133 -0
- package/dist/lib/cjs/demo-vault-cli.cjs +131 -0
- package/dist/lib/cjs/demo-vault-cli.d.cts +15 -0
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/test-runners/coverage-badge-cli.cjs +160 -0
- package/dist/lib/cjs/test-runners/coverage-badge-cli.d.cts +25 -0
- package/dist/lib/cjs/test-runners/coverage-badge.cjs +279 -0
- package/dist/lib/cjs/test-runners/coverage-badge.d.cts +143 -0
- package/dist/lib/cjs/test-runners/e2e-runner-support.cjs +170 -0
- package/dist/lib/cjs/test-runners/e2e-runner-support.d.cts +36 -0
- package/dist/lib/cjs/test-runners/index.cjs +18 -3
- package/dist/lib/cjs/test-runners/index.d.cts +5 -0
- package/dist/lib/cjs/test-runners/obsidian-test-runner.cjs +147 -0
- package/dist/lib/cjs/test-runners/obsidian-test-runner.d.cts +42 -0
- package/dist/lib/cjs/test-runners/wdio-obsidian.cjs +205 -0
- package/dist/lib/cjs/test-runners/wdio-obsidian.d.cts +199 -0
- package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.mts +2 -18
- package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +3 -192
- package/dist/lib/esm/bundlers/esbuild-impl/feature-options.d.mts +60 -0
- package/dist/lib/esm/bundlers/esbuild-impl/feature-options.mjs +82 -0
- package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +1 -0
- package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +3 -1
- package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +7 -24
- package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +41 -87
- package/dist/lib/esm/bundlers/index.d.mts +12 -0
- package/dist/lib/esm/bundlers/index.mjs +26 -2
- package/dist/lib/esm/bundlers/obsidian-cli-reload.d.mts +37 -0
- package/dist/lib/esm/bundlers/obsidian-cli-reload.mjs +83 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-build.d.mts +217 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-build.mjs +166 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-features.d.mts +186 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-features.mjs +126 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-transforms.d.mts +231 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-transforms.mjs +194 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-webpack-loader.d.mts +47 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-webpack-loader.mjs +89 -0
- package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.d.mts +44 -0
- package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.mjs +228 -0
- package/dist/lib/esm/bundlers/parcel.d.mts +128 -0
- package/dist/lib/esm/bundlers/parcel.mjs +361 -0
- package/dist/lib/esm/bundlers/rollup-compatible-features.d.mts +128 -0
- package/dist/lib/esm/bundlers/rollup-compatible-features.mjs +93 -0
- package/dist/lib/esm/bundlers/rollup-compatible.d.mts +84 -0
- package/dist/lib/esm/bundlers/rollup-compatible.mjs +43 -0
- package/dist/lib/esm/bundlers/rollup.d.mts +99 -0
- package/dist/lib/esm/bundlers/rollup.mjs +130 -0
- package/dist/lib/esm/bundlers/vite.d.mts +105 -0
- package/dist/lib/esm/bundlers/vite.mjs +144 -0
- package/dist/lib/esm/bundlers/webpack.d.mts +133 -0
- package/dist/lib/esm/bundlers/webpack.mjs +259 -0
- package/dist/lib/esm/demo-vault-cli.d.mts +15 -0
- package/dist/lib/esm/demo-vault-cli.mjs +23 -0
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/test-runners/coverage-badge-cli.d.mts +25 -0
- package/dist/lib/esm/test-runners/coverage-badge-cli.mjs +51 -0
- package/dist/lib/esm/test-runners/coverage-badge.d.mts +143 -0
- package/dist/lib/esm/test-runners/coverage-badge.mjs +181 -0
- package/dist/lib/esm/test-runners/e2e-runner-support.d.mts +36 -0
- package/dist/lib/esm/test-runners/e2e-runner-support.mjs +61 -0
- package/dist/lib/esm/test-runners/index.d.mts +5 -0
- package/dist/lib/esm/test-runners/index.mjs +12 -2
- package/dist/lib/esm/test-runners/obsidian-test-runner.d.mts +42 -0
- package/dist/lib/esm/test-runners/obsidian-test-runner.mjs +52 -0
- package/dist/lib/esm/test-runners/wdio-obsidian.d.mts +199 -0
- package/dist/lib/esm/test-runners/wdio-obsidian.mjs +110 -0
- package/package.json +102 -4
- package/test-runners/coverage-badge/package.json +6 -0
- package/test-runners/coverage-badge-cli/package.json +6 -0
- package/test-runners/e2e-runner-support/package.json +6 -0
- package/test-runners/obsidian-test-runner/package.json +6 -0
- package/test-runners/wdio-obsidian/package.json +6 -0
- package/tsconfig/preact.json +7 -0
- package/tsconfig/react.json +7 -0
- package/tsconfig/solid.json +7 -0
- package/tsconfig/svelte.json +7 -0
- package/tsconfig/vue.json +7 -0
- package/types/styles.d.ts +32 -0
- package/types/wasm.d.ts +11 -0
|
@@ -0,0 +1,182 @@
|
|
|
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 ensureBrowserProcess() {
|
|
7
|
+
const browserProcess = {
|
|
8
|
+
browser: true,
|
|
9
|
+
cwd() {
|
|
10
|
+
return "/";
|
|
11
|
+
},
|
|
12
|
+
env: {},
|
|
13
|
+
platform: "android"
|
|
14
|
+
};
|
|
15
|
+
const existingProcess = globalThis.process;
|
|
16
|
+
if (!existingProcess) {
|
|
17
|
+
globalThis.process = browserProcess;
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (existingProcess.versions?.node) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const existingProcessRecord = existingProcess;
|
|
24
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
25
|
+
existingProcessRecord[key] ??= value;
|
|
26
|
+
}
|
|
27
|
+
existingProcessRecord["browser"] = true;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
ensureBrowserProcess();
|
|
31
|
+
})();
|
|
32
|
+
(function patchObsidianRequire() {
|
|
33
|
+
const originalRequire = require;
|
|
34
|
+
if (!originalRequire || originalRequire.__isPatched) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
require = Object.assign(
|
|
39
|
+
(id) => requirePatched(id),
|
|
40
|
+
originalRequire,
|
|
41
|
+
{
|
|
42
|
+
__isPatched: true
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
function extractDefault(module) {
|
|
47
|
+
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
51
|
+
'@codemirror/autocomplete',
|
|
52
|
+
'@codemirror/collab',
|
|
53
|
+
'@codemirror/commands',
|
|
54
|
+
'@codemirror/language',
|
|
55
|
+
'@codemirror/lint',
|
|
56
|
+
'@codemirror/search',
|
|
57
|
+
'@codemirror/state',
|
|
58
|
+
'@codemirror/text',
|
|
59
|
+
'@codemirror/view',
|
|
60
|
+
'@lezer/common',
|
|
61
|
+
'@lezer/highlight',
|
|
62
|
+
'@lezer/lr',
|
|
63
|
+
'obsidian']
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
67
|
+
'@codemirror/closebrackets',
|
|
68
|
+
'@codemirror/comment',
|
|
69
|
+
'@codemirror/fold',
|
|
70
|
+
'@codemirror/gutter',
|
|
71
|
+
'@codemirror/highlight',
|
|
72
|
+
'@codemirror/history',
|
|
73
|
+
'@codemirror/matchbrackets',
|
|
74
|
+
'@codemirror/panel',
|
|
75
|
+
'@codemirror/rangeset',
|
|
76
|
+
'@codemirror/rectangular-selection',
|
|
77
|
+
'@codemirror/stream-parser',
|
|
78
|
+
'@codemirror/tooltip']
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
function requirePatched(id) {
|
|
82
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
83
|
+
return originalRequire?.(id);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
|
|
87
|
+
if (globalThis.app.isMobile) {
|
|
88
|
+
if (id === 'process' || id === 'node:process') {
|
|
89
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
90
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
91
|
+
|
|
92
|
+
return process;
|
|
93
|
+
}
|
|
94
|
+
} else {
|
|
95
|
+
const module = originalRequire?.(id);
|
|
96
|
+
if (module) {
|
|
97
|
+
return extractDefault(module);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
102
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
103
|
+
return {};
|
|
104
|
+
}
|
|
105
|
+
})();
|
|
106
|
+
|
|
107
|
+
"use strict";
|
|
108
|
+
var __defProp = Object.defineProperty;
|
|
109
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
110
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
111
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
112
|
+
var __export = (target, all) => {
|
|
113
|
+
for (var name in all)
|
|
114
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
115
|
+
};
|
|
116
|
+
var __copyProps = (to, from, except, desc) => {
|
|
117
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
118
|
+
for (let key of __getOwnPropNames(from))
|
|
119
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
120
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
121
|
+
}
|
|
122
|
+
return to;
|
|
123
|
+
};
|
|
124
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
125
|
+
var obsidian_plugin_webpack_loader_exports = {};
|
|
126
|
+
__export(obsidian_plugin_webpack_loader_exports, {
|
|
127
|
+
default: () => obsidianPluginWebpackLoader,
|
|
128
|
+
raw: () => raw
|
|
129
|
+
});
|
|
130
|
+
module.exports = __toCommonJS(obsidian_plugin_webpack_loader_exports);
|
|
131
|
+
var import_async = require('@mnaoumov/typescript-lib/async');
|
|
132
|
+
var import_esbuild = require('esbuild');
|
|
133
|
+
var import_obsidian_plugin_transforms = require('./obsidian-plugin-transforms.cjs');
|
|
134
|
+
const raw = true;
|
|
135
|
+
function obsidianPluginWebpackLoader(source) {
|
|
136
|
+
const callback = this.async();
|
|
137
|
+
(0, import_async.invokeAsyncSafely)(async () => {
|
|
138
|
+
let result;
|
|
139
|
+
try {
|
|
140
|
+
result = await transformModule(this, source);
|
|
141
|
+
} catch (error) {
|
|
142
|
+
callback(error);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
callback(null, result.code, result.map && JSON.stringify(result.map));
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
async function transformModule(context, source) {
|
|
149
|
+
const { isProductionBuild, kind, styles } = context.getOptions();
|
|
150
|
+
const filePath = context.resourcePath;
|
|
151
|
+
const code = source.toString("utf-8");
|
|
152
|
+
switch (kind) {
|
|
153
|
+
case "jsx": {
|
|
154
|
+
return await (0, import_obsidian_plugin_transforms.transformSolid)({ code, filePath, isProductionBuild });
|
|
155
|
+
}
|
|
156
|
+
case "stylesheet": {
|
|
157
|
+
const result = await (0, import_obsidian_plugin_transforms.transformCss)({ filePath, isCssModuleScoped: false, isProductionBuild, source: code, styles: styles ?? {} });
|
|
158
|
+
for (const dependency of result.dependencies) {
|
|
159
|
+
context.addDependency(dependency);
|
|
160
|
+
}
|
|
161
|
+
return { code: result.css };
|
|
162
|
+
}
|
|
163
|
+
case "svelte": {
|
|
164
|
+
return await (0, import_obsidian_plugin_transforms.transformSvelte)({ code, filePath, isProductionBuild });
|
|
165
|
+
}
|
|
166
|
+
case "typescript": {
|
|
167
|
+
const result = await (0, import_esbuild.transform)(code, { loader: "ts", sourcefile: filePath, sourcemap: "external" });
|
|
168
|
+
return { code: result.code, map: JSON.parse(result.map) };
|
|
169
|
+
}
|
|
170
|
+
case "wasm": {
|
|
171
|
+
return { code: (0, import_obsidian_plugin_transforms.getWasmModuleCode)(source) };
|
|
172
|
+
}
|
|
173
|
+
default: {
|
|
174
|
+
throw new Error(`Unknown loader kind: ${String(kind)}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
179
|
+
0 && (module.exports = {
|
|
180
|
+
raw
|
|
181
|
+
});
|
|
182
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9vYnNpZGlhbi1wbHVnaW4td2VicGFjay1sb2FkZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSB3ZWJwYWNrIGxvYWRlciB0aGUgd2VicGFjayBhZGFwdGVyIGFkZHMgZm9yIHRoZSBidWlsZCBmZWF0dXJlczogaXQgcnVucyBvbmUgb2YgdGhlIHNoYXJlZCB0cmFuc2Zvcm1zIChTb2xpZCxcbiAqIFN2ZWx0ZSwgYSBzdHlsZXNoZWV0J3MgUG9zdENTUyBhbmQgVGFpbHdpbmQsIGEgV2ViQXNzZW1ibHkgbW9kdWxlJ3MgYnl0ZXMpIG9uIHRoZSBtb2R1bGUgaXQgaXMgZ2l2ZW4uIFRoZSBhZGFwdGVyXG4gKiBuYW1lcyBpdCBieSBwYXRoIGluIHRoZSBydWxlcyBpdCBhZGRzLCBzbyBhIHByb2plY3QgbmV2ZXIgbmFtZXMgaXQuXG4gKlxuICogRXJhc2FibGUgVHlwZVNjcmlwdCBvbmx5IChubyBlbnVtcywgbm8gcGFyYW1ldGVyIHByb3BlcnRpZXMpLCBzbyB3ZWJwYWNrIGNhbiBsb2FkIGl0IHN0cmFpZ2h0IGZyb20gc291cmNlIHdoZW4gdGhlXG4gKiB0b29sa2l0IHJ1bnMgZnJvbSBzb3VyY2UuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBMb2FkZXJDb250ZXh0IH0gZnJvbSAnd2VicGFjayc7XG5cbmltcG9ydCB7IGludm9rZUFzeW5jU2FmZWx5IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IHRyYW5zZm9ybSBhcyBlc2J1aWxkVHJhbnNmb3JtIH0gZnJvbSAnZXNidWlsZCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgRmVhdHVyZUZpbGVLaW5kLFxuICBPYnNpZGlhblBsdWdpblN0eWxlc09wdGlvbnNcbn0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBTb3VyY2VNYXBMaWtlIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3Jtcy50cyc7XG5cbmltcG9ydCB7XG4gIGdldFdhc21Nb2R1bGVDb2RlLFxuICB0cmFuc2Zvcm1Dc3MsXG4gIHRyYW5zZm9ybVNvbGlkLFxuICB0cmFuc2Zvcm1TdmVsdGVcbn0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3Jtcy50cyc7XG5cbi8qKlxuICogV2hpY2ggdHJhbnNmb3JtIHRoZSBsb2FkZXIgcnVuczogb25lIG9mIHRoZSBzaGFyZWQgdHJhbnNmb3Jtcywgb3IgYHR5cGVzY3JpcHRgLCB3aGljaCBzdHJpcHMgdGhlIHR5cGVzIG9mIGEgVnVlXG4gKiBjb21wb25lbnQncyBgPHNjcmlwdCBsYW5nPVwidHNcIj5gIGJsb2NrIGFmdGVyIGB1bnBsdWdpbi12dWVgIGV4dHJhY3RlZCBpdC5cbiAqL1xuZXhwb3J0IHR5cGUgT2JzaWRpYW5QbHVnaW5XZWJwYWNrTG9hZGVyS2luZCA9ICd0eXBlc2NyaXB0JyB8IEZlYXR1cmVGaWxlS2luZDtcblxuLyoqXG4gKiBUaGUgb3B0aW9ucyB0aGUgd2VicGFjayBhZGFwdGVyIGdpdmVzIHRoZSBsb2FkZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2JzaWRpYW5QbHVnaW5XZWJwYWNrTG9hZGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSBwcm9kdWN0aW9uIGJ1aWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNQcm9kdWN0aW9uQnVpbGQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoaWNoIHRyYW5zZm9ybSB0aGUgbG9hZGVyIHJ1bnMuXG4gICAqL1xuICByZWFkb25seSBraW5kOiBPYnNpZGlhblBsdWdpbldlYnBhY2tMb2FkZXJLaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgc3R5bGVzaGVldCBvcHRpb25zLCBmb3IgYSBgc3R5bGVzaGVldGAgbG9hZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgc3R5bGVzPzogT2JzaWRpYW5QbHVnaW5TdHlsZXNPcHRpb25zO1xufVxuXG5pbnRlcmZhY2UgTG9hZGVyUmVzdWx0IHtcbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuICByZWFkb25seSBtYXA/OiBTb3VyY2VNYXBMaWtlIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRlbGxzIHdlYnBhY2sgdG8gaGFuZCB0aGUgbG9hZGVyIHRoZSBtb2R1bGUncyBieXRlcywgd2hpY2ggYSBXZWJBc3NlbWJseSBtb2R1bGUgbmVlZHMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2NvbnNpc3RlbnQtYm9vbGVhbi1uYW1lIC0tIGByYXdgIGlzIHRoZSBuYW1lIHdlYnBhY2sgcmVhZHMuXG5leHBvcnQgY29uc3QgcmF3ID0gdHJ1ZTtcblxuLyoqXG4gKiBSdW5zIHRoZSBzaGFyZWQgdHJhbnNmb3JtIHRoZSBsb2FkZXIncyBvcHRpb25zIG5hbWUgb24gb25lIG1vZHVsZS5cbiAqXG4gKiBAcGFyYW0gdGhpcyAtIFRoZSB3ZWJwYWNrIGxvYWRlciBjb250ZXh0LlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBtb2R1bGUncyBieXRlcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC14L25vLWRlZmF1bHQtZXhwb3J0IC0tIFdlYnBhY2sgdGFrZXMgYSBsb2FkZXIgZnJvbSBpdHMgbW9kdWxlJ3MgZGVmYXVsdCBleHBvcnQuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvYnNpZGlhblBsdWdpbldlYnBhY2tMb2FkZXIodGhpczogTG9hZGVyQ29udGV4dDxPYnNpZGlhblBsdWdpbldlYnBhY2tMb2FkZXJPcHRpb25zPiwgc291cmNlOiBCdWZmZXIpOiB2b2lkIHtcbiAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLmFzeW5jKCk7XG4gIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICBsZXQgcmVzdWx0OiBMb2FkZXJSZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybU1vZHVsZSh0aGlzLCBzb3VyY2UpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYWxsYmFjayhlcnJvciBhcyBFcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdC5jb2RlLCByZXN1bHQubWFwICYmIEpTT04uc3RyaW5naWZ5KHJlc3VsdC5tYXApKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRyYW5zZm9ybU1vZHVsZShjb250ZXh0OiBMb2FkZXJDb250ZXh0PE9ic2lkaWFuUGx1Z2luV2VicGFja0xvYWRlck9wdGlvbnM+LCBzb3VyY2U6IEJ1ZmZlcik6IFByb21pc2U8TG9hZGVyUmVzdWx0PiB7XG4gIGNvbnN0IHsgaXNQcm9kdWN0aW9uQnVpbGQsIGtpbmQsIHN0eWxlcyB9ID0gY29udGV4dC5nZXRPcHRpb25zKCk7XG4gIGNvbnN0IGZpbGVQYXRoID0gY29udGV4dC5yZXNvdXJjZVBhdGg7XG4gIGNvbnN0IGNvZGUgPSBzb3VyY2UudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ2pzeCc6IHtcbiAgICAgIHJldHVybiBhd2FpdCB0cmFuc2Zvcm1Tb2xpZCh7IGNvZGUsIGZpbGVQYXRoLCBpc1Byb2R1Y3Rpb25CdWlsZCB9KTtcbiAgICB9XG4gICAgY2FzZSAnc3R5bGVzaGVldCc6IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybUNzcyh7IGZpbGVQYXRoLCBpc0Nzc01vZHVsZVNjb3BlZDogZmFsc2UsIGlzUHJvZHVjdGlvbkJ1aWxkLCBzb3VyY2U6IGNvZGUsIHN0eWxlczogc3R5bGVzID8/IHt9IH0pO1xuICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHJlc3VsdC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgY29udGV4dC5hZGREZXBlbmRlbmN5KGRlcGVuZGVuY3kpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY29kZTogcmVzdWx0LmNzcyB9O1xuICAgIH1cbiAgICBjYXNlICdzdmVsdGUnOiB7XG4gICAgICByZXR1cm4gYXdhaXQgdHJhbnNmb3JtU3ZlbHRlKHsgY29kZSwgZmlsZVBhdGgsIGlzUHJvZHVjdGlvbkJ1aWxkIH0pO1xuICAgIH1cbiAgICBjYXNlICd0eXBlc2NyaXB0Jzoge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXNidWlsZFRyYW5zZm9ybShjb2RlLCB7IGxvYWRlcjogJ3RzJywgc291cmNlZmlsZTogZmlsZVBhdGgsIHNvdXJjZW1hcDogJ2V4dGVybmFsJyB9KTtcbiAgICAgIHJldHVybiB7IGNvZGU6IHJlc3VsdC5jb2RlLCBtYXA6IEpTT04ucGFyc2UocmVzdWx0Lm1hcCkgYXMgU291cmNlTWFwTGlrZSB9O1xuICAgIH1cbiAgICBjYXNlICd3YXNtJzoge1xuICAgICAgcmV0dXJuIHsgY29kZTogZ2V0V2FzbU1vZHVsZUNvZGUoc291cmNlKSB9O1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbG9hZGVyIGtpbmQ6ICR7U3RyaW5nKGtpbmQpfWApO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBYUEsbUJBQWtDO0FBQ2xDLHFCQUE4QztBQVE5Qyx3Q0FLTztBQXFDQSxNQUFNLE1BQU07QUFTSixTQUFSLDRCQUFzRyxRQUFzQjtBQUNqSSxRQUFNLFdBQVcsS0FBSyxNQUFNO0FBQzVCLHNDQUFrQixZQUFZO0FBQzVCLFFBQUk7QUFDSixRQUFJO0FBQ0YsZUFBUyxNQUFNLGdCQUFnQixNQUFNLE1BQU07QUFBQSxJQUM3QyxTQUFTLE9BQU87QUFDZCxlQUFTLEtBQWM7QUFDdkI7QUFBQSxJQUNGO0FBQ0EsYUFBUyxNQUFNLE9BQU8sTUFBTSxPQUFPLE9BQU8sS0FBSyxVQUFVLE9BQU8sR0FBRyxDQUFDO0FBQUEsRUFDdEUsQ0FBQztBQUNIO0FBRUEsZUFBZSxnQkFBZ0IsU0FBNEQsUUFBdUM7QUFDaEksUUFBTSxFQUFFLG1CQUFtQixNQUFNLE9BQU8sSUFBSSxRQUFRLFdBQVc7QUFDL0QsUUFBTSxXQUFXLFFBQVE7QUFDekIsUUFBTSxPQUFPLE9BQU8sU0FBUyxPQUFPO0FBQ3BDLFVBQVEsTUFBTTtBQUFBLElBQ1osS0FBSyxPQUFPO0FBQ1YsYUFBTyxVQUFNLGtEQUFlLEVBQUUsTUFBTSxVQUFVLGtCQUFrQixDQUFDO0FBQUEsSUFDbkU7QUFBQSxJQUNBLEtBQUssY0FBYztBQUNqQixZQUFNLFNBQVMsVUFBTSxnREFBYSxFQUFFLFVBQVUsbUJBQW1CLE9BQU8sbUJBQW1CLFFBQVEsTUFBTSxRQUFRLFVBQVUsQ0FBQyxFQUFFLENBQUM7QUFDL0gsaUJBQVcsY0FBYyxPQUFPLGNBQWM7QUFDNUMsZ0JBQVEsY0FBYyxVQUFVO0FBQUEsTUFDbEM7QUFDQSxhQUFPLEVBQUUsTUFBTSxPQUFPLElBQUk7QUFBQSxJQUM1QjtBQUFBLElBQ0EsS0FBSyxVQUFVO0FBQ2IsYUFBTyxVQUFNLG1EQUFnQixFQUFFLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQztBQUFBLElBQ3BFO0FBQUEsSUFDQSxLQUFLLGNBQWM7QUFDakIsWUFBTSxTQUFTLFVBQU0sZUFBQUEsV0FBaUIsTUFBTSxFQUFFLFFBQVEsTUFBTSxZQUFZLFVBQVUsV0FBVyxXQUFXLENBQUM7QUFDekcsYUFBTyxFQUFFLE1BQU0sT0FBTyxNQUFNLEtBQUssS0FBSyxNQUFNLE9BQU8sR0FBRyxFQUFtQjtBQUFBLElBQzNFO0FBQUEsSUFDQSxLQUFLLFFBQVE7QUFDWCxhQUFPLEVBQUUsVUFBTSxxREFBa0IsTUFBTSxFQUFFO0FBQUEsSUFDM0M7QUFBQSxJQUNBLFNBQVM7QUFDUCxZQUFNLElBQUksTUFBTSx3QkFBd0IsT0FBTyxJQUFJLENBQUMsRUFBRTtBQUFBLElBQ3hEO0FBQUEsRUFDRjtBQUNGOyIsIm5hbWVzIjpbImVzYnVpbGRUcmFuc2Zvcm0iXX0=
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.cts" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/**
|
|
4
|
+
* @file
|
|
5
|
+
*
|
|
6
|
+
* The webpack loader the webpack adapter adds for the build features: it runs one of the shared transforms (Solid,
|
|
7
|
+
* Svelte, a stylesheet's PostCSS and Tailwind, a WebAssembly module's bytes) on the module it is given. The adapter
|
|
8
|
+
* names it by path in the rules it adds, so a project never names it.
|
|
9
|
+
*
|
|
10
|
+
* Erasable TypeScript only (no enums, no parameter properties), so webpack can load it straight from source when the
|
|
11
|
+
* toolkit runs from source.
|
|
12
|
+
*/
|
|
13
|
+
import type { LoaderContext } from 'webpack' with { 'resolution-mode': 'import' };
|
|
14
|
+
import type { FeatureFileKind, ObsidianPluginStylesOptions } from './obsidian-plugin-features.cjs';
|
|
15
|
+
/**
|
|
16
|
+
* Which transform the loader runs: one of the shared transforms, or `typescript`, which strips the types of a Vue
|
|
17
|
+
* component's `<script lang="ts">` block after `unplugin-vue` extracted it.
|
|
18
|
+
*/
|
|
19
|
+
export type ObsidianPluginWebpackLoaderKind = 'typescript' | FeatureFileKind;
|
|
20
|
+
/**
|
|
21
|
+
* The options the webpack adapter gives the loader.
|
|
22
|
+
*/
|
|
23
|
+
export interface ObsidianPluginWebpackLoaderOptions {
|
|
24
|
+
/**
|
|
25
|
+
* Whether this is a production build.
|
|
26
|
+
*/
|
|
27
|
+
readonly isProductionBuild: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Which transform the loader runs.
|
|
30
|
+
*/
|
|
31
|
+
readonly kind: ObsidianPluginWebpackLoaderKind;
|
|
32
|
+
/**
|
|
33
|
+
* The stylesheet options, for a `stylesheet` loader.
|
|
34
|
+
*/
|
|
35
|
+
readonly styles?: ObsidianPluginStylesOptions;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Tells webpack to hand the loader the module's bytes, which a WebAssembly module needs.
|
|
39
|
+
*/
|
|
40
|
+
export declare const raw = true;
|
|
41
|
+
/**
|
|
42
|
+
* Runs the shared transform the loader's options name on one module.
|
|
43
|
+
*
|
|
44
|
+
* @param this - The webpack loader context.
|
|
45
|
+
* @param source - The module's bytes.
|
|
46
|
+
*/
|
|
47
|
+
export default function obsidianPluginWebpackLoader(this: LoaderContext<ObsidianPluginWebpackLoaderOptions>, source: Buffer): void;
|
|
@@ -0,0 +1,320 @@
|
|
|
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 ensureBrowserProcess() {
|
|
7
|
+
const browserProcess = {
|
|
8
|
+
browser: true,
|
|
9
|
+
cwd() {
|
|
10
|
+
return "/";
|
|
11
|
+
},
|
|
12
|
+
env: {},
|
|
13
|
+
platform: "android"
|
|
14
|
+
};
|
|
15
|
+
const existingProcess = globalThis.process;
|
|
16
|
+
if (!existingProcess) {
|
|
17
|
+
globalThis.process = browserProcess;
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (existingProcess.versions?.node) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const existingProcessRecord = existingProcess;
|
|
24
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
25
|
+
existingProcessRecord[key] ??= value;
|
|
26
|
+
}
|
|
27
|
+
existingProcessRecord["browser"] = true;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
ensureBrowserProcess();
|
|
31
|
+
})();
|
|
32
|
+
(function patchObsidianRequire() {
|
|
33
|
+
const originalRequire = require;
|
|
34
|
+
if (!originalRequire || originalRequire.__isPatched) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
require = Object.assign(
|
|
39
|
+
(id) => requirePatched(id),
|
|
40
|
+
originalRequire,
|
|
41
|
+
{
|
|
42
|
+
__isPatched: true
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
function extractDefault(module) {
|
|
47
|
+
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
51
|
+
'@codemirror/autocomplete',
|
|
52
|
+
'@codemirror/collab',
|
|
53
|
+
'@codemirror/commands',
|
|
54
|
+
'@codemirror/language',
|
|
55
|
+
'@codemirror/lint',
|
|
56
|
+
'@codemirror/search',
|
|
57
|
+
'@codemirror/state',
|
|
58
|
+
'@codemirror/text',
|
|
59
|
+
'@codemirror/view',
|
|
60
|
+
'@lezer/common',
|
|
61
|
+
'@lezer/highlight',
|
|
62
|
+
'@lezer/lr',
|
|
63
|
+
'obsidian']
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
67
|
+
'@codemirror/closebrackets',
|
|
68
|
+
'@codemirror/comment',
|
|
69
|
+
'@codemirror/fold',
|
|
70
|
+
'@codemirror/gutter',
|
|
71
|
+
'@codemirror/highlight',
|
|
72
|
+
'@codemirror/history',
|
|
73
|
+
'@codemirror/matchbrackets',
|
|
74
|
+
'@codemirror/panel',
|
|
75
|
+
'@codemirror/rangeset',
|
|
76
|
+
'@codemirror/rectangular-selection',
|
|
77
|
+
'@codemirror/stream-parser',
|
|
78
|
+
'@codemirror/tooltip']
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
function requirePatched(id) {
|
|
82
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
83
|
+
return originalRequire?.(id);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
|
|
87
|
+
if (globalThis.app.isMobile) {
|
|
88
|
+
if (id === 'process' || id === 'node:process') {
|
|
89
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
90
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
91
|
+
|
|
92
|
+
return process;
|
|
93
|
+
}
|
|
94
|
+
} else {
|
|
95
|
+
const module = originalRequire?.(id);
|
|
96
|
+
if (module) {
|
|
97
|
+
return extractDefault(module);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
102
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
103
|
+
return {};
|
|
104
|
+
}
|
|
105
|
+
})();
|
|
106
|
+
|
|
107
|
+
"use strict";
|
|
108
|
+
var __create = Object.create;
|
|
109
|
+
var __defProp = Object.defineProperty;
|
|
110
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
111
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
112
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
113
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
114
|
+
var __export = (target, all) => {
|
|
115
|
+
for (var name in all)
|
|
116
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
117
|
+
};
|
|
118
|
+
var __copyProps = (to, from, except, desc) => {
|
|
119
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
120
|
+
for (let key of __getOwnPropNames(from))
|
|
121
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
122
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
123
|
+
}
|
|
124
|
+
return to;
|
|
125
|
+
};
|
|
126
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
127
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
128
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
129
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
130
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
131
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
132
|
+
mod
|
|
133
|
+
));
|
|
134
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
135
|
+
var obsidian_plugins_folder_deployment_exports = {};
|
|
136
|
+
__export(obsidian_plugins_folder_deployment_exports, {
|
|
137
|
+
deployToObsidianPluginsFolder: () => deployToObsidianPluginsFolder
|
|
138
|
+
});
|
|
139
|
+
module.exports = __toCommonJS(obsidian_plugins_folder_deployment_exports);
|
|
140
|
+
var import_async = require('@mnaoumov/typescript-lib/async');
|
|
141
|
+
var import_debug = require('@mnaoumov/typescript-lib/debug');
|
|
142
|
+
var import_path = require('@mnaoumov/typescript-lib/path');
|
|
143
|
+
var import_promises = require('node:fs/promises');
|
|
144
|
+
var import_node_process = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('node:process')), 1);
|
|
145
|
+
var import_obsidian_integration_testing = require('obsidian-integration-testing');
|
|
146
|
+
var import_obsidian_cli_reload = require('./obsidian-cli-reload.cjs');
|
|
147
|
+
const moduleState = {
|
|
148
|
+
devInstanceTransportPromise: void 0,
|
|
149
|
+
isDevInstanceCleanupRegistered: false,
|
|
150
|
+
isDevInstanceDisposed: false
|
|
151
|
+
};
|
|
152
|
+
const DEV_INSTANCE_PROBE_INTERVAL_IN_MILLISECONDS = 2e3;
|
|
153
|
+
const DEV_INSTANCE_CLOSED_PROBE_COUNT = 3;
|
|
154
|
+
async function deployToObsidianPluginsFolder(params) {
|
|
155
|
+
const {
|
|
156
|
+
distFolder,
|
|
157
|
+
isProductionBuild,
|
|
158
|
+
pluginName
|
|
159
|
+
} = params;
|
|
160
|
+
if (isProductionBuild) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (!params.obsidianConfigFolder) {
|
|
164
|
+
(0, import_debug.getLibDebugger)("deployToObsidianPluginsFolder")(
|
|
165
|
+
"No Obsidian config folder configured. `OBSIDIAN_CONFIG_FOLDER` environment variable is not set in system or in `.env` file. The compiled plugin will not be copied into Obsidian plugins folder."
|
|
166
|
+
);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const obsidianConfigFolder = (0, import_path.toPosixPath)(params.obsidianConfigFolder);
|
|
170
|
+
const pluginFolder = (0, import_path.join)(obsidianConfigFolder, "plugins", pluginName);
|
|
171
|
+
await (0, import_promises.mkdir)(pluginFolder, { recursive: true });
|
|
172
|
+
await (0, import_promises.cp)(distFolder, pluginFolder, { recursive: true });
|
|
173
|
+
switch (params.reload ?? "hot-reload-plugin") {
|
|
174
|
+
case false: {
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
case "hot-reload-plugin": {
|
|
178
|
+
await installAndEnableHotReload({
|
|
179
|
+
obsidianConfigFolder,
|
|
180
|
+
pluginName
|
|
181
|
+
});
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
case "obsidian-cli": {
|
|
185
|
+
await (0, import_obsidian_cli_reload.reloadPluginWithObsidianCli)({
|
|
186
|
+
pluginId: await readPluginId(pluginFolder, pluginName),
|
|
187
|
+
vaultName: (0, import_path.basename)((0, import_path.dirname)(obsidianConfigFolder))
|
|
188
|
+
});
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
default: {
|
|
192
|
+
throw new Error(`Unknown reload option: ${String(params.reload)}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
async function getOrLaunchDevInstance(vaultPath) {
|
|
197
|
+
moduleState.devInstanceTransportPromise ??= launchDevInstance(vaultPath);
|
|
198
|
+
try {
|
|
199
|
+
return await moduleState.devInstanceTransportPromise;
|
|
200
|
+
} catch (error) {
|
|
201
|
+
moduleState.devInstanceTransportPromise = void 0;
|
|
202
|
+
throw error;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
async function installAndEnableHotReload(params) {
|
|
206
|
+
const {
|
|
207
|
+
obsidianConfigFolder,
|
|
208
|
+
pluginName
|
|
209
|
+
} = params;
|
|
210
|
+
const vaultPath = (0, import_path.dirname)(obsidianConfigFolder);
|
|
211
|
+
const transport = await getOrLaunchDevInstance(vaultPath);
|
|
212
|
+
await (0, import_obsidian_integration_testing.evalInObsidian)({
|
|
213
|
+
// eslint-disable-next-line no-shadow -- No actual shadowing as the function is executed externally.
|
|
214
|
+
async callback({ app, obsidianModule, pluginName: pluginName2 }) {
|
|
215
|
+
const HOT_RELOAD_PLUGIN_ID = "hot-reload";
|
|
216
|
+
const COMMUNITY_PLUGINS_REGISTRY_URL = "https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-plugins.json";
|
|
217
|
+
const { requestUrl } = obsidianModule;
|
|
218
|
+
await app.plugins.setEnable(true);
|
|
219
|
+
if (!Object.hasOwn(app.plugins.manifests, HOT_RELOAD_PLUGIN_ID)) {
|
|
220
|
+
const registryResponse = await requestUrl(COMMUNITY_PLUGINS_REGISTRY_URL);
|
|
221
|
+
const registryEntries = registryResponse.json;
|
|
222
|
+
const entry = registryEntries.find((candidate) => candidate.id === HOT_RELOAD_PLUGIN_ID);
|
|
223
|
+
if (!entry) {
|
|
224
|
+
throw new Error(`Plugin '${HOT_RELOAD_PLUGIN_ID}' was not found in the Obsidian community plugins registry.`);
|
|
225
|
+
}
|
|
226
|
+
const latestReleaseResponse = await requestUrl(`https://api.github.com/repos/${entry.repo}/releases/latest`);
|
|
227
|
+
const latestRelease = latestReleaseResponse.json;
|
|
228
|
+
const version = latestRelease.tag_name;
|
|
229
|
+
const manifestResponse = await requestUrl(`https://github.com/${entry.repo}/releases/download/${version}/manifest.json`);
|
|
230
|
+
const manifest = manifestResponse.json;
|
|
231
|
+
await app.plugins.installPlugin(entry.repo, version, manifest);
|
|
232
|
+
}
|
|
233
|
+
if (!Object.hasOwn(app.plugins.plugins, HOT_RELOAD_PLUGIN_ID)) {
|
|
234
|
+
await app.plugins.enablePluginAndSave(HOT_RELOAD_PLUGIN_ID);
|
|
235
|
+
}
|
|
236
|
+
await app.plugins.enablePluginAndSave(pluginName2);
|
|
237
|
+
},
|
|
238
|
+
input: { pluginName },
|
|
239
|
+
shouldSkipPreflightChecks: true,
|
|
240
|
+
transport,
|
|
241
|
+
vaultPath
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
async function isDevInstanceRunning(cdpUrl) {
|
|
245
|
+
try {
|
|
246
|
+
const response = await fetch(`${cdpUrl}/json`);
|
|
247
|
+
const targets = await response.json();
|
|
248
|
+
return targets.some((target) => target.type === "page");
|
|
249
|
+
} catch {
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
async function launchDevInstance(vaultPath) {
|
|
254
|
+
const transport = await (0, import_obsidian_integration_testing.createTransportFromOptions)();
|
|
255
|
+
try {
|
|
256
|
+
await transport.registerVault(vaultPath);
|
|
257
|
+
} catch (error) {
|
|
258
|
+
transport.disposeSync?.();
|
|
259
|
+
throw error;
|
|
260
|
+
}
|
|
261
|
+
registerDevInstanceCleanup(transport);
|
|
262
|
+
watchDevInstanceAndStopOnClose(transport);
|
|
263
|
+
return transport;
|
|
264
|
+
}
|
|
265
|
+
async function readPluginId(pluginFolder, fallbackId) {
|
|
266
|
+
try {
|
|
267
|
+
const manifest = JSON.parse(await (0, import_promises.readFile)((0, import_path.join)(pluginFolder, "manifest.json"), "utf-8"));
|
|
268
|
+
return manifest.id ?? fallbackId;
|
|
269
|
+
} catch {
|
|
270
|
+
return fallbackId;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
function registerDevInstanceCleanup(transport) {
|
|
274
|
+
if (moduleState.isDevInstanceCleanupRegistered) {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
moduleState.isDevInstanceCleanupRegistered = true;
|
|
278
|
+
import_node_process.default.on("exit", disposeDevInstance);
|
|
279
|
+
for (const signal of ["SIGHUP", "SIGINT", "SIGTERM"]) {
|
|
280
|
+
import_node_process.default.once(signal, () => {
|
|
281
|
+
disposeDevInstance();
|
|
282
|
+
import_node_process.default.exit();
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
function disposeDevInstance() {
|
|
286
|
+
if (moduleState.isDevInstanceDisposed) {
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
moduleState.isDevInstanceDisposed = true;
|
|
290
|
+
transport.disposeSync?.();
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
function watchDevInstanceAndStopOnClose(transport) {
|
|
294
|
+
if (!(transport instanceof import_obsidian_integration_testing.DesktopCdpTransport)) {
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
const endpoint = transport.getOwnedInstanceEndpoint();
|
|
298
|
+
if (!endpoint) {
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
const cdpUrl = `http://${endpoint.host}:${String(endpoint.port)}`;
|
|
302
|
+
(0, import_async.invokeAsyncSafely)(stopWhenDevInstanceCloses);
|
|
303
|
+
async function stopWhenDevInstanceCloses() {
|
|
304
|
+
let consecutiveFailedProbeCount = 0;
|
|
305
|
+
while (consecutiveFailedProbeCount < DEV_INSTANCE_CLOSED_PROBE_COUNT) {
|
|
306
|
+
await (0, import_async.sleep)({ milliseconds: DEV_INSTANCE_PROBE_INTERVAL_IN_MILLISECONDS });
|
|
307
|
+
if (moduleState.isDevInstanceDisposed) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
consecutiveFailedProbeCount = await isDevInstanceRunning(cdpUrl) ? 0 : consecutiveFailedProbeCount + 1;
|
|
311
|
+
}
|
|
312
|
+
console.warn("The Obsidian instance owned by `npm run dev` was closed. Stopping the development build.");
|
|
313
|
+
import_node_process.default.exit();
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
317
|
+
0 && (module.exports = {
|
|
318
|
+
deployToObsidianPluginsFolder
|
|
319
|
+
});
|
|
320
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9vYnNpZGlhbi1wbHVnaW5zLWZvbGRlci1kZXBsb3ltZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEZXBsb3lzIGEgZGV2ZWxvcG1lbnQgYnVpbGQgaW50byB0aGUgdmF1bHQ6IGNvcGllcyB0aGUgb3V0cHV0IGZvbGRlciBpbnRvIGA8dmF1bHQ+Ly5vYnNpZGlhbi9wbHVnaW5zYCxcbiAqIHRoZW4gcmVsb2FkcyBpdCB0aGUgd2F5IHRoZSBidWlsZCdzIGByZWxvYWRgIG9wdGlvbiBzYXlzLiBCeSBkZWZhdWx0IHRoYXQgaW5zdGFsbHMgYW5kIGVuYWJsZXMgSG90UmVsb2FkXG4gKiBhbmQgdGhlIHBsdWdpbiBpbiBhbiBPYnNpZGlhbiBpbnN0YW5jZSBgbnBtIHJ1biBkZXZgIG93bnM7IGAnb2JzaWRpYW4tY2xpJ2AgcmVsb2FkcyBpdCBpbiB0aGUgT2JzaWRpYW4gdGhlXG4gKiBkZXZlbG9wZXIgaGFzIG9wZW4gaW5zdGVhZCAoYG9ic2lkaWFuLWNsaS1yZWxvYWQudHNgKS4gRXZlcnkgYnVuZGxlciBhZGFwdGVyIGNhbGxzIGl0IG9uY2UgZWFjaCByZWJ1aWxkIGhhc1xuICogd3JpdHRlbiBpdHMgb3V0cHV0LCBzbyB0aGUgbGF0ZXN0IGJ1aWxkIGlzIGFsd2F5cyB0aGUgb25lIHJ1bm5pbmcuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIENvcGllcyBidWlsZCBvdXRwdXQgaW50byBhIHZhdWx0IGFuZCBkcml2ZXMgYSBsaXZlIE9ic2lkaWFuIG92ZXIgQ0RQLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnO1xuXG5pbXBvcnQge1xuICBpbnZva2VBc3luY1NhZmVseSxcbiAgc2xlZXBcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2RlYnVnJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBqb2luLFxuICB0b1Bvc2l4UGF0aFxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zLFxuICBEZXNrdG9wQ2RwVHJhbnNwb3J0LFxuICBldmFsSW5PYnNpZGlhblxufSBmcm9tICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblBsdWdpblJlbG9hZCB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWJ1aWxkLnRzJztcblxuaW1wb3J0IHsgcmVsb2FkUGx1Z2luV2l0aE9ic2lkaWFuQ2xpIH0gZnJvbSAnLi9vYnNpZGlhbi1jbGktcmVsb2FkLnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBmb2xkZXIgd2hlcmUgdGhlIGJ1aWx0IGZpbGVzIGFyZSBsb2NhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzdEZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBidWlsZCBpcyBhIHByb2R1Y3Rpb24gYnVpbGQuXG4gICAqL1xuICByZWFkb25seSBpc1Byb2R1Y3Rpb25CdWlsZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGZvbGRlciBvZiB0aGUgT2JzaWRpYW4gY29uZmlndXJhdGlvbi4gSWYgbm90IHByb3ZpZGVkLCB0aGUgcGx1Z2luIHdpbGwgbm90IGNvcHkgZmlsZXMuXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhbkNvbmZpZ0ZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgT2JzaWRpYW4gcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlIGRlcGxveWVkIGJ1aWxkIGlzIHJlbG9hZGVkIGluIE9ic2lkaWFuLiBEZWZhdWx0cyB0byBgJ2hvdC1yZWxvYWQtcGx1Z2luJ2AuXG4gICAqL1xuICByZWFkb25seSByZWxvYWQ/OiBPYnNpZGlhblBsdWdpblJlbG9hZDtcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGEgQ0RQIHRhcmdldCBkZXNjcmlwdG9yIHJlYWQgZnJvbSB0aGUgb3duZWQgaW5zdGFuY2UncyBgL2pzb25gIGVuZHBvaW50LlxuICovXG5pbnRlcmZhY2UgQ2RwVGFyZ2V0IHtcbiAgLyoqXG4gICAqIFRoZSBraW5kIG9mIHRoZSB0YXJnZXQsIGUuZy4gYHBhZ2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIGVudHJ5IGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkgKGBjb21tdW5pdHktcGx1Z2lucy5qc29uYCkuXG4gKi9cbmludGVyZmFjZSBDb21tdW5pdHlQbHVnaW5SZWdpc3RyeUVudHJ5IHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaWQuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYG93bmVyL25hbWVgIEdpdEh1YiByZXBvc2l0b3J5IHRoZSBwbHVnaW4gaXMgcHVibGlzaGVkIGZyb20uXG4gICAqL1xuICByZWFkb25seSByZXBvOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBhIEdpdEh1YiByZWxlYXNlIHdlIHJlYWQuXG4gKi9cbmludGVyZmFjZSBHaXRIdWJSZWxlYXNlIHtcbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIHRhZywgYSBiYXJlIHZlcnNpb24gc3VjaCBhcyBgMS4yLjNgLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFnX25hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaW5zdGFsbEFuZEVuYWJsZUhvdFJlbG9hZH0uXG4gKi9cbmludGVyZmFjZSBJbnN0YWxsQW5kRW5hYmxlSG90UmVsb2FkUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBmb2xkZXIgb2YgdGhlIE9ic2lkaWFuIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhbkNvbmZpZ0ZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYnVpbHQgT2JzaWRpYW4gcGx1Z2luIHRvIGVuYWJsZSBvbmNlIEhvdFJlbG9hZCBpcyBpbiBwbGFjZS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbn1cblxuLy8gVGhlIGBucG0gcnVuIGRldmAtb3duZWQgT2JzaWRpYW4gaW5zdGFuY2U6IGxhdW5jaGVkIG9uIHRoZSBmaXJzdCByZWJ1aWxkIGFuZCByZXVzZWQgYWNyb3NzIHJlYnVpbGRzLlxuLy8gSXRzIGxpZmV0aW1lIGlzIHRpZWQgdG8gdGhlIGBucG0gcnVuIGRldmAgcHJvY2VzcyBpbiBCT1RIIGRpcmVjdGlvbnMuXG4vLyBUaGUgaW5zdGFuY2UgaXMgY2xvc2VkIHdoZW4gdGhlIHByb2Nlc3MgdGVybWluYXRlcyAoc2VlIGByZWdpc3RlckRldkluc3RhbmNlQ2xlYW51cGApLlxuLy8gVGhlIHByb2Nlc3Mgc3RvcHMgd2hlbiB0aGUgaW5zdGFuY2UgaXMgY2xvc2VkIChzZWUgYHdhdGNoRGV2SW5zdGFuY2VBbmRTdG9wT25DbG9zZWApLlxuLyoqXG5Nb2R1bGUtbGV2ZWwgbXV0YWJsZSBzdGF0ZSwgaGVsZCBpbiBvbmUgb2JqZWN0IHNvIGVhY2ggbXV0YXRpb24gbmFtZXMgaXQgZXhwbGljaXRseS5cbiAqL1xuaW50ZXJmYWNlIE1vZHVsZVN0YXRlIHtcbiAgZGV2SW5zdGFuY2VUcmFuc3BvcnRQcm9taXNlOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB8IHVuZGVmaW5lZDtcbiAgaXNEZXZJbnN0YW5jZUNsZWFudXBSZWdpc3RlcmVkOiBib29sZWFuO1xuICBpc0Rldkluc3RhbmNlRGlzcG9zZWQ6IGJvb2xlYW47XG59XG5cbmNvbnN0IG1vZHVsZVN0YXRlOiBNb2R1bGVTdGF0ZSA9IHtcbiAgZGV2SW5zdGFuY2VUcmFuc3BvcnRQcm9taXNlOiB1bmRlZmluZWQsXG4gIGlzRGV2SW5zdGFuY2VDbGVhbnVwUmVnaXN0ZXJlZDogZmFsc2UsXG4gIGlzRGV2SW5zdGFuY2VEaXNwb3NlZDogZmFsc2Vcbn07XG5cbi8qKlxuICogSG93IG9mdGVuIHRoZSBvd25lZCBPYnNpZGlhbiBpbnN0YW5jZSBpcyBwcm9iZWQgdG8gZGV0ZWN0IHRoYXQgaXQgd2FzIGNsb3NlZC5cbiAqL1xuY29uc3QgREVWX0lOU1RBTkNFX1BST0JFX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5cbi8qKlxuICogSG93IG1hbnkgY29uc2VjdXRpdmUgZmFpbGVkIHByb2JlcyBhcmUgdG9sZXJhdGVkIGJlZm9yZSB0aGUgb3duZWQgaW5zdGFuY2UgaXMgY29uc2lkZXJlZCBjbG9zZWQuIEFcbiAqIHNpbmdsZSBmYWlsdXJlIGNhbiBiZSBhIHRyYW5zaWVudCBoaWNjdXAgKGEgYnVzeSByZW5kZXJlciwgYSBtb21lbnRhcmlseSByZWZ1c2VkIGNvbm5lY3Rpb24pLCBzbyB0aGVcbiAqIGRldmVsb3BtZW50IGJ1aWxkIGlzIG9ubHkgc3RvcHBlZCBvbmNlIHRoZSBlbmRwb2ludCBzdGF5cyB1bnJlYWNoYWJsZS5cbiAqL1xuY29uc3QgREVWX0lOU1RBTkNFX0NMT1NFRF9QUk9CRV9DT1VOVCA9IDM7XG4vKipcbiAqIENvcGllcyBhIGRldmVsb3BtZW50IGJ1aWxkIGludG8gdGhlIHZhdWx0J3MgcGx1Z2lucyBmb2xkZXIgYW5kIHJlbG9hZHMgaXQgdGhlcmUsIGFzIHRoZSBgcmVsb2FkYCBvcHRpb25cbiAqIHNheXMuIERvZXMgbm90aGluZyBmb3IgYSBwcm9kdWN0aW9uIGJ1aWxkLCBvciB3aGVuIG5vIE9ic2lkaWFuIGNvbmZpZyBmb2xkZXIgaXMgY29uZmlndXJlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBEZXBsb3lUb09ic2lkaWFuUGx1Z2luc0ZvbGRlclBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHBsdWdpbiBpcyBkZXBsb3llZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlcGxveVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyKHBhcmFtczogRGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXJQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGRpc3RGb2xkZXIsXG4gICAgaXNQcm9kdWN0aW9uQnVpbGQsXG4gICAgcGx1Z2luTmFtZVxuICB9ID0gcGFyYW1zO1xuXG4gIGlmIChpc1Byb2R1Y3Rpb25CdWlsZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghcGFyYW1zLm9ic2lkaWFuQ29uZmlnRm9sZGVyKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ2RlcGxveVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyJykoXG4gICAgICAnTm8gT2JzaWRpYW4gY29uZmlnIGZvbGRlciBjb25maWd1cmVkLiBgT0JTSURJQU5fQ09ORklHX0ZPTERFUmAgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldCBpbiBzeXN0ZW0gb3IgaW4gYC5lbnZgIGZpbGUuIFRoZSBjb21waWxlZCBwbHVnaW4gd2lsbCBub3QgYmUgY29waWVkIGludG8gT2JzaWRpYW4gcGx1Z2lucyBmb2xkZXIuJ1xuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb2JzaWRpYW5Db25maWdGb2xkZXIgPSB0b1Bvc2l4UGF0aChwYXJhbXMub2JzaWRpYW5Db25maWdGb2xkZXIpO1xuXG4gIGNvbnN0IHBsdWdpbkZvbGRlciA9IGpvaW4ob2JzaWRpYW5Db25maWdGb2xkZXIsICdwbHVnaW5zJywgcGx1Z2luTmFtZSk7XG4gIGF3YWl0IG1rZGlyKHBsdWdpbkZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGNwKGRpc3RGb2xkZXIsIHBsdWdpbkZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgc3dpdGNoIChwYXJhbXMucmVsb2FkID8/ICdob3QtcmVsb2FkLXBsdWdpbicpIHtcbiAgICBjYXNlIGZhbHNlOiB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnaG90LXJlbG9hZC1wbHVnaW4nOiB7XG4gICAgICBhd2FpdCBpbnN0YWxsQW5kRW5hYmxlSG90UmVsb2FkKHtcbiAgICAgICAgb2JzaWRpYW5Db25maWdGb2xkZXIsXG4gICAgICAgIHBsdWdpbk5hbWVcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ29ic2lkaWFuLWNsaSc6IHtcbiAgICAgIGF3YWl0IHJlbG9hZFBsdWdpbldpdGhPYnNpZGlhbkNsaSh7XG4gICAgICAgIHBsdWdpbklkOiBhd2FpdCByZWFkUGx1Z2luSWQocGx1Z2luRm9sZGVyLCBwbHVnaW5OYW1lKSxcbiAgICAgICAgdmF1bHROYW1lOiBiYXNlbmFtZShkaXJuYW1lKG9ic2lkaWFuQ29uZmlnRm9sZGVyKSlcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByZWxvYWQgb3B0aW9uOiAke1N0cmluZyhwYXJhbXMucmVsb2FkKX1gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBgbnBtIHJ1biBkZXZgLW93bmVkIE9ic2lkaWFuIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gdmF1bHQsIGxhdW5jaGluZyBpdCBvbiBmaXJzdCB1c2UgYW5kXG4gKiByZXVzaW5nIGl0IG9uIHN1YnNlcXVlbnQgcmVidWlsZHMuXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIgdG8gb3Blbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgb3duZWQge0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0fS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0T3JMYXVuY2hEZXZJbnN0YW5jZSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgbW9kdWxlU3RhdGUuZGV2SW5zdGFuY2VUcmFuc3BvcnRQcm9taXNlID8/PSBsYXVuY2hEZXZJbnN0YW5jZSh2YXVsdFBhdGgpO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBtb2R1bGVTdGF0ZS5kZXZJbnN0YW5jZVRyYW5zcG9ydFByb21pc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gQ2xlYXIgdGhlIGNhY2hlIHNvIGEgbGF0ZXIgcmVidWlsZCByZXRyaWVzIHRoZSBsYXVuY2guXG4gICAgbW9kdWxlU3RhdGUuZGV2SW5zdGFuY2VUcmFuc3BvcnRQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogSW5zdGFsbHMgdGhlIEhvdFJlbG9hZCBwbHVnaW4gZnJvbSB0aGUgb2ZmaWNpYWwgY29tbXVuaXR5IHN0b3JlIChpZiBub3QgYWxyZWFkeSBpbnN0YWxsZWQpLCBsb2FkcyBpdFxuICogKGlmIG5vdCBhbHJlYWR5IHJ1bm5pbmcpLCBhbmQgZW5hYmxlcyB0aGUgZnJlc2hseS1idWlsdCBwbHVnaW4g4oCUIGFsbCB0aHJvdWdoIHRoZSBgbnBtIHJ1biBkZXZgLW93bmVkXG4gKiBPYnNpZGlhbiBpbnN0YW5jZSwgc28gSG90UmVsb2FkIHRoZW4gYXV0by1yZWZyZXNoZXMgdGhlIGRlcGxveWVkIHBsdWdpbiBvbiBldmVyeSByZWJ1aWxkLlxuICpcbiAqIFRoZSBpbnN0YWxsIGdvZXMgdGhyb3VnaCBPYnNpZGlhbidzIG93biBgaW5zdGFsbFBsdWdpbmAgKHRoZSBjb21tdW5pdHktc3RvcmUgbWVjaGFuaXNtKSwgYW5kIGV2ZXJ5IHN0ZXBcbiAqIHJ1bnMgYWdhaW5zdCB0aGUgb3duZWQgaW5zdGFuY2Ugb3ZlciBDRFA7IGFueSBmYWlsdXJlIHN1cmZhY2VzICh0aGUgZGV2IGJ1aWxkIHJlcG9ydHMgaXQpIHJhdGhlciB0aGFuXG4gKiBiZWluZyBzaWxlbnRseSBzd2FsbG93ZWQuXG4gKlxuICogVGhlIGZpcnN0IHN0ZXAgaXMgbGVhdmluZyByZXN0cmljdGVkIG1vZGUgZm9yIHJlYWwsIHdoaWNoIHRoZSBvd25lZCBpbnN0YW5jZSBoYXMgb25seSBmYWtlZCBzbyBmYXIg4oCUXG4gKiB3aXRob3V0IGl0IFwiZW5hYmxlZFwiIGFuZCBcImxvYWRlZFwiIGNvbWUgYXBhcnQgYW5kIG5vbmUgb2YgdGhlIHZhdWx0J3MgcGx1Z2lucywgSG90UmVsb2FkIGluY2x1ZGVkLCBhcmVcbiAqIHJ1bm5pbmcuIFNlZSB0aGUgY29tbWVudCBvbiB0aGUgYHNldEVuYWJsZWAgY2FsbC5cbiAqXG4gKiBUaGUgaW5zdGFsbC1pZi1taXNzaW5nIC8gZW5hYmxlLWlmLWRpc2FibGVkIGxvZ2ljIGJlbG93IGludGVudGlvbmFsbHkgbWlycm9ycyB0aGUgcHVibGljXG4gKiBgaW5zdGFsbENvbW11bml0eVBsdWdpbmAgLyBgZW5hYmxlQ29tbXVuaXR5UGx1Z2luYCBoZWxwZXJzIGluIGBzcmMvb2JzaWRpYW4vY29tbXVuaXR5LXBsdWdpbnMudHNgLiBJdFxuICogY2Fubm90IGltcG9ydCBhbmQgY2FsbCB0aGVtOiB0aGUgYGZuYCBpcyBzZXJpYWxpemVkIChgdG9TdHJpbmcoKWApIGFuZCBleGVjdXRlZCBpbiB0aGUgcmVuZGVyZXIsIGFuZFxuICogdGhpcyBidWlsZC1vd25lZCBPYnNpZGlhbiBpbnN0YW5jZSBpcyBiYXJlIOKAlCBpdCBoYXMgbm8gZGV2LXV0aWxzIGBsaWJgIHByb3ZpZGVyIHdpcmVkICh0aGF0IHJlc29sdmVyIGlzXG4gKiByZWdpc3RlcmVkIG9ubHkgaW4gdGhlIGludGVncmF0aW9uLXRlc3Qgc2V0dXAsIHdob3NlIGZpeHR1cmUgcHVibGlzaGVzIHRoZSBtZXJnZWQgc3VyZmFjZSBvbiBgd2luZG93YCksXG4gKiBzbyB0aGUgY2xvc3VyZSBoYXMgbm8gYWNjZXNzIHRvIHRoZSBsaWJyYXJ5IHN1cmZhY2UgYW5kIG11c3QgaW5saW5lIHRoZSBlcXVpdmFsZW50IHN0ZXBzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEluc3RhbGxBbmRFbmFibGVIb3RSZWxvYWRQYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIEhvdFJlbG9hZCBhbmQgdGhlIGJ1aWx0IHBsdWdpbiBhcmUgaW5zdGFsbGVkIGFuZCBlbmFibGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBpbnN0YWxsQW5kRW5hYmxlSG90UmVsb2FkKHBhcmFtczogSW5zdGFsbEFuZEVuYWJsZUhvdFJlbG9hZFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgb2JzaWRpYW5Db25maWdGb2xkZXIsXG4gICAgcGx1Z2luTmFtZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCB2YXVsdFBhdGggPSBkaXJuYW1lKG9ic2lkaWFuQ29uZmlnRm9sZGVyKTtcbiAgY29uc3QgdHJhbnNwb3J0ID0gYXdhaXQgZ2V0T3JMYXVuY2hEZXZJbnN0YW5jZSh2YXVsdFBhdGgpO1xuICBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSBObyBhY3R1YWwgc2hhZG93aW5nIGFzIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZCBleHRlcm5hbGx5LlxuICAgIGFzeW5jIGNhbGxiYWNrKHsgYXBwLCBvYnNpZGlhbk1vZHVsZSwgcGx1Z2luTmFtZSB9KSB7XG4gICAgICBjb25zdCBIT1RfUkVMT0FEX1BMVUdJTl9JRCA9ICdob3QtcmVsb2FkJztcbiAgICAgIGNvbnN0IENPTU1VTklUWV9QTFVHSU5TX1JFR0lTVFJZX1VSTCA9ICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlcy9IRUFEL2NvbW11bml0eS1wbHVnaW5zLmpzb24nO1xuICAgICAgY29uc3QgeyByZXF1ZXN0VXJsIH0gPSBvYnNpZGlhbk1vZHVsZTtcblxuICAgICAgLypcbiAgICAgICAqIEdlbnVpbmVseSBsZWF2ZSByZXN0cmljdGVkIG1vZGUgYmVmb3JlIHRvdWNoaW5nIGFueXRoaW5nIGVsc2UuIFRoZSBvd25lZCBpbnN0YW5jZSBib290cyB3aXRoIGFcbiAgICAgICAqIGZyZXNoIHVzZXItZGF0YSBkaXIsIHNvIE9ic2lkaWFuIHN0YXJ0cyByZXN0cmljdGVkIGFuZCBgUGx1Z2lucy5pbml0aWFsaXplKClgIHJldHVybnMgYmVmb3JlXG4gICAgICAgKiBsb2FkaW5nIGEgc2luZ2xlIHBsdWdpbi4gVGhlIGhhcm5lc3MgdGhlbiBjbG9zZXMgdGhlIHRydXN0IG1vZGFsIGFuZCB3cml0ZXMgdGhlXG4gICAgICAgKiBgZW5hYmxlLXBsdWdpbi08YXBwSWQ+YCBsb2NhbFN0b3JhZ2UgZmxhZyBkaXJlY3RseSDigJQgZGVsaWJlcmF0ZWx5LCB0byBhdm9pZCBhIHN5bmNocm9ub3VzIGxvYWQg4oCUXG4gICAgICAgKiB3aGljaCBsZWF2ZXMgYGlzRW5hYmxlZCgpYCByZXBvcnRpbmcgYHRydWVgIG92ZXIgYSB2YXVsdCB3aGVyZSBub3RoaW5nIGlzIGFjdHVhbGx5IHJ1bm5pbmcuIEV2ZXJ5XG4gICAgICAgKiBgZW5hYmxlZFBsdWdpbnNgIHJlYWRpbmcgYmVsb3cgKGFuZCBpbiB0aGUgbWlycm9yZWQgYGNvbW11bml0eS1wbHVnaW5zLnRzYCBoZWxwZXJzKSB3b3VsZCBiZVxuICAgICAgICogYW5zd2VyaW5nIGFib3V0IHRoZSB2YXVsdCdzIGNvbmZpZyBmaWxlIHJhdGhlciB0aGFuIHRoaXMgaW5zdGFuY2UuXG4gICAgICAgKlxuICAgICAgICogYHNldEVuYWJsZSh0cnVlKWAgaXMgd2hhdCBPYnNpZGlhbidzIG93biBcIkV4aXQgcmVzdHJpY3RlZCBtb2RlXCIgYnV0dG9uIGNhbGxzOiBpdCByZS1hc3NlcnRzIHRoZVxuICAgICAgICogZmxhZyBhbmQgbG9hZHMgZXZlcnl0aGluZyBpbiBgZW5hYmxlZFBsdWdpbnNgLiBVbmNvbmRpdGlvbmFsIG9uIHB1cnBvc2Ug4oCUIHRoZSBmbGFnIGlzIGFscmVhZHlcbiAgICAgICAqIGB0cnVlYCwgc28gYW4gYGlzRW5hYmxlZCgpYCBndWFyZCB3b3VsZCBza2lwIHRoZSBsb2FkIHRoYXQgaXMgdGhlIHdob2xlIHBvaW50LiBJZGVtcG90ZW50IGFuZFxuICAgICAgICogZWZmZWN0aXZlbHkgZnJlZSBvbmNlIHdhcm0gKGBsb2FkUGx1Z2luYCByZXR1cm5zIHRoZSBsaXZlIGluc3RhbmNlKSwgc28gcmUtcnVubmluZyBpdCBvbiBldmVyeVxuICAgICAgICogcmVidWlsZCBjb3N0cyBub3RoaW5nLlxuICAgICAgICovXG4gICAgICBhd2FpdCBhcHAucGx1Z2lucy5zZXRFbmFibGUodHJ1ZSk7XG5cbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihhcHAucGx1Z2lucy5tYW5pZmVzdHMsIEhPVF9SRUxPQURfUExVR0lOX0lEKSkge1xuICAgICAgICBjb25zdCByZWdpc3RyeVJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdFVybChDT01NVU5JVFlfUExVR0lOU19SRUdJU1RSWV9VUkwpO1xuICAgICAgICBjb25zdCByZWdpc3RyeUVudHJpZXMgPSByZWdpc3RyeVJlc3BvbnNlLmpzb24gYXMgQ29tbXVuaXR5UGx1Z2luUmVnaXN0cnlFbnRyeVtdO1xuICAgICAgICBjb25zdCBlbnRyeSA9IHJlZ2lzdHJ5RW50cmllcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PT0gSE9UX1JFTE9BRF9QTFVHSU5fSUQpO1xuICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gJyR7SE9UX1JFTE9BRF9QTFVHSU5fSUR9JyB3YXMgbm90IGZvdW5kIGluIHRoZSBPYnNpZGlhbiBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhdGVzdFJlbGVhc2VSZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RVcmwoYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtlbnRyeS5yZXBvfS9yZWxlYXNlcy9sYXRlc3RgKTtcbiAgICAgICAgY29uc3QgbGF0ZXN0UmVsZWFzZSA9IGxhdGVzdFJlbGVhc2VSZXNwb25zZS5qc29uIGFzIEdpdEh1YlJlbGVhc2U7XG4gICAgICAgIGNvbnN0IHZlcnNpb24gPSBsYXRlc3RSZWxlYXNlLnRhZ19uYW1lO1xuICAgICAgICBjb25zdCBtYW5pZmVzdFJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdFVybChgaHR0cHM6Ly9naXRodWIuY29tLyR7ZW50cnkucmVwb30vcmVsZWFzZXMvZG93bmxvYWQvJHt2ZXJzaW9ufS9tYW5pZmVzdC5qc29uYCk7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gbWFuaWZlc3RSZXNwb25zZS5qc29uIGFzIFBsdWdpbk1hbmlmZXN0O1xuICAgICAgICBhd2FpdCBhcHAucGx1Z2lucy5pbnN0YWxsUGx1Z2luKGVudHJ5LnJlcG8sIHZlcnNpb24sIG1hbmlmZXN0KTtcbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAqIEFzayB3aGV0aGVyIEhvdFJlbG9hZCBpcyBSVU5OSU5HLCBub3Qgd2hldGhlciB0aGUgdmF1bHQgY29uZmlnIGxpc3RzIGl0IGFzIGVuYWJsZWQuIEFmdGVyIHRoZVxuICAgICAgICogYHNldEVuYWJsZWAgYWJvdmUgdGhlIHR3byBub3JtYWxseSBhZ3JlZSwgYnV0IGEgSG90UmVsb2FkIHRoYXQgaXMgbGlzdGVkIGFuZCBmYWlsZWQgdG8gbG9hZCB3b3VsZFxuICAgICAgICogcGFzcyBhbiBgZW5hYmxlZFBsdWdpbnNgIGNoZWNrIHdoaWxlIGxlYXZpbmcgdGhlIGRldiBidWlsZCB3aXRob3V0IGF1dG8tcmVmcmVzaC5cbiAgICAgICAqL1xuICAgICAgaWYgKCFPYmplY3QuaGFzT3duKGFwcC5wbHVnaW5zLnBsdWdpbnMsIEhPVF9SRUxPQURfUExVR0lOX0lEKSkge1xuICAgICAgICBhd2FpdCBhcHAucGx1Z2lucy5lbmFibGVQbHVnaW5BbmRTYXZlKEhPVF9SRUxPQURfUExVR0lOX0lEKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgYXBwLnBsdWdpbnMuZW5hYmxlUGx1Z2luQW5kU2F2ZShwbHVnaW5OYW1lKTtcbiAgICB9LFxuICAgIGlucHV0OiB7IHBsdWdpbk5hbWUgfSxcbiAgICBzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzOiB0cnVlLFxuICAgIHRyYW5zcG9ydCxcbiAgICB2YXVsdFBhdGhcbiAgfSk7XG59XG5cbi8qKlxuICogUHJvYmVzIHRoZSBvd25lZCBPYnNpZGlhbiBpbnN0YW5jZSdzIENEUCBlbmRwb2ludCB0byBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBzdGlsbCBydW5uaW5nLlxuICpcbiAqIEEgY2xvc2VkIGluc3RhbmNlIHN0b3BzIHNlcnZpbmcgQ0RQIGFsdG9nZXRoZXIsIHNvIGFuIHVucmVhY2hhYmxlIGVuZHBvaW50IOKAlCBvciBvbmUgbGVmdCB3aXRoIG5vIHBhZ2VcbiAqIHRhcmdldHMgd2hpbGUgdGhlIGFwcCB0ZWFycyBpdHNlbGYgZG93biDigJQgbWVhbnMgdGhlIGluc3RhbmNlIGlzIGdvbmUuXG4gKlxuICogQHBhcmFtIGNkcFVybCAtIFRoZSBiYXNlIENEUCBVUkwgb2YgdGhlIG93bmVkIGluc3RhbmNlLCBlLmcuIGBodHRwOi8vbG9jYWxob3N0OjUxODg4YC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byBgdHJ1ZWAgd2hpbGUgdGhlIGluc3RhbmNlIGlzIHN0aWxsIHNlcnZpbmcgYSBwYWdlIHRhcmdldC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNEZXZJbnN0YW5jZVJ1bm5pbmcoY2RwVXJsOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzIC0tIFdlIHJ1biB0aGlzIG91dHNpZGUgb2YgT2JzaWRpYW4sIHNvIHdlIGRvbid0IGhhdmUgYHJlcXVlc3RVcmwoKWAuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtjZHBVcmx9L2pzb25gKTtcbiAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIENkcFRhcmdldFtdO1xuICAgIHJldHVybiB0YXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LnR5cGUgPT09ICdwYWdlJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIExhdW5jaGVzIGEgZnJlc2ggb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgKGlzb2xhdGVkIHVzZXItZGF0YSBkaXIpIGFuZCBvcGVucyB0aGUgZ2l2ZW4gdmF1bHQuXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIgdG8gb3Blbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgbGF1bmNoZWQge0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0fS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGF1bmNoRGV2SW5zdGFuY2UodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGNvbnN0IHRyYW5zcG9ydCA9IGF3YWl0IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdHJhbnNwb3J0LnJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0cmFuc3BvcnQuZGlzcG9zZVN5bmM/LigpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG4gIHJlZ2lzdGVyRGV2SW5zdGFuY2VDbGVhbnVwKHRyYW5zcG9ydCk7XG4gIHdhdGNoRGV2SW5zdGFuY2VBbmRTdG9wT25DbG9zZSh0cmFuc3BvcnQpO1xuICByZXR1cm4gdHJhbnNwb3J0O1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBwbHVnaW4gaWQgZnJvbSB0aGUgZGVwbG95ZWQgYG1hbmlmZXN0Lmpzb25gLCB3aGljaCBpcyB3aGF0IE9ic2lkaWFuIGFuZCBpdHMgQ0xJIGtub3cgdGhlIHBsdWdpbiBieS5cbiAqXG4gKiBAcGFyYW0gcGx1Z2luRm9sZGVyIC0gVGhlIGRlcGxveWVkIHBsdWdpbiBmb2xkZXIuXG4gKiBAcGFyYW0gZmFsbGJhY2tJZCAtIFRoZSBpZCB0byB1c2Ugd2hlbiB0aGUgZm9sZGVyIGhhcyBubyByZWFkYWJsZSBtYW5pZmVzdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgcGx1Z2luIGlkLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkUGx1Z2luSWQocGx1Z2luRm9sZGVyOiBzdHJpbmcsIGZhbGxiYWNrSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGpvaW4ocGx1Z2luRm9sZGVyLCAnbWFuaWZlc3QuanNvbicpLCAndXRmLTgnKSkgYXMgUGFydGlhbDxQbHVnaW5NYW5pZmVzdD47XG4gICAgcmV0dXJuIG1hbmlmZXN0LmlkID8/IGZhbGxiYWNrSWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxsYmFja0lkO1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHByb2Nlc3MtZXhpdCBhbmQgc2lnbmFsIGhhbmRsZXJzIChvbmNlKSB0aGF0IHN5bmNocm9ub3VzbHkgY2xvc2UgdGhlIG93bmVkIE9ic2lkaWFuXG4gKiBpbnN0YW5jZSB3aGVuIHRoZSBgbnBtIHJ1biBkZXZgIHByb2Nlc3MgdGVybWluYXRlcy5cbiAqXG4gKiBUaGVzZSBoYW5kbGVycyBjb3ZlciBhbiBvcmRlcmx5IHNodXRkb3duLiBBIGBTSUdLSUxMYCAob3IgYSBUYXNrIE1hbmFnZXIgLyBJREUgc3RvcCkgcnVucyBubyBoYW5kbGVyXG4gKiBhdCBhbGwsIGFuZCBubyBvcGVyYXRpbmcgc3lzdGVtIGtpbGxzIHRoZSBpbnN0YW5jZSBqdXN0IGZvciBiZWluZyBvdXIgY2hpbGQg4oCUIHNvIHRoYXQgY2FzZSBpcyBjYXVnaHRcbiAqIGZyb20gdGhlIG90aGVyIHNpZGUsIGJ5IHRoZSBoYXJuZXNzJ3MgcGFyZW50LWxpdmVuZXNzIHdhdGNoZG9nOiB0aGUgaW5zdGFuY2UncyByZW5kZXJlciBob2xkcyBhIHNvY2tldFxuICogYmFjayB0byB0aGlzIHByb2Nlc3MgYW5kIGRlc3Ryb3lzIGl0cyB3aW5kb3cgd2hlbiB0aGUga2VybmVsIGNsb3NlcyBpdC4gU2VlIGBwYXJlbnQtbGl2ZW5lc3MudHNgIGluXG4gKiBgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZ2AuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSBvd25lZCB0cmFuc3BvcnQgdG8gZGlzcG9zZSBvbiBzaHV0ZG93bi5cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJEZXZJbnN0YW5jZUNsZWFudXAodHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCk6IHZvaWQge1xuICBpZiAobW9kdWxlU3RhdGUuaXNEZXZJbnN0YW5jZUNsZWFudXBSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIG1vZHVsZVN0YXRlLmlzRGV2SW5zdGFuY2VDbGVhbnVwUmVnaXN0ZXJlZCA9IHRydWU7XG5cbiAgLy8gYGV4aXRgIGNvdmVycyBhbnkgYHByb2Nlc3MuZXhpdCgpYCwgYnV0IGEgZGVmYXVsdCBDdHJsK0MgdGVybWluYXRlcyBXSVRIT1VUIGZpcmluZyBgZXhpdGAsIHNvIHRoZSBzaWduYWwgaGFuZGxlcnMgZ3VhcmFudGVlIHRoZSBvd25lZCBPYnNpZGlhbiBpcyBraWxsZWQgb24gc2h1dGRvd24uXG4gIHByb2Nlc3Mub24oJ2V4aXQnLCBkaXNwb3NlRGV2SW5zdGFuY2UpO1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0hVUCcsICdTSUdJTlQnLCAnU0lHVEVSTSddIGFzIGNvbnN0KSB7XG4gICAgcHJvY2Vzcy5vbmNlKHNpZ25hbCwgKCkgPT4ge1xuICAgICAgZGlzcG9zZURldkluc3RhbmNlKCk7XG4gICAgICBwcm9jZXNzLmV4aXQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc3Bvc2VEZXZJbnN0YW5jZSgpOiB2b2lkIHtcbiAgICBpZiAobW9kdWxlU3RhdGUuaXNEZXZJbnN0YW5jZURpc3Bvc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG1vZHVsZVN0YXRlLmlzRGV2SW5zdGFuY2VEaXNwb3NlZCA9IHRydWU7XG4gICAgdHJhbnNwb3J0LmRpc3Bvc2VTeW5jPy4oKTtcbiAgfVxufVxuXG4vKipcbiAqIFdhdGNoZXMgdGhlIGBucG0gcnVuIGRldmAtb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgYW5kIHN0b3BzIHRoZSBkZXZlbG9wbWVudCBidWlsZCBvbmNlIHRoZSBpbnN0YW5jZSBpc1xuICogY2xvc2VkLlxuICpcbiAqIFRoaXMgaXMgdGhlIG1pcnJvciBpbWFnZSBvZiB7QGxpbmsgcmVnaXN0ZXJEZXZJbnN0YW5jZUNsZWFudXB9OiB0aGF0IG9uZSBjbG9zZXMgdGhlIGluc3RhbmNlIHdoZW4gdGhlXG4gKiBgbnBtIHJ1biBkZXZgIHByb2Nlc3MgdGVybWluYXRlcywgdGhpcyBvbmUgdGVybWluYXRlcyB0aGUgcHJvY2VzcyB3aGVuIHRoZSB1c2VyIGNsb3NlcyB0aGUgaW5zdGFuY2UsIHNvXG4gKiB0aGUgdHdvIG5ldmVyIG91dGxpdmUgZWFjaCBvdGhlci4gQSBidWlsZCB3YXRjaGluZyBhbiBPYnNpZGlhbiB0aGF0IGlzIG5vIGxvbmdlciBydW5uaW5nIGhhcyBub3RoaW5nXG4gKiBsZWZ0IHRvIGRlcGxveSB0by5cbiAqXG4gKiBPbmx5IGEgaGFybmVzcy1vd25lZCBpbnN0YW5jZSBpcyB3YXRjaGVkLiBXaGVuIHRoZSB0cmFuc3BvcnQgYXR0YWNoZXMgdG8gYW4gYWxyZWFkeS1ydW5uaW5nIE9ic2lkaWFuXG4gKiAodGhlIHVzZXIncyBvd24pLCB0aGF0IGluc3RhbmNlIGlzIG5vdCBvdXJzIHRvIGJlIHRpZWQgdG8gYW5kIGNsb3NpbmcgaXQgbGVhdmVzIHRoZSBidWlsZCBydW5uaW5nLlxuICpcbiAqIEBwYXJhbSB0cmFuc3BvcnQgLSBUaGUgb3duZWQgdHJhbnNwb3J0IHdob3NlIGluc3RhbmNlIHRvIHdhdGNoLlxuICovXG5mdW5jdGlvbiB3YXRjaERldkluc3RhbmNlQW5kU3RvcE9uQ2xvc2UodHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCk6IHZvaWQge1xuICBpZiAoISh0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGVuZHBvaW50ID0gdHJhbnNwb3J0LmdldE93bmVkSW5zdGFuY2VFbmRwb2ludCgpO1xuICBpZiAoIWVuZHBvaW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2RwVXJsID0gYGh0dHA6Ly8ke2VuZHBvaW50Lmhvc3R9OiR7U3RyaW5nKGVuZHBvaW50LnBvcnQpfWA7XG4gIGludm9rZUFzeW5jU2FmZWx5KHN0b3BXaGVuRGV2SW5zdGFuY2VDbG9zZXMpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHN0b3BXaGVuRGV2SW5zdGFuY2VDbG9zZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGNvbnNlY3V0aXZlRmFpbGVkUHJvYmVDb3VudCA9IDA7XG4gICAgd2hpbGUgKGNvbnNlY3V0aXZlRmFpbGVkUHJvYmVDb3VudCA8IERFVl9JTlNUQU5DRV9DTE9TRURfUFJPQkVfQ09VTlQpIHtcbiAgICAgIGF3YWl0IHNsZWVwKHsgbWlsbGlzZWNvbmRzOiBERVZfSU5TVEFOQ0VfUFJPQkVfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTIH0pO1xuXG4gICAgICAvLyBUaGUgcHJvY2VzcyBpcyBhbHJlYWR5IHNodXR0aW5nIGRvd24gYW5kIGtpbGxlZCB0aGUgaW5zdGFuY2UgaXRzZWxmOyB0aGUgcHJvYmVzIHdvdWxkIGp1c3QgcmFjZSB0aGUgdGVhcmRvd24uXG4gICAgICBpZiAobW9kdWxlU3RhdGUuaXNEZXZJbnN0YW5jZURpc3Bvc2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc2VjdXRpdmVGYWlsZWRQcm9iZUNvdW50ID0gYXdhaXQgaXNEZXZJbnN0YW5jZVJ1bm5pbmcoY2RwVXJsKSA/IDAgOiBjb25zZWN1dGl2ZUZhaWxlZFByb2JlQ291bnQgKyAxO1xuICAgIH1cblxuICAgIGNvbnNvbGUud2FybignVGhlIE9ic2lkaWFuIGluc3RhbmNlIG93bmVkIGJ5IGBucG0gcnVuIGRldmAgd2FzIGNsb3NlZC4gU3RvcHBpbmcgdGhlIGRldmVsb3BtZW50IGJ1aWxkLicpO1xuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.cts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Deploys a development build into the vault: copies the output folder into `<vault>/.obsidian/plugins`,
|
|
6
|
+
* then reloads it the way the build's `reload` option says. By default that installs and enables HotReload
|
|
7
|
+
* and the plugin in an Obsidian instance `npm run dev` owns; `'obsidian-cli'` reloads it in the Obsidian the
|
|
8
|
+
* developer has open instead (`obsidian-cli-reload.ts`). Every bundler adapter calls it once each rebuild has
|
|
9
|
+
* written its output, so the latest build is always the one running.
|
|
10
|
+
*/
|
|
11
|
+
import type { ObsidianPluginReload } from './obsidian-plugin-build.cjs';
|
|
12
|
+
/**
|
|
13
|
+
* Parameters for {@link deployToObsidianPluginsFolder}.
|
|
14
|
+
*/
|
|
15
|
+
export interface DeployToObsidianPluginsFolderParams {
|
|
16
|
+
/**
|
|
17
|
+
* The folder where the built files are located.
|
|
18
|
+
*/
|
|
19
|
+
readonly distFolder: string;
|
|
20
|
+
/**
|
|
21
|
+
* A boolean indicating whether the build is a production build.
|
|
22
|
+
*/
|
|
23
|
+
readonly isProductionBuild: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* The folder of the Obsidian configuration. If not provided, the plugin will not copy files.
|
|
26
|
+
*/
|
|
27
|
+
readonly obsidianConfigFolder: string;
|
|
28
|
+
/**
|
|
29
|
+
* The name of the Obsidian plugin.
|
|
30
|
+
*/
|
|
31
|
+
readonly pluginName: string;
|
|
32
|
+
/**
|
|
33
|
+
* How the deployed build is reloaded in Obsidian. Defaults to `'hot-reload-plugin'`.
|
|
34
|
+
*/
|
|
35
|
+
readonly reload?: ObsidianPluginReload;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Copies a development build into the vault's plugins folder and reloads it there, as the `reload` option
|
|
39
|
+
* says. Does nothing for a production build, or when no Obsidian config folder is configured.
|
|
40
|
+
*
|
|
41
|
+
* @param params - The {@link DeployToObsidianPluginsFolderParams}.
|
|
42
|
+
* @returns A {@link Promise} that resolves once the plugin is deployed.
|
|
43
|
+
*/
|
|
44
|
+
export declare function deployToObsidianPluginsFolder(params: DeployToObsidianPluginsFolderParams): Promise<void>;
|