@mnaoumov/obsidian-dev-toolkit 2.1.0 → 3.1.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 +6 -2
- 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/demo-vault-helper/main.js +6 -442
- package/dist/integration-test-plugin/main.js +918 -4912
- 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 +104 -5
- 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,37 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.cts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Reloads a deployed development build through the Obsidian CLI (`obsidian`, Obsidian 1.12 and later), in the
|
|
6
|
+
* Obsidian the developer already has open. It is the `reload: 'obsidian-cli'` half of
|
|
7
|
+
* `obsidian-plugins-folder-deployment.ts`.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Parameters for {@link reloadPluginWithObsidianCli}.
|
|
11
|
+
*/
|
|
12
|
+
export interface ReloadPluginWithObsidianCliParams {
|
|
13
|
+
/**
|
|
14
|
+
* The plugin id, from its `manifest.json`.
|
|
15
|
+
*/
|
|
16
|
+
readonly pluginId: string;
|
|
17
|
+
/**
|
|
18
|
+
* The vault's name as Obsidian knows it, which is the name of the vault's folder.
|
|
19
|
+
*/
|
|
20
|
+
readonly vaultName: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The command the Obsidian CLI is run as.
|
|
24
|
+
*/
|
|
25
|
+
export declare const OBSIDIAN_CLI_COMMAND = "obsidian";
|
|
26
|
+
/**
|
|
27
|
+
* Reloads a plugin in the running Obsidian through the Obsidian CLI, enabling it first when Obsidian does not
|
|
28
|
+
* know it yet.
|
|
29
|
+
*
|
|
30
|
+
* The CLI exits with code 0 even when the command failed, and says so in its output (`Vault not found.`,
|
|
31
|
+
* `Error: ...`), so the output is what is checked.
|
|
32
|
+
*
|
|
33
|
+
* @param params - The {@link ReloadPluginWithObsidianCliParams}.
|
|
34
|
+
* @returns A {@link Promise} that resolves once the plugin is reloaded.
|
|
35
|
+
* @throws When the CLI cannot be run, or reports a failure.
|
|
36
|
+
*/
|
|
37
|
+
export declare function reloadPluginWithObsidianCli(params: ReloadPluginWithObsidianCliParams): Promise<void>;
|
|
@@ -0,0 +1,278 @@
|
|
|
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_plugin_build_exports = {};
|
|
136
|
+
__export(obsidian_plugin_build_exports, {
|
|
137
|
+
BuildMode: () => BuildMode,
|
|
138
|
+
OBSIDIAN_PLUGIN_EXTERNALS: () => OBSIDIAN_PLUGIN_EXTERNALS,
|
|
139
|
+
OBSIDIAN_PLUGIN_RUNTIME_MODULES: () => OBSIDIAN_PLUGIN_RUNTIME_MODULES,
|
|
140
|
+
cleanObsidianPluginDistFolder: () => cleanObsidianPluginDistFolder,
|
|
141
|
+
completeObsidianPluginDistFolder: () => completeObsidianPluginDistFolder,
|
|
142
|
+
getObsidianPluginBanner: () => getObsidianPluginBanner,
|
|
143
|
+
getObsidianPluginDistFolder: () => getObsidianPluginDistFolder,
|
|
144
|
+
getObsidianPluginEntryPoint: () => getObsidianPluginEntryPoint,
|
|
145
|
+
isCssFileName: () => isCssFileName,
|
|
146
|
+
isObsidianPluginExternal: () => isObsidianPluginExternal,
|
|
147
|
+
mergeCssAssets: () => mergeCssAssets,
|
|
148
|
+
resolveFromRoot: () => resolveFromRoot,
|
|
149
|
+
resolveObsidianPluginBuildContext: () => resolveObsidianPluginBuildContext
|
|
150
|
+
});
|
|
151
|
+
module.exports = __toCommonJS(obsidian_plugin_build_exports);
|
|
152
|
+
var import_npm = require('@mnaoumov/typescript-dev-toolkit/npm');
|
|
153
|
+
var import_root = require('@mnaoumov/typescript-dev-toolkit/root');
|
|
154
|
+
var import_path = require('@mnaoumov/typescript-lib/path');
|
|
155
|
+
var import_type_guards = require('@mnaoumov/typescript-lib/type-guards');
|
|
156
|
+
var import_node_fs = require('node:fs');
|
|
157
|
+
var import_promises = require('node:fs/promises');
|
|
158
|
+
var import_node_module = require('node:module');
|
|
159
|
+
var import_node_process = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('node:process')), 1);
|
|
160
|
+
var import_obsidian_plugin_repo_paths = require('../obsidian-plugin-repo-paths.cjs');
|
|
161
|
+
var BuildMode = /* @__PURE__ */ ((BuildMode2) => {
|
|
162
|
+
BuildMode2[BuildMode2["Development"] = 0] = "Development";
|
|
163
|
+
BuildMode2[BuildMode2["Production"] = 1] = "Production";
|
|
164
|
+
return BuildMode2;
|
|
165
|
+
})(BuildMode || {});
|
|
166
|
+
const OBSIDIAN_PLUGIN_RUNTIME_MODULES = [
|
|
167
|
+
"obsidian",
|
|
168
|
+
"electron",
|
|
169
|
+
"@codemirror/autocomplete",
|
|
170
|
+
"@codemirror/collab",
|
|
171
|
+
"@codemirror/commands",
|
|
172
|
+
"@codemirror/language",
|
|
173
|
+
"@codemirror/lint",
|
|
174
|
+
"@codemirror/search",
|
|
175
|
+
"@codemirror/state",
|
|
176
|
+
"@codemirror/view",
|
|
177
|
+
"@lezer/common",
|
|
178
|
+
"@lezer/highlight",
|
|
179
|
+
"@lezer/lr",
|
|
180
|
+
"esbuild",
|
|
181
|
+
"eslint"
|
|
182
|
+
];
|
|
183
|
+
const OBSIDIAN_PLUGIN_EXTERNALS = [
|
|
184
|
+
...OBSIDIAN_PLUGIN_RUNTIME_MODULES,
|
|
185
|
+
...import_node_module.builtinModules
|
|
186
|
+
];
|
|
187
|
+
const NODE_PREFIX = "node:";
|
|
188
|
+
const STYLES_CSS_FILE_NAME = import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.StylesCss;
|
|
189
|
+
const OBSIDIAN_PLUGIN_EXTERNALS_SET = new Set(OBSIDIAN_PLUGIN_EXTERNALS);
|
|
190
|
+
async function cleanObsidianPluginDistFolder(distFolder) {
|
|
191
|
+
if ((0, import_node_fs.existsSync)(distFolder)) {
|
|
192
|
+
await (0, import_promises.rm)(distFolder, { recursive: true });
|
|
193
|
+
}
|
|
194
|
+
await (0, import_promises.mkdir)(distFolder, { recursive: true });
|
|
195
|
+
}
|
|
196
|
+
async function completeObsidianPluginDistFolder(context) {
|
|
197
|
+
await (0, import_promises.mkdir)(context.distFolder, { recursive: true });
|
|
198
|
+
if (!context.isProductionBuild && context.reload === "hot-reload-plugin") {
|
|
199
|
+
await (0, import_promises.writeFile)((0, import_path.join)(context.distFolder, import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.HotReload), "", "utf-8");
|
|
200
|
+
}
|
|
201
|
+
const manifestPath = (0, import_root.resolvePathFromRoot)({ path: import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.ManifestJson });
|
|
202
|
+
if (manifestPath && (0, import_node_fs.existsSync)(manifestPath)) {
|
|
203
|
+
await (0, import_promises.cp)(manifestPath, (0, import_path.join)(context.distFolder, import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.ManifestJson));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function getObsidianPluginBanner(bundlerName) {
|
|
207
|
+
return `/*
|
|
208
|
+
THIS IS A GENERATED/BUNDLED FILE BY ${bundlerName.toUpperCase()}
|
|
209
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
210
|
+
*/
|
|
211
|
+
`;
|
|
212
|
+
}
|
|
213
|
+
function getObsidianPluginDistFolder(mode) {
|
|
214
|
+
return resolveFromRoot(mode === 1 /* Production */ ? import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.DistBuild : import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.DistDev);
|
|
215
|
+
}
|
|
216
|
+
function getObsidianPluginEntryPoint() {
|
|
217
|
+
return resolveFromRoot((0, import_path.join)(import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.Src, import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.MainTs));
|
|
218
|
+
}
|
|
219
|
+
function isCssFileName(fileName) {
|
|
220
|
+
return (0, import_path.basename)(fileName).toLowerCase().endsWith(".css");
|
|
221
|
+
}
|
|
222
|
+
function isObsidianPluginExternal(moduleId) {
|
|
223
|
+
if (moduleId.startsWith(NODE_PREFIX) || OBSIDIAN_PLUGIN_EXTERNALS_SET.has(moduleId)) {
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
226
|
+
const SCOPED_PACKAGE_SEGMENT_COUNT = 2;
|
|
227
|
+
const packageName = moduleId.split("/").slice(0, moduleId.startsWith("@") ? SCOPED_PACKAGE_SEGMENT_COUNT : 1).join("/");
|
|
228
|
+
return packageName !== moduleId && OBSIDIAN_PLUGIN_EXTERNALS_SET.has(packageName);
|
|
229
|
+
}
|
|
230
|
+
function mergeCssAssets(cssAssets) {
|
|
231
|
+
const [firstCssAsset] = cssAssets;
|
|
232
|
+
if (firstCssAsset === void 0 || cssAssets.length === 1 && firstCssAsset.fileName === STYLES_CSS_FILE_NAME) {
|
|
233
|
+
return { fileNamesToRemove: [], stylesCss: void 0 };
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
fileNamesToRemove: cssAssets.map((asset) => asset.fileName),
|
|
237
|
+
stylesCss: cssAssets.map((asset) => asset.source).join("\n")
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
function resolveFromRoot(path) {
|
|
241
|
+
return (0, import_type_guards.ensureNonNullable)((0, import_root.resolvePathFromRoot)({ path }), `Could not resolve '${path}' against the project root`);
|
|
242
|
+
}
|
|
243
|
+
async function resolveObsidianPluginBuildContext(params) {
|
|
244
|
+
const envPath = (0, import_root.resolvePathFromRoot)({ path: ".env" });
|
|
245
|
+
if (envPath && (0, import_node_fs.existsSync)(envPath)) {
|
|
246
|
+
(0, import_node_process.loadEnvFile)(envPath);
|
|
247
|
+
}
|
|
248
|
+
const obsidianPluginBuilderEnv = import_node_process.default.env;
|
|
249
|
+
const isProductionBuild = params.mode === 1 /* Production */;
|
|
250
|
+
const distFolder = params.distFolder === void 0 ? getObsidianPluginDistFolder(params.mode) : resolveFromRoot(params.distFolder);
|
|
251
|
+
const packageJson = await (0, import_npm.readPackageJson)();
|
|
252
|
+
return {
|
|
253
|
+
distFolder,
|
|
254
|
+
entryPoint: getObsidianPluginEntryPoint(),
|
|
255
|
+
isProductionBuild,
|
|
256
|
+
mainJsPath: (0, import_path.join)(distFolder, import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.MainJs),
|
|
257
|
+
obsidianConfigFolder: params.obsidianConfigFolder ?? obsidianPluginBuilderEnv.OBSIDIAN_CONFIG_FOLDER ?? "",
|
|
258
|
+
pluginName: packageJson.name ?? "(unknown)",
|
|
259
|
+
reload: params.reload ?? "hot-reload-plugin"
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
263
|
+
0 && (module.exports = {
|
|
264
|
+
BuildMode,
|
|
265
|
+
OBSIDIAN_PLUGIN_EXTERNALS,
|
|
266
|
+
OBSIDIAN_PLUGIN_RUNTIME_MODULES,
|
|
267
|
+
cleanObsidianPluginDistFolder,
|
|
268
|
+
completeObsidianPluginDistFolder,
|
|
269
|
+
getObsidianPluginBanner,
|
|
270
|
+
getObsidianPluginDistFolder,
|
|
271
|
+
getObsidianPluginEntryPoint,
|
|
272
|
+
isCssFileName,
|
|
273
|
+
isObsidianPluginExternal,
|
|
274
|
+
mergeCssAssets,
|
|
275
|
+
resolveFromRoot,
|
|
276
|
+
resolveObsidianPluginBuildContext
|
|
277
|
+
});
|
|
278
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9vYnNpZGlhbi1wbHVnaW4tYnVpbGQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBidW5kbGVyLWluZGVwZW5kZW50IGhhbGYgb2YgYnVpbGRpbmcgYW4gT2JzaWRpYW4gcGx1Z2luOiB3aGljaCBtb2R1bGVzIHN0YXkgZXh0ZXJuYWwsIHdoZXJlIHRoZVxuICogb3V0cHV0IGdvZXMsIHdoYXQgdGhlIG91dHB1dCBmb2xkZXIgaG9sZHMgYmVzaWRlcyB0aGUgYnVuZGxlLCBhbmQgaG93IGEgZGV2ZWxvcG1lbnQgYnVpbGQgcmVhY2hlcyB0aGVcbiAqIHZhdWx0LiBFdmVyeSBidW5kbGVyIGFkYXB0ZXIgaW4gdGhpcyBmb2xkZXIgKGVzYnVpbGQsIHJvbGx1cCwgdml0ZSwgd2VicGFjaywgcGFyY2VsKSBpcyBhIHRoaW4gbGF5ZXIgb3ZlclxuICogaXQsIHNvIGFsbCBvZiB0aGVtIHByb2R1Y2UgdGhlIHNhbWUgYG1haW4uanNgICsgYHN0eWxlcy5jc3NgICsgYG1hbmlmZXN0Lmpzb25gIGxheW91dC5cbiAqL1xuXG5pbXBvcnQgeyByZWFkUGFja2FnZUpzb24gfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9ucG0nO1xuaW1wb3J0IHsgcmVzb2x2ZVBhdGhGcm9tUm9vdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L3Jvb3QnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGpvaW5cbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgY3AsXG4gIG1rZGlyLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgYnVpbHRpbk1vZHVsZXMgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcHJvY2VzcywgeyBsb2FkRW52RmlsZSB9IGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB7IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIH0gZnJvbSAnLi4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuXG4vKipcbiAqIEVudW1lcmF0aW9uIHJlcHJlc2VudGluZyB0aGUgYnVpbGQgbW9kZXMuXG4gKi9cbmV4cG9ydCBlbnVtIEJ1aWxkTW9kZSB7XG4gIC8qKlxuICBEZXZlbG9wbWVudCBtb2RlIGZvciBidWlsZGluZyB0aGUgcGx1Z2luXG4gICAqL1xuICBEZXZlbG9wbWVudCxcbiAgLyoqXG4gIFByb2R1Y3Rpb24gbW9kZSBmb3IgYnVpbGRpbmcgdGhlIHBsdWdpblxuICAgKi9cbiAgUHJvZHVjdGlvblxufVxuXG4vKipcbiAqIFRoZSBtb2R1bGVzIE9ic2lkaWFuIHN1cHBsaWVzIGF0IHJ1bnRpbWUuIEEgcGx1Z2luIG11c3QgbmV2ZXIgYnVuZGxlIGl0cyBvd24gY29weSBvZiB0aGVtOiBhIHNlY29uZCBjb3B5XG4gKiBvZiB0aGUgQVBJIGJyZWFrcyBgaW5zdGFuY2VvZmAgYWdhaW5zdCB0aGUgcnVubmluZyBvbmUsIGFuZCBhIHNlY29uZCBDb2RlTWlycm9yIGJyZWFrcyBldmVyeSBleHRlbnNpb24uXG4gKlxuICogYGVzYnVpbGRgIGFuZCBgZXNsaW50YCBhcmUgaGVyZSBiZWNhdXNlIGEgcGx1Z2luIHRoYXQgaW1wb3J0cyBvbmUgb2YgdGhlIHRvb2xraXQncyBidWlsZC10aW1lIG1vZHVsZXNcbiAqIHdvdWxkIG90aGVyd2lzZSBkcmFnIGVpdGhlciBpbnRvIGBtYWluLmpzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IE9CU0lESUFOX1BMVUdJTl9SVU5USU1FX01PRFVMRVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnb2JzaWRpYW4nLFxuICAnZWxlY3Ryb24nLFxuICAnQGNvZGVtaXJyb3IvYXV0b2NvbXBsZXRlJyxcbiAgJ0Bjb2RlbWlycm9yL2NvbGxhYicsXG4gICdAY29kZW1pcnJvci9jb21tYW5kcycsXG4gICdAY29kZW1pcnJvci9sYW5ndWFnZScsXG4gICdAY29kZW1pcnJvci9saW50JyxcbiAgJ0Bjb2RlbWlycm9yL3NlYXJjaCcsXG4gICdAY29kZW1pcnJvci9zdGF0ZScsXG4gICdAY29kZW1pcnJvci92aWV3JyxcbiAgJ0BsZXplci9jb21tb24nLFxuICAnQGxlemVyL2hpZ2hsaWdodCcsXG4gICdAbGV6ZXIvbHInLFxuICAnZXNidWlsZCcsXG4gICdlc2xpbnQnXG5dO1xuXG4vKipcbiAqIFRoZSBtb2R1bGUgaWRzIGFuIE9ic2lkaWFuIHBsdWdpbiBidW5kbGUgbGVhdmVzIHRvIGByZXF1aXJlKClgIGF0IHJ1bnRpbWU6IHRoZVxuICoge0BsaW5rIE9CU0lESUFOX1BMVUdJTl9SVU5USU1FX01PRFVMRVN9IGFuZCB0aGUgTm9kZSBidWlsdGlucy4gRXZlcnkgYG5vZGU6YC1wcmVmaXhlZCBpZCBpcyBleHRlcm5hbCB0b28sXG4gKiB3aGljaCBhIGJ1bmRsZXIgdGFrZXMgYXMgYSBwYXR0ZXJuIChlc2J1aWxkJ3MgYG5vZGU6KmApIG9yIHRocm91Z2gge0BsaW5rIGlzT2JzaWRpYW5QbHVnaW5FeHRlcm5hbH0uXG4gKi9cbmV4cG9ydCBjb25zdCBPQlNJRElBTl9QTFVHSU5fRVhURVJOQUxTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgLi4uT0JTSURJQU5fUExVR0lOX1JVTlRJTUVfTU9EVUxFUyxcbiAgLi4uYnVpbHRpbk1vZHVsZXNcbl07XG5cbmNvbnN0IE5PREVfUFJFRklYID0gJ25vZGU6JztcbmNvbnN0IFNUWUxFU19DU1NfRklMRV9OQU1FOiBzdHJpbmcgPSBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5TdHlsZXNDc3M7XG5cbmNvbnN0IE9CU0lESUFOX1BMVUdJTl9FWFRFUk5BTFNfU0VUID0gbmV3IFNldChPQlNJRElBTl9QTFVHSU5fRVhURVJOQUxTKTtcblxuLyoqXG4gKiBBIENTUyBmaWxlIGEgYnVuZGxlciBlbWl0dGVkLCBhcyB7QGxpbmsgbWVyZ2VDc3NBc3NldHN9IHNlZXMgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3NzQXNzZXQge1xuICAvKipcbiAgICogVGhlIGZpbGUgbmFtZSByZWxhdGl2ZSB0byB0aGUgb3V0cHV0IGZvbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlJ3MgY29udGVudHMuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IHtAbGluayBtZXJnZUNzc0Fzc2V0c30gZGVjaWRlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXJnZUNzc0Fzc2V0c1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgZmlsZSBuYW1lcyB0byBkcm9wIGZyb20gdGhlIG91dHB1dCwgYmVjYXVzZSB0aGVpciBjb250ZW50cyBtb3ZlZCBpbnRvIGBzdHlsZXMuY3NzYC4gSW5jbHVkZXNcbiAgICogYHN0eWxlcy5jc3NgIGl0c2VsZiB3aGVuIHRoZSBidW5kbGVyIGFscmVhZHkgZW1pdHRlZCBvbmUsIHNvIGl0IGlzIGFsd2F5cyB3cml0dGVuIGFmcmVzaC5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVOYW1lc1RvUmVtb3ZlOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnRzIG9mIGBzdHlsZXMuY3NzYCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvOiB0aGUgYnVuZGxlIGhhcyBubyBDU1MgYXQgYWxsLFxuICAgKiBvciBpdHMgb25lIENTUyBmaWxlIGFscmVhZHkgaXMgYHN0eWxlcy5jc3NgLlxuICAgKi9cbiAgcmVhZG9ubHkgc3R5bGVzQ3NzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogV2hlcmUgYSBwbHVnaW4gYnVpbGQgd3JpdGVzIGl0cyBvdXRwdXQgYW5kIHdoYXQgaXQgYnVpbGRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmb2xkZXIgdGhlIGJ1aWxkIHdyaXRlcyBgbWFpbi5qc2AsIGBzdHlsZXMuY3NzYCBhbmQgYG1hbmlmZXN0Lmpzb25gIGludG8uXG4gICAqL1xuICByZWFkb25seSBkaXN0Rm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBwbHVnaW4ncyBlbnRyeSBwb2ludCwgYHNyYy9tYWluLnRzYC5cbiAgICovXG4gIHJlYWRvbmx5IGVudHJ5UG9pbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGlzIGEgcHJvZHVjdGlvbiBidWlsZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzUHJvZHVjdGlvbkJ1aWxkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZW1pdHRlZCBgbWFpbi5qc2AuXG4gICAqL1xuICByZWFkb25seSBtYWluSnNQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBjb25maWd1cmF0aW9uIGZvbGRlciBhIGRldmVsb3BtZW50IGJ1aWxkIGlzIGRlcGxveWVkIGludG8sIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIG5vbmVcbiAgICogaXMgY29uZmlndXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IG9ic2lkaWFuQ29uZmlnRm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4ncyBmb2xkZXIgbmFtZSBpbnNpZGUgYDx2YXVsdD4vLm9ic2lkaWFuL3BsdWdpbnNgLCB3aGljaCBpcyB0aGUgcGFja2FnZSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgYSBkZXZlbG9wbWVudCBidWlsZCBpcyByZWxvYWRlZCBpbiBPYnNpZGlhbiBvbmNlIGl0IGlzIGRlcGxveWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVsb2FkOiBPYnNpZGlhblBsdWdpblJlbG9hZDtcbn1cblxuLyoqXG4gKiBXaGVyZSBhIGRldmVsb3BtZW50IGJ1aWxkIGlzIGRlcGxveWVkIGFuZCBob3cgT2JzaWRpYW4gcGlja3MgaXQgdXAuIEV2ZXJ5IGJ1bmRsZXIgYWRhcHRlciB0YWtlcyB0aGVzZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhblBsdWdpbkRlcGxveW1lbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgZm9sZGVyIGZvciBPYnNpZGlhbiBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byB0aGUgYE9CU0lESUFOX0NPTkZJR19GT0xERVJgIGVudmlyb25tZW50IHZhcmlhYmxlLFxuICAgKiByZWFkIGZyb20gdGhlIHByb2Nlc3Mgb3IgZnJvbSBhIGAuZW52YCBmaWxlIGluIHRoZSBwcm9qZWN0IHJvb3QuXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhbkNvbmZpZ0ZvbGRlcj86IHN0cmluZztcblxuICAvKipcbiAgICogSG93IGEgZGV2ZWxvcG1lbnQgYnVpbGQgaXMgcmVsb2FkZWQgaW4gT2JzaWRpYW4gb25jZSBpdCBpcyBjb3BpZWQgaW50byB0aGUgdmF1bHQuIERlZmF1bHRzIHRvXG4gICAqIGAnaG90LXJlbG9hZC1wbHVnaW4nYC5cbiAgICovXG4gIHJlYWRvbmx5IHJlbG9hZD86IE9ic2lkaWFuUGx1Z2luUmVsb2FkO1xufVxuXG4vKipcbiAqIEhvdyBhIGRldmVsb3BtZW50IGJ1aWxkIGlzIHJlbG9hZGVkIGluIE9ic2lkaWFuIG9uY2UgaXQgaXMgY29waWVkIGludG8gdGhlIHZhdWx0LlxuICpcbiAqIC0gYCdob3QtcmVsb2FkLXBsdWdpbidgOiB0aGUgYnVpbGQgd3JpdGVzIHRoZSBgLmhvdHJlbG9hZGAgbWFya2VyLCBhbmQgYG5wbSBydW4gZGV2YCBvcGVucyB0aGUgdmF1bHQgaW4gYW5cbiAqICAgT2JzaWRpYW4gaW5zdGFuY2UgaXQgb3ducywgd2l0aCB0aGUgSG90UmVsb2FkIHBsdWdpbiBpbnN0YWxsZWQgYW5kIGVuYWJsZWQgdGhlcmUuXG4gKiAtIGAnb2JzaWRpYW4tY2xpJ2A6IGV2ZXJ5IHJlYnVpbGQgcnVucyBgb2JzaWRpYW4gcGx1Z2luOnJlbG9hZGAgYWdhaW5zdCB0aGUgT2JzaWRpYW4geW91IGFscmVhZHkgaGF2ZSBvcGVuLFxuICogICB0aHJvdWdoIHRoZSBPYnNpZGlhbiBDTEkgKFNldHRpbmdzIOKGkiBHZW5lcmFsIOKGkiBDb21tYW5kIGxpbmUgaW50ZXJmYWNlKS4gTm8gSG90UmVsb2FkLCBubyBzZWNvbmQgaW5zdGFuY2UuXG4gKiAtIGBmYWxzZWA6IHRoZSBidWlsZCBpcyBjb3BpZWQgaW50byB0aGUgdmF1bHQgYW5kIG5vdGhpbmcgcmVsb2FkcyBpdC5cbiAqL1xuZXhwb3J0IHR5cGUgT2JzaWRpYW5QbHVnaW5SZWxvYWQgPSAnaG90LXJlbG9hZC1wbHVnaW4nIHwgJ29ic2lkaWFuLWNsaScgfCBmYWxzZTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcmVzb2x2ZU9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHRQYXJhbXMgZXh0ZW5kcyBPYnNpZGlhblBsdWdpbkRlcGxveW1lbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBvdXRwdXQgZm9sZGVyLiBEZWZhdWx0cyB0byBgZGlzdC9idWlsZGAgZm9yIGEgcHJvZHVjdGlvbiBidWlsZCBhbmQgYGRpc3QvZGV2YCBmb3IgYSBkZXZlbG9wbWVudFxuICAgKiBvbmUuXG4gICAqL1xuICByZWFkb25seSBkaXN0Rm9sZGVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgbW9kZS5cbiAgICovXG4gIHJlYWRvbmx5IG1vZGU6IEJ1aWxkTW9kZTtcbn1cblxuaW50ZXJmYWNlIE9ic2lkaWFuUGx1Z2luQnVpbGRlckVudiB7XG4gIE9CU0lESUFOX0NPTkZJR19GT0xERVI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBvdXRwdXQgZm9sZGVyIG9mIGEgYnVpbGQgYW5kIGNyZWF0ZXMgaXQgZW1wdHkgYWdhaW4uXG4gKlxuICogQHBhcmFtIGRpc3RGb2xkZXIgLSBUaGUgb3V0cHV0IGZvbGRlci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgZm9sZGVyIGV4aXN0cyBhbmQgaXMgZW1wdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhbk9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcihkaXN0Rm9sZGVyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGV4aXN0c1N5bmMoZGlzdEZvbGRlcikpIHtcbiAgICBhd2FpdCBybShkaXN0Rm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuICBhd2FpdCBta2RpcihkaXN0Rm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBQdXRzIHRoZSBmaWxlcyBhIHBsdWdpbiBmb2xkZXIgbmVlZHMgYmVzaWRlcyB0aGUgYnVuZGxlIGludG8gdGhlIG91dHB1dCBmb2xkZXI6IGBtYW5pZmVzdC5qc29uYCwgYW5kIGZvclxuICogYSBkZXZlbG9wbWVudCBidWlsZCByZWxvYWRlZCBieSB0aGUgSG90UmVsb2FkIHBsdWdpbiB0aGUgZW1wdHkgYC5ob3RyZWxvYWRgIG1hcmtlciBpdCB3YXRjaGVzIGZvci5cbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSBidWlsZCBjb250ZXh0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBmaWxlcyBhcmUgd3JpdHRlbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbXBsZXRlT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyKGNvbnRleHQ6IE9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG1rZGlyKGNvbnRleHQuZGlzdEZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGlmICghY29udGV4dC5pc1Byb2R1Y3Rpb25CdWlsZCAmJiBjb250ZXh0LnJlbG9hZCA9PT0gJ2hvdC1yZWxvYWQtcGx1Z2luJykge1xuICAgIGF3YWl0IHdyaXRlRmlsZShqb2luKGNvbnRleHQuZGlzdEZvbGRlciwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuSG90UmVsb2FkKSwgJycsICd1dGYtOCcpO1xuICB9XG5cbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdCh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvbiB9KTtcbiAgaWYgKG1hbmlmZXN0UGF0aCAmJiBleGlzdHNTeW5jKG1hbmlmZXN0UGF0aCkpIHtcbiAgICBhd2FpdCBjcChtYW5pZmVzdFBhdGgsIGpvaW4oY29udGV4dC5kaXN0Rm9sZGVyLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb24pKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgYmFubmVyIHBsYWNlZCBhdCB0aGUgdG9wIG9mIGBtYWluLmpzYC5cbiAqXG4gKiBAcGFyYW0gYnVuZGxlck5hbWUgLSBUaGUgYnVuZGxlcidzIG5hbWUsIGFzIHRoZSBiYW5uZXIgc3RhdGVzIGl0LlxuICogQHJldHVybnMgVGhlIGJhbm5lciwgYSBibG9jayBjb21tZW50IGZvbGxvd2VkIGJ5IGEgbmV3bGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9ic2lkaWFuUGx1Z2luQmFubmVyKGJ1bmRsZXJOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYC8qXG5USElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSAke2J1bmRsZXJOYW1lLnRvVXBwZXJDYXNlKCl9XG5pZiB5b3Ugd2FudCB0byB2aWV3IHRoZSBzb3VyY2UsIHBsZWFzZSB2aXNpdCB0aGUgZ2l0aHViIHJlcG9zaXRvcnkgb2YgdGhpcyBwbHVnaW5cbiovXG5gO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBkZWZhdWx0IG91dHB1dCBmb2xkZXIgb2YgYSBidWlsZDogYGRpc3QvYnVpbGRgIGZvciBhIHByb2R1Y3Rpb24gYnVpbGQsIGBkaXN0L2RldmAgZm9yIGFcbiAqIGRldmVsb3BtZW50IG9uZS5cbiAqXG4gKiBAcGFyYW0gbW9kZSAtIFRoZSBidWlsZCBtb2RlLlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIG91dHB1dCBmb2xkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIobW9kZTogQnVpbGRNb2RlKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlc29sdmVGcm9tUm9vdChtb2RlID09PSBCdWlsZE1vZGUuUHJvZHVjdGlvbiA/IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRpc3RCdWlsZCA6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRpc3REZXYpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBwbHVnaW4ncyBlbnRyeSBwb2ludCwgYHNyYy9tYWluLnRzYC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZW50cnkgcG9pbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNpZGlhblBsdWdpbkVudHJ5UG9pbnQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlc29sdmVGcm9tUm9vdChqb2luKE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlNyYywgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFpblRzKSk7XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciBhIGZpbGUgbmFtZSBpcyBhIENTUyBmaWxlLlxuICpcbiAqIEBwYXJhbSBmaWxlTmFtZSAtIFRoZSBmaWxlIG5hbWUuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgZm9yIGEgYC5jc3NgIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Nzc0ZpbGVOYW1lKGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGJhc2VuYW1lKGZpbGVOYW1lKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcuY3NzJyk7XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciBhIG1vZHVsZSBpZCBpcyBvbmUgYW4gT2JzaWRpYW4gcGx1Z2luIGJ1bmRsZSBtdXN0IGxlYXZlIGV4dGVybmFsOiBvbmUgb2ZcbiAqIHtAbGluayBPQlNJRElBTl9QTFVHSU5fRVhURVJOQUxTfSwgYSBzdWJwYXRoIG9mIG9uZSAoYEBjb2RlbWlycm9yL3ZpZXcvZGlzdC9pbmRleC5qc2AsIGBmcy9wcm9taXNlc2ApLFxuICogb3IgYW55IGBub2RlOmAtcHJlZml4ZWQgaWQuXG4gKlxuICogQHBhcmFtIG1vZHVsZUlkIC0gVGhlIG1vZHVsZSBpZCBhcyB3cml0dGVuIGluIHRoZSBpbXBvcnRpbmcgZmlsZS5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBidW5kbGUgbXVzdCBsZWF2ZSB0aGUgbW9kdWxlIHRvIGByZXF1aXJlKClgIGF0IHJ1bnRpbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09ic2lkaWFuUGx1Z2luRXh0ZXJuYWwobW9kdWxlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAobW9kdWxlSWQuc3RhcnRzV2l0aChOT0RFX1BSRUZJWCkgfHwgT0JTSURJQU5fUExVR0lOX0VYVEVSTkFMU19TRVQuaGFzKG1vZHVsZUlkKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgU0NPUEVEX1BBQ0tBR0VfU0VHTUVOVF9DT1VOVCA9IDI7XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gbW9kdWxlSWQuc3BsaXQoJy8nKS5zbGljZSgwLCBtb2R1bGVJZC5zdGFydHNXaXRoKCdAJykgPyBTQ09QRURfUEFDS0FHRV9TRUdNRU5UX0NPVU5UIDogMSkuam9pbignLycpO1xuICByZXR1cm4gcGFja2FnZU5hbWUgIT09IG1vZHVsZUlkICYmIE9CU0lESUFOX1BMVUdJTl9FWFRFUk5BTFNfU0VULmhhcyhwYWNrYWdlTmFtZSk7XG59XG5cbi8qKlxuICogRGVjaWRlcyBob3cgdGhlIENTUyBhIGJ1bmRsZXIgZW1pdHRlZCBiZWNvbWVzIHRoZSBvbmUgYHN0eWxlcy5jc3NgIE9ic2lkaWFuIGxvYWRzLlxuICpcbiAqIE9ic2lkaWFuIHJlYWRzIGEgcGx1Z2luJ3Mgc3R5bGVzaGVldCBmcm9tIGBzdHlsZXMuY3NzYCBhbmQgbm90aGluZyBlbHNlLCB3aGlsZSBhIGJ1bmRsZXIgbmFtZXMgdGhlIENTU1xuICogYWZ0ZXIgdGhlIGVudHJ5IChgbWFpbi5jc3NgKSwgYWZ0ZXIgdGhlIHBhY2thZ2UsIG9yIHdpdGggYSBjb250ZW50IGhhc2guIEEgbG9uZSBDU1MgZmlsZSBpcyByZW5hbWVkOyB3aGVuXG4gKiB0aGVyZSBhcmUgc2V2ZXJhbCwgdGhleSBhcmUgY29uY2F0ZW5hdGVkIGluIHRoZSBvcmRlciBnaXZlbi5cbiAqXG4gKiBAcGFyYW0gY3NzQXNzZXRzIC0gVGhlIENTUyBmaWxlcyB0aGUgYnVuZGxlciBlbWl0dGVkLCBpbiBvdXRwdXQgb3JkZXIuXG4gKiBAcmV0dXJucyBXaGF0IHRvIHdyaXRlIGFzIGBzdHlsZXMuY3NzYCBhbmQgd2hpY2ggZW1pdHRlZCBmaWxlcyB0byBkcm9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDc3NBc3NldHMoY3NzQXNzZXRzOiByZWFkb25seSBDc3NBc3NldFtdKTogTWVyZ2VDc3NBc3NldHNSZXN1bHQge1xuICBjb25zdCBbZmlyc3RDc3NBc3NldF0gPSBjc3NBc3NldHM7XG4gIGlmIChmaXJzdENzc0Fzc2V0ID09PSB1bmRlZmluZWQgfHwgKGNzc0Fzc2V0cy5sZW5ndGggPT09IDEgJiYgZmlyc3RDc3NBc3NldC5maWxlTmFtZSA9PT0gU1RZTEVTX0NTU19GSUxFX05BTUUpKSB7XG4gICAgcmV0dXJuIHsgZmlsZU5hbWVzVG9SZW1vdmU6IFtdLCBzdHlsZXNDc3M6IHVuZGVmaW5lZCB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmaWxlTmFtZXNUb1JlbW92ZTogY3NzQXNzZXRzLm1hcCgoYXNzZXQpID0+IGFzc2V0LmZpbGVOYW1lKSxcbiAgICBzdHlsZXNDc3M6IGNzc0Fzc2V0cy5tYXAoKGFzc2V0KSA9PiBhc3NldC5zb3VyY2UpLmpvaW4oJ1xcbicpXG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYSBwYXRoIGFnYWluc3QgdGhlIHByb2plY3Qgcm9vdC5cbiAqXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoLCByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCByb290IG9yIGFic29sdXRlLlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRnJvbVJvb3QocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKHJlc29sdmVQYXRoRnJvbVJvb3QoeyBwYXRoIH0pLCBgQ291bGQgbm90IHJlc29sdmUgJyR7cGF0aH0nIGFnYWluc3QgdGhlIHByb2plY3Qgcm9vdGApO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHdoZXJlIGEgcGx1Z2luIGJ1aWxkIHdyaXRlcyBpdHMgb3V0cHV0LCB3aGljaCBlbnRyeSBwb2ludCBpdCBidWlsZHMgYW5kIHdoaWNoIHZhdWx0IGFcbiAqIGRldmVsb3BtZW50IGJ1aWxkIGlzIGRlcGxveWVkIGludG8uXG4gKlxuICogTG9hZHMgdGhlIHByb2plY3QncyBgLmVudmAgZmlsZSBmaXJzdCwgc28gYE9CU0lESUFOX0NPTkZJR19GT0xERVJgIGNhbiBsaXZlIHRoZXJlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIFJlc29sdmVPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dFBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSB7QGxpbmsgT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHR9LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0KHBhcmFtczogUmVzb2x2ZU9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0UGFyYW1zKTogUHJvbWlzZTxPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dD4ge1xuICBjb25zdCBlbnZQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdCh7IHBhdGg6ICcuZW52JyB9KTtcbiAgaWYgKGVudlBhdGggJiYgZXhpc3RzU3luYyhlbnZQYXRoKSkge1xuICAgIGxvYWRFbnZGaWxlKGVudlBhdGgpO1xuICB9XG4gIGNvbnN0IG9ic2lkaWFuUGx1Z2luQnVpbGRlckVudiA9IHByb2Nlc3MuZW52IGFzIFBhcnRpYWw8T2JzaWRpYW5QbHVnaW5CdWlsZGVyRW52PjtcblxuICBjb25zdCBpc1Byb2R1Y3Rpb25CdWlsZCA9IHBhcmFtcy5tb2RlID09PSBCdWlsZE1vZGUuUHJvZHVjdGlvbjtcbiAgY29uc3QgZGlzdEZvbGRlciA9IHBhcmFtcy5kaXN0Rm9sZGVyID09PSB1bmRlZmluZWQgPyBnZXRPYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIocGFyYW1zLm1vZGUpIDogcmVzb2x2ZUZyb21Sb290KHBhcmFtcy5kaXN0Rm9sZGVyKTtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24oKTtcblxuICByZXR1cm4ge1xuICAgIGRpc3RGb2xkZXIsXG4gICAgZW50cnlQb2ludDogZ2V0T2JzaWRpYW5QbHVnaW5FbnRyeVBvaW50KCksXG4gICAgaXNQcm9kdWN0aW9uQnVpbGQsXG4gICAgbWFpbkpzUGF0aDogam9pbihkaXN0Rm9sZGVyLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYWluSnMpLFxuICAgIG9ic2lkaWFuQ29uZmlnRm9sZGVyOiBwYXJhbXMub2JzaWRpYW5Db25maWdGb2xkZXIgPz8gb2JzaWRpYW5QbHVnaW5CdWlsZGVyRW52Lk9CU0lESUFOX0NPTkZJR19GT0xERVIgPz8gJycsXG4gICAgcGx1Z2luTmFtZTogcGFja2FnZUpzb24ubmFtZSA/PyAnKHVua25vd24pJyxcbiAgICByZWxvYWQ6IHBhcmFtcy5yZWxvYWQgPz8gJ2hvdC1yZWxvYWQtcGx1Z2luJ1xuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFTQSxpQkFBZ0M7QUFDaEMsa0JBQW9DO0FBQ3BDLGtCQUdPO0FBQ1AseUJBQWtDO0FBQ2xDLHFCQUEyQjtBQUMzQixzQkFLTztBQUNQLHlCQUErQjtBQUMvQiwwQkFBcUM7QUFFckMsd0NBQXdDO0FBS2pDLElBQUssWUFBTCxrQkFBS0EsZUFBTDtBQUlMLEVBQUFBLHNCQUFBO0FBSUEsRUFBQUEsc0JBQUE7QUFSVSxTQUFBQTtBQUFBLEdBQUE7QUFrQkwsTUFBTSxrQ0FBcUQ7QUFBQSxFQUNoRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFPTyxNQUFNLDRCQUErQztBQUFBLEVBQzFELEdBQUc7QUFBQSxFQUNILEdBQUc7QUFDTDtBQUVBLE1BQU0sY0FBYztBQUNwQixNQUFNLHVCQUErQiwwREFBd0I7QUFFN0QsTUFBTSxnQ0FBZ0MsSUFBSSxJQUFJLHlCQUF5QjtBQWlJdkUsZUFBc0IsOEJBQThCLFlBQW1DO0FBQ3JGLFVBQUksMkJBQVcsVUFBVSxHQUFHO0FBQzFCLGNBQU0sb0JBQUcsWUFBWSxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQUEsRUFDMUM7QUFDQSxZQUFNLHVCQUFNLFlBQVksRUFBRSxXQUFXLEtBQUssQ0FBQztBQUM3QztBQVNBLGVBQXNCLGlDQUFpQyxTQUFvRDtBQUN6RyxZQUFNLHVCQUFNLFFBQVEsWUFBWSxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQ25ELE1BQUksQ0FBQyxRQUFRLHFCQUFxQixRQUFRLFdBQVcscUJBQXFCO0FBQ3hFLGNBQU0sK0JBQVUsa0JBQUssUUFBUSxZQUFZLDBEQUF3QixTQUFTLEdBQUcsSUFBSSxPQUFPO0FBQUEsRUFDMUY7QUFFQSxRQUFNLG1CQUFlLGlDQUFvQixFQUFFLE1BQU0sMERBQXdCLGFBQWEsQ0FBQztBQUN2RixNQUFJLG9CQUFnQiwyQkFBVyxZQUFZLEdBQUc7QUFDNUMsY0FBTSxvQkFBRyxrQkFBYyxrQkFBSyxRQUFRLFlBQVksMERBQXdCLFlBQVksQ0FBQztBQUFBLEVBQ3ZGO0FBQ0Y7QUFRTyxTQUFTLHdCQUF3QixhQUE2QjtBQUNuRSxTQUFPO0FBQUEsc0NBQzZCLFlBQVksWUFBWSxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBSS9EO0FBU08sU0FBUyw0QkFBNEIsTUFBeUI7QUFDbkUsU0FBTyxnQkFBZ0IsU0FBUyxxQkFBdUIsMERBQXdCLFlBQVksMERBQXdCLE9BQU87QUFDNUg7QUFPTyxTQUFTLDhCQUFzQztBQUNwRCxTQUFPLG9CQUFnQixrQkFBSywwREFBd0IsS0FBSywwREFBd0IsTUFBTSxDQUFDO0FBQzFGO0FBUU8sU0FBUyxjQUFjLFVBQTJCO0FBQ3ZELGFBQU8sc0JBQVMsUUFBUSxFQUFFLFlBQVksRUFBRSxTQUFTLE1BQU07QUFDekQ7QUFVTyxTQUFTLHlCQUF5QixVQUEyQjtBQUNsRSxNQUFJLFNBQVMsV0FBVyxXQUFXLEtBQUssOEJBQThCLElBQUksUUFBUSxHQUFHO0FBQ25GLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSwrQkFBK0I7QUFDckMsUUFBTSxjQUFjLFNBQVMsTUFBTSxHQUFHLEVBQUUsTUFBTSxHQUFHLFNBQVMsV0FBVyxHQUFHLElBQUksK0JBQStCLENBQUMsRUFBRSxLQUFLLEdBQUc7QUFDdEgsU0FBTyxnQkFBZ0IsWUFBWSw4QkFBOEIsSUFBSSxXQUFXO0FBQ2xGO0FBWU8sU0FBUyxlQUFlLFdBQXNEO0FBQ25GLFFBQU0sQ0FBQyxhQUFhLElBQUk7QUFDeEIsTUFBSSxrQkFBa0IsVUFBYyxVQUFVLFdBQVcsS0FBSyxjQUFjLGFBQWEsc0JBQXVCO0FBQzlHLFdBQU8sRUFBRSxtQkFBbUIsQ0FBQyxHQUFHLFdBQVcsT0FBVTtBQUFBLEVBQ3ZEO0FBRUEsU0FBTztBQUFBLElBQ0wsbUJBQW1CLFVBQVUsSUFBSSxDQUFDLFVBQVUsTUFBTSxRQUFRO0FBQUEsSUFDMUQsV0FBVyxVQUFVLElBQUksQ0FBQyxVQUFVLE1BQU0sTUFBTSxFQUFFLEtBQUssSUFBSTtBQUFBLEVBQzdEO0FBQ0Y7QUFRTyxTQUFTLGdCQUFnQixNQUFzQjtBQUNwRCxhQUFPLDBDQUFrQixpQ0FBb0IsRUFBRSxLQUFLLENBQUMsR0FBRyxzQkFBc0IsSUFBSSw0QkFBNEI7QUFDaEg7QUFXQSxlQUFzQixrQ0FBa0MsUUFBc0Y7QUFDNUksUUFBTSxjQUFVLGlDQUFvQixFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3BELE1BQUksZUFBVywyQkFBVyxPQUFPLEdBQUc7QUFDbEMseUNBQVksT0FBTztBQUFBLEVBQ3JCO0FBQ0EsUUFBTSwyQkFBMkIsb0JBQUFDLFFBQVE7QUFFekMsUUFBTSxvQkFBb0IsT0FBTyxTQUFTO0FBQzFDLFFBQU0sYUFBYSxPQUFPLGVBQWUsU0FBWSw0QkFBNEIsT0FBTyxJQUFJLElBQUksZ0JBQWdCLE9BQU8sVUFBVTtBQUNqSSxRQUFNLGNBQWMsVUFBTSw0QkFBZ0I7QUFFMUMsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBLFlBQVksNEJBQTRCO0FBQUEsSUFDeEM7QUFBQSxJQUNBLGdCQUFZLGtCQUFLLFlBQVksMERBQXdCLE1BQU07QUFBQSxJQUMzRCxzQkFBc0IsT0FBTyx3QkFBd0IseUJBQXlCLDBCQUEwQjtBQUFBLElBQ3hHLFlBQVksWUFBWSxRQUFRO0FBQUEsSUFDaEMsUUFBUSxPQUFPLFVBQVU7QUFBQSxFQUMzQjtBQUNGOyIsIm5hbWVzIjpbIkJ1aWxkTW9kZSIsInByb2Nlc3MiXX0=
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.cts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* The bundler-independent half of building an Obsidian plugin: which modules stay external, where the
|
|
6
|
+
* output goes, what the output folder holds besides the bundle, and how a development build reaches the
|
|
7
|
+
* vault. Every bundler adapter in this folder (esbuild, rollup, vite, webpack, parcel) is a thin layer over
|
|
8
|
+
* it, so all of them produce the same `main.js` + `styles.css` + `manifest.json` layout.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Enumeration representing the build modes.
|
|
12
|
+
*/
|
|
13
|
+
export declare enum BuildMode {
|
|
14
|
+
/**
|
|
15
|
+
Development mode for building the plugin
|
|
16
|
+
*/
|
|
17
|
+
Development = 0,
|
|
18
|
+
/**
|
|
19
|
+
Production mode for building the plugin
|
|
20
|
+
*/
|
|
21
|
+
Production = 1
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The modules Obsidian supplies at runtime. A plugin must never bundle its own copy of them: a second copy
|
|
25
|
+
* of the API breaks `instanceof` against the running one, and a second CodeMirror breaks every extension.
|
|
26
|
+
*
|
|
27
|
+
* `esbuild` and `eslint` are here because a plugin that imports one of the toolkit's build-time modules
|
|
28
|
+
* would otherwise drag either into `main.js`.
|
|
29
|
+
*/
|
|
30
|
+
export declare const OBSIDIAN_PLUGIN_RUNTIME_MODULES: readonly string[];
|
|
31
|
+
/**
|
|
32
|
+
* The module ids an Obsidian plugin bundle leaves to `require()` at runtime: the
|
|
33
|
+
* {@link OBSIDIAN_PLUGIN_RUNTIME_MODULES} and the Node builtins. Every `node:`-prefixed id is external too,
|
|
34
|
+
* which a bundler takes as a pattern (esbuild's `node:*`) or through {@link isObsidianPluginExternal}.
|
|
35
|
+
*/
|
|
36
|
+
export declare const OBSIDIAN_PLUGIN_EXTERNALS: readonly string[];
|
|
37
|
+
/**
|
|
38
|
+
* A CSS file a bundler emitted, as {@link mergeCssAssets} sees it.
|
|
39
|
+
*/
|
|
40
|
+
export interface CssAsset {
|
|
41
|
+
/**
|
|
42
|
+
* The file name relative to the output folder.
|
|
43
|
+
*/
|
|
44
|
+
readonly fileName: string;
|
|
45
|
+
/**
|
|
46
|
+
* The file's contents.
|
|
47
|
+
*/
|
|
48
|
+
readonly source: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* What {@link mergeCssAssets} decided.
|
|
52
|
+
*/
|
|
53
|
+
export interface MergeCssAssetsResult {
|
|
54
|
+
/**
|
|
55
|
+
* The file names to drop from the output, because their contents moved into `styles.css`. Includes
|
|
56
|
+
* `styles.css` itself when the bundler already emitted one, so it is always written afresh.
|
|
57
|
+
*/
|
|
58
|
+
readonly fileNamesToRemove: readonly string[];
|
|
59
|
+
/**
|
|
60
|
+
* The contents of `styles.css`, or `undefined` when there is nothing to do: the bundle has no CSS at all,
|
|
61
|
+
* or its one CSS file already is `styles.css`.
|
|
62
|
+
*/
|
|
63
|
+
readonly stylesCss: string | undefined;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Where a plugin build writes its output and what it builds.
|
|
67
|
+
*/
|
|
68
|
+
export interface ObsidianPluginBuildContext {
|
|
69
|
+
/**
|
|
70
|
+
* The absolute path of the folder the build writes `main.js`, `styles.css` and `manifest.json` into.
|
|
71
|
+
*/
|
|
72
|
+
readonly distFolder: string;
|
|
73
|
+
/**
|
|
74
|
+
* The absolute path of the plugin's entry point, `src/main.ts`.
|
|
75
|
+
*/
|
|
76
|
+
readonly entryPoint: string;
|
|
77
|
+
/**
|
|
78
|
+
* Whether this is a production build.
|
|
79
|
+
*/
|
|
80
|
+
readonly isProductionBuild: boolean;
|
|
81
|
+
/**
|
|
82
|
+
* The absolute path of the emitted `main.js`.
|
|
83
|
+
*/
|
|
84
|
+
readonly mainJsPath: string;
|
|
85
|
+
/**
|
|
86
|
+
* The Obsidian configuration folder a development build is deployed into, or an empty string when none
|
|
87
|
+
* is configured.
|
|
88
|
+
*/
|
|
89
|
+
readonly obsidianConfigFolder: string;
|
|
90
|
+
/**
|
|
91
|
+
* The plugin's folder name inside `<vault>/.obsidian/plugins`, which is the package name.
|
|
92
|
+
*/
|
|
93
|
+
readonly pluginName: string;
|
|
94
|
+
/**
|
|
95
|
+
* How a development build is reloaded in Obsidian once it is deployed.
|
|
96
|
+
*/
|
|
97
|
+
readonly reload: ObsidianPluginReload;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Where a development build is deployed and how Obsidian picks it up. Every bundler adapter takes these.
|
|
101
|
+
*/
|
|
102
|
+
export interface ObsidianPluginDeploymentOptions {
|
|
103
|
+
/**
|
|
104
|
+
* A folder for Obsidian configuration. Defaults to the `OBSIDIAN_CONFIG_FOLDER` environment variable,
|
|
105
|
+
* read from the process or from a `.env` file in the project root.
|
|
106
|
+
*/
|
|
107
|
+
readonly obsidianConfigFolder?: string;
|
|
108
|
+
/**
|
|
109
|
+
* How a development build is reloaded in Obsidian once it is copied into the vault. Defaults to
|
|
110
|
+
* `'hot-reload-plugin'`.
|
|
111
|
+
*/
|
|
112
|
+
readonly reload?: ObsidianPluginReload;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* How a development build is reloaded in Obsidian once it is copied into the vault.
|
|
116
|
+
*
|
|
117
|
+
* - `'hot-reload-plugin'`: the build writes the `.hotreload` marker, and `npm run dev` opens the vault in an
|
|
118
|
+
* Obsidian instance it owns, with the HotReload plugin installed and enabled there.
|
|
119
|
+
* - `'obsidian-cli'`: every rebuild runs `obsidian plugin:reload` against the Obsidian you already have open,
|
|
120
|
+
* through the Obsidian CLI (Settings → General → Command line interface). No HotReload, no second instance.
|
|
121
|
+
* - `false`: the build is copied into the vault and nothing reloads it.
|
|
122
|
+
*/
|
|
123
|
+
export type ObsidianPluginReload = 'hot-reload-plugin' | 'obsidian-cli' | false;
|
|
124
|
+
/**
|
|
125
|
+
* Options for {@link resolveObsidianPluginBuildContext}.
|
|
126
|
+
*/
|
|
127
|
+
export interface ResolveObsidianPluginBuildContextParams extends ObsidianPluginDeploymentOptions {
|
|
128
|
+
/**
|
|
129
|
+
* The output folder. Defaults to `dist/build` for a production build and `dist/dev` for a development
|
|
130
|
+
* one.
|
|
131
|
+
*/
|
|
132
|
+
readonly distFolder?: string;
|
|
133
|
+
/**
|
|
134
|
+
* The build mode.
|
|
135
|
+
*/
|
|
136
|
+
readonly mode: BuildMode;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Removes the output folder of a build and creates it empty again.
|
|
140
|
+
*
|
|
141
|
+
* @param distFolder - The output folder.
|
|
142
|
+
* @returns A {@link Promise} that resolves once the folder exists and is empty.
|
|
143
|
+
*/
|
|
144
|
+
export declare function cleanObsidianPluginDistFolder(distFolder: string): Promise<void>;
|
|
145
|
+
/**
|
|
146
|
+
* Puts the files a plugin folder needs besides the bundle into the output folder: `manifest.json`, and for
|
|
147
|
+
* a development build reloaded by the HotReload plugin the empty `.hotreload` marker it watches for.
|
|
148
|
+
*
|
|
149
|
+
* @param context - The build context.
|
|
150
|
+
* @returns A {@link Promise} that resolves once the files are written.
|
|
151
|
+
*/
|
|
152
|
+
export declare function completeObsidianPluginDistFolder(context: ObsidianPluginBuildContext): Promise<void>;
|
|
153
|
+
/**
|
|
154
|
+
* Builds the banner placed at the top of `main.js`.
|
|
155
|
+
*
|
|
156
|
+
* @param bundlerName - The bundler's name, as the banner states it.
|
|
157
|
+
* @returns The banner, a block comment followed by a newline.
|
|
158
|
+
*/
|
|
159
|
+
export declare function getObsidianPluginBanner(bundlerName: string): string;
|
|
160
|
+
/**
|
|
161
|
+
* Resolves the default output folder of a build: `dist/build` for a production build, `dist/dev` for a
|
|
162
|
+
* development one.
|
|
163
|
+
*
|
|
164
|
+
* @param mode - The build mode.
|
|
165
|
+
* @returns The absolute path of the output folder.
|
|
166
|
+
*/
|
|
167
|
+
export declare function getObsidianPluginDistFolder(mode: BuildMode): string;
|
|
168
|
+
/**
|
|
169
|
+
* Resolves the plugin's entry point, `src/main.ts`.
|
|
170
|
+
*
|
|
171
|
+
* @returns The absolute path of the entry point.
|
|
172
|
+
*/
|
|
173
|
+
export declare function getObsidianPluginEntryPoint(): string;
|
|
174
|
+
/**
|
|
175
|
+
* Tells whether a file name is a CSS file.
|
|
176
|
+
*
|
|
177
|
+
* @param fileName - The file name.
|
|
178
|
+
* @returns `true` for a `.css` file.
|
|
179
|
+
*/
|
|
180
|
+
export declare function isCssFileName(fileName: string): boolean;
|
|
181
|
+
/**
|
|
182
|
+
* Tells whether a module id is one an Obsidian plugin bundle must leave external: one of
|
|
183
|
+
* {@link OBSIDIAN_PLUGIN_EXTERNALS}, a subpath of one (`@codemirror/view/dist/index.js`, `fs/promises`),
|
|
184
|
+
* or any `node:`-prefixed id.
|
|
185
|
+
*
|
|
186
|
+
* @param moduleId - The module id as written in the importing file.
|
|
187
|
+
* @returns `true` when the bundle must leave the module to `require()` at runtime.
|
|
188
|
+
*/
|
|
189
|
+
export declare function isObsidianPluginExternal(moduleId: string): boolean;
|
|
190
|
+
/**
|
|
191
|
+
* Decides how the CSS a bundler emitted becomes the one `styles.css` Obsidian loads.
|
|
192
|
+
*
|
|
193
|
+
* Obsidian reads a plugin's stylesheet from `styles.css` and nothing else, while a bundler names the CSS
|
|
194
|
+
* after the entry (`main.css`), after the package, or with a content hash. A lone CSS file is renamed; when
|
|
195
|
+
* there are several, they are concatenated in the order given.
|
|
196
|
+
*
|
|
197
|
+
* @param cssAssets - The CSS files the bundler emitted, in output order.
|
|
198
|
+
* @returns What to write as `styles.css` and which emitted files to drop.
|
|
199
|
+
*/
|
|
200
|
+
export declare function mergeCssAssets(cssAssets: readonly CssAsset[]): MergeCssAssetsResult;
|
|
201
|
+
/**
|
|
202
|
+
* Resolves a path against the project root.
|
|
203
|
+
*
|
|
204
|
+
* @param path - The path, relative to the project root or absolute.
|
|
205
|
+
* @returns The absolute path.
|
|
206
|
+
*/
|
|
207
|
+
export declare function resolveFromRoot(path: string): string;
|
|
208
|
+
/**
|
|
209
|
+
* Resolves where a plugin build writes its output, which entry point it builds and which vault a
|
|
210
|
+
* development build is deployed into.
|
|
211
|
+
*
|
|
212
|
+
* Loads the project's `.env` file first, so `OBSIDIAN_CONFIG_FOLDER` can live there.
|
|
213
|
+
*
|
|
214
|
+
* @param params - The {@link ResolveObsidianPluginBuildContextParams}.
|
|
215
|
+
* @returns A {@link Promise} that resolves to the {@link ObsidianPluginBuildContext}.
|
|
216
|
+
*/
|
|
217
|
+
export declare function resolveObsidianPluginBuildContext(params: ResolveObsidianPluginBuildContextParams): Promise<ObsidianPluginBuildContext>;
|