UNPKG

vite-plugin-react-server

Version:
206 lines (203 loc) 27.4 kB
/** * vite-plugin-react-server * Copyright (c) Nico Brinkkemper * MIT License */ import { DEFAULT_CONFIG } from '../config/defaults.js'; import { toError } from '../error/toError.js'; import { resolvePage } from './resolvePage.js'; import { resolveProps } from './resolveProps.js'; import { routeToURL } from '../utils/routeToURL.js'; const resolvePageAndProps = async function _resolvePageAndProps(handlerOptions) { try { if (handlerOptions.verbose) { handlerOptions.logger?.info( `[resolvePageAndProps] Starting resolution for route: ${handlerOptions.route}` ); } const url = handlerOptions.url ?? routeToURL( handlerOptions.route ?? "", handlerOptions.moduleBaseURL ?? "/", handlerOptions?.build?.rscOutputPath ?? DEFAULT_CONFIG.BUILD.rscOutputPath ); if (handlerOptions.verbose) { handlerOptions.logger?.info( `[resolvePageAndProps] URL resolved: ${url}. Starting page resolution` ); } const resolvePagePromise = resolvePage({ id: handlerOptions.pagePath, exportName: handlerOptions.pageExportName ?? DEFAULT_CONFIG.PAGE_EXPORT_NAME, loader: handlerOptions.loader }); if (handlerOptions.verbose) { handlerOptions.logger?.info( `[resolvePageAndProps] Starting props resolution` ); } const resolvePropsPromise = resolveProps({ url, id: handlerOptions.propsPath || handlerOptions.pagePath, exportName: handlerOptions.propsExportName ?? DEFAULT_CONFIG.PROPS_EXPORT_NAME, loader: async (idWithExport) => { if (handlerOptions.verbose) { handlerOptions.logger?.info( `[resolvePageAndProps] Props loader called with: ${idWithExport}` ); } let propsId = handlerOptions.propsPath || handlerOptions.pagePath; let propsExportName = handlerOptions.propsExportName ?? DEFAULT_CONFIG.PROPS_EXPORT_NAME; if (idWithExport && idWithExport.includes("#")) { const [id, exportName] = idWithExport.split("#"); propsId = id; if (exportName) { propsExportName = exportName; } } const resolvePageResult2 = await resolvePagePromise; if (resolvePageResult2.type === "error") { if (handlerOptions.verbose) { handlerOptions.logger?.error("resolveProps", { error: resolvePageResult2.error }); } if (resolvePageResult2.error != null) { throw resolvePageResult2.error; } throw new Error("Failed to resolve page in props loader"); } if (resolvePageResult2.type === "success" && propsExportName in resolvePageResult2.module) { if (handlerOptions.verbose) { handlerOptions.logger?.info( `[resolvePageAndProps] Props found in page module` ); } return resolvePageResult2.module; } if (propsId && propsId !== handlerOptions.pagePath) { if (handlerOptions.verbose) { handlerOptions.logger?.info( `[resolvePageAndProps] Loading props from separate file: ${propsId}` ); } const result = await handlerOptions.loader(propsId); return result; } else if (propsId === handlerOptions.pagePath) { if (handlerOptions.verbose) { handlerOptions.logger?.info( `[resolvePageAndProps] Checking page module for props: ${propsId}` ); } if (resolvePageResult2.type === "success") { const pageModule = resolvePageResult2.module; if (propsExportName in pageModule) { if (handlerOptions.verbose) { handlerOptions.logger?.info( `[resolvePageAndProps] Props found in page module` ); } return pageModule; } } const result = await handlerOptions.loader(propsId); return result; } if (handlerOptions.verbose) { handlerOptions.logger?.info( `[resolvePageAndProps] Using default props with URL` ); } return { [propsExportName]: { url } }; } }); if (handlerOptions.verbose) { handlerOptions.logger?.info( `[resolvePageAndProps] Waiting for both promises to resolve` ); } const [resolvePageResult, resolvePropsResult] = await Promise.all([ resolvePagePromise, resolvePropsPromise ]); if (handlerOptions.verbose) { handlerOptions.logger?.info( `[resolvePageAndProps] Both promises resolved` ); } if (resolvePageResult.type != "success") { if (handlerOptions.verbose) { handlerOptions.logger?.error( `[resolvePageAndProps] Page resolution failed: ${resolvePageResult.type}` ); } return resolvePageResult; } if (resolvePropsResult.type != "success") { if (handlerOptions.verbose) { handlerOptions.logger?.error( `[resolvePageAndProps] Props resolution failed: ${resolvePropsResult.type}` ); } return resolvePropsResult; } if (handlerOptions.verbose) { handlerOptions.logger?.info( `[resolvePageAndProps] Both page and props resolved successfully` ); } let pageProps = resolvePropsResult.module?.[handlerOptions.propsExportName]; if (handlerOptions.verbose) { handlerOptions.logger?.info( `[resolvePageAndProps] Raw pageProps type: ${typeof pageProps}, isFunction: ${typeof pageProps === "function"}` ); } if (typeof pageProps === "function") { if (handlerOptions.verbose) { handlerOptions.logger?.info( `[resolvePageAndProps] Props is a function, calling with url: ${url}` ); } try { pageProps = pageProps(url); if (pageProps instanceof Promise) { pageProps = await pageProps; } } catch (error) { if (handlerOptions.verbose) { handlerOptions.logger?.error( `[resolvePageAndProps] Error calling props function: ${error}` ); } pageProps = {}; } } if (handlerOptions.verbose) { handlerOptions.logger?.info( `[resolvePageAndProps] Extracted pageProps: ${JSON.stringify(Object.keys(pageProps || {}).length, null, 2)} keys` ); handlerOptions.logger?.info( `[resolvePageAndProps] resolvePropsResult.module keys: ${Object.keys(resolvePropsResult.module || {}).join(", ")}` ); } return { type: "success", PageComponent: resolvePageResult.module[handlerOptions.pageExportName], pageProps: pageProps ?? {} // Ensure pageProps is always an object, not undefined }; } catch (error) { if (handlerOptions.verbose) { handlerOptions.logger?.error( `[resolvePageAndProps] Error in resolvePageAndProps: ${error}` ); } return { type: "error", error: toError(error) }; } }; export { resolvePageAndProps }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZVBhZ2VBbmRQcm9wcy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL2hlbHBlcnMvcmVzb2x2ZVBhZ2VBbmRQcm9wcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBERUZBVUxUX0NPTkZJRyB9IGZyb20gXCIuLi9jb25maWcvZGVmYXVsdHMuanNcIjtcbmltcG9ydCB7IHRvRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvdG9FcnJvci5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBDcmVhdGVIYW5kbGVyT3B0aW9ucyxcbiAgUGFnZUNvbXBvbmVudFR5cGUsXG4gIFBhZ2VQcm9wT3B0LFxufSBmcm9tIFwiLi4vdHlwZXMuanNcIjtcbmltcG9ydCB7IHJlc29sdmVQYWdlIH0gZnJvbSBcIi4vcmVzb2x2ZVBhZ2UuanNcIjtcbmltcG9ydCB7IHJlc29sdmVQcm9wcyB9IGZyb20gXCIuL3Jlc29sdmVQcm9wcy5qc1wiO1xuaW1wb3J0IHsgcm91dGVUb1VSTCB9IGZyb20gXCIuLi91dGlscy9yb3V0ZVRvVVJMLmpzXCI7XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIHBhZ2UgYW5kIHByb3BzIGZvciBhIGdpdmVuIHJvdXRlLCB3b3JrcyBpbiBjb21iaW5hdGlvbiB3aXRoIHJlc29sdmVDb21wb25lbnRzXG4gKiBUaGUgc3BlY2lhbCB0aGluZyBpdCBkb2VzIGlzIHRoYXQgaWYgdGhlIHByb3BzIGlzIGFscmVhZHkgaW4gdGhlIHBhZ2UgbW9kdWxlLCBpdCB3aWxsIGZhbGxiYWNrIHRvIHRoYXQuXG4gKiBAcGFyYW0gaGFuZGxlck9wdGlvbnMgLSBUaGUgaGFuZGxlciBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIHBhZ2UgYW5kIHByb3BzLlxuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZVBhZ2VBbmRQcm9wczogUmVzb2x2ZVBhZ2VBbmRQcm9wc0ZuID1cbiAgYXN5bmMgZnVuY3Rpb24gX3Jlc29sdmVQYWdlQW5kUHJvcHMoaGFuZGxlck9wdGlvbnMpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGhhbmRsZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgaGFuZGxlck9wdGlvbnMubG9nZ2VyPy5pbmZvKFxuICAgICAgICAgIGBbcmVzb2x2ZVBhZ2VBbmRQcm9wc10gU3RhcnRpbmcgcmVzb2x1dGlvbiBmb3Igcm91dGU6ICR7aGFuZGxlck9wdGlvbnMucm91dGV9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB1cmwgPVxuICAgICAgICBoYW5kbGVyT3B0aW9ucy51cmwgPz9cbiAgICAgICAgcm91dGVUb1VSTChcbiAgICAgICAgICBoYW5kbGVyT3B0aW9ucy5yb3V0ZSA/PyBcIlwiLFxuICAgICAgICAgIGhhbmRsZXJPcHRpb25zLm1vZHVsZUJhc2VVUkwgPz8gXCIvXCIsXG4gICAgICAgICAgaGFuZGxlck9wdGlvbnM/LmJ1aWxkPy5yc2NPdXRwdXRQYXRoID8/XG4gICAgICAgICAgICBERUZBVUxUX0NPTkZJRy5CVUlMRC5yc2NPdXRwdXRQYXRoXG4gICAgICAgICk7XG5cbiAgICAgIGlmIChoYW5kbGVyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgIGhhbmRsZXJPcHRpb25zLmxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICBgW3Jlc29sdmVQYWdlQW5kUHJvcHNdIFVSTCByZXNvbHZlZDogJHt1cmx9LiBTdGFydGluZyBwYWdlIHJlc29sdXRpb25gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc29sdmVQYWdlUHJvbWlzZSA9IHJlc29sdmVQYWdlKHtcbiAgICAgICAgaWQ6IGhhbmRsZXJPcHRpb25zLnBhZ2VQYXRoLFxuICAgICAgICBleHBvcnROYW1lOlxuICAgICAgICAgIGhhbmRsZXJPcHRpb25zLnBhZ2VFeHBvcnROYW1lID8/IERFRkFVTFRfQ09ORklHLlBBR0VfRVhQT1JUX05BTUUsXG4gICAgICAgIGxvYWRlcjogaGFuZGxlck9wdGlvbnMubG9hZGVyLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChoYW5kbGVyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgIGhhbmRsZXJPcHRpb25zLmxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICBgW3Jlc29sdmVQYWdlQW5kUHJvcHNdIFN0YXJ0aW5nIHByb3BzIHJlc29sdXRpb25gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc29sdmVQcm9wc1Byb21pc2UgPSByZXNvbHZlUHJvcHMoe1xuICAgICAgICB1cmwsXG4gICAgICAgIGlkOiBoYW5kbGVyT3B0aW9ucy5wcm9wc1BhdGggfHwgaGFuZGxlck9wdGlvbnMucGFnZVBhdGgsXG4gICAgICAgIGV4cG9ydE5hbWU6XG4gICAgICAgICAgaGFuZGxlck9wdGlvbnMucHJvcHNFeHBvcnROYW1lID8/IERFRkFVTFRfQ09ORklHLlBST1BTX0VYUE9SVF9OQU1FLFxuICAgICAgICBsb2FkZXI6IGFzeW5jIChpZFdpdGhFeHBvcnQ/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAoaGFuZGxlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgaGFuZGxlck9wdGlvbnMubG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgICBgW3Jlc29sdmVQYWdlQW5kUHJvcHNdIFByb3BzIGxvYWRlciBjYWxsZWQgd2l0aDogJHtpZFdpdGhFeHBvcnR9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gUGFyc2UgdGhlIGlkIHRvIGV4dHJhY3QgdGhlIHBhdGggYW5kIGV4cG9ydCBuYW1lIGlmIHVzaW5nICMgc3ludGF4XG4gICAgICAgICAgbGV0IHByb3BzSWQgPSBoYW5kbGVyT3B0aW9ucy5wcm9wc1BhdGggfHwgaGFuZGxlck9wdGlvbnMucGFnZVBhdGg7XG4gICAgICAgICAgbGV0IHByb3BzRXhwb3J0TmFtZSA9IGhhbmRsZXJPcHRpb25zLnByb3BzRXhwb3J0TmFtZSA/PyBERUZBVUxUX0NPTkZJRy5QUk9QU19FWFBPUlRfTkFNRTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoaWRXaXRoRXhwb3J0ICYmIGlkV2l0aEV4cG9ydC5pbmNsdWRlcygnIycpKSB7XG4gICAgICAgICAgICBjb25zdCBbaWQsIGV4cG9ydE5hbWVdID0gaWRXaXRoRXhwb3J0LnNwbGl0KCcjJyk7XG4gICAgICAgICAgICBwcm9wc0lkID0gaWQ7XG4gICAgICAgICAgICBpZiAoZXhwb3J0TmFtZSkge1xuICAgICAgICAgICAgICBwcm9wc0V4cG9ydE5hbWUgPSBleHBvcnROYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCByZXNvbHZlUGFnZVJlc3VsdCA9IGF3YWl0IHJlc29sdmVQYWdlUHJvbWlzZTtcbiAgICAgICAgICBpZiAocmVzb2x2ZVBhZ2VSZXN1bHQudHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgICBpZiAoaGFuZGxlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICBoYW5kbGVyT3B0aW9ucy5sb2dnZXI/LmVycm9yKFwicmVzb2x2ZVByb3BzXCIsIHtcbiAgICAgICAgICAgICAgICBlcnJvcjogcmVzb2x2ZVBhZ2VSZXN1bHQuZXJyb3IsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc29sdmVQYWdlUmVzdWx0LmVycm9yICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgcmVzb2x2ZVBhZ2VSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcmVzb2x2ZSBwYWdlIGluIHByb3BzIGxvYWRlclwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcmVzb2x2ZVBhZ2VSZXN1bHQudHlwZSA9PT0gXCJzdWNjZXNzXCIgJiZcbiAgICAgICAgICAgIHByb3BzRXhwb3J0TmFtZSBpbiByZXNvbHZlUGFnZVJlc3VsdC5tb2R1bGVcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChoYW5kbGVyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgIGhhbmRsZXJPcHRpb25zLmxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgICAgICBgW3Jlc29sdmVQYWdlQW5kUHJvcHNdIFByb3BzIGZvdW5kIGluIHBhZ2UgbW9kdWxlYFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBtb2R1bGVcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlUGFnZVJlc3VsdC5tb2R1bGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcm9wc0lkICYmIHByb3BzSWQgIT09IGhhbmRsZXJPcHRpb25zLnBhZ2VQYXRoKSB7XG4gICAgICAgICAgICAvLyBTZXBhcmF0ZSBwcm9wcyBmaWxlXG4gICAgICAgICAgICBpZiAoaGFuZGxlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICBoYW5kbGVyT3B0aW9ucy5sb2dnZXI/LmluZm8oXG4gICAgICAgICAgICAgICAgYFtyZXNvbHZlUGFnZUFuZFByb3BzXSBMb2FkaW5nIHByb3BzIGZyb20gc2VwYXJhdGUgZmlsZTogJHtwcm9wc0lkfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXJPcHRpb25zLmxvYWRlcihwcm9wc0lkKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcm9wc0lkID09PSBoYW5kbGVyT3B0aW9ucy5wYWdlUGF0aCkge1xuICAgICAgICAgICAgLy8gUHJvcHMgbWlnaHQgYmUgaW4gdGhlIHBhZ2UgbW9kdWxlXG4gICAgICAgICAgICBpZiAoaGFuZGxlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICBoYW5kbGVyT3B0aW9ucy5sb2dnZXI/LmluZm8oXG4gICAgICAgICAgICAgICAgYFtyZXNvbHZlUGFnZUFuZFByb3BzXSBDaGVja2luZyBwYWdlIG1vZHVsZSBmb3IgcHJvcHM6ICR7cHJvcHNJZH1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzb2x2ZVBhZ2VSZXN1bHQudHlwZSA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgICAgY29uc3QgcGFnZU1vZHVsZSA9IHJlc29sdmVQYWdlUmVzdWx0Lm1vZHVsZTtcbiAgICAgICAgICAgICAgaWYgKHByb3BzRXhwb3J0TmFtZSBpbiBwYWdlTW9kdWxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICAgIGhhbmRsZXJPcHRpb25zLmxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgYFtyZXNvbHZlUGFnZUFuZFByb3BzXSBQcm9wcyBmb3VuZCBpbiBwYWdlIG1vZHVsZWBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwYWdlTW9kdWxlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUcnkgbG9hZGluZyB0aGUgcGFnZSBtb2R1bGUgZGlyZWN0bHlcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXJPcHRpb25zLmxvYWRlcihwcm9wc0lkKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYW5kbGVyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICBoYW5kbGVyT3B0aW9ucy5sb2dnZXI/LmluZm8oXG4gICAgICAgICAgICAgIGBbcmVzb2x2ZVBhZ2VBbmRQcm9wc10gVXNpbmcgZGVmYXVsdCBwcm9wcyB3aXRoIFVSTGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBbcHJvcHNFeHBvcnROYW1lXTogeyB1cmw6IHVybCB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgaWYgKGhhbmRsZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgaGFuZGxlck9wdGlvbnMubG9nZ2VyPy5pbmZvKFxuICAgICAgICAgIGBbcmVzb2x2ZVBhZ2VBbmRQcm9wc10gV2FpdGluZyBmb3IgYm90aCBwcm9taXNlcyB0byByZXNvbHZlYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbcmVzb2x2ZVBhZ2VSZXN1bHQsIHJlc29sdmVQcm9wc1Jlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHJlc29sdmVQYWdlUHJvbWlzZSxcbiAgICAgICAgcmVzb2x2ZVByb3BzUHJvbWlzZSxcbiAgICAgIF0pO1xuXG4gICAgICBpZiAoaGFuZGxlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICBoYW5kbGVyT3B0aW9ucy5sb2dnZXI/LmluZm8oXG4gICAgICAgICAgYFtyZXNvbHZlUGFnZUFuZFByb3BzXSBCb3RoIHByb21pc2VzIHJlc29sdmVkYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzb2x2ZVBhZ2VSZXN1bHQudHlwZSAhPSBcInN1Y2Nlc3NcIikge1xuICAgICAgICBpZiAoaGFuZGxlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGhhbmRsZXJPcHRpb25zLmxvZ2dlcj8uZXJyb3IoXG4gICAgICAgICAgICBgW3Jlc29sdmVQYWdlQW5kUHJvcHNdIFBhZ2UgcmVzb2x1dGlvbiBmYWlsZWQ6ICR7cmVzb2x2ZVBhZ2VSZXN1bHQudHlwZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZVBhZ2VSZXN1bHQ7XG4gICAgICB9XG4gICAgICBpZiAocmVzb2x2ZVByb3BzUmVzdWx0LnR5cGUgIT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgaWYgKGhhbmRsZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBoYW5kbGVyT3B0aW9ucy5sb2dnZXI/LmVycm9yKFxuICAgICAgICAgICAgYFtyZXNvbHZlUGFnZUFuZFByb3BzXSBQcm9wcyByZXNvbHV0aW9uIGZhaWxlZDogJHtyZXNvbHZlUHJvcHNSZXN1bHQudHlwZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZVByb3BzUmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFuZGxlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICBoYW5kbGVyT3B0aW9ucy5sb2dnZXI/LmluZm8oXG4gICAgICAgICAgYFtyZXNvbHZlUGFnZUFuZFByb3BzXSBCb3RoIHBhZ2UgYW5kIHByb3BzIHJlc29sdmVkIHN1Y2Nlc3NmdWxseWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHBhZ2VQcm9wcyA9IHJlc29sdmVQcm9wc1Jlc3VsdC5tb2R1bGU/LltcbiAgICAgICAgaGFuZGxlck9wdGlvbnMucHJvcHNFeHBvcnROYW1lIGFzIGtleW9mIHR5cGVvZiByZXNvbHZlUHJvcHNSZXN1bHQubW9kdWxlXG4gICAgICBdIGFzIGFueTtcblxuICAgICAgaWYgKGhhbmRsZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgaGFuZGxlck9wdGlvbnMubG9nZ2VyPy5pbmZvKFxuICAgICAgICAgIGBbcmVzb2x2ZVBhZ2VBbmRQcm9wc10gUmF3IHBhZ2VQcm9wcyB0eXBlOiAke3R5cGVvZiBwYWdlUHJvcHN9LCBpc0Z1bmN0aW9uOiAke3R5cGVvZiBwYWdlUHJvcHMgPT09IFwiZnVuY3Rpb25cIn1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHByb3BzIGlzIGEgZnVuY3Rpb24sIGNhbGwgaXQgd2l0aCB0aGUgVVJMXG4gICAgICBpZiAodHlwZW9mIHBhZ2VQcm9wcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGlmIChoYW5kbGVyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgaGFuZGxlck9wdGlvbnMubG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgYFtyZXNvbHZlUGFnZUFuZFByb3BzXSBQcm9wcyBpcyBhIGZ1bmN0aW9uLCBjYWxsaW5nIHdpdGggdXJsOiAke3VybH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhZ2VQcm9wcyA9IHBhZ2VQcm9wcyh1cmwpO1xuICAgICAgICAgIC8vIEF3YWl0IGlmIGl0IHJldHVybnMgYSBQcm9taXNlXG4gICAgICAgICAgaWYgKHBhZ2VQcm9wcyBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHBhZ2VQcm9wcyA9IGF3YWl0IHBhZ2VQcm9wcztcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGhhbmRsZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGhhbmRsZXJPcHRpb25zLmxvZ2dlcj8uZXJyb3IoXG4gICAgICAgICAgICAgIGBbcmVzb2x2ZVBhZ2VBbmRQcm9wc10gRXJyb3IgY2FsbGluZyBwcm9wcyBmdW5jdGlvbjogJHtlcnJvcn1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYWdlUHJvcHMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaGFuZGxlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICBoYW5kbGVyT3B0aW9ucy5sb2dnZXI/LmluZm8oXG4gICAgICAgICAgYFtyZXNvbHZlUGFnZUFuZFByb3BzXSBFeHRyYWN0ZWQgcGFnZVByb3BzOiAke0pTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHBhZ2VQcm9wcyB8fCB7fSkubGVuZ3RoLCBudWxsLCAyKX0ga2V5c2BcbiAgICAgICAgKTtcbiAgICAgICAgaGFuZGxlck9wdGlvbnMubG9nZ2VyPy5pbmZvKFxuICAgICAgICAgIGBbcmVzb2x2ZVBhZ2VBbmRQcm9wc10gcmVzb2x2ZVByb3BzUmVzdWx0Lm1vZHVsZSBrZXlzOiAke09iamVjdC5rZXlzKHJlc29sdmVQcm9wc1Jlc3VsdC5tb2R1bGUgfHwge30pLmpvaW4oXCIsIFwiKX1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwic3VjY2Vzc1wiIGFzIGNvbnN0LFxuICAgICAgICBQYWdlQ29tcG9uZW50OiByZXNvbHZlUGFnZVJlc3VsdC5tb2R1bGVbXG4gICAgICAgICAgaGFuZGxlck9wdGlvbnMucGFnZUV4cG9ydE5hbWVcbiAgICAgICAgXSBhcyBuZXZlcixcbiAgICAgICAgcGFnZVByb3BzOiBwYWdlUHJvcHMgPz8ge30sIC8vIEVuc3VyZSBwYWdlUHJvcHMgaXMgYWx3YXlzIGFuIG9iamVjdCwgbm90IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGhhbmRsZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgaGFuZGxlck9wdGlvbnMubG9nZ2VyPy5lcnJvcihcbiAgICAgICAgICBgW3Jlc29sdmVQYWdlQW5kUHJvcHNdIEVycm9yIGluIHJlc29sdmVQYWdlQW5kUHJvcHM6ICR7ZXJyb3J9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJlcnJvclwiIGFzIGNvbnN0LFxuICAgICAgICBlcnJvcjogdG9FcnJvcihlcnJvciksXG4gICAgICB9O1xuICAgIH1cbiAgfTtcblxudHlwZSBSZXNvbHZlUGFnZUFuZFByb3BzUmVzdWx0PFQgZXh0ZW5kcyBQYWdlUHJvcE9wdCA9IFBhZ2VQcm9wT3B0PiA9XG4gIHwge1xuICAgICAgdHlwZTogXCJzdWNjZXNzXCI7XG4gICAgICBlcnJvcj86IG5ldmVyO1xuICAgICAgUGFnZUNvbXBvbmVudDogUGFnZUNvbXBvbmVudFR5cGU8VD47XG4gICAgICBwYWdlUHJvcHM6IFQ7XG4gICAgfVxuICB8IHtcbiAgICAgIHR5cGU6IFwiZXJyb3JcIjtcbiAgICAgIGVycm9yOiBFcnJvcjtcbiAgICAgIFBhZ2VDb21wb25lbnQ/OiBuZXZlcjtcbiAgICAgIHBhZ2VQcm9wcz86IG5ldmVyO1xuICAgIH1cbiAgfCB7XG4gICAgICB0eXBlOiBcInNraXBcIjtcbiAgICAgIGVycm9yPzogbmV2ZXI7XG4gICAgICBQYWdlQ29tcG9uZW50PzogbmV2ZXI7XG4gICAgICBwYWdlUHJvcHM/OiBuZXZlcjtcbiAgICB9O1xuXG5leHBvcnQgdHlwZSBSZXNvbHZlUGFnZUFuZFByb3BzRm4gPSA8VCBleHRlbmRzIFBhZ2VQcm9wT3B0ID0gUGFnZVByb3BPcHQ+KFxuICBvcHRpb25zOiBQaWNrPFxuICAgIENyZWF0ZUhhbmRsZXJPcHRpb25zLFxuICAgIHwgXCJwYWdlUGF0aFwiXG4gICAgfCBcInBhZ2VFeHBvcnROYW1lXCJcbiAgICB8IFwicHJvcHNQYXRoXCJcbiAgICB8IFwicHJvcHNFeHBvcnROYW1lXCJcbiAgICB8IFwibG9hZGVyXCJcbiAgICB8IFwidmVyYm9zZVwiXG4gICAgfCBcImxvZ2dlclwiXG4gID4gJiB7XG4gICAgbW9kdWxlQmFzZVVSTD86IHN0cmluZztcbiAgICByb3V0ZT86IHN0cmluZztcbiAgICB1cmw/OiBzdHJpbmc7XG4gICAgYnVpbGQ/OiB7XG4gICAgICByc2NPdXRwdXRQYXRoOiBzdHJpbmc7XG4gICAgICBvdXREaXI/OiBuZXZlcjtcbiAgICAgIHNlcnZlcj86IG5ldmVyO1xuICAgICAgY2xpZW50PzogbmV2ZXI7XG4gICAgICBzdGF0aWM/OiBuZXZlcjtcbiAgICAgIHBhZ2VzPzogbmV2ZXI7XG4gICAgICBwYWdlRXhwb3J0TmFtZT86IG5ldmVyO1xuICAgICAgcHJvcHNFeHBvcnROYW1lPzogbmV2ZXI7XG4gICAgICByb290RXhwb3J0TmFtZT86IG5ldmVyO1xuICAgIH07XG4gIH1cbikgPT4gUHJvbWlzZTxSZXNvbHZlUGFnZUFuZFByb3BzUmVzdWx0PFQ+PjtcbiJdLCJuYW1lcyI6WyJyZXNvbHZlUGFnZVJlc3VsdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFpQmEsTUFBQSxtQkFBQSxHQUNYLGVBQWUsb0JBQUEsQ0FBcUIsY0FBZ0IsRUFBQTtBQUNsRCxFQUFJLElBQUE7QUFDRixJQUFBLElBQUksZUFBZSxPQUFTLEVBQUE7QUFDMUIsTUFBQSxjQUFBLENBQWUsTUFBUSxFQUFBLElBQUE7QUFBQSxRQUNyQixDQUFBLHFEQUFBLEVBQXdELGVBQWUsS0FBSyxDQUFBO0FBQUEsT0FDOUU7QUFBQTtBQUdGLElBQU0sTUFBQSxHQUFBLEdBQ0osZUFBZSxHQUNmLElBQUEsVUFBQTtBQUFBLE1BQ0UsZUFBZSxLQUFTLElBQUEsRUFBQTtBQUFBLE1BQ3hCLGVBQWUsYUFBaUIsSUFBQSxHQUFBO0FBQUEsTUFDaEMsY0FBZ0IsRUFBQSxLQUFBLEVBQU8sYUFDckIsSUFBQSxjQUFBLENBQWUsS0FBTSxDQUFBO0FBQUEsS0FDekI7QUFFRixJQUFBLElBQUksZUFBZSxPQUFTLEVBQUE7QUFDMUIsTUFBQSxjQUFBLENBQWUsTUFBUSxFQUFBLElBQUE7QUFBQSxRQUNyQix1Q0FBdUMsR0FBRyxDQUFBLDBCQUFBO0FBQUEsT0FDNUM7QUFBQTtBQUdGLElBQUEsTUFBTSxxQkFBcUIsV0FBWSxDQUFBO0FBQUEsTUFDckMsSUFBSSxjQUFlLENBQUEsUUFBQTtBQUFBLE1BQ25CLFVBQUEsRUFDRSxjQUFlLENBQUEsY0FBQSxJQUFrQixjQUFlLENBQUEsZ0JBQUE7QUFBQSxNQUNsRCxRQUFRLGNBQWUsQ0FBQTtBQUFBLEtBQ3hCLENBQUE7QUFFRCxJQUFBLElBQUksZUFBZSxPQUFTLEVBQUE7QUFDMUIsTUFBQSxjQUFBLENBQWUsTUFBUSxFQUFBLElBQUE7QUFBQSxRQUNyQixDQUFBLCtDQUFBO0FBQUEsT0FDRjtBQUFBO0FBR0YsSUFBQSxNQUFNLHNCQUFzQixZQUFhLENBQUE7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