UNPKG

vite-plugin-react-server

Version:
235 lines (232 loc) 31.9 kB
/** * 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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