vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
235 lines (232 loc) • 31.9 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { access } from 'node:fs/promises';
import { join } from 'node:path';
import { resolveUrlOption } from '../resolveUrlOption.js';
let stashedBuildPages = null;
let stashedPages = null;
function resolvePathWithManifest(path, manifest) {
const manifestEntry = manifest[path];
if (manifestEntry && manifestEntry.file) {
return manifestEntry.file;
}
return path;
}
async function resolveBuildPages({
pages,
userOptions,
logger,
manifest = {}
}) {
if (userOptions.verbose) {
logger.info(
`[resolveBuildPages] resolveBuildPages called with pages:${pages.length} and Root: ${typeof userOptions.Root} Html: ${typeof userOptions.Html}`
);
}
const pagesChanged = !stashedPages || stashedPages.length !== pages.length || !stashedPages.every((page, i) => page === pages[i]);
if (stashedBuildPages && !pagesChanged) {
return stashedBuildPages;
} else if (userOptions.verbose) {
if (stashedPages == null) {
logger.info(
`[resolveBuildPages] resolveBuildPages - first time resolving pages`
);
} else {
logger.info(
`[resolveBuildPages] resolveBuildPages - pages changed, re-resolving`
);
}
}
const errors = [];
const pageMap = /* @__PURE__ */ new Map();
const propsMap = /* @__PURE__ */ new Map();
const rootMap = /* @__PURE__ */ new Map();
const htmlMap = /* @__PURE__ */ new Map();
const urlMap = /* @__PURE__ */ new Map();
const routeMap = /* @__PURE__ */ new Map();
for (const page of pages) {
const pageResult = await resolveUrlOption(userOptions, "Page", page);
if (pageResult.type === "error") {
errors.push(pageResult.error);
continue;
}
const [pageKey, pageValue] = userOptions.normalizer(pageResult.Page);
const manifestResolvedPageValue = resolvePathWithManifest(pageValue, manifest);
let rootValue;
if (userOptions.Root) {
if (userOptions.verbose) {
logger.info(
`[resolveBuildPages] resolveBuildPages - resolving Root for page: ${page}, Root option: ${userOptions.Root}`
);
}
const rootResult = await resolveUrlOption(userOptions, "Root", page);
if (rootResult.type === "error") {
if (userOptions.verbose) {
logger.info(
`[resolveBuildPages] resolveBuildPages - Root resolution failed with error message: "${rootResult.error?.message}"`
);
}
errors.push(rootResult.error);
} else {
const [rootKey, resolvedRootValue] = userOptions.normalizer(
rootResult.Root
);
const manifestResolvedRootValue = resolvePathWithManifest(resolvedRootValue, manifest);
if (userOptions.verbose) {
logger.info(
`[resolveBuildPages] resolveBuildPages - Root resolved: ${rootResult.Root} -> ${resolvedRootValue} -> ${manifestResolvedRootValue}`
);
}
rootValue = manifestResolvedRootValue;
rootMap.set(rootKey, manifestResolvedRootValue);
}
}
let htmlValue;
if (userOptions.Html) {
if (userOptions.verbose) {
logger.info(
`[resolveBuildPages] resolveBuildPages - resolving Html for page: ${page}, Html option: ${userOptions.Html}`
);
}
const htmlResult = await resolveUrlOption(userOptions, "Html", page);
if (htmlResult.type === "error") {
if (userOptions.verbose) {
logger.info(
`[resolveBuildPages] resolveBuildPages - Html resolution failed with error message: "${htmlResult.error?.message}"`
);
}
errors.push(htmlResult.error);
} else {
const [htmlKey, resolvedHtmlValue] = userOptions.normalizer(
htmlResult.Html
);
const manifestResolvedHtmlValue = resolvePathWithManifest(resolvedHtmlValue, manifest);
if (userOptions.verbose) {
logger.info(
`[resolveBuildPages] resolveBuildPages - Html resolved: ${htmlResult.Html} -> ${resolvedHtmlValue} -> ${manifestResolvedHtmlValue}`
);
}
htmlValue = manifestResolvedHtmlValue;
htmlMap.set(htmlKey, manifestResolvedHtmlValue);
}
}
if (!userOptions.props) {
urlMap.set(page, {
props: void 0,
page: manifestResolvedPageValue,
root: rootValue,
html: htmlValue
});
pageMap.set(pageKey, manifestResolvedPageValue);
const routes = routeMap.get(manifestResolvedPageValue) || [];
routes.push(page);
routeMap.set(manifestResolvedPageValue, routes);
continue;
}
try {
await access(join(userOptions.projectRoot, manifestResolvedPageValue));
} catch {
errors.push(new Error(`Page file not found: ${manifestResolvedPageValue}`));
}
const propsResult = await resolveUrlOption(userOptions, "props", page);
if (propsResult.type === "error") {
errors.push(propsResult.error);
continue;
}
if (propsResult.props) {
const [propsKey, propsValue] = userOptions.normalizer(propsResult.props);
const manifestResolvedPropsValue = resolvePathWithManifest(propsValue, manifest);
if (manifestResolvedPropsValue !== manifestResolvedPageValue) {
try {
await access(join(userOptions.projectRoot, manifestResolvedPropsValue));
} catch {
errors.push(new Error(`Props file not found: ${manifestResolvedPropsValue}`));
}
}
urlMap.set(page, {
props: manifestResolvedPropsValue,
page: manifestResolvedPageValue,
root: rootValue,
html: htmlValue
});
propsMap.set(propsKey, manifestResolvedPropsValue);
const pageRoutes = routeMap.get(manifestResolvedPageValue) || [];
pageRoutes.push(page);
routeMap.set(manifestResolvedPageValue, pageRoutes);
const propsRoutes = routeMap.get(manifestResolvedPropsValue) || [];
propsRoutes.push(page);
routeMap.set(manifestResolvedPropsValue, propsRoutes);
} else {
urlMap.set(page, {
props: void 0,
page: manifestResolvedPageValue,
root: rootValue,
html: htmlValue
});
const routes = routeMap.get(manifestResolvedPageValue) || [];
routes.push(page);
routeMap.set(manifestResolvedPageValue, routes);
}
pageMap.set(pageKey, manifestResolvedPageValue);
}
if (pages.length === 0 && (userOptions.Root || userOptions.Html)) {
if (userOptions.verbose) {
logger.info(
`[resolveBuildPages] resolveBuildPages - No pages but custom components defined, resolving for default route`
);
}
const defaultPage = "/";
if (userOptions.Root) {
const rootResult = await resolveUrlOption(
userOptions,
"Root",
defaultPage
);
if (rootResult.type === "success") {
const [rootKey, resolvedRootValue] = userOptions.normalizer(
rootResult.Root
);
if (userOptions.verbose) {
logger.info(
`[resolveBuildPages] resolveBuildPages - Default Root resolved: ${rootResult.Root} -> ${resolvedRootValue}`
);
}
rootMap.set(rootKey, resolvedRootValue);
}
}
if (userOptions.Html) {
const htmlResult = await resolveUrlOption(
userOptions,
"Html",
defaultPage
);
if (htmlResult.type === "success") {
const [htmlKey, resolvedHtmlValue] = userOptions.normalizer(
htmlResult.Html
);
if (userOptions.verbose) {
logger.info(
`[resolveBuildPages] resolveBuildPages - Default Html resolved: ${htmlResult.Html} -> ${resolvedHtmlValue}`
);
}
htmlMap.set(htmlKey, resolvedHtmlValue);
}
}
}
stashedBuildPages = {
pageMap,
propsMap,
rootMap,
htmlMap,
urlMap,
routeMap,
errors
};
stashedPages = [...pages];
return stashedBuildPages;
}
export { resolveBuildPages };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZUJ1aWxkUGFnZXMuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BsdWdpbi9jb25maWcvYXV0b0Rpc2NvdmVyL3Jlc29sdmVCdWlsZFBhZ2VzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFjY2VzcyB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUge1xuICBQYWdlTmFtZSxcbiAgUHJvcHNOYW1lLFxuICBSZXNvbHZlZEJ1aWxkUGFnZXMsXG4gIFJlc29sdmVkVXNlck9wdGlvbnMsXG59IGZyb20gXCIuLi8uLi90eXBlcy5qc1wiO1xuaW1wb3J0IHsgcmVzb2x2ZVVybE9wdGlvbiB9IGZyb20gXCIuLi9yZXNvbHZlVXJsT3B0aW9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCJ2aXRlXCI7XG5pbXBvcnQgdHlwZSB7IE1hbmlmZXN0IH0gZnJvbSBcInZpdGVcIjtcblxubGV0IHN0YXNoZWRCdWlsZFBhZ2VzOiBSZXNvbHZlZEJ1aWxkUGFnZXMgfCBudWxsID0gbnVsbDtcbmxldCBzdGFzaGVkUGFnZXM6IHN0cmluZ1tdIHwgbnVsbCA9IG51bGw7XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byByZXNvbHZlIHBhdGhzIHVzaW5nIG1hbmlmZXN0XG5mdW5jdGlvbiByZXNvbHZlUGF0aFdpdGhNYW5pZmVzdChwYXRoOiBzdHJpbmcsIG1hbmlmZXN0OiBNYW5pZmVzdCk6IHN0cmluZyB7XG4gIC8vIENoZWNrIGlmIHRoZSBwYXRoIGV4aXN0cyBpbiB0aGUgbWFuaWZlc3RcbiAgY29uc3QgbWFuaWZlc3RFbnRyeSA9IG1hbmlmZXN0W3BhdGhdO1xuICBpZiAobWFuaWZlc3RFbnRyeSAmJiBtYW5pZmVzdEVudHJ5LmZpbGUpIHtcbiAgICAvLyBSZXR1cm4gdGhlIGNvbXBpbGVkIGZpbGUgcGF0aFxuICAgIHJldHVybiBtYW5pZmVzdEVudHJ5LmZpbGU7XG4gIH1cbiAgXG4gIC8vIElmIG5vdCBmb3VuZCBpbiBtYW5pZmVzdCwgcmV0dXJuIHRoZSBvcmlnaW5hbCBwYXRoXG4gIHJldHVybiBwYXRoO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGJ1aWxkIHBhZ2VzIGJ5IGNhbGxpbmcgcmVzb2x2ZVVybE9wdGlvbiBmb3IgZWFjaCBwYWdlIGluIGJ1aWxkLnBhZ2VzLlxuICpcbiAqICMjIEJVSUxELVRJTUUgU1RBVElDIERJU0NPVkVSWVxuICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIGJ1aWxkL3N0YXJ0dXAgdG86XG4gKiAxLiBUYWtlIHRoZSBleHBsaWNpdCBgYnVpbGQucGFnZXNgIGFycmF5IChlLmcuLCBbXCIvXCIsIFwiL2Fib3V0XCIsIFwiL3Byb2R1Y3RzXCJdKVxuICogMi4gQ2FsbCBgcmVzb2x2ZVVybE9wdGlvbmAgZm9yIGVhY2ggcGFnZSB0byBnZXQgZmlsZSBwYXRoc1xuICogMy4gQnVpbGQgc3RhdGljIG1hcHMgKHVybE1hcCwgcGFnZU1hcCwgcHJvcHNNYXAsIHJvdXRlTWFwKSBmb3IgZmFzdCBydW50aW1lIGxvb2t1cFxuICogNC4gVmFsaWRhdGUgdGhhdCByZXNvbHZlZCBmaWxlIHBhdGhzIGFjdHVhbGx5IGV4aXN0IG9uIGZpbGVzeXN0ZW1cbiAqXG4gKiAjIyBDYWNoZSBTdHJhdGVneTpcbiAqIFJlc3VsdHMgYXJlIGNhY2hlZCAoc3Rhc2hlZEJ1aWxkUGFnZXMpIHRvIGF2b2lkIHJlLXJlc29sdmluZyBvbiBldmVyeSBidWlsZC5cbiAqIENhY2hlIGlzIGludmFsaWRhdGVkIG9ubHkgd2hlbiB0aGUgcGFnZXMgYXJyYXkgY2hhbmdlcy5cbiAqXG4gKiAjIyBVc2FnZSBGbG93OlxuICogLSBDYWxsZWQgYnkgYnVpbGQgcHJvY2VzcyBhbmQgcGx1Z2luIGluaXRpYWxpemF0aW9uXG4gKiAtIEZlZWRzIGludG8gYXV0by1kaXNjb3Zlcnkgc3lzdGVtIHRvIHBvcHVsYXRlIHVybE1hcCBjYWNoZVxuICogLSBFbmFibGVzIGZhc3QgcnVudGltZSBsb29rdXAgaW4gZ2V0Um91dGVGaWxlcy50cyB3aXRob3V0IGR5bmFtaWMgcmVzb2x1dGlvblxuICpcbiAqICMjIExpbWl0YXRpb246XG4gKiBPbmx5IHdvcmtzIHdoZW4gYnVpbGQucGFnZXMgaXMgZXhwbGljaXRseSBwcm92aWRlZC4gV2l0aG91dCBpdCwgdGhlIHN5c3RlbVxuICogZmFsbHMgYmFjayB0byBmaWxlc3lzdGVtIHNjYW5uaW5nICsgZHluYW1pYyByZXNvbHV0aW9uIGluIGdldFJvdXRlRmlsZXMudHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlQnVpbGRQYWdlcyh7XG4gIHBhZ2VzLFxuICB1c2VyT3B0aW9ucyxcbiAgbG9nZ2VyLFxuICBtYW5pZmVzdCA9IHt9LFxufToge1xuICBwYWdlczogc3RyaW5nW107XG4gIHVzZXJPcHRpb25zOiBQaWNrPFxuICAgIFJlc29sdmVkVXNlck9wdGlvbnMsXG4gICAgfCBQYWdlTmFtZVxuICAgIHwgUHJvcHNOYW1lXG4gICAgfCBcIlJvb3RcIlxuICAgIHwgXCJIdG1sXCJcbiAgICB8IFwiYnVpbGRcIlxuICAgIHwgXCJtb2R1bGVCYXNlXCJcbiAgICB8IFwicHJvamVjdFJvb3RcIlxuICAgIHwgXCJub3JtYWxpemVyXCJcbiAgICB8IFwibW9kdWxlQmFzZVBhdGhcIlxuICAgIHwgXCJwYWdlRXhwb3J0TmFtZVwiXG4gICAgfCBcInByb3BzRXhwb3J0TmFtZVwiXG4gICAgfCBcInJvb3RFeHBvcnROYW1lXCJcbiAgICB8IFwiaHRtbEV4cG9ydE5hbWVcIlxuICAgIHwgXCJ2ZXJib3NlXCJcbiAgPjtcbiAgbG9nZ2VyOiBMb2dnZXI7XG4gIG1hbmlmZXN0PzogTWFuaWZlc3Q7XG59KTogUHJvbWlzZTxSZXNvbHZlZEJ1aWxkUGFnZXM+IHtcbiAgaWYgKHVzZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBbcmVzb2x2ZUJ1aWxkUGFnZXNdIHJlc29sdmVCdWlsZFBhZ2VzIGNhbGxlZCB3aXRoIHBhZ2VzOiR7XG4gICAgICAgIHBhZ2VzLmxlbmd0aFxuICAgICAgfSBhbmQgUm9vdDogJHt0eXBlb2YgdXNlck9wdGlvbnMuUm9vdH0gSHRtbDogJHt0eXBlb2YgdXNlck9wdGlvbnMuSHRtbH1gXG4gICAgKTtcbiAgfVxuICAvLyBDaGVjayBpZiBwYWdlcyBhcnJheSBoYXMgY2hhbmdlZFxuICBjb25zdCBwYWdlc0NoYW5nZWQgPVxuICAgICFzdGFzaGVkUGFnZXMgfHxcbiAgICBzdGFzaGVkUGFnZXMubGVuZ3RoICE9PSBwYWdlcy5sZW5ndGggfHxcbiAgICAhc3Rhc2hlZFBhZ2VzLmV2ZXJ5KChwYWdlLCBpKSA9PiBwYWdlID09PSBwYWdlc1tpXSk7XG5cbiAgaWYgKHN0YXNoZWRCdWlsZFBhZ2VzICYmICFwYWdlc0NoYW5nZWQpIHtcbiAgICByZXR1cm4gc3Rhc2hlZEJ1aWxkUGFnZXM7IC8vIFJldHVybiBkaXJlY3RseSB3aXRob3V0IFByb21pc2UucmVzb2x2ZVxuICB9IGVsc2UgaWYgKHVzZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICBpZiAoc3Rhc2hlZFBhZ2VzID09IG51bGwpIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgW3Jlc29sdmVCdWlsZFBhZ2VzXSByZXNvbHZlQnVpbGRQYWdlcyAtIGZpcnN0IHRpbWUgcmVzb2x2aW5nIHBhZ2VzYFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBbcmVzb2x2ZUJ1aWxkUGFnZXNdIHJlc29sdmVCdWlsZFBhZ2VzIC0gcGFnZXMgY2hhbmdlZCwgcmUtcmVzb2x2aW5nYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZXJyb3JzOiB1bmtub3duW10gPSBbXTtcbiAgY29uc3QgcGFnZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGNvbnN0IHByb3BzTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgY29uc3Qgcm9vdE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGNvbnN0IGh0bWxNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBjb25zdCB1cmxNYXAgPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICB7IHByb3BzOiBzdHJpbmcgfCB1bmRlZmluZWQ7IHBhZ2U6IHN0cmluZzsgcm9vdD86IHN0cmluZzsgaHRtbD86IHN0cmluZyB9XG4gID4oKTtcbiAgY29uc3Qgcm91dGVNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cbiAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSB7XG4gICAgY29uc3QgcGFnZVJlc3VsdCA9IGF3YWl0IHJlc29sdmVVcmxPcHRpb24odXNlck9wdGlvbnMsIFwiUGFnZVwiLCBwYWdlKTtcbiAgICBpZiAocGFnZVJlc3VsdC50eXBlID09PSBcImVycm9yXCIpIHtcbiAgICAgIGVycm9ycy5wdXNoKHBhZ2VSZXN1bHQuZXJyb3IpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IFtwYWdlS2V5LCBwYWdlVmFsdWVdID0gdXNlck9wdGlvbnMubm9ybWFsaXplcihwYWdlUmVzdWx0LlBhZ2UpO1xuICAgIGNvbnN0IG1hbmlmZXN0UmVzb2x2ZWRQYWdlVmFsdWUgPSByZXNvbHZlUGF0aFdpdGhNYW5pZmVzdChwYWdlVmFsdWUsIG1hbmlmZXN0KTtcblxuICAgIC8vIFJlc29sdmUgUm9vdCBjb21wb25lbnQgcGF0aCBpZiBkZWZpbmVkXG4gICAgbGV0IHJvb3RWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICh1c2VyT3B0aW9ucy5Sb290KSB7XG4gICAgICBpZiAodXNlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgW3Jlc29sdmVCdWlsZFBhZ2VzXSByZXNvbHZlQnVpbGRQYWdlcyAtIHJlc29sdmluZyBSb290IGZvciBwYWdlOiAke3BhZ2V9LCBSb290IG9wdGlvbjogJHt1c2VyT3B0aW9ucy5Sb290fWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJvb3RSZXN1bHQgPSBhd2FpdCByZXNvbHZlVXJsT3B0aW9uKHVzZXJPcHRpb25zLCBcIlJvb3RcIiwgcGFnZSk7XG4gICAgICBpZiAocm9vdFJlc3VsdC50eXBlID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgaWYgKHVzZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgIGBbcmVzb2x2ZUJ1aWxkUGFnZXNdIHJlc29sdmVCdWlsZFBhZ2VzIC0gUm9vdCByZXNvbHV0aW9uIGZhaWxlZCB3aXRoIGVycm9yIG1lc3NhZ2U6IFxcXCIke1xuICAgICAgICAgICAgICAocm9vdFJlc3VsdC5lcnJvciBhcyBFcnJvcik/Lm1lc3NhZ2VcbiAgICAgICAgICAgIH1cXFwiYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZXJyb3JzLnB1c2gocm9vdFJlc3VsdC5lcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBbcm9vdEtleSwgcmVzb2x2ZWRSb290VmFsdWVdID0gdXNlck9wdGlvbnMubm9ybWFsaXplcihcbiAgICAgICAgICByb290UmVzdWx0LlJvb3RcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbWFuaWZlc3RSZXNvbHZlZFJvb3RWYWx1ZSA9IHJlc29sdmVQYXRoV2l0aE1hbmlmZXN0KHJlc29sdmVkUm9vdFZhbHVlLCBtYW5pZmVzdCk7XG4gICAgICAgIGlmICh1c2VyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICBgW3Jlc29sdmVCdWlsZFBhZ2VzXSByZXNvbHZlQnVpbGRQYWdlcyAtIFJvb3QgcmVzb2x2ZWQ6ICR7cm9vdFJlc3VsdC5Sb290fSAtPiAke3Jlc29sdmVkUm9vdFZhbHVlfSAtPiAke21hbmlmZXN0UmVzb2x2ZWRSb290VmFsdWV9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdFZhbHVlID0gbWFuaWZlc3RSZXNvbHZlZFJvb3RWYWx1ZTtcbiAgICAgICAgcm9vdE1hcC5zZXQocm9vdEtleSwgbWFuaWZlc3RSZXNvbHZlZFJvb3RWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzb2x2ZSBIdG1sIGNvbXBvbmVudCBwYXRoIGlmIGRlZmluZWRcbiAgICBsZXQgaHRtbFZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHVzZXJPcHRpb25zLkh0bWwpIHtcbiAgICAgIGlmICh1c2VyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBbcmVzb2x2ZUJ1aWxkUGFnZXNdIHJlc29sdmVCdWlsZFBhZ2VzIC0gcmVzb2x2aW5nIEh0bWwgZm9yIHBhZ2U6ICR7cGFnZX0sIEh0bWwgb3B0aW9uOiAke3VzZXJPcHRpb25zLkh0bWx9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgaHRtbFJlc3VsdCA9IGF3YWl0IHJlc29sdmVVcmxPcHRpb24odXNlck9wdGlvbnMsIFwiSHRtbFwiLCBwYWdlKTtcbiAgICAgIGlmIChodG1sUmVzdWx0LnR5cGUgPT09IFwiZXJyb3JcIikge1xuICAgICAgICBpZiAodXNlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgYFtyZXNvbHZlQnVpbGRQYWdlc10gcmVzb2x2ZUJ1aWxkUGFnZXMgLSBIdG1sIHJlc29sdXRpb24gZmFpbGVkIHdpdGggZXJyb3IgbWVzc2FnZTogXFxcIiR7XG4gICAgICAgICAgICAgIChodG1sUmVzdWx0LmVycm9yIGFzIEVycm9yKT8ubWVzc2FnZVxuICAgICAgICAgICAgfVxcXCJgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBlcnJvcnMucHVzaChodG1sUmVzdWx0LmVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IFtodG1sS2V5LCByZXNvbHZlZEh0bWxWYWx1ZV0gPSB1c2VyT3B0aW9ucy5ub3JtYWxpemVyKFxuICAgICAgICAgIGh0bWxSZXN1bHQuSHRtbFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBtYW5pZmVzdFJlc29sdmVkSHRtbFZhbHVlID0gcmVzb2x2ZVBhdGhXaXRoTWFuaWZlc3QocmVzb2x2ZWRIdG1sVmFsdWUsIG1hbmlmZXN0KTtcbiAgICAgICAgaWYgKHVzZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgIGBbcmVzb2x2ZUJ1aWxkUGFnZXNdIHJlc29sdmVCdWlsZFBhZ2VzIC0gSHRtbCByZXNvbHZlZDogJHtodG1sUmVzdWx0Lkh0bWx9IC0+ICR7cmVzb2x2ZWRIdG1sVmFsdWV9IC0+ICR7bWFuaWZlc3RSZXNvbHZlZEh0bWxWYWx1ZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBodG1sVmFsdWUgPSBtYW5pZmVzdFJlc29sdmVkSHRtbFZhbHVlO1xuICAgICAgICBodG1sTWFwLnNldChodG1sS2V5LCBtYW5pZmVzdFJlc29sdmVkSHRtbFZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXVzZXJPcHRpb25zLnByb3BzKSB7XG4gICAgICB1cmxNYXAuc2V0KHBhZ2UsIHtcbiAgICAgICAgcHJvcHM6IHVuZGVmaW5lZCxcbiAgICAgICAgcGFnZTogbWFuaWZlc3RSZXNvbHZlZFBhZ2VWYWx1ZSxcbiAgICAgICAgcm9vdDogcm9vdFZhbHVlLFxuICAgICAgICBodG1sOiBodG1sVmFsdWUsXG4gICAgICB9KTtcbiAgICAgIHBhZ2VNYXAuc2V0KHBhZ2VLZXksIG1hbmlmZXN0UmVzb2x2ZWRQYWdlVmFsdWUpO1xuICAgICAgLy8gQWRkIHRvIHJvdXRlTWFwXG4gICAgICBjb25zdCByb3V0ZXMgPSByb3V0ZU1hcC5nZXQobWFuaWZlc3RSZXNvbHZlZFBhZ2VWYWx1ZSkgfHwgW107XG4gICAgICByb3V0ZXMucHVzaChwYWdlKTtcbiAgICAgIHJvdXRlTWFwLnNldChtYW5pZmVzdFJlc29sdmVkUGFnZVZhbHVlLCByb3V0ZXMpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhY2Nlc3Moam9pbih1c2VyT3B0aW9ucy5wcm9qZWN0Um9vdCwgbWFuaWZlc3RSZXNvbHZlZFBhZ2VWYWx1ZSkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgZXJyb3JzLnB1c2gobmV3IEVycm9yKGBQYWdlIGZpbGUgbm90IGZvdW5kOiAke21hbmlmZXN0UmVzb2x2ZWRQYWdlVmFsdWV9YCkpO1xuICAgIH1cbiAgICBjb25zdCBwcm9wc1Jlc3VsdCA9IGF3YWl0IHJlc29sdmVVcmxPcHRpb24odXNlck9wdGlvbnMsIFwicHJvcHNcIiwgcGFnZSk7XG4gICAgaWYgKHByb3BzUmVzdWx0LnR5cGUgPT09IFwiZXJyb3JcIikge1xuICAgICAgZXJyb3JzLnB1c2gocHJvcHNSZXN1bHQuZXJyb3IpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gSWYgcHJvcHNQYXRoIGlzIGRlZmluZWQsIGNoZWNrIGlmIGl0IGV4aXN0c1xuICAgIGlmIChwcm9wc1Jlc3VsdC5wcm9wcykge1xuICAgICAgY29uc3QgW3Byb3BzS2V5LCBwcm9wc1ZhbHVlXSA9IHVzZXJPcHRpb25zLm5vcm1hbGl6ZXIocHJvcHNSZXN1bHQucHJvcHMpO1xuICAgICAgY29uc3QgbWFuaWZlc3RSZXNvbHZlZFByb3BzVmFsdWUgPSByZXNvbHZlUGF0aFdpdGhNYW5pZmVzdChwcm9wc1ZhbHVlLCBtYW5pZmVzdCk7XG4gICAgICBpZiAobWFuaWZlc3RSZXNvbHZlZFByb3BzVmFsdWUgIT09IG1hbmlmZXN0UmVzb2x2ZWRQYWdlVmFsdWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBhY2Nlc3Moam9pbih1c2VyT3B0aW9ucy5wcm9qZWN0Um9vdCwgbWFuaWZlc3RSZXNvbHZlZFByb3BzVmFsdWUpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgZXJyb3JzLnB1c2gobmV3IEVycm9yKGBQcm9wcyBmaWxlIG5vdCBmb3VuZDogJHttYW5pZmVzdFJlc29sdmVkUHJvcHNWYWx1ZX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHVybE1hcC5zZXQocGFnZSwge1xuICAgICAgICBwcm9wczogbWFuaWZlc3RSZXNvbHZlZFByb3BzVmFsdWUsXG4gICAgICAgIHBhZ2U6IG1hbmlmZXN0UmVzb2x2ZWRQYWdlVmFsdWUsXG4gICAgICAgIHJvb3Q6IHJvb3RWYWx1ZSxcbiAgICAgICAgaHRtbDogaHRtbFZhbHVlLFxuICAgICAgfSk7XG4gICAgICBwcm9wc01hcC5zZXQocHJvcHNLZXksIG1hbmlmZXN0UmVzb2x2ZWRQcm9wc1ZhbHVlKTtcblxuICAgICAgLy8gQWRkIHRvIHJvdXRlTWFwIGZvciBib3RoIHBhZ2UgYW5kIHByb3BzIGZpbGVzXG4gICAgICBjb25zdCBwYWdlUm91dGVzID0gcm91dGVNYXAuZ2V0KG1hbmlmZXN0UmVzb2x2ZWRQYWdlVmFsdWUpIHx8IFtdO1xuICAgICAgcGFnZVJvdXRlcy5wdXNoKHBhZ2UpO1xuICAgICAgcm91dGVNYXAuc2V0KG1hbmlmZXN0UmVzb2x2ZWRQYWdlVmFsdWUsIHBhZ2VSb3V0ZXMpO1xuXG4gICAgICBjb25zdCBwcm9wc1JvdXRlcyA9IHJvdXRlTWFwLmdldChtYW5pZmVzdFJlc29sdmVkUHJvcHNWYWx1ZSkgfHwgW107XG4gICAgICBwcm9wc1JvdXRlcy5wdXNoKHBhZ2UpO1xuICAgICAgcm91dGVNYXAuc2V0KG1hbmlmZXN0UmVzb2x2ZWRQcm9wc1ZhbHVlLCBwcm9wc1JvdXRlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIG5vIHByb3BzIHBhdGgsIHVzZSB0aGUgcGFnZSBwYXRoIGZvciBib3RoXG4gICAgICB1cmxNYXAuc2V0KHBhZ2UsIHtcbiAgICAgICAgcHJvcHM6IHVuZGVmaW5lZCxcbiAgICAgICAgcGFnZTogbWFuaWZlc3RSZXNvbHZlZFBhZ2VWYWx1ZSxcbiAgICAgICAgcm9vdDogcm9vdFZhbHVlLFxuICAgICAgICBodG1sOiBodG1sVmFsdWUsXG4gICAgICB9KTtcblxuICAgICAgLy8gQWRkIHRvIHJvdXRlTWFwIGZvciBwYWdlIGZpbGUgb25seVxuICAgICAgY29uc3Qgcm91dGVzID0gcm91dGVNYXAuZ2V0KG1hbmlmZXN0UmVzb2x2ZWRQYWdlVmFsdWUpIHx8IFtdO1xuICAgICAgcm91dGVzLnB1c2gocGFnZSk7XG4gICAgICByb3V0ZU1hcC5zZXQobWFuaWZlc3RSZXNvbHZlZFBhZ2VWYWx1ZSwgcm91dGVzKTtcbiAgICB9XG5cbiAgICBwYWdlTWFwLnNldChwYWdlS2V5LCBtYW5pZmVzdFJlc29sdmVkUGFnZVZhbHVlKTtcbiAgfVxuXG4gIC8vIElmIHRoZXJlIGFyZSBubyBwYWdlcyBidXQgY3VzdG9tIGNvbXBvbmVudHMgYXJlIGRlZmluZWQsIHJlc29sdmUgdGhlbSBmb3IgYSBkZWZhdWx0IHJvdXRlXG4gIGlmIChwYWdlcy5sZW5ndGggPT09IDAgJiYgKHVzZXJPcHRpb25zLlJvb3QgfHwgdXNlck9wdGlvbnMuSHRtbCkpIHtcbiAgICBpZiAodXNlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBbcmVzb2x2ZUJ1aWxkUGFnZXNdIHJlc29sdmVCdWlsZFBhZ2VzIC0gTm8gcGFnZXMgYnV0IGN1c3RvbSBjb21wb25lbnRzIGRlZmluZWQsIHJlc29sdmluZyBmb3IgZGVmYXVsdCByb3V0ZWBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGRlZmF1bHRQYWdlID0gXCIvXCI7XG5cbiAgICAvLyBSZXNvbHZlIFJvb3QgY29tcG9uZW50IGZvciBkZWZhdWx0IHJvdXRlXG4gICAgaWYgKHVzZXJPcHRpb25zLlJvb3QpIHtcbiAgICAgIGNvbnN0IHJvb3RSZXN1bHQgPSBhd2FpdCByZXNvbHZlVXJsT3B0aW9uKFxuICAgICAgICB1c2VyT3B0aW9ucyxcbiAgICAgICAgXCJSb290XCIsXG4gICAgICAgIGRlZmF1bHRQYWdlXG4gICAgICApO1xuICAgICAgaWYgKHJvb3RSZXN1bHQudHlwZSA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgY29uc3QgW3Jvb3RLZXksIHJlc29sdmVkUm9vdFZhbHVlXSA9IHVzZXJPcHRpb25zLm5vcm1hbGl6ZXIoXG4gICAgICAgICAgcm9vdFJlc3VsdC5Sb290XG4gICAgICAgICk7XG4gICAgICAgIGlmICh1c2VyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICBgW3Jlc29sdmVCdWlsZFBhZ2VzXSByZXNvbHZlQnVpbGRQYWdlcyAtIERlZmF1bHQgUm9vdCByZXNvbHZlZDogJHtyb290UmVzdWx0LlJvb3R9IC0+ICR7cmVzb2x2ZWRSb290VmFsdWV9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdE1hcC5zZXQocm9vdEtleSwgcmVzb2x2ZWRSb290VmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlc29sdmUgSHRtbCBjb21wb25lbnQgZm9yIGRlZmF1bHQgcm91dGVcbiAgICBpZiAodXNlck9wdGlvbnMuSHRtbCkge1xuICAgICAgY29uc3QgaHRtbFJlc3VsdCA9IGF3YWl0IHJlc29sdmVVcmxPcHRpb24oXG4gICAgICAgIHVzZXJPcHRpb25zLFxuICAgICAgICBcIkh0bWxcIixcbiAgICAgICAgZGVmYXVsdFBhZ2VcbiAgICAgICk7XG4gICAgICBpZiAoaHRtbFJlc3VsdC50eXBlID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICBjb25zdCBbaHRtbEtleSwgcmVzb2x2ZWRIdG1sVmFsdWVdID0gdXNlck9wdGlvbnMubm9ybWFsaXplcihcbiAgICAgICAgICBodG1sUmVzdWx0Lkh0bWxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHVzZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgIGBbcmVzb2x2ZUJ1aWxkUGFnZXNdIHJlc29sdmVCdWlsZFBhZ2VzIC0gRGVmYXVsdCBIdG1sIHJlc29sdmVkOiAke2h0bWxSZXN1bHQuSHRtbH0gLT4gJHtyZXNvbHZlZEh0bWxWYWx1ZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBodG1sTWFwLnNldChodG1sS2V5LCByZXNvbHZlZEh0bWxWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3Rhc2hlZEJ1aWxkUGFnZXMgPSB7XG4gICAgcGFnZU1hcCxcbiAgICBwcm9wc01hcCxcbiAgICByb290TWFwLFxuICAgIGh0bWxNYXAsXG4gICAgdXJsTWFwLFxuICAgIHJvdXRlTWFwLFxuICAgIGVycm9ycyxcbiAgfTtcbiAgc3Rhc2hlZFBhZ2VzID0gWy4uLnBhZ2VzXTtcbiAgcmV0dXJuIHN0YXNoZWRCdWlsZFBhZ2VzO1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVlBLElBQUksaUJBQStDLEdBQUEsSUFBQTtBQUNuRCxJQUFJLFlBQWdDLEdBQUEsSUFBQTtBQUdwQyxTQUFTLHVCQUFBLENBQXdCLE1BQWMsUUFBNEIsRUFBQTtBQUV6RSxFQUFNLE1BQUEsYUFBQSxHQUFnQixTQUFTLElBQUksQ0FBQTtBQUNuQyxFQUFJLElBQUEsYUFBQSxJQUFpQixjQUFjLElBQU0sRUFBQTtBQUV2QyxJQUFBLE9BQU8sYUFBYyxDQUFBLElBQUE7QUFBQTtBQUl2QixFQUFPLE9BQUEsSUFBQTtBQUNUO0FBeUJBLGVBQXNCLGlCQUFrQixDQUFBO0FBQUEsRUFDdEMsS0FBQTtBQUFBLEVBQ0EsV0FBQTtBQUFBLEVBQ0EsTUFBQTtBQUFBLEVBQ0EsV0FBVztBQUNiLENBcUJnQyxFQUFBO0FBQzlCLEVBQUEsSUFBSSxZQUFZLE9BQVMsRUFBQTtBQUN2QixJQUFPLE1BQUEsQ0FBQSxJQUFBO0FBQUEsTUFDTCxDQUFBLHdEQUFBLEVBQ0UsS0FBTSxDQUFBLE1BQ1IsQ0FBYyxXQUFB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