vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
197 lines (194 loc) • 29.9 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { normalizePath } from 'vite';
import path, { join, relative, resolve, sep } from 'path';
import { DEFAULT_CONFIG } from '../config/defaults.js';
let stashedNormalizer = null;
const resolveExtensionOptions = (removeExtension) => {
if (typeof removeExtension === "boolean") {
if (removeExtension) {
return (path2) => {
if (path2.endsWith(".client") || path2.endsWith(".server")) {
return path2;
}
const extensionIndex = path2.lastIndexOf(".");
return extensionIndex !== -1 ? path2.slice(0, extensionIndex) : path2;
};
}
return (path2) => path2;
}
if (typeof removeExtension === "string") {
return (path2) => path2.replace(removeExtension, "");
}
if (removeExtension instanceof RegExp) {
return (path2) => removeExtension.test(path2) ? path2.replace(removeExtension, "") : path2;
}
if (typeof removeExtension === "function") {
return (path2) => {
if (path2.endsWith(".client") || path2.endsWith(".server")) {
return path2;
}
const extIndex = path2.lastIndexOf(".");
if (extIndex !== -1) {
const extension = path2.slice(extIndex);
if (removeExtension(extension)) {
return path2.slice(0, extIndex);
}
}
return path2;
};
}
return (path2) => path2;
};
const resolveRootOption = (root, preserveModulesRoot) => {
if (typeof preserveModulesRoot === "string" && typeof root === "string") {
const normalizedPreserveModulesRoot = normalizePath(preserveModulesRoot);
if (root !== "" && normalizedPreserveModulesRoot.startsWith(root)) {
return normalizedPreserveModulesRoot.slice(root.length + 1);
}
return "";
} else if (typeof preserveModulesRoot === "string" && typeof root !== "string") {
return normalizePath(preserveModulesRoot);
}
return "";
};
const createKeyNormalizer = ({
root,
preserveModulesRoot,
handleExtension,
moduleBasePath,
moduleBaseURL
}) => (key) => {
if (key.includes("?")) {
key = key.split("?")[0];
}
const virtualPrefix = key.match(/^\0+/) ?? "";
const actualKey = virtualPrefix ? key.slice(virtualPrefix[0].length) : key;
let moduleId = normalizePath(actualKey);
if (moduleId.startsWith("/") && moduleId.startsWith(root)) {
moduleId = relative(root, moduleId);
} else if (moduleId.startsWith(".")) {
moduleId = relative(root, resolve(root, moduleId));
} else if (moduleId.startsWith("/")) {
moduleId = moduleId.slice(1);
}
if (moduleBaseURL && moduleBaseURL !== "/" && moduleBaseURL !== "" && moduleId.startsWith(moduleBaseURL)) {
moduleId = moduleId.slice(moduleBaseURL.length);
}
if (typeof moduleBasePath === "string" && moduleBasePath !== "" && moduleBasePath !== "/") {
moduleId = moduleId.startsWith(
moduleBasePath.endsWith(sep) ? moduleBasePath : moduleBasePath + sep
) ? moduleId.slice(
moduleBasePath.length + (moduleBasePath.endsWith(sep) ? 0 : sep.length)
) : moduleId;
}
moduleId = handleExtension(moduleId);
while (moduleId.endsWith("/") || moduleId.startsWith(".")) {
moduleId = moduleId.slice(0, -1);
}
if (typeof preserveModulesRoot === "string" && preserveModulesRoot !== "") {
moduleId = moduleId.startsWith(preserveModulesRoot) ? moduleId.slice(preserveModulesRoot.length + path.sep.length) : moduleId;
}
return virtualPrefix + moduleId;
};
const createPathNormalizer = ({
root,
preserveModulesRoot,
moduleBasePath,
moduleBaseURL
}) => (path2) => {
if (typeof path2 !== "string") {
throw new Error(`Invalid path: ${JSON.stringify(path2)}`);
}
if (path2.includes("?")) {
path2 = path2.split("?")[0];
}
let normalPath = normalizePath(path2);
if (normalPath.startsWith("/") && normalPath.startsWith(root)) {
normalPath = relative(root, normalPath);
} else if (normalPath.startsWith(".")) {
normalPath = relative(root, normalPath);
} else if (normalPath.startsWith("/")) {
normalPath = normalPath.slice(1);
}
if (moduleBaseURL && moduleBaseURL !== "/" && moduleBaseURL !== "" && normalPath.startsWith(moduleBaseURL)) {
normalPath = normalPath.slice(moduleBaseURL.length);
}
if (typeof moduleBasePath === "string" && moduleBasePath !== "" && moduleBasePath !== "/") {
normalPath = normalPath.startsWith(
moduleBasePath.endsWith(sep) ? moduleBasePath : moduleBasePath + sep
) ? normalPath.slice(
moduleBasePath.length + (moduleBasePath.endsWith(sep) ? 0 : sep.length)
) : normalPath;
}
if (typeof preserveModulesRoot === "string" && preserveModulesRoot !== "") {
normalPath = normalPath.startsWith(preserveModulesRoot) ? normalPath.slice(preserveModulesRoot.length) : normalPath;
}
while (normalPath.endsWith("/")) {
normalPath = normalPath.slice(0, -1);
}
return normalPath;
};
function createInputNormalizer({
root,
moduleBasePath = DEFAULT_CONFIG.MODULE_BASE_PATH,
moduleBaseURL = DEFAULT_CONFIG.MODULE_BASE_URL,
preserveModulesRoot = void 0,
removeExtension = DEFAULT_CONFIG.AUTO_DISCOVER.modulePattern
}) {
if (stashedNormalizer) {
return stashedNormalizer;
}
const relativeRoot = resolveRootOption(root, preserveModulesRoot);
const handleExtension = resolveExtensionOptions(removeExtension);
const normalizeEntryKey = createKeyNormalizer({
root,
preserveModulesRoot,
handleExtension,
moduleBasePath,
moduleBaseURL
});
const normalizeEntryPath = createPathNormalizer({
root,
preserveModulesRoot: relativeRoot,
moduleBasePath,
moduleBaseURL
});
function normalizeInput(id) {
if (Array.isArray(id)) {
const [key, path2] = id;
if (typeof key === "string" && Array.isArray(path2) && path2.length === 2) {
const isNumber = !isNaN(Number(key));
if (isNumber) {
return normalizeInput([path2[0], path2[1]]);
}
return normalizeInput([join(key, path2[0]), path2[1]]);
}
if (typeof key !== "string" || typeof path2 !== "string") {
throw new Error(`Invalid input: ${JSON.stringify(id)}`);
}
return [normalizeEntryKey(key), normalizeEntryPath(path2)];
} else if (typeof id === "string") {
return [normalizeEntryKey(id), normalizeEntryPath(id)];
} else if (typeof id === "object" && id !== null && "$$typeof" in id && "$$id" in id && typeof id.$$id === "string") {
const normalized = [
normalizeEntryKey(id.$$id),
normalizeEntryPath(id.$$id)
];
return normalized;
}
throw new Error(`Invalid input type: ${typeof id}`);
}
stashedNormalizer = (input) => {
const [key, path2] = normalizeInput(input);
const virtualPrefix = key.match(/^\0+/) ?? "";
const finalPath = virtualPrefix ? virtualPrefix.length && path2.startsWith(virtualPrefix[0]) ? path2 : virtualPrefix.length ? virtualPrefix[0] + path2 : path2 : path2;
return [key, finalPath];
};
return stashedNormalizer;
}
export { createInputNormalizer };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXROb3JtYWxpemVyLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW4vaGVscGVycy9pbnB1dE5vcm1hbGl6ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbm9ybWFsaXplUGF0aCB9IGZyb20gXCJ2aXRlXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENyZWF0ZUlucHV0Tm9ybWFsaXplclByb3BzLFxuICBJbnB1dE5vcm1hbGl6ZXIsXG4gIE5vcm1hbGl6ZXJJbnB1dCxcbn0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5pbXBvcnQgcGF0aCwgeyBqb2luLCByZWxhdGl2ZSwgcmVzb2x2ZSwgc2VwIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IERFRkFVTFRfQ09ORklHIH0gZnJvbSBcIi4uL2NvbmZpZy9kZWZhdWx0cy5qc1wiO1xuXG5sZXQgc3Rhc2hlZE5vcm1hbGl6ZXI6IElucHV0Tm9ybWFsaXplciB8IG51bGwgPSBudWxsO1xuXG5jb25zdCByZXNvbHZlRXh0ZW5zaW9uT3B0aW9ucyA9IChcbiAgcmVtb3ZlRXh0ZW5zaW9uOiBDcmVhdGVJbnB1dE5vcm1hbGl6ZXJQcm9wc1tcInJlbW92ZUV4dGVuc2lvblwiXVxuKSA9PiB7XG4gIGlmICh0eXBlb2YgcmVtb3ZlRXh0ZW5zaW9uID09PSBcImJvb2xlYW5cIikge1xuICAgIGlmIChyZW1vdmVFeHRlbnNpb24pIHtcbiAgICAgIHJldHVybiAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgIC8vIGlmIGV4dGVuc2lvbiBpcyBjbGllbnQgb3Igc2VydmVyLCBkb24ndCByZW1vdmUgaXRcbiAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoXCIuY2xpZW50XCIpIHx8IHBhdGguZW5kc1dpdGgoXCIuc2VydmVyXCIpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uSW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKFwiLlwiKTtcblxuICAgICAgICByZXR1cm4gZXh0ZW5zaW9uSW5kZXggIT09IC0xID8gcGF0aC5zbGljZSgwLCBleHRlbnNpb25JbmRleCkgOiBwYXRoO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIChwYXRoOiBzdHJpbmcpID0+IHBhdGg7XG4gIH1cbiAgaWYgKHR5cGVvZiByZW1vdmVFeHRlbnNpb24gPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gKHBhdGg6IHN0cmluZykgPT4gcGF0aC5yZXBsYWNlKHJlbW92ZUV4dGVuc2lvbiwgXCJcIik7XG4gIH1cbiAgaWYgKHJlbW92ZUV4dGVuc2lvbiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIHJldHVybiAocGF0aDogc3RyaW5nKSA9PlxuICAgICAgcmVtb3ZlRXh0ZW5zaW9uLnRlc3QocGF0aCkgPyBwYXRoLnJlcGxhY2UocmVtb3ZlRXh0ZW5zaW9uLCBcIlwiKSA6IHBhdGg7XG4gIH1cbiAgaWYgKHR5cGVvZiByZW1vdmVFeHRlbnNpb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAocGF0aC5lbmRzV2l0aChcIi5jbGllbnRcIikgfHwgcGF0aC5lbmRzV2l0aChcIi5zZXJ2ZXJcIikpIHtcbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICB9XG4gICAgICBjb25zdCBleHRJbmRleCA9IHBhdGgubGFzdEluZGV4T2YoXCIuXCIpO1xuICAgICAgaWYgKGV4dEluZGV4ICE9PSAtMSkge1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBwYXRoLnNsaWNlKGV4dEluZGV4KTtcbiAgICAgICAgaWYgKHJlbW92ZUV4dGVuc2lvbihleHRlbnNpb24pKSB7XG4gICAgICAgICAgcmV0dXJuIHBhdGguc2xpY2UoMCwgZXh0SW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9O1xuICB9XG4gIHJldHVybiAocGF0aDogc3RyaW5nKSA9PiBwYXRoO1xufTtcblxuY29uc3QgcmVzb2x2ZVJvb3RPcHRpb24gPSAoXG4gIHJvb3Q6IENyZWF0ZUlucHV0Tm9ybWFsaXplclByb3BzW1wicm9vdFwiXSxcbiAgcHJlc2VydmVNb2R1bGVzUm9vdDogQ3JlYXRlSW5wdXROb3JtYWxpemVyUHJvcHNbXCJwcmVzZXJ2ZU1vZHVsZXNSb290XCJdXG4pID0+IHtcbiAgaWYgKHR5cGVvZiBwcmVzZXJ2ZU1vZHVsZXNSb290ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiByb290ID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFByZXNlcnZlTW9kdWxlc1Jvb3QgPSBub3JtYWxpemVQYXRoKHByZXNlcnZlTW9kdWxlc1Jvb3QpO1xuICAgIGlmIChyb290ICE9PSBcIlwiICYmIG5vcm1hbGl6ZWRQcmVzZXJ2ZU1vZHVsZXNSb290LnN0YXJ0c1dpdGgocm9vdCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkUHJlc2VydmVNb2R1bGVzUm9vdC5zbGljZShyb290Lmxlbmd0aCArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfSBlbHNlIGlmIChcbiAgICB0eXBlb2YgcHJlc2VydmVNb2R1bGVzUm9vdCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIHR5cGVvZiByb290ICE9PSBcInN0cmluZ1wiXG4gICkge1xuICAgIHJldHVybiBub3JtYWxpemVQYXRoKHByZXNlcnZlTW9kdWxlc1Jvb3QpO1xuICB9XG4gIHJldHVybiBcIlwiO1xufTtcblxuY29uc3QgY3JlYXRlS2V5Tm9ybWFsaXplciA9XG4gICh7XG4gICAgcm9vdCxcbiAgICBwcmVzZXJ2ZU1vZHVsZXNSb290LFxuICAgIGhhbmRsZUV4dGVuc2lvbixcbiAgICBtb2R1bGVCYXNlUGF0aCxcbiAgICBtb2R1bGVCYXNlVVJMLFxuICB9OiB7XG4gICAgcm9vdDogc3RyaW5nO1xuICAgIHByZXNlcnZlTW9kdWxlc1Jvb3Q6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBoYW5kbGVFeHRlbnNpb246IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZztcbiAgICBtb2R1bGVCYXNlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIG1vZHVsZUJhc2VVUkw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgfSkgPT5cbiAgKGtleTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKGtleS5pbmNsdWRlcyhcIj9cIikpIHtcbiAgICAgIGtleSA9IGtleS5zcGxpdChcIj9cIilbMF07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHZpcnR1YWwgbW9kdWxlcyBmaXJzdFxuICAgIGNvbnN0IHZpcnR1YWxQcmVmaXggPSBrZXkubWF0Y2goL15cXDArLykgPz8gXCJcIjtcbiAgICBjb25zdCBhY3R1YWxLZXkgPSB2aXJ0dWFsUHJlZml4ID8ga2V5LnNsaWNlKHZpcnR1YWxQcmVmaXhbMF0ubGVuZ3RoKSA6IGtleTtcblxuICAgIGxldCBtb2R1bGVJZCA9IG5vcm1hbGl6ZVBhdGgoYWN0dWFsS2V5KTtcblxuICAgIC8vIE9ubHkgdHJlYXQgYXMgZmlsZSBzeXN0ZW0gcGF0aCBpZiBpdCBhY3R1YWxseSBjb250YWlucyB0aGUgcm9vdCBwYXRoXG4gICAgLy8gVVJMIHBhdGhzIGxpa2UgXCIvXCIgc2hvdWxkIG5vdCBiZSByZXNvbHZlZCByZWxhdGl2ZSB0byBmaWxlIHN5c3RlbSByb290XG4gICAgaWYobW9kdWxlSWQuc3RhcnRzV2l0aChcIi9cIikgJiYgbW9kdWxlSWQuc3RhcnRzV2l0aChyb290KSkge1xuICAgICAgbW9kdWxlSWQgPSByZWxhdGl2ZShyb290LCBtb2R1bGVJZCk7XG4gICAgfSBlbHNlIGlmIChtb2R1bGVJZC5zdGFydHNXaXRoKFwiLlwiKSkge1xuICAgICAgbW9kdWxlSWQgPSByZWxhdGl2ZShyb290LCByZXNvbHZlKHJvb3QsIG1vZHVsZUlkKSk7XG4gICAgfSBlbHNlIGlmIChtb2R1bGVJZC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgLy8gVGhpcyBpcyBhIFVSTCBwYXRoIGxpa2UgXCIvXCIgb3IgXCIvYWJvdXRcIiwgcmVtb3ZlIGxlYWRpbmcgc2xhc2ggZm9yIGNvbnNpc3RlbmN5XG4gICAgICBtb2R1bGVJZCA9IG1vZHVsZUlkLnNsaWNlKDEpO1xuICAgIH0gXG4gICAgaWYobW9kdWxlQmFzZVVSTCAmJiBtb2R1bGVCYXNlVVJMICE9PSBcIi9cIiAmJiBtb2R1bGVCYXNlVVJMICE9PSBcIlwiICYmIG1vZHVsZUlkLnN0YXJ0c1dpdGgobW9kdWxlQmFzZVVSTCkpIHtcbiAgICAgIG1vZHVsZUlkID0gbW9kdWxlSWQuc2xpY2UobW9kdWxlQmFzZVVSTC5sZW5ndGgpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgbW9kdWxlQmFzZVBhdGggPT09IFwic3RyaW5nXCIgJiZcbiAgICAgIG1vZHVsZUJhc2VQYXRoICE9PSBcIlwiICYmXG4gICAgICBtb2R1bGVCYXNlUGF0aCAhPT0gXCIvXCJcbiAgICApIHtcbiAgICAgIG1vZHVsZUlkID0gbW9kdWxlSWQuc3RhcnRzV2l0aChcbiAgICAgICAgbW9kdWxlQmFzZVBhdGguZW5kc1dpdGgoc2VwKSA/IG1vZHVsZUJhc2VQYXRoIDogbW9kdWxlQmFzZVBhdGggKyBzZXBcbiAgICAgIClcbiAgICAgICAgPyBtb2R1bGVJZC5zbGljZShcbiAgICAgICAgICAgIG1vZHVsZUJhc2VQYXRoLmxlbmd0aCArXG4gICAgICAgICAgICAgIChtb2R1bGVCYXNlUGF0aC5lbmRzV2l0aChzZXApID8gMCA6IHNlcC5sZW5ndGgpXG4gICAgICAgICAgKVxuICAgICAgICA6IG1vZHVsZUlkO1xuICAgIH1cblxuICAgIG1vZHVsZUlkID0gaGFuZGxlRXh0ZW5zaW9uKG1vZHVsZUlkKTtcbiAgICB3aGlsZSAobW9kdWxlSWQuZW5kc1dpdGgoXCIvXCIpIHx8IG1vZHVsZUlkLnN0YXJ0c1dpdGgoXCIuXCIpKSB7XG4gICAgICBtb2R1bGVJZCA9IG1vZHVsZUlkLnNsaWNlKDAsIC0xKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcmVzZXJ2ZU1vZHVsZXNSb290ID09PSBcInN0cmluZ1wiICYmIHByZXNlcnZlTW9kdWxlc1Jvb3QgIT09IFwiXCIpIHtcbiAgICAgIG1vZHVsZUlkID0gbW9kdWxlSWQuc3RhcnRzV2l0aChwcmVzZXJ2ZU1vZHVsZXNSb290KVxuICAgICAgICA/IG1vZHVsZUlkLnNsaWNlKHByZXNlcnZlTW9kdWxlc1Jvb3QubGVuZ3RoICsgcGF0aC5zZXAubGVuZ3RoKVxuICAgICAgICA6IG1vZHVsZUlkO1xuICAgIH1cblxuICAgIC8vIEFkZCB2aXJ0dWFsIHByZWZpeCBiYWNrXG4gICAgcmV0dXJuIHZpcnR1YWxQcmVmaXggKyBtb2R1bGVJZDtcbiAgfTtcblxuY29uc3QgY3JlYXRlUGF0aE5vcm1hbGl6ZXIgPVxuICAoe1xuICAgIHJvb3QsXG4gICAgcHJlc2VydmVNb2R1bGVzUm9vdCxcbiAgICBtb2R1bGVCYXNlUGF0aCxcbiAgICBtb2R1bGVCYXNlVVJMLFxuICB9OiB7XG4gICAgcm9vdDogc3RyaW5nO1xuICAgIHByZXNlcnZlTW9kdWxlc1Jvb3Q6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBtb2R1bGVCYXNlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIG1vZHVsZUJhc2VVUkw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgfSkgPT5cbiAgKHBhdGg6IHN0cmluZykgPT4ge1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhdGg6ICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9YCk7XG4gICAgfVxuICAgIGlmIChwYXRoLmluY2x1ZGVzKFwiP1wiKSkge1xuICAgICAgcGF0aCA9IHBhdGguc3BsaXQoXCI/XCIpWzBdO1xuICAgIH1cbiAgICBsZXQgbm9ybWFsUGF0aCA9IG5vcm1hbGl6ZVBhdGgocGF0aCk7XG4gICAgXG4gICAgLy8gT25seSB0cmVhdCBhcyBmaWxlIHN5c3RlbSBwYXRoIGlmIGl0IGFjdHVhbGx5IGNvbnRhaW5zIHRoZSByb290IHBhdGhcbiAgICAvLyBVUkwgcGF0aHMgbGlrZSBcIi9cIiBzaG91bGQgbm90IGJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIGZpbGUgc3lzdGVtIHJvb3RcbiAgICBpZihub3JtYWxQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpICYmIG5vcm1hbFBhdGguc3RhcnRzV2l0aChyb290KSkge1xuICAgICAgbm9ybWFsUGF0aCA9IHJlbGF0aXZlKHJvb3QsIG5vcm1hbFBhdGgpO1xuICAgIH0gZWxzZSBpZiAobm9ybWFsUGF0aC5zdGFydHNXaXRoKFwiLlwiKSkge1xuICAgICAgbm9ybWFsUGF0aCA9IHJlbGF0aXZlKHJvb3QsIG5vcm1hbFBhdGgpO1xuICAgIH0gZWxzZSBpZiAobm9ybWFsUGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgLy8gVGhpcyBpcyBhIFVSTCBwYXRoIGxpa2UgXCIvXCIgb3IgXCIvYWJvdXRcIiwgcmVtb3ZlIGxlYWRpbmcgc2xhc2ggZm9yIGNvbnNpc3RlbmN5XG4gICAgICBub3JtYWxQYXRoID0gbm9ybWFsUGF0aC5zbGljZSgxKTtcbiAgICB9XG4gICAgXG4gICAgaWYobW9kdWxlQmFzZVVSTCAmJiBtb2R1bGVCYXNlVVJMICE9PSBcIi9cIiAmJiBtb2R1bGVCYXNlVVJMICE9PSBcIlwiICYmIG5vcm1hbFBhdGguc3RhcnRzV2l0aChtb2R1bGVCYXNlVVJMKSkge1xuICAgICAgbm9ybWFsUGF0aCA9IG5vcm1hbFBhdGguc2xpY2UobW9kdWxlQmFzZVVSTC5sZW5ndGgpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgbW9kdWxlQmFzZVBhdGggPT09IFwic3RyaW5nXCIgJiZcbiAgICAgIG1vZHVsZUJhc2VQYXRoICE9PSBcIlwiICYmXG4gICAgICBtb2R1bGVCYXNlUGF0aCAhPT0gXCIvXCJcbiAgICApIHtcbiAgICAgIG5vcm1hbFBhdGggPSBub3JtYWxQYXRoLnN0YXJ0c1dpdGgoXG4gICAgICAgIG1vZHVsZUJhc2VQYXRoLmVuZHNXaXRoKHNlcCkgPyBtb2R1bGVCYXNlUGF0aCA6IG1vZHVsZUJhc2VQYXRoICsgc2VwXG4gICAgICApXG4gICAgICAgID8gbm9ybWFsUGF0aC5zbGljZShcbiAgICAgICAgICAgIG1vZHVsZUJhc2VQYXRoLmxlbmd0aCArXG4gICAgICAgICAgICAgIChtb2R1bGVCYXNlUGF0aC5lbmRzV2l0aChzZXApID8gMCA6IHNlcC5sZW5ndGgpXG4gICAgICAgICAgKVxuICAgICAgICA6IG5vcm1hbFBhdGg7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJlc2VydmVNb2R1bGVzUm9vdCA9PT0gXCJzdHJpbmdcIiAmJiBwcmVzZXJ2ZU1vZHVsZXNSb290ICE9PSBcIlwiKSB7XG4gICAgICBub3JtYWxQYXRoID0gbm9ybWFsUGF0aC5zdGFydHNXaXRoKHByZXNlcnZlTW9kdWxlc1Jvb3QpXG4gICAgICAgID8gbm9ybWFsUGF0aC5zbGljZShwcmVzZXJ2ZU1vZHVsZXNSb290Lmxlbmd0aClcbiAgICAgICAgOiBub3JtYWxQYXRoO1xuICAgIH1cbiAgICB3aGlsZSAobm9ybWFsUGF0aC5lbmRzV2l0aChcIi9cIikpIHtcbiAgICAgIG5vcm1hbFBhdGggPSBub3JtYWxQYXRoLnNsaWNlKDAsIC0xKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbFBhdGg7XG4gIH07XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgYSBmdW5jdGlvbiB0aGF0IG5vcm1hbGl6ZXMgdGhlIGlucHV0XG4gKiBAcGFyYW0gcm9vdCAtIFRoZSByb290IG9mIHRoZSBwcm9qZWN0XG4gKiBAcGFyYW0gcHJlc2VydmVNb2R1bGVzUm9vdCAtIFRoZSByb290IG9mIHRoZSBwcmVzZXJ2ZSBtb2R1bGVzXG4gKiBAcGFyYW0gcmVtb3ZlRXh0ZW5zaW9uIC0gV2hldGhlciB0byByZW1vdmUgdGhlIGV4dGVuc2lvbiBvZiB0aGUgZmlsZVxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IG5vcm1hbGl6ZXMgdGhlIGlucHV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbnB1dE5vcm1hbGl6ZXIoe1xuICByb290LFxuICBtb2R1bGVCYXNlUGF0aCA9IERFRkFVTFRfQ09ORklHLk1PRFVMRV9CQVNFX1BBVEgsXG4gIG1vZHVsZUJhc2VVUkwgPSBERUZBVUxUX0NPTkZJRy5NT0RVTEVfQkFTRV9VUkwsXG4gIHByZXNlcnZlTW9kdWxlc1Jvb3QgPSB1bmRlZmluZWQsXG4gIHJlbW92ZUV4dGVuc2lvbiA9IERFRkFVTFRfQ09ORklHLkFVVE9fRElTQ09WRVIubW9kdWxlUGF0dGVybixcbn06IENyZWF0ZUlucHV0Tm9ybWFsaXplclByb3BzKTogSW5wdXROb3JtYWxpemVyIHtcbiAgaWYgKHN0YXNoZWROb3JtYWxpemVyKSB7XG4gICAgcmV0dXJuIHN0YXNoZWROb3JtYWxpemVyO1xuICB9XG4gIGNvbnN0IHJlbGF0aXZlUm9vdCA9IHJlc29sdmVSb290T3B0aW9uKHJvb3QsIHByZXNlcnZlTW9kdWxlc1Jvb3QpO1xuICBjb25zdCBoYW5kbGVFeHRlbnNpb24gPSByZXNvbHZlRXh0ZW5zaW9uT3B0aW9ucyhyZW1vdmVFeHRlbnNpb24pO1xuICBjb25zdCBub3JtYWxpemVFbnRyeUtleSA9IGNyZWF0ZUtleU5vcm1hbGl6ZXIoe1xuICAgIHJvb3Q6IHJvb3QsXG4gICAgcHJlc2VydmVNb2R1bGVzUm9vdDogcHJlc2VydmVNb2R1bGVzUm9vdCxcbiAgICBoYW5kbGVFeHRlbnNpb24sXG4gICAgbW9kdWxlQmFzZVBhdGgsXG4gICAgbW9kdWxlQmFzZVVSTCxcbiAgfSk7XG4gIGNvbnN0IG5vcm1hbGl6ZUVudHJ5UGF0aCA9IGNyZWF0ZVBhdGhOb3JtYWxpemVyKHtcbiAgICByb290OiByb290LFxuICAgIHByZXNlcnZlTW9kdWxlc1Jvb3Q6IHJlbGF0aXZlUm9vdCxcbiAgICBtb2R1bGVCYXNlUGF0aCxcbiAgICBtb2R1bGVCYXNlVVJMLFxuICB9KTtcbiAgZnVuY3Rpb24gbm9ybWFsaXplSW5wdXQoaWQ6IE5vcm1hbGl6ZXJJbnB1dCk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIC8vIE5vcm1hbGl6ZSBib3RoIHBhdGhzIHRvIHVzZSBQT1NJWCBzZXBhcmF0b3JzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaWQpKSB7XG4gICAgICBjb25zdCBba2V5LCBwYXRoXSA9IGlkO1xuICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgJiYgQXJyYXkuaXNBcnJheShwYXRoKSAmJiBwYXRoLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBjb25zdCBpc051bWJlciA9ICFpc05hTihOdW1iZXIoa2V5KSk7XG4gICAgICAgIGlmIChpc051bWJlcikge1xuICAgICAgICAgIC8vIGlnbm9yZSBpdFxuICAgICAgICAgIHJldHVybiBub3JtYWxpemVJbnB1dChbcGF0aFswXSwgcGF0aFsxXV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub3JtYWxpemVJbnB1dChbam9pbihrZXksIHBhdGhbMF0pLCBwYXRoWzFdXSk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGtleSAhPT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgcGF0aCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW5wdXQ6ICR7SlNPTi5zdHJpbmdpZnkoaWQpfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtub3JtYWxpemVFbnRyeUtleShrZXkpLCBub3JtYWxpemVFbnRyeVBhdGgocGF0aCldO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAvLyBSZXR1cm4gYm90aCB0aGUgbm9ybWFsaXplZCBJRCBhbmQgb3JpZ2luYWwgbm9ybWFsaXplZCBwYXRoXG4gICAgICByZXR1cm4gW25vcm1hbGl6ZUVudHJ5S2V5KGlkKSwgbm9ybWFsaXplRW50cnlQYXRoKGlkKV07XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHR5cGVvZiBpZCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgaWQgIT09IG51bGwgJiZcbiAgICAgIFwiJCR0eXBlb2ZcIiBpbiBpZCAmJlxuICAgICAgXCIkJGlkXCIgaW4gaWQgJiZcbiAgICAgIHR5cGVvZiBpZC4kJGlkID09PSBcInN0cmluZ1wiXG4gICAgKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkOiBbc3RyaW5nLCBzdHJpbmddID0gW1xuICAgICAgICBub3JtYWxpemVFbnRyeUtleShpZC4kJGlkKSxcbiAgICAgICAgbm9ybWFsaXplRW50cnlQYXRoKGlkLiQkaWQpLFxuICAgICAgXTtcbiAgICAgIHJldHVybiBub3JtYWxpemVkO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW5wdXQgdHlwZTogJHt0eXBlb2YgaWR9YCk7XG4gIH1cblxuICBzdGFzaGVkTm9ybWFsaXplciA9IChpbnB1dDogTm9ybWFsaXplcklucHV0KTogW3N0cmluZywgc3RyaW5nXSA9PiB7XG4gICAgY29uc3QgW2tleSwgcGF0aF0gPSBub3JtYWxpemVJbnB1dChpbnB1dCk7XG4gICAgXG4gICAgXG4gICAgY29uc3QgdmlydHVhbFByZWZpeCA9IGtleS5tYXRjaCgvXlxcMCsvKSA/PyBcIlwiO1xuICAgIC8vIElmIGtleSBoYXMgdmlydHVhbCBwcmVmaXgsIGVuc3VyZSBwYXRoIGhhcyBpdCB0b29cbiAgICBjb25zdCBmaW5hbFBhdGggPSB2aXJ0dWFsUHJlZml4XG4gICAgICA/IHZpcnR1YWxQcmVmaXgubGVuZ3RoICYmIHBhdGguc3RhcnRzV2l0aCh2aXJ0dWFsUHJlZml4WzBdKVxuICAgICAgICA/IHBhdGhcbiAgICAgICAgOiB2aXJ0dWFsUHJlZml4Lmxlbmd0aFxuICAgICAgICA/IHZpcnR1YWxQcmVmaXhbMF0gKyBwYXRoXG4gICAgICAgIDogcGF0aFxuICAgICAgOiBwYXRoO1xuICAgIHJldHVybiBba2V5LCBmaW5hbFBhdGhdO1xuICB9O1xuICByZXR1cm4gc3Rhc2hlZE5vcm1hbGl6ZXI7XG59XG4iXSwibmFtZXMiOlsicGF0aCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBU0EsSUFBSSxpQkFB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