@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,144 @@
|
|
|
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
|
+
|
|
6
|
+
import {
|
|
7
|
+
BuildMode,
|
|
8
|
+
cleanObsidianPluginDistFolder,
|
|
9
|
+
completeObsidianPluginDistFolder,
|
|
10
|
+
getObsidianPluginBanner,
|
|
11
|
+
resolveObsidianPluginBuildContext
|
|
12
|
+
} from "./obsidian-plugin-build.mjs";
|
|
13
|
+
import {
|
|
14
|
+
getFrameworkDefines,
|
|
15
|
+
getJsxImportSource,
|
|
16
|
+
isPostcssNeeded
|
|
17
|
+
} from "./obsidian-plugin-features.mjs";
|
|
18
|
+
import { loadPostcssConfig } from "./obsidian-plugin-transforms.mjs";
|
|
19
|
+
import { deployToObsidianPluginsFolder } from "./obsidian-plugins-folder-deployment.mjs";
|
|
20
|
+
import {
|
|
21
|
+
createRollupCompatibleFeaturePlugin,
|
|
22
|
+
createUnpluginVuePlugin
|
|
23
|
+
} from "./rollup-compatible-features.mjs";
|
|
24
|
+
import {
|
|
25
|
+
combineExternal,
|
|
26
|
+
renameCssAssets
|
|
27
|
+
} from "./rollup-compatible.mjs";
|
|
28
|
+
function getViteBuildMode(userConfig, env) {
|
|
29
|
+
return userConfig.build?.watch || env.mode === "development" ? BuildMode.Development : BuildMode.Production;
|
|
30
|
+
}
|
|
31
|
+
function getViteConfigDefaults(userConfig, buildContext) {
|
|
32
|
+
const build = userConfig.build ?? {};
|
|
33
|
+
const rolldownOptions = build.rolldownOptions ?? build.rollupOptions ?? {};
|
|
34
|
+
const output = Array.isArray(rolldownOptions.output) ? void 0 : rolldownOptions.output ?? {};
|
|
35
|
+
return {
|
|
36
|
+
build: {
|
|
37
|
+
// An Obsidian release ships `main.js` and `styles.css` and nothing else, so any asset emitted beside
|
|
38
|
+
// the bundle is a file the installed plugin looks for and does not find.
|
|
39
|
+
assetsInlineLimit: build.assetsInlineLimit ?? Number.MAX_SAFE_INTEGER,
|
|
40
|
+
// eslint-disable-next-line unicorn/name-replacements -- `emptyOutDir` is the name vite's config reads.
|
|
41
|
+
emptyOutDir: false,
|
|
42
|
+
lib: build.lib ?? {
|
|
43
|
+
cssFileName: "styles",
|
|
44
|
+
entry: buildContext.entryPoint,
|
|
45
|
+
fileName: () => "main.js",
|
|
46
|
+
formats: ["cjs"]
|
|
47
|
+
},
|
|
48
|
+
minify: build.minify ?? buildContext.isProductionBuild,
|
|
49
|
+
// eslint-disable-next-line unicorn/name-replacements -- `outDir` is the name vite's config reads.
|
|
50
|
+
outDir: buildContext.distFolder,
|
|
51
|
+
rolldownOptions: {
|
|
52
|
+
external: combineExternal(rolldownOptions.external),
|
|
53
|
+
...output !== void 0 && {
|
|
54
|
+
output: {
|
|
55
|
+
// `postBanner` rather than `banner`: it is added after minification, which strips an ordinary comment.
|
|
56
|
+
...output.banner === void 0 && output.postBanner === void 0 && { postBanner: getObsidianPluginBanner("vite") },
|
|
57
|
+
// An Obsidian plugin is one file: the manifest names `main.js` and nothing loads a second chunk.
|
|
58
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated -- A consumer's config may still set the deprecated option, which then wins.
|
|
59
|
+
...output.codeSplitting === void 0 && output.inlineDynamicImports === void 0 && { codeSplitting: false }
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
sourcemap: build.sourcemap ?? (!buildContext.isProductionBuild && "inline")
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function getViteFeatureConfig(params) {
|
|
68
|
+
const { features, isProductionBuild, postcssConfig, userConfig } = params;
|
|
69
|
+
const config = {};
|
|
70
|
+
const userDefine = userConfig.define ?? {};
|
|
71
|
+
const define = Object.fromEntries(
|
|
72
|
+
Object.entries(getFrameworkDefines({ framework: features.framework, isProductionBuild })).filter(([expression]) => !Object.hasOwn(userDefine, expression))
|
|
73
|
+
);
|
|
74
|
+
if (Object.keys(define).length > 0) {
|
|
75
|
+
config.define = define;
|
|
76
|
+
}
|
|
77
|
+
const jsxImportSource = getJsxImportSource(features.framework);
|
|
78
|
+
if (jsxImportSource !== void 0 && userConfig.oxc !== false && userConfig.oxc?.jsx === void 0) {
|
|
79
|
+
config.oxc = { jsx: { development: !isProductionBuild, importSource: jsxImportSource, runtime: "automatic" } };
|
|
80
|
+
}
|
|
81
|
+
if (postcssConfig && postcssConfig.plugins.length > 0 && userConfig.css?.postcss === void 0) {
|
|
82
|
+
config.css = { postcss: { plugins: [...postcssConfig.plugins] } };
|
|
83
|
+
}
|
|
84
|
+
return config;
|
|
85
|
+
}
|
|
86
|
+
function obsidianPluginVite(options = {}) {
|
|
87
|
+
const state = {
|
|
88
|
+
buildContext: void 0,
|
|
89
|
+
isDistFolderCleaned: false
|
|
90
|
+
};
|
|
91
|
+
function getBuildContext() {
|
|
92
|
+
if (!state.buildContext) {
|
|
93
|
+
throw new Error("The obsidian-plugin vite plugin has not resolved its build context: its `config` hook did not run.");
|
|
94
|
+
}
|
|
95
|
+
return state.buildContext;
|
|
96
|
+
}
|
|
97
|
+
const featurePlugin = createRollupCompatibleFeaturePlugin({
|
|
98
|
+
features: options,
|
|
99
|
+
isProductionBuild: () => getBuildContext().isProductionBuild,
|
|
100
|
+
shouldCompileStylesheets: false,
|
|
101
|
+
shouldReplaceDefines: false
|
|
102
|
+
});
|
|
103
|
+
const plugin = {
|
|
104
|
+
apply: "build",
|
|
105
|
+
async config(userConfig, env) {
|
|
106
|
+
state.buildContext = await resolveObsidianPluginBuildContext({
|
|
107
|
+
...options,
|
|
108
|
+
...userConfig.build?.outDir !== void 0 && { distFolder: userConfig.build.outDir },
|
|
109
|
+
mode: options.mode ?? getViteBuildMode(userConfig, env)
|
|
110
|
+
});
|
|
111
|
+
const { isProductionBuild } = state.buildContext;
|
|
112
|
+
const postcssConfig = isPostcssNeeded(options.styles) ? await loadPostcssConfig({ isProductionBuild, styles: options.styles ?? {} }) : void 0;
|
|
113
|
+
const featureConfig = getViteFeatureConfig({ features: options, isProductionBuild, postcssConfig, userConfig });
|
|
114
|
+
const config = getViteConfigDefaults(userConfig, state.buildContext);
|
|
115
|
+
return { ...featureConfig, ...config };
|
|
116
|
+
},
|
|
117
|
+
generateBundle: {
|
|
118
|
+
handler(_outputOptions, bundle) {
|
|
119
|
+
renameCssAssets(this, bundle);
|
|
120
|
+
},
|
|
121
|
+
order: "post"
|
|
122
|
+
},
|
|
123
|
+
name: "obsidian-plugin",
|
|
124
|
+
async renderStart() {
|
|
125
|
+
if (state.isDistFolderCleaned) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
state.isDistFolderCleaned = true;
|
|
129
|
+
await cleanObsidianPluginDistFolder(getBuildContext().distFolder);
|
|
130
|
+
},
|
|
131
|
+
async writeBundle() {
|
|
132
|
+
await completeObsidianPluginDistFolder(getBuildContext());
|
|
133
|
+
await deployToObsidianPluginsFolder(getBuildContext());
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
return [plugin, { ...featurePlugin, apply: "build" }, createUnpluginVuePlugin({ bundler: "vite", features: options })];
|
|
137
|
+
}
|
|
138
|
+
export {
|
|
139
|
+
getViteBuildMode,
|
|
140
|
+
getViteConfigDefaults,
|
|
141
|
+
getViteFeatureConfig,
|
|
142
|
+
obsidianPluginVite
|
|
143
|
+
};
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2J1bmRsZXJzL3ZpdGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgYW4gT2JzaWRpYW4gcGx1Z2luIHdpdGggdml0ZTogYSB2aXRlIHBsdWdpbiB0aGF0IHR1cm5zIGB2aXRlIGJ1aWxkYCBpbnRvIGEgbGlicmFyeSBidWlsZCBvZlxuICogYHNyYy9tYWluLnRzYCB3aXRoIHRoZSBzYW1lIGBtYWluLmpzYCArIGBzdHlsZXMuY3NzYCArIGBtYW5pZmVzdC5qc29uYCBsYXlvdXQgdGhlIGVzYnVpbGQgYnVpbGRlclxuICogcHJvZHVjZXMsIGRlcGxveXMgYSBgdml0ZSBidWlsZCAtLXdhdGNoYCBidWlsZCBpbnRvIHRoZSB2YXVsdCwgYW5kIGZpbGxzIGluIG9ubHkgdGhlIG9wdGlvbnMgdGhlXG4gKiBjb25zdW1lcidzIG93biBgdml0ZS5jb25maWdgIGxlYXZlcyB1bnNldC5cbiAqXG4gKiBgdml0ZWAgaXMgYW4gb3B0aW9uYWwgcGVlciBkZXBlbmRlbmN5IGFuZCB0aGlzIG1vZHVsZSBvbmx5IGltcG9ydHMgaXRzIHR5cGVzLCBzbyBhIHBsdWdpbiBidWlsdCB3aXRoXG4gKiBlc2J1aWxkIGluc3RhbGxzIG5vdGhpbmcgZXh0cmEuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBDb25maWdFbnYsXG4gIFBsdWdpbixcbiAgUGx1Z2luT3B0aW9uLFxuICBVc2VyQ29uZmlnXG59IGZyb20gJ3ZpdGUnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0LFxuICBPYnNpZGlhblBsdWdpbkRlcGxveW1lbnRPcHRpb25zXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWJ1aWxkLnRzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucyB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcbmltcG9ydCB0eXBlIHsgUG9zdGNzc0NvbmZpZyB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLXRyYW5zZm9ybXMudHMnO1xuaW1wb3J0IHR5cGUge1xuICBBc3NldEVtaXR0ZXIsXG4gIEJ1bmRsZU91dHB1dExpa2Vcbn0gZnJvbSAnLi9yb2xsdXAtY29tcGF0aWJsZS50cyc7XG5cbmltcG9ydCB7XG4gIEJ1aWxkTW9kZSxcbiAgY2xlYW5PYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIsXG4gIGNvbXBsZXRlT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyLFxuICBnZXRPYnNpZGlhblBsdWdpbkJhbm5lcixcbiAgcmVzb2x2ZU9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0XG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWJ1aWxkLnRzJztcbmltcG9ydCB7XG4gIGdldEZyYW1ld29ya0RlZmluZXMsXG4gIGdldEpzeEltcG9ydFNvdXJjZSxcbiAgaXNQb3N0Y3NzTmVlZGVkXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcbmltcG9ydCB7IGxvYWRQb3N0Y3NzQ29uZmlnIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3Jtcy50cyc7XG5pbXBvcnQgeyBkZXBsb3lUb09ic2lkaWFuUGx1Z2luc0ZvbGRlciB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2lucy1mb2xkZXItZGVwbG95bWVudC50cyc7XG5pbXBvcnQge1xuICBjcmVhdGVSb2xsdXBDb21wYXRpYmxlRmVhdHVyZVBsdWdpbixcbiAgY3JlYXRlVW5wbHVnaW5WdWVQbHVnaW5cbn0gZnJvbSAnLi9yb2xsdXAtY29tcGF0aWJsZS1mZWF0dXJlcy50cyc7XG5pbXBvcnQge1xuICBjb21iaW5lRXh0ZXJuYWwsXG4gIHJlbmFtZUNzc0Fzc2V0c1xufSBmcm9tICcuL3JvbGx1cC1jb21wYXRpYmxlLnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0Vml0ZUZlYXR1cmVDb25maWd9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFZpdGVGZWF0dXJlQ29uZmlnUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBidWlsZCBmZWF0dXJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzOiBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSBwcm9kdWN0aW9uIGJ1aWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNQcm9kdWN0aW9uQnVpbGQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBQb3N0Q1NTIHBsdWdpbnMgb2YgdGhlIGBzdHlsZXNgIG9wdGlvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBuZWVkcyBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9zdGNzc0NvbmZpZzogUG9zdGNzc0NvbmZpZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGNvbnN1bWVyJ3Mgdml0ZSBjb25maWcuXG4gICAqL1xuICByZWFkb25seSB1c2VyQ29uZmlnOiBVc2VyQ29uZmlnO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBvYnNpZGlhblBsdWdpblZpdGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2lkaWFuUGx1Z2luVml0ZU9wdGlvbnMgZXh0ZW5kcyBPYnNpZGlhblBsdWdpbkRlcGxveW1lbnRPcHRpb25zLCBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBidWlsZCBtb2RlLiBEZWZhdWx0cyB0byB7QGxpbmsgQnVpbGRNb2RlLkRldmVsb3BtZW50fSBmb3IgYHZpdGUgYnVpbGQgLS13YXRjaGAgKG9yXG4gICAqIGAtLW1vZGUgZGV2ZWxvcG1lbnRgKSBhbmQge0BsaW5rIEJ1aWxkTW9kZS5Qcm9kdWN0aW9ufSBvdGhlcndpc2UuXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogQnVpbGRNb2RlO1xufVxuXG4vKipcbiAqIFRoZSBzdGF0ZSBvbmUge0BsaW5rIG9ic2lkaWFuUGx1Z2luVml0ZX0gaW5zdGFuY2Uga2VlcHMgYWNyb3NzIHRoZSBob29rcyBvZiBhIGJ1aWxkLCBhbmQgYWNyb3NzIHRoZVxuICogcmVidWlsZHMgb2YgYSB3YXRjaC5cbiAqL1xuaW50ZXJmYWNlIE9ic2lkaWFuUGx1Z2luVml0ZVN0YXRlIHtcbiAgYnVpbGRDb250ZXh0OiBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCB8IHVuZGVmaW5lZDtcbiAgaXNEaXN0Rm9sZGVyQ2xlYW5lZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZWNpZGVzIHRoZSBidWlsZCBtb2RlIG9mIGEgdml0ZSBidWlsZCBmcm9tIHRoZSBjb25zdW1lcidzIGNvbmZpZzogZGV2ZWxvcG1lbnQgZm9yIGEgd2F0Y2ggYnVpbGQgb3IgZm9yXG4gKiBgLS1tb2RlIGRldmVsb3BtZW50YCwgcHJvZHVjdGlvbiBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHVzZXJDb25maWcgLSBUaGUgY29uc3VtZXIncyB2aXRlIGNvbmZpZy5cbiAqIEBwYXJhbSBlbnYgLSBUaGUgdml0ZSBjb25maWcgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJucyBUaGUgYnVpbGQgbW9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZpdGVCdWlsZE1vZGUodXNlckNvbmZpZzogVXNlckNvbmZpZywgZW52OiBQaWNrPENvbmZpZ0VudiwgJ21vZGUnPik6IEJ1aWxkTW9kZSB7XG4gIHJldHVybiB1c2VyQ29uZmlnLmJ1aWxkPy53YXRjaCB8fCBlbnYubW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IEJ1aWxkTW9kZS5EZXZlbG9wbWVudCA6IEJ1aWxkTW9kZS5Qcm9kdWN0aW9uO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcGFydCBvZiB0aGUgdml0ZSBjb25maWcgdGhlIHBsdWdpbiBjb250cmlidXRlczogb25seSB0aGUgb3B0aW9ucyB0aGUgY29uc3VtZXIgbGVmdCB1bnNldC5cbiAqXG4gKiBAcGFyYW0gdXNlckNvbmZpZyAtIFRoZSBjb25zdW1lcidzIHZpdGUgY29uZmlnLlxuICogQHBhcmFtIGJ1aWxkQ29udGV4dCAtIFRoZSBidWlsZCBjb250ZXh0LlxuICogQHJldHVybnMgVGhlIGNvbmZpZyB2aXRlIG1lcmdlcyBpbnRvIHRoZSBjb25zdW1lcidzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vml0ZUNvbmZpZ0RlZmF1bHRzKHVzZXJDb25maWc6IFVzZXJDb25maWcsIGJ1aWxkQ29udGV4dDogT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQpOiBVc2VyQ29uZmlnIHtcbiAgY29uc3QgYnVpbGQgPSB1c2VyQ29uZmlnLmJ1aWxkID8/IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gQSBjb25zdW1lcidzIGNvbmZpZyBtYXkgc3RpbGwgdXNlIHRoZSBkZXByZWNhdGVkIGFsaWFzLCBhbmQgdml0ZSBzdGlsbCBob25vcnMgaXQuXG4gIGNvbnN0IHJvbGxkb3duT3B0aW9ucyA9IGJ1aWxkLnJvbGxkb3duT3B0aW9ucyA/PyBidWlsZC5yb2xsdXBPcHRpb25zID8/IHt9O1xuICBjb25zdCBvdXRwdXQgPSBBcnJheS5pc0FycmF5KHJvbGxkb3duT3B0aW9ucy5vdXRwdXQpID8gdW5kZWZpbmVkIDogcm9sbGRvd25PcHRpb25zLm91dHB1dCA/PyB7fTtcblxuICByZXR1cm4ge1xuICAgIGJ1aWxkOiB7XG4gICAgICAvLyBBbiBPYnNpZGlhbiByZWxlYXNlIHNoaXBzIGBtYWluLmpzYCBhbmQgYHN0eWxlcy5jc3NgIGFuZCBub3RoaW5nIGVsc2UsIHNvIGFueSBhc3NldCBlbWl0dGVkIGJlc2lkZVxuICAgICAgLy8gdGhlIGJ1bmRsZSBpcyBhIGZpbGUgdGhlIGluc3RhbGxlZCBwbHVnaW4gbG9va3MgZm9yIGFuZCBkb2VzIG5vdCBmaW5kLlxuICAgICAgYXNzZXRzSW5saW5lTGltaXQ6IGJ1aWxkLmFzc2V0c0lubGluZUxpbWl0ID8/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGVtcHR5T3V0RGlyYCBpcyB0aGUgbmFtZSB2aXRlJ3MgY29uZmlnIHJlYWRzLlxuICAgICAgZW1wdHlPdXREaXI6IGZhbHNlLFxuICAgICAgbGliOiBidWlsZC5saWIgPz8ge1xuICAgICAgICBjc3NGaWxlTmFtZTogJ3N0eWxlcycsXG4gICAgICAgIGVudHJ5OiBidWlsZENvbnRleHQuZW50cnlQb2ludCxcbiAgICAgICAgZmlsZU5hbWU6ICgpOiBzdHJpbmcgPT4gJ21haW4uanMnLFxuICAgICAgICBmb3JtYXRzOiBbJ2NqcyddXG4gICAgICB9LFxuICAgICAgbWluaWZ5OiBidWlsZC5taW5pZnkgPz8gYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYG91dERpcmAgaXMgdGhlIG5hbWUgdml0ZSdzIGNvbmZpZyByZWFkcy5cbiAgICAgIG91dERpcjogYnVpbGRDb250ZXh0LmRpc3RGb2xkZXIsXG4gICAgICByb2xsZG93bk9wdGlvbnM6IHtcbiAgICAgICAgZXh0ZXJuYWw6IGNvbWJpbmVFeHRlcm5hbChyb2xsZG93bk9wdGlvbnMuZXh0ZXJuYWwpLFxuICAgICAgICAuLi4ob3V0cHV0ICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICAgIG91dHB1dDoge1xuICAgICAgICAgICAgLy8gYHBvc3RCYW5uZXJgIHJhdGhlciB0aGFuIGBiYW5uZXJgOiBpdCBpcyBhZGRlZCBhZnRlciBtaW5pZmljYXRpb24sIHdoaWNoIHN0cmlwcyBhbiBvcmRpbmFyeSBjb21tZW50LlxuICAgICAgICAgICAgLi4uKG91dHB1dC5iYW5uZXIgPT09IHVuZGVmaW5lZCAmJiBvdXRwdXQucG9zdEJhbm5lciA9PT0gdW5kZWZpbmVkICYmIHsgcG9zdEJhbm5lcjogZ2V0T2JzaWRpYW5QbHVnaW5CYW5uZXIoJ3ZpdGUnKSB9KSxcbiAgICAgICAgICAgIC8vIEFuIE9ic2lkaWFuIHBsdWdpbiBpcyBvbmUgZmlsZTogdGhlIG1hbmlmZXN0IG5hbWVzIGBtYWluLmpzYCBhbmQgbm90aGluZyBsb2FkcyBhIHNlY29uZCBjaHVuay5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSBBIGNvbnN1bWVyJ3MgY29uZmlnIG1heSBzdGlsbCBzZXQgdGhlIGRlcHJlY2F0ZWQgb3B0aW9uLCB3aGljaCB0aGVuIHdpbnMuXG4gICAgICAgICAgICAuLi4ob3V0cHV0LmNvZGVTcGxpdHRpbmcgPT09IHVuZGVmaW5lZCAmJiBvdXRwdXQuaW5saW5lRHluYW1pY0ltcG9ydHMgPT09IHVuZGVmaW5lZCAmJiB7IGNvZGVTcGxpdHRpbmc6IGZhbHNlIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHNvdXJjZW1hcDogYnVpbGQuc291cmNlbWFwID8/ICghYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkICYmICdpbmxpbmUnKVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHBhcnQgb2YgdGhlIHZpdGUgY29uZmlnIHRoZSBidWlsZCBmZWF0dXJlcyBjb250cmlidXRlLCBlYWNoIG9ubHkgd2hlcmUgdGhlIGNvbnN1bWVyJ3MgY29uZmlnIGxlZnQgaXRcbiAqIHVuc2V0OiB0aGUgZnJhbWV3b3JrJ3MgY29tcGlsZS10aW1lIGNvbnN0YW50cyAoYGRlZmluZWApLCB0aGUgYXV0b21hdGljIEpTWCBydW50aW1lIGZvciBSZWFjdCBhbmQgUHJlYWN0XG4gKiAoYG94Yy5qc3hgKSwgYW5kIHRoZSBQb3N0Q1NTIHBsdWdpbnMgb2YgdGhlIGBzdHlsZXNgIG9wdGlvbiAoYGNzcy5wb3N0Y3NzYCkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgR2V0Vml0ZUZlYXR1cmVDb25maWdQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGNvbmZpZyB2aXRlIG1lcmdlcyBpbnRvIHRoZSBjb25zdW1lcidzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vml0ZUZlYXR1cmVDb25maWcocGFyYW1zOiBHZXRWaXRlRmVhdHVyZUNvbmZpZ1BhcmFtcyk6IFVzZXJDb25maWcge1xuICBjb25zdCB7IGZlYXR1cmVzLCBpc1Byb2R1Y3Rpb25CdWlsZCwgcG9zdGNzc0NvbmZpZywgdXNlckNvbmZpZyB9ID0gcGFyYW1zO1xuICBjb25zdCBjb25maWc6IFVzZXJDb25maWcgPSB7fTtcblxuICBjb25zdCB1c2VyRGVmaW5lID0gdXNlckNvbmZpZy5kZWZpbmUgPz8ge307XG4gIGNvbnN0IGRlZmluZSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhnZXRGcmFtZXdvcmtEZWZpbmVzKHsgZnJhbWV3b3JrOiBmZWF0dXJlcy5mcmFtZXdvcmssIGlzUHJvZHVjdGlvbkJ1aWxkIH0pKS5maWx0ZXIoKFtleHByZXNzaW9uXSkgPT4gIU9iamVjdC5oYXNPd24odXNlckRlZmluZSwgZXhwcmVzc2lvbikpXG4gICk7XG4gIGlmIChPYmplY3Qua2V5cyhkZWZpbmUpLmxlbmd0aCA+IDApIHtcbiAgICBjb25maWcuZGVmaW5lID0gZGVmaW5lO1xuICB9XG5cbiAgY29uc3QganN4SW1wb3J0U291cmNlID0gZ2V0SnN4SW1wb3J0U291cmNlKGZlYXR1cmVzLmZyYW1ld29yayk7XG4gIGlmIChqc3hJbXBvcnRTb3VyY2UgIT09IHVuZGVmaW5lZCAmJiB1c2VyQ29uZmlnLm94YyAhPT0gZmFsc2UgJiYgdXNlckNvbmZpZy5veGM/LmpzeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZmlnLm94YyA9IHsganN4OiB7IGRldmVsb3BtZW50OiAhaXNQcm9kdWN0aW9uQnVpbGQsIGltcG9ydFNvdXJjZToganN4SW1wb3J0U291cmNlLCBydW50aW1lOiAnYXV0b21hdGljJyB9IH07XG4gIH1cblxuICBpZiAocG9zdGNzc0NvbmZpZyAmJiBwb3N0Y3NzQ29uZmlnLnBsdWdpbnMubGVuZ3RoID4gMCAmJiB1c2VyQ29uZmlnLmNzcz8ucG9zdGNzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZmlnLmNzcyA9IHsgcG9zdGNzczogeyBwbHVnaW5zOiBbLi4ucG9zdGNzc0NvbmZpZy5wbHVnaW5zXSB9IH07XG4gIH1cbiAgcmV0dXJuIGNvbmZpZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdml0ZSBwbHVnaW4gdGhhdCBidWlsZHMgYW4gT2JzaWRpYW4gcGx1Z2luLlxuICpcbiAqIFdoYXQgaXQgZG9lcywgZWFjaCBvbmx5IHdoZW4gdGhlIGNvbnN1bWVyJ3MgY29uZmlnIGhhcyBub3Qgc2FpZCBvdGhlcndpc2U6XG4gKlxuICogLSBgYnVpbGQubGliYCBidWlsZHMgYHNyYy9tYWluLnRzYCBhcyBvbmUgQ29tbW9uSlMgYG1haW4uanNgLCB3aXRoIGl0cyBDU1MgaW4gYHN0eWxlcy5jc3NgLlxuICogLSBgYnVpbGQub3V0RGlyYCBpcyBgZGlzdC9idWlsZGAgKGBkaXN0L2RldmAgaW4gZGV2ZWxvcG1lbnQpLlxuICogLSBgYnVpbGQubWluaWZ5YCBpcyBvbiBpbiBwcm9kdWN0aW9uIG9ubHksIGFuZCBgYnVpbGQuc291cmNlbWFwYCBpcyBpbmxpbmUgaW4gZGV2ZWxvcG1lbnQgb25seS5cbiAqIC0gRXZlcnkgYXNzZXQgaXMgaW5saW5lZCwgYmVjYXVzZSBhbiBPYnNpZGlhbiByZWxlYXNlIHNoaXBzIGBtYWluLmpzYCBhbmQgYHN0eWxlcy5jc3NgIGFuZCBub3RoaW5nIGVsc2UuXG4gKiAtIER5bmFtaWMgaW1wb3J0cyBhcmUgaW5saW5lZCBpbnRvIGBtYWluLmpzYCwgYW5kIHRoZSBnZW5lcmF0ZWQtZmlsZSBiYW5uZXIgaGVhZHMgaXQuXG4gKlxuICogQW5kIGFsd2F5czogT2JzaWRpYW4ncyBvd24gbW9kdWxlcyAoYG9ic2lkaWFuYCwgYGVsZWN0cm9uYCwgQ29kZU1pcnJvciwgTGV6ZXIpIGFuZCB0aGUgTm9kZSBidWlsdGlucyBhcmVcbiAqIGV4dGVybmFsIGJlc2lkZSB0aGUgY29uc3VtZXIncyBvd24gYGV4dGVybmFsYCwgdGhlIG91dHB1dCBmb2xkZXIgaXMgZW1wdGllZCBvbmNlIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGVcbiAqIChgYnVpbGQuZW1wdHlPdXREaXJgIGlzIHR1cm5lZCBvZmYsIHNpbmNlIHRoaXMgcGx1Z2luIGRvZXMgaXQpLCBldmVyeSBlbWl0dGVkIENTUyBmaWxlIGVuZHMgdXAgaW5cbiAqIGBzdHlsZXMuY3NzYCwgYG1hbmlmZXN0Lmpzb25gIChhbmQgaW4gZGV2ZWxvcG1lbnQgYC5ob3RyZWxvYWRgKSBpcyBjb3BpZWQgYmVzaWRlIGl0LCBhbmQgYSBkZXZlbG9wbWVudFxuICogYnVpbGQgaXMgZGVwbG95ZWQgaW50byB0aGUgdmF1bHQgbmFtZWQgYnkgYE9CU0lESUFOX0NPTkZJR19GT0xERVJgLlxuICpcbiAqIFRoZSBidWlsZCBmZWF0dXJlcyAoe0BsaW5rIE9ic2lkaWFuUGx1Z2luRmVhdHVyZU9wdGlvbnN9KTpcbiAqXG4gKiAtIGBmcmFtZXdvcms6ICdyZWFjdCcgfCAncHJlYWN0J2Agc2V0cyBgb3hjLmpzeGAgdG8gdGhlIGF1dG9tYXRpYyBydW50aW1lICh1bmxlc3Mgc2V0KS5cbiAqIC0gYGZyYW1ld29yazogJ3NvbGlkJyB8ICdzdmVsdGUnYCBjb21waWxlcyB0aGUgY29tcG9uZW50cyB3aXRoIHRoZSB0b29sa2l0J3Mgc2hhcmVkIHRyYW5zZm9ybXMsIGFuZCBgJ3Z1ZSdgIGFkZHNcbiAqICAgYHVucGx1Z2luLXZ1ZWAuXG4gKiAtIEFueSBmcmFtZXdvcmsgZGVmaW5lcyBgcHJvY2Vzcy5lbnYuTk9ERV9FTlZgIChhbmQgVnVlJ3MgZmVhdHVyZSBmbGFncyksIHdoaWNoIGEgbGlicmFyeSBidWlsZCBsZWF2ZXMgYWxvbmUuXG4gKiAtIGBzdHlsZXMucG9zdGNzc2AgYW5kIGBzdHlsZXMudGFpbHdpbmRgIHNldCBgY3NzLnBvc3Rjc3NgICh1bmxlc3Mgc2V0KTsgdml0ZSBzY29wZXMgYCoubW9kdWxlLmNzc2AgaXRzZWxmLCBzb1xuICogICBgc3R5bGVzLmNzc01vZHVsZXNgIGNoYW5nZXMgbm90aGluZyBoZXJlLlxuICogLSBgd2FzbWAgaW1wb3J0cyBhIGAud2FzbWAgbW9kdWxlIGFzIGl0cyBieXRlcy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgT2JzaWRpYW5QbHVnaW5WaXRlT3B0aW9uc30uXG4gKiBAcmV0dXJucyBUaGUgdml0ZSBwbHVnaW5zLCB3aGljaCB2aXRlIHRha2VzIGFzIG9uZSBlbnRyeSBvZiBpdHMgYHBsdWdpbnNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JzaWRpYW5QbHVnaW5WaXRlKG9wdGlvbnM6IE9ic2lkaWFuUGx1Z2luVml0ZU9wdGlvbnMgPSB7fSk6IFBsdWdpbk9wdGlvbltdIHtcbiAgY29uc3Qgc3RhdGU6IE9ic2lkaWFuUGx1Z2luVml0ZVN0YXRlID0ge1xuICAgIGJ1aWxkQ29udGV4dDogdW5kZWZpbmVkLFxuICAgIGlzRGlzdEZvbGRlckNsZWFuZWQ6IGZhbHNlXG4gIH07XG5cbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIFZpdGUgaG9va3M7IGV4ZXJjaXNlZCBieSB0aGUgYnVuZGxlciBpbnRlZ3JhdGlvbiB0ZXN0IGFnYWluc3QgYSByZWFsIHZpdGUgYnVpbGQuICovXG4gIGZ1bmN0aW9uIGdldEJ1aWxkQ29udGV4dCgpOiBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCB7XG4gICAgaWYgKCFzdGF0ZS5idWlsZENvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIG9ic2lkaWFuLXBsdWdpbiB2aXRlIHBsdWdpbiBoYXMgbm90IHJlc29sdmVkIGl0cyBidWlsZCBjb250ZXh0OiBpdHMgYGNvbmZpZ2AgaG9vayBkaWQgbm90IHJ1bi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLmJ1aWxkQ29udGV4dDtcbiAgfVxuXG4gIGNvbnN0IGZlYXR1cmVQbHVnaW4gPSBjcmVhdGVSb2xsdXBDb21wYXRpYmxlRmVhdHVyZVBsdWdpbih7XG4gICAgZmVhdHVyZXM6IG9wdGlvbnMsXG4gICAgaXNQcm9kdWN0aW9uQnVpbGQ6ICgpID0+IGdldEJ1aWxkQ29udGV4dCgpLmlzUHJvZHVjdGlvbkJ1aWxkLFxuICAgIHNob3VsZENvbXBpbGVTdHlsZXNoZWV0czogZmFsc2UsXG4gICAgc2hvdWxkUmVwbGFjZURlZmluZXM6IGZhbHNlXG4gIH0pO1xuXG4gIGNvbnN0IHBsdWdpbiA9IHtcbiAgICBhcHBseTogJ2J1aWxkJyxcbiAgICBhc3luYyBjb25maWcodXNlckNvbmZpZzogVXNlckNvbmZpZywgZW52OiBDb25maWdFbnYpOiBQcm9taXNlPFVzZXJDb25maWc+IHtcbiAgICAgIHN0YXRlLmJ1aWxkQ29udGV4dCA9IGF3YWl0IHJlc29sdmVPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCh7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIC4uLih1c2VyQ29uZmlnLmJ1aWxkPy5vdXREaXIgIT09IHVuZGVmaW5lZCAmJiB7IGRpc3RGb2xkZXI6IHVzZXJDb25maWcuYnVpbGQub3V0RGlyIH0pLFxuICAgICAgICBtb2RlOiBvcHRpb25zLm1vZGUgPz8gZ2V0Vml0ZUJ1aWxkTW9kZSh1c2VyQ29uZmlnLCBlbnYpXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsgaXNQcm9kdWN0aW9uQnVpbGQgfSA9IHN0YXRlLmJ1aWxkQ29udGV4dDtcbiAgICAgIGNvbnN0IHBvc3Rjc3NDb25maWcgPSBpc1Bvc3Rjc3NOZWVkZWQob3B0aW9ucy5zdHlsZXMpXG4gICAgICAgID8gYXdhaXQgbG9hZFBvc3Rjc3NDb25maWcoeyBpc1Byb2R1Y3Rpb25CdWlsZCwgc3R5bGVzOiBvcHRpb25zLnN0eWxlcyA/PyB7fSB9KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGZlYXR1cmVDb25maWcgPSBnZXRWaXRlRmVhdHVyZUNvbmZpZyh7IGZlYXR1cmVzOiBvcHRpb25zLCBpc1Byb2R1Y3Rpb25CdWlsZCwgcG9zdGNzc0NvbmZpZywgdXNlckNvbmZpZyB9KTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGdldFZpdGVDb25maWdEZWZhdWx0cyh1c2VyQ29uZmlnLCBzdGF0ZS5idWlsZENvbnRleHQpO1xuICAgICAgcmV0dXJuIHsgLi4uZmVhdHVyZUNvbmZpZywgLi4uY29uZmlnIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZUJ1bmRsZToge1xuICAgICAgaGFuZGxlcih0aGlzOiBBc3NldEVtaXR0ZXIsIF9vdXRwdXRPcHRpb25zOiB1bmtub3duLCBidW5kbGU6IFJlY29yZDxzdHJpbmcsIEJ1bmRsZU91dHB1dExpa2U+KTogdm9pZCB7XG4gICAgICAgIHJlbmFtZUNzc0Fzc2V0cyh0aGlzLCBidW5kbGUpO1xuICAgICAgfSxcbiAgICAgIG9yZGVyOiAncG9zdCdcbiAgICB9LFxuICAgIG5hbWU6ICdvYnNpZGlhbi1wbHVnaW4nLFxuICAgIGFzeW5jIHJlbmRlclN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgaWYgKHN0YXRlLmlzRGlzdEZvbGRlckNsZWFuZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc3RhdGUuaXNEaXN0Rm9sZGVyQ2xlYW5lZCA9IHRydWU7XG4gICAgICBhd2FpdCBjbGVhbk9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcihnZXRCdWlsZENvbnRleHQoKS5kaXN0Rm9sZGVyKTtcbiAgICB9LFxuICAgIGFzeW5jIHdyaXRlQnVuZGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgY29tcGxldGVPYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIoZ2V0QnVpbGRDb250ZXh0KCkpO1xuICAgICAgYXdhaXQgZGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXIoZ2V0QnVpbGRDb250ZXh0KCkpO1xuICAgIH1cbiAgfSBhcyBQbHVnaW47XG4gIHJldHVybiBbcGx1Z2luLCB7IC4uLmZlYXR1cmVQbHVnaW4sIGFwcGx5OiAnYnVpbGQnIH0gYXMgUGx1Z2luLCBjcmVhdGVVbnBsdWdpblZ1ZVBsdWdpbih7IGJ1bmRsZXI6ICd2aXRlJywgZmVhdHVyZXM6IG9wdGlvbnMgfSkgYXMgUHJvbWlzZTxudWxsIHwgUGx1Z2luPl07XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQThCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMscUNBQXFDO0FBQzlDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUF1REEsU0FBUyxpQkFBaUIsWUFBd0IsS0FBeUM7QUFDaEcsU0FBTyxXQUFXLE9BQU8sU0FBUyxJQUFJLFNBQVMsZ0JBQWdCLFVBQVUsY0FBYyxVQUFVO0FBQ25HO0FBU08sU0FBUyxzQkFBc0IsWUFBd0IsY0FBc0Q7QUFDbEgsUUFBTSxRQUFRLFdBQVcsU0FBUyxDQUFDO0FBRW5DLFFBQU0sa0JBQWtCLE1BQU0sbUJBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFDekUsUUFBTSxTQUFTLE1BQU0sUUFBUSxnQkFBZ0IsTUFBTSxJQUFJLFNBQVksZ0JBQWdCLFVBQVUsQ0FBQztBQUU5RixTQUFPO0FBQUEsSUFDTCxPQUFPO0FBQUE7QUFBQTtBQUFBLE1BR0wsbUJBQW1CLE1BQU0scUJBQXFCLE9BQU87QUFBQTtBQUFBLE1BRXJELGFBQWE7QUFBQSxNQUNiLEtBQUssTUFBTSxPQUFPO0FBQUEsUUFDaEIsYUFBYTtBQUFBLFFBQ2IsT0FBTyxhQUFhO0FBQUEsUUFDcEIsVUFBVSxNQUFjO0FBQUEsUUFDeEIsU0FBUyxDQUFDLEtBQUs7QUFBQSxNQUNqQjtBQUFBLE1BQ0EsUUFBUSxNQUFNLFVBQVUsYUFBYTtBQUFBO0FBQUEsTUFFckMsUUFBUSxhQUFhO0FBQUEsTUFDckIsaUJBQWlCO0FBQUEsUUFDZixVQUFVLGdCQUFnQixnQkFBZ0IsUUFBUTtBQUFBLFFBQ2xELEdBQUksV0FBVyxVQUFhO0FBQUEsVUFDMUIsUUFBUTtBQUFBO0FBQUEsWUFFTixHQUFJLE9BQU8sV0FBVyxVQUFhLE9BQU8sZUFBZSxVQUFhLEVBQUUsWUFBWSx3QkFBd0IsTUFBTSxFQUFFO0FBQUE7QUFBQTtBQUFBLFlBR3BILEdBQUksT0FBTyxrQkFBa0IsVUFBYSxPQUFPLHlCQUF5QixVQUFhLEVBQUUsZUFBZSxNQUFNO0FBQUEsVUFDaEg7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLE1BQ0EsV0FBVyxNQUFNLGNBQWMsQ0FBQyxhQUFhLHFCQUFxQjtBQUFBLElBQ3BFO0FBQUEsRUFDRjtBQUNGO0FBVU8sU0FBUyxxQkFBcUIsUUFBZ0Q7QUFDbkYsUUFBTSxFQUFFLFVBQVUsbUJBQW1CLGVBQWUsV0FBVyxJQUFJO0FBQ25FLFFBQU0sU0FBcUIsQ0FBQztBQUU1QixRQUFNLGFBQWEsV0FBVyxVQUFVLENBQUM7QUFDekMsUUFBTSxTQUFTLE9BQU87QUFBQSxJQUNwQixPQUFPLFFBQVEsb0JBQW9CLEVBQUUsV0FBVyxTQUFTLFdBQVcsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFVBQVUsTUFBTSxDQUFDLE9BQU8sT0FBTyxZQUFZLFVBQVUsQ0FBQztBQUFBLEVBQzNKO0FBQ0EsTUFBSSxPQUFPLEtBQUssTUFBTSxFQUFFLFNBQVMsR0FBRztBQUNsQyxXQUFPLFNBQVM7QUFBQSxFQUNsQjtBQUVBLFFBQU0sa0JBQWtCLG1CQUFtQixTQUFTLFNBQVM7QUFDN0QsTUFBSSxvQkFBb0IsVUFBYSxXQUFXLFFBQVEsU0FBUyxXQUFXLEtBQUssUUFBUSxRQUFXO0FBQ2xHLFdBQU8sTUFBTSxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsbUJBQW1CLGNBQWMsaUJBQWlCLFNBQVMsWUFBWSxFQUFFO0FBQUEsRUFDL0c7QUFFQSxNQUFJLGlCQUFpQixjQUFjLFFBQVEsU0FBUyxLQUFLLFdBQVcsS0FBSyxZQUFZLFFBQVc7QUFDOUYsV0FBTyxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxHQUFHLGNBQWMsT0FBTyxFQUFFLEVBQUU7QUFBQSxFQUNsRTtBQUNBLFNBQU87QUFDVDtBQWdDTyxTQUFTLG1CQUFtQixVQUFxQyxDQUFDLEdBQW1CO0FBQzFGLFFBQU0sUUFBaUM7QUFBQSxJQUNyQyxjQUFjO0FBQUEsSUFDZCxxQkFBcUI7QUFBQSxFQUN2QjtBQUdBLFdBQVMsa0JBQThDO0FBQ3JELFFBQUksQ0FBQyxNQUFNLGNBQWM7QUFDdkIsWUFBTSxJQUFJLE1BQU0sb0dBQW9HO0FBQUEsSUFDdEg7QUFDQSxXQUFPLE1BQU07QUFBQSxFQUNmO0FBRUEsUUFBTSxnQkFBZ0Isb0NBQW9DO0FBQUEsSUFDeEQsVUFBVTtBQUFBLElBQ1YsbUJBQW1CLE1BQU0sZ0JBQWdCLEVBQUU7QUFBQSxJQUMzQywwQkFBMEI7QUFBQSxJQUMxQixzQkFBc0I7QUFBQSxFQUN4QixDQUFDO0FBRUQsUUFBTSxTQUFTO0FBQUEsSUFDYixPQUFPO0FBQUEsSUFDUCxNQUFNLE9BQU8sWUFBd0IsS0FBcUM7QUFDeEUsWUFBTSxlQUFlLE1BQU0sa0NBQWtDO0FBQUEsUUFDM0QsR0FBRztBQUFBLFFBQ0gsR0FBSSxXQUFXLE9BQU8sV0FBVyxVQUFhLEVBQUUsWUFBWSxXQUFXLE1BQU0sT0FBTztBQUFBLFFBQ3BGLE1BQU0sUUFBUSxRQUFRLGlCQUFpQixZQUFZLEdBQUc7QUFBQSxNQUN4RCxDQUFDO0FBQ0QsWUFBTSxFQUFFLGtCQUFrQixJQUFJLE1BQU07QUFDcEMsWUFBTSxnQkFBZ0IsZ0JBQWdCLFFBQVEsTUFBTSxJQUNoRCxNQUFNLGtCQUFrQixFQUFFLG1CQUFtQixRQUFRLFFBQVEsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUMzRTtBQUNKLFlBQU0sZ0JBQWdCLHFCQUFxQixFQUFFLFVBQVUsU0FBUyxtQkFBbUIsZUFBZSxXQUFXLENBQUM7QUFDOUcsWUFBTSxTQUFTLHNCQUFzQixZQUFZLE1BQU0sWUFBWTtBQUNuRSxhQUFPLEVBQUUsR0FBRyxlQUFlLEdBQUcsT0FBTztBQUFBLElBQ3ZDO0FBQUEsSUFDQSxnQkFBZ0I7QUFBQSxNQUNkLFFBQTRCLGdCQUF5QixRQUFnRDtBQUNuRyx3QkFBZ0IsTUFBTSxNQUFNO0FBQUEsTUFDOUI7QUFBQSxNQUNBLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxNQUFNO0FBQUEsSUFDTixNQUFNLGNBQTZCO0FBQ2pDLFVBQUksTUFBTSxxQkFBcUI7QUFDN0I7QUFBQSxNQUNGO0FBQ0EsWUFBTSxzQkFBc0I7QUFDNUIsWUFBTSw4QkFBOEIsZ0JBQWdCLEVBQUUsVUFBVTtBQUFBLElBQ2xFO0FBQUEsSUFDQSxNQUFNLGNBQTZCO0FBQ2pDLFlBQU0saUNBQWlDLGdCQUFnQixDQUFDO0FBQ3hELFlBQU0sOEJBQThCLGdCQUFnQixDQUFDO0FBQUEsSUFDdkQ7QUFBQSxFQUNGO0FBQ0EsU0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLGVBQWUsT0FBTyxRQUFRLEdBQWEsd0JBQXdCLEVBQUUsU0FBUyxRQUFRLFVBQVUsUUFBUSxDQUFDLENBQTJCO0FBRTNKOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Builds an Obsidian plugin with webpack: a webpack plugin that gives a build the same `main.js` +
|
|
6
|
+
* `styles.css` + `manifest.json` layout the esbuild builder produces, deploys a watch build into the vault,
|
|
7
|
+
* and fills in only the options the consumer's own `webpack.config` leaves unset.
|
|
8
|
+
*
|
|
9
|
+
* `webpack` is an optional peer dependency. This module only imports its types and reaches webpack's
|
|
10
|
+
* classes through `compiler.webpack`, so a plugin built with esbuild installs nothing extra.
|
|
11
|
+
*/
|
|
12
|
+
import type { Compiler, RuleSetRule, WebpackOptionsNormalized, WebpackPluginInstance } from 'webpack';
|
|
13
|
+
import type { ObsidianPluginDeploymentOptions } from './obsidian-plugin-build.mjs';
|
|
14
|
+
import type { ObsidianPluginFeatureOptions } from './obsidian-plugin-features.mjs';
|
|
15
|
+
import { BuildMode } from './obsidian-plugin-build.mjs';
|
|
16
|
+
/**
|
|
17
|
+
* Parameters for {@link getWebpackFeatureRules}.
|
|
18
|
+
*/
|
|
19
|
+
export interface GetWebpackFeatureRulesParams {
|
|
20
|
+
/**
|
|
21
|
+
* The path of `css-loader`, for the stylesheet rule.
|
|
22
|
+
*/
|
|
23
|
+
readonly cssLoaderPath: string;
|
|
24
|
+
/**
|
|
25
|
+
* The build features.
|
|
26
|
+
*/
|
|
27
|
+
readonly features: ObsidianPluginFeatureOptions;
|
|
28
|
+
/**
|
|
29
|
+
* Whether this is a production build.
|
|
30
|
+
*/
|
|
31
|
+
readonly isProductionBuild: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* The path of the toolkit's own loader.
|
|
34
|
+
*/
|
|
35
|
+
readonly loaderPath: string;
|
|
36
|
+
/**
|
|
37
|
+
* The path of `mini-css-extract-plugin`'s loader, for the stylesheet rule.
|
|
38
|
+
*/
|
|
39
|
+
readonly miniCssExtractLoaderPath: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Options for {@link ObsidianPluginWebpackPlugin}.
|
|
43
|
+
*/
|
|
44
|
+
export interface ObsidianPluginWebpackPluginOptions extends ObsidianPluginDeploymentOptions, ObsidianPluginFeatureOptions {
|
|
45
|
+
/**
|
|
46
|
+
* The build mode. Defaults to {@link BuildMode.Development} when webpack watches (`webpack --watch`) or
|
|
47
|
+
* its `mode` is `development`, and {@link BuildMode.Production} otherwise.
|
|
48
|
+
*/
|
|
49
|
+
readonly mode?: BuildMode;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The callback webpack's function form of `externals` takes.
|
|
53
|
+
*/
|
|
54
|
+
type ExternalsCallback = (error?: Error | null, result?: string) => void;
|
|
55
|
+
/**
|
|
56
|
+
* The argument webpack's function form of `externals` receives.
|
|
57
|
+
*/
|
|
58
|
+
interface ExternalsData {
|
|
59
|
+
readonly request?: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* A webpack plugin that builds an Obsidian plugin.
|
|
63
|
+
*
|
|
64
|
+
* What it does, each only when the consumer's config has not said otherwise:
|
|
65
|
+
*
|
|
66
|
+
* - `entry` is `src/main.ts`, and `mode` follows the build mode.
|
|
67
|
+
* - The output is one CommonJS (`commonjs2`) `main.js` in `dist/build` (`dist/dev` in development), with no
|
|
68
|
+
* async chunks, so a dynamic import cannot become a sibling file.
|
|
69
|
+
* - `target` is `node`, which is what Obsidian's renderer runs, so Node builtins resolve, while the export
|
|
70
|
+
* conditions are the browser's (`browser`, `webpack`, the mode, `module`, `import`, `require`, and never `node`),
|
|
71
|
+
* so packages hand over their browser builds, as on mobile they must.
|
|
72
|
+
* - `devtool` is an inline source map in development only.
|
|
73
|
+
*
|
|
74
|
+
* And always: Obsidian's own modules (`obsidian`, `electron`, CodeMirror, Lezer) and the Node builtins are
|
|
75
|
+
* external beside the consumer's own `externals`, the generated-file banner heads `main.js`, license
|
|
76
|
+
* comments a minimizer extracted into `main.js.LICENSE.txt` (which no Obsidian release ships) are put back
|
|
77
|
+
* into `main.js`, the output folder is emptied before the first build, every emitted CSS file ends up in
|
|
78
|
+
* `styles.css`, `manifest.json` (and in development `.hotreload`) is copied beside it, and a development
|
|
79
|
+
* build is deployed into the vault named by `OBSIDIAN_CONFIG_FOLDER`.
|
|
80
|
+
*
|
|
81
|
+
* TypeScript stays the consumer's choice of loader, as it would be without this plugin. The build features
|
|
82
|
+
* ({@link ObsidianPluginFeatureOptions}) are the plugin's:
|
|
83
|
+
*
|
|
84
|
+
* - `framework: 'react' | 'preact'` needs nothing here: the TypeScript loader reads the automatic JSX runtime from the
|
|
85
|
+
* toolkit's tsconfig preset, and webpack's `mode` defines `process.env.NODE_ENV`.
|
|
86
|
+
* - `framework: 'solid' | 'svelte'` adds rules that compile the components with the toolkit's shared transforms, and
|
|
87
|
+
* `'vue'` applies `unplugin-vue` and defines Vue's feature flags.
|
|
88
|
+
* - `styles` adds the one rule every stylesheet goes through (PostCSS and Tailwind, then `css-loader`, scoping
|
|
89
|
+
* `*.module.css` only with `cssModules`, then `mini-css-extract-plugin`), and applies `mini-css-extract-plugin`
|
|
90
|
+
* unless the config already does; leave your own `.css` rule out. `styles: {}` compiles plain CSS.
|
|
91
|
+
* - `wasm` imports a `.wasm` module as its bytes.
|
|
92
|
+
*/
|
|
93
|
+
export declare class ObsidianPluginWebpackPlugin implements WebpackPluginInstance {
|
|
94
|
+
private readonly options;
|
|
95
|
+
/**
|
|
96
|
+
* Creates the plugin.
|
|
97
|
+
*
|
|
98
|
+
* @param options - The {@link ObsidianPluginWebpackPluginOptions}.
|
|
99
|
+
*/
|
|
100
|
+
constructor(options?: ObsidianPluginWebpackPluginOptions);
|
|
101
|
+
/**
|
|
102
|
+
* Applies the plugin to a webpack compiler.
|
|
103
|
+
*
|
|
104
|
+
* @param compiler - The webpack compiler.
|
|
105
|
+
*/
|
|
106
|
+
apply(compiler: Compiler): void;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Decides the build mode of a webpack build from the consumer's config: development when webpack watches
|
|
110
|
+
* or its `mode` is `development`, production otherwise.
|
|
111
|
+
*
|
|
112
|
+
* @param options - The normalized webpack options.
|
|
113
|
+
* @returns The build mode.
|
|
114
|
+
*/
|
|
115
|
+
export declare function getWebpackBuildMode(options: Pick<WebpackOptionsNormalized, 'mode' | 'watch'>): BuildMode;
|
|
116
|
+
/**
|
|
117
|
+
* Builds the module rules the build features add, each running the toolkit's own loader: Solid's JSX before the
|
|
118
|
+
* project's TypeScript loader, Svelte components and modules, `.wasm` modules as JavaScript, and with `styles` the
|
|
119
|
+
* stylesheet rule.
|
|
120
|
+
*
|
|
121
|
+
* @param params - The {@link GetWebpackFeatureRulesParams}.
|
|
122
|
+
* @returns The rules, empty when no feature needs one.
|
|
123
|
+
*/
|
|
124
|
+
export declare function getWebpackFeatureRules(params: GetWebpackFeatureRulesParams): RuleSetRule[];
|
|
125
|
+
/**
|
|
126
|
+
* Tells webpack's function form of `externals` to leave Obsidian's modules and the Node builtins to
|
|
127
|
+
* `require()`.
|
|
128
|
+
*
|
|
129
|
+
* @param data - The request webpack is resolving.
|
|
130
|
+
* @param callback - The callback to answer through.
|
|
131
|
+
*/
|
|
132
|
+
export declare function obsidianPluginWebpackExternals(data: ExternalsData, callback: ExternalsCallback): void;
|
|
133
|
+
export {};
|
|
@@ -0,0 +1,259 @@
|
|
|
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 { extractDefaultExportInterop } from "@mnaoumov/typescript-lib/object-utils";
|
|
34
|
+
import { extname } from "@mnaoumov/typescript-lib/path";
|
|
35
|
+
import { fileURLToPath } from "node:url";
|
|
36
|
+
import { ObsidianPluginRepoPaths } from "../obsidian-plugin-repo-paths.mjs";
|
|
37
|
+
import {
|
|
38
|
+
BuildMode,
|
|
39
|
+
cleanObsidianPluginDistFolder,
|
|
40
|
+
completeObsidianPluginDistFolder,
|
|
41
|
+
getObsidianPluginBanner,
|
|
42
|
+
getObsidianPluginDistFolder,
|
|
43
|
+
getObsidianPluginEntryPoint,
|
|
44
|
+
isCssFileName,
|
|
45
|
+
isObsidianPluginExternal,
|
|
46
|
+
mergeCssAssets,
|
|
47
|
+
resolveObsidianPluginBuildContext
|
|
48
|
+
} from "./obsidian-plugin-build.mjs";
|
|
49
|
+
import {
|
|
50
|
+
getFrameworkDefines,
|
|
51
|
+
isPostcssNeeded,
|
|
52
|
+
requireOptionalPeer,
|
|
53
|
+
resolveOptionalPeer
|
|
54
|
+
} from "./obsidian-plugin-features.mjs";
|
|
55
|
+
import { deployToObsidianPluginsFolder } from "./obsidian-plugins-folder-deployment.mjs";
|
|
56
|
+
const PLUGIN_NAME = "ObsidianPluginWebpackPlugin";
|
|
57
|
+
const MINI_CSS_EXTRACT_PLUGIN = "mini-css-extract-plugin";
|
|
58
|
+
class ObsidianPluginWebpackPlugin {
|
|
59
|
+
/**
|
|
60
|
+
* Creates the plugin.
|
|
61
|
+
*
|
|
62
|
+
* @param options - The {@link ObsidianPluginWebpackPluginOptions}.
|
|
63
|
+
*/
|
|
64
|
+
constructor(options = {}) {
|
|
65
|
+
this.options = options;
|
|
66
|
+
}
|
|
67
|
+
options;
|
|
68
|
+
/* v8 ignore start -- Webpack hooks; exercised by the bundler integration test against a real webpack build. */
|
|
69
|
+
/**
|
|
70
|
+
* Applies the plugin to a webpack compiler.
|
|
71
|
+
*
|
|
72
|
+
* @param compiler - The webpack compiler.
|
|
73
|
+
*/
|
|
74
|
+
apply(compiler) {
|
|
75
|
+
const mode = this.options.mode ?? getWebpackBuildMode(compiler.options);
|
|
76
|
+
applyWebpackOptionDefaults(compiler.options, mode);
|
|
77
|
+
applyWebpackFeatures(compiler, this.options, mode === BuildMode.Production);
|
|
78
|
+
new compiler.webpack.BannerPlugin({
|
|
79
|
+
banner: getObsidianPluginBanner("webpack"),
|
|
80
|
+
raw: true,
|
|
81
|
+
stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_REPORT,
|
|
82
|
+
test: /\.js$/u
|
|
83
|
+
}).apply(compiler);
|
|
84
|
+
const buildContextPromise = resolveObsidianPluginBuildContext({
|
|
85
|
+
...this.options,
|
|
86
|
+
...compiler.options.output.path !== void 0 && { distFolder: compiler.options.output.path },
|
|
87
|
+
mode
|
|
88
|
+
});
|
|
89
|
+
let isDistFolderCleaned = false;
|
|
90
|
+
async function prepare() {
|
|
91
|
+
const buildContext = await buildContextPromise;
|
|
92
|
+
if (isDistFolderCleaned) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
isDistFolderCleaned = true;
|
|
96
|
+
await cleanObsidianPluginDistFolder(buildContext.distFolder);
|
|
97
|
+
}
|
|
98
|
+
compiler.hooks.beforeRun.tapPromise(PLUGIN_NAME, prepare);
|
|
99
|
+
compiler.hooks.watchRun.tapPromise(PLUGIN_NAME, prepare);
|
|
100
|
+
compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
|
|
101
|
+
compilation.hooks.processAssets.tap(
|
|
102
|
+
{ name: PLUGIN_NAME, stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE },
|
|
103
|
+
() => {
|
|
104
|
+
renameWebpackCssAssets(compilation, compiler);
|
|
105
|
+
inlineExtractedLicenses(compilation, compiler);
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
});
|
|
109
|
+
compiler.hooks.afterEmit.tapPromise(PLUGIN_NAME, async (compilation) => {
|
|
110
|
+
if (compilation.getStats().hasErrors()) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const buildContext = await buildContextPromise;
|
|
114
|
+
await completeObsidianPluginDistFolder(buildContext);
|
|
115
|
+
await deployToObsidianPluginsFolder(buildContext);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/* v8 ignore stop */
|
|
119
|
+
}
|
|
120
|
+
function getWebpackBuildMode(options) {
|
|
121
|
+
return options.watch || options.mode === "development" ? BuildMode.Development : BuildMode.Production;
|
|
122
|
+
}
|
|
123
|
+
function getWebpackFeatureRules(params) {
|
|
124
|
+
const { cssLoaderPath, features, isProductionBuild, loaderPath, miniCssExtractLoaderPath } = params;
|
|
125
|
+
const rules = [];
|
|
126
|
+
function featureLoader(kind, styles) {
|
|
127
|
+
const options = { isProductionBuild, kind, ...styles && { styles } };
|
|
128
|
+
return [{ loader: loaderPath, options }];
|
|
129
|
+
}
|
|
130
|
+
switch (features.framework) {
|
|
131
|
+
case "solid": {
|
|
132
|
+
rules.push({ enforce: "pre", test: /\.[jt]sx$/iu, use: featureLoader("jsx") });
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
case "svelte": {
|
|
136
|
+
rules.push(
|
|
137
|
+
{ test: /\.svelte$/iu, use: featureLoader("svelte") },
|
|
138
|
+
{ enforce: "pre", test: /\.svelte\.[cm]?[jt]s$/iu, use: featureLoader("svelte") }
|
|
139
|
+
);
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
case "vue": {
|
|
143
|
+
rules.push({ enforce: "post", test: /\.vue(?:\?|%3F).*lang\.ts$/iu, use: featureLoader("typescript") });
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
default: {
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (features.wasm) {
|
|
151
|
+
rules.push({ test: /\.wasm$/iu, type: "javascript/auto", use: featureLoader("wasm") });
|
|
152
|
+
}
|
|
153
|
+
if (features.styles) {
|
|
154
|
+
rules.push({
|
|
155
|
+
test: /\.p?css$/iu,
|
|
156
|
+
use: [
|
|
157
|
+
miniCssExtractLoaderPath,
|
|
158
|
+
{
|
|
159
|
+
loader: cssLoaderPath,
|
|
160
|
+
options: {
|
|
161
|
+
importLoaders: 1,
|
|
162
|
+
modules: features.styles.cssModules ? { auto: true, namedExport: false } : false
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
...isPostcssNeeded(features.styles) ? featureLoader("stylesheet", features.styles) : []
|
|
166
|
+
]
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
return rules;
|
|
170
|
+
}
|
|
171
|
+
function obsidianPluginWebpackExternals(data, callback) {
|
|
172
|
+
if (data.request !== void 0 && isObsidianPluginExternal(data.request)) {
|
|
173
|
+
callback(null, `commonjs2 ${data.request}`);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
callback();
|
|
177
|
+
}
|
|
178
|
+
function applyWebpackFeatures(compiler, features, isProductionBuild) {
|
|
179
|
+
let miniCssExtractLoaderPath = "";
|
|
180
|
+
let cssLoaderPath = "";
|
|
181
|
+
if (features.styles) {
|
|
182
|
+
const stylesFeature = "styles";
|
|
183
|
+
cssLoaderPath = resolveOptionalPeer({ feature: stylesFeature, packageName: "css-loader" });
|
|
184
|
+
const MiniCssExtractPlugin = extractDefaultExportInterop(
|
|
185
|
+
requireOptionalPeer({ feature: stylesFeature, packageName: MINI_CSS_EXTRACT_PLUGIN })
|
|
186
|
+
);
|
|
187
|
+
miniCssExtractLoaderPath = MiniCssExtractPlugin.loader;
|
|
188
|
+
const hasMiniCssExtractPlugin = compiler.options.plugins.some((plugin) => plugin.constructor.name === "MiniCssExtractPlugin");
|
|
189
|
+
if (!hasMiniCssExtractPlugin) {
|
|
190
|
+
new MiniCssExtractPlugin().apply(compiler);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const loaderPath = fileURLToPath(new URL(`obsidian-plugin-webpack-loader${extname(fileURLToPath(import.meta.url))}`, import.meta.url));
|
|
194
|
+
compiler.options.module.rules.push(...getWebpackFeatureRules({ cssLoaderPath, features, isProductionBuild, loaderPath, miniCssExtractLoaderPath }));
|
|
195
|
+
if (features.framework !== "vue") {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const unpluginVue = extractDefaultExportInterop(
|
|
199
|
+
requireOptionalPeer({ feature: "framework: 'vue'", packageName: "unplugin-vue", specifier: "unplugin-vue/webpack" })
|
|
200
|
+
);
|
|
201
|
+
unpluginVue().apply(compiler);
|
|
202
|
+
const { "process.env.NODE_ENV": _nodeEnv, ...vueFlags } = getFrameworkDefines({ framework: features.framework, isProductionBuild });
|
|
203
|
+
new compiler.webpack.DefinePlugin(vueFlags).apply(compiler);
|
|
204
|
+
}
|
|
205
|
+
function applyWebpackOptionDefaults(options, mode) {
|
|
206
|
+
const isProductionBuild = mode === BuildMode.Production;
|
|
207
|
+
options.mode ??= isProductionBuild ? "production" : "development";
|
|
208
|
+
options.target ??= "node";
|
|
209
|
+
options.devtool ??= !isProductionBuild && "inline-source-map";
|
|
210
|
+
if (typeof options.entry === "object" && Object.keys(options.entry).length === 1 && options.entry["main"]?.import === void 0) {
|
|
211
|
+
options.entry = { main: { import: [getObsidianPluginEntryPoint()] } };
|
|
212
|
+
}
|
|
213
|
+
options.output.path ??= getObsidianPluginDistFolder(mode);
|
|
214
|
+
options.output.filename ??= ObsidianPluginRepoPaths.MainJs;
|
|
215
|
+
options.output.library ??= { type: "commonjs2" };
|
|
216
|
+
options.output.asyncChunks ??= false;
|
|
217
|
+
options.resolve.conditionNames ??= ["browser", "webpack", isProductionBuild ? "production" : "development", "module", "import", "require"];
|
|
218
|
+
const userExternals = options.externals;
|
|
219
|
+
options.externals = [obsidianPluginWebpackExternals, ...Array.isArray(userExternals) ? userExternals : [userExternals]];
|
|
220
|
+
}
|
|
221
|
+
function inlineExtractedLicenses(compilation, compiler) {
|
|
222
|
+
const LICENSE_SUFFIX = ".LICENSE.txt";
|
|
223
|
+
for (const licenseAsset of compilation.getAssets()) {
|
|
224
|
+
if (!licenseAsset.name.endsWith(LICENSE_SUFFIX)) {
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
const sourceFileName = licenseAsset.name.slice(0, -LICENSE_SUFFIX.length);
|
|
228
|
+
const sourceAsset = compilation.getAsset(sourceFileName);
|
|
229
|
+
if (!sourceAsset) {
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
const licenseFileName = licenseAsset.name.split("/").at(-1) ?? licenseAsset.name;
|
|
233
|
+
const reference = `/*! For license information please see ${licenseFileName} */`;
|
|
234
|
+
const source = sourceAsset.source.source().toString();
|
|
235
|
+
const licenses = licenseAsset.source.source().toString().trimEnd();
|
|
236
|
+
const updatedSource = source.includes(reference) ? source.replace(reference, () => licenses) : `${licenses}
|
|
237
|
+
${source}`;
|
|
238
|
+
compilation.updateAsset(sourceFileName, new compiler.webpack.sources.RawSource(updatedSource));
|
|
239
|
+
compilation.deleteAsset(licenseAsset.name);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
function renameWebpackCssAssets(compilation, compiler) {
|
|
243
|
+
const cssAssets = compilation.getAssets().filter((asset) => isCssFileName(asset.name)).map((asset) => ({ fileName: asset.name, source: asset.source.source().toString() }));
|
|
244
|
+
const { fileNamesToRemove, stylesCss } = mergeCssAssets(cssAssets);
|
|
245
|
+
if (stylesCss === void 0) {
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
for (const fileName of fileNamesToRemove) {
|
|
249
|
+
compilation.deleteAsset(fileName);
|
|
250
|
+
}
|
|
251
|
+
compilation.emitAsset(ObsidianPluginRepoPaths.StylesCss, new compiler.webpack.sources.RawSource(stylesCss));
|
|
252
|
+
}
|
|
253
|
+
export {
|
|
254
|
+
ObsidianPluginWebpackPlugin,
|
|
255
|
+
getWebpackBuildMode,
|
|
256
|
+
getWebpackFeatureRules,
|
|
257
|
+
obsidianPluginWebpackExternals
|
|
258
|
+
};
|
|
259
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy93ZWJwYWNrLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgYW4gT2JzaWRpYW4gcGx1Z2luIHdpdGggd2VicGFjazogYSB3ZWJwYWNrIHBsdWdpbiB0aGF0IGdpdmVzIGEgYnVpbGQgdGhlIHNhbWUgYG1haW4uanNgICtcbiAqIGBzdHlsZXMuY3NzYCArIGBtYW5pZmVzdC5qc29uYCBsYXlvdXQgdGhlIGVzYnVpbGQgYnVpbGRlciBwcm9kdWNlcywgZGVwbG95cyBhIHdhdGNoIGJ1aWxkIGludG8gdGhlIHZhdWx0LFxuICogYW5kIGZpbGxzIGluIG9ubHkgdGhlIG9wdGlvbnMgdGhlIGNvbnN1bWVyJ3Mgb3duIGB3ZWJwYWNrLmNvbmZpZ2AgbGVhdmVzIHVuc2V0LlxuICpcbiAqIGB3ZWJwYWNrYCBpcyBhbiBvcHRpb25hbCBwZWVyIGRlcGVuZGVuY3kuIFRoaXMgbW9kdWxlIG9ubHkgaW1wb3J0cyBpdHMgdHlwZXMgYW5kIHJlYWNoZXMgd2VicGFjaydzXG4gKiBjbGFzc2VzIHRocm91Z2ggYGNvbXBpbGVyLndlYnBhY2tgLCBzbyBhIHBsdWdpbiBidWlsdCB3aXRoIGVzYnVpbGQgaW5zdGFsbHMgbm90aGluZyBleHRyYS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIENvbXBpbGF0aW9uLFxuICBDb21waWxlcixcbiAgUnVsZVNldFJ1bGUsXG4gIFJ1bGVTZXRVc2VJdGVtLFxuICBXZWJwYWNrT3B0aW9uc05vcm1hbGl6ZWQsXG4gIFdlYnBhY2tQbHVnaW5JbnN0YW5jZVxufSBmcm9tICd3ZWJwYWNrJztcblxuaW1wb3J0IHsgZXh0cmFjdERlZmF1bHRFeHBvcnRJbnRlcm9wIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQgeyBleHRuYW1lIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblBsdWdpbkRlcGxveW1lbnRPcHRpb25zIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tYnVpbGQudHMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zLFxuICBPYnNpZGlhblBsdWdpblN0eWxlc09wdGlvbnNcbn0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblBsdWdpbldlYnBhY2tMb2FkZXJPcHRpb25zIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4td2VicGFjay1sb2FkZXIudHMnO1xuXG5pbXBvcnQgeyBPYnNpZGlhblBsdWdpblJlcG9QYXRocyB9IGZyb20gJy4uL29ic2lkaWFuLXBsdWdpbi1yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7XG4gIEJ1aWxkTW9kZSxcbiAgY2xlYW5PYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIsXG4gIGNvbXBsZXRlT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyLFxuICBnZXRPYnNpZGlhblBsdWdpbkJhbm5lcixcbiAgZ2V0T2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyLFxuICBnZXRPYnNpZGlhblBsdWdpbkVudHJ5UG9pbnQsXG4gIGlzQ3NzRmlsZU5hbWUsXG4gIGlzT2JzaWRpYW5QbHVnaW5FeHRlcm5hbCxcbiAgbWVyZ2VDc3NBc3NldHMsXG4gIHJlc29sdmVPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dFxufSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1idWlsZC50cyc7XG5pbXBvcnQge1xuICBnZXRGcmFtZXdvcmtEZWZpbmVzLFxuICBpc1Bvc3Rjc3NOZWVkZWQsXG4gIHJlcXVpcmVPcHRpb25hbFBlZXIsXG4gIHJlc29sdmVPcHRpb25hbFBlZXJcbn0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMudHMnO1xuaW1wb3J0IHsgZGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXIgfSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbnMtZm9sZGVyLWRlcGxveW1lbnQudHMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRXZWJwYWNrRmVhdHVyZVJ1bGVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRXZWJwYWNrRmVhdHVyZVJ1bGVzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIGBjc3MtbG9hZGVyYCwgZm9yIHRoZSBzdHlsZXNoZWV0IHJ1bGUuXG4gICAqL1xuICByZWFkb25seSBjc3NMb2FkZXJQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBidWlsZCBmZWF0dXJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzOiBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSBwcm9kdWN0aW9uIGJ1aWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNQcm9kdWN0aW9uQnVpbGQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIHRoZSB0b29sa2l0J3Mgb3duIGxvYWRlci5cbiAgICovXG4gIHJlYWRvbmx5IGxvYWRlclBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgYG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luYCdzIGxvYWRlciwgZm9yIHRoZSBzdHlsZXNoZWV0IHJ1bGUuXG4gICAqL1xuICByZWFkb25seSBtaW5pQ3NzRXh0cmFjdExvYWRlclBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgT2JzaWRpYW5QbHVnaW5XZWJwYWNrUGx1Z2lufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhblBsdWdpbldlYnBhY2tQbHVnaW5PcHRpb25zIGV4dGVuZHMgT2JzaWRpYW5QbHVnaW5EZXBsb3ltZW50T3B0aW9ucywgT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgbW9kZS4gRGVmYXVsdHMgdG8ge0BsaW5rIEJ1aWxkTW9kZS5EZXZlbG9wbWVudH0gd2hlbiB3ZWJwYWNrIHdhdGNoZXMgKGB3ZWJwYWNrIC0td2F0Y2hgKSBvclxuICAgKiBpdHMgYG1vZGVgIGlzIGBkZXZlbG9wbWVudGAsIGFuZCB7QGxpbmsgQnVpbGRNb2RlLlByb2R1Y3Rpb259IG90aGVyd2lzZS5cbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBCdWlsZE1vZGU7XG59XG5cbi8qKlxuICogVGhlIGNhbGxiYWNrIHdlYnBhY2sncyBmdW5jdGlvbiBmb3JtIG9mIGBleHRlcm5hbHNgIHRha2VzLlxuICovXG50eXBlIEV4dGVybmFsc0NhbGxiYWNrID0gKGVycm9yPzogRXJyb3IgfCBudWxsLCByZXN1bHQ/OiBzdHJpbmcpID0+IHZvaWQ7XG5cbi8qKlxuICogVGhlIGFyZ3VtZW50IHdlYnBhY2sncyBmdW5jdGlvbiBmb3JtIG9mIGBleHRlcm5hbHNgIHJlY2VpdmVzLlxuICovXG5pbnRlcmZhY2UgRXh0ZXJuYWxzRGF0YSB7XG4gIHJlYWRvbmx5IHJlcXVlc3Q/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbmAgY2xhc3MuXG4gKi9cbmludGVyZmFjZSBNaW5pQ3NzRXh0cmFjdFBsdWdpbkNsYXNzIHtcbiAgcmVhZG9ubHkgbG9hZGVyOiBzdHJpbmc7XG4gIG5ldyAoKTogV2VicGFja1BsdWdpbkluc3RhbmNlO1xufVxuXG4vKipcbiAqIFRoZSBwYXJ0IG9mIGBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbmAgdGhlIGFkYXB0ZXIgdXNlcy5cbiAqL1xuaW50ZXJmYWNlIE1pbmlDc3NFeHRyYWN0UGx1Z2luTW9kdWxlIHtcbiAgcmVhZG9ubHkgZGVmYXVsdDogTWluaUNzc0V4dHJhY3RQbHVnaW5DbGFzcztcbn1cblxuLyoqXG4gKiBUaGUgcGFydCBvZiBgdW5wbHVnaW4tdnVlL3dlYnBhY2tgIHRoZSBhZGFwdGVyIHVzZXMuXG4gKi9cbmludGVyZmFjZSBVbnBsdWdpblZ1ZVdlYnBhY2tNb2R1bGUge1xuICByZWFkb25seSBkZWZhdWx0OiAoKSA9PiBXZWJwYWNrUGx1Z2luSW5zdGFuY2U7XG59XG5cbmNvbnN0IFBMVUdJTl9OQU1FID0gJ09ic2lkaWFuUGx1Z2luV2VicGFja1BsdWdpbic7XG5jb25zdCBNSU5JX0NTU19FWFRSQUNUX1BMVUdJTiA9ICdtaW5pLWNzcy1leHRyYWN0LXBsdWdpbic7XG5cbi8qKlxuICogQSB3ZWJwYWNrIHBsdWdpbiB0aGF0IGJ1aWxkcyBhbiBPYnNpZGlhbiBwbHVnaW4uXG4gKlxuICogV2hhdCBpdCBkb2VzLCBlYWNoIG9ubHkgd2hlbiB0aGUgY29uc3VtZXIncyBjb25maWcgaGFzIG5vdCBzYWlkIG90aGVyd2lzZTpcbiAqXG4gKiAtIGBlbnRyeWAgaXMgYHNyYy9tYWluLnRzYCwgYW5kIGBtb2RlYCBmb2xsb3dzIHRoZSBidWlsZCBtb2RlLlxuICogLSBUaGUgb3V0cHV0IGlzIG9uZSBDb21tb25KUyAoYGNvbW1vbmpzMmApIGBtYWluLmpzYCBpbiBgZGlzdC9idWlsZGAgKGBkaXN0L2RldmAgaW4gZGV2ZWxvcG1lbnQpLCB3aXRoIG5vXG4gKiAgIGFzeW5jIGNodW5rcywgc28gYSBkeW5hbWljIGltcG9ydCBjYW5ub3QgYmVjb21lIGEgc2libGluZyBmaWxlLlxuICogLSBgdGFyZ2V0YCBpcyBgbm9kZWAsIHdoaWNoIGlzIHdoYXQgT2JzaWRpYW4ncyByZW5kZXJlciBydW5zLCBzbyBOb2RlIGJ1aWx0aW5zIHJlc29sdmUsIHdoaWxlIHRoZSBleHBvcnRcbiAqICAgY29uZGl0aW9ucyBhcmUgdGhlIGJyb3dzZXIncyAoYGJyb3dzZXJgLCBgd2VicGFja2AsIHRoZSBtb2RlLCBgbW9kdWxlYCwgYGltcG9ydGAsIGByZXF1aXJlYCwgYW5kIG5ldmVyIGBub2RlYCksXG4gKiAgIHNvIHBhY2thZ2VzIGhhbmQgb3ZlciB0aGVpciBicm93c2VyIGJ1aWxkcywgYXMgb24gbW9iaWxlIHRoZXkgbXVzdC5cbiAqIC0gYGRldnRvb2xgIGlzIGFuIGlubGluZSBzb3VyY2UgbWFwIGluIGRldmVsb3BtZW50IG9ubHkuXG4gKlxuICogQW5kIGFsd2F5czogT2JzaWRpYW4ncyBvd24gbW9kdWxlcyAoYG9ic2lkaWFuYCwgYGVsZWN0cm9uYCwgQ29kZU1pcnJvciwgTGV6ZXIpIGFuZCB0aGUgTm9kZSBidWlsdGlucyBhcmVcbiAqIGV4dGVybmFsIGJlc2lkZSB0aGUgY29uc3VtZXIncyBvd24gYGV4dGVybmFsc2AsIHRoZSBnZW5lcmF0ZWQtZmlsZSBiYW5uZXIgaGVhZHMgYG1haW4uanNgLCBsaWNlbnNlXG4gKiBjb21tZW50cyBhIG1pbmltaXplciBleHRyYWN0ZWQgaW50byBgbWFpbi5qcy5MSUNFTlNFLnR4dGAgKHdoaWNoIG5vIE9ic2lkaWFuIHJlbGVhc2Ugc2hpcHMpIGFyZSBwdXQgYmFja1xuICogaW50byBgbWFpbi5qc2AsIHRoZSBvdXRwdXQgZm9sZGVyIGlzIGVtcHRpZWQgYmVmb3JlIHRoZSBmaXJzdCBidWlsZCwgZXZlcnkgZW1pdHRlZCBDU1MgZmlsZSBlbmRzIHVwIGluXG4gKiBgc3R5bGVzLmNzc2AsIGBtYW5pZmVzdC5qc29uYCAoYW5kIGluIGRldmVsb3BtZW50IGAuaG90cmVsb2FkYCkgaXMgY29waWVkIGJlc2lkZSBpdCwgYW5kIGEgZGV2ZWxvcG1lbnRcbiAqIGJ1aWxkIGlzIGRlcGxveWVkIGludG8gdGhlIHZhdWx0IG5hbWVkIGJ5IGBPQlNJRElBTl9DT05GSUdfRk9MREVSYC5cbiAqXG4gKiBUeXBlU2NyaXB0IHN0YXlzIHRoZSBjb25zdW1lcidzIGNob2ljZSBvZiBsb2FkZXIsIGFzIGl0IHdvdWxkIGJlIHdpdGhvdXQgdGhpcyBwbHVnaW4uIFRoZSBidWlsZCBmZWF0dXJlc1xuICogKHtAbGluayBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zfSkgYXJlIHRoZSBwbHVnaW4nczpcbiAqXG4gKiAtIGBmcmFtZXdvcms6ICdyZWFjdCcgfCAncHJlYWN0J2AgbmVlZHMgbm90aGluZyBoZXJlOiB0aGUgVHlwZVNjcmlwdCBsb2FkZXIgcmVhZHMgdGhlIGF1dG9tYXRpYyBKU1ggcnVudGltZSBmcm9tIHRoZVxuICogICB0b29sa2l0J3MgdHNjb25maWcgcHJlc2V0LCBhbmQgd2VicGFjaydzIGBtb2RlYCBkZWZpbmVzIGBwcm9jZXNzLmVudi5OT0RFX0VOVmAuXG4gKiAtIGBmcmFtZXdvcms6ICdzb2xpZCcgfCAnc3ZlbHRlJ2AgYWRkcyBydWxlcyB0aGF0IGNvbXBpbGUgdGhlIGNvbXBvbmVudHMgd2l0aCB0aGUgdG9vbGtpdCdzIHNoYXJlZCB0cmFuc2Zvcm1zLCBhbmRcbiAqICAgYCd2dWUnYCBhcHBsaWVzIGB1bnBsdWdpbi12dWVgIGFuZCBkZWZpbmVzIFZ1ZSdzIGZlYXR1cmUgZmxhZ3MuXG4gKiAtIGBzdHlsZXNgIGFkZHMgdGhlIG9uZSBydWxlIGV2ZXJ5IHN0eWxlc2hlZXQgZ29lcyB0aHJvdWdoIChQb3N0Q1NTIGFuZCBUYWlsd2luZCwgdGhlbiBgY3NzLWxvYWRlcmAsIHNjb3BpbmdcbiAqICAgYCoubW9kdWxlLmNzc2Agb25seSB3aXRoIGBjc3NNb2R1bGVzYCwgdGhlbiBgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5gKSwgYW5kIGFwcGxpZXMgYG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luYFxuICogICB1bmxlc3MgdGhlIGNvbmZpZyBhbHJlYWR5IGRvZXM7IGxlYXZlIHlvdXIgb3duIGAuY3NzYCBydWxlIG91dC4gYHN0eWxlczoge31gIGNvbXBpbGVzIHBsYWluIENTUy5cbiAqIC0gYHdhc21gIGltcG9ydHMgYSBgLndhc21gIG1vZHVsZSBhcyBpdHMgYnl0ZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBPYnNpZGlhblBsdWdpbldlYnBhY2tQbHVnaW4gaW1wbGVtZW50cyBXZWJwYWNrUGx1Z2luSW5zdGFuY2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgcGx1Z2luLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgT2JzaWRpYW5QbHVnaW5XZWJwYWNrUGx1Z2luT3B0aW9uc30uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBPYnNpZGlhblBsdWdpbldlYnBhY2tQbHVnaW5PcHRpb25zID0ge30pIHt9XG5cbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIFdlYnBhY2sgaG9va3M7IGV4ZXJjaXNlZCBieSB0aGUgYnVuZGxlciBpbnRlZ3JhdGlvbiB0ZXN0IGFnYWluc3QgYSByZWFsIHdlYnBhY2sgYnVpbGQuICovXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBwbHVnaW4gdG8gYSB3ZWJwYWNrIGNvbXBpbGVyLlxuICAgKlxuICAgKiBAcGFyYW0gY29tcGlsZXIgLSBUaGUgd2VicGFjayBjb21waWxlci5cbiAgICovXG4gIHB1YmxpYyBhcHBseShjb21waWxlcjogQ29tcGlsZXIpOiB2b2lkIHtcbiAgICBjb25zdCBtb2RlID0gdGhpcy5vcHRpb25zLm1vZGUgPz8gZ2V0V2VicGFja0J1aWxkTW9kZShjb21waWxlci5vcHRpb25zKTtcbiAgICBhcHBseVdlYnBhY2tPcHRpb25EZWZhdWx0cyhjb21waWxlci5vcHRpb25zLCBtb2RlKTtcbiAgICBhcHBseVdlYnBhY2tGZWF0dXJlcyhjb21waWxlciwgdGhpcy5vcHRpb25zLCBtb2RlID09PSBCdWlsZE1vZGUuUHJvZHVjdGlvbik7XG4gICAgLy8gQWRkZWQgYXQgdGhlIHJlcG9ydCBzdGFnZSwgYWZ0ZXIgbWluaWZpY2F0aW9uLCB3aGljaCB3b3VsZCBvdGhlcndpc2Ugc3RyaXAgaXQgYXMgYW4gb3JkaW5hcnkgY29tbWVudC5cbiAgICBuZXcgY29tcGlsZXIud2VicGFjay5CYW5uZXJQbHVnaW4oe1xuICAgICAgYmFubmVyOiBnZXRPYnNpZGlhblBsdWdpbkJhbm5lcignd2VicGFjaycpLFxuICAgICAgcmF3OiB0cnVlLFxuICAgICAgc3RhZ2U6IGNvbXBpbGVyLndlYnBhY2suQ29tcGlsYXRpb24uUFJPQ0VTU19BU1NFVFNfU1RBR0VfUkVQT1JULFxuICAgICAgdGVzdDogL1xcLmpzJC91XG4gICAgfSkuYXBwbHkoY29tcGlsZXIpO1xuXG4gICAgY29uc3QgYnVpbGRDb250ZXh0UHJvbWlzZSA9IHJlc29sdmVPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCh7XG4gICAgICAuLi50aGlzLm9wdGlvbnMsXG4gICAgICAuLi4oY29tcGlsZXIub3B0aW9ucy5vdXRwdXQucGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgZGlzdEZvbGRlcjogY29tcGlsZXIub3B0aW9ucy5vdXRwdXQucGF0aCB9KSxcbiAgICAgIG1vZGVcbiAgICB9KTtcbiAgICBsZXQgaXNEaXN0Rm9sZGVyQ2xlYW5lZCA9IGZhbHNlO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gcHJlcGFyZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IGJ1aWxkQ29udGV4dCA9IGF3YWl0IGJ1aWxkQ29udGV4dFByb21pc2U7XG4gICAgICBpZiAoaXNEaXN0Rm9sZGVyQ2xlYW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpc0Rpc3RGb2xkZXJDbGVhbmVkID0gdHJ1ZTtcbiAgICAgIGF3YWl0IGNsZWFuT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyKGJ1aWxkQ29udGV4dC5kaXN0Rm9sZGVyKTtcbiAgICB9XG4gICAgY29tcGlsZXIuaG9va3MuYmVmb3JlUnVuLnRhcFByb21pc2UoUExVR0lOX05BTUUsIHByZXBhcmUpO1xuICAgIGNvbXBpbGVyLmhvb2tzLndhdGNoUnVuLnRhcFByb21pc2UoUExVR0lOX05BTUUsIHByZXBhcmUpO1xuXG4gICAgY29tcGlsZXIuaG9va3MudGhpc0NvbXBpbGF0aW9uLnRhcChQTFVHSU5fTkFNRSwgKGNvbXBpbGF0aW9uKSA9PiB7XG4gICAgICBjb21waWxhdGlvbi5ob29rcy5wcm9jZXNzQXNzZXRzLnRhcChcbiAgICAgICAgeyBuYW1lOiBQTFVHSU5fTkFNRSwgc3RhZ2U6IGNvbXBpbGVyLndlYnBhY2suQ29tcGlsYXRpb24uUFJPQ0VTU19BU1NFVFNfU1RBR0VfU1VNTUFSSVpFIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICByZW5hbWVXZWJwYWNrQ3NzQXNzZXRzKGNvbXBpbGF0aW9uLCBjb21waWxlcik7XG4gICAgICAgICAgaW5saW5lRXh0cmFjdGVkTGljZW5zZXMoY29tcGlsYXRpb24sIGNvbXBpbGVyKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbXBpbGVyLmhvb2tzLmFmdGVyRW1pdC50YXBQcm9taXNlKFBMVUdJTl9OQU1FLCBhc3luYyAoY29tcGlsYXRpb24pID0+IHtcbiAgICAgIGlmIChjb21waWxhdGlvbi5nZXRTdGF0cygpLmhhc0Vycm9ycygpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJ1aWxkQ29udGV4dCA9IGF3YWl0IGJ1aWxkQ29udGV4dFByb21pc2U7XG4gICAgICBhd2FpdCBjb21wbGV0ZU9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcihidWlsZENvbnRleHQpO1xuICAgICAgYXdhaXQgZGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXIoYnVpbGRDb250ZXh0KTtcbiAgICB9KTtcbiAgfVxuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xufVxuXG4vKipcbiAqIERlY2lkZXMgdGhlIGJ1aWxkIG1vZGUgb2YgYSB3ZWJwYWNrIGJ1aWxkIGZyb20gdGhlIGNvbnN1bWVyJ3MgY29uZmlnOiBkZXZlbG9wbWVudCB3aGVuIHdlYnBhY2sgd2F0Y2hlc1xuICogb3IgaXRzIGBtb2RlYCBpcyBgZGV2ZWxvcG1lbnRgLCBwcm9kdWN0aW9uIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBub3JtYWxpemVkIHdlYnBhY2sgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBidWlsZCBtb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2VicGFja0J1aWxkTW9kZShvcHRpb25zOiBQaWNrPFdlYnBhY2tPcHRpb25zTm9ybWFsaXplZCwgJ21vZGUnIHwgJ3dhdGNoJz4pOiBCdWlsZE1vZGUge1xuICByZXR1cm4gb3B0aW9ucy53YXRjaCB8fCBvcHRpb25zLm1vZGUgPT09ICdkZXZlbG9wbWVudCcgPyBCdWlsZE1vZGUuRGV2ZWxvcG1lbnQgOiBCdWlsZE1vZGUuUHJvZHVjdGlvbjtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIG1vZHVsZSBydWxlcyB0aGUgYnVpbGQgZmVhdHVyZXMgYWRkLCBlYWNoIHJ1bm5pbmcgdGhlIHRvb2xraXQncyBvd24gbG9hZGVyOiBTb2xpZCdzIEpTWCBiZWZvcmUgdGhlXG4gKiBwcm9qZWN0J3MgVHlwZVNjcmlwdCBsb2FkZXIsIFN2ZWx0ZSBjb21wb25lbnRzIGFuZCBtb2R1bGVzLCBgLndhc21gIG1vZHVsZXMgYXMgSmF2YVNjcmlwdCwgYW5kIHdpdGggYHN0eWxlc2AgdGhlXG4gKiBzdHlsZXNoZWV0IHJ1bGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgR2V0V2VicGFja0ZlYXR1cmVSdWxlc1BhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgcnVsZXMsIGVtcHR5IHdoZW4gbm8gZmVhdHVyZSBuZWVkcyBvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWJwYWNrRmVhdHVyZVJ1bGVzKHBhcmFtczogR2V0V2VicGFja0ZlYXR1cmVSdWxlc1BhcmFtcyk6IFJ1bGVTZXRSdWxlW10ge1xuICBjb25zdCB7IGNzc0xvYWRlclBhdGgsIGZlYXR1cmVzLCBpc1Byb2R1Y3Rpb25CdWlsZCwgbG9hZGVyUGF0aCwgbWluaUNzc0V4dHJhY3RMb2FkZXJQYXRoIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHJ1bGVzOiBSdWxlU2V0UnVsZVtdID0gW107XG5cbiAgZnVuY3Rpb24gZmVhdHVyZUxvYWRlcihraW5kOiBPYnNpZGlhblBsdWdpbldlYnBhY2tMb2FkZXJPcHRpb25zWydraW5kJ10sIHN0eWxlcz86IE9ic2lkaWFuUGx1Z2luU3R5bGVzT3B0aW9ucyk6IFJ1bGVTZXRVc2VJdGVtW10ge1xuICAgIGNvbnN0IG9wdGlvbnM6IE9ic2lkaWFuUGx1Z2luV2VicGFja0xvYWRlck9wdGlvbnMgPSB7IGlzUHJvZHVjdGlvbkJ1aWxkLCBraW5kLCAuLi4oc3R5bGVzICYmIHsgc3R5bGVzIH0pIH07XG4gICAgcmV0dXJuIFt7IGxvYWRlcjogbG9hZGVyUGF0aCwgb3B0aW9ucyB9XTtcbiAgfVxuXG4gIHN3aXRjaCAoZmVhdHVyZXMuZnJhbWV3b3JrKSB7XG4gICAgY2FzZSAnc29saWQnOiB7XG4gICAgICBydWxlcy5wdXNoKHsgZW5mb3JjZTogJ3ByZScsIHRlc3Q6IC9cXC5banRdc3gkL2l1LCB1c2U6IGZlYXR1cmVMb2FkZXIoJ2pzeCcpIH0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3N2ZWx0ZSc6IHtcbiAgICAgIHJ1bGVzLnB1c2goXG4gICAgICAgIHsgdGVzdDogL1xcLnN2ZWx0ZSQvaXUsIHVzZTogZmVhdHVyZUxvYWRlcignc3ZlbHRlJykgfSxcbiAgICAgICAgeyBlbmZvcmNlOiAncHJlJywgdGVzdDogL1xcLnN2ZWx0ZVxcLltjbV0/W2p0XXMkL2l1LCB1c2U6IGZlYXR1cmVMb2FkZXIoJ3N2ZWx0ZScpIH1cbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndnVlJzoge1xuICAgICAgLy8gYHVucGx1Z2luLXZ1ZWAgaGFuZHMgYSBgPHNjcmlwdCBsYW5nPVwidHNcIj5gIGJsb2NrIG9uIGFzIGEgbW9kdWxlIG9mIGl0cyBvd24gYWZ0ZXIgdGhlIHByb2plY3QncyBUeXBlU2NyaXB0XG4gICAgICAvLyBMb2FkZXIgcmFuLCBzbyBhIHBvc3QgbG9hZGVyIHN0cmlwcyBpdHMgdHlwZXMuIEl0cyBpZCBuYW1lcyB0aGUgY29tcG9uZW50IGFuZCB0aGUgYmxvY2sncyBsYW5ndWFnZS5cbiAgICAgIHJ1bGVzLnB1c2goeyBlbmZvcmNlOiAncG9zdCcsIHRlc3Q6IC9cXC52dWUoPzpcXD98JTNGKS4qbGFuZ1xcLnRzJC9pdSwgdXNlOiBmZWF0dXJlTG9hZGVyKCd0eXBlc2NyaXB0JykgfSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChmZWF0dXJlcy53YXNtKSB7XG4gICAgcnVsZXMucHVzaCh7IHRlc3Q6IC9cXC53YXNtJC9pdSwgdHlwZTogJ2phdmFzY3JpcHQvYXV0bycsIHVzZTogZmVhdHVyZUxvYWRlcignd2FzbScpIH0pO1xuICB9XG4gIGlmIChmZWF0dXJlcy5zdHlsZXMpIHtcbiAgICBydWxlcy5wdXNoKHtcbiAgICAgIHRlc3Q6IC9cXC5wP2NzcyQvaXUsXG4gICAgICB1c2U6IFtcbiAgICAgICAgbWluaUNzc0V4dHJhY3RMb2FkZXJQYXRoLFxuICAgICAgICB7XG4gICAgICAgICAgbG9hZGVyOiBjc3NMb2FkZXJQYXRoLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGltcG9ydExvYWRlcnM6IDEsXG4gICAgICAgICAgICBtb2R1bGVzOiBmZWF0dXJlcy5zdHlsZXMuY3NzTW9kdWxlcyA/IHsgYXV0bzogdHJ1ZSwgbmFtZWRFeHBvcnQ6IGZhbHNlIH0gOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLi4uaXNQb3N0Y3NzTmVlZGVkKGZlYXR1cmVzLnN0eWxlcykgPyBmZWF0dXJlTG9hZGVyKCdzdHlsZXNoZWV0JywgZmVhdHVyZXMuc3R5bGVzKSA6IFtdXG4gICAgICBdXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJ1bGVzO1xufVxuXG4vKipcbiAqIFRlbGxzIHdlYnBhY2sncyBmdW5jdGlvbiBmb3JtIG9mIGBleHRlcm5hbHNgIHRvIGxlYXZlIE9ic2lkaWFuJ3MgbW9kdWxlcyBhbmQgdGhlIE5vZGUgYnVpbHRpbnMgdG9cbiAqIGByZXF1aXJlKClgLlxuICpcbiAqIEBwYXJhbSBkYXRhIC0gVGhlIHJlcXVlc3Qgd2VicGFjayBpcyByZXNvbHZpbmcuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gYW5zd2VyIHRocm91Z2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvYnNpZGlhblBsdWdpbldlYnBhY2tFeHRlcm5hbHMoZGF0YTogRXh0ZXJuYWxzRGF0YSwgY2FsbGJhY2s6IEV4dGVybmFsc0NhbGxiYWNrKTogdm9pZCB7XG4gIGlmIChkYXRhLnJlcXVlc3QgIT09IHVuZGVmaW5lZCAmJiBpc09ic2lkaWFuUGx1Z2luRXh0ZXJuYWwoZGF0YS5yZXF1ZXN0KSkge1xuICAgIGNhbGxiYWNrKG51bGwsIGBjb21tb25qczIgJHtkYXRhLnJlcXVlc3R9YCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNhbGxiYWNrKCk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBQYXJ0IG9mIHRoZSB3ZWJwYWNrIGhvb2tzIGFib3ZlLiAqL1xuLyoqXG4gKiBBcHBsaWVzIHRoZSBidWlsZCBmZWF0dXJlcyB0byBhIGNvbXBpbGVyOiB0aGUgcnVsZXMgb2Yge0BsaW5rIGdldFdlYnBhY2tGZWF0dXJlUnVsZXN9LCBgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5gXG4gKiBmb3IgYHN0eWxlc2AgdW5sZXNzIHRoZSBjb25maWcgYWxyZWFkeSBhcHBsaWVzIGl0LCBhbmQgYHVucGx1Z2luLXZ1ZWAgd2l0aCBWdWUncyBmZWF0dXJlIGZsYWdzIGZvciBWdWUuXG4gKlxuICogQHBhcmFtIGNvbXBpbGVyIC0gVGhlIHdlYnBhY2sgY29tcGlsZXIuXG4gKiBAcGFyYW0gZmVhdHVyZXMgLSBUaGUgYnVpbGQgZmVhdHVyZXMuXG4gKiBAcGFyYW0gaXNQcm9kdWN0aW9uQnVpbGQgLSBXaGV0aGVyIHRoaXMgaXMgYSBwcm9kdWN0aW9uIGJ1aWxkLlxuICovXG5mdW5jdGlvbiBhcHBseVdlYnBhY2tGZWF0dXJlcyhjb21waWxlcjogQ29tcGlsZXIsIGZlYXR1cmVzOiBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zLCBpc1Byb2R1Y3Rpb25CdWlsZDogYm9vbGVhbik6IHZvaWQge1xuICBsZXQgbWluaUNzc0V4dHJhY3RMb2FkZXJQYXRoID0gJyc7XG4gIGxldCBjc3NMb2FkZXJQYXRoID0gJyc7XG4gIGlmIChmZWF0dXJlcy5zdHlsZXMpIHtcbiAgICBjb25zdCBzdHlsZXNGZWF0dXJlID0gJ3N0eWxlcyc7XG4gICAgY3NzTG9hZGVyUGF0aCA9IHJlc29sdmVPcHRpb25hbFBlZXIoeyBmZWF0dXJlOiBzdHlsZXNGZWF0dXJlLCBwYWNrYWdlTmFtZTogJ2Nzcy1sb2FkZXInIH0pO1xuICAgIGNvbnN0IE1pbmlDc3NFeHRyYWN0UGx1Z2luID0gZXh0cmFjdERlZmF1bHRFeHBvcnRJbnRlcm9wKFxuICAgICAgcmVxdWlyZU9wdGlvbmFsUGVlcih7IGZlYXR1cmU6IHN0eWxlc0ZlYXR1cmUsIHBhY2thZ2VOYW1lOiBNSU5JX0NTU19FWFRSQUNUX1BMVUdJTiB9KSBhcyBNaW5pQ3NzRXh0cmFjdFBsdWdpbk1vZHVsZVxuICAgICk7XG4gICAgbWluaUNzc0V4dHJhY3RMb2FkZXJQYXRoID0gTWluaUNzc0V4dHJhY3RQbHVnaW4ubG9hZGVyO1xuICAgIGNvbnN0IGhhc01pbmlDc3NFeHRyYWN0UGx1Z2luID0gY29tcGlsZXIub3B0aW9ucy5wbHVnaW5zLnNvbWUoKHBsdWdpbikgPT4gcGx1Z2luLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdNaW5pQ3NzRXh0cmFjdFBsdWdpbicpO1xuICAgIGlmICghaGFzTWluaUNzc0V4dHJhY3RQbHVnaW4pIHtcbiAgICAgIG5ldyBNaW5pQ3NzRXh0cmFjdFBsdWdpbigpLmFwcGx5KGNvbXBpbGVyKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBsb2FkZXJQYXRoID0gZmlsZVVSTFRvUGF0aChuZXcgVVJMKGBvYnNpZGlhbi1wbHVnaW4td2VicGFjay1sb2FkZXIke2V4dG5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKX1gLCBpbXBvcnQubWV0YS51cmwpKTtcbiAgY29tcGlsZXIub3B0aW9ucy5tb2R1bGUucnVsZXMucHVzaCguLi5nZXRXZWJwYWNrRmVhdHVyZVJ1bGVzKHsgY3NzTG9hZGVyUGF0aCwgZmVhdHVyZXMsIGlzUHJvZHVjdGlvbkJ1aWxkLCBsb2FkZXJQYXRoLCBtaW5pQ3NzRXh0cmFjdExvYWRlclBhdGggfSkpO1xuXG4gIGlmIChmZWF0dXJlcy5mcmFtZXdvcmsgIT09ICd2dWUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHVucGx1Z2luVnVlID0gZXh0cmFjdERlZmF1bHRFeHBvcnRJbnRlcm9wKFxuICAgIHJlcXVpcmVPcHRpb25hbFBlZXIoeyBmZWF0dXJlOiAnZnJhbWV3b3JrOiBcXCd2dWVcXCcnLCBwYWNrYWdlTmFtZTogJ3VucGx1Z2luLXZ1ZScsIHNwZWNpZmllcjogJ3VucGx1Z2luLXZ1ZS93ZWJwYWNrJyB9KSBhcyBVbnBsdWdpblZ1ZVdlYnBhY2tNb2R1bGVcbiAgKTtcbiAgdW5wbHVnaW5WdWUoKS5hcHBseShjb21waWxlcik7XG4gIC8vIGBwcm9jZXNzLmVudi5OT0RFX0VOVmAgaXMgbGVmdCBvdXQ6IHdlYnBhY2sncyBgbW9kZWAgZGVmaW5lcyBpdCwgYW5kIGEgc2Vjb25kIGRlZmluaXRpb24gY29uZmxpY3RzLlxuICBjb25zdCB7ICdwcm9jZXNzLmVudi5OT0RFX0VOVic6IF9ub2RlRW52LCAuLi52dWVGbGFncyB9ID0gZ2V0RnJhbWV3b3JrRGVmaW5lcyh7IGZyYW1ld29yazogZmVhdHVyZXMuZnJhbWV3b3JrLCBpc1Byb2R1Y3Rpb25CdWlsZCB9KTtcbiAgbmV3IGNvbXBpbGVyLndlYnBhY2suRGVmaW5lUGx1Z2luKHZ1ZUZsYWdzKS5hcHBseShjb21waWxlcik7XG59XG5cbi8qKlxuICogRmlsbHMgaW4gdGhlIG5vcm1hbGl6ZWQgd2VicGFjayBvcHRpb25zIHRoZSBjb25zdW1lciBsZWZ0IHVuc2V0LlxuICpcbiAqIFJ1bnMgd2hpbGUgdGhlIHBsdWdpbiBpcyBhcHBsaWVkLCB3aGljaCB3ZWJwYWNrIGRvZXMgYWZ0ZXIgbm9ybWFsaXppbmcgdGhlIGNvbnN1bWVyJ3MgY29uZmlnIGFuZCBiZWZvcmVcbiAqIGFwcGx5aW5nIGl0cyBvd24gZGVmYXVsdHMsIHNvIGFuIHVuc2V0IG9wdGlvbiBzdGlsbCByZWFkcyBgdW5kZWZpbmVkYCBoZXJlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG5vcm1hbGl6ZWQgd2VicGFjayBvcHRpb25zLCBjaGFuZ2VkIGluIHBsYWNlLlxuICogQHBhcmFtIG1vZGUgLSBUaGUgYnVpbGQgbW9kZS5cbiAqL1xuZnVuY3Rpb24gYXBwbHlXZWJwYWNrT3B0aW9uRGVmYXVsdHMob3B0aW9uczogV2VicGFja09wdGlvbnNOb3JtYWxpemVkLCBtb2RlOiBCdWlsZE1vZGUpOiB2b2lkIHtcbiAgY29uc3QgaXNQcm9kdWN0aW9uQnVpbGQgPSBtb2RlID09PSBCdWlsZE1vZGUuUHJvZHVjdGlvbjtcbiAgb3B0aW9ucy5tb2RlID8/PSBpc1Byb2R1Y3Rpb25CdWlsZCA/ICdwcm9kdWN0aW9uJyA6ICdkZXZlbG9wbWVudCc7XG4gIG9wdGlvbnMudGFyZ2V0ID8/PSAnbm9kZSc7XG4gIG9wdGlvbnMuZGV2dG9vbCA/Pz0gIWlzUHJvZHVjdGlvbkJ1aWxkICYmICdpbmxpbmUtc291cmNlLW1hcCc7XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmVudHJ5ID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhvcHRpb25zLmVudHJ5KS5sZW5ndGggPT09IDEgJiYgb3B0aW9ucy5lbnRyeVsnbWFpbiddPy5pbXBvcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIG9wdGlvbnMuZW50cnkgPSB7IG1haW46IHsgaW1wb3J0OiBbZ2V0T2JzaWRpYW5QbHVnaW5FbnRyeVBvaW50KCldIH0gfTtcbiAgfVxuXG4gIG9wdGlvbnMub3V0cHV0LnBhdGggPz89IGdldE9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcihtb2RlKTtcbiAgb3B0aW9ucy5vdXRwdXQuZmlsZW5hbWUgPz89IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1haW5KcztcbiAgb3B0aW9ucy5vdXRwdXQubGlicmFyeSA/Pz0geyB0eXBlOiAnY29tbW9uanMyJyB9O1xuICBvcHRpb25zLm91dHB1dC5hc3luY0NodW5rcyA/Pz0gZmFsc2U7XG5cbiAgLy8gTGlzdGVkIGluIGZ1bGwgcmF0aGVyIHRoYW4gd2l0aCBgJy4uLidgLCB3aGljaCB3b3VsZCBicmluZyBpbiB0aGUgYG5vZGVgIGNvbmRpdGlvbiBvZiBgdGFyZ2V0OiAnbm9kZSdgOiBleHBvcnRcbiAgLy8gTWFwcyBhcmUgbWF0Y2hlZCBpbiB0aGUgcGFja2FnZSdzIGtleSBvcmRlciwgbm90IHRoaXMgb25lJ3MsIHNvIGEgcGFja2FnZSBsaXN0aW5nIGBub2RlYCBiZWZvcmUgYGJyb3dzZXJgIChWdWUsXG4gIC8vIGBmZmxhdGVgKSB3b3VsZCBoYW5kIG92ZXIgaXRzIE5vZGUgYnVpbGQsIHdoaWNoIGRvZXMgbm90IGxvYWQgb24gbW9iaWxlLlxuICBvcHRpb25zLnJlc29sdmUuY29uZGl0aW9uTmFtZXMgPz89IFsnYnJvd3NlcicsICd3ZWJwYWNrJywgaXNQcm9kdWN0aW9uQnVpbGQgPyAncHJvZHVjdGlvbicgOiAnZGV2ZWxvcG1lbnQnLCAnbW9kdWxlJywgJ2ltcG9ydCcsICdyZXF1aXJlJ107XG5cbiAgY29uc3QgdXNlckV4dGVybmFscyA9IG9wdGlvbnMuZXh0ZXJuYWxzO1xuICBvcHRpb25zLmV4dGVybmFscyA9IFtvYnNpZGlhblBsdWdpbldlYnBhY2tFeHRlcm5hbHMsIC4uLihBcnJheS5pc0FycmF5KHVzZXJFeHRlcm5hbHMpID8gdXNlckV4dGVybmFscyA6IFt1c2VyRXh0ZXJuYWxzXSldO1xufVxuXG4vKipcbiAqIFB1dHMgbGljZW5zZSBjb21tZW50cyBhIG1pbmltaXplciBleHRyYWN0ZWQgaW50byBhIGA8ZmlsZT4uTElDRU5TRS50eHRgIGJhY2sgaW50byB0aGUgZmlsZSB0aGV5IGNhbWUgZnJvbS5cbiAqXG4gKiBXZWJwYWNrJ3MgZGVmYXVsdCBtaW5pbWl6ZXIgbW92ZXMgZXZlcnkgYnVuZGxlZCBkZXBlbmRlbmN5J3MgbGljZW5zZSBjb21tZW50IGludG8gYVxuICogYG1haW4uanMuTElDRU5TRS50eHRgIGJlc2lkZSBgbWFpbi5qc2AsIHdoaWNoIG5vIE9ic2lkaWFuIHJlbGVhc2Ugc2hpcHMsIHNvIHRoZSBpbnN0YWxsZWQgcGx1Z2luIHdvdWxkXG4gKiBjYXJyeSBjb2RlIHdpdGhvdXQgdGhlIG5vdGljZXMgaXQgaXMgbGljZW5zZWQgdW5kZXIuIERvbmUgYWZ0ZXIgbWluaWZpY2F0aW9uIHJhdGhlciB0aGFuIGJ5IHJlcGxhY2luZ1xuICogdGhlIG1pbmltaXplciwgc28gaXQgaG9sZHMgd2hpY2hldmVyIG1pbmltaXplciB0aGUgY29uc3VtZXIgb3Igd2VicGFjayBwaWNrZWQuXG4gKlxuICogQHBhcmFtIGNvbXBpbGF0aW9uIC0gVGhlIGNvbXBpbGF0aW9uLlxuICogQHBhcmFtIGNvbXBpbGVyIC0gVGhlIGNvbXBpbGVyLCBmb3Igd2VicGFjaydzIGBzb3VyY2VzYCBjbGFzc2VzLlxuICovXG5mdW5jdGlvbiBpbmxpbmVFeHRyYWN0ZWRMaWNlbnNlcyhjb21waWxhdGlvbjogQ29tcGlsYXRpb24sIGNvbXBpbGVyOiBDb21waWxlcik6IHZvaWQge1xuICBjb25zdCBMSUNFTlNFX1NVRkZJWCA9ICcuTElDRU5TRS50eHQnO1xuICBmb3IgKGNvbnN0IGxpY2Vuc2VBc3NldCBvZiBjb21waWxhdGlvbi5nZXRBc3NldHMoKSkge1xuICAgIGlmICghbGljZW5zZUFzc2V0Lm5hbWUuZW5kc1dpdGgoTElDRU5TRV9TVUZGSVgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3Qgc291cmNlRmlsZU5hbWUgPSBsaWNlbnNlQXNzZXQubmFtZS5zbGljZSgwLCAtTElDRU5TRV9TVUZGSVgubGVuZ3RoKTtcbiAgICBjb25zdCBzb3VyY2VBc3NldCA9IGNvbXBpbGF0aW9uLmdldEFzc2V0KHNvdXJjZUZpbGVOYW1lKTtcbiAgICBpZiAoIXNvdXJjZUFzc2V0KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbGljZW5zZUZpbGVOYW1lID0gbGljZW5zZUFzc2V0Lm5hbWUuc3BsaXQoJy8nKS5hdCgtMSkgPz8gbGljZW5zZUFzc2V0Lm5hbWU7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gYC8qISBGb3IgbGljZW5zZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlICR7bGljZW5zZUZpbGVOYW1lfSAqL2A7XG4gICAgY29uc3Qgc291cmNlID0gc291cmNlQXNzZXQuc291cmNlLnNvdXJjZSgpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgbGljZW5zZXMgPSBsaWNlbnNlQXNzZXQuc291cmNlLnNvdXJjZSgpLnRvU3RyaW5nKCkudHJpbUVuZCgpO1xuICAgIGNvbnN0IHVwZGF0ZWRTb3VyY2UgPSBzb3VyY2UuaW5jbHVkZXMocmVmZXJlbmNlKSA/IHNvdXJjZS5yZXBsYWNlKHJlZmVyZW5jZSwgKCkgPT4gbGljZW5zZXMpIDogYCR7bGljZW5zZXN9XFxuJHtzb3VyY2V9YDtcbiAgICBjb21waWxhdGlvbi51cGRhdGVBc3NldChzb3VyY2VGaWxlTmFtZSwgbmV3IGNvbXBpbGVyLndlYnBhY2suc291cmNlcy5SYXdTb3VyY2UodXBkYXRlZFNvdXJjZSkpO1xuICAgIGNvbXBpbGF0aW9uLmRlbGV0ZUFzc2V0KGxpY2Vuc2VBc3NldC5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIE1vdmVzIGV2ZXJ5IENTUyBhc3NldCBvZiBhIGNvbXBpbGF0aW9uIGludG8gYHN0eWxlcy5jc3NgLlxuICpcbiAqIEBwYXJhbSBjb21waWxhdGlvbiAtIFRoZSBjb21waWxhdGlvbi5cbiAqIEBwYXJhbSBjb21waWxlciAtIFRoZSBjb21waWxlciwgZm9yIHdlYnBhY2sncyBgc291cmNlc2AgY2xhc3Nlcy5cbiAqL1xuZnVuY3Rpb24gcmVuYW1lV2VicGFja0Nzc0Fzc2V0cyhjb21waWxhdGlvbjogQ29tcGlsYXRpb24sIGNvbXBpbGVyOiBDb21waWxlcik6IHZvaWQge1xuICBjb25zdCBjc3NBc3NldHMgPSBjb21waWxhdGlvbi5nZXRBc3NldHMoKVxuICAgIC5maWx0ZXIoKGFzc2V0KSA9PiBpc0Nzc0ZpbGVOYW1lKGFzc2V0Lm5hbWUpKVxuICAgIC5tYXAoKGFzc2V0KSA9PiAoeyBmaWxlTmFtZTogYXNzZXQubmFtZSwgc291cmNlOiBhc3NldC5zb3VyY2Uuc291cmNlKCkudG9TdHJpbmcoKSB9KSk7XG4gIGNvbnN0IHsgZmlsZU5hbWVzVG9SZW1vdmUsIHN0eWxlc0NzcyB9ID0gbWVyZ2VDc3NBc3NldHMoY3NzQXNzZXRzKTtcbiAgaWYgKHN0eWxlc0NzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzVG9SZW1vdmUpIHtcbiAgICBjb21waWxhdGlvbi5kZWxldGVBc3NldChmaWxlTmFtZSk7XG4gIH1cbiAgY29tcGlsYXRpb24uZW1pdEFzc2V0KE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlN0eWxlc0NzcywgbmV3IGNvbXBpbGVyLndlYnBhY2suc291cmNlcy5SYXdTb3VyY2Uoc3R5bGVzQ3NzKSk7XG59XG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQSxTQUFTLG1DQUFtQztBQUM1QyxTQUFTLGVBQWU7QUFDeEIsU0FBUyxxQkFBcUI7QUFTOUIsU0FBUywrQkFBK0I7QUFDeEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHFDQUFxQztBQTZFOUMsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sMEJBQTBCO0FBa0N6QixNQUFNLDRCQUE2RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1qRSxZQUE2QixVQUE4QyxDQUFDLEdBQUc7QUFBbEQ7QUFBQSxFQUFtRDtBQUFBLEVBQW5EO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRN0IsTUFBTSxVQUEwQjtBQUNyQyxVQUFNLE9BQU8sS0FBSyxRQUFRLFFBQVEsb0JBQW9CLFNBQVMsT0FBTztBQUN0RSwrQkFBMkIsU0FBUyxTQUFTLElBQUk7QUFDakQseUJBQXFCLFVBQVUsS0FBSyxTQUFTLFNBQVMsVUFBVSxVQUFVO0FBRTFFLFFBQUksU0FBUyxRQUFRLGFBQWE7QUFBQSxNQUNoQyxRQUFRLHdCQUF3QixTQUFTO0FBQUEsTUFDekMsS0FBSztBQUFBLE1BQ0wsT0FBTyxTQUFTLFFBQVEsWUFBWTtBQUFBLE1BQ3BDLE1BQU07QUFBQSxJQUNSLENBQUMsRUFBRSxNQUFNLFFBQVE7QUFFakIsVUFBTSxzQkFBc0Isa0NBQWtDO0FBQUEsTUFDNUQsR0FBRyxLQUFLO0FBQUEsTUFDUixHQUFJLFNBQVMsUUFBUSxPQUFPLFNBQVMsVUFBYSxFQUFFLFlBQVksU0FBUyxRQUFRLE9BQU8sS0FBSztBQUFBLE1BQzdGO0FBQUEsSUFDRixDQUFDO0FBQ0QsUUFBSSxzQkFBc0I7QUFFMUIsbUJBQWUsVUFBeUI7QUFDdEMsWUFBTSxlQUFlLE1BQU07QUFDM0IsVUFBSSxxQkFBcUI7QUFDdkI7QUFBQSxNQUNGO0FBQ0EsNEJBQXNCO0FBQ3RCLFlBQU0sOEJBQThCLGFBQWEsVUFBVTtBQUFBLElBQzdEO0FBQ0EsYUFBUyxNQUFNLFVBQVUsV0FBVyxhQUFhLE9BQU87QUFDeEQsYUFBUyxNQUFNLFNBQVMsV0FBVyxhQUFhLE9BQU87QUFFdkQsYUFBUyxNQUFNLGdCQUFnQixJQUFJLGFBQWEsQ0FBQyxnQkFBZ0I7QUFDL0Qsa0JBQVksTUFBTSxjQUFjO0FBQUEsUUFDOUIsRUFBRSxNQUFNLGFBQWEsT0FBTyxTQUFTLFFBQVEsWUFBWSwrQkFBK0I7QUFBQSxRQUN4RixNQUFNO0FBQ0osaUNBQXVCLGFBQWEsUUFBUTtBQUM1QyxrQ0FBd0IsYUFBYSxRQUFRO0FBQUEsUUFDL0M7QUFBQSxNQUNGO0FBQUEsSUFDRixDQUFDO0FBRUQsYUFBUyxNQUFNLFVBQVUsV0FBVyxhQUFhLE9BQU8sZ0JBQWdCO0FBQ3RFLFVBQUksWUFBWSxTQUFTLEVBQUUsVUFBVSxHQUFHO0FBQ3RDO0FBQUEsTUFDRjtBQUNBLFlBQU0sZUFBZSxNQUFNO0FBQzNCLFlBQU0saUNBQWlDLFlBQVk7QUFDbkQsWUFBTSw4QkFBOEIsWUFBWTtBQUFBLElBQ2xELENBQUM7QUFBQSxFQUNIO0FBQUE7QUFFRjtBQVNPLFNBQVMsb0JBQW9CLFNBQXNFO0FBQ3hHLFNBQU8sUUFBUSxTQUFTLFFBQVEsU0FBUyxnQkFBZ0IsVUFBVSxjQUFjLFVBQVU7QUFDN0Y7QUFVTyxTQUFTLHVCQUF1QixRQUFxRDtBQUMxRixRQUFNLEVBQUUsZUFBZSxVQUFVLG1CQUFtQixZQUFZLHlCQUF5QixJQUFJO0FBQzdGLFFBQU0sUUFBdUIsQ0FBQztBQUU5QixXQUFTLGNBQWMsTUFBa0QsUUFBd0Q7QUFDL0gsVUFBTSxVQUE4QyxFQUFFLG1CQUFtQixNQUFNLEdBQUksVUFBVSxFQUFFLE9BQU8sRUFBRztBQUN6RyxXQUFPLENBQUMsRUFBRSxRQUFRLFlBQVksUUFBUSxDQUFDO0FBQUEsRUFDekM7QUFFQSxVQUFRLFNBQVMsV0FBVztBQUFBLElBQzFCLEtBQUssU0FBUztBQUNaLFlBQU0sS0FBSyxFQUFFLFNBQVMsT0FBTyxNQUFNLGVBQWUsS0FBSyxjQUFjLEtBQUssRUFBRSxDQUFDO0FBQzdFO0FBQUEsSUFDRjtBQUFBLElBQ0EsS0FBSyxVQUFVO0FBQ2IsWUFBTTtBQUFBLFFBQ0osRUFBRSxNQUFNLGVBQWUsS0FBSyxjQUFjLFFBQVEsRUFBRTtBQUFBLFFBQ3BELEVBQUUsU0FBUyxPQUFPLE1BQU0sMkJBQTJCLEtBQUssY0FBYyxRQUFRLEVBQUU7QUFBQSxNQUNsRjtBQUNBO0FBQUEsSUFDRjtBQUFBLElBQ0EsS0FBSyxPQUFPO0FBR1YsWUFBTSxLQUFLLEVBQUUsU0FBUyxRQUFRLE1BQU0sZ0NBQWdDLEtBQUssY0FBYyxZQUFZLEVBQUUsQ0FBQztBQUN0RztBQUFBLElBQ0Y7QUFBQSxJQUNBLFNBQVM7QUFDUDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsTUFBSSxTQUFTLE1BQU07QUFDakIsVUFBTSxLQUFLLEVBQUUsTUFBTSxhQUFhLE1BQU0sbUJBQW1CLEtBQUssY0FBYyxNQUFNLEVBQUUsQ0FBQztBQUFBLEVBQ3ZGO0FBQ0EsTUFBSSxTQUFTLFFBQVE7QUFDbkIsVUFBTSxLQUFLO0FBQUEsTUFDVCxNQUFNO0FBQUEsTUFDTixLQUFLO0FBQUEsUUFDSDtBQUFBLFFBQ0E7QUFBQSxVQUNFLFFBQVE7QUFBQSxVQUNSLFNBQVM7QUFBQSxZQUNQLGVBQWU7QUFBQSxZQUNmLFNBQVMsU0FBUyxPQUFPLGFBQWEsRUFBRSxNQUFNLE1BQU0sYUFBYSxNQUFNLElBQUk7QUFBQSxVQUM3RTtBQUFBLFFBQ0Y7QUFBQSxRQUNBLEdBQUcsZ0JBQWdCLFNBQVMsTUFBTSxJQUFJLGNBQWMsY0FBYyxTQUFTLE1BQU0sSUFBSSxDQUFDO0FBQUEsTUFDeEY7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBQ0EsU0FBTztBQUNUO0FBU08sU0FBUywrQkFBK0IsTUFBcUIsVUFBbUM7QUFDckcsTUFBSSxLQUFLLFlBQVksVUFBYSx5QkFBeUIsS0FBSyxPQUFPLEdBQUc7QUFDeEUsYUFBUyxNQUFNLGFBQWEsS0FBSyxPQUFPLEVBQUU7QUFDMUM7QUFBQSxFQUNGO0FBQ0EsV0FBUztBQUNYO0FBV0EsU0FBUyxxQkFBcUIsVUFBb0IsVUFBd0MsbUJBQWtDO0FBQzFILE1BQUksMkJBQTJCO0FBQy9CLE1BQUksZ0JBQWdCO0FBQ3BCLE1BQUksU0FBUyxRQUFRO0FBQ25CLFVBQU0sZ0JBQWdCO0FBQ3RCLG9CQUFnQixvQkFBb0IsRUFBRSxTQUFTLGVBQWUsYUFBYSxhQUFhLENBQUM7QUFDekYsVUFBTSx1QkFBdUI7QUFBQSxNQUMzQixvQkFBb0IsRUFBRSxTQUFTLGVBQWUsYUFBYSx3QkFBd0IsQ0FBQztBQUFBLElBQ3RGO0FBQ0EsK0JBQTJCLHFCQUFxQjtBQUNoRCxVQUFNLDBCQUEwQixTQUFTLFFBQVEsUUFBUSxLQUFLLENBQUMsV0FBVyxPQUFPLFlBQVksU0FBUyxzQkFBc0I7QUFDNUgsUUFBSSxDQUFDLHlCQUF5QjtBQUM1QixVQUFJLHFCQUFxQixFQUFFLE1BQU0sUUFBUTtBQUFBLElBQzNDO0FBQUEsRUFDRjtBQUVBLFFBQU0sYUFBYSxjQUFjLElBQUksSUFBSSxpQ0FBaUMsUUFBUSxjQUFjLFlBQVksR0FBRyxDQUFDLENBQUMsSUFBSSxZQUFZLEdBQUcsQ0FBQztBQUNySSxXQUFTLFFBQVEsT0FBTyxNQUFNLEtBQUssR0FBRyx1QkFBdUIsRUFBRSxlQUFlLFVBQVUsbUJBQW1CLFlBQVkseUJBQXlCLENBQUMsQ0FBQztBQUVsSixNQUFJLFNBQVMsY0FBYyxPQUFPO0FBQ2hDO0FBQUEsRUFDRjtBQUNBLFFBQU0sY0FBYztBQUFBLElBQ2xCLG9CQUFvQixFQUFFLFNBQVMsb0JBQXNCLGFBQWEsZ0JBQWdCLFdBQVcsdUJBQXVCLENBQUM7QUFBQSxFQUN2SDtBQUNBLGNBQVksRUFBRSxNQUFNLFFBQVE7QUFFNUIsUUFBTSxFQUFFLHdCQUF3QixVQUFVLEdBQUcsU0FBUyxJQUFJLG9CQUFvQixFQUFFLFdBQVcsU0FBUyxXQUFXLGtCQUFrQixDQUFDO0FBQ2xJLE1BQUksU0FBUyxRQUFRLGFBQWEsUUFBUSxFQUFFLE1BQU0sUUFBUTtBQUM1RDtBQVdBLFNBQVMsMkJBQTJCLFNBQW1DLE1BQXVCO0FBQzVGLFFBQU0sb0JBQW9CLFNBQVMsVUFBVTtBQUM3QyxVQUFRLFNBQVMsb0JBQW9CLGVBQWU7QUFDcEQsVUFBUSxXQUFXO0FBQ25CLFVBQVEsWUFBWSxDQUFDLHFCQUFxQjtBQUUxQyxNQUFJLE9BQU8sUUFBUSxVQUFVLFlBQVksT0FBTyxLQUFLLFFBQVEsS0FBSyxFQUFFLFdBQVcsS0FBSyxRQUFRLE1BQU0sTUFBTSxHQUFHLFdBQVcsUUFBVztBQUMvSCxZQUFRLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLDRCQUE0QixDQUFDLEVBQUUsRUFBRTtBQUFBLEVBQ3RFO0FBRUEsVUFBUSxPQUFPLFNBQVMsNEJBQTRCLElBQUk7QUFDeEQsVUFBUSxPQUFPLGFBQWEsd0JBQXdCO0FBQ3BELFVBQVEsT0FBTyxZQUFZLEVBQUUsTUFBTSxZQUFZO0FBQy9DLFVBQVEsT0FBTyxnQkFBZ0I7QUFLL0IsVUFBUSxRQUFRLG1CQUFtQixDQUFDLFdBQVcsV0FBVyxvQkFBb0IsZUFBZSxlQUFlLFVBQVUsVUFBVSxTQUFTO0FBRXpJLFFBQU0sZ0JBQWdCLFFBQVE7QUFDOUIsVUFBUSxZQUFZLENBQUMsZ0NBQWdDLEdBQUksTUFBTSxRQUFRLGFBQWEsSUFBSSxnQkFBZ0IsQ0FBQyxhQUFhLENBQUU7QUFDMUg7QUFhQSxTQUFTLHdCQUF3QixhQUEwQixVQUEwQjtBQUNuRixRQUFNLGlCQUFpQjtBQUN2QixhQUFXLGdCQUFnQixZQUFZLFVBQVUsR0FBRztBQUNsRCxRQUFJLENBQUMsYUFBYSxLQUFLLFNBQVMsY0FBYyxHQUFHO0FBQy9DO0FBQUEsSUFDRjtBQUNBLFVBQU0saUJBQWlCLGFBQWEsS0FBSyxNQUFNLEdBQUcsQ0FBQyxlQUFlLE1BQU07QUFDeEUsVUFBTSxjQUFjLFlBQVksU0FBUyxjQUFjO0FBQ3ZELFFBQUksQ0FBQyxhQUFhO0FBQ2hCO0FBQUEsSUFDRjtBQUNBLFVBQU0sa0JBQWtCLGFBQWEsS0FBSyxNQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxhQUFhO0FBQzVFLFVBQU0sWUFBWSwwQ0FBMEMsZUFBZTtBQUMzRSxVQUFNLFNBQVMsWUFBWSxPQUFPLE9BQU8sRUFBRSxTQUFTO0FBQ3BELFVBQU0sV0FBVyxhQUFhLE9BQU8sT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRO0FBQ2pFLFVBQU0sZ0JBQWdCLE9BQU8sU0FBUyxTQUFTLElBQUksT0FBTyxRQUFRLFdBQVcsTUFBTSxRQUFRLElBQUksR0FBRyxRQUFRO0FBQUEsRUFBSyxNQUFNO0FBQ3JILGdCQUFZLFlBQVksZ0JBQWdCLElBQUksU0FBUyxRQUFRLFFBQVEsVUFBVSxhQUFhLENBQUM7QUFDN0YsZ0JBQVksWUFBWSxhQUFhLElBQUk7QUFBQSxFQUMzQztBQUNGO0FBUUEsU0FBUyx1QkFBdUIsYUFBMEIsVUFBMEI7QUFDbEYsUUFBTSxZQUFZLFlBQVksVUFBVSxFQUNyQyxPQUFPLENBQUMsVUFBVSxjQUFjLE1BQU0sSUFBSSxDQUFDLEVBQzNDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxNQUFNLE1BQU0sUUFBUSxNQUFNLE9BQU8sT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFFO0FBQ3RGLFFBQU0sRUFBRSxtQkFBbUIsVUFBVSxJQUFJLGVBQWUsU0FBUztBQUNqRSxNQUFJLGNBQWMsUUFBVztBQUMzQjtBQUFBLEVBQ0Y7QUFDQSxhQUFXLFlBQVksbUJBQW1CO0FBQ3hDLGdCQUFZLFlBQVksUUFBUTtBQUFBLEVBQ2xDO0FBQ0EsY0FBWSxVQUFVLHdCQUF3QixXQUFXLElBQUksU0FBUyxRQUFRLFFBQVEsVUFBVSxTQUFTLENBQUM7QUFDNUc7IiwibmFtZXMiOltdfQ==
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/// <reference path="./library-references.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* The `archive-demo-vault` command: runs {@link archivePluginDemoVault} on the built plugin and turns the result into
|
|
6
|
+
* an exit code. The `obsidian-plugin-release.yml` reusable workflow runs it after the build, so a release made in CI
|
|
7
|
+
* carries the same demo vault archive as one made with `npm run version`.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Runs `archive-demo-vault`. A plugin without a `demo-vault/` folder is not a failure: there is nothing to archive.
|
|
11
|
+
*
|
|
12
|
+
* @returns A {@link Promise} that resolves to the exit code: `0` once the archive is written or when there is no demo
|
|
13
|
+
* vault, `1` on any failure, which is printed to stderr.
|
|
14
|
+
*/
|
|
15
|
+
export declare function runArchiveDemoVaultCli(): Promise<number>;
|