obsidian-dev-utils
Version:
This is the collection of useful functions that you can use for your Obsidian plugin development
108 lines (104 loc) • 17.3 kB
JavaScript
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
(function initEsm() {
if (globalThis.process) {
return;
}
const browserProcess = {
browser: true,
cwd() {
return '/';
},
env: {},
platform: 'android'
};
globalThis.process = browserProcess;
})();
import { Command } from "commander";
import { createJiti } from "jiti";
import { invokeAsyncSafely } from "../Async.mjs";
import {
getFolderName,
join,
relative
} from "../Path.mjs";
import {
buildClean,
buildCompile,
buildCompileSvelte,
buildCompileTypeScript,
buildStatic
} from "./build.mjs";
import {
CliTaskResult,
wrapCliTask
} from "./CliUtils.mjs";
import {
BuildMode,
buildObsidianPlugin
} from "./esbuild/ObsidianPluginBuilder.mjs";
import { lint } from "./ESLint/ESLint.mjs";
import { format } from "./format.mjs";
import { lintMarkdown } from "./markdownlint/markdownlint.mjs";
import {
existsSync,
process
} from "./NodeModules.mjs";
import { readPackageJson } from "./Npm.mjs";
import { publish } from "./NpmPublish.mjs";
import { ObsidianDevUtilsRepoPaths } from "./ObsidianDevUtilsRepoPaths.mjs";
import { resolvePathFromRootSafe } from "./Root.mjs";
import { spellcheck } from "./spellcheck.mjs";
import { updateVersion } from "./version.mjs";
const jiti = createJiti(import.meta.url);
const NODE_SCRIPT_ARGV_SKIP_COUNT = 2;
function cli(argv = process.argv.slice(NODE_SCRIPT_ARGV_SKIP_COUNT)) {
invokeAsyncSafely(
() => wrapCliTask(async () => {
const packageJson = await readPackageJson(getFolderName(import.meta.url));
const program = new Command();
program.name(packageJson.name ?? "(unknown)").description("CLI for Obsidian plugin development utilities").version(packageJson.version ?? "(unknown)");
addCommand(program, "build" /* Build */, "Build the plugin", () => buildObsidianPlugin({ mode: BuildMode.Production }));
addCommand(program, "build:clean" /* BuildClean */, "Clean the dist folder", () => buildClean());
addCommand(program, "build:compile" /* BuildCompile */, "Check if code compiles", () => buildCompile());
addCommand(program, "build:compile:svelte" /* BuildCompileSvelte */, "Check if Svelte code compiles", () => buildCompileSvelte());
addCommand(program, "build:compile:typescript" /* BuildCompileTypeScript */, "Check if TypeScript code compiles", () => buildCompileTypeScript());
addCommand(program, "build:static" /* BuildStatic */, "Copy static content to dist", () => buildStatic());
addCommand(program, "dev" /* Dev */, "Build the plugin in development mode", () => buildObsidianPlugin({ mode: BuildMode.Development }));
addCommand(program, "format" /* Format */, "Format the source code", () => format());
addCommand(program, "format:check" /* FormatCheck */, "Check if the source code is formatted", () => format(false));
addCommand(program, "lint" /* Lint */, "Lint the source code", () => lint());
addCommand(program, "lint:fix" /* LintFix */, "Lint the source code and apply automatic fixes", () => lint(true));
addCommand(program, "lint:md" /* LintMarkdown */, "Lint the markdown documentation", () => lintMarkdown());
addCommand(program, "lint:md:fix" /* LintMarkdownFix */, "Lint the markdown documentation and apply automatic fixes", () => lintMarkdown(true));
addCommand(program, "publish" /* Publish */, "Publish to NPM", (isBeta) => publish(isBeta)).argument("[isBeta]", "Publish to NPM beta");
addCommand(program, "spellcheck" /* Spellcheck */, "Spellcheck the source code", () => spellcheck());
addCommand(program, "version" /* Version */, "Release a new version", (versionUpdateType) => updateVersion(versionUpdateType)).argument("[versionUpdateType]", "Version update type: major, minor, patch, beta, or x.y.z[-suffix]");
await program.parseAsync(argv, { from: "user" });
return CliTaskResult.DoNotExit();
})
);
}
function addCommand(program, name, description, taskFn) {
return program.command(name).description(description).action(
(...args) => wrapCliTask(async () => {
const scriptPath = resolvePathFromRootSafe(join(ObsidianDevUtilsRepoPaths.Scripts, `${name.replace(":", "-")}.ts`));
if (existsSync(scriptPath)) {
const folder = getFolderName(import.meta.url);
const relativeScriptPath = relative(folder, scriptPath);
const module = await jiti.import(relativeScriptPath);
if (typeof module.invoke !== "function") {
throw new Error(`${relativeScriptPath} does not export an invoke function`);
}
return module.invoke(...args);
}
return await taskFn(...args);
})
);
}
export {
cli
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL1NjcmlwdFV0aWxzL2NsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqXG4gKiBUaGlzIG1vZHVsZSBkZWZpbmVzIGEgQ0xJIGZvciBtYW5hZ2luZyB2YXJpb3VzIHRhc2tzIHJlbGF0ZWQgdG8gT2JzaWRpYW4gcGx1Z2luIGRldmVsb3BtZW50LlxuICogSXQgbGV2ZXJhZ2VzIHRoZSBgY29tbWFuZGVyYCBsaWJyYXJ5IHRvIGRlZmluZSBjb21tYW5kcyBmb3IgYnVpbGRpbmcsIGxpbnRpbmcsIHNwZWxsY2hlY2tpbmcsXG4gKiBhbmQgdXBkYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHBsdWdpbi4gVGhlIENMSSBpcyBkZXNpZ25lZCB0byBiZSBmbGV4aWJsZSBhbmQgY2FuIGhhbmRsZSBib3RoXG4gKiBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHRhc2tzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgY3JlYXRlSml0aSB9IGZyb20gJ2ppdGknO1xuXG5pbXBvcnQgdHlwZSB7IE1heWJlUmV0dXJuIH0gZnJvbSAnLi4vVHlwZS50cyc7XG5cbmltcG9ydCB7IGludm9rZUFzeW5jU2FmZWx5IH0gZnJvbSAnLi4vQXN5bmMudHMnO1xuaW1wb3J0IHtcbiAgZ2V0Rm9sZGVyTmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnLi4vUGF0aC50cyc7XG5pbXBvcnQge1xuICBidWlsZENsZWFuLFxuICBidWlsZENvbXBpbGUsXG4gIGJ1aWxkQ29tcGlsZVN2ZWx0ZSxcbiAgYnVpbGRDb21waWxlVHlwZVNjcmlwdCxcbiAgYnVpbGRTdGF0aWNcbn0gZnJvbSAnLi9idWlsZC50cyc7XG5pbXBvcnQge1xuICBDbGlUYXNrUmVzdWx0LFxuICB3cmFwQ2xpVGFza1xufSBmcm9tICcuL0NsaVV0aWxzLnRzJztcbmltcG9ydCB7XG4gIEJ1aWxkTW9kZSxcbiAgYnVpbGRPYnNpZGlhblBsdWdpblxufSBmcm9tICcuL2VzYnVpbGQvT2JzaWRpYW5QbHVnaW5CdWlsZGVyLnRzJztcbmltcG9ydCB7IGxpbnQgfSBmcm9tICcuL0VTTGludC9FU0xpbnQudHMnO1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnLi9mb3JtYXQudHMnO1xuaW1wb3J0IHsgbGludE1hcmtkb3duIH0gZnJvbSAnLi9tYXJrZG93bmxpbnQvbWFya2Rvd25saW50LnRzJztcbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIHByb2Nlc3Ncbn0gZnJvbSAnLi9Ob2RlTW9kdWxlcy50cyc7XG5pbXBvcnQgeyByZWFkUGFja2FnZUpzb24gfSBmcm9tICcuL05wbS50cyc7XG5pbXBvcnQgeyBwdWJsaXNoIH0gZnJvbSAnLi9OcG1QdWJsaXNoLnRzJztcbmltcG9ydCB7IE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMgfSBmcm9tICcuL09ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMudHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUgfSBmcm9tICcuL1Jvb3QudHMnO1xuaW1wb3J0IHsgc3BlbGxjaGVjayB9IGZyb20gJy4vc3BlbGxjaGVjay50cyc7XG5pbXBvcnQgeyB1cGRhdGVWZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uLnRzJztcblxuY29uc3Qgaml0aSA9IGNyZWF0ZUppdGkoaW1wb3J0Lm1ldGEudXJsKTtcblxuLyoqXG4gKiBBIG51bWJlciBvZiBsZWFkaW5nIGFyZ3VtZW50cyB0byBza2lwIHdoZW4gcGFyc2luZyBjb21tYW5kLWxpbmUgYXJndW1lbnRzLlxuICogRmlyc3QgdHdvIGVsZW1lbnRzIHR5cGljYWxseSByZXByZXNlbnQgdGhlIE5vZGUuanMgZXhlY3V0YWJsZSBhbmQgdGhlIHNjcmlwdCBwYXRoOlxuICogYFtcIm5vZGVcIiwgXCJwYXRoL3RvL2NsaS5janNcIiwgLi4uYWN0dWFsQXJnc11gXG4gKi9cbmNvbnN0IE5PREVfU0NSSVBUX0FSR1ZfU0tJUF9DT1VOVCA9IDI7XG5cbi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgdGhlIG5hbWVzIG9mIHRoZSBjb21tYW5kcyBhdmFpbGFibGUgaW4gdGhlIENMSS5cbiAqL1xuZW51bSBDb21tYW5kTmFtZXMge1xuICBCdWlsZCA9ICdidWlsZCcsXG4gIEJ1aWxkQ2xlYW4gPSAnYnVpbGQ6Y2xlYW4nLFxuICBCdWlsZENvbXBpbGUgPSAnYnVpbGQ6Y29tcGlsZScsXG4gIEJ1aWxkQ29tcGlsZVN2ZWx0ZSA9ICdidWlsZDpjb21waWxlOnN2ZWx0ZScsXG4gIEJ1aWxkQ29tcGlsZVR5cGVTY3JpcHQgPSAnYnVpbGQ6Y29tcGlsZTp0eXBlc2NyaXB0JyxcbiAgQnVpbGRTdGF0aWMgPSAnYnVpbGQ6c3RhdGljJyxcbiAgRGV2ID0gJ2RldicsXG4gIEZvcm1hdCA9ICdmb3JtYXQnLFxuICBGb3JtYXRDaGVjayA9ICdmb3JtYXQ6Y2hlY2snLFxuICBMaW50ID0gJ2xpbnQnLFxuICBMaW50Rml4ID0gJ2xpbnQ6Zml4JyxcbiAgTGludE1hcmtkb3duID0gJ2xpbnQ6bWQnLFxuICBMaW50TWFya2Rvd25GaXggPSAnbGludDptZDpmaXgnLFxuICBQdWJsaXNoID0gJ3B1Ymxpc2gnLFxuICBTcGVsbGNoZWNrID0gJ3NwZWxsY2hlY2snLFxuICBWZXJzaW9uID0gJ3ZlcnNpb24nXG59XG5cbmludGVyZmFjZSBPdmVycmlkZU1vZHVsZTxBcmdzIGV4dGVuZHMgdW5rbm93bltdPiB7XG4gIGludm9rZSguLi5hcmdzOiBBcmdzKTogUHJvbWlzZTxNYXliZVJldHVybjxDbGlUYXNrUmVzdWx0Pj47XG59XG5cbi8qKlxuICogTWFpbiBmdW5jdGlvbiB0byBydW4gdGhlIENMSS4gSXQgc2V0cyB1cCB0aGUgY29tbWFuZHMgdXNpbmcgdGhlIGBjb21tYW5kZXJgIGxpYnJhcnkgYW5kXG4gKiBoYW5kbGVzIHRoZSBleGVjdXRpb24gb2YgdGFza3MgbGlrZSBidWlsZGluZywgY2xlYW5pbmcsIGxpbnRpbmcsIHNwZWxsY2hlY2tpbmcsIGFuZCB2ZXJzaW9uaW5nLlxuICpcbiAqIEBwYXJhbSBhcmd2IC0gVGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgdG8gcGFyc2UuIERlZmF1bHRzIHRvIGBwcm9jZXNzLmFyZ3ZgIG1pbnVzIHRoZSBmaXJzdCB0d28gZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGkoYXJndjogc3RyaW5nW10gPSBwcm9jZXNzLmFyZ3Yuc2xpY2UoTk9ERV9TQ1JJUFRfQVJHVl9TS0lQX0NPVU5UKSk6IHZvaWQge1xuICBpbnZva2VBc3luY1NhZmVseSgoKSA9PlxuICAgIHdyYXBDbGlUYXNrKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKGdldEZvbGRlck5hbWUoaW1wb3J0Lm1ldGEudXJsKSk7XG4gICAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKTtcblxuICAgICAgcHJvZ3JhbVxuICAgICAgICAubmFtZShwYWNrYWdlSnNvbi5uYW1lID8/ICcodW5rbm93biknKVxuICAgICAgICAuZGVzY3JpcHRpb24oJ0NMSSBmb3IgT2JzaWRpYW4gcGx1Z2luIGRldmVsb3BtZW50IHV0aWxpdGllcycpXG4gICAgICAgIC52ZXJzaW9uKHBhY2thZ2VKc29uLnZlcnNpb24gPz8gJyh1bmtub3duKScpO1xuXG4gICAgICBhZGRDb21tYW5kKHByb2dyYW0sIENvbW1hbmROYW1lcy5CdWlsZCwgJ0J1aWxkIHRoZSBwbHVnaW4nLCAoKSA9PiBidWlsZE9ic2lkaWFuUGx1Z2luKHsgbW9kZTogQnVpbGRNb2RlLlByb2R1Y3Rpb24gfSkpO1xuICAgICAgYWRkQ29tbWFuZChwcm9ncmFtLCBDb21tYW5kTmFtZXMuQnVpbGRDbGVhbiwgJ0NsZWFuIHRoZSBkaXN0IGZvbGRlcicsICgpID0+IGJ1aWxkQ2xlYW4oKSk7XG4gICAgICBhZGRDb21tYW5kKHByb2dyYW0sIENvbW1hbmROYW1lcy5CdWlsZENvbXBpbGUsICdDaGVjayBpZiBjb2RlIGNvbXBpbGVzJywgKCkgPT4gYnVpbGRDb21waWxlKCkpO1xuICAgICAgYWRkQ29tbWFuZChwcm9ncmFtLCBDb21tYW5kTmFtZXMuQnVpbGRDb21waWxlU3ZlbHRlLCAnQ2hlY2sgaWYgU3ZlbHRlIGNvZGUgY29tcGlsZXMnLCAoKSA9PiBidWlsZENvbXBpbGVTdmVsdGUoKSk7XG4gICAgICBhZGRDb21tYW5kKHByb2dyYW0sIENvbW1hbmROYW1lcy5CdWlsZENvbXBpbGVUeXBlU2NyaXB0LCAnQ2hlY2sgaWYgVHlwZVNjcmlwdCBjb2RlIGNvbXBpbGVzJywgKCkgPT4gYnVpbGRDb21waWxlVHlwZVNjcmlwdCgpKTtcbiAgICAgIGFkZENvbW1hbmQocHJvZ3JhbSwgQ29tbWFuZE5hbWVzLkJ1aWxkU3RhdGljLCAnQ29weSBzdGF0aWMgY29udGVudCB0byBkaXN0JywgKCkgPT4gYnVpbGRTdGF0aWMoKSk7XG4gICAgICBhZGRDb21tYW5kKHByb2dyYW0sIENvbW1hbmROYW1lcy5EZXYsICdCdWlsZCB0aGUgcGx1Z2luIGluIGRldmVsb3BtZW50IG1vZGUnLCAoKSA9PiBidWlsZE9ic2lkaWFuUGx1Z2luKHsgbW9kZTogQnVpbGRNb2RlLkRldmVsb3BtZW50IH0pKTtcbiAgICAgIGFkZENvbW1hbmQocHJvZ3JhbSwgQ29tbWFuZE5hbWVzLkZvcm1hdCwgJ0Zvcm1hdCB0aGUgc291cmNlIGNvZGUnLCAoKSA9PiBmb3JtYXQoKSk7XG4gICAgICBhZGRDb21tYW5kKHByb2dyYW0sIENvbW1hbmROYW1lcy5Gb3JtYXRDaGVjaywgJ0NoZWNrIGlmIHRoZSBzb3VyY2UgY29kZSBpcyBmb3JtYXR0ZWQnLCAoKSA9PiBmb3JtYXQoZmFsc2UpKTtcbiAgICAgIGFkZENvbW1hbmQocHJvZ3JhbSwgQ29tbWFuZE5hbWVzLkxpbnQsICdMaW50IHRoZSBzb3VyY2UgY29kZScsICgpID0+IGxpbnQoKSk7XG4gICAgICBhZGRDb21tYW5kKHByb2dyYW0sIENvbW1hbmROYW1lcy5MaW50Rml4LCAnTGludCB0aGUgc291cmNlIGNvZGUgYW5kIGFwcGx5IGF1dG9tYXRpYyBmaXhlcycsICgpID0+IGxpbnQodHJ1ZSkpO1xuICAgICAgYWRkQ29tbWFuZChwcm9ncmFtLCBDb21tYW5kTmFtZXMuTGludE1hcmtkb3duLCAnTGludCB0aGUgbWFya2Rvd24gZG9jdW1lbnRhdGlvbicsICgpID0+IGxpbnRNYXJrZG93bigpKTtcbiAgICAgIGFkZENvbW1hbmQocHJvZ3JhbSwgQ29tbWFuZE5hbWVzLkxpbnRNYXJrZG93bkZpeCwgJ0xpbnQgdGhlIG1hcmtkb3duIGRvY3VtZW50YXRpb24gYW5kIGFwcGx5IGF1dG9tYXRpYyBmaXhlcycsICgpID0+IGxpbnRNYXJrZG93bih0cnVlKSk7XG4gICAgICBhZGRDb21tYW5kKHByb2dyYW0sIENvbW1hbmROYW1lcy5QdWJsaXNoLCAnUHVibGlzaCB0byBOUE0nLCAoaXNCZXRhOiBib29sZWFuKSA9PiBwdWJsaXNoKGlzQmV0YSkpXG4gICAgICAgIC5hcmd1bWVudCgnW2lzQmV0YV0nLCAnUHVibGlzaCB0byBOUE0gYmV0YScpO1xuICAgICAgYWRkQ29tbWFuZChwcm9ncmFtLCBDb21tYW5kTmFtZXMuU3BlbGxjaGVjaywgJ1NwZWxsY2hlY2sgdGhlIHNvdXJjZSBjb2RlJywgKCkgPT4gc3BlbGxjaGVjaygpKTtcbiAgICAgIGFkZENvbW1hbmQocHJvZ3JhbSwgQ29tbWFuZE5hbWVzLlZlcnNpb24sICdSZWxlYXNlIGEgbmV3IHZlcnNpb24nLCAodmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZykgPT4gdXBkYXRlVmVyc2lvbih2ZXJzaW9uVXBkYXRlVHlwZSkpXG4gICAgICAgIC5hcmd1bWVudCgnW3ZlcnNpb25VcGRhdGVUeXBlXScsICdWZXJzaW9uIHVwZGF0ZSB0eXBlOiBtYWpvciwgbWlub3IsIHBhdGNoLCBiZXRhLCBvciB4Lnkuelstc3VmZml4XScpO1xuICAgICAgYXdhaXQgcHJvZ3JhbS5wYXJzZUFzeW5jKGFyZ3YsIHsgZnJvbTogJ3VzZXInIH0pO1xuICAgICAgcmV0dXJuIENsaVRhc2tSZXN1bHQuRG9Ob3RFeGl0KCk7XG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBBZGRzIGEgY29tbWFuZCB0byB0aGUgQ0xJIHByb2dyYW0gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIGRlc2NyaXB0aW9uLCBhbmQgdGFzayBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gcHJvZ3JhbSAtIFRoZSBgY29tbWFuZGVyYCBwcm9ncmFtIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBjb21tYW5kIGlzIGFkZGVkLlxuICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY29tbWFuZC5cbiAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtIEEgYnJpZWYgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGUgY29tbWFuZCBkb2VzLlxuICogQHBhcmFtIHRhc2tGbiAtIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGNvbW1hbmQgaXMgaW52b2tlZC4gQ2FuIHJldHVybiBhIHtAbGluayBDbGlUYXNrUmVzdWx0fSBvciBgdm9pZGAuXG4gKiBAcmV0dXJucyBUaGUgYGNvbW1hbmRlcmAgY29tbWFuZCBpbnN0YW5jZSBmb3IgZnVydGhlciBjaGFpbmluZy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG5mdW5jdGlvbiBhZGRDb21tYW5kPEFyZ3MgZXh0ZW5kcyB1bmtub3duW10+KFxuICBwcm9ncmFtOiBDb21tYW5kLFxuICBuYW1lOiBzdHJpbmcsXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gIHRhc2tGbjogKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48Q2xpVGFza1Jlc3VsdD4+XG4pOiBDb21tYW5kIHtcbiAgcmV0dXJuIHByb2dyYW0uY29tbWFuZChuYW1lKVxuICAgIC5kZXNjcmlwdGlvbihkZXNjcmlwdGlvbilcbiAgICAuYWN0aW9uKCguLi5hcmdzOiBBcmdzKSA9PlxuICAgICAgd3JhcENsaVRhc2soYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzY3JpcHRQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoam9pbihPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLlNjcmlwdHMsIGAke25hbWUucmVwbGFjZSgnOicsICctJyl9LnRzYCkpO1xuICAgICAgICBpZiAoZXhpc3RzU3luYyhzY3JpcHRQYXRoKSkge1xuICAgICAgICAgIGNvbnN0IGZvbGRlciA9IGdldEZvbGRlck5hbWUoaW1wb3J0Lm1ldGEudXJsKTtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZVNjcmlwdFBhdGggPSByZWxhdGl2ZShmb2xkZXIsIHNjcmlwdFBhdGgpO1xuICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IGF3YWl0IGppdGkuaW1wb3J0PFBhcnRpYWw8T3ZlcnJpZGVNb2R1bGU8QXJncz4+PihyZWxhdGl2ZVNjcmlwdFBhdGgpO1xuICAgICAgICAgIGlmICh0eXBlb2YgbW9kdWxlLmludm9rZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0aXZlU2NyaXB0UGF0aH0gZG9lcyBub3QgZXhwb3J0IGFuIGludm9rZSBmdW5jdGlvbmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbW9kdWxlLmludm9rZSguLi5hcmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0YXNrRm4oLi4uYXJncyk7XG4gICAgICB9KVxuICAgICk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXQSxTQUFTLGVBQWU7QUFDeEIsU0FBUyxr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