vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
111 lines (109 loc) • 21.7 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
const createAbsoluteURL = (withBaseURL, withPublicOrigin) => {
const baseURL = createBaseURL(withBaseURL);
if (withPublicOrigin === "" || typeof withPublicOrigin !== "string")
return baseURL;
return (path) => {
const pathWithBaseURL = baseURL(path);
try {
return new URL(pathWithBaseURL, withPublicOrigin).toString();
} catch {
const publicOrigin = withPublicOrigin.endsWith("/") ? withPublicOrigin.slice(0, -1) : withPublicOrigin;
const pathPart = pathWithBaseURL.startsWith("/") ? pathWithBaseURL : `/${pathWithBaseURL}`;
return publicOrigin + pathPart;
}
};
};
const createBaseURL = (withBaseURL) => {
if (withBaseURL === "") {
return (path) => path;
}
if (withBaseURL.endsWith("/")) {
return (path) => {
if (path === "") return withBaseURL;
if (path.startsWith(withBaseURL) || isAbsoluteURL(path)) return path;
return `${withBaseURL}${removeLeadingSlash(path)}`;
};
} else {
return (path) => {
if (path === "") return withBaseURL;
if (isAbsoluteURL(path)) return path;
if (path.startsWith("/")) return withBaseURL + path;
if (path.startsWith(withBaseURL)) return path;
return `${withBaseURL}/${path}`;
};
}
};
const removeTrailingSlash = (url) => url.endsWith("/") ? url.slice(0, -1) : url;
const addTrailingSlash = (url) => url.endsWith("/") ? url : `${url}/`;
const removeLeadingSlash = (url) => url.startsWith("/") ? url.slice(1) : url;
const addLeadingSlash = (url) => url.startsWith("/") ? url : `/${url}`;
const isBlankRegex = /^(?:[a-zA-Z][a-zA-Z0-9+.-]*:)?\/\//;
const isAbsoluteURL = (url) => isBlankRegex.test(url) || url.startsWith("//");
const folderName = (path, withBaseURL) => {
const baseURL = createBaseURL(withBaseURL);
return baseURL(path.replace(/\[index.(html?|rsc|HTML?)]$/, ""));
};
const createPageURL = (withBaseURL, withPublicOrigin, isDev = false, normalizer = !withBaseURL.endsWith("/") ? removeTrailingSlash : addTrailingSlash) => {
return (to, fileName = "index.rsc") => {
try {
const baseURLString = typeof withBaseURL === "string" ? withBaseURL : String(withBaseURL || "/");
const folderName2 = addTrailingSlash(
to.replace(/\[index.(html?|rsc|HTML?)]$/, "")
);
const baseURL = createBaseURL(baseURLString);
const rscPath = baseURL(folderName2) + fileName;
const moduleBaseURL = parseURL(baseURLString, withPublicOrigin);
if (moduleBaseURL.type === "error") {
if (isDev) console.error("Error parsing moduleBaseURL", moduleBaseURL.error);
throw moduleBaseURL.error;
}
const indexRSC = parseURL(rscPath, withPublicOrigin);
if (indexRSC.type === "error") {
throw indexRSC.error;
}
return {
indexRSC: indexRSC.url.toString(),
moduleBaseURL: normalizer(moduleBaseURL.url.toString())
};
} catch (error) {
if (isDev) console.error("Error parsing pageURL", error);
const shouldJoin = !to.endsWith("/") && !fileName.startsWith("/");
const shouldSlice = to.endsWith("/") && fileName.startsWith("/");
return {
indexRSC: to + (shouldJoin ? "/" : "") + (shouldSlice ? fileName.slice(1) : fileName),
moduleBaseURL: typeof withBaseURL === "string" ? withBaseURL : String(withBaseURL || "/")
};
}
};
};
const parseURL = (url, base) => {
try {
let effectiveBase = base;
if (!effectiveBase || effectiveBase === "/" || !isAbsoluteURL(effectiveBase)) {
if (typeof window !== "undefined" && window.location) {
effectiveBase = window.location.origin;
} else if (!effectiveBase) {
effectiveBase = "http://localhost";
}
}
if (isAbsoluteURL(url)) {
return {
type: "success",
url: new URL(url)
};
}
return {
type: "success",
url: new URL(url, effectiveBase)
};
} catch (error) {
return { type: "error", url, base, error };
}
};
export { addLeadingSlash, addTrailingSlash, createAbsoluteURL, createBaseURL, createPageURL, folderName, isAbsoluteURL, isBlankRegex, parseURL, removeLeadingSlash, removeTrailingSlash };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJscy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL3V0aWxzL3VybHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAjIGNyZWF0ZUFic29sdXRlVXJsXG4gKlxuICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGJhc2VVUkwgYW5kIGEgcHVibGljIG9yaWdpbiBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBwYXRoIGFuZCByZXR1cm5zIHRoZSBwYXRoIHdpdGggdGhlIGJhc2VVUkwgYXR0YWNoZWQgdG8gaXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBhYnNvbHV0ZVVSTCA9IGNyZWF0ZUFic29sdXRlVVJMKFwiL21tY1wiLCBcImh0dHBzOi8vYmlkb29mLmNvbVwiKVxuICogY29uc29sZS5sb2coYWJzb2x1dGVVUkwoXCIvdGVzdFwiKSkgLy8gXCJodHRwczovL2JpZG9vZi5jb20vbW1jL3Rlc3RcIlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBhYnNvbHV0ZVVSTCA9IGNyZWF0ZUFic29sdXRlVVJMKFwiL21tY1wiLCBcImh0dHBzOi8vYmlkb29mLmNvbVwiKVxuICogY29uc29sZS5sb2coYWJzb2x1dGVVUkwoXCIvdGVzdFwiKSkgLy8gXCJodHRwczovL2JpZG9vZi5jb20vbW1jL3Rlc3RcIlxuICogYGBgXG4gKlxuICogVGhpcyBjYW4gcmVwbGFjZSBjb2RlIGxpa2UgYCR7cHJvY2Vzcy5lbnYuVklURV9QVUJMSUNfT1JJR0lOfS90ZXN0YCB3aXRoIGBhYnNvbHV0ZVVybCgnL3Rlc3QnKWAsIGFuZCB5b3UgY2FuIGJlIHN1cmUgdGhhdCBpdCB3aWxsIHdvcmsgYWZ0ZXJcbiAqIGNoYW5naW5nIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVBYnNvbHV0ZVVSTCA9IChcbiAgd2l0aEJhc2VVUkw6IHN0cmluZyxcbiAgd2l0aFB1YmxpY09yaWdpbjogc3RyaW5nXG4pID0+IHtcbiAgY29uc3QgYmFzZVVSTCA9IGNyZWF0ZUJhc2VVUkwod2l0aEJhc2VVUkwpO1xuICBpZiAod2l0aFB1YmxpY09yaWdpbiA9PT0gXCJcIiB8fCB0eXBlb2Ygd2l0aFB1YmxpY09yaWdpbiAhPT0gXCJzdHJpbmdcIilcbiAgICByZXR1cm4gYmFzZVVSTDtcbiAgcmV0dXJuIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBwYXRoV2l0aEJhc2VVUkwgPSBiYXNlVVJMKHBhdGgpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IFVSTChwYXRoV2l0aEJhc2VVUkwsIHdpdGhQdWJsaWNPcmlnaW4pLnRvU3RyaW5nKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGYWxsYmFjazogZW5zdXJlIHByb3BlciBVUkwgY29uc3RydWN0aW9uXG4gICAgICBjb25zdCBwdWJsaWNPcmlnaW4gPSB3aXRoUHVibGljT3JpZ2luLmVuZHNXaXRoKFwiL1wiKSBcbiAgICAgICAgPyB3aXRoUHVibGljT3JpZ2luLnNsaWNlKDAsIC0xKSBcbiAgICAgICAgOiB3aXRoUHVibGljT3JpZ2luO1xuICAgICAgY29uc3QgcGF0aFBhcnQgPSBwYXRoV2l0aEJhc2VVUkwuc3RhcnRzV2l0aChcIi9cIikgXG4gICAgICAgID8gcGF0aFdpdGhCYXNlVVJMIFxuICAgICAgICA6IGAvJHtwYXRoV2l0aEJhc2VVUkx9YDtcbiAgICAgIHJldHVybiBwdWJsaWNPcmlnaW4gKyBwYXRoUGFydDtcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqICMgY3JlYXRlQmFzZVVSTFxuICpcbiAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBiYXNlVVJMIGFuZCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHBhdGggYW5kIHJldHVybnMgdGhlIHBhdGggd2l0aCB0aGUgYmFzZVVSTCBhdHRhY2hlZCB0byBpdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGJhc2VVUkwgPSBjcmVhdGVCYXNlVVJMKFwiL21tY1wiKVxuICogY29uc29sZS5sb2coYmFzZVVSTChcIi90ZXN0XCIpKSAvLyBcIi9tbWMvdGVzdFwiXG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGJhc2VVUkwgPSBjcmVhdGVCYXNlVVJMKFwiL21tYy9cIilcbiAqIGNvbnNvbGUubG9nKGJhc2VVUkwoXCIvdGVzdFwiKSkgLy8gXCIvbW1jL3Rlc3RcIlxuICogYGBgXG4gKlxuICogVGhpcyBjYW4gcmVwbGFjZSBjb2RlIGxpa2UgYCR7aW1wb3J0Lm1ldGEuZW52LnRlc3RgIHdpdGggYGJhc2VVUkwocGF0aClgLCBhbmQgeW91IGNhbiBiZSBzdXJlIHRoYXQgaXQgd2lsbCB3b3JrIGFmdGVyXG4gKiBjaGFuZ2luZyB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICpcbiAqIFBhdGggaGFuZGxpbmcgbG9naWM6XG4gKiAxLiBGb3IgYmFzZVVSTCBlbmRpbmcgd2l0aCBcIi9cIjpcbiAqICAgIC0gSWYgcGF0aCBzdGFydHMgd2l0aCBcIi9cIiwgc2xpY2Ugb2ZmIHRoZSBsZWFkaW5nIHNsYXNoIHRvIGF2b2lkIGRvdWJsZSBzbGFzaGVzXG4gKiAgICAtIElmIHBhdGggZG9lc24ndCBzdGFydCB3aXRoIFwiL1wiLCBrZWVwIGl0IGFzIGlzXG4gKlxuICogMi4gRm9yIGJhc2VVUkwgbm90IGVuZGluZyB3aXRoIFwiL1wiOlxuICogICAgLSBJZiBwYXRoIHN0YXJ0cyB3aXRoIFwiL1wiLCBkaXJlY3RseSBjb25jYXRlbmF0ZSB3aXRoIGJhc2VVUkxcbiAqICAgIC0gSWYgcGF0aCBkb2Vzbid0IHN0YXJ0IHdpdGggXCIvXCIsIGFkZCBhIHNsYXNoIGJldHdlZW4gYmFzZVVSTCBhbmQgcGF0aFxuICpcbiAqIGJhc2VVUkwgXCJzcmNcIiAgKyBwYXRoIFwic3JjL3Rlc3RcIiAtPiBzaG91bGQgbm90IGNvbmNhdGVuYXRlIHRvIHNyYy9zcmMvdGVzdFxuICogYmFzZVVSTCBcIi9cIiArIHBhdGggXCJodHRwczovL2JpZG9vZi5jb21cIiAtPiBzaG91bGQgbm90IGNvbmNhdGVuYXRlIHRvIC9odHRwczovL2JpZG9vZi5jb21cIlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQmFzZVVSTCA9ICh3aXRoQmFzZVVSTDogc3RyaW5nKSA9PiB7XG4gIGlmKHdpdGhCYXNlVVJMID09PSAnJyl7XG4gICAgcmV0dXJuIChwYXRoOiBzdHJpbmcpID0+IHBhdGg7XG4gIH1cbiAgaWYgKHdpdGhCYXNlVVJMLmVuZHNXaXRoKFwiL1wiKSkge1xuICAgIHJldHVybiAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAocGF0aCA9PT0gXCJcIikgcmV0dXJuIHdpdGhCYXNlVVJMO1xuICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCh3aXRoQmFzZVVSTCkgfHwgaXNBYnNvbHV0ZVVSTChwYXRoKSkgcmV0dXJuIHBhdGg7XG4gICAgICByZXR1cm4gYCR7d2l0aEJhc2VVUkx9JHtyZW1vdmVMZWFkaW5nU2xhc2gocGF0aCl9YDtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAocGF0aCA9PT0gXCJcIikgcmV0dXJuIHdpdGhCYXNlVVJMO1xuICAgICAgaWYgKGlzQWJzb2x1dGVVUkwocGF0aCkpIHJldHVybiBwYXRoO1xuICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHJldHVybiB3aXRoQmFzZVVSTCArIHBhdGg7XG4gICAgICBpZiAocGF0aC5zdGFydHNXaXRoKHdpdGhCYXNlVVJMKSkgcmV0dXJuIHBhdGg7XG4gICAgICByZXR1cm4gYCR7d2l0aEJhc2VVUkx9LyR7cGF0aH1gO1xuICAgIH07XG4gIH1cbn07XG5cbi8qKiBSZW1vdmUgYSBzaW5nbGUgdHJhaWxpbmcgc2xhc2ggZnJvbSB0aGUgVVJMIGlmIGl0IGVuZHMgd2l0aCBvbmUgKi9cbmV4cG9ydCBjb25zdCByZW1vdmVUcmFpbGluZ1NsYXNoID0gKHVybDogc3RyaW5nKSA9PlxuICB1cmwuZW5kc1dpdGgoXCIvXCIpID8gdXJsLnNsaWNlKDAsIC0xKSA6IHVybDtcblxuLyoqIEFkZCBhIHNpbmdsZSB0cmFpbGluZyBzbGFzaCB0byB0aGUgVVJMIGlmIGl0IGRvZXNuJ3QgZW5kIHdpdGggb25lICovXG5leHBvcnQgY29uc3QgYWRkVHJhaWxpbmdTbGFzaCA9ICh1cmw6IHN0cmluZykgPT5cbiAgdXJsLmVuZHNXaXRoKFwiL1wiKSA/IHVybCA6IGAke3VybH0vYDtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZUxlYWRpbmdTbGFzaCA9ICh1cmw6IHN0cmluZykgPT5cbiAgdXJsLnN0YXJ0c1dpdGgoXCIvXCIpID8gdXJsLnNsaWNlKDEpIDogdXJsO1xuXG5leHBvcnQgY29uc3QgYWRkTGVhZGluZ1NsYXNoID0gKHVybDogc3RyaW5nKSA9PlxuICB1cmwuc3RhcnRzV2l0aChcIi9cIikgPyB1cmwgOiBgLyR7dXJsfWA7XG5cbmV4cG9ydCBjb25zdCBpc0JsYW5rUmVnZXggPSAvXig/OlthLXpBLVpdW2EtekEtWjAtOSsuLV0qOik/XFwvXFwvLztcbmV4cG9ydCBjb25zdCBpc0Fic29sdXRlVVJMID0gKHVybDogc3RyaW5nKSA9PlxuICBpc0JsYW5rUmVnZXgudGVzdCh1cmwpIHx8IHVybC5zdGFydHNXaXRoKFwiLy9cIik7XG5cbmV4cG9ydCBjb25zdCBmb2xkZXJOYW1lID0gKHBhdGg6IHN0cmluZywgd2l0aEJhc2VVUkw6IHN0cmluZykgPT4ge1xuICBjb25zdCBiYXNlVVJMID0gY3JlYXRlQmFzZVVSTCh3aXRoQmFzZVVSTCk7XG4gIHJldHVybiBiYXNlVVJMKHBhdGgucmVwbGFjZSgvXFxbaW5kZXguKGh0bWw/fHJzY3xIVE1MPyldJC8sIFwiXCIpKTtcbn07XG5cbi8qKlxuICogIyBjcmVhdGVQYWdlVVJMXG4gKlxuICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGJhc2VVUkwsIHB1YmxpYyBvcmlnaW4gYW5kIGEgb3B0aW9uYWwgbm9ybWFsaXplciBmdW5jdGlvbiB0aGF0IG1pcnJvcnMgdGhlIGJhc2VVUkwncyBmb3JtYXQuXG4gKiBJZiBiYXNlVVJMIGVuZHMgd2l0aCBhIHNsYXNoLCB3ZSBjb250aW51ZSBpdCB1c2luZyB0aGUgVVJMIGl0c2VsZiAobXVzdCBlbmQgd2l0aCBhIHNsYXNoKVxuICpcbiAqIC0gYGluZGV4UlNDYDogVGhlIHBhdGggdG8gdGhlIGluZGV4LnJzYyBmaWxlXG4gKiAtIGBtb2R1bGVCYXNlVVJMYDogVGhlIGJhc2VVUkwgdG8gdXNlIGZvciB0aGUgbW9kdWxlXG4gKlxuICogVGhlc2UgY2FuIGJlIHBhc3NlZCBpbiBkaXJlY3RseSB0byB0aGUgY3JlYXRlUmVhY3RGZXRjaGVyIGFuZCBhbHNvIGRldGVybWluZSB0aGUgZGVmYXVsdHMgd2hlbiBubyBpbnB1dCBhcmUgcHJvdmlkZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVGcm9tRmV0Y2ggfSBmcm9tIFwicmVhY3Qtc2VydmVyLWRvbS1lc20vY2xpZW50LmJyb3dzZXJcIjtcbiAqIGNvbnN0IHBhcnNlZFVSTCA9IHBhZ2VVUkwod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lID8/IFwiL1wiKTtcbiAqIGNvbnN0IGRhdGEgPSBjcmVhdGVGcm9tRmV0Y2goXG4gKiAgZmV0Y2gocGFyc2VkVVJMLmluZGV4UlNDLCB7XG4gKiAgICBoZWFkZXJzOiB7XG4gKiAgICAgIEFjY2VwdDogXCJ0ZXh0L3gtY29tcG9uZW50XCIsXG4gKiAgICB9XG4gKiAgfSksXG4gKiAge1xuICogICAgY2FsbFNlcnZlcjogY2FsbFNlcnZlcixcbiAqICAgIG1vZHVsZUJhc2VVUkw6IHBhcnNlZFVSTC5tb2R1bGVCYXNlVVJMLFxuICogIH1cbiAqICk7XG4gKiBgYGBcbiAqXG4gKiBUaGUgbW9kdWxlQmFzZVBhdGggYmVpbmcgc2V0IGF0IHRoZSBjb25maWcgbGV2ZWwgYXMgXCJcIixcbiAqIHRoZW4gd2UgcGFzcyBpdCB0byBjcmVhdGUgYSBzdHJlYW0gYHJlbmRlclRvUGlwZWFibGVTdHJlYW0oZWxlbWVudHMsIG1vZHVsZUJhc2VQYXRoKWAsIGFuZCB3ZSBzZWVcbiAqIGBgYHRleHRcbiAqIDI6SVtcInNyYy9jb21wb25lbnRzL0NsaWNrYWJsZS5jbGllbnQtRHg5ZGlPcXIuanNcIixcIkNsaWVudENsaWNrYWJsZVwiXVxuICogYGBgXG4gKlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlUGFnZVVSTCA9IChcbiAgd2l0aEJhc2VVUkw6IHN0cmluZyxcbiAgd2l0aFB1YmxpY09yaWdpbjogc3RyaW5nLFxuICBpc0RldiA9IGZhbHNlLFxuICBub3JtYWxpemVyID0gIXdpdGhCYXNlVVJMLmVuZHNXaXRoKFwiL1wiKVxuICAgID8gcmVtb3ZlVHJhaWxpbmdTbGFzaFxuICAgIDogYWRkVHJhaWxpbmdTbGFzaFxuKSA9PiB7XG4gIHJldHVybiAodG86IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyA9IFwiaW5kZXgucnNjXCIpID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5zdXJlIHdpdGhCYXNlVVJMIGlzIGEgc3RyaW5nXG4gICAgICBjb25zdCBiYXNlVVJMU3RyaW5nID0gdHlwZW9mIHdpdGhCYXNlVVJMID09PSAnc3RyaW5nJyA/IHdpdGhCYXNlVVJMIDogU3RyaW5nKHdpdGhCYXNlVVJMIHx8ICcvJyk7XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSB0aGUgYmFzZSBVUkwgZmlyc3RcbiAgICAgIGNvbnN0IGZvbGRlck5hbWUgPSBhZGRUcmFpbGluZ1NsYXNoKFxuICAgICAgICB0by5yZXBsYWNlKC9cXFtpbmRleC4oaHRtbD98cnNjfEhUTUw/KV0kLywgXCJcIilcbiAgICAgICk7XG4gICAgICBjb25zdCBiYXNlVVJMID0gY3JlYXRlQmFzZVVSTChiYXNlVVJMU3RyaW5nKTtcbiAgICAgIGNvbnN0IHJzY1BhdGggPSBiYXNlVVJMKGZvbGRlck5hbWUpICsgZmlsZU5hbWU7XG4gICAgICAvLyBDcmVhdGUgbW9kdWxlQmFzZVVSTCBhbmQgbm9ybWFsaXplIGl0IHRvIG1hdGNoIGlucHV0IGZvcm1hdFxuICAgICAgY29uc3QgbW9kdWxlQmFzZVVSTCA9IHBhcnNlVVJMKGJhc2VVUkxTdHJpbmcsIHdpdGhQdWJsaWNPcmlnaW4pO1xuICAgICAgaWYgKG1vZHVsZUJhc2VVUkwudHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgIGlmKGlzRGV2KSBjb25zb2xlLmVycm9yKFwiRXJyb3IgcGFyc2luZyBtb2R1bGVCYXNlVVJMXCIsIG1vZHVsZUJhc2VVUkwuZXJyb3IpO1xuICAgICAgICB0aHJvdyBtb2R1bGVCYXNlVVJMLmVycm9yO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5kZXhSU0MgPSBwYXJzZVVSTChyc2NQYXRoLCB3aXRoUHVibGljT3JpZ2luKTtcbiAgICAgIGlmIChpbmRleFJTQy50eXBlID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgdGhyb3cgaW5kZXhSU0MuZXJyb3I7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbmRleFJTQzogaW5kZXhSU0MudXJsLnRvU3RyaW5nKCksXG4gICAgICAgIG1vZHVsZUJhc2VVUkw6IG5vcm1hbGl6ZXIobW9kdWxlQmFzZVVSTC51cmwudG9TdHJpbmcoKSksXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNEZXYpIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBwYXJzaW5nIHBhZ2VVUkxcIiwgZXJyb3IpO1xuICAgICAgY29uc3Qgc2hvdWxkSm9pbiA9ICF0by5lbmRzV2l0aChcIi9cIikgJiYgIWZpbGVOYW1lLnN0YXJ0c1dpdGgoXCIvXCIpO1xuICAgICAgY29uc3Qgc2hvdWxkU2xpY2UgPSB0by5lbmRzV2l0aChcIi9cIikgJiYgZmlsZU5hbWUuc3RhcnRzV2l0aChcIi9cIik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbmRleFJTQzpcbiAgICAgICAgICB0byArICBcbiAgICAgICAgICAoc2hvdWxkSm9pbiA/IFwiL1wiIDogXCJcIikgK1xuICAgICAgICAgIChzaG91bGRTbGljZSA/IGZpbGVOYW1lLnNsaWNlKDEpIDogZmlsZU5hbWUpLFxuICAgICAgICBtb2R1bGVCYXNlVVJMOiB0eXBlb2Ygd2l0aEJhc2VVUkwgPT09ICdzdHJpbmcnID8gd2l0aEJhc2VVUkwgOiBTdHJpbmcod2l0aEJhc2VVUkwgfHwgJy8nKSxcbiAgICAgIH07XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiAjIG1vZHVsZUJhc2VVUkxcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgYmFzZVVSTCwgcHVibGljIG9yaWdpbiBhbmQgYSBvcHRpb25hbCBub3JtYWxpemVyIGZ1bmN0aW9uIHRoYXQgbWlycm9ycyB0aGUgYmFzZVVSTCdzIGZvcm1hdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IG1vZHVsZUJhc2VVUkwgPSBwYXJzZVVSTChcIi9tbWNcIiwgXCJodHRwczovL2JpZG9vZi5jb21cIilcbiAqIGlmKG1vZHVsZUJhc2VVUkwudHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gKiAgIGNvbnNvbGUuZXJyb3IobW9kdWxlQmFzZVVSTC5lcnJvcilcbiAqIH0gZWxzZSB7XG4gKiAgIGNvbnNvbGUubG9nKG1vZHVsZUJhc2VVUkwudXJsKVxuICogfVxuICogYGBgXG4gKlxuICoqL1xuZXhwb3J0IGNvbnN0IHBhcnNlVVJMID0gKFxuICB1cmw6IHN0cmluZyxcbiAgYmFzZTogc3RyaW5nXG4pOlxuICB8IHsgdHlwZTogXCJzdWNjZXNzXCI7IHVybDogVVJMOyBlcnJvcj86IG5ldmVyOyBiYXNlPzogbmV2ZXIgfVxuICB8IHsgdHlwZTogXCJlcnJvclwiOyB1cmw6IHN0cmluZzsgYmFzZTogc3RyaW5nOyBlcnJvcjogRXJyb3IgfSA9PiB7XG4gIHRyeSB7XG4gICAgLy8gSWYgYmFzZSBpcyBlbXB0eSBvciBub3QgYSB2YWxpZCBhYnNvbHV0ZSBVUkwsIHVzZSB3aW5kb3cubG9jYXRpb24ub3JpZ2luIGFzIGZhbGxiYWNrIChicm93c2VyIG9ubHkpXG4gICAgbGV0IGVmZmVjdGl2ZUJhc2UgPSBiYXNlO1xuICAgIGlmICghZWZmZWN0aXZlQmFzZSB8fCBlZmZlY3RpdmVCYXNlID09PSBcIi9cIiB8fCAhaXNBYnNvbHV0ZVVSTChlZmZlY3RpdmVCYXNlKSkge1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LmxvY2F0aW9uKSB7XG4gICAgICAgIGVmZmVjdGl2ZUJhc2UgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuICAgICAgfSBlbHNlIGlmICghZWZmZWN0aXZlQmFzZSkge1xuICAgICAgICBlZmZlY3RpdmVCYXNlID0gXCJodHRwOi8vbG9jYWxob3N0XCI7IC8vIEZhbGxiYWNrIGZvciBub24tYnJvd3NlciBlbnZpcm9ubWVudHNcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gSWYgdXJsIGlzIGFscmVhZHkgYWJzb2x1dGUsIHVzZSBpdCBkaXJlY3RseVxuICAgIGlmIChpc0Fic29sdXRlVVJMKHVybCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwic3VjY2Vzc1wiLFxuICAgICAgICB1cmw6IG5ldyBVUkwodXJsKSxcbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcInN1Y2Nlc3NcIixcbiAgICAgIHVybDogbmV3IFVSTCh1cmwsIGVmZmVjdGl2ZUJhc2UpLFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJlcnJvclwiLCB1cmw6IHVybCwgYmFzZTogYmFzZSwgZXJyb3I6IGVycm9yIGFzIEVycm9yIH07XG4gIH1cbn07Il0sIm5hbWVzIjpbImZvbGRlck5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7O0FBb0JhLE1BQUEsaUJBQUEsR0FBb0IsQ0FDL0IsV0FBQSxFQUNBLGdCQUNHLEtBQUE7QUFDSCxFQUFNLE1BQUEsT0FBQSxHQUFVLGNBQWMsV0FBVyxDQUFBO0FBQ3pDLEVBQUksSUFBQSxnQkFBQSxL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