@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,47 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.mts" />
|
|
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';
|
|
14
|
+
import type { FeatureFileKind, ObsidianPluginStylesOptions } from './obsidian-plugin-features.mjs';
|
|
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,89 @@
|
|
|
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
|
+
|
|
33
|
+
import { invokeAsyncSafely } from "@mnaoumov/typescript-lib/async";
|
|
34
|
+
import { transform as esbuildTransform } from "esbuild";
|
|
35
|
+
import {
|
|
36
|
+
getWasmModuleCode,
|
|
37
|
+
transformCss,
|
|
38
|
+
transformSolid,
|
|
39
|
+
transformSvelte
|
|
40
|
+
} from "./obsidian-plugin-transforms.mjs";
|
|
41
|
+
const raw = true;
|
|
42
|
+
function obsidianPluginWebpackLoader(source) {
|
|
43
|
+
const callback = this.async();
|
|
44
|
+
invokeAsyncSafely(async () => {
|
|
45
|
+
let result;
|
|
46
|
+
try {
|
|
47
|
+
result = await transformModule(this, source);
|
|
48
|
+
} catch (error) {
|
|
49
|
+
callback(error);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
callback(null, result.code, result.map && JSON.stringify(result.map));
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
async function transformModule(context, source) {
|
|
56
|
+
const { isProductionBuild, kind, styles } = context.getOptions();
|
|
57
|
+
const filePath = context.resourcePath;
|
|
58
|
+
const code = source.toString("utf-8");
|
|
59
|
+
switch (kind) {
|
|
60
|
+
case "jsx": {
|
|
61
|
+
return await transformSolid({ code, filePath, isProductionBuild });
|
|
62
|
+
}
|
|
63
|
+
case "stylesheet": {
|
|
64
|
+
const result = await transformCss({ filePath, isCssModuleScoped: false, isProductionBuild, source: code, styles: styles ?? {} });
|
|
65
|
+
for (const dependency of result.dependencies) {
|
|
66
|
+
context.addDependency(dependency);
|
|
67
|
+
}
|
|
68
|
+
return { code: result.css };
|
|
69
|
+
}
|
|
70
|
+
case "svelte": {
|
|
71
|
+
return await transformSvelte({ code, filePath, isProductionBuild });
|
|
72
|
+
}
|
|
73
|
+
case "typescript": {
|
|
74
|
+
const result = await esbuildTransform(code, { loader: "ts", sourcefile: filePath, sourcemap: "external" });
|
|
75
|
+
return { code: result.code, map: JSON.parse(result.map) };
|
|
76
|
+
}
|
|
77
|
+
case "wasm": {
|
|
78
|
+
return { code: getWasmModuleCode(source) };
|
|
79
|
+
}
|
|
80
|
+
default: {
|
|
81
|
+
throw new Error(`Unknown loader kind: ${String(kind)}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export {
|
|
86
|
+
obsidianPluginWebpackLoader as default,
|
|
87
|
+
raw
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9vYnNpZGlhbi1wbHVnaW4td2VicGFjay1sb2FkZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSB3ZWJwYWNrIGxvYWRlciB0aGUgd2VicGFjayBhZGFwdGVyIGFkZHMgZm9yIHRoZSBidWlsZCBmZWF0dXJlczogaXQgcnVucyBvbmUgb2YgdGhlIHNoYXJlZCB0cmFuc2Zvcm1zIChTb2xpZCxcbiAqIFN2ZWx0ZSwgYSBzdHlsZXNoZWV0J3MgUG9zdENTUyBhbmQgVGFpbHdpbmQsIGEgV2ViQXNzZW1ibHkgbW9kdWxlJ3MgYnl0ZXMpIG9uIHRoZSBtb2R1bGUgaXQgaXMgZ2l2ZW4uIFRoZSBhZGFwdGVyXG4gKiBuYW1lcyBpdCBieSBwYXRoIGluIHRoZSBydWxlcyBpdCBhZGRzLCBzbyBhIHByb2plY3QgbmV2ZXIgbmFtZXMgaXQuXG4gKlxuICogRXJhc2FibGUgVHlwZVNjcmlwdCBvbmx5IChubyBlbnVtcywgbm8gcGFyYW1ldGVyIHByb3BlcnRpZXMpLCBzbyB3ZWJwYWNrIGNhbiBsb2FkIGl0IHN0cmFpZ2h0IGZyb20gc291cmNlIHdoZW4gdGhlXG4gKiB0b29sa2l0IHJ1bnMgZnJvbSBzb3VyY2UuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBMb2FkZXJDb250ZXh0IH0gZnJvbSAnd2VicGFjayc7XG5cbmltcG9ydCB7IGludm9rZUFzeW5jU2FmZWx5IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IHRyYW5zZm9ybSBhcyBlc2J1aWxkVHJhbnNmb3JtIH0gZnJvbSAnZXNidWlsZCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgRmVhdHVyZUZpbGVLaW5kLFxuICBPYnNpZGlhblBsdWdpblN0eWxlc09wdGlvbnNcbn0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBTb3VyY2VNYXBMaWtlIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3Jtcy50cyc7XG5cbmltcG9ydCB7XG4gIGdldFdhc21Nb2R1bGVDb2RlLFxuICB0cmFuc2Zvcm1Dc3MsXG4gIHRyYW5zZm9ybVNvbGlkLFxuICB0cmFuc2Zvcm1TdmVsdGVcbn0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3Jtcy50cyc7XG5cbi8qKlxuICogV2hpY2ggdHJhbnNmb3JtIHRoZSBsb2FkZXIgcnVuczogb25lIG9mIHRoZSBzaGFyZWQgdHJhbnNmb3Jtcywgb3IgYHR5cGVzY3JpcHRgLCB3aGljaCBzdHJpcHMgdGhlIHR5cGVzIG9mIGEgVnVlXG4gKiBjb21wb25lbnQncyBgPHNjcmlwdCBsYW5nPVwidHNcIj5gIGJsb2NrIGFmdGVyIGB1bnBsdWdpbi12dWVgIGV4dHJhY3RlZCBpdC5cbiAqL1xuZXhwb3J0IHR5cGUgT2JzaWRpYW5QbHVnaW5XZWJwYWNrTG9hZGVyS2luZCA9ICd0eXBlc2NyaXB0JyB8IEZlYXR1cmVGaWxlS2luZDtcblxuLyoqXG4gKiBUaGUgb3B0aW9ucyB0aGUgd2VicGFjayBhZGFwdGVyIGdpdmVzIHRoZSBsb2FkZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2JzaWRpYW5QbHVnaW5XZWJwYWNrTG9hZGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSBwcm9kdWN0aW9uIGJ1aWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNQcm9kdWN0aW9uQnVpbGQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoaWNoIHRyYW5zZm9ybSB0aGUgbG9hZGVyIHJ1bnMuXG4gICAqL1xuICByZWFkb25seSBraW5kOiBPYnNpZGlhblBsdWdpbldlYnBhY2tMb2FkZXJLaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgc3R5bGVzaGVldCBvcHRpb25zLCBmb3IgYSBgc3R5bGVzaGVldGAgbG9hZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgc3R5bGVzPzogT2JzaWRpYW5QbHVnaW5TdHlsZXNPcHRpb25zO1xufVxuXG5pbnRlcmZhY2UgTG9hZGVyUmVzdWx0IHtcbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuICByZWFkb25seSBtYXA/OiBTb3VyY2VNYXBMaWtlIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRlbGxzIHdlYnBhY2sgdG8gaGFuZCB0aGUgbG9hZGVyIHRoZSBtb2R1bGUncyBieXRlcywgd2hpY2ggYSBXZWJBc3NlbWJseSBtb2R1bGUgbmVlZHMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2NvbnNpc3RlbnQtYm9vbGVhbi1uYW1lIC0tIGByYXdgIGlzIHRoZSBuYW1lIHdlYnBhY2sgcmVhZHMuXG5leHBvcnQgY29uc3QgcmF3ID0gdHJ1ZTtcblxuLyoqXG4gKiBSdW5zIHRoZSBzaGFyZWQgdHJhbnNmb3JtIHRoZSBsb2FkZXIncyBvcHRpb25zIG5hbWUgb24gb25lIG1vZHVsZS5cbiAqXG4gKiBAcGFyYW0gdGhpcyAtIFRoZSB3ZWJwYWNrIGxvYWRlciBjb250ZXh0LlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBtb2R1bGUncyBieXRlcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC14L25vLWRlZmF1bHQtZXhwb3J0IC0tIFdlYnBhY2sgdGFrZXMgYSBsb2FkZXIgZnJvbSBpdHMgbW9kdWxlJ3MgZGVmYXVsdCBleHBvcnQuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvYnNpZGlhblBsdWdpbldlYnBhY2tMb2FkZXIodGhpczogTG9hZGVyQ29udGV4dDxPYnNpZGlhblBsdWdpbldlYnBhY2tMb2FkZXJPcHRpb25zPiwgc291cmNlOiBCdWZmZXIpOiB2b2lkIHtcbiAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLmFzeW5jKCk7XG4gIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICBsZXQgcmVzdWx0OiBMb2FkZXJSZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybU1vZHVsZSh0aGlzLCBzb3VyY2UpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYWxsYmFjayhlcnJvciBhcyBFcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdC5jb2RlLCByZXN1bHQubWFwICYmIEpTT04uc3RyaW5naWZ5KHJlc3VsdC5tYXApKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRyYW5zZm9ybU1vZHVsZShjb250ZXh0OiBMb2FkZXJDb250ZXh0PE9ic2lkaWFuUGx1Z2luV2VicGFja0xvYWRlck9wdGlvbnM+LCBzb3VyY2U6IEJ1ZmZlcik6IFByb21pc2U8TG9hZGVyUmVzdWx0PiB7XG4gIGNvbnN0IHsgaXNQcm9kdWN0aW9uQnVpbGQsIGtpbmQsIHN0eWxlcyB9ID0gY29udGV4dC5nZXRPcHRpb25zKCk7XG4gIGNvbnN0IGZpbGVQYXRoID0gY29udGV4dC5yZXNvdXJjZVBhdGg7XG4gIGNvbnN0IGNvZGUgPSBzb3VyY2UudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ2pzeCc6IHtcbiAgICAgIHJldHVybiBhd2FpdCB0cmFuc2Zvcm1Tb2xpZCh7IGNvZGUsIGZpbGVQYXRoLCBpc1Byb2R1Y3Rpb25CdWlsZCB9KTtcbiAgICB9XG4gICAgY2FzZSAnc3R5bGVzaGVldCc6IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybUNzcyh7IGZpbGVQYXRoLCBpc0Nzc01vZHVsZVNjb3BlZDogZmFsc2UsIGlzUHJvZHVjdGlvbkJ1aWxkLCBzb3VyY2U6IGNvZGUsIHN0eWxlczogc3R5bGVzID8/IHt9IH0pO1xuICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHJlc3VsdC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgY29udGV4dC5hZGREZXBlbmRlbmN5KGRlcGVuZGVuY3kpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY29kZTogcmVzdWx0LmNzcyB9O1xuICAgIH1cbiAgICBjYXNlICdzdmVsdGUnOiB7XG4gICAgICByZXR1cm4gYXdhaXQgdHJhbnNmb3JtU3ZlbHRlKHsgY29kZSwgZmlsZVBhdGgsIGlzUHJvZHVjdGlvbkJ1aWxkIH0pO1xuICAgIH1cbiAgICBjYXNlICd0eXBlc2NyaXB0Jzoge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXNidWlsZFRyYW5zZm9ybShjb2RlLCB7IGxvYWRlcjogJ3RzJywgc291cmNlZmlsZTogZmlsZVBhdGgsIHNvdXJjZW1hcDogJ2V4dGVybmFsJyB9KTtcbiAgICAgIHJldHVybiB7IGNvZGU6IHJlc3VsdC5jb2RlLCBtYXA6IEpTT04ucGFyc2UocmVzdWx0Lm1hcCkgYXMgU291cmNlTWFwTGlrZSB9O1xuICAgIH1cbiAgICBjYXNlICd3YXNtJzoge1xuICAgICAgcmV0dXJuIHsgY29kZTogZ2V0V2FzbU1vZHVsZUNvZGUoc291cmNlKSB9O1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbG9hZGVyIGtpbmQ6ICR7U3RyaW5nKGtpbmQpfWApO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWFBLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsYUFBYSx3QkFBd0I7QUFROUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQXFDQSxNQUFNLE1BQU07QUFTSixTQUFSLDRCQUFzRyxRQUFzQjtBQUNqSSxRQUFNLFdBQVcsS0FBSyxNQUFNO0FBQzVCLG9CQUFrQixZQUFZO0FBQzVCLFFBQUk7QUFDSixRQUFJO0FBQ0YsZUFBUyxNQUFNLGdCQUFnQixNQUFNLE1BQU07QUFBQSxJQUM3QyxTQUFTLE9BQU87QUFDZCxlQUFTLEtBQWM7QUFDdkI7QUFBQSxJQUNGO0FBQ0EsYUFBUyxNQUFNLE9BQU8sTUFBTSxPQUFPLE9BQU8sS0FBSyxVQUFVLE9BQU8sR0FBRyxDQUFDO0FBQUEsRUFDdEUsQ0FBQztBQUNIO0FBRUEsZUFBZSxnQkFBZ0IsU0FBNEQsUUFBdUM7QUFDaEksUUFBTSxFQUFFLG1CQUFtQixNQUFNLE9BQU8sSUFBSSxRQUFRLFdBQVc7QUFDL0QsUUFBTSxXQUFXLFFBQVE7QUFDekIsUUFBTSxPQUFPLE9BQU8sU0FBUyxPQUFPO0FBQ3BDLFVBQVEsTUFBTTtBQUFBLElBQ1osS0FBSyxPQUFPO0FBQ1YsYUFBTyxNQUFNLGVBQWUsRUFBRSxNQUFNLFVBQVUsa0JBQWtCLENBQUM7QUFBQSxJQUNuRTtBQUFBLElBQ0EsS0FBSyxjQUFjO0FBQ2pCLFlBQU0sU0FBUyxNQUFNLGFBQWEsRUFBRSxVQUFVLG1CQUFtQixPQUFPLG1CQUFtQixRQUFRLE1BQU0sUUFBUSxVQUFVLENBQUMsRUFBRSxDQUFDO0FBQy9ILGlCQUFXLGNBQWMsT0FBTyxjQUFjO0FBQzVDLGdCQUFRLGNBQWMsVUFBVTtBQUFBLE1BQ2xDO0FBQ0EsYUFBTyxFQUFFLE1BQU0sT0FBTyxJQUFJO0FBQUEsSUFDNUI7QUFBQSxJQUNBLEtBQUssVUFBVTtBQUNiLGFBQU8sTUFBTSxnQkFBZ0IsRUFBRSxNQUFNLFVBQVUsa0JBQWtCLENBQUM7QUFBQSxJQUNwRTtBQUFBLElBQ0EsS0FBSyxjQUFjO0FBQ2pCLFlBQU0sU0FBUyxNQUFNLGlCQUFpQixNQUFNLEVBQUUsUUFBUSxNQUFNLFlBQVksVUFBVSxXQUFXLFdBQVcsQ0FBQztBQUN6RyxhQUFPLEVBQUUsTUFBTSxPQUFPLE1BQU0sS0FBSyxLQUFLLE1BQU0sT0FBTyxHQUFHLEVBQW1CO0FBQUEsSUFDM0U7QUFBQSxJQUNBLEtBQUssUUFBUTtBQUNYLGFBQU8sRUFBRSxNQUFNLGtCQUFrQixNQUFNLEVBQUU7QUFBQSxJQUMzQztBQUFBLElBQ0EsU0FBUztBQUNQLFlBQU0sSUFBSSxNQUFNLHdCQUF3QixPQUFPLElBQUksQ0FBQyxFQUFFO0FBQUEsSUFDeEQ7QUFBQSxFQUNGO0FBQ0Y7IiwibmFtZXMiOltdfQ==
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.mts" />
|
|
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.mjs';
|
|
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>;
|
|
@@ -0,0 +1,228 @@
|
|
|
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
|
+
|
|
33
|
+
import {
|
|
34
|
+
invokeAsyncSafely,
|
|
35
|
+
sleep
|
|
36
|
+
} from "@mnaoumov/typescript-lib/async";
|
|
37
|
+
import { getLibDebugger } from "@mnaoumov/typescript-lib/debug";
|
|
38
|
+
import {
|
|
39
|
+
basename,
|
|
40
|
+
dirname,
|
|
41
|
+
join,
|
|
42
|
+
toPosixPath
|
|
43
|
+
} from "@mnaoumov/typescript-lib/path";
|
|
44
|
+
import {
|
|
45
|
+
cp,
|
|
46
|
+
mkdir,
|
|
47
|
+
readFile
|
|
48
|
+
} from "node:fs/promises";
|
|
49
|
+
import process from "node:process";
|
|
50
|
+
import {
|
|
51
|
+
createTransportFromOptions,
|
|
52
|
+
DesktopCdpTransport,
|
|
53
|
+
evalInObsidian
|
|
54
|
+
} from "obsidian-integration-testing";
|
|
55
|
+
import { reloadPluginWithObsidianCli } from "./obsidian-cli-reload.mjs";
|
|
56
|
+
const moduleState = {
|
|
57
|
+
devInstanceTransportPromise: void 0,
|
|
58
|
+
isDevInstanceCleanupRegistered: false,
|
|
59
|
+
isDevInstanceDisposed: false
|
|
60
|
+
};
|
|
61
|
+
const DEV_INSTANCE_PROBE_INTERVAL_IN_MILLISECONDS = 2e3;
|
|
62
|
+
const DEV_INSTANCE_CLOSED_PROBE_COUNT = 3;
|
|
63
|
+
async function deployToObsidianPluginsFolder(params) {
|
|
64
|
+
const {
|
|
65
|
+
distFolder,
|
|
66
|
+
isProductionBuild,
|
|
67
|
+
pluginName
|
|
68
|
+
} = params;
|
|
69
|
+
if (isProductionBuild) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (!params.obsidianConfigFolder) {
|
|
73
|
+
getLibDebugger("deployToObsidianPluginsFolder")(
|
|
74
|
+
"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."
|
|
75
|
+
);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const obsidianConfigFolder = toPosixPath(params.obsidianConfigFolder);
|
|
79
|
+
const pluginFolder = join(obsidianConfigFolder, "plugins", pluginName);
|
|
80
|
+
await mkdir(pluginFolder, { recursive: true });
|
|
81
|
+
await cp(distFolder, pluginFolder, { recursive: true });
|
|
82
|
+
switch (params.reload ?? "hot-reload-plugin") {
|
|
83
|
+
case false: {
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
case "hot-reload-plugin": {
|
|
87
|
+
await installAndEnableHotReload({
|
|
88
|
+
obsidianConfigFolder,
|
|
89
|
+
pluginName
|
|
90
|
+
});
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
case "obsidian-cli": {
|
|
94
|
+
await reloadPluginWithObsidianCli({
|
|
95
|
+
pluginId: await readPluginId(pluginFolder, pluginName),
|
|
96
|
+
vaultName: basename(dirname(obsidianConfigFolder))
|
|
97
|
+
});
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
default: {
|
|
101
|
+
throw new Error(`Unknown reload option: ${String(params.reload)}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async function getOrLaunchDevInstance(vaultPath) {
|
|
106
|
+
moduleState.devInstanceTransportPromise ??= launchDevInstance(vaultPath);
|
|
107
|
+
try {
|
|
108
|
+
return await moduleState.devInstanceTransportPromise;
|
|
109
|
+
} catch (error) {
|
|
110
|
+
moduleState.devInstanceTransportPromise = void 0;
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function installAndEnableHotReload(params) {
|
|
115
|
+
const {
|
|
116
|
+
obsidianConfigFolder,
|
|
117
|
+
pluginName
|
|
118
|
+
} = params;
|
|
119
|
+
const vaultPath = dirname(obsidianConfigFolder);
|
|
120
|
+
const transport = await getOrLaunchDevInstance(vaultPath);
|
|
121
|
+
await evalInObsidian({
|
|
122
|
+
// eslint-disable-next-line no-shadow -- No actual shadowing as the function is executed externally.
|
|
123
|
+
async callback({ app, obsidianModule, pluginName: pluginName2 }) {
|
|
124
|
+
const HOT_RELOAD_PLUGIN_ID = "hot-reload";
|
|
125
|
+
const COMMUNITY_PLUGINS_REGISTRY_URL = "https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-plugins.json";
|
|
126
|
+
const { requestUrl } = obsidianModule;
|
|
127
|
+
await app.plugins.setEnable(true);
|
|
128
|
+
if (!Object.hasOwn(app.plugins.manifests, HOT_RELOAD_PLUGIN_ID)) {
|
|
129
|
+
const registryResponse = await requestUrl(COMMUNITY_PLUGINS_REGISTRY_URL);
|
|
130
|
+
const registryEntries = registryResponse.json;
|
|
131
|
+
const entry = registryEntries.find((candidate) => candidate.id === HOT_RELOAD_PLUGIN_ID);
|
|
132
|
+
if (!entry) {
|
|
133
|
+
throw new Error(`Plugin '${HOT_RELOAD_PLUGIN_ID}' was not found in the Obsidian community plugins registry.`);
|
|
134
|
+
}
|
|
135
|
+
const latestReleaseResponse = await requestUrl(`https://api.github.com/repos/${entry.repo}/releases/latest`);
|
|
136
|
+
const latestRelease = latestReleaseResponse.json;
|
|
137
|
+
const version = latestRelease.tag_name;
|
|
138
|
+
const manifestResponse = await requestUrl(`https://github.com/${entry.repo}/releases/download/${version}/manifest.json`);
|
|
139
|
+
const manifest = manifestResponse.json;
|
|
140
|
+
await app.plugins.installPlugin(entry.repo, version, manifest);
|
|
141
|
+
}
|
|
142
|
+
if (!Object.hasOwn(app.plugins.plugins, HOT_RELOAD_PLUGIN_ID)) {
|
|
143
|
+
await app.plugins.enablePluginAndSave(HOT_RELOAD_PLUGIN_ID);
|
|
144
|
+
}
|
|
145
|
+
await app.plugins.enablePluginAndSave(pluginName2);
|
|
146
|
+
},
|
|
147
|
+
input: { pluginName },
|
|
148
|
+
shouldSkipPreflightChecks: true,
|
|
149
|
+
transport,
|
|
150
|
+
vaultPath
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
async function isDevInstanceRunning(cdpUrl) {
|
|
154
|
+
try {
|
|
155
|
+
const response = await fetch(`${cdpUrl}/json`);
|
|
156
|
+
const targets = await response.json();
|
|
157
|
+
return targets.some((target) => target.type === "page");
|
|
158
|
+
} catch {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async function launchDevInstance(vaultPath) {
|
|
163
|
+
const transport = await createTransportFromOptions();
|
|
164
|
+
try {
|
|
165
|
+
await transport.registerVault(vaultPath);
|
|
166
|
+
} catch (error) {
|
|
167
|
+
transport.disposeSync?.();
|
|
168
|
+
throw error;
|
|
169
|
+
}
|
|
170
|
+
registerDevInstanceCleanup(transport);
|
|
171
|
+
watchDevInstanceAndStopOnClose(transport);
|
|
172
|
+
return transport;
|
|
173
|
+
}
|
|
174
|
+
async function readPluginId(pluginFolder, fallbackId) {
|
|
175
|
+
try {
|
|
176
|
+
const manifest = JSON.parse(await readFile(join(pluginFolder, "manifest.json"), "utf-8"));
|
|
177
|
+
return manifest.id ?? fallbackId;
|
|
178
|
+
} catch {
|
|
179
|
+
return fallbackId;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
function registerDevInstanceCleanup(transport) {
|
|
183
|
+
if (moduleState.isDevInstanceCleanupRegistered) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
moduleState.isDevInstanceCleanupRegistered = true;
|
|
187
|
+
process.on("exit", disposeDevInstance);
|
|
188
|
+
for (const signal of ["SIGHUP", "SIGINT", "SIGTERM"]) {
|
|
189
|
+
process.once(signal, () => {
|
|
190
|
+
disposeDevInstance();
|
|
191
|
+
process.exit();
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
function disposeDevInstance() {
|
|
195
|
+
if (moduleState.isDevInstanceDisposed) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
moduleState.isDevInstanceDisposed = true;
|
|
199
|
+
transport.disposeSync?.();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
function watchDevInstanceAndStopOnClose(transport) {
|
|
203
|
+
if (!(transport instanceof DesktopCdpTransport)) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const endpoint = transport.getOwnedInstanceEndpoint();
|
|
207
|
+
if (!endpoint) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
const cdpUrl = `http://${endpoint.host}:${String(endpoint.port)}`;
|
|
211
|
+
invokeAsyncSafely(stopWhenDevInstanceCloses);
|
|
212
|
+
async function stopWhenDevInstanceCloses() {
|
|
213
|
+
let consecutiveFailedProbeCount = 0;
|
|
214
|
+
while (consecutiveFailedProbeCount < DEV_INSTANCE_CLOSED_PROBE_COUNT) {
|
|
215
|
+
await sleep({ milliseconds: DEV_INSTANCE_PROBE_INTERVAL_IN_MILLISECONDS });
|
|
216
|
+
if (moduleState.isDevInstanceDisposed) {
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
consecutiveFailedProbeCount = await isDevInstanceRunning(cdpUrl) ? 0 : consecutiveFailedProbeCount + 1;
|
|
220
|
+
}
|
|
221
|
+
console.warn("The Obsidian instance owned by `npm run dev` was closed. Stopping the development build.");
|
|
222
|
+
process.exit();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
export {
|
|
226
|
+
deployToObsidianPluginsFolder
|
|
227
|
+
};
|
|
228
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9vYnNpZGlhbi1wbHVnaW5zLWZvbGRlci1kZXBsb3ltZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEZXBsb3lzIGEgZGV2ZWxvcG1lbnQgYnVpbGQgaW50byB0aGUgdmF1bHQ6IGNvcGllcyB0aGUgb3V0cHV0IGZvbGRlciBpbnRvIGA8dmF1bHQ+Ly5vYnNpZGlhbi9wbHVnaW5zYCxcbiAqIHRoZW4gcmVsb2FkcyBpdCB0aGUgd2F5IHRoZSBidWlsZCdzIGByZWxvYWRgIG9wdGlvbiBzYXlzLiBCeSBkZWZhdWx0IHRoYXQgaW5zdGFsbHMgYW5kIGVuYWJsZXMgSG90UmVsb2FkXG4gKiBhbmQgdGhlIHBsdWdpbiBpbiBhbiBPYnNpZGlhbiBpbnN0YW5jZSBgbnBtIHJ1biBkZXZgIG93bnM7IGAnb2JzaWRpYW4tY2xpJ2AgcmVsb2FkcyBpdCBpbiB0aGUgT2JzaWRpYW4gdGhlXG4gKiBkZXZlbG9wZXIgaGFzIG9wZW4gaW5zdGVhZCAoYG9ic2lkaWFuLWNsaS1yZWxvYWQudHNgKS4gRXZlcnkgYnVuZGxlciBhZGFwdGVyIGNhbGxzIGl0IG9uY2UgZWFjaCByZWJ1aWxkIGhhc1xuICogd3JpdHRlbiBpdHMgb3V0cHV0LCBzbyB0aGUgbGF0ZXN0IGJ1aWxkIGlzIGFsd2F5cyB0aGUgb25lIHJ1bm5pbmcuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIENvcGllcyBidWlsZCBvdXRwdXQgaW50byBhIHZhdWx0IGFuZCBkcml2ZXMgYSBsaXZlIE9ic2lkaWFuIG92ZXIgQ0RQLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnO1xuXG5pbXBvcnQge1xuICBpbnZva2VBc3luY1NhZmVseSxcbiAgc2xlZXBcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2RlYnVnJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBqb2luLFxuICB0b1Bvc2l4UGF0aFxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zLFxuICBEZXNrdG9wQ2RwVHJhbnNwb3J0LFxuICBldmFsSW5PYnNpZGlhblxufSBmcm9tICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblBsdWdpblJlbG9hZCB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWJ1aWxkLnRzJztcblxuaW1wb3J0IHsgcmVsb2FkUGx1Z2luV2l0aE9ic2lkaWFuQ2xpIH0gZnJvbSAnLi9vYnNpZGlhbi1jbGktcmVsb2FkLnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBmb2xkZXIgd2hlcmUgdGhlIGJ1aWx0IGZpbGVzIGFyZSBsb2NhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzdEZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBidWlsZCBpcyBhIHByb2R1Y3Rpb24gYnVpbGQuXG4gICAqL1xuICByZWFkb25seSBpc1Byb2R1Y3Rpb25CdWlsZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGZvbGRlciBvZiB0aGUgT2JzaWRpYW4gY29uZmlndXJhdGlvbi4gSWYgbm90IHByb3ZpZGVkLCB0aGUgcGx1Z2luIHdpbGwgbm90IGNvcHkgZmlsZXMuXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhbkNvbmZpZ0ZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgT2JzaWRpYW4gcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlIGRlcGxveWVkIGJ1aWxkIGlzIHJlbG9hZGVkIGluIE9ic2lkaWFuLiBEZWZhdWx0cyB0byBgJ2hvdC1yZWxvYWQtcGx1Z2luJ2AuXG4gICAqL1xuICByZWFkb25seSByZWxvYWQ/OiBPYnNpZGlhblBsdWdpblJlbG9hZDtcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGEgQ0RQIHRhcmdldCBkZXNjcmlwdG9yIHJlYWQgZnJvbSB0aGUgb3duZWQgaW5zdGFuY2UncyBgL2pzb25gIGVuZHBvaW50LlxuICovXG5pbnRlcmZhY2UgQ2RwVGFyZ2V0IHtcbiAgLyoqXG4gICAqIFRoZSBraW5kIG9mIHRoZSB0YXJnZXQsIGUuZy4gYHBhZ2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIGVudHJ5IGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkgKGBjb21tdW5pdHktcGx1Z2lucy5qc29uYCkuXG4gKi9cbmludGVyZmFjZSBDb21tdW5pdHlQbHVnaW5SZWdpc3RyeUVudHJ5IHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaWQuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYG93bmVyL25hbWVgIEdpdEh1YiByZXBvc2l0b3J5IHRoZSBwbHVnaW4gaXMgcHVibGlzaGVkIGZyb20uXG4gICAqL1xuICByZWFkb25seSByZXBvOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBhIEdpdEh1YiByZWxlYXNlIHdlIHJlYWQuXG4gKi9cbmludGVyZmFjZSBHaXRIdWJSZWxlYXNlIHtcbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIHRhZywgYSBiYXJlIHZlcnNpb24gc3VjaCBhcyBgMS4yLjNgLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFnX25hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaW5zdGFsbEFuZEVuYWJsZUhvdFJlbG9hZH0uXG4gKi9cbmludGVyZmFjZSBJbnN0YWxsQW5kRW5hYmxlSG90UmVsb2FkUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBmb2xkZXIgb2YgdGhlIE9ic2lkaWFuIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhbkNvbmZpZ0ZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYnVpbHQgT2JzaWRpYW4gcGx1Z2luIHRvIGVuYWJsZSBvbmNlIEhvdFJlbG9hZCBpcyBpbiBwbGFjZS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbn1cblxuLy8gVGhlIGBucG0gcnVuIGRldmAtb3duZWQgT2JzaWRpYW4gaW5zdGFuY2U6IGxhdW5jaGVkIG9uIHRoZSBmaXJzdCByZWJ1aWxkIGFuZCByZXVzZWQgYWNyb3NzIHJlYnVpbGRzLlxuLy8gSXRzIGxpZmV0aW1lIGlzIHRpZWQgdG8gdGhlIGBucG0gcnVuIGRldmAgcHJvY2VzcyBpbiBCT1RIIGRpcmVjdGlvbnMuXG4vLyBUaGUgaW5zdGFuY2UgaXMgY2xvc2VkIHdoZW4gdGhlIHByb2Nlc3MgdGVybWluYXRlcyAoc2VlIGByZWdpc3RlckRldkluc3RhbmNlQ2xlYW51cGApLlxuLy8gVGhlIHByb2Nlc3Mgc3RvcHMgd2hlbiB0aGUgaW5zdGFuY2UgaXMgY2xvc2VkIChzZWUgYHdhdGNoRGV2SW5zdGFuY2VBbmRTdG9wT25DbG9zZWApLlxuLyoqXG5Nb2R1bGUtbGV2ZWwgbXV0YWJsZSBzdGF0ZSwgaGVsZCBpbiBvbmUgb2JqZWN0IHNvIGVhY2ggbXV0YXRpb24gbmFtZXMgaXQgZXhwbGljaXRseS5cbiAqL1xuaW50ZXJmYWNlIE1vZHVsZVN0YXRlIHtcbiAgZGV2SW5zdGFuY2VUcmFuc3BvcnRQcm9taXNlOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB8IHVuZGVmaW5lZDtcbiAgaXNEZXZJbnN0YW5jZUNsZWFudXBSZWdpc3RlcmVkOiBib29sZWFuO1xuICBpc0Rldkluc3RhbmNlRGlzcG9zZWQ6IGJvb2xlYW47XG59XG5cbmNvbnN0IG1vZHVsZVN0YXRlOiBNb2R1bGVTdGF0ZSA9IHtcbiAgZGV2SW5zdGFuY2VUcmFuc3BvcnRQcm9taXNlOiB1bmRlZmluZWQsXG4gIGlzRGV2SW5zdGFuY2VDbGVhbnVwUmVnaXN0ZXJlZDogZmFsc2UsXG4gIGlzRGV2SW5zdGFuY2VEaXNwb3NlZDogZmFsc2Vcbn07XG5cbi8qKlxuICogSG93IG9mdGVuIHRoZSBvd25lZCBPYnNpZGlhbiBpbnN0YW5jZSBpcyBwcm9iZWQgdG8gZGV0ZWN0IHRoYXQgaXQgd2FzIGNsb3NlZC5cbiAqL1xuY29uc3QgREVWX0lOU1RBTkNFX1BST0JFX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5cbi8qKlxuICogSG93IG1hbnkgY29uc2VjdXRpdmUgZmFpbGVkIHByb2JlcyBhcmUgdG9sZXJhdGVkIGJlZm9yZSB0aGUgb3duZWQgaW5zdGFuY2UgaXMgY29uc2lkZXJlZCBjbG9zZWQuIEFcbiAqIHNpbmdsZSBmYWlsdXJlIGNhbiBiZSBhIHRyYW5zaWVudCBoaWNjdXAgKGEgYnVzeSByZW5kZXJlciwgYSBtb21lbnRhcmlseSByZWZ1c2VkIGNvbm5lY3Rpb24pLCBzbyB0aGVcbiAqIGRldmVsb3BtZW50IGJ1aWxkIGlzIG9ubHkgc3RvcHBlZCBvbmNlIHRoZSBlbmRwb2ludCBzdGF5cyB1bnJlYWNoYWJsZS5cbiAqL1xuY29uc3QgREVWX0lOU1RBTkNFX0NMT1NFRF9QUk9CRV9DT1VOVCA9IDM7XG4vKipcbiAqIENvcGllcyBhIGRldmVsb3BtZW50IGJ1aWxkIGludG8gdGhlIHZhdWx0J3MgcGx1Z2lucyBmb2xkZXIgYW5kIHJlbG9hZHMgaXQgdGhlcmUsIGFzIHRoZSBgcmVsb2FkYCBvcHRpb25cbiAqIHNheXMuIERvZXMgbm90aGluZyBmb3IgYSBwcm9kdWN0aW9uIGJ1aWxkLCBvciB3aGVuIG5vIE9ic2lkaWFuIGNvbmZpZyBmb2xkZXIgaXMgY29uZmlndXJlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBEZXBsb3lUb09ic2lkaWFuUGx1Z2luc0ZvbGRlclBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHBsdWdpbiBpcyBkZXBsb3llZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlcGxveVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyKHBhcmFtczogRGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXJQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGRpc3RGb2xkZXIsXG4gICAgaXNQcm9kdWN0aW9uQnVpbGQsXG4gICAgcGx1Z2luTmFtZVxuICB9ID0gcGFyYW1zO1xuXG4gIGlmIChpc1Byb2R1Y3Rpb25CdWlsZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghcGFyYW1zLm9ic2lkaWFuQ29uZmlnRm9sZGVyKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ2RlcGxveVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyJykoXG4gICAgICAnTm8gT2JzaWRpYW4gY29uZmlnIGZvbGRlciBjb25maWd1cmVkLiBgT0JTSURJQU5fQ09ORklHX0ZPTERFUmAgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldCBpbiBzeXN0ZW0gb3IgaW4gYC5lbnZgIGZpbGUuIFRoZSBjb21waWxlZCBwbHVnaW4gd2lsbCBub3QgYmUgY29waWVkIGludG8gT2JzaWRpYW4gcGx1Z2lucyBmb2xkZXIuJ1xuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb2JzaWRpYW5Db25maWdGb2xkZXIgPSB0b1Bvc2l4UGF0aChwYXJhbXMub2JzaWRpYW5Db25maWdGb2xkZXIpO1xuXG4gIGNvbnN0IHBsdWdpbkZvbGRlciA9IGpvaW4ob2JzaWRpYW5Db25maWdGb2xkZXIsICdwbHVnaW5zJywgcGx1Z2luTmFtZSk7XG4gIGF3YWl0IG1rZGlyKHBsdWdpbkZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGNwKGRpc3RGb2xkZXIsIHBsdWdpbkZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgc3dpdGNoIChwYXJhbXMucmVsb2FkID8/ICdob3QtcmVsb2FkLXBsdWdpbicpIHtcbiAgICBjYXNlIGZhbHNlOiB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnaG90LXJlbG9hZC1wbHVnaW4nOiB7XG4gICAgICBhd2FpdCBpbnN0YWxsQW5kRW5hYmxlSG90UmVsb2FkKHtcbiAgICAgICAgb2JzaWRpYW5Db25maWdGb2xkZXIsXG4gICAgICAgIHBsdWdpbk5hbWVcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ29ic2lkaWFuLWNsaSc6IHtcbiAgICAgIGF3YWl0IHJlbG9hZFBsdWdpbldpdGhPYnNpZGlhbkNsaSh7XG4gICAgICAgIHBsdWdpbklkOiBhd2FpdCByZWFkUGx1Z2luSWQocGx1Z2luRm9sZGVyLCBwbHVnaW5OYW1lKSxcbiAgICAgICAgdmF1bHROYW1lOiBiYXNlbmFtZShkaXJuYW1lKG9ic2lkaWFuQ29uZmlnRm9sZGVyKSlcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByZWxvYWQgb3B0aW9uOiAke1N0cmluZyhwYXJhbXMucmVsb2FkKX1gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBgbnBtIHJ1biBkZXZgLW93bmVkIE9ic2lkaWFuIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gdmF1bHQsIGxhdW5jaGluZyBpdCBvbiBmaXJzdCB1c2UgYW5kXG4gKiByZXVzaW5nIGl0IG9uIHN1YnNlcXVlbnQgcmVidWlsZHMuXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIgdG8gb3Blbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgb3duZWQge0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0fS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0T3JMYXVuY2hEZXZJbnN0YW5jZSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgbW9kdWxlU3RhdGUuZGV2SW5zdGFuY2VUcmFuc3BvcnRQcm9taXNlID8/PSBsYXVuY2hEZXZJbnN0YW5jZSh2YXVsdFBhdGgpO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBtb2R1bGVTdGF0ZS5kZXZJbnN0YW5jZVRyYW5zcG9ydFByb21pc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gQ2xlYXIgdGhlIGNhY2hlIHNvIGEgbGF0ZXIgcmVidWlsZCByZXRyaWVzIHRoZSBsYXVuY2guXG4gICAgbW9kdWxlU3RhdGUuZGV2SW5zdGFuY2VUcmFuc3BvcnRQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogSW5zdGFsbHMgdGhlIEhvdFJlbG9hZCBwbHVnaW4gZnJvbSB0aGUgb2ZmaWNpYWwgY29tbXVuaXR5IHN0b3JlIChpZiBub3QgYWxyZWFkeSBpbnN0YWxsZWQpLCBsb2FkcyBpdFxuICogKGlmIG5vdCBhbHJlYWR5IHJ1bm5pbmcpLCBhbmQgZW5hYmxlcyB0aGUgZnJlc2hseS1idWlsdCBwbHVnaW4g4oCUIGFsbCB0aHJvdWdoIHRoZSBgbnBtIHJ1biBkZXZgLW93bmVkXG4gKiBPYnNpZGlhbiBpbnN0YW5jZSwgc28gSG90UmVsb2FkIHRoZW4gYXV0by1yZWZyZXNoZXMgdGhlIGRlcGxveWVkIHBsdWdpbiBvbiBldmVyeSByZWJ1aWxkLlxuICpcbiAqIFRoZSBpbnN0YWxsIGdvZXMgdGhyb3VnaCBPYnNpZGlhbidzIG93biBgaW5zdGFsbFBsdWdpbmAgKHRoZSBjb21tdW5pdHktc3RvcmUgbWVjaGFuaXNtKSwgYW5kIGV2ZXJ5IHN0ZXBcbiAqIHJ1bnMgYWdhaW5zdCB0aGUgb3duZWQgaW5zdGFuY2Ugb3ZlciBDRFA7IGFueSBmYWlsdXJlIHN1cmZhY2VzICh0aGUgZGV2IGJ1aWxkIHJlcG9ydHMgaXQpIHJhdGhlciB0aGFuXG4gKiBiZWluZyBzaWxlbnRseSBzd2FsbG93ZWQuXG4gKlxuICogVGhlIGZpcnN0IHN0ZXAgaXMgbGVhdmluZyByZXN0cmljdGVkIG1vZGUgZm9yIHJlYWwsIHdoaWNoIHRoZSBvd25lZCBpbnN0YW5jZSBoYXMgb25seSBmYWtlZCBzbyBmYXIg4oCUXG4gKiB3aXRob3V0IGl0IFwiZW5hYmxlZFwiIGFuZCBcImxvYWRlZFwiIGNvbWUgYXBhcnQgYW5kIG5vbmUgb2YgdGhlIHZhdWx0J3MgcGx1Z2lucywgSG90UmVsb2FkIGluY2x1ZGVkLCBhcmVcbiAqIHJ1bm5pbmcuIFNlZSB0aGUgY29tbWVudCBvbiB0aGUgYHNldEVuYWJsZWAgY2FsbC5cbiAqXG4gKiBUaGUgaW5zdGFsbC1pZi1taXNzaW5nIC8gZW5hYmxlLWlmLWRpc2FibGVkIGxvZ2ljIGJlbG93IGludGVudGlvbmFsbHkgbWlycm9ycyB0aGUgcHVibGljXG4gKiBgaW5zdGFsbENvbW11bml0eVBsdWdpbmAgLyBgZW5hYmxlQ29tbXVuaXR5UGx1Z2luYCBoZWxwZXJzIGluIGBzcmMvb2JzaWRpYW4vY29tbXVuaXR5LXBsdWdpbnMudHNgLiBJdFxuICogY2Fubm90IGltcG9ydCBhbmQgY2FsbCB0aGVtOiB0aGUgYGZuYCBpcyBzZXJpYWxpemVkIChgdG9TdHJpbmcoKWApIGFuZCBleGVjdXRlZCBpbiB0aGUgcmVuZGVyZXIsIGFuZFxuICogdGhpcyBidWlsZC1vd25lZCBPYnNpZGlhbiBpbnN0YW5jZSBpcyBiYXJlIOKAlCBpdCBoYXMgbm8gZGV2LXV0aWxzIGBsaWJgIHByb3ZpZGVyIHdpcmVkICh0aGF0IHJlc29sdmVyIGlzXG4gKiByZWdpc3RlcmVkIG9ubHkgaW4gdGhlIGludGVncmF0aW9uLXRlc3Qgc2V0dXAsIHdob3NlIGZpeHR1cmUgcHVibGlzaGVzIHRoZSBtZXJnZWQgc3VyZmFjZSBvbiBgd2luZG93YCksXG4gKiBzbyB0aGUgY2xvc3VyZSBoYXMgbm8gYWNjZXNzIHRvIHRoZSBsaWJyYXJ5IHN1cmZhY2UgYW5kIG11c3QgaW5saW5lIHRoZSBlcXVpdmFsZW50IHN0ZXBzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEluc3RhbGxBbmRFbmFibGVIb3RSZWxvYWRQYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIEhvdFJlbG9hZCBhbmQgdGhlIGJ1aWx0IHBsdWdpbiBhcmUgaW5zdGFsbGVkIGFuZCBlbmFibGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBpbnN0YWxsQW5kRW5hYmxlSG90UmVsb2FkKHBhcmFtczogSW5zdGFsbEFuZEVuYWJsZUhvdFJlbG9hZFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgb2JzaWRpYW5Db25maWdGb2xkZXIsXG4gICAgcGx1Z2luTmFtZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCB2YXVsdFBhdGggPSBkaXJuYW1lKG9ic2lkaWFuQ29uZmlnRm9sZGVyKTtcbiAgY29uc3QgdHJhbnNwb3J0ID0gYXdhaXQgZ2V0T3JMYXVuY2hEZXZJbnN0YW5jZSh2YXVsdFBhdGgpO1xuICBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSBObyBhY3R1YWwgc2hhZG93aW5nIGFzIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZCBleHRlcm5hbGx5LlxuICAgIGFzeW5jIGNhbGxiYWNrKHsgYXBwLCBvYnNpZGlhbk1vZHVsZSwgcGx1Z2luTmFtZSB9KSB7XG4gICAgICBjb25zdCBIT1RfUkVMT0FEX1BMVUdJTl9JRCA9ICdob3QtcmVsb2FkJztcbiAgICAgIGNvbnN0IENPTU1VTklUWV9QTFVHSU5TX1JFR0lTVFJZX1VSTCA9ICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlcy9IRUFEL2NvbW11bml0eS1wbHVnaW5zLmpzb24nO1xuICAgICAgY29uc3QgeyByZXF1ZXN0VXJsIH0gPSBvYnNpZGlhbk1vZHVsZTtcblxuICAgICAgLypcbiAgICAgICAqIEdlbnVpbmVseSBsZWF2ZSByZXN0cmljdGVkIG1vZGUgYmVmb3JlIHRvdWNoaW5nIGFueXRoaW5nIGVsc2UuIFRoZSBvd25lZCBpbnN0YW5jZSBib290cyB3aXRoIGFcbiAgICAgICAqIGZyZXNoIHVzZXItZGF0YSBkaXIsIHNvIE9ic2lkaWFuIHN0YXJ0cyByZXN0cmljdGVkIGFuZCBgUGx1Z2lucy5pbml0aWFsaXplKClgIHJldHVybnMgYmVmb3JlXG4gICAgICAgKiBsb2FkaW5nIGEgc2luZ2xlIHBsdWdpbi4gVGhlIGhhcm5lc3MgdGhlbiBjbG9zZXMgdGhlIHRydXN0IG1vZGFsIGFuZCB3cml0ZXMgdGhlXG4gICAgICAgKiBgZW5hYmxlLXBsdWdpbi08YXBwSWQ+YCBsb2NhbFN0b3JhZ2UgZmxhZyBkaXJlY3RseSDigJQgZGVsaWJlcmF0ZWx5LCB0byBhdm9pZCBhIHN5bmNocm9ub3VzIGxvYWQg4oCUXG4gICAgICAgKiB3aGljaCBsZWF2ZXMgYGlzRW5hYmxlZCgpYCByZXBvcnRpbmcgYHRydWVgIG92ZXIgYSB2YXVsdCB3aGVyZSBub3RoaW5nIGlzIGFjdHVhbGx5IHJ1bm5pbmcuIEV2ZXJ5XG4gICAgICAgKiBgZW5hYmxlZFBsdWdpbnNgIHJlYWRpbmcgYmVsb3cgKGFuZCBpbiB0aGUgbWlycm9yZWQgYGNvbW11bml0eS1wbHVnaW5zLnRzYCBoZWxwZXJzKSB3b3VsZCBiZVxuICAgICAgICogYW5zd2VyaW5nIGFib3V0IHRoZSB2YXVsdCdzIGNvbmZpZyBmaWxlIHJhdGhlciB0aGFuIHRoaXMgaW5zdGFuY2UuXG4gICAgICAgKlxuICAgICAgICogYHNldEVuYWJsZSh0cnVlKWAgaXMgd2hhdCBPYnNpZGlhbidzIG93biBcIkV4aXQgcmVzdHJpY3RlZCBtb2RlXCIgYnV0dG9uIGNhbGxzOiBpdCByZS1hc3NlcnRzIHRoZVxuICAgICAgICogZmxhZyBhbmQgbG9hZHMgZXZlcnl0aGluZyBpbiBgZW5hYmxlZFBsdWdpbnNgLiBVbmNvbmRpdGlvbmFsIG9uIHB1cnBvc2Ug4oCUIHRoZSBmbGFnIGlzIGFscmVhZHlcbiAgICAgICAqIGB0cnVlYCwgc28gYW4gYGlzRW5hYmxlZCgpYCBndWFyZCB3b3VsZCBza2lwIHRoZSBsb2FkIHRoYXQgaXMgdGhlIHdob2xlIHBvaW50LiBJZGVtcG90ZW50IGFuZFxuICAgICAgICogZWZmZWN0aXZlbHkgZnJlZSBvbmNlIHdhcm0gKGBsb2FkUGx1Z2luYCByZXR1cm5zIHRoZSBsaXZlIGluc3RhbmNlKSwgc28gcmUtcnVubmluZyBpdCBvbiBldmVyeVxuICAgICAgICogcmVidWlsZCBjb3N0cyBub3RoaW5nLlxuICAgICAgICovXG4gICAgICBhd2FpdCBhcHAucGx1Z2lucy5zZXRFbmFibGUodHJ1ZSk7XG5cbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihhcHAucGx1Z2lucy5tYW5pZmVzdHMsIEhPVF9SRUxPQURfUExVR0lOX0lEKSkge1xuICAgICAgICBjb25zdCByZWdpc3RyeVJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdFVybChDT01NVU5JVFlfUExVR0lOU19SRUdJU1RSWV9VUkwpO1xuICAgICAgICBjb25zdCByZWdpc3RyeUVudHJpZXMgPSByZWdpc3RyeVJlc3BvbnNlLmpzb24gYXMgQ29tbXVuaXR5UGx1Z2luUmVnaXN0cnlFbnRyeVtdO1xuICAgICAgICBjb25zdCBlbnRyeSA9IHJlZ2lzdHJ5RW50cmllcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PT0gSE9UX1JFTE9BRF9QTFVHSU5fSUQpO1xuICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gJyR7SE9UX1JFTE9BRF9QTFVHSU5fSUR9JyB3YXMgbm90IGZvdW5kIGluIHRoZSBPYnNpZGlhbiBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhdGVzdFJlbGVhc2VSZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RVcmwoYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtlbnRyeS5yZXBvfS9yZWxlYXNlcy9sYXRlc3RgKTtcbiAgICAgICAgY29uc3QgbGF0ZXN0UmVsZWFzZSA9IGxhdGVzdFJlbGVhc2VSZXNwb25zZS5qc29uIGFzIEdpdEh1YlJlbGVhc2U7XG4gICAgICAgIGNvbnN0IHZlcnNpb24gPSBsYXRlc3RSZWxlYXNlLnRhZ19uYW1lO1xuICAgICAgICBjb25zdCBtYW5pZmVzdFJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdFVybChgaHR0cHM6Ly9naXRodWIuY29tLyR7ZW50cnkucmVwb30vcmVsZWFzZXMvZG93bmxvYWQvJHt2ZXJzaW9ufS9tYW5pZmVzdC5qc29uYCk7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gbWFuaWZlc3RSZXNwb25zZS5qc29uIGFzIFBsdWdpbk1hbmlmZXN0O1xuICAgICAgICBhd2FpdCBhcHAucGx1Z2lucy5pbnN0YWxsUGx1Z2luKGVudHJ5LnJlcG8sIHZlcnNpb24sIG1hbmlmZXN0KTtcbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAqIEFzayB3aGV0aGVyIEhvdFJlbG9hZCBpcyBSVU5OSU5HLCBub3Qgd2hldGhlciB0aGUgdmF1bHQgY29uZmlnIGxpc3RzIGl0IGFzIGVuYWJsZWQuIEFmdGVyIHRoZVxuICAgICAgICogYHNldEVuYWJsZWAgYWJvdmUgdGhlIHR3byBub3JtYWxseSBhZ3JlZSwgYnV0IGEgSG90UmVsb2FkIHRoYXQgaXMgbGlzdGVkIGFuZCBmYWlsZWQgdG8gbG9hZCB3b3VsZFxuICAgICAgICogcGFzcyBhbiBgZW5hYmxlZFBsdWdpbnNgIGNoZWNrIHdoaWxlIGxlYXZpbmcgdGhlIGRldiBidWlsZCB3aXRob3V0IGF1dG8tcmVmcmVzaC5cbiAgICAgICAqL1xuICAgICAgaWYgKCFPYmplY3QuaGFzT3duKGFwcC5wbHVnaW5zLnBsdWdpbnMsIEhPVF9SRUxPQURfUExVR0lOX0lEKSkge1xuICAgICAgICBhd2FpdCBhcHAucGx1Z2lucy5lbmFibGVQbHVnaW5BbmRTYXZlKEhPVF9SRUxPQURfUExVR0lOX0lEKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgYXBwLnBsdWdpbnMuZW5hYmxlUGx1Z2luQW5kU2F2ZShwbHVnaW5OYW1lKTtcbiAgICB9LFxuICAgIGlucHV0OiB7IHBsdWdpbk5hbWUgfSxcbiAgICBzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzOiB0cnVlLFxuICAgIHRyYW5zcG9ydCxcbiAgICB2YXVsdFBhdGhcbiAgfSk7XG59XG5cbi8qKlxuICogUHJvYmVzIHRoZSBvd25lZCBPYnNpZGlhbiBpbnN0YW5jZSdzIENEUCBlbmRwb2ludCB0byBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBzdGlsbCBydW5uaW5nLlxuICpcbiAqIEEgY2xvc2VkIGluc3RhbmNlIHN0b3BzIHNlcnZpbmcgQ0RQIGFsdG9nZXRoZXIsIHNvIGFuIHVucmVhY2hhYmxlIGVuZHBvaW50IOKAlCBvciBvbmUgbGVmdCB3aXRoIG5vIHBhZ2VcbiAqIHRhcmdldHMgd2hpbGUgdGhlIGFwcCB0ZWFycyBpdHNlbGYgZG93biDigJQgbWVhbnMgdGhlIGluc3RhbmNlIGlzIGdvbmUuXG4gKlxuICogQHBhcmFtIGNkcFVybCAtIFRoZSBiYXNlIENEUCBVUkwgb2YgdGhlIG93bmVkIGluc3RhbmNlLCBlLmcuIGBodHRwOi8vbG9jYWxob3N0OjUxODg4YC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byBgdHJ1ZWAgd2hpbGUgdGhlIGluc3RhbmNlIGlzIHN0aWxsIHNlcnZpbmcgYSBwYWdlIHRhcmdldC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNEZXZJbnN0YW5jZVJ1bm5pbmcoY2RwVXJsOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzIC0tIFdlIHJ1biB0aGlzIG91dHNpZGUgb2YgT2JzaWRpYW4sIHNvIHdlIGRvbid0IGhhdmUgYHJlcXVlc3RVcmwoKWAuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtjZHBVcmx9L2pzb25gKTtcbiAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIENkcFRhcmdldFtdO1xuICAgIHJldHVybiB0YXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LnR5cGUgPT09ICdwYWdlJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIExhdW5jaGVzIGEgZnJlc2ggb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgKGlzb2xhdGVkIHVzZXItZGF0YSBkaXIpIGFuZCBvcGVucyB0aGUgZ2l2ZW4gdmF1bHQuXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIgdG8gb3Blbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgbGF1bmNoZWQge0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0fS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGF1bmNoRGV2SW5zdGFuY2UodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGNvbnN0IHRyYW5zcG9ydCA9IGF3YWl0IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdHJhbnNwb3J0LnJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0cmFuc3BvcnQuZGlzcG9zZVN5bmM/LigpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG4gIHJlZ2lzdGVyRGV2SW5zdGFuY2VDbGVhbnVwKHRyYW5zcG9ydCk7XG4gIHdhdGNoRGV2SW5zdGFuY2VBbmRTdG9wT25DbG9zZSh0cmFuc3BvcnQpO1xuICByZXR1cm4gdHJhbnNwb3J0O1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBwbHVnaW4gaWQgZnJvbSB0aGUgZGVwbG95ZWQgYG1hbmlmZXN0Lmpzb25gLCB3aGljaCBpcyB3aGF0IE9ic2lkaWFuIGFuZCBpdHMgQ0xJIGtub3cgdGhlIHBsdWdpbiBieS5cbiAqXG4gKiBAcGFyYW0gcGx1Z2luRm9sZGVyIC0gVGhlIGRlcGxveWVkIHBsdWdpbiBmb2xkZXIuXG4gKiBAcGFyYW0gZmFsbGJhY2tJZCAtIFRoZSBpZCB0byB1c2Ugd2hlbiB0aGUgZm9sZGVyIGhhcyBubyByZWFkYWJsZSBtYW5pZmVzdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgcGx1Z2luIGlkLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkUGx1Z2luSWQocGx1Z2luRm9sZGVyOiBzdHJpbmcsIGZhbGxiYWNrSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGpvaW4ocGx1Z2luRm9sZGVyLCAnbWFuaWZlc3QuanNvbicpLCAndXRmLTgnKSkgYXMgUGFydGlhbDxQbHVnaW5NYW5pZmVzdD47XG4gICAgcmV0dXJuIG1hbmlmZXN0LmlkID8/IGZhbGxiYWNrSWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxsYmFja0lkO1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHByb2Nlc3MtZXhpdCBhbmQgc2lnbmFsIGhhbmRsZXJzIChvbmNlKSB0aGF0IHN5bmNocm9ub3VzbHkgY2xvc2UgdGhlIG93bmVkIE9ic2lkaWFuXG4gKiBpbnN0YW5jZSB3aGVuIHRoZSBgbnBtIHJ1biBkZXZgIHByb2Nlc3MgdGVybWluYXRlcy5cbiAqXG4gKiBUaGVzZSBoYW5kbGVycyBjb3ZlciBhbiBvcmRlcmx5IHNodXRkb3duLiBBIGBTSUdLSUxMYCAob3IgYSBUYXNrIE1hbmFnZXIgLyBJREUgc3RvcCkgcnVucyBubyBoYW5kbGVyXG4gKiBhdCBhbGwsIGFuZCBubyBvcGVyYXRpbmcgc3lzdGVtIGtpbGxzIHRoZSBpbnN0YW5jZSBqdXN0IGZvciBiZWluZyBvdXIgY2hpbGQg4oCUIHNvIHRoYXQgY2FzZSBpcyBjYXVnaHRcbiAqIGZyb20gdGhlIG90aGVyIHNpZGUsIGJ5IHRoZSBoYXJuZXNzJ3MgcGFyZW50LWxpdmVuZXNzIHdhdGNoZG9nOiB0aGUgaW5zdGFuY2UncyByZW5kZXJlciBob2xkcyBhIHNvY2tldFxuICogYmFjayB0byB0aGlzIHByb2Nlc3MgYW5kIGRlc3Ryb3lzIGl0cyB3aW5kb3cgd2hlbiB0aGUga2VybmVsIGNsb3NlcyBpdC4gU2VlIGBwYXJlbnQtbGl2ZW5lc3MudHNgIGluXG4gKiBgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZ2AuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSBvd25lZCB0cmFuc3BvcnQgdG8gZGlzcG9zZSBvbiBzaHV0ZG93bi5cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJEZXZJbnN0YW5jZUNsZWFudXAodHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCk6IHZvaWQge1xuICBpZiAobW9kdWxlU3RhdGUuaXNEZXZJbnN0YW5jZUNsZWFudXBSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIG1vZHVsZVN0YXRlLmlzRGV2SW5zdGFuY2VDbGVhbnVwUmVnaXN0ZXJlZCA9IHRydWU7XG5cbiAgLy8gYGV4aXRgIGNvdmVycyBhbnkgYHByb2Nlc3MuZXhpdCgpYCwgYnV0IGEgZGVmYXVsdCBDdHJsK0MgdGVybWluYXRlcyBXSVRIT1VUIGZpcmluZyBgZXhpdGAsIHNvIHRoZSBzaWduYWwgaGFuZGxlcnMgZ3VhcmFudGVlIHRoZSBvd25lZCBPYnNpZGlhbiBpcyBraWxsZWQgb24gc2h1dGRvd24uXG4gIHByb2Nlc3Mub24oJ2V4aXQnLCBkaXNwb3NlRGV2SW5zdGFuY2UpO1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0hVUCcsICdTSUdJTlQnLCAnU0lHVEVSTSddIGFzIGNvbnN0KSB7XG4gICAgcHJvY2Vzcy5vbmNlKHNpZ25hbCwgKCkgPT4ge1xuICAgICAgZGlzcG9zZURldkluc3RhbmNlKCk7XG4gICAgICBwcm9jZXNzLmV4aXQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc3Bvc2VEZXZJbnN0YW5jZSgpOiB2b2lkIHtcbiAgICBpZiAobW9kdWxlU3RhdGUuaXNEZXZJbnN0YW5jZURpc3Bvc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG1vZHVsZVN0YXRlLmlzRGV2SW5zdGFuY2VEaXNwb3NlZCA9IHRydWU7XG4gICAgdHJhbnNwb3J0LmRpc3Bvc2VTeW5jPy4oKTtcbiAgfVxufVxuXG4vKipcbiAqIFdhdGNoZXMgdGhlIGBucG0gcnVuIGRldmAtb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgYW5kIHN0b3BzIHRoZSBkZXZlbG9wbWVudCBidWlsZCBvbmNlIHRoZSBpbnN0YW5jZSBpc1xuICogY2xvc2VkLlxuICpcbiAqIFRoaXMgaXMgdGhlIG1pcnJvciBpbWFnZSBvZiB7QGxpbmsgcmVnaXN0ZXJEZXZJbnN0YW5jZUNsZWFudXB9OiB0aGF0IG9uZSBjbG9zZXMgdGhlIGluc3RhbmNlIHdoZW4gdGhlXG4gKiBgbnBtIHJ1biBkZXZgIHByb2Nlc3MgdGVybWluYXRlcywgdGhpcyBvbmUgdGVybWluYXRlcyB0aGUgcHJvY2VzcyB3aGVuIHRoZSB1c2VyIGNsb3NlcyB0aGUgaW5zdGFuY2UsIHNvXG4gKiB0aGUgdHdvIG5ldmVyIG91dGxpdmUgZWFjaCBvdGhlci4gQSBidWlsZCB3YXRjaGluZyBhbiBPYnNpZGlhbiB0aGF0IGlzIG5vIGxvbmdlciBydW5uaW5nIGhhcyBub3RoaW5nXG4gKiBsZWZ0IHRvIGRlcGxveSB0by5cbiAqXG4gKiBPbmx5IGEgaGFybmVzcy1vd25lZCBpbnN0YW5jZSBpcyB3YXRjaGVkLiBXaGVuIHRoZSB0cmFuc3BvcnQgYXR0YWNoZXMgdG8gYW4gYWxyZWFkeS1ydW5uaW5nIE9ic2lkaWFuXG4gKiAodGhlIHVzZXIncyBvd24pLCB0aGF0IGluc3RhbmNlIGlzIG5vdCBvdXJzIHRvIGJlIHRpZWQgdG8gYW5kIGNsb3NpbmcgaXQgbGVhdmVzIHRoZSBidWlsZCBydW5uaW5nLlxuICpcbiAqIEBwYXJhbSB0cmFuc3BvcnQgLSBUaGUgb3duZWQgdHJhbnNwb3J0IHdob3NlIGluc3RhbmNlIHRvIHdhdGNoLlxuICovXG5mdW5jdGlvbiB3YXRjaERldkluc3RhbmNlQW5kU3RvcE9uQ2xvc2UodHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCk6IHZvaWQge1xuICBpZiAoISh0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGVuZHBvaW50ID0gdHJhbnNwb3J0LmdldE93bmVkSW5zdGFuY2VFbmRwb2ludCgpO1xuICBpZiAoIWVuZHBvaW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2RwVXJsID0gYGh0dHA6Ly8ke2VuZHBvaW50Lmhvc3R9OiR7U3RyaW5nKGVuZHBvaW50LnBvcnQpfWA7XG4gIGludm9rZUFzeW5jU2FmZWx5KHN0b3BXaGVuRGV2SW5zdGFuY2VDbG9zZXMpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHN0b3BXaGVuRGV2SW5zdGFuY2VDbG9zZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGNvbnNlY3V0aXZlRmFpbGVkUHJvYmVDb3VudCA9IDA7XG4gICAgd2hpbGUgKGNvbnNlY3V0aXZlRmFpbGVkUHJvYmVDb3VudCA8IERFVl9JTlNUQU5DRV9DTE9TRURfUFJPQkVfQ09VTlQpIHtcbiAgICAgIGF3YWl0IHNsZWVwKHsgbWlsbGlzZWNvbmRzOiBERVZfSU5TVEFOQ0VfUFJPQkVfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTIH0pO1xuXG4gICAgICAvLyBUaGUgcHJvY2VzcyBpcyBhbHJlYWR5IHNodXR0aW5nIGRvd24gYW5kIGtpbGxlZCB0aGUgaW5zdGFuY2UgaXRzZWxmOyB0aGUgcHJvYmVzIHdvdWxkIGp1c3QgcmFjZSB0aGUgdGVhcmRvd24uXG4gICAgICBpZiAobW9kdWxlU3RhdGUuaXNEZXZJbnN0YW5jZURpc3Bvc2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc2VjdXRpdmVGYWlsZWRQcm9iZUNvdW50ID0gYXdhaXQgaXNEZXZJbnN0YW5jZVJ1bm5pbmcoY2RwVXJsKSA/IDAgOiBjb25zZWN1dGl2ZUZhaWxlZFByb2JlQ291bnQgKyAxO1xuICAgIH1cblxuICAgIGNvbnNvbGUud2FybignVGhlIE9ic2lkaWFuIGluc3RhbmNlIG93bmVkIGJ5IGBucG0gcnVuIGRldmAgd2FzIGNsb3NlZC4gU3RvcHBpbmcgdGhlIGRldmVsb3BtZW50IGJ1aWxkLicpO1xuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHNCQUFzQjtBQUMvQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsT0FBTyxhQUFhO0FBQ3BCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUlQLFNBQVMsbUNBQW1DO0FBK0Y1QyxNQUFNLGNBQTJCO0FBQUEsRUFDL0IsNkJBQTZCO0FBQUEsRUFDN0IsZ0NBQWdDO0FBQUEsRUFDaEMsdUJBQXVCO0FBQ3pCO0FBS0EsTUFBTSw4Q0FBOEM7QUFPcEQsTUFBTSxrQ0FBa0M7QUFReEMsZUFBc0IsOEJBQThCLFFBQTREO0FBQzlHLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFFSixNQUFJLG1CQUFtQjtBQUNyQjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLENBQUMsT0FBTyxzQkFBc0I7QUFDaEMsbUJBQWUsK0JBQStCO0FBQUEsTUFDNUM7QUFBQSxJQUNGO0FBQ0E7QUFBQSxFQUNGO0FBRUEsUUFBTSx1QkFBdUIsWUFBWSxPQUFPLG9CQUFvQjtBQUVwRSxRQUFNLGVBQWUsS0FBSyxzQkFBc0IsV0FBVyxVQUFVO0FBQ3JFLFFBQU0sTUFBTSxjQUFjLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDN0MsUUFBTSxHQUFHLFlBQVksY0FBYyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBRXRELFVBQVEsT0FBTyxVQUFVLHFCQUFxQjtBQUFBLElBQzVDLEtBQUssT0FBTztBQUNWO0FBQUEsSUFDRjtBQUFBLElBQ0EsS0FBSyxxQkFBcUI7QUFDeEIsWUFBTSwwQkFBMEI7QUFBQSxRQUM5QjtBQUFBLFFBQ0E7QUFBQSxNQUNGLENBQUM7QUFDRDtBQUFBLElBQ0Y7QUFBQSxJQUNBLEtBQUssZ0JBQWdCO0FBQ25CLFlBQU0sNEJBQTRCO0FBQUEsUUFDaEMsVUFBVSxNQUFNLGFBQWEsY0FBYyxVQUFVO0FBQUEsUUFDckQsV0FBVyxTQUFTLFFBQVEsb0JBQW9CLENBQUM7QUFBQSxNQUNuRCxDQUFDO0FBQ0Q7QUFBQSxJQUNGO0FBQUEsSUFDQSxTQUFTO0FBQ1AsWUFBTSxJQUFJLE1BQU0sMEJBQTBCLE9BQU8sT0FBTyxNQUFNLENBQUMsRUFBRTtBQUFBLElBQ25FO0FBQUEsRUFDRjtBQUNGO0FBU0EsZUFBZSx1QkFBdUIsV0FBK0M7QUFDbkYsY0FBWSxnQ0FBZ0Msa0JBQWtCLFNBQVM7QUFDdkUsTUFBSTtBQUNGLFdBQU8sTUFBTSxZQUFZO0FBQUEsRUFDM0IsU0FBUyxPQUFPO0FBRWQsZ0JBQVksOEJBQThCO0FBQzFDLFVBQU07QUFBQSxFQUNSO0FBQ0Y7QUF5QkEsZUFBZSwwQkFBMEIsUUFBd0Q7QUFDL0YsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBQ0osUUFBTSxZQUFZLFFBQVEsb0JBQW9CO0FBQzlDLFFBQU0sWUFBWSxNQUFNLHVCQUF1QixTQUFTO0FBQ3hELFFBQU0sZUFBZTtBQUFBO0FBQUEsSUFFbkIsTUFBTSxTQUFTLEVBQUUsS0FBSyxnQkFBZ0IsWUFBQUEsWUFBVyxHQUFHO0FBQ2xELFlBQU0sdUJBQXVCO0FBQzdCLFlBQU0saUNBQWlDO0FBQ3ZDLFlBQU0sRUFBRSxXQUFXLElBQUk7QUFpQnZCLFlBQU0sSUFBSSxRQUFRLFVBQVUsSUFBSTtBQUVoQyxVQUFJLENBQUMsT0FBTyxPQUFPLElBQUksUUFBUSxXQUFXLG9CQUFvQixHQUFHO0FBQy9ELGNBQU0sbUJBQW1CLE1BQU0sV0FBVyw4QkFBOEI7QUFDeEUsY0FBTSxrQkFBa0IsaUJBQWlCO0FBQ3pDLGNBQU0sUUFBUSxnQkFBZ0IsS0FBSyxDQUFDLGNBQWMsVUFBVSxPQUFPLG9CQUFvQjtBQUN2RixZQUFJLENBQUMsT0FBTztBQUNWLGdCQUFNLElBQUksTUFBTSxXQUFXLG9CQUFvQiw2REFBNkQ7QUFBQSxRQUM5RztBQUVBLGNBQU0sd0JBQXdCLE1BQU0sV0FBVyxnQ0FBZ0MsTUFBTSxJQUFJLGtCQUFrQjtBQUMzRyxjQUFNLGdCQUFnQixzQkFBc0I7QUFDNUMsY0FBTSxVQUFVLGNBQWM7QUFDOUIsY0FBTSxtQkFBbUIsTUFBTSxXQUFXLHNCQUFzQixNQUFNLElBQUksc0JBQXNCLE9BQU8sZ0JBQWdCO0FBQ3ZILGNBQU0sV0FBVyxpQkFBaUI7QUFDbEMsY0FBTSxJQUFJLFFBQVEsY0FBYyxNQUFNLE1BQU0sU0FBUyxRQUFRO0FBQUEsTUFDL0Q7QUFPQSxVQUFJLENBQUMsT0FBTyxPQUFPLElBQUksUUFBUSxTQUFTLG9CQUFvQixHQUFHO0FBQzdELGNBQU0sSUFBSSxRQUFRLG9CQUFvQixvQkFBb0I7QUFBQSxNQUM1RDtBQUVBLFlBQU0sSUFBSSxRQUFRLG9CQUFvQkEsV0FBVTtBQUFBLElBQ2xEO0FBQUEsSUFDQSxPQUFPLEVBQUUsV0FBVztBQUFBLElBQ3BCLDJCQUEyQjtBQUFBLElBQzNCO0FBQUEsSUFDQTtBQUFBLEVBQ0YsQ0FBQztBQUNIO0FBV0EsZUFBZSxxQkFBcUIsUUFBa0M7QUFDcEUsTUFBSTtBQUVGLFVBQU0sV0FBVyxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU87QUFDN0MsVUFBTSxVQUFVLE1BQU0sU0FBUyxLQUFLO0FBQ3BDLFdBQU8sUUFBUSxLQUFLLENBQUMsV0FBVyxPQUFPLFNBQVMsTUFBTTtBQUFBLEVBQ3hELFFBQVE7QUFDTixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBUUEsZUFBZSxrQkFBa0IsV0FBK0M7QUFDOUUsUUFBTSxZQUFZLE1BQU0sMkJBQTJCO0FBQ25ELE1BQUk7QUFDRixVQUFNLFVBQVUsY0FBYyxTQUFTO0FBQUEsRUFDekMsU0FBUyxPQUFPO0FBQ2QsY0FBVSxjQUFjO0FBQ3hCLFVBQU07QUFBQSxFQUNSO0FBQ0EsNkJBQTJCLFNBQVM7QUFDcEMsaUNBQStCLFNBQVM7QUFDeEMsU0FBTztBQUNUO0FBU0EsZUFBZSxhQUFhLGNBQXNCLFlBQXFDO0FBQ3JGLE1BQUk7QUFDRixVQUFNLFdBQVcsS0FBSyxNQUFNLE1BQU0sU0FBUyxLQUFLLGNBQWMsZUFBZSxHQUFHLE9BQU8sQ0FBQztBQUN4RixXQUFPLFNBQVMsTUFBTTtBQUFBLEVBQ3hCLFFBQVE7QUFDTixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBY0EsU0FBUywyQkFBMkIsV0FBb0M7QUFDdEUsTUFBSSxZQUFZLGdDQUFnQztBQUM5QztBQUFBLEVBQ0Y7QUFDQSxjQUFZLGlDQUFpQztBQUc3QyxVQUFRLEdBQUcsUUFBUSxrQkFBa0I7QUFDckMsYUFBVyxVQUFVLENBQUMsVUFBVSxVQUFVLFNBQVMsR0FBWTtBQUM3RCxZQUFRLEtBQUssUUFBUSxNQUFNO0FBQ3pCLHlCQUFtQjtBQUNuQixjQUFRLEtBQUs7QUFBQSxJQUNmLENBQUM7QUFBQSxFQUNIO0FBRUEsV0FBUyxxQkFBMkI7QUFDbEMsUUFBSSxZQUFZLHVCQUF1QjtBQUNyQztBQUFBLElBQ0Y7QUFDQSxnQkFBWSx3QkFBd0I7QUFDcEMsY0FBVSxjQUFjO0FBQUEsRUFDMUI7QUFDRjtBQWdCQSxTQUFTLCtCQUErQixXQUFvQztBQUMxRSxNQUFJLEVBQUUscUJBQXFCLHNCQUFzQjtBQUMvQztBQUFBLEVBQ0Y7QUFFQSxRQUFNLFdBQVcsVUFBVSx5QkFBeUI7QUFDcEQsTUFBSSxDQUFDLFVBQVU7QUFDYjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFNBQVMsVUFBVSxTQUFTLElBQUksSUFBSSxPQUFPLFNBQVMsSUFBSSxDQUFDO0FBQy9ELG9CQUFrQix5QkFBeUI7QUFFM0MsaUJBQWUsNEJBQTJDO0FBQ3hELFFBQUksOEJBQThCO0FBQ2xDLFdBQU8sOEJBQThCLGlDQUFpQztBQUNwRSxZQUFNLE1BQU0sRUFBRSxjQUFjLDRDQUE0QyxDQUFDO0FBR3pFLFVBQUksWUFBWSx1QkFBdUI7QUFDckM7QUFBQSxNQUNGO0FBRUEsb0NBQThCLE1BQU0scUJBQXFCLE1BQU0sSUFBSSxJQUFJLDhCQUE4QjtBQUFBLElBQ3ZHO0FBRUEsWUFBUSxLQUFLLDBGQUEwRjtBQUN2RyxZQUFRLEtBQUs7QUFBQSxFQUNmO0FBQ0Y7IiwibmFtZXMiOlsicGx1Z2luTmFtZSJdfQ==
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Builds an Obsidian plugin with parcel: `build()` and `dev()`, the same two entry points the esbuild
|
|
6
|
+
* builder has, producing the same `main.js` + `styles.css` + `manifest.json` layout.
|
|
7
|
+
*
|
|
8
|
+
* Parcel takes no `external` list and no output file name, only plugins named in a `.parcelrc`. So the
|
|
9
|
+
* build writes a `.parcelrc` of its own into `.parcel-cache`, beside a resolver that leaves
|
|
10
|
+
* Obsidian's modules external, a namer that names the stylesheet `styles.css` and a transformer that keeps
|
|
11
|
+
* dynamic imports inside `main.js`, and extends the
|
|
12
|
+
* consumer's own `.parcelrc` when there is one (or `@parcel/config-default` when there is none), so every
|
|
13
|
+
* transformer the consumer configured still applies.
|
|
14
|
+
*
|
|
15
|
+
* `@parcel/core`, `@parcel/plugin` and `@parcel/config-default` are optional peer dependencies, loaded
|
|
16
|
+
* only when a parcel build runs, so a plugin built with esbuild installs nothing extra.
|
|
17
|
+
*/
|
|
18
|
+
import type { InitialParcelOptions } from '@parcel/types';
|
|
19
|
+
import { CliTaskResult } from '@mnaoumov/typescript-dev-toolkit/cli-utils';
|
|
20
|
+
import type { ObsidianPluginBuildContext, ObsidianPluginDeploymentOptions } from './obsidian-plugin-build.mjs';
|
|
21
|
+
import type { ObsidianPluginFeatureOptions } from './obsidian-plugin-features.mjs';
|
|
22
|
+
import { BuildMode } from './obsidian-plugin-build.mjs';
|
|
23
|
+
/**
|
|
24
|
+
* Options for {@link buildObsidianPluginWithParcel}.
|
|
25
|
+
*/
|
|
26
|
+
export interface BuildObsidianPluginWithParcelParams extends BuildOptions {
|
|
27
|
+
/**
|
|
28
|
+
* A build mode, either `Development` or `Production`.
|
|
29
|
+
*/
|
|
30
|
+
readonly mode: BuildMode;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Options for {@link build} and {@link dev}.
|
|
34
|
+
*/
|
|
35
|
+
export interface BuildOptions extends ObsidianPluginDeploymentOptions, ObsidianPluginFeatureOptions {
|
|
36
|
+
/**
|
|
37
|
+
* Customizes the options handed to parcel's `Parcel` class.
|
|
38
|
+
*/
|
|
39
|
+
readonly customizeParcelOptions?: (options: InitialParcelOptions) => InitialParcelOptions;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Parameters for {@link getParcelConfigFiles}.
|
|
43
|
+
*/
|
|
44
|
+
export interface GetParcelConfigFilesParams {
|
|
45
|
+
/**
|
|
46
|
+
* The consumer's own `.parcelrc`, relative to the generated configuration's folder, or `undefined` when the project
|
|
47
|
+
* has none.
|
|
48
|
+
*/
|
|
49
|
+
readonly consumerParcelrcPath: string | undefined;
|
|
50
|
+
/**
|
|
51
|
+
* The build features.
|
|
52
|
+
*/
|
|
53
|
+
readonly features?: ObsidianPluginFeatureOptions;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Parameters for {@link getParcelOptions}.
|
|
57
|
+
*/
|
|
58
|
+
export interface GetParcelOptionsParams {
|
|
59
|
+
/**
|
|
60
|
+
* The build context.
|
|
61
|
+
*/
|
|
62
|
+
readonly buildContext: ObsidianPluginBuildContext;
|
|
63
|
+
/**
|
|
64
|
+
* Parcel's cache folder. Named explicitly because parcel otherwise takes the folder of the nearest
|
|
65
|
+
* lockfile for the project root, which in a workspace is not the plugin's.
|
|
66
|
+
*/
|
|
67
|
+
readonly cacheFolder: string;
|
|
68
|
+
/**
|
|
69
|
+
* The generated `.parcelrc`.
|
|
70
|
+
*/
|
|
71
|
+
readonly configPath: string;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The files of the generated parcel configuration, by file name.
|
|
75
|
+
*/
|
|
76
|
+
export type ParcelConfigFiles = Readonly<Record<string, string>>;
|
|
77
|
+
/**
|
|
78
|
+
* Builds the Obsidian plugin in production mode using parcel.
|
|
79
|
+
*
|
|
80
|
+
* @param options - Optional build options.
|
|
81
|
+
* @returns A {@link Promise} that resolves when the build is complete.
|
|
82
|
+
*/
|
|
83
|
+
export declare function build(options?: BuildOptions): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Builds the Obsidian plugin with parcel, once for a production build, or watching for a development one.
|
|
86
|
+
*
|
|
87
|
+
* Runs the project's `build:compile` script first when it has one, as the esbuild builder does, since
|
|
88
|
+
* parcel strips TypeScript types without checking them.
|
|
89
|
+
*
|
|
90
|
+
* @param params - The {@link BuildObsidianPluginWithParcelParams}.
|
|
91
|
+
* @returns A {@link Promise} that resolves to a {@link CliTaskResult} indicating the success or failure of the build.
|
|
92
|
+
*/
|
|
93
|
+
export declare function buildObsidianPluginWithParcel(params: BuildObsidianPluginWithParcelParams): Promise<CliTaskResult>;
|
|
94
|
+
/**
|
|
95
|
+
* Builds the Obsidian plugin in development mode using parcel, watching for changes and deploying every
|
|
96
|
+
* successful rebuild into the vault.
|
|
97
|
+
*
|
|
98
|
+
* @param options - Optional build options.
|
|
99
|
+
* @returns A {@link Promise} that resolves to a {@link CliTaskResult} indicating the build result.
|
|
100
|
+
*/
|
|
101
|
+
export declare function dev(options?: BuildOptions): Promise<CliTaskResult>;
|
|
102
|
+
/**
|
|
103
|
+
* Generates the files of the parcel configuration the build runs with.
|
|
104
|
+
*
|
|
105
|
+
* The build features add pipelines that run the toolkit's shared transforms, through one generated transformer that
|
|
106
|
+
* loads them from the toolkit: Solid's `.jsx` / `.tsx`, Svelte's `.svelte` / `.svelte.ts` / `.svelte.js`, `.wasm`,
|
|
107
|
+
* and with `styles.postcss` or `styles.tailwind` every stylesheet, in place of parcel's own PostCSS step. React and
|
|
108
|
+
* Preact JSX is compiled here too, since parcel reads the JSX runtime from a tsconfig without following its `extends`,
|
|
109
|
+
* and with any framework every script has the framework's compile-time constants replaced. Parcel compiles Vue with
|
|
110
|
+
* `@parcel/transformer-vue` and scopes `*.module.css` itself, so those need no pipeline here.
|
|
111
|
+
*
|
|
112
|
+
* @param params - The {@link GetParcelConfigFilesParams}.
|
|
113
|
+
* @returns The files, by file name.
|
|
114
|
+
*/
|
|
115
|
+
export declare function getParcelConfigFiles(params: GetParcelConfigFilesParams): ParcelConfigFiles;
|
|
116
|
+
/**
|
|
117
|
+
* Builds the options handed to parcel's `Parcel` class.
|
|
118
|
+
*
|
|
119
|
+
* The one target is `electron-renderer`, where Obsidian runs a plugin, and CommonJS. Parcel counts that
|
|
120
|
+
* context as both a browser and a node one, and each half matters: node keeps the builtins external, and
|
|
121
|
+
* browser resolves the `browser` export condition. `includeNodeModules` bundles the dependencies, which a
|
|
122
|
+
* node-flavoured context would otherwise leave as `require()` calls nothing installs beside a plugin, and
|
|
123
|
+
* `isLibrary` keeps the entry's default export, which is how Obsidian finds the plugin class.
|
|
124
|
+
*
|
|
125
|
+
* @param params - The {@link GetParcelOptionsParams}.
|
|
126
|
+
* @returns The parcel options.
|
|
127
|
+
*/
|
|
128
|
+
export declare function getParcelOptions(params: GetParcelOptionsParams): InitialParcelOptions;
|