@mnaoumov/obsidian-dev-toolkit 2.1.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -2
- package/bin/archive-demo-vault.mjs +8 -0
- package/bin/generate-coverage-badge.mjs +8 -0
- package/bundlers/esbuild-impl/feature-options/package.json +6 -0
- package/bundlers/obsidian-cli-reload/package.json +6 -0
- package/bundlers/obsidian-plugin-build/package.json +6 -0
- package/bundlers/obsidian-plugin-features/package.json +6 -0
- package/bundlers/obsidian-plugin-transforms/package.json +6 -0
- package/bundlers/obsidian-plugin-webpack-loader/package.json +6 -0
- package/bundlers/obsidian-plugins-folder-deployment/package.json +6 -0
- package/bundlers/parcel/package.json +6 -0
- package/bundlers/rollup/package.json +6 -0
- package/bundlers/rollup-compatible/package.json +6 -0
- package/bundlers/rollup-compatible-features/package.json +6 -0
- package/bundlers/vite/package.json +6 -0
- package/bundlers/webpack/package.json +6 -0
- package/dist/demo-vault-helper/main.js +6 -442
- package/dist/integration-test-plugin/main.js +918 -4912
- package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +3 -188
- package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.cts +2 -18
- package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.cjs +173 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.d.cts +60 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +4 -1
- package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +1 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +30 -82
- package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +7 -24
- package/dist/lib/cjs/bundlers/index.cjs +39 -3
- package/dist/lib/cjs/bundlers/index.d.cts +12 -0
- package/dist/lib/cjs/bundlers/obsidian-cli-reload.cjs +182 -0
- package/dist/lib/cjs/bundlers/obsidian-cli-reload.d.cts +37 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-build.cjs +278 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-build.d.cts +217 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-features.cjs +242 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-features.d.cts +186 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.cjs +306 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.d.cts +231 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.cjs +182 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.d.cts +47 -0
- package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.cjs +320 -0
- package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.d.cts +44 -0
- package/dist/lib/cjs/bundlers/parcel.cjs +462 -0
- package/dist/lib/cjs/bundlers/parcel.d.cts +128 -0
- package/dist/lib/cjs/bundlers/rollup-compatible-features.cjs +181 -0
- package/dist/lib/cjs/bundlers/rollup-compatible-features.d.cts +128 -0
- package/dist/lib/cjs/bundlers/rollup-compatible.cjs +138 -0
- package/dist/lib/cjs/bundlers/rollup-compatible.d.cts +84 -0
- package/dist/lib/cjs/bundlers/rollup.cjs +218 -0
- package/dist/lib/cjs/bundlers/rollup.d.cts +99 -0
- package/dist/lib/cjs/bundlers/vite.cjs +229 -0
- package/dist/lib/cjs/bundlers/vite.d.cts +105 -0
- package/dist/lib/cjs/bundlers/webpack.cjs +354 -0
- package/dist/lib/cjs/bundlers/webpack.d.cts +133 -0
- package/dist/lib/cjs/demo-vault-cli.cjs +131 -0
- package/dist/lib/cjs/demo-vault-cli.d.cts +15 -0
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/test-runners/coverage-badge-cli.cjs +160 -0
- package/dist/lib/cjs/test-runners/coverage-badge-cli.d.cts +25 -0
- package/dist/lib/cjs/test-runners/coverage-badge.cjs +279 -0
- package/dist/lib/cjs/test-runners/coverage-badge.d.cts +143 -0
- package/dist/lib/cjs/test-runners/e2e-runner-support.cjs +170 -0
- package/dist/lib/cjs/test-runners/e2e-runner-support.d.cts +36 -0
- package/dist/lib/cjs/test-runners/index.cjs +18 -3
- package/dist/lib/cjs/test-runners/index.d.cts +5 -0
- package/dist/lib/cjs/test-runners/obsidian-test-runner.cjs +147 -0
- package/dist/lib/cjs/test-runners/obsidian-test-runner.d.cts +42 -0
- package/dist/lib/cjs/test-runners/wdio-obsidian.cjs +205 -0
- package/dist/lib/cjs/test-runners/wdio-obsidian.d.cts +199 -0
- package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.mts +2 -18
- package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +3 -192
- package/dist/lib/esm/bundlers/esbuild-impl/feature-options.d.mts +60 -0
- package/dist/lib/esm/bundlers/esbuild-impl/feature-options.mjs +82 -0
- package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +1 -0
- package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +3 -1
- package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +7 -24
- package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +41 -87
- package/dist/lib/esm/bundlers/index.d.mts +12 -0
- package/dist/lib/esm/bundlers/index.mjs +26 -2
- package/dist/lib/esm/bundlers/obsidian-cli-reload.d.mts +37 -0
- package/dist/lib/esm/bundlers/obsidian-cli-reload.mjs +83 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-build.d.mts +217 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-build.mjs +166 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-features.d.mts +186 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-features.mjs +126 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-transforms.d.mts +231 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-transforms.mjs +194 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-webpack-loader.d.mts +47 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-webpack-loader.mjs +89 -0
- package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.d.mts +44 -0
- package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.mjs +228 -0
- package/dist/lib/esm/bundlers/parcel.d.mts +128 -0
- package/dist/lib/esm/bundlers/parcel.mjs +361 -0
- package/dist/lib/esm/bundlers/rollup-compatible-features.d.mts +128 -0
- package/dist/lib/esm/bundlers/rollup-compatible-features.mjs +93 -0
- package/dist/lib/esm/bundlers/rollup-compatible.d.mts +84 -0
- package/dist/lib/esm/bundlers/rollup-compatible.mjs +43 -0
- package/dist/lib/esm/bundlers/rollup.d.mts +99 -0
- package/dist/lib/esm/bundlers/rollup.mjs +130 -0
- package/dist/lib/esm/bundlers/vite.d.mts +105 -0
- package/dist/lib/esm/bundlers/vite.mjs +144 -0
- package/dist/lib/esm/bundlers/webpack.d.mts +133 -0
- package/dist/lib/esm/bundlers/webpack.mjs +259 -0
- package/dist/lib/esm/demo-vault-cli.d.mts +15 -0
- package/dist/lib/esm/demo-vault-cli.mjs +23 -0
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/test-runners/coverage-badge-cli.d.mts +25 -0
- package/dist/lib/esm/test-runners/coverage-badge-cli.mjs +51 -0
- package/dist/lib/esm/test-runners/coverage-badge.d.mts +143 -0
- package/dist/lib/esm/test-runners/coverage-badge.mjs +181 -0
- package/dist/lib/esm/test-runners/e2e-runner-support.d.mts +36 -0
- package/dist/lib/esm/test-runners/e2e-runner-support.mjs +61 -0
- package/dist/lib/esm/test-runners/index.d.mts +5 -0
- package/dist/lib/esm/test-runners/index.mjs +12 -2
- package/dist/lib/esm/test-runners/obsidian-test-runner.d.mts +42 -0
- package/dist/lib/esm/test-runners/obsidian-test-runner.mjs +52 -0
- package/dist/lib/esm/test-runners/wdio-obsidian.d.mts +199 -0
- package/dist/lib/esm/test-runners/wdio-obsidian.mjs +110 -0
- package/package.json +104 -5
- package/test-runners/coverage-badge/package.json +6 -0
- package/test-runners/coverage-badge-cli/package.json +6 -0
- package/test-runners/e2e-runner-support/package.json +6 -0
- package/test-runners/obsidian-test-runner/package.json +6 -0
- package/test-runners/wdio-obsidian/package.json +6 -0
- package/tsconfig/preact.json +7 -0
- package/tsconfig/react.json +7 -0
- package/tsconfig/solid.json +7 -0
- package/tsconfig/svelte.json +7 -0
- package/tsconfig/vue.json +7 -0
- package/types/styles.d.ts +32 -0
- package/types/wasm.d.ts +11 -0
|
@@ -0,0 +1,361 @@
|
|
|
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 { CliTaskResult } from "@mnaoumov/typescript-dev-toolkit/cli-utils";
|
|
34
|
+
import { npmRunOptional } from "@mnaoumov/typescript-dev-toolkit/npm-run";
|
|
35
|
+
import { invokeAsyncSafely } from "@mnaoumov/typescript-lib/async";
|
|
36
|
+
import {
|
|
37
|
+
extname,
|
|
38
|
+
join,
|
|
39
|
+
relative,
|
|
40
|
+
toPosixPath
|
|
41
|
+
} from "@mnaoumov/typescript-lib/path";
|
|
42
|
+
import { existsSync } from "node:fs";
|
|
43
|
+
import {
|
|
44
|
+
mkdir,
|
|
45
|
+
readFile,
|
|
46
|
+
writeFile
|
|
47
|
+
} from "node:fs/promises";
|
|
48
|
+
import { ObsidianPluginRepoPaths } from "../obsidian-plugin-repo-paths.mjs";
|
|
49
|
+
import {
|
|
50
|
+
BuildMode,
|
|
51
|
+
cleanObsidianPluginDistFolder,
|
|
52
|
+
completeObsidianPluginDistFolder,
|
|
53
|
+
getObsidianPluginBanner,
|
|
54
|
+
OBSIDIAN_PLUGIN_EXTERNALS,
|
|
55
|
+
resolveFromRoot,
|
|
56
|
+
resolveObsidianPluginBuildContext
|
|
57
|
+
} from "./obsidian-plugin-build.mjs";
|
|
58
|
+
import {
|
|
59
|
+
getFrameworkDefines,
|
|
60
|
+
getJsxImportSource,
|
|
61
|
+
isPostcssNeeded
|
|
62
|
+
} from "./obsidian-plugin-features.mjs";
|
|
63
|
+
import { deployToObsidianPluginsFolder } from "./obsidian-plugins-folder-deployment.mjs";
|
|
64
|
+
const PARCEL_CACHE_FOLDER = ".parcel-cache";
|
|
65
|
+
const GENERATED_PARCEL_CONFIG_FOLDER = `${PARCEL_CACHE_FOLDER}/obsidian-dev-toolkit`;
|
|
66
|
+
const PARCELRC = ".parcelrc";
|
|
67
|
+
const RESOLVER_FILE_NAME = "obsidian-plugin-resolver.cjs";
|
|
68
|
+
const NAMER_FILE_NAME = "obsidian-plugin-namer.cjs";
|
|
69
|
+
const INLINE_IMPORTS_FILE_NAME = "obsidian-plugin-inline-imports.cjs";
|
|
70
|
+
const OPTIMIZER_FILE_NAME = "obsidian-plugin-optimizer.cjs";
|
|
71
|
+
const FEATURES_FILE_NAME = "obsidian-plugin-features.cjs";
|
|
72
|
+
const JSON_INDENT = 2;
|
|
73
|
+
async function build(options) {
|
|
74
|
+
const result = await buildObsidianPluginWithParcel({ ...options, mode: BuildMode.Production });
|
|
75
|
+
result.throwOnFailure();
|
|
76
|
+
}
|
|
77
|
+
async function buildObsidianPluginWithParcel(params) {
|
|
78
|
+
await npmRunOptional("build:compile");
|
|
79
|
+
const buildContext = await resolveObsidianPluginBuildContext(params);
|
|
80
|
+
await cleanObsidianPluginDistFolder(buildContext.distFolder);
|
|
81
|
+
await completeObsidianPluginDistFolder(buildContext);
|
|
82
|
+
const configFolder = resolveFromRoot(GENERATED_PARCEL_CONFIG_FOLDER);
|
|
83
|
+
const consumerParcelrcPath = resolveFromRoot(PARCELRC);
|
|
84
|
+
await mkdir(configFolder, { recursive: true });
|
|
85
|
+
const configFiles = getParcelConfigFiles({
|
|
86
|
+
consumerParcelrcPath: existsSync(consumerParcelrcPath) ? toPosixPath(relative(configFolder, consumerParcelrcPath)) : void 0,
|
|
87
|
+
features: params
|
|
88
|
+
});
|
|
89
|
+
for (const [fileName, contents] of Object.entries(configFiles)) {
|
|
90
|
+
const filePath = join(configFolder, fileName);
|
|
91
|
+
if (!existsSync(filePath) || await readFile(filePath, "utf-8") !== contents) {
|
|
92
|
+
await writeFile(filePath, contents, "utf-8");
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const { Parcel } = await import("@parcel/core");
|
|
96
|
+
const parcelOptions = getParcelOptions({ buildContext, cacheFolder: resolveFromRoot(PARCEL_CACHE_FOLDER), configPath: join(configFolder, PARCELRC) });
|
|
97
|
+
const bundler = new Parcel(params.customizeParcelOptions?.(parcelOptions) ?? parcelOptions);
|
|
98
|
+
if (buildContext.isProductionBuild) {
|
|
99
|
+
try {
|
|
100
|
+
const { buildTime, bundleGraph } = await bundler.run();
|
|
101
|
+
console.warn(`Built ${String(bundleGraph.getBundles().length)} bundle(s) with parcel in ${String(buildTime)} ms.`);
|
|
102
|
+
return CliTaskResult.Success();
|
|
103
|
+
} catch (error) {
|
|
104
|
+
console.error(formatParcelError(error));
|
|
105
|
+
return CliTaskResult.Failure();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
await bundler.watch((error, event) => {
|
|
109
|
+
if (error) {
|
|
110
|
+
console.error(formatParcelError(error));
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
handleWatchEvent(event, buildContext);
|
|
114
|
+
});
|
|
115
|
+
return CliTaskResult.DoNotExit();
|
|
116
|
+
}
|
|
117
|
+
async function dev(options) {
|
|
118
|
+
return await buildObsidianPluginWithParcel({ ...options, mode: BuildMode.Development });
|
|
119
|
+
}
|
|
120
|
+
function getParcelConfigFiles(params) {
|
|
121
|
+
const { consumerParcelrcPath, features = {} } = params;
|
|
122
|
+
const featureTransformer = `./${FEATURES_FILE_NAME}`;
|
|
123
|
+
const transformers = {};
|
|
124
|
+
if (features.framework === "svelte") {
|
|
125
|
+
transformers["*.svelte"] = [featureTransformer];
|
|
126
|
+
transformers["*.svelte.{js,ts}"] = [featureTransformer, `./${INLINE_IMPORTS_FILE_NAME}`, "..."];
|
|
127
|
+
}
|
|
128
|
+
if (features.framework === "solid" || getJsxImportSource(features.framework) !== void 0) {
|
|
129
|
+
transformers["*.{jsx,tsx}"] = [featureTransformer];
|
|
130
|
+
}
|
|
131
|
+
if (features.wasm) {
|
|
132
|
+
transformers["*.wasm"] = [featureTransformer];
|
|
133
|
+
}
|
|
134
|
+
if (isPostcssNeeded(features.styles)) {
|
|
135
|
+
transformers["*.{css,pcss}"] = [featureTransformer, "@parcel/transformer-css"];
|
|
136
|
+
}
|
|
137
|
+
const defines = getFrameworkDefines({ framework: features.framework, isProductionBuild: true });
|
|
138
|
+
transformers["*.{js,mjs,cjs,jsx,ts,mts,cts,tsx}"] = [
|
|
139
|
+
...Object.keys(defines).length > 0 ? [featureTransformer] : [],
|
|
140
|
+
`./${INLINE_IMPORTS_FILE_NAME}`,
|
|
141
|
+
"..."
|
|
142
|
+
];
|
|
143
|
+
const parcelrc = {
|
|
144
|
+
extends: consumerParcelrcPath ?? "@parcel/config-default",
|
|
145
|
+
namers: [`./${NAMER_FILE_NAME}`, "..."],
|
|
146
|
+
optimizers: {
|
|
147
|
+
"*.js": ["...", `./${OPTIMIZER_FILE_NAME}`]
|
|
148
|
+
},
|
|
149
|
+
resolvers: [`./${RESOLVER_FILE_NAME}`, "..."],
|
|
150
|
+
transformers
|
|
151
|
+
};
|
|
152
|
+
return {
|
|
153
|
+
[FEATURES_FILE_NAME]: `/*
|
|
154
|
+
* Generated by @mnaoumov/obsidian-dev-toolkit. Runs the toolkit's shared transforms for the build features, loaded
|
|
155
|
+
* from the toolkit itself, so parcel compiles each feature the way every other bundler adapter does.
|
|
156
|
+
*/
|
|
157
|
+
const { Transformer } = require('@parcel/plugin');
|
|
158
|
+
|
|
159
|
+
const FEATURES_MODULE_URL = ${JSON.stringify(getSiblingModuleUrl("obsidian-plugin-features"))};
|
|
160
|
+
const TRANSFORMS_MODULE_URL = ${JSON.stringify(getSiblingModuleUrl("obsidian-plugin-transforms"))};
|
|
161
|
+
const FRAMEWORK = ${JSON.stringify(features.framework ?? null)};
|
|
162
|
+
const STYLES = ${JSON.stringify(features.styles ?? {})};
|
|
163
|
+
|
|
164
|
+
module.exports = new Transformer({
|
|
165
|
+
async transform({ asset, options }) {
|
|
166
|
+
const { getFeatureFileKind, getFrameworkDefines, getJsxImportSource, replaceDefines } = await import(FEATURES_MODULE_URL);
|
|
167
|
+
const transforms = await import(TRANSFORMS_MODULE_URL);
|
|
168
|
+
const filePath = asset.filePath;
|
|
169
|
+
const isProductionBuild = options.mode === 'production';
|
|
170
|
+
const defines = getFrameworkDefines({ framework: FRAMEWORK ?? undefined, isProductionBuild });
|
|
171
|
+
switch (getFeatureFileKind(filePath)) {
|
|
172
|
+
case 'jsx': {
|
|
173
|
+
const code = await asset.getCode();
|
|
174
|
+
const jsxImportSource = getJsxImportSource(FRAMEWORK ?? undefined);
|
|
175
|
+
const result = FRAMEWORK === 'solid'
|
|
176
|
+
? await transforms.transformSolid({ code, filePath, isProductionBuild })
|
|
177
|
+
: await transforms.transformJsx({ code, filePath, isProductionBuild, jsxImportSource });
|
|
178
|
+
asset.setCode(replaceDefines(result.code, defines));
|
|
179
|
+
asset.type = 'js';
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
case 'stylesheet': {
|
|
183
|
+
const result = await transforms.transformCss({ filePath, isCssModuleScoped: false, isProductionBuild, source: await asset.getCode(), styles: STYLES });
|
|
184
|
+
asset.setCode(result.css);
|
|
185
|
+
for (const dependency of result.dependencies) {
|
|
186
|
+
asset.invalidateOnFileChange(dependency);
|
|
187
|
+
}
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
case 'svelte': {
|
|
191
|
+
const result = await transforms.transformSvelte({ code: await asset.getCode(), filePath, isProductionBuild });
|
|
192
|
+
asset.setCode(replaceDefines(result.code, defines));
|
|
193
|
+
asset.type = 'js';
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
case 'wasm':
|
|
197
|
+
asset.setCode(transforms.getWasmModuleCode(await asset.getBuffer()));
|
|
198
|
+
asset.type = 'js';
|
|
199
|
+
break;
|
|
200
|
+
default: {
|
|
201
|
+
// A framework's runtime reads process.env.NODE_ENV, which parcel leaves alone in an electron-renderer library.
|
|
202
|
+
const code = await asset.getCode();
|
|
203
|
+
const replaced = replaceDefines(code, defines);
|
|
204
|
+
if (replaced !== code) {
|
|
205
|
+
asset.setCode(replaced);
|
|
206
|
+
}
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return [asset];
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
`,
|
|
214
|
+
// `String.raw`, so the regular expression below reaches the file with its backslashes intact.
|
|
215
|
+
[INLINE_IMPORTS_FILE_NAME]: String.raw`/*
|
|
216
|
+
* Generated by @mnaoumov/obsidian-dev-toolkit. Keeps every dynamic import() inside main.js.
|
|
217
|
+
*
|
|
218
|
+
* Obsidian loads a plugin's main.js and nothing beside it, and parcel makes every import() a bundle of its
|
|
219
|
+
* own with no option to inline one. This rewrites import("<literal>") into a require() inside an async
|
|
220
|
+
* arrow, before parcel's own JavaScript transformer runs: the module still evaluates only when that code
|
|
221
|
+
* runs, and the promise still rejects when evaluation throws. Only a plain string specifier is rewritten,
|
|
222
|
+
* since a computed one cannot be bundled by any bundler.
|
|
223
|
+
*/
|
|
224
|
+
const { Transformer } = require('@parcel/plugin');
|
|
225
|
+
|
|
226
|
+
const DYNAMIC_IMPORT = /\bimport\(\s*(["'])([^"'\x60\n\\]+)\1\s*\)/gu;
|
|
227
|
+
|
|
228
|
+
module.exports = new Transformer({
|
|
229
|
+
async transform({ asset }) {
|
|
230
|
+
const source = await asset.getCode();
|
|
231
|
+
if (source.includes('import(')) {
|
|
232
|
+
asset.setCode(source.replace(DYNAMIC_IMPORT, (_match, quote, specifier) => '(async () => require(' + quote + specifier + quote + '))()'));
|
|
233
|
+
}
|
|
234
|
+
return [asset];
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
`,
|
|
238
|
+
[NAMER_FILE_NAME]: `/* Generated by @mnaoumov/obsidian-dev-toolkit. Obsidian loads a plugin's stylesheet from styles.css and nothing else. */
|
|
239
|
+
const { Namer } = require('@parcel/plugin');
|
|
240
|
+
|
|
241
|
+
module.exports = new Namer({
|
|
242
|
+
name({ bundle }) {
|
|
243
|
+
return bundle.type === 'css' ? '${ObsidianPluginRepoPaths.StylesCss}' : null;
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
`,
|
|
247
|
+
[OPTIMIZER_FILE_NAME]: `/*
|
|
248
|
+
* Generated by @mnaoumov/obsidian-dev-toolkit. Runs after parcel's own optimizers, on the JavaScript bundle.
|
|
249
|
+
*
|
|
250
|
+
* Obsidian evaluates main.js as the body of function (require, module, exports), with a module object that
|
|
251
|
+
* has no require of its own, and parcel's runtime reaches every external module through module.require.
|
|
252
|
+
* Without the first line below, the very first require('obsidian') throws "Cannot find module". The banner
|
|
253
|
+
* goes in here too, after minification, which would otherwise strip it as an ordinary comment.
|
|
254
|
+
*/
|
|
255
|
+
const { Optimizer } = require('@parcel/plugin');
|
|
256
|
+
|
|
257
|
+
const PREAMBLE = ${JSON.stringify(`${getObsidianPluginBanner("parcel")}if (typeof module === 'object' && typeof module.require !== 'function') { module.require = require; }
|
|
258
|
+
`)};
|
|
259
|
+
const PREAMBLE_LINE_COUNT = ${String(getObsidianPluginBanner("parcel").split("\n").length)};
|
|
260
|
+
|
|
261
|
+
async function readContents(contents) {
|
|
262
|
+
if (typeof contents === 'string') {
|
|
263
|
+
return contents;
|
|
264
|
+
}
|
|
265
|
+
if (Buffer.isBuffer(contents)) {
|
|
266
|
+
return contents.toString('utf-8');
|
|
267
|
+
}
|
|
268
|
+
const chunks = [];
|
|
269
|
+
for await (const chunk of contents) {
|
|
270
|
+
chunks.push(Buffer.from(chunk));
|
|
271
|
+
}
|
|
272
|
+
return Buffer.concat(chunks).toString('utf-8');
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
module.exports = new Optimizer({
|
|
276
|
+
async optimize({ contents, map }) {
|
|
277
|
+
const code = await readContents(contents);
|
|
278
|
+
if (map) {
|
|
279
|
+
map.offsetLines(1, PREAMBLE_LINE_COUNT);
|
|
280
|
+
}
|
|
281
|
+
return { contents: PREAMBLE + code, map };
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
`,
|
|
285
|
+
[PARCELRC]: `${JSON.stringify(parcelrc, null, JSON_INDENT)}
|
|
286
|
+
`,
|
|
287
|
+
[RESOLVER_FILE_NAME]: `/* Generated by @mnaoumov/obsidian-dev-toolkit. Leaves the modules Obsidian supplies at runtime to require(). */
|
|
288
|
+
const { Resolver } = require('@parcel/plugin');
|
|
289
|
+
|
|
290
|
+
const EXTERNALS = new Set(${JSON.stringify(OBSIDIAN_PLUGIN_EXTERNALS)});
|
|
291
|
+
|
|
292
|
+
function getPackageName(specifier) {
|
|
293
|
+
const segments = specifier.split('/');
|
|
294
|
+
return specifier.startsWith('@') ? segments.slice(0, 2).join('/') : segments[0];
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
module.exports = new Resolver({
|
|
298
|
+
resolve({ specifier }) {
|
|
299
|
+
const isExternal = specifier.startsWith('node:') || EXTERNALS.has(specifier) || EXTERNALS.has(getPackageName(specifier));
|
|
300
|
+
return isExternal ? { isExcluded: true } : null;
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
`
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
function getParcelOptions(params) {
|
|
307
|
+
const { buildContext, cacheFolder, configPath } = params;
|
|
308
|
+
const target = {
|
|
309
|
+
context: "electron-renderer",
|
|
310
|
+
// eslint-disable-next-line unicorn/name-replacements -- `distDir` is the name parcel's API reads.
|
|
311
|
+
distDir: buildContext.distFolder,
|
|
312
|
+
includeNodeModules: true,
|
|
313
|
+
isLibrary: true,
|
|
314
|
+
optimize: buildContext.isProductionBuild,
|
|
315
|
+
outputFormat: "commonjs",
|
|
316
|
+
sourceMap: !buildContext.isProductionBuild && { inline: true }
|
|
317
|
+
};
|
|
318
|
+
return {
|
|
319
|
+
// eslint-disable-next-line unicorn/name-replacements -- `cacheDir` is the name parcel's API reads.
|
|
320
|
+
cacheDir: cacheFolder,
|
|
321
|
+
config: configPath,
|
|
322
|
+
defaultTargetOptions: {
|
|
323
|
+
// eslint-disable-next-line unicorn/name-replacements -- `distDir` is the name parcel's API reads.
|
|
324
|
+
distDir: buildContext.distFolder,
|
|
325
|
+
shouldOptimize: buildContext.isProductionBuild,
|
|
326
|
+
sourceMaps: !buildContext.isProductionBuild
|
|
327
|
+
},
|
|
328
|
+
entries: buildContext.entryPoint,
|
|
329
|
+
mode: buildContext.isProductionBuild ? "production" : "development",
|
|
330
|
+
targets: { obsidianPlugin: target }
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
function formatParcelError(error) {
|
|
334
|
+
const diagnostics = error?.diagnostics;
|
|
335
|
+
if (diagnostics && diagnostics.length > 0) {
|
|
336
|
+
return diagnostics.map((diagnostic) => diagnostic.message).join("\n");
|
|
337
|
+
}
|
|
338
|
+
return error instanceof Error ? error.stack ?? error.message : String(error);
|
|
339
|
+
}
|
|
340
|
+
function getSiblingModuleUrl(baseName) {
|
|
341
|
+
return new URL(`${baseName}${extname(new URL(import.meta.url).pathname)}`, import.meta.url).href;
|
|
342
|
+
}
|
|
343
|
+
function handleWatchEvent(event, buildContext) {
|
|
344
|
+
if (event?.type === "buildFailure") {
|
|
345
|
+
console.error(event.diagnostics.map((diagnostic) => diagnostic.message).join("\n"));
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
if (event?.type !== "buildSuccess") {
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
console.warn(`Rebuilt with parcel in ${String(event.buildTime)} ms.`);
|
|
352
|
+
invokeAsyncSafely(() => deployToObsidianPluginsFolder(buildContext));
|
|
353
|
+
}
|
|
354
|
+
export {
|
|
355
|
+
build,
|
|
356
|
+
buildObsidianPluginWithParcel,
|
|
357
|
+
dev,
|
|
358
|
+
getParcelConfigFiles,
|
|
359
|
+
getParcelOptions
|
|
360
|
+
};
|
|
361
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9wYXJjZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEJ1aWxkcyBhbiBPYnNpZGlhbiBwbHVnaW4gd2l0aCBwYXJjZWw6IGBidWlsZCgpYCBhbmQgYGRldigpYCwgdGhlIHNhbWUgdHdvIGVudHJ5IHBvaW50cyB0aGUgZXNidWlsZFxuICogYnVpbGRlciBoYXMsIHByb2R1Y2luZyB0aGUgc2FtZSBgbWFpbi5qc2AgKyBgc3R5bGVzLmNzc2AgKyBgbWFuaWZlc3QuanNvbmAgbGF5b3V0LlxuICpcbiAqIFBhcmNlbCB0YWtlcyBubyBgZXh0ZXJuYWxgIGxpc3QgYW5kIG5vIG91dHB1dCBmaWxlIG5hbWUsIG9ubHkgcGx1Z2lucyBuYW1lZCBpbiBhIGAucGFyY2VscmNgLiBTbyB0aGVcbiAqIGJ1aWxkIHdyaXRlcyBhIGAucGFyY2VscmNgIG9mIGl0cyBvd24gaW50byBgLnBhcmNlbC1jYWNoZWAsIGJlc2lkZSBhIHJlc29sdmVyIHRoYXQgbGVhdmVzXG4gKiBPYnNpZGlhbidzIG1vZHVsZXMgZXh0ZXJuYWwsIGEgbmFtZXIgdGhhdCBuYW1lcyB0aGUgc3R5bGVzaGVldCBgc3R5bGVzLmNzc2AgYW5kIGEgdHJhbnNmb3JtZXIgdGhhdCBrZWVwc1xuICogZHluYW1pYyBpbXBvcnRzIGluc2lkZSBgbWFpbi5qc2AsIGFuZCBleHRlbmRzIHRoZVxuICogY29uc3VtZXIncyBvd24gYC5wYXJjZWxyY2Agd2hlbiB0aGVyZSBpcyBvbmUgKG9yIGBAcGFyY2VsL2NvbmZpZy1kZWZhdWx0YCB3aGVuIHRoZXJlIGlzIG5vbmUpLCBzbyBldmVyeVxuICogdHJhbnNmb3JtZXIgdGhlIGNvbnN1bWVyIGNvbmZpZ3VyZWQgc3RpbGwgYXBwbGllcy5cbiAqXG4gKiBgQHBhcmNlbC9jb3JlYCwgYEBwYXJjZWwvcGx1Z2luYCBhbmQgYEBwYXJjZWwvY29uZmlnLWRlZmF1bHRgIGFyZSBvcHRpb25hbCBwZWVyIGRlcGVuZGVuY2llcywgbG9hZGVkXG4gKiBvbmx5IHdoZW4gYSBwYXJjZWwgYnVpbGQgcnVucywgc28gYSBwbHVnaW4gYnVpbHQgd2l0aCBlc2J1aWxkIGluc3RhbGxzIG5vdGhpbmcgZXh0cmEuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZEV2ZW50LFxuICBJbml0aWFsUGFyY2VsT3B0aW9ucyxcbiAgVGFyZ2V0RGVzY3JpcHRvclxufSBmcm9tICdAcGFyY2VsL3R5cGVzJztcblxuaW1wb3J0IHsgQ2xpVGFza1Jlc3VsdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L2NsaS11dGlscyc7XG5pbXBvcnQgeyBucG1SdW5PcHRpb25hbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L25wbS1ydW4nO1xuaW1wb3J0IHsgaW52b2tlQXN5bmNTYWZlbHkgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXN5bmMnO1xuaW1wb3J0IHtcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmUsXG4gIHRvUG9zaXhQYXRoXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9wYXRoJztcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0LFxuICBPYnNpZGlhblBsdWdpbkRlcGxveW1lbnRPcHRpb25zXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWJ1aWxkLnRzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucyB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcblxuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuLi9vYnNpZGlhbi1wbHVnaW4tcmVwby1wYXRocy50cyc7XG5pbXBvcnQge1xuICBCdWlsZE1vZGUsXG4gIGNsZWFuT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyLFxuICBjb21wbGV0ZU9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcixcbiAgZ2V0T2JzaWRpYW5QbHVnaW5CYW5uZXIsXG4gIE9CU0lESUFOX1BMVUdJTl9FWFRFUk5BTFMsXG4gIHJlc29sdmVGcm9tUm9vdCxcbiAgcmVzb2x2ZU9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0XG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWJ1aWxkLnRzJztcbmltcG9ydCB7XG4gIGdldEZyYW1ld29ya0RlZmluZXMsXG4gIGdldEpzeEltcG9ydFNvdXJjZSxcbiAgaXNQb3N0Y3NzTmVlZGVkXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcbmltcG9ydCB7IGRlcGxveVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW5zLWZvbGRlci1kZXBsb3ltZW50LnRzJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgYnVpbGRPYnNpZGlhblBsdWdpbldpdGhQYXJjZWx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsUGFyYW1zIGV4dGVuZHMgQnVpbGRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgYnVpbGQgbW9kZSwgZWl0aGVyIGBEZXZlbG9wbWVudGAgb3IgYFByb2R1Y3Rpb25gLlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZTogQnVpbGRNb2RlO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBidWlsZH0gYW5kIHtAbGluayBkZXZ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3B0aW9ucyBleHRlbmRzIE9ic2lkaWFuUGx1Z2luRGVwbG95bWVudE9wdGlvbnMsIE9ic2lkaWFuUGx1Z2luRmVhdHVyZU9wdGlvbnMge1xuICAvKipcbiAgICogQ3VzdG9taXplcyB0aGUgb3B0aW9ucyBoYW5kZWQgdG8gcGFyY2VsJ3MgYFBhcmNlbGAgY2xhc3MuXG4gICAqL1xuICByZWFkb25seSBjdXN0b21pemVQYXJjZWxPcHRpb25zPzogKG9wdGlvbnM6IEluaXRpYWxQYXJjZWxPcHRpb25zKSA9PiBJbml0aWFsUGFyY2VsT3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0UGFyY2VsQ29uZmlnRmlsZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFBhcmNlbENvbmZpZ0ZpbGVzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb25zdW1lcidzIG93biBgLnBhcmNlbHJjYCwgcmVsYXRpdmUgdG8gdGhlIGdlbmVyYXRlZCBjb25maWd1cmF0aW9uJ3MgZm9sZGVyLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBwcm9qZWN0XG4gICAqIGhhcyBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uc3VtZXJQYXJjZWxyY1BhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGJ1aWxkIGZlYXR1cmVzLlxuICAgKi9cbiAgcmVhZG9ubHkgZmVhdHVyZXM/OiBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRQYXJjZWxPcHRpb25zfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRQYXJjZWxPcHRpb25zUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBidWlsZCBjb250ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRDb250ZXh0OiBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dDtcblxuICAvKipcbiAgICogUGFyY2VsJ3MgY2FjaGUgZm9sZGVyLiBOYW1lZCBleHBsaWNpdGx5IGJlY2F1c2UgcGFyY2VsIG90aGVyd2lzZSB0YWtlcyB0aGUgZm9sZGVyIG9mIHRoZSBuZWFyZXN0XG4gICAqIGxvY2tmaWxlIGZvciB0aGUgcHJvamVjdCByb290LCB3aGljaCBpbiBhIHdvcmtzcGFjZSBpcyBub3QgdGhlIHBsdWdpbidzLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGVGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGdlbmVyYXRlZCBgLnBhcmNlbHJjYC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ1BhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgZmlsZXMgb2YgdGhlIGdlbmVyYXRlZCBwYXJjZWwgY29uZmlndXJhdGlvbiwgYnkgZmlsZSBuYW1lLlxuICovXG5leHBvcnQgdHlwZSBQYXJjZWxDb25maWdGaWxlcyA9IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuXG4vLyBJbnNpZGUgcGFyY2VsJ3Mgb3duIGNhY2hlIGZvbGRlcjogcGFyY2VsIHJlZnVzZXMgcmVsYXRpdmUgcGx1Z2lucyBpbiBhIGNvbmZpZyB1bmRlciBgbm9kZV9tb2R1bGVzYCAoaXRcbi8vIHRha2VzIHN1Y2ggYSBjb25maWcgZm9yIGEgcHVibGlzaGVkIHBhY2thZ2UpLCBhbmQgaXQgbmV2ZXIgd2F0Y2hlcyBpdHMgY2FjaGUgZm9sZGVyLCBzbyByZWdlbmVyYXRpbmdcbi8vIHRoZXNlIGZpbGVzIG9uIGV2ZXJ5IGJ1aWxkIGNhbm5vdCB0cmlnZ2VyIGEgcmVidWlsZC5cbmNvbnN0IFBBUkNFTF9DQUNIRV9GT0xERVIgPSAnLnBhcmNlbC1jYWNoZSc7XG5jb25zdCBHRU5FUkFURURfUEFSQ0VMX0NPTkZJR19GT0xERVIgPSBgJHtQQVJDRUxfQ0FDSEVfRk9MREVSfS9vYnNpZGlhbi1kZXYtdG9vbGtpdGA7XG5jb25zdCBQQVJDRUxSQyA9ICcucGFyY2VscmMnO1xuXG4vKipcbiAqIE9uZSBkaWFnbm9zdGljIG9mIGEge0BsaW5rIFBhcmNlbEVycm9yTGlrZX0uXG4gKi9cbmludGVyZmFjZSBQYXJjZWxFcnJvckRpYWdub3N0aWMge1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hhdCBwYXJjZWwgdGhyb3dzIHdoZW4gYSBidWlsZCBmYWlsczogYW4gZXJyb3IgY2FycnlpbmcgaXRzIGRpYWdub3N0aWNzLlxuICovXG5pbnRlcmZhY2UgUGFyY2VsRXJyb3JMaWtlIHtcbiAgcmVhZG9ubHkgZGlhZ25vc3RpY3M/OiByZWFkb25seSBQYXJjZWxFcnJvckRpYWdub3N0aWNbXTtcbn1cbmNvbnN0IFJFU09MVkVSX0ZJTEVfTkFNRSA9ICdvYnNpZGlhbi1wbHVnaW4tcmVzb2x2ZXIuY2pzJztcbmNvbnN0IE5BTUVSX0ZJTEVfTkFNRSA9ICdvYnNpZGlhbi1wbHVnaW4tbmFtZXIuY2pzJztcbmNvbnN0IElOTElORV9JTVBPUlRTX0ZJTEVfTkFNRSA9ICdvYnNpZGlhbi1wbHVnaW4taW5saW5lLWltcG9ydHMuY2pzJztcbmNvbnN0IE9QVElNSVpFUl9GSUxFX05BTUUgPSAnb2JzaWRpYW4tcGx1Z2luLW9wdGltaXplci5janMnO1xuY29uc3QgRkVBVFVSRVNfRklMRV9OQU1FID0gJ29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcy5janMnO1xuY29uc3QgSlNPTl9JTkRFTlQgPSAyO1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gUnVucyBhIHJlYWwgcGFyY2VsIGJ1aWxkOyBleGVyY2lzZWQgYnkgdGhlIGJ1bmRsZXIgaW50ZWdyYXRpb24gdGVzdC4gKi9cbi8qKlxuICogQnVpbGRzIHRoZSBPYnNpZGlhbiBwbHVnaW4gaW4gcHJvZHVjdGlvbiBtb2RlIHVzaW5nIHBhcmNlbC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGJ1aWxkIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJ1aWxkIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGQob3B0aW9ucz86IEJ1aWxkT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBidWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbCh7IC4uLm9wdGlvbnMsIG1vZGU6IEJ1aWxkTW9kZS5Qcm9kdWN0aW9uIH0pO1xuICByZXN1bHQudGhyb3dPbkZhaWx1cmUoKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIE9ic2lkaWFuIHBsdWdpbiB3aXRoIHBhcmNlbCwgb25jZSBmb3IgYSBwcm9kdWN0aW9uIGJ1aWxkLCBvciB3YXRjaGluZyBmb3IgYSBkZXZlbG9wbWVudCBvbmUuXG4gKlxuICogUnVucyB0aGUgcHJvamVjdCdzIGBidWlsZDpjb21waWxlYCBzY3JpcHQgZmlyc3Qgd2hlbiBpdCBoYXMgb25lLCBhcyB0aGUgZXNidWlsZCBidWlsZGVyIGRvZXMsIHNpbmNlXG4gKiBwYXJjZWwgc3RyaXBzIFR5cGVTY3JpcHQgdHlwZXMgd2l0aG91dCBjaGVja2luZyB0aGVtLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSB7QGxpbmsgQ2xpVGFza1Jlc3VsdH0gaW5kaWNhdGluZyB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSBidWlsZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsKHBhcmFtczogQnVpbGRPYnNpZGlhblBsdWdpbldpdGhQYXJjZWxQYXJhbXMpOiBQcm9taXNlPENsaVRhc2tSZXN1bHQ+IHtcbiAgYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ2J1aWxkOmNvbXBpbGUnKTtcbiAgY29uc3QgYnVpbGRDb250ZXh0ID0gYXdhaXQgcmVzb2x2ZU9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0KHBhcmFtcyk7XG4gIGF3YWl0IGNsZWFuT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyKGJ1aWxkQ29udGV4dC5kaXN0Rm9sZGVyKTtcbiAgYXdhaXQgY29tcGxldGVPYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIoYnVpbGRDb250ZXh0KTtcblxuICBjb25zdCBjb25maWdGb2xkZXIgPSByZXNvbHZlRnJvbVJvb3QoR0VORVJBVEVEX1BBUkNFTF9DT05GSUdfRk9MREVSKTtcbiAgY29uc3QgY29uc3VtZXJQYXJjZWxyY1BhdGggPSByZXNvbHZlRnJvbVJvb3QoUEFSQ0VMUkMpO1xuICBhd2FpdCBta2Rpcihjb25maWdGb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBjb25maWdGaWxlcyA9IGdldFBhcmNlbENvbmZpZ0ZpbGVzKHtcbiAgICBjb25zdW1lclBhcmNlbHJjUGF0aDogZXhpc3RzU3luYyhjb25zdW1lclBhcmNlbHJjUGF0aCkgPyB0b1Bvc2l4UGF0aChyZWxhdGl2ZShjb25maWdGb2xkZXIsIGNvbnN1bWVyUGFyY2VscmNQYXRoKSkgOiB1bmRlZmluZWQsXG4gICAgZmVhdHVyZXM6IHBhcmFtc1xuICB9KTtcbiAgZm9yIChjb25zdCBbZmlsZU5hbWUsIGNvbnRlbnRzXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdGaWxlcykpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oY29uZmlnRm9sZGVyLCBmaWxlTmFtZSk7XG4gICAgLy8gUmV3cml0dGVuIG9ubHkgd2hlbiBpdCBjaGFuZ2VkOiBwYXJjZWwgaW52YWxpZGF0ZXMgaXRzIGNhY2hlIG9uIGEgY29uZmlnIGZpbGUncyBtb2RpZmljYXRpb24gdGltZS5cbiAgICBpZiAoIWV4aXN0c1N5bmMoZmlsZVBhdGgpIHx8IGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKSAhPT0gY29udGVudHMpIHtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgY29udGVudHMsICd1dGYtOCcpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHsgUGFyY2VsIH0gPSBhd2FpdCBpbXBvcnQoJ0BwYXJjZWwvY29yZScpO1xuICBjb25zdCBwYXJjZWxPcHRpb25zID0gZ2V0UGFyY2VsT3B0aW9ucyh7IGJ1aWxkQ29udGV4dCwgY2FjaGVGb2xkZXI6IHJlc29sdmVGcm9tUm9vdChQQVJDRUxfQ0FDSEVfRk9MREVSKSwgY29uZmlnUGF0aDogam9pbihjb25maWdGb2xkZXIsIFBBUkNFTFJDKSB9KTtcbiAgY29uc3QgYnVuZGxlciA9IG5ldyBQYXJjZWwocGFyYW1zLmN1c3RvbWl6ZVBhcmNlbE9wdGlvbnM/LihwYXJjZWxPcHRpb25zKSA/PyBwYXJjZWxPcHRpb25zKTtcblxuICBpZiAoYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgYnVpbGRUaW1lLCBidW5kbGVHcmFwaCB9ID0gYXdhaXQgYnVuZGxlci5ydW4oKTtcbiAgICAgIGNvbnNvbGUud2FybihgQnVpbHQgJHtTdHJpbmcoYnVuZGxlR3JhcGguZ2V0QnVuZGxlcygpLmxlbmd0aCl9IGJ1bmRsZShzKSB3aXRoIHBhcmNlbCBpbiAke1N0cmluZyhidWlsZFRpbWUpfSBtcy5gKTtcbiAgICAgIHJldHVybiBDbGlUYXNrUmVzdWx0LlN1Y2Nlc3MoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihmb3JtYXRQYXJjZWxFcnJvcihlcnJvcikpO1xuICAgICAgcmV0dXJuIENsaVRhc2tSZXN1bHQuRmFpbHVyZSgpO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IGJ1bmRsZXIud2F0Y2goKGVycm9yLCBldmVudCkgPT4ge1xuICAgIGlmIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihmb3JtYXRQYXJjZWxFcnJvcihlcnJvcikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBoYW5kbGVXYXRjaEV2ZW50KGV2ZW50LCBidWlsZENvbnRleHQpO1xuICB9KTtcbiAgcmV0dXJuIENsaVRhc2tSZXN1bHQuRG9Ob3RFeGl0KCk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBPYnNpZGlhbiBwbHVnaW4gaW4gZGV2ZWxvcG1lbnQgbW9kZSB1c2luZyBwYXJjZWwsIHdhdGNoaW5nIGZvciBjaGFuZ2VzIGFuZCBkZXBsb3lpbmcgZXZlcnlcbiAqIHN1Y2Nlc3NmdWwgcmVidWlsZCBpbnRvIHRoZSB2YXVsdC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGJ1aWxkIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGEge0BsaW5rIENsaVRhc2tSZXN1bHR9IGluZGljYXRpbmcgdGhlIGJ1aWxkIHJlc3VsdC5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBJbnRlbnRpb25hbGx5IHNoYXJlcyBCdWlsZE9wdGlvbnMgd2l0aCBidWlsZCgpLlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRldihvcHRpb25zPzogQnVpbGRPcHRpb25zKTogUHJvbWlzZTxDbGlUYXNrUmVzdWx0PiB7XG4gIHJldHVybiBhd2FpdCBidWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbCh7IC4uLm9wdGlvbnMsIG1vZGU6IEJ1aWxkTW9kZS5EZXZlbG9wbWVudCB9KTtcbn1cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBmaWxlcyBvZiB0aGUgcGFyY2VsIGNvbmZpZ3VyYXRpb24gdGhlIGJ1aWxkIHJ1bnMgd2l0aC5cbiAqXG4gKiBUaGUgYnVpbGQgZmVhdHVyZXMgYWRkIHBpcGVsaW5lcyB0aGF0IHJ1biB0aGUgdG9vbGtpdCdzIHNoYXJlZCB0cmFuc2Zvcm1zLCB0aHJvdWdoIG9uZSBnZW5lcmF0ZWQgdHJhbnNmb3JtZXIgdGhhdFxuICogbG9hZHMgdGhlbSBmcm9tIHRoZSB0b29sa2l0OiBTb2xpZCdzIGAuanN4YCAvIGAudHN4YCwgU3ZlbHRlJ3MgYC5zdmVsdGVgIC8gYC5zdmVsdGUudHNgIC8gYC5zdmVsdGUuanNgLCBgLndhc21gLFxuICogYW5kIHdpdGggYHN0eWxlcy5wb3N0Y3NzYCBvciBgc3R5bGVzLnRhaWx3aW5kYCBldmVyeSBzdHlsZXNoZWV0LCBpbiBwbGFjZSBvZiBwYXJjZWwncyBvd24gUG9zdENTUyBzdGVwLiBSZWFjdCBhbmRcbiAqIFByZWFjdCBKU1ggaXMgY29tcGlsZWQgaGVyZSB0b28sIHNpbmNlIHBhcmNlbCByZWFkcyB0aGUgSlNYIHJ1bnRpbWUgZnJvbSBhIHRzY29uZmlnIHdpdGhvdXQgZm9sbG93aW5nIGl0cyBgZXh0ZW5kc2AsXG4gKiBhbmQgd2l0aCBhbnkgZnJhbWV3b3JrIGV2ZXJ5IHNjcmlwdCBoYXMgdGhlIGZyYW1ld29yaydzIGNvbXBpbGUtdGltZSBjb25zdGFudHMgcmVwbGFjZWQuIFBhcmNlbCBjb21waWxlcyBWdWUgd2l0aFxuICogYEBwYXJjZWwvdHJhbnNmb3JtZXItdnVlYCBhbmQgc2NvcGVzIGAqLm1vZHVsZS5jc3NgIGl0c2VsZiwgc28gdGhvc2UgbmVlZCBubyBwaXBlbGluZSBoZXJlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEdldFBhcmNlbENvbmZpZ0ZpbGVzUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBmaWxlcywgYnkgZmlsZSBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyY2VsQ29uZmlnRmlsZXMocGFyYW1zOiBHZXRQYXJjZWxDb25maWdGaWxlc1BhcmFtcyk6IFBhcmNlbENvbmZpZ0ZpbGVzIHtcbiAgY29uc3QgeyBjb25zdW1lclBhcmNlbHJjUGF0aCwgZmVhdHVyZXMgPSB7fSB9ID0gcGFyYW1zO1xuICBjb25zdCBmZWF0dXJlVHJhbnNmb3JtZXIgPSBgLi8ke0ZFQVRVUkVTX0ZJTEVfTkFNRX1gO1xuICBjb25zdCB0cmFuc2Zvcm1lcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICBpZiAoZmVhdHVyZXMuZnJhbWV3b3JrID09PSAnc3ZlbHRlJykge1xuICAgIHRyYW5zZm9ybWVyc1snKi5zdmVsdGUnXSA9IFtmZWF0dXJlVHJhbnNmb3JtZXJdO1xuICAgIHRyYW5zZm9ybWVyc1snKi5zdmVsdGUue2pzLHRzfSddID0gW2ZlYXR1cmVUcmFuc2Zvcm1lciwgYC4vJHtJTkxJTkVfSU1QT1JUU19GSUxFX05BTUV9YCwgJy4uLiddO1xuICB9XG4gIGlmIChmZWF0dXJlcy5mcmFtZXdvcmsgPT09ICdzb2xpZCcgfHwgZ2V0SnN4SW1wb3J0U291cmNlKGZlYXR1cmVzLmZyYW1ld29yaykgIT09IHVuZGVmaW5lZCkge1xuICAgIHRyYW5zZm9ybWVyc1snKi57anN4LHRzeH0nXSA9IFtmZWF0dXJlVHJhbnNmb3JtZXJdO1xuICB9XG4gIGlmIChmZWF0dXJlcy53YXNtKSB7XG4gICAgdHJhbnNmb3JtZXJzWycqLndhc20nXSA9IFtmZWF0dXJlVHJhbnNmb3JtZXJdO1xuICB9XG4gIGlmIChpc1Bvc3Rjc3NOZWVkZWQoZmVhdHVyZXMuc3R5bGVzKSkge1xuICAgIHRyYW5zZm9ybWVyc1snKi57Y3NzLHBjc3N9J10gPSBbZmVhdHVyZVRyYW5zZm9ybWVyLCAnQHBhcmNlbC90cmFuc2Zvcm1lci1jc3MnXTtcbiAgfVxuICBjb25zdCBkZWZpbmVzID0gZ2V0RnJhbWV3b3JrRGVmaW5lcyh7IGZyYW1ld29yazogZmVhdHVyZXMuZnJhbWV3b3JrLCBpc1Byb2R1Y3Rpb25CdWlsZDogdHJ1ZSB9KTtcbiAgdHJhbnNmb3JtZXJzWycqLntqcyxtanMsY2pzLGpzeCx0cyxtdHMsY3RzLHRzeH0nXSA9IFtcbiAgICAuLi5PYmplY3Qua2V5cyhkZWZpbmVzKS5sZW5ndGggPiAwID8gW2ZlYXR1cmVUcmFuc2Zvcm1lcl0gOiBbXSxcbiAgICBgLi8ke0lOTElORV9JTVBPUlRTX0ZJTEVfTkFNRX1gLFxuICAgICcuLi4nXG4gIF07XG5cbiAgY29uc3QgcGFyY2VscmMgPSB7XG4gICAgZXh0ZW5kczogY29uc3VtZXJQYXJjZWxyY1BhdGggPz8gJ0BwYXJjZWwvY29uZmlnLWRlZmF1bHQnLFxuICAgIG5hbWVyczogW2AuLyR7TkFNRVJfRklMRV9OQU1FfWAsICcuLi4nXSxcbiAgICBvcHRpbWl6ZXJzOiB7XG4gICAgICAnKi5qcyc6IFsnLi4uJywgYC4vJHtPUFRJTUlaRVJfRklMRV9OQU1FfWBdXG4gICAgfSxcbiAgICByZXNvbHZlcnM6IFtgLi8ke1JFU09MVkVSX0ZJTEVfTkFNRX1gLCAnLi4uJ10sXG4gICAgdHJhbnNmb3JtZXJzXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBbRkVBVFVSRVNfRklMRV9OQU1FXTogYC8qXG4gKiBHZW5lcmF0ZWQgYnkgQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0LiBSdW5zIHRoZSB0b29sa2l0J3Mgc2hhcmVkIHRyYW5zZm9ybXMgZm9yIHRoZSBidWlsZCBmZWF0dXJlcywgbG9hZGVkXG4gKiBmcm9tIHRoZSB0b29sa2l0IGl0c2VsZiwgc28gcGFyY2VsIGNvbXBpbGVzIGVhY2ggZmVhdHVyZSB0aGUgd2F5IGV2ZXJ5IG90aGVyIGJ1bmRsZXIgYWRhcHRlciBkb2VzLlxuICovXG5jb25zdCB7IFRyYW5zZm9ybWVyIH0gPSByZXF1aXJlKCdAcGFyY2VsL3BsdWdpbicpO1xuXG5jb25zdCBGRUFUVVJFU19NT0RVTEVfVVJMID0gJHtKU09OLnN0cmluZ2lmeShnZXRTaWJsaW5nTW9kdWxlVXJsKCdvYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMnKSl9O1xuY29uc3QgVFJBTlNGT1JNU19NT0RVTEVfVVJMID0gJHtKU09OLnN0cmluZ2lmeShnZXRTaWJsaW5nTW9kdWxlVXJsKCdvYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3JtcycpKX07XG5jb25zdCBGUkFNRVdPUksgPSAke0pTT04uc3RyaW5naWZ5KGZlYXR1cmVzLmZyYW1ld29yayA/PyBudWxsKX07XG5jb25zdCBTVFlMRVMgPSAke0pTT04uc3RyaW5naWZ5KGZlYXR1cmVzLnN0eWxlcyA/PyB7fSl9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUcmFuc2Zvcm1lcih7XG4gIGFzeW5jIHRyYW5zZm9ybSh7IGFzc2V0LCBvcHRpb25zIH0pIHtcbiAgICBjb25zdCB7IGdldEZlYXR1cmVGaWxlS2luZCwgZ2V0RnJhbWV3b3JrRGVmaW5lcywgZ2V0SnN4SW1wb3J0U291cmNlLCByZXBsYWNlRGVmaW5lcyB9ID0gYXdhaXQgaW1wb3J0KEZFQVRVUkVTX01PRFVMRV9VUkwpO1xuICAgIGNvbnN0IHRyYW5zZm9ybXMgPSBhd2FpdCBpbXBvcnQoVFJBTlNGT1JNU19NT0RVTEVfVVJMKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGFzc2V0LmZpbGVQYXRoO1xuICAgIGNvbnN0IGlzUHJvZHVjdGlvbkJ1aWxkID0gb3B0aW9ucy5tb2RlID09PSAncHJvZHVjdGlvbic7XG4gICAgY29uc3QgZGVmaW5lcyA9IGdldEZyYW1ld29ya0RlZmluZXMoeyBmcmFtZXdvcms6IEZSQU1FV09SSyA/PyB1bmRlZmluZWQsIGlzUHJvZHVjdGlvbkJ1aWxkIH0pO1xuICAgIHN3aXRjaCAoZ2V0RmVhdHVyZUZpbGVLaW5kKGZpbGVQYXRoKSkge1xuICAgICAgY2FzZSAnanN4Jzoge1xuICAgICAgICBjb25zdCBjb2RlID0gYXdhaXQgYXNzZXQuZ2V0Q29kZSgpO1xuICAgICAgICBjb25zdCBqc3hJbXBvcnRTb3VyY2UgPSBnZXRKc3hJbXBvcnRTb3VyY2UoRlJBTUVXT1JLID8/IHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IEZSQU1FV09SSyA9PT0gJ3NvbGlkJ1xuICAgICAgICAgID8gYXdhaXQgdHJhbnNmb3Jtcy50cmFuc2Zvcm1Tb2xpZCh7IGNvZGUsIGZpbGVQYXRoLCBpc1Byb2R1Y3Rpb25CdWlsZCB9KVxuICAgICAgICAgIDogYXdhaXQgdHJhbnNmb3Jtcy50cmFuc2Zvcm1Kc3goeyBjb2RlLCBmaWxlUGF0aCwgaXNQcm9kdWN0aW9uQnVpbGQsIGpzeEltcG9ydFNvdXJjZSB9KTtcbiAgICAgICAgYXNzZXQuc2V0Q29kZShyZXBsYWNlRGVmaW5lcyhyZXN1bHQuY29kZSwgZGVmaW5lcykpO1xuICAgICAgICBhc3NldC50eXBlID0gJ2pzJztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHlsZXNoZWV0Jzoge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2Zvcm1zLnRyYW5zZm9ybUNzcyh7IGZpbGVQYXRoLCBpc0Nzc01vZHVsZVNjb3BlZDogZmFsc2UsIGlzUHJvZHVjdGlvbkJ1aWxkLCBzb3VyY2U6IGF3YWl0IGFzc2V0LmdldENvZGUoKSwgc3R5bGVzOiBTVFlMRVMgfSk7XG4gICAgICAgIGFzc2V0LnNldENvZGUocmVzdWx0LmNzcyk7XG4gICAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiByZXN1bHQuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgYXNzZXQuaW52YWxpZGF0ZU9uRmlsZUNoYW5nZShkZXBlbmRlbmN5KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N2ZWx0ZSc6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNmb3Jtcy50cmFuc2Zvcm1TdmVsdGUoeyBjb2RlOiBhd2FpdCBhc3NldC5nZXRDb2RlKCksIGZpbGVQYXRoLCBpc1Byb2R1Y3Rpb25CdWlsZCB9KTtcbiAgICAgICAgYXNzZXQuc2V0Q29kZShyZXBsYWNlRGVmaW5lcyhyZXN1bHQuY29kZSwgZGVmaW5lcykpO1xuICAgICAgICBhc3NldC50eXBlID0gJ2pzJztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd3YXNtJzpcbiAgICAgICAgYXNzZXQuc2V0Q29kZSh0cmFuc2Zvcm1zLmdldFdhc21Nb2R1bGVDb2RlKGF3YWl0IGFzc2V0LmdldEJ1ZmZlcigpKSk7XG4gICAgICAgIGFzc2V0LnR5cGUgPSAnanMnO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLy8gQSBmcmFtZXdvcmsncyBydW50aW1lIHJlYWRzIHByb2Nlc3MuZW52Lk5PREVfRU5WLCB3aGljaCBwYXJjZWwgbGVhdmVzIGFsb25lIGluIGFuIGVsZWN0cm9uLXJlbmRlcmVyIGxpYnJhcnkuXG4gICAgICAgIGNvbnN0IGNvZGUgPSBhd2FpdCBhc3NldC5nZXRDb2RlKCk7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VkID0gcmVwbGFjZURlZmluZXMoY29kZSwgZGVmaW5lcyk7XG4gICAgICAgIGlmIChyZXBsYWNlZCAhPT0gY29kZSkge1xuICAgICAgICAgIGFzc2V0LnNldENvZGUocmVwbGFjZWQpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW2Fzc2V0XTtcbiAgfVxufSk7XG5gLFxuICAgIC8vIGBTdHJpbmcucmF3YCwgc28gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBiZWxvdyByZWFjaGVzIHRoZSBmaWxlIHdpdGggaXRzIGJhY2tzbGFzaGVzIGludGFjdC5cbiAgICBbSU5MSU5FX0lNUE9SVFNfRklMRV9OQU1FXTogU3RyaW5nLnJhd2AvKlxuICogR2VuZXJhdGVkIGJ5IEBtbmFvdW1vdi9vYnNpZGlhbi1kZXYtdG9vbGtpdC4gS2VlcHMgZXZlcnkgZHluYW1pYyBpbXBvcnQoKSBpbnNpZGUgbWFpbi5qcy5cbiAqXG4gKiBPYnNpZGlhbiBsb2FkcyBhIHBsdWdpbidzIG1haW4uanMgYW5kIG5vdGhpbmcgYmVzaWRlIGl0LCBhbmQgcGFyY2VsIG1ha2VzIGV2ZXJ5IGltcG9ydCgpIGEgYnVuZGxlIG9mIGl0c1xuICogb3duIHdpdGggbm8gb3B0aW9uIHRvIGlubGluZSBvbmUuIFRoaXMgcmV3cml0ZXMgaW1wb3J0KCc8bGl0ZXJhbD4nKSBpbnRvIGEgcmVxdWlyZSgpIGluc2lkZSBhbiBhc3luY1xuICogYXJyb3csIGJlZm9yZSBwYXJjZWwncyBvd24gSmF2YVNjcmlwdCB0cmFuc2Zvcm1lciBydW5zOiB0aGUgbW9kdWxlIHN0aWxsIGV2YWx1YXRlcyBvbmx5IHdoZW4gdGhhdCBjb2RlXG4gKiBydW5zLCBhbmQgdGhlIHByb21pc2Ugc3RpbGwgcmVqZWN0cyB3aGVuIGV2YWx1YXRpb24gdGhyb3dzLiBPbmx5IGEgcGxhaW4gc3RyaW5nIHNwZWNpZmllciBpcyByZXdyaXR0ZW4sXG4gKiBzaW5jZSBhIGNvbXB1dGVkIG9uZSBjYW5ub3QgYmUgYnVuZGxlZCBieSBhbnkgYnVuZGxlci5cbiAqL1xuY29uc3QgeyBUcmFuc2Zvcm1lciB9ID0gcmVxdWlyZSgnQHBhcmNlbC9wbHVnaW4nKTtcblxuY29uc3QgRFlOQU1JQ19JTVBPUlQgPSAvXFxiaW1wb3J0XFwoXFxzKihbXCInXSkoW15cIidcXHg2MFxcblxcXFxdKylcXDFcXHMqXFwpL2d1O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUcmFuc2Zvcm1lcih7XG4gIGFzeW5jIHRyYW5zZm9ybSh7IGFzc2V0IH0pIHtcbiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBhc3NldC5nZXRDb2RlKCk7XG4gICAgaWYgKHNvdXJjZS5pbmNsdWRlcygnaW1wb3J0KCcpKSB7XG4gICAgICBhc3NldC5zZXRDb2RlKHNvdXJjZS5yZXBsYWNlKERZTkFNSUNfSU1QT1JULCAoX21hdGNoLCBxdW90ZSwgc3BlY2lmaWVyKSA9PiAnKGFzeW5jICgpID0+IHJlcXVpcmUoJyArIHF1b3RlICsgc3BlY2lmaWVyICsgcXVvdGUgKyAnKSkoKScpKTtcbiAgICB9XG4gICAgcmV0dXJuIFthc3NldF07XG4gIH1cbn0pO1xuYCxcbiAgICBbTkFNRVJfRklMRV9OQU1FXTogYC8qIEdlbmVyYXRlZCBieSBAbW5hb3Vtb3Yvb2JzaWRpYW4tZGV2LXRvb2xraXQuIE9ic2lkaWFuIGxvYWRzIGEgcGx1Z2luJ3Mgc3R5bGVzaGVldCBmcm9tIHN0eWxlcy5jc3MgYW5kIG5vdGhpbmcgZWxzZS4gKi9cbmNvbnN0IHsgTmFtZXIgfSA9IHJlcXVpcmUoJ0BwYXJjZWwvcGx1Z2luJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IE5hbWVyKHtcbiAgbmFtZSh7IGJ1bmRsZSB9KSB7XG4gICAgcmV0dXJuIGJ1bmRsZS50eXBlID09PSAnY3NzJyA/ICcke09ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlN0eWxlc0Nzc30nIDogbnVsbDtcbiAgfVxufSk7XG5gLFxuICAgIFtPUFRJTUlaRVJfRklMRV9OQU1FXTogYC8qXG4gKiBHZW5lcmF0ZWQgYnkgQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0LiBSdW5zIGFmdGVyIHBhcmNlbCdzIG93biBvcHRpbWl6ZXJzLCBvbiB0aGUgSmF2YVNjcmlwdCBidW5kbGUuXG4gKlxuICogT2JzaWRpYW4gZXZhbHVhdGVzIG1haW4uanMgYXMgdGhlIGJvZHkgb2YgZnVuY3Rpb24gKHJlcXVpcmUsIG1vZHVsZSwgZXhwb3J0cyksIHdpdGggYSBtb2R1bGUgb2JqZWN0IHRoYXRcbiAqIGhhcyBubyByZXF1aXJlIG9mIGl0cyBvd24sIGFuZCBwYXJjZWwncyBydW50aW1lIHJlYWNoZXMgZXZlcnkgZXh0ZXJuYWwgbW9kdWxlIHRocm91Z2ggbW9kdWxlLnJlcXVpcmUuXG4gKiBXaXRob3V0IHRoZSBmaXJzdCBsaW5lIGJlbG93LCB0aGUgdmVyeSBmaXJzdCByZXF1aXJlKCdvYnNpZGlhbicpIHRocm93cyBcIkNhbm5vdCBmaW5kIG1vZHVsZVwiLiBUaGUgYmFubmVyXG4gKiBnb2VzIGluIGhlcmUgdG9vLCBhZnRlciBtaW5pZmljYXRpb24sIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBzdHJpcCBpdCBhcyBhbiBvcmRpbmFyeSBjb21tZW50LlxuICovXG5jb25zdCB7IE9wdGltaXplciB9ID0gcmVxdWlyZSgnQHBhcmNlbC9wbHVnaW4nKTtcblxuY29uc3QgUFJFQU1CTEUgPSAke0pTT04uc3RyaW5naWZ5KGAke2dldE9ic2lkaWFuUGx1Z2luQmFubmVyKCdwYXJjZWwnKX1pZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZS5yZXF1aXJlICE9PSAnZnVuY3Rpb24nKSB7IG1vZHVsZS5yZXF1aXJlID0gcmVxdWlyZTsgfVxcbmApfTtcbmNvbnN0IFBSRUFNQkxFX0xJTkVfQ09VTlQgPSAke1N0cmluZyhnZXRPYnNpZGlhblBsdWdpbkJhbm5lcigncGFyY2VsJykuc3BsaXQoJ1xcbicpLmxlbmd0aCl9O1xuXG5hc3luYyBmdW5jdGlvbiByZWFkQ29udGVudHMoY29udGVudHMpIHtcbiAgaWYgKHR5cGVvZiBjb250ZW50cyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gY29udGVudHM7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjb250ZW50cykpIHtcbiAgICByZXR1cm4gY29udGVudHMudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gIH1cbiAgY29uc3QgY2h1bmtzID0gW107XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgY29udGVudHMpIHtcbiAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbShjaHVuaykpO1xuICB9XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoJ3V0Zi04Jyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IE9wdGltaXplcih7XG4gIGFzeW5jIG9wdGltaXplKHsgY29udGVudHMsIG1hcCB9KSB7XG4gICAgY29uc3QgY29kZSA9IGF3YWl0IHJlYWRDb250ZW50cyhjb250ZW50cyk7XG4gICAgaWYgKG1hcCkge1xuICAgICAgbWFwLm9mZnNldExpbmVzKDEsIFBSRUFNQkxFX0xJTkVfQ09VTlQpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb250ZW50czogUFJFQU1CTEUgKyBjb2RlLCBtYXAgfTtcbiAgfVxufSk7XG5gLFxuICAgIFtQQVJDRUxSQ106IGAke0pTT04uc3RyaW5naWZ5KHBhcmNlbHJjLCBudWxsLCBKU09OX0lOREVOVCl9XFxuYCxcbiAgICBbUkVTT0xWRVJfRklMRV9OQU1FXTogYC8qIEdlbmVyYXRlZCBieSBAbW5hb3Vtb3Yvb2JzaWRpYW4tZGV2LXRvb2xraXQuIExlYXZlcyB0aGUgbW9kdWxlcyBPYnNpZGlhbiBzdXBwbGllcyBhdCBydW50aW1lIHRvIHJlcXVpcmUoKS4gKi9cbmNvbnN0IHsgUmVzb2x2ZXIgfSA9IHJlcXVpcmUoJ0BwYXJjZWwvcGx1Z2luJyk7XG5cbmNvbnN0IEVYVEVSTkFMUyA9IG5ldyBTZXQoJHtKU09OLnN0cmluZ2lmeShPQlNJRElBTl9QTFVHSU5fRVhURVJOQUxTKX0pO1xuXG5mdW5jdGlvbiBnZXRQYWNrYWdlTmFtZShzcGVjaWZpZXIpIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBzcGVjaWZpZXIuc3BsaXQoJy8nKTtcbiAgcmV0dXJuIHNwZWNpZmllci5zdGFydHNXaXRoKCdAJykgPyBzZWdtZW50cy5zbGljZSgwLCAyKS5qb2luKCcvJykgOiBzZWdtZW50c1swXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgUmVzb2x2ZXIoe1xuICByZXNvbHZlKHsgc3BlY2lmaWVyIH0pIHtcbiAgICBjb25zdCBpc0V4dGVybmFsID0gc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ25vZGU6JykgfHwgRVhURVJOQUxTLmhhcyhzcGVjaWZpZXIpIHx8IEVYVEVSTkFMUy5oYXMoZ2V0UGFja2FnZU5hbWUoc3BlY2lmaWVyKSk7XG4gICAgcmV0dXJuIGlzRXh0ZXJuYWwgPyB7IGlzRXhjbHVkZWQ6IHRydWUgfSA6IG51bGw7XG4gIH1cbn0pO1xuYFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgb3B0aW9ucyBoYW5kZWQgdG8gcGFyY2VsJ3MgYFBhcmNlbGAgY2xhc3MuXG4gKlxuICogVGhlIG9uZSB0YXJnZXQgaXMgYGVsZWN0cm9uLXJlbmRlcmVyYCwgd2hlcmUgT2JzaWRpYW4gcnVucyBhIHBsdWdpbiwgYW5kIENvbW1vbkpTLiBQYXJjZWwgY291bnRzIHRoYXRcbiAqIGNvbnRleHQgYXMgYm90aCBhIGJyb3dzZXIgYW5kIGEgbm9kZSBvbmUsIGFuZCBlYWNoIGhhbGYgbWF0dGVyczogbm9kZSBrZWVwcyB0aGUgYnVpbHRpbnMgZXh0ZXJuYWwsIGFuZFxuICogYnJvd3NlciByZXNvbHZlcyB0aGUgYGJyb3dzZXJgIGV4cG9ydCBjb25kaXRpb24uIGBpbmNsdWRlTm9kZU1vZHVsZXNgIGJ1bmRsZXMgdGhlIGRlcGVuZGVuY2llcywgd2hpY2ggYVxuICogbm9kZS1mbGF2b3VyZWQgY29udGV4dCB3b3VsZCBvdGhlcndpc2UgbGVhdmUgYXMgYHJlcXVpcmUoKWAgY2FsbHMgbm90aGluZyBpbnN0YWxscyBiZXNpZGUgYSBwbHVnaW4sIGFuZFxuICogYGlzTGlicmFyeWAga2VlcHMgdGhlIGVudHJ5J3MgZGVmYXVsdCBleHBvcnQsIHdoaWNoIGlzIGhvdyBPYnNpZGlhbiBmaW5kcyB0aGUgcGx1Z2luIGNsYXNzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEdldFBhcmNlbE9wdGlvbnNQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIHBhcmNlbCBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyY2VsT3B0aW9ucyhwYXJhbXM6IEdldFBhcmNlbE9wdGlvbnNQYXJhbXMpOiBJbml0aWFsUGFyY2VsT3B0aW9ucyB7XG4gIGNvbnN0IHsgYnVpbGRDb250ZXh0LCBjYWNoZUZvbGRlciwgY29uZmlnUGF0aCB9ID0gcGFyYW1zO1xuICBjb25zdCB0YXJnZXQ6IFRhcmdldERlc2NyaXB0b3IgPSB7XG4gICAgY29udGV4dDogJ2VsZWN0cm9uLXJlbmRlcmVyJyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgZGlzdERpcmAgaXMgdGhlIG5hbWUgcGFyY2VsJ3MgQVBJIHJlYWRzLlxuICAgIGRpc3REaXI6IGJ1aWxkQ29udGV4dC5kaXN0Rm9sZGVyLFxuICAgIGluY2x1ZGVOb2RlTW9kdWxlczogdHJ1ZSxcbiAgICBpc0xpYnJhcnk6IHRydWUsXG4gICAgb3B0aW1pemU6IGJ1aWxkQ29udGV4dC5pc1Byb2R1Y3Rpb25CdWlsZCxcbiAgICBvdXRwdXRGb3JtYXQ6ICdjb21tb25qcycsXG4gICAgc291cmNlTWFwOiAhYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkICYmIHsgaW5saW5lOiB0cnVlIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGBjYWNoZURpcmAgaXMgdGhlIG5hbWUgcGFyY2VsJ3MgQVBJIHJlYWRzLlxuICAgIGNhY2hlRGlyOiBjYWNoZUZvbGRlcixcbiAgICBjb25maWc6IGNvbmZpZ1BhdGgsXG4gICAgZGVmYXVsdFRhcmdldE9wdGlvbnM6IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGBkaXN0RGlyYCBpcyB0aGUgbmFtZSBwYXJjZWwncyBBUEkgcmVhZHMuXG4gICAgICBkaXN0RGlyOiBidWlsZENvbnRleHQuZGlzdEZvbGRlcixcbiAgICAgIHNob3VsZE9wdGltaXplOiBidWlsZENvbnRleHQuaXNQcm9kdWN0aW9uQnVpbGQsXG4gICAgICBzb3VyY2VNYXBzOiAhYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkXG4gICAgfSxcbiAgICBlbnRyaWVzOiBidWlsZENvbnRleHQuZW50cnlQb2ludCxcbiAgICBtb2RlOiBidWlsZENvbnRleHQuaXNQcm9kdWN0aW9uQnVpbGQgPyAncHJvZHVjdGlvbicgOiAnZGV2ZWxvcG1lbnQnLFxuICAgIHRhcmdldHM6IHsgb2JzaWRpYW5QbHVnaW46IHRhcmdldCB9XG4gIH07XG59XG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gUGFydCBvZiB0aGUgcGFyY2VsIGJ1aWxkIGFib3ZlLiAqL1xuZnVuY3Rpb24gZm9ybWF0UGFyY2VsRXJyb3IoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBkaWFnbm9zdGljcyA9IChlcnJvciBhcyBQYXJjZWxFcnJvckxpa2UgfCB1bmRlZmluZWQpPy5kaWFnbm9zdGljcztcbiAgaWYgKGRpYWdub3N0aWNzICYmIGRpYWdub3N0aWNzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZGlhZ25vc3RpY3MubWFwKChkaWFnbm9zdGljKSA9PiBkaWFnbm9zdGljLm1lc3NhZ2UpLmpvaW4oJ1xcbicpO1xuICB9XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgPz8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBVUkwgb2YgYSBtb2R1bGUgb2YgdGhpcyBmb2xkZXIsIGluIHRoZSBzYW1lIGZvcm0gYXMgdGhpcyBvbmUgKGAudHNgIGZyb20gc291cmNlLCBgLm1qc2Agb3IgYC5janNgIG9uY2VcbiAqIGJ1aWx0KSwgd2hpY2ggdGhlIGdlbmVyYXRlZCB0cmFuc2Zvcm1lciBpbXBvcnRzLlxuICpcbiAqIEBwYXJhbSBiYXNlTmFtZSAtIFRoZSBtb2R1bGUncyBmaWxlIG5hbWUgd2l0aG91dCBpdHMgZXh0ZW5zaW9uLlxuICogQHJldHVybnMgVGhlIG1vZHVsZSdzIGBmaWxlOmAgVVJMLlxuICovXG5mdW5jdGlvbiBnZXRTaWJsaW5nTW9kdWxlVXJsKGJhc2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbmV3IFVSTChgJHtiYXNlTmFtZX0ke2V4dG5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKX1gLCBpbXBvcnQubWV0YS51cmwpLmhyZWY7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVdhdGNoRXZlbnQoZXZlbnQ6IEJ1aWxkRXZlbnQgfCB1bmRlZmluZWQsIGJ1aWxkQ29udGV4dDogT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQpOiB2b2lkIHtcbiAgaWYgKGV2ZW50Py50eXBlID09PSAnYnVpbGRGYWlsdXJlJykge1xuICAgIGNvbnNvbGUuZXJyb3IoZXZlbnQuZGlhZ25vc3RpY3MubWFwKChkaWFnbm9zdGljKSA9PiBkaWFnbm9zdGljLm1lc3NhZ2UpLmpvaW4oJ1xcbicpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGV2ZW50Py50eXBlICE9PSAnYnVpbGRTdWNjZXNzJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnNvbGUud2FybihgUmVidWlsdCB3aXRoIHBhcmNlbCBpbiAke1N0cmluZyhldmVudC5idWlsZFRpbWUpfSBtcy5gKTtcbiAgaW52b2tlQXN5bmNTYWZlbHkoKCkgPT4gZGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXIoYnVpbGRDb250ZXh0KSk7XG59XG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQSxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHlCQUF5QjtBQUNsQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBUVAsU0FBUywrQkFBK0I7QUFDeEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMscUNBQXFDO0FBbUU5QyxNQUFNLHNCQUFzQjtBQUM1QixNQUFNLGlDQUFpQyxHQUFHLG1CQUFtQjtBQUM3RCxNQUFNLFdBQVc7QUFlakIsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSwyQkFBMkI7QUFDakMsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxjQUFjO0FBU3BCLGVBQXNCLE1BQU0sU0FBdUM7QUFDakUsUUFBTSxTQUFTLE1BQU0sOEJBQThCLEVBQUUsR0FBRyxTQUFTLE1BQU0sVUFBVSxXQUFXLENBQUM7QUFDN0YsU0FBTyxlQUFlO0FBQ3hCO0FBV0EsZUFBc0IsOEJBQThCLFFBQXFFO0FBQ3ZILFFBQU0sZUFBZSxlQUFlO0FBQ3BDLFFBQU0sZUFBZSxNQUFNLGtD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
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* The build features of the rollup and vite adapters: one plugin, typed by the shape both bundlers accept, that runs
|
|
6
|
+
* the shared transforms (Solid, Svelte, stylesheets, WebAssembly) and replaces the framework's compile-time constants,
|
|
7
|
+
* plus the `unplugin-vue` plugin for Vue.
|
|
8
|
+
*/
|
|
9
|
+
import type { ObsidianPluginFeatureOptions } from './obsidian-plugin-features.mjs';
|
|
10
|
+
import type { SourceMapLike } from './obsidian-plugin-transforms.mjs';
|
|
11
|
+
/**
|
|
12
|
+
* Parameters for {@link createRollupCompatibleFeaturePlugin}.
|
|
13
|
+
*/
|
|
14
|
+
export interface CreateRollupCompatibleFeaturePluginParams {
|
|
15
|
+
/**
|
|
16
|
+
* The build features.
|
|
17
|
+
*/
|
|
18
|
+
readonly features: ObsidianPluginFeatureOptions;
|
|
19
|
+
/**
|
|
20
|
+
* Tells whether the build is a production one. Called from the hooks, after the adapter resolved its build mode.
|
|
21
|
+
*/
|
|
22
|
+
readonly isProductionBuild: () => boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Whether this plugin compiles stylesheets. Vite compiles them itself.
|
|
25
|
+
*/
|
|
26
|
+
readonly shouldCompileStylesheets: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Whether this plugin replaces the framework's compile-time constants in the code. Vite does it through its own
|
|
29
|
+
* `define`.
|
|
30
|
+
*/
|
|
31
|
+
readonly shouldReplaceDefines: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parameters for {@link createUnpluginVuePlugin}.
|
|
35
|
+
*/
|
|
36
|
+
export interface CreateUnpluginVuePluginParams {
|
|
37
|
+
/**
|
|
38
|
+
* The bundler, which names the `unplugin-vue` entry.
|
|
39
|
+
*/
|
|
40
|
+
readonly bundler: 'rollup' | 'vite';
|
|
41
|
+
/**
|
|
42
|
+
* The build features.
|
|
43
|
+
*/
|
|
44
|
+
readonly features: ObsidianPluginFeatureOptions;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The part of a rollup or rolldown plugin context the feature plugin uses.
|
|
48
|
+
*/
|
|
49
|
+
export interface FeaturePluginContext {
|
|
50
|
+
/**
|
|
51
|
+
* Adds a file to watch in a watch build.
|
|
52
|
+
*
|
|
53
|
+
* @param id - The file's path.
|
|
54
|
+
*/
|
|
55
|
+
addWatchFile: (id: string) => void;
|
|
56
|
+
/**
|
|
57
|
+
* Emits an asset into the bundle.
|
|
58
|
+
*
|
|
59
|
+
* @param emittedFile - The asset to emit.
|
|
60
|
+
* @returns The reference id of the emitted file.
|
|
61
|
+
*/
|
|
62
|
+
emitFile: (emittedFile: EmittedAsset) => string;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The plugin {@link createRollupCompatibleFeaturePlugin} creates, in the shape rollup and vite both accept.
|
|
66
|
+
*/
|
|
67
|
+
export interface RollupCompatibleFeaturePlugin {
|
|
68
|
+
/**
|
|
69
|
+
* Loads a `.wasm` module as its bytes.
|
|
70
|
+
*/
|
|
71
|
+
readonly load: FeaturePluginHook<(this: FeaturePluginContext, id: string) => Promise<null | string>>;
|
|
72
|
+
/**
|
|
73
|
+
* The plugin's name.
|
|
74
|
+
*/
|
|
75
|
+
readonly name: string;
|
|
76
|
+
/**
|
|
77
|
+
* Compiles a module the features transform, then replaces the compile-time constants.
|
|
78
|
+
*/
|
|
79
|
+
readonly transform: FeaturePluginHook<(this: FeaturePluginContext, code: string, id: string) => Promise<null | TransformResultLike>>;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The asset the feature plugin emits for a stylesheet.
|
|
83
|
+
*/
|
|
84
|
+
interface EmittedAsset {
|
|
85
|
+
readonly name: string;
|
|
86
|
+
readonly source: string;
|
|
87
|
+
readonly type: 'asset';
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* A plugin hook with its order.
|
|
91
|
+
*
|
|
92
|
+
* @typeParam Handler - The hook's handler.
|
|
93
|
+
*/
|
|
94
|
+
interface FeaturePluginHook<Handler> {
|
|
95
|
+
readonly handler: Handler;
|
|
96
|
+
readonly order: 'pre';
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* A transform hook's result.
|
|
100
|
+
*/
|
|
101
|
+
interface TransformResultLike {
|
|
102
|
+
readonly code: string;
|
|
103
|
+
readonly map?: SourceMapLike | undefined;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Creates the plugin that runs the shared transforms in a rollup or vite build.
|
|
107
|
+
*
|
|
108
|
+
* - `framework: 'solid'` compiles `.jsx` / `.tsx` with `babel-preset-solid`, before the project's TypeScript plugin.
|
|
109
|
+
* - `framework: 'svelte'` compiles `.svelte` components and `.svelte.ts` / `.svelte.js` modules.
|
|
110
|
+
* - `styles`, where {@link CreateRollupCompatibleFeaturePluginParams.shouldCompileStylesheets} says so, runs every
|
|
111
|
+
* stylesheet through PostCSS, Tailwind and CSS-module scoping and emits it as an asset, which ends up in
|
|
112
|
+
* `styles.css`.
|
|
113
|
+
* - `wasm` loads a `.wasm` module as its bytes.
|
|
114
|
+
* - A framework's compile-time constants are replaced where
|
|
115
|
+
* {@link CreateRollupCompatibleFeaturePluginParams.shouldReplaceDefines} says so.
|
|
116
|
+
*
|
|
117
|
+
* @param params - The {@link CreateRollupCompatibleFeaturePluginParams}.
|
|
118
|
+
* @returns The plugin.
|
|
119
|
+
*/
|
|
120
|
+
export declare function createRollupCompatibleFeaturePlugin(params: CreateRollupCompatibleFeaturePluginParams): RollupCompatibleFeaturePlugin;
|
|
121
|
+
/**
|
|
122
|
+
* Creates the `unplugin-vue` plugin of one bundler when the framework is Vue.
|
|
123
|
+
*
|
|
124
|
+
* @param params - The {@link CreateUnpluginVuePluginParams}.
|
|
125
|
+
* @returns A {@link Promise} that resolves to the plugin, or `null` when the framework is not Vue.
|
|
126
|
+
*/
|
|
127
|
+
export declare function createUnpluginVuePlugin(params: CreateUnpluginVuePluginParams): Promise<unknown>;
|
|
128
|
+
export {};
|