vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
179 lines (176 loc) • 21.1 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { createLogger } from 'vite';
import { createCssProps } from './createCssProps.js';
const collectViteModuleGraphCss = async function _collectViteModuleGraphCss({
moduleGraph,
onCss,
parentUrl,
handlerOptions
}) {
const {
pagePath,
moduleBaseURL,
moduleBasePath,
moduleRootPath,
projectRoot,
publicOrigin,
css,
loader,
normalizer,
moduleID
} = handlerOptions;
const logger = handlerOptions.logger ?? createLogger();
const verbose = handlerOptions.verbose ?? false;
if (handlerOptions.verbose) {
logger.info(`Starting CSS collection for pagePath: ${pagePath}`);
}
if (!pagePath) {
if (verbose) {
logger.info(`No pagePath, skipping`);
}
return { type: "skip" };
}
const cssFiles = /* @__PURE__ */ new Map();
if (verbose) {
logger.info(`Getting module by URL: ${pagePath}`);
}
let pageModule = await moduleGraph.getModuleByUrl(pagePath, true);
if (!pageModule && projectRoot && !pagePath.startsWith("/")) {
const fullPath = `${projectRoot}/${pagePath}`;
if (verbose) {
logger.info(`Trying full path: ${fullPath}`);
}
pageModule = await moduleGraph.getModuleByUrl(fullPath, true);
}
if (!pageModule && !pagePath.startsWith("/")) {
const slashPath = `/${pagePath}`;
if (verbose) {
logger.info(`Trying slash path: ${slashPath}`);
}
pageModule = await moduleGraph.getModuleByUrl(slashPath, true);
}
if (!pageModule) {
if (verbose) {
logger.info(`No page module found for any path variant, skipping`);
}
return { type: "skip" };
}
if (verbose) {
logger.info(`Page module found, starting walk`);
}
const seen = /* @__PURE__ */ new Set();
const processing = /* @__PURE__ */ new Set();
const walkModule = async (mod) => {
if (!mod?.id) {
return;
}
if (seen.has(mod.id)) {
return;
}
if (processing.has(mod.id)) {
return;
}
processing.add(mod.id);
if (verbose) {
logger.info(`Processing module: ${mod.id}`);
}
if (mod.id.endsWith(".css")) {
if (verbose) {
logger.info(`Loading CSS module: ${mod.id}?inline`);
}
const string = await loader(`${mod.id}?inline`).then(
(m) => m?.["default"] ?? ""
);
if (typeof string !== "string") {
throw new Error(
`CSS module ${mod.id}?inline did not return a string`
);
} else if (string === "") {
throw new Error(
`CSS module ${mod.id}?inline returned an empty string`
);
}
if (verbose) {
logger.info(`CSS loaded successfully: ${mod.id}`);
}
const cssContent = createCssProps({
id: mod?.id,
code: string,
userOptions: {
moduleBaseURL,
moduleBasePath,
moduleRootPath,
projectRoot,
css,
normalizer,
moduleID,
publicOrigin
}
});
cssFiles.set(mod?.id, cssContent);
onCss?.(cssContent, parentUrl ?? pagePath);
}
if (mod.importedModules) {
if (verbose) {
logger.info(`Processing imports for module: ${mod.id}`);
}
const importedModules = Array.from(
mod.importedModules?.values()
);
if (verbose) {
logger.info(`Found ${importedModules.length} imported modules`);
}
for (const importedMod of importedModules) {
if (typeof importedMod === "object" && importedMod != null) {
if ("id" in importedMod && importedMod.id && typeof importedMod.id === "string") {
await walkModule(importedMod);
} else {
throw new Error(`Imported module has no id`);
}
} else {
throw new Error(`Imported module is not an object`);
}
}
}
processing.delete(mod.id);
seen.add(mod.id);
};
try {
if (verbose) {
logger.info(`Starting module walk`);
}
await walkModule(pageModule);
if (verbose) {
logger.info(`Module walk completed successfully`);
}
} catch (error) {
if (verbose) {
logger.error(`Error during module walk: ${error?.message ?? "no message"}`);
}
return {
type: "error",
error,
metrics: {
cssFiles: cssFiles.size,
processing: processing.size
}
};
}
if (verbose) {
logger.info(`CSS collection completed, found ${cssFiles.size} CSS files`);
}
return {
type: "success",
cssFiles,
metrics: {
cssFiles: cssFiles.size,
processing: processing.size
}
};
};
export { collectViteModuleGraphCss };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdFZpdGVNb2R1bGVHcmFwaENzcy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL2hlbHBlcnMvY29sbGVjdFZpdGVNb2R1bGVHcmFwaENzcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjcmVhdGVMb2dnZXIsXG4gIHR5cGUgRW52aXJvbm1lbnRNb2R1bGVHcmFwaCxcbiAgdHlwZSBFbnZpcm9ubWVudE1vZHVsZU5vZGUsXG4gIHR5cGUgTW9kdWxlR3JhcGgsXG4gIHR5cGUgTW9kdWxlTm9kZSxcbn0gZnJvbSBcInZpdGVcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ3JlYXRlSGFuZGxlck9wdGlvbnMsXG4gIENzc0NvbnRlbnQsXG59IGZyb20gXCIuLi90eXBlcy5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlQ3NzUHJvcHMgfSBmcm9tIFwiLi9jcmVhdGVDc3NQcm9wcy5qc1wiO1xuXG50eXBlIENvbGxlY3RWaXRlTW9kdWxlR3JhcGhDc3NSZXN1bHQgPVxuICB8IHtcbiAgICAgIHR5cGU6IFwic3VjY2Vzc1wiO1xuICAgICAgY3NzRmlsZXM6IE1hcDxzdHJpbmcsIENzc0NvbnRlbnQ+O1xuICAgICAgZXJyb3I/OiBuZXZlcjtcbiAgICAgIG1ldHJpY3M6IHtcbiAgICAgICAgY3NzRmlsZXM6IG51bWJlcjtcbiAgICAgICAgcHJvY2Vzc2luZzogbnVtYmVyO1xuICAgICAgfTtcbiAgICB9XG4gIHwge1xuICAgICAgdHlwZTogXCJlcnJvclwiO1xuICAgICAgZXJyb3I6IHVua25vd247XG4gICAgICBjc3NGaWxlcz86IG5ldmVyO1xuICAgICAgbWV0cmljczoge1xuICAgICAgICBjc3NGaWxlczogbnVtYmVyO1xuICAgICAgICBwcm9jZXNzaW5nOiBudW1iZXI7XG4gICAgICB9O1xuICAgIH1cbiAgfCB7XG4gICAgICB0eXBlOiBcInNraXBcIjtcbiAgICAgIGNzc0ZpbGVzPzogbmV2ZXI7XG4gICAgICBlcnJvcj86IG5ldmVyO1xuICAgICAgbWV0cmljcz86IG5ldmVyO1xuICAgIH07XG5cbmV4cG9ydCB0eXBlIENvbGxlY3RWaXRlTW9kdWxlR3JhcGhDc3NPcHRpb25zID0gUGljazxcbiAgQ3JlYXRlSGFuZGxlck9wdGlvbnMsXG4gIHwgXCJwYWdlUGF0aFwiXG4gIHwgXCJtb2R1bGVCYXNlVVJMXCJcbiAgfCBcIm1vZHVsZUJhc2VQYXRoXCJcbiAgfCBcIm1vZHVsZVJvb3RQYXRoXCJcbiAgfCBcInByb2plY3RSb290XCJcbiAgfCBcImNzc1wiXG4gIHwgXCJsb2FkZXJcIlxuICB8IFwibm9ybWFsaXplclwiXG4gIHwgXCJtb2R1bGVJRFwiXG4gIHwgXCJwdWJsaWNPcmlnaW5cIlxuICB8IFwibG9nZ2VyXCJcbiAgfCBcInZlcmJvc2VcIlxuPjtcblxuZXhwb3J0IHR5cGUgQ29sbGVjdFZpdGVNb2R1bGVHcmFwaENzc0ZuID0gPFxuICBPcHQgZXh0ZW5kcyBDb2xsZWN0Vml0ZU1vZHVsZUdyYXBoQ3NzT3B0aW9ucyA9IENvbGxlY3RWaXRlTW9kdWxlR3JhcGhDc3NPcHRpb25zXG4+KG9wdGlvbnM6IHtcbiAgbW9kdWxlR3JhcGg6IE1vZHVsZUdyYXBoIHwgRW52aXJvbm1lbnRNb2R1bGVHcmFwaDtcbiAgb25Dc3M/OiAoY3NzQ29udGVudDogQ3NzQ29udGVudCwgcGFyZW50VXJsOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHBhcmVudFVybD86IHN0cmluZztcbiAgaGFuZGxlck9wdGlvbnM6IE9wdDtcbn0pID0+IFByb21pc2U8Q29sbGVjdFZpdGVNb2R1bGVHcmFwaENzc1Jlc3VsdD47XG5cbmV4cG9ydCBjb25zdCBjb2xsZWN0Vml0ZU1vZHVsZUdyYXBoQ3NzOiBDb2xsZWN0Vml0ZU1vZHVsZUdyYXBoQ3NzRm4gPVxuICBhc3luYyBmdW5jdGlvbiBfY29sbGVjdFZpdGVNb2R1bGVHcmFwaENzcyh7XG4gICAgbW9kdWxlR3JhcGgsXG4gICAgb25Dc3MsXG4gICAgcGFyZW50VXJsLFxuICAgIGhhbmRsZXJPcHRpb25zLFxuICB9KSB7XG4gICAgY29uc3Qge1xuICAgICAgcGFnZVBhdGgsXG4gICAgICBtb2R1bGVCYXNlVVJMLFxuICAgICAgbW9kdWxlQmFzZVBhdGgsXG4gICAgICBtb2R1bGVSb290UGF0aCxcbiAgICAgIHByb2plY3RSb290LFxuICAgICAgcHVibGljT3JpZ2luLFxuICAgICAgY3NzLFxuICAgICAgbG9hZGVyLFxuICAgICAgbm9ybWFsaXplcixcbiAgICAgIG1vZHVsZUlELFxuICAgIH0gPSBoYW5kbGVyT3B0aW9ucztcbiAgICBjb25zdCBsb2dnZXIgPSBoYW5kbGVyT3B0aW9ucy5sb2dnZXIgPz8gY3JlYXRlTG9nZ2VyICAoKTtcbiAgICBjb25zdCB2ZXJib3NlID0gaGFuZGxlck9wdGlvbnMudmVyYm9zZSA/PyBmYWxzZTtcbiAgICBpZihoYW5kbGVyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgU3RhcnRpbmcgQ1NTIGNvbGxlY3Rpb24gZm9yIHBhZ2VQYXRoOiAke3BhZ2VQYXRofWApO1xuICAgIH1cbiAgICBcbiAgICBpZiAoIXBhZ2VQYXRoKSB7ICAgICAgICBcbiAgICAgIGlmKHZlcmJvc2UpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYE5vIHBhZ2VQYXRoLCBza2lwcGluZ2ApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgdHlwZTogXCJza2lwXCIgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjc3NGaWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBDc3NDb250ZW50PigpO1xuICAgIGlmKHZlcmJvc2UpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBHZXR0aW5nIG1vZHVsZSBieSBVUkw6ICR7cGFnZVBhdGh9YCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFRyeSBtdWx0aXBsZSBwYXRoIGZvcm1hdHMgc2luY2UgZGlmZmVyZW50IG1vZHVsZSBncmFwaHMgdXNlIGRpZmZlcmVudCBVUkwgc2NoZW1lc1xuICAgIGxldCBwYWdlTW9kdWxlID0gYXdhaXQgbW9kdWxlR3JhcGguZ2V0TW9kdWxlQnlVcmwocGFnZVBhdGgsIHRydWUpO1xuICAgIFxuICAgIC8vIElmIG5vdCBmb3VuZCwgdHJ5IHdpdGggZnVsbCBwYXRoIChzZXJ2ZXIgZW52aXJvbm1lbnQgdXNlcyBmdWxsIHBhdGhzKVxuICAgIGlmICghcGFnZU1vZHVsZSAmJiBwcm9qZWN0Um9vdCAmJiAhcGFnZVBhdGguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGAke3Byb2plY3RSb290fS8ke3BhZ2VQYXRofWA7XG4gICAgICBpZih2ZXJib3NlKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBUcnlpbmcgZnVsbCBwYXRoOiAke2Z1bGxQYXRofWApO1xuICAgICAgfVxuICAgICAgcGFnZU1vZHVsZSA9IGF3YWl0IG1vZHVsZUdyYXBoLmdldE1vZHVsZUJ5VXJsKGZ1bGxQYXRoLCB0cnVlKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQWxzbyB0cnkgd2l0aCBsZWFkaW5nIHNsYXNoXG4gICAgaWYgKCFwYWdlTW9kdWxlICYmICFwYWdlUGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgIGNvbnN0IHNsYXNoUGF0aCA9IGAvJHtwYWdlUGF0aH1gO1xuICAgICAgaWYodmVyYm9zZSkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgVHJ5aW5nIHNsYXNoIHBhdGg6ICR7c2xhc2hQYXRofWApO1xuICAgICAgfVxuICAgICAgcGFnZU1vZHVsZSA9IGF3YWl0IG1vZHVsZUdyYXBoLmdldE1vZHVsZUJ5VXJsKHNsYXNoUGF0aCwgdHJ1ZSk7XG4gICAgfVxuICAgIFxuICAgIGlmICghcGFnZU1vZHVsZSkge1xuICAgICAgaWYodmVyYm9zZSkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgTm8gcGFnZSBtb2R1bGUgZm91bmQgZm9yIGFueSBwYXRoIHZhcmlhbnQsIHNraXBwaW5nYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyB0eXBlOiBcInNraXBcIiB9O1xuICAgIH1cblxuICAgIGlmKHZlcmJvc2UpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBQYWdlIG1vZHVsZSBmb3VuZCwgc3RhcnRpbmcgd2Fsa2ApO1xuICAgIH1cblxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBwcm9jZXNzaW5nID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCB3YWxrTW9kdWxlID0gYXN5bmMgKG1vZDogTW9kdWxlTm9kZSB8IEVudmlyb25tZW50TW9kdWxlTm9kZSkgPT4ge1xuICAgICAgaWYgKCFtb2Q/LmlkKSB7XG4gICAgICAgIC8vIE1vZHVsZSBoYXMgbm8gaWRcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2Vlbi5oYXMobW9kLmlkKSkge1xuICAgICAgICAvLyBBbHJlYWR5IHByb2Nlc3NlZCBtb2R1bGVcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvY2Vzc2luZy5oYXMobW9kLmlkKSkge1xuICAgICAgICAvLyBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkIGZvciBtb2R1bGVcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzaW5nLmFkZChtb2QuaWQpO1xuICAgICAgaWYodmVyYm9zZSkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgUHJvY2Vzc2luZyBtb2R1bGU6ICR7bW9kLmlkfWApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBQcm9jZXNzaW5nIG1vZHVsZVxuICAgICAgaWYgKG1vZC5pZC5lbmRzV2l0aChcIi5jc3NcIikpIHtcbiAgICAgICAgICBpZih2ZXJib3NlKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYExvYWRpbmcgQ1NTIG1vZHVsZTogJHttb2QuaWR9P2lubGluZWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0cmluZyA9IGF3YWl0IGxvYWRlcihgJHttb2QuaWR9P2lubGluZWApLnRoZW4oXG4gICAgICAgICAgKG0pID0+IG0/LltcImRlZmF1bHRcIl0gPz8gXCJcIlxuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZW9mIHN0cmluZyAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDU1MgbW9kdWxlICR7bW9kLmlkfT9pbmxpbmUgZGlkIG5vdCByZXR1cm4gYSBzdHJpbmdgXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdHJpbmcgPT09IFwiXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ1NTIG1vZHVsZSAke21vZC5pZH0/aW5saW5lIHJldHVybmVkIGFuIGVtcHR5IHN0cmluZ2BcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmKHZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgQ1NTIGxvYWRlZCBzdWNjZXNzZnVsbHk6ICR7bW9kLmlkfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNzc0NvbnRlbnQgPSBjcmVhdGVDc3NQcm9wcyh7XG4gICAgICAgICAgaWQ6IG1vZD8uaWQsXG4gICAgICAgICAgY29kZTogc3RyaW5nLFxuICAgICAgICAgIHVzZXJPcHRpb25zOiB7XG4gICAgICAgICAgICBtb2R1bGVCYXNlVVJMOiBtb2R1bGVCYXNlVVJMLFxuICAgICAgICAgICAgbW9kdWxlQmFzZVBhdGg6IG1vZHVsZUJhc2VQYXRoLFxuICAgICAgICAgICAgbW9kdWxlUm9vdFBhdGg6IG1vZHVsZVJvb3RQYXRoLFxuICAgICAgICAgICAgcHJvamVjdFJvb3Q6IHByb2plY3RSb290LFxuICAgICAgICAgICAgY3NzOiBjc3MsXG4gICAgICAgICAgICBub3JtYWxpemVyOiBub3JtYWxpemVyLFxuICAgICAgICAgICAgbW9kdWxlSUQ6IG1vZHVsZUlELFxuICAgICAgICAgICAgcHVibGljT3JpZ2luOiBwdWJsaWNPcmlnaW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNzc0ZpbGVzLnNldChtb2Q/LmlkLCBjc3NDb250ZW50KTtcbiAgICAgICAgb25Dc3M/Lihjc3NDb250ZW50LCBwYXJlbnRVcmwgPz8gcGFnZVBhdGgpO1xuICAgICAgfVxuXG4gICAgICBpZiAobW9kLmltcG9ydGVkTW9kdWxlcykge1xuICAgICAgICBpZih2ZXJib3NlKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFByb2Nlc3NpbmcgaW1wb3J0cyBmb3IgbW9kdWxlOiAke21vZC5pZH1gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcm9jZXNzaW5nIGltcG9ydHMgZm9yIG1vZHVsZVxuICAgICAgICBjb25zdCBpbXBvcnRlZE1vZHVsZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICAgIG1vZC5pbXBvcnRlZE1vZHVsZXM/LnZhbHVlcygpIGFzIEl0ZXJhYmxlPFxuICAgICAgICAgICAgTW9kdWxlTm9kZSB8IEVudmlyb25tZW50TW9kdWxlTm9kZVxuICAgICAgICAgID5cbiAgICAgICAgKTsgIFxuICAgICAgICBpZih2ZXJib3NlKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYEZvdW5kICR7aW1wb3J0ZWRNb2R1bGVzLmxlbmd0aH0gaW1wb3J0ZWQgbW9kdWxlc2ApO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvdW5kIGltcG9ydGVkIG1vZHVsZXNcbiAgICAgICAgZm9yIChjb25zdCBpbXBvcnRlZE1vZCBvZiBpbXBvcnRlZE1vZHVsZXMpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGltcG9ydGVkTW9kID09PSBcIm9iamVjdFwiICYmIGltcG9ydGVkTW9kICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgXCJpZFwiIGluIGltcG9ydGVkTW9kICYmXG4gICAgICAgICAgICAgIGltcG9ydGVkTW9kLmlkICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBpbXBvcnRlZE1vZC5pZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHdhbGtNb2R1bGUoaW1wb3J0ZWRNb2QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbXBvcnRlZCBtb2R1bGUgaGFzIG5vIGlkYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW1wb3J0ZWQgbW9kdWxlIGlzIG5vdCBhbiBvYmplY3RgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvY2Vzc2luZy5kZWxldGUobW9kLmlkKTtcbiAgICAgIHNlZW4uYWRkKG1vZC5pZCk7XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBpZih2ZXJib3NlKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBTdGFydGluZyBtb2R1bGUgd2Fsa2ApO1xuICAgICAgfVxuICAgICAgYXdhaXQgd2Fsa01vZHVsZShwYWdlTW9kdWxlKTtcbiAgICAgIGlmKHZlcmJvc2UpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYE1vZHVsZSB3YWxrIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYodmVyYm9zZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIGR1cmluZyBtb2R1bGUgd2FsazogJHsoZXJyb3IgYXMgRXJyb3IpPy5tZXNzYWdlID8/ICdubyBtZXNzYWdlJ31gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiZXJyb3JcIixcbiAgICAgICAgZXJyb3I6IGVycm9yIGFzIEVycm9yLFxuICAgICAgICBtZXRyaWNzOiB7XG4gICAgICAgICAgY3NzRmlsZXM6IGNzc0ZpbGVzLnNpemUsXG4gICAgICAgICAgcHJvY2Vzc2luZzogcHJvY2Vzc2luZy5zaXplLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgaWYodmVyYm9zZSkge1xuICAgICAgbG9nZ2VyLmluZm8oYENTUyBjb2xsZWN0aW9uIGNvbXBsZXRlZCwgZm91bmQgJHtjc3NGaWxlcy5zaXplfSBDU1MgZmlsZXNgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwic3VjY2Vzc1wiLFxuICAgICAgY3NzRmlsZXMsXG4gICAgICBtZXRyaWNzOiB7XG4gICAgICAgIGNzc0ZpbGVzOiBjc3NGaWxlcy5zaXplLFxuICAgICAgICBwcm9jZXNzaW5nOiBwcm9jZXNzaW5nLnNpemUsXG4gICAgICB9LFxuICAgIH07XG4gIH07XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFnRWEsTUFBQSx5QkFBQSxHQUNYLGVBQWUsMEJBQTJCLENBQUE7QUFBQSxFQUN4QyxXQUFBO0FBQUEsRUFDQSxLQUFBO0FBQUEsRUFDQSxTQUFBO0FBQUEsRUFDQTtBQUNGLENBQUcsRUFBQTtBQUNELEVBQU0sTUFBQTtBQUFBLElBQ0osUUFBQTtBQUFBLElBQ0EsYUFBQTtBQUFBLElBQ0EsY0FBQTtBQUFBLElBQ0EsY0FBQTtBQUFBLElBQ0EsV0FBQTtBQUFBLElBQ0EsWUFBQTtBQUFBLElBQ0EsR0FBQTtBQUFBLElBQ0EsTUFBQTtBQUFBLElBQ0EsVUFBQTtBQUFBLElBQ0E7QUFBQSxHQUNFLEdBQUEsY0FBQTtBQUNKLEVBQU0sTUFBQSxNQUFBLEdBQVMsY0FBZSxDQUFBLE1BQUEsSUFBVSxZQUFlLEVBQUE7QUFDdkQsRUFBTSxNQUFBLE9BQUEsR0FBVSxlQUFlLE9BQVcsSUFBQSxLQUFBO0FBQzFDLEVBQUEsSUFBRyxlQUFlLE9BQVMsRUFBQTtBQUN6QixJQUFPLE1BQUEsQ0FBQSxJQUFBLENBQUssQ0FBeUMsc0NBQUEsRUFBQSxRQUFRLENBQUUsQ0FBQSxDQUFBO0FBQUE7QUFHakUsRUFBQSxJQUFJLENBQUMsUUFBVSxFQUFBO0FBQ2IsSUFBQSxJQUFHLE9BQVMsRUFBQTtBQUNWLE1BQUEsTUFBQSxDQUFPLEtBQUssQ0FBdUIscUJBQUEsQ0FBQSxDQUFBO0FBQUE7QUFFckMsSUFB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