vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
206 lines (203 loc) • 27.4 kB
JavaScript
/**
* 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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