vite-plugin-react-server 1.4.2 → 1.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +48 -313
  2. package/dist/package.json +123 -13
  3. package/dist/plugin/bundle/deferredStaticGeneration.js +14 -39
  4. package/dist/plugin/bundle/manifests.js +30 -48
  5. package/dist/plugin/config/autoDiscover/resolveAutoDiscover.d.ts.map +1 -1
  6. package/dist/plugin/config/autoDiscover/resolveAutoDiscover.js +4 -1
  7. package/dist/plugin/config/envPrefixFromConfig.js +12 -7
  8. package/dist/plugin/config/getCondition.d.ts.map +1 -1
  9. package/dist/plugin/config/getCondition.js +7 -5
  10. package/dist/plugin/dev-server/virtualRscHmrPlugin.js +23 -23
  11. package/dist/plugin/environments/createBuildEventPlugin.js +88 -98
  12. package/dist/plugin/environments/createEnvironmentPlugin.js +222 -250
  13. package/dist/plugin/helpers/createRscRenderHelpers.js +33 -34
  14. package/dist/plugin/helpers/createSharedLoader.d.ts.map +1 -1
  15. package/dist/plugin/helpers/createSharedLoader.js +4 -2
  16. package/dist/plugin/helpers/headlessStreamReuseHandler.js +30 -22
  17. package/dist/plugin/helpers/headlessStreamState.js +15 -28
  18. package/dist/plugin/helpers/resolveComponent.d.ts.map +1 -1
  19. package/dist/plugin/helpers/resolveComponent.js +4 -2
  20. package/dist/plugin/index.client.d.ts +5 -0
  21. package/dist/plugin/index.client.d.ts.map +1 -0
  22. package/dist/plugin/index.client.js +4 -0
  23. package/dist/plugin/index.d.ts +4 -3
  24. package/dist/plugin/index.d.ts.map +1 -1
  25. package/dist/plugin/index.js +10 -5
  26. package/dist/plugin/index.server.d.ts +5 -0
  27. package/dist/plugin/index.server.d.ts.map +1 -0
  28. package/dist/plugin/index.server.js +4 -0
  29. package/dist/plugin/metrics/createWorkerStartupMetrics.js +31 -13
  30. package/dist/plugin/orchestrator/createPluginOrchestrator.client.js +41 -38
  31. package/dist/plugin/orchestrator/createPluginOrchestrator.server.js +43 -46
  32. package/dist/plugin/plugin.client.js +2 -2
  33. package/dist/plugin/plugin.server.js +2 -2
  34. package/dist/plugin/react-static/createBuildLoader.client.js +12 -6
  35. package/dist/plugin/react-static/createBuildLoader.server.js +255 -235
  36. package/dist/plugin/react-static/plugin.client.js +684 -770
  37. package/dist/plugin/react-static/plugin.server.js +517 -603
  38. package/dist/plugin/react-static/processCssFilesForPages.js +103 -88
  39. package/dist/plugin/react-static/renderPage.client.js +455 -529
  40. package/dist/plugin/react-static/renderPage.server.js +485 -508
  41. package/dist/plugin/react-static/renderPagesBatched.js +277 -275
  42. package/dist/plugin/react-static/rscToHtmlStream.client.js +48 -29
  43. package/dist/plugin/react-static/rscToHtmlStream.server.js +62 -37
  44. package/dist/plugin/react-static/temporaryReferences.server.js +11 -2
  45. package/dist/plugin/stream/createMainThreadHandlers.js +40 -31
  46. package/dist/plugin/stream/renderRscStream.server.d.ts.map +1 -1
  47. package/dist/plugin/stream/renderRscStream.server.js +127 -144
  48. package/dist/plugin/transformer/createTransformerPlugin.js +226 -265
  49. package/dist/plugin/utils/checkReactVersion.d.ts +7 -0
  50. package/dist/plugin/utils/checkReactVersion.d.ts.map +1 -0
  51. package/dist/plugin/utils/checkReactVersion.js +23 -0
  52. package/dist/plugin/utils/envUrls.node.js +12 -11
  53. package/dist/plugin/vendor/vendor-alias.js +84 -114
  54. package/dist/plugin/vendor/vendor.client.d.ts.map +1 -1
  55. package/dist/plugin/vendor/vendor.client.js +1 -3
  56. package/dist/plugin/worker/rsc/handleRscRender.d.ts.map +1 -1
  57. package/dist/plugin/worker/rsc/handleRscRender.js +3 -1
  58. package/dist/tsconfig.tsbuildinfo +1 -1
  59. package/package.json +123 -13
  60. package/plugin/config/autoDiscover/resolveAutoDiscover.ts +4 -0
  61. package/plugin/config/getCondition.ts +6 -4
  62. package/plugin/helpers/createRscRenderHelpers.ts +1 -1
  63. package/plugin/helpers/createSharedLoader.ts +6 -1
  64. package/plugin/helpers/resolveComponent.ts +6 -1
  65. package/plugin/index.client.ts +4 -0
  66. package/plugin/index.server.ts +4 -0
  67. package/plugin/index.ts +12 -5
  68. package/plugin/plugin.client.ts +1 -1
  69. package/plugin/plugin.server.ts +1 -1
  70. package/plugin/stream/renderRscStream.server.ts +3 -0
  71. package/plugin/utils/checkReactVersion.ts +28 -0
  72. package/plugin/vendor/vendor.client.ts +0 -2
  73. package/plugin/worker/rsc/handleRscRender.ts +2 -0
  74. package/scripts/generate-toc.mjs +27 -294
@@ -1,94 +1,109 @@
1
- import { collectManifestCss } from "../helpers/collectManifestCss.js";
2
- import { createUnifiedCssProcessor } from "../helpers/createUnifiedCssProcessor.js";
3
- import { join } from "node:path";
4
- export function processCssFilesForPages({ userOptions, autoDiscoveredFiles, staticManifest, serverManifest, bundle, logger, }) {
5
- const cssFilesByPage = new Map();
6
- // First collect global styles from index.html
7
- const indexHtmlCssInputs = collectManifestCss(staticManifest ?? {}, "index.html");
8
- const clientEntryCssInputs = userOptions.clientEntry
9
- ? collectManifestCss(staticManifest ?? {}, userOptions.clientEntry)
10
- : null;
11
- const globalCssInputs = {
12
- ...indexHtmlCssInputs,
13
- ...clientEntryCssInputs,
14
- };
15
- // transform the server manifest to include the css files from the static manifest
16
- // The server manifest needs CSS info for inlining or requesting .js modules for classnames
17
- const transformedServerManifest = Object.fromEntries(Object.entries(serverManifest ?? {}).map(([key, value]) => {
18
- const manifestEntry = value;
19
- // If it's a bundle entry, just use the file property directly
20
- if (manifestEntry.isEntry && manifestEntry.file) {
21
- // Find the corresponding static manifest entry by matching the file path
22
- for (const [, staticValue] of Object.entries(staticManifest ?? {})) {
23
- if (staticValue && typeof staticValue === 'object' && 'file' in staticValue) {
24
- if (staticValue.file === manifestEntry.file && staticValue.css?.length) {
25
- return [
26
- key,
27
- {
28
- ...manifestEntry,
29
- css: staticValue.css,
30
- },
31
- ];
32
- }
1
+ /**
2
+ * vite-plugin-react-server
3
+ * Copyright (c) Nico Brinkkemper
4
+ * MIT License
5
+ */
6
+ import { collectManifestCss } from '../helpers/collectManifestCss.js';
7
+ import { createUnifiedCssProcessor } from '../helpers/createUnifiedCssProcessor.js';
8
+ import { join } from 'node:path';
9
+
10
+ function processCssFilesForPages({
11
+ userOptions,
12
+ autoDiscoveredFiles,
13
+ staticManifest,
14
+ serverManifest,
15
+ bundle,
16
+ logger
17
+ }) {
18
+ const cssFilesByPage = /* @__PURE__ */ new Map();
19
+ const indexHtmlCssInputs = collectManifestCss(
20
+ staticManifest ?? {},
21
+ "index.html"
22
+ );
23
+ const clientEntryCssInputs = userOptions.clientEntry ? collectManifestCss(
24
+ staticManifest ?? {},
25
+ userOptions.clientEntry
26
+ ) : null;
27
+ const globalCssInputs = {
28
+ ...indexHtmlCssInputs,
29
+ ...clientEntryCssInputs
30
+ };
31
+ const transformedServerManifest = Object.fromEntries(
32
+ Object.entries(serverManifest ?? {}).map(([key, value]) => {
33
+ const manifestEntry = value;
34
+ if (manifestEntry.isEntry && manifestEntry.file) {
35
+ for (const [, staticValue] of Object.entries(staticManifest ?? {})) {
36
+ if (staticValue && typeof staticValue === "object" && "file" in staticValue) {
37
+ if (staticValue.file === manifestEntry.file && staticValue.css?.length) {
38
+ return [
39
+ key,
40
+ {
41
+ ...manifestEntry,
42
+ css: staticValue.css
33
43
  }
44
+ ];
34
45
  }
46
+ }
35
47
  }
36
- return [key, value];
37
- }));
38
- const globalCss = new Map();
39
- const { urlMap = new Map() } = autoDiscoveredFiles ?? {};
40
- // Create unified CSS processor
41
- const cssProcessor = createUnifiedCssProcessor({
42
- userOptions,
43
- logger,
44
- verbose: userOptions.verbose,
45
- staticOutDir: staticManifest ? join(userOptions.projectRoot || '', userOptions.build.outDir, userOptions.build.client) : undefined,
46
- staticManifest,
47
- bundle,
48
- });
49
- // Collect CSS files for each page and its props
50
- for (const [url, { page, props }] of urlMap) {
51
- if (userOptions.verbose) {
52
- logger.info(`[plugin.server] Processing route: ${url}, page: ${page}, props: ${props}`);
53
- }
54
- // Use the transformed server manifest which now includes CSS info from the static manifest
55
- // This allows the server to inline CSS or request .js modules for classnames
56
- if (userOptions.verbose) {
57
- logger.info(`[plugin.server] transformedServerManifest keys: ${Object.keys(transformedServerManifest).join(', ')}`);
58
- logger.info(`[plugin.server] Looking for CSS starting from: ${page} and ${props || 'none'}`);
59
- if (transformedServerManifest[page]) {
60
- logger.info(`[plugin.server] Page entry: ${JSON.stringify(transformedServerManifest[page], null, 2)}`);
61
- }
62
- if (props && transformedServerManifest[props]) {
63
- logger.info(`[plugin.server] Props entry: ${JSON.stringify(transformedServerManifest[props], null, 2)}`);
64
- }
65
- // Debug: Check what CSS entries exist in the transformed manifest
66
- for (const [key, value] of Object.entries(transformedServerManifest)) {
67
- if (value && typeof value === 'object' && 'css' in value && Array.isArray(value.css) && value.css.length > 0) {
68
- logger.info(`[plugin.server] Found CSS entry: ${key} -> ${JSON.stringify(value.css)}`);
69
- }
70
- }
71
- }
72
- const cssInputs = collectManifestCss(transformedServerManifest, props ? [page, props] : page);
73
- if (userOptions.verbose) {
74
- logger.info(`[plugin.server] CSS inputs for ${url}: ${Object.keys(cssInputs).length} files`);
75
- for (const [key, value] of Object.entries(cssInputs)) {
76
- logger.info(`[plugin.server] CSS input: ${key} -> ${value}`);
77
- }
78
- }
79
- // Process CSS files using unified CSS processor
80
- const pageCssMap = cssProcessor.processCssFromStaticBuild(cssInputs);
81
- // Add global styles if they exist
82
- if (Object.keys(globalCssInputs).length > 0) {
83
- const globalCssMap = cssProcessor.processCssFromStaticBuild(globalCssInputs);
84
- for (const [key, value] of globalCssMap.entries()) {
85
- globalCss.set(key, value);
86
- }
48
+ }
49
+ return [key, value];
50
+ })
51
+ );
52
+ const globalCss = /* @__PURE__ */ new Map();
53
+ const { urlMap = /* @__PURE__ */ new Map() } = autoDiscoveredFiles ?? {};
54
+ const cssProcessor = createUnifiedCssProcessor({
55
+ userOptions,
56
+ logger,
57
+ verbose: userOptions.verbose,
58
+ staticOutDir: staticManifest ? join(userOptions.projectRoot || "", userOptions.build.outDir, userOptions.build.client) : void 0,
59
+ staticManifest});
60
+ for (const [url, { page, props }] of urlMap) {
61
+ if (userOptions.verbose) {
62
+ logger.info(
63
+ `[plugin.server] Processing route: ${url}, page: ${page}, props: ${props}`
64
+ );
65
+ }
66
+ if (userOptions.verbose) {
67
+ logger.info(`[plugin.server] transformedServerManifest keys: ${Object.keys(transformedServerManifest).join(", ")}`);
68
+ logger.info(`[plugin.server] Looking for CSS starting from: ${page} and ${props || "none"}`);
69
+ if (transformedServerManifest[page]) {
70
+ logger.info(`[plugin.server] Page entry: ${JSON.stringify(transformedServerManifest[page], null, 2)}`);
71
+ }
72
+ if (props && transformedServerManifest[props]) {
73
+ logger.info(`[plugin.server] Props entry: ${JSON.stringify(transformedServerManifest[props], null, 2)}`);
74
+ }
75
+ for (const [key, value] of Object.entries(transformedServerManifest)) {
76
+ if (value && typeof value === "object" && "css" in value && Array.isArray(value.css) && value.css.length > 0) {
77
+ logger.info(`[plugin.server] Found CSS entry: ${key} -> ${JSON.stringify(value.css)}`);
87
78
  }
88
- cssFilesByPage.set(url, pageCssMap);
79
+ }
80
+ }
81
+ const cssInputs = collectManifestCss(
82
+ transformedServerManifest,
83
+ props ? [page, props] : page
84
+ );
85
+ if (userOptions.verbose) {
86
+ logger.info(
87
+ `[plugin.server] CSS inputs for ${url}: ${Object.keys(cssInputs).length} files`
88
+ );
89
+ for (const [key, value] of Object.entries(cssInputs)) {
90
+ logger.info(`[plugin.server] CSS input: ${key} -> ${value}`);
91
+ }
92
+ }
93
+ const pageCssMap = cssProcessor.processCssFromStaticBuild(cssInputs);
94
+ if (Object.keys(globalCssInputs).length > 0) {
95
+ const globalCssMap = cssProcessor.processCssFromStaticBuild(globalCssInputs);
96
+ for (const [key, value] of globalCssMap.entries()) {
97
+ globalCss.set(key, value);
98
+ }
89
99
  }
90
- return {
91
- cssFilesByPage,
92
- globalCss,
93
- };
100
+ cssFilesByPage.set(url, pageCssMap);
101
+ }
102
+ return {
103
+ cssFilesByPage,
104
+ globalCss
105
+ };
94
106
  }
107
+
108
+ export { processCssFilesForPages };
109
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzc0Nzc0ZpbGVzRm9yUGFnZXMuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BsdWdpbi9yZWFjdC1zdGF0aWMvcHJvY2Vzc0Nzc0ZpbGVzRm9yUGFnZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICBBdXRvRGlzY292ZXJlZEZpbGVzLFxuICBDc3NDb250ZW50LFxuICBSZXNvbHZlZFVzZXJPcHRpb25zLFxufSBmcm9tIFwiLi4vdHlwZXMuanNcIjtcbmltcG9ydCB0eXBlIHsgTG9nZ2VyLCBNYW5pZmVzdCB9IGZyb20gXCJ2aXRlXCI7XG5pbXBvcnQgeyBjb2xsZWN0TWFuaWZlc3RDc3MgfSBmcm9tIFwiLi4vaGVscGVycy9jb2xsZWN0TWFuaWZlc3RDc3MuanNcIjtcbmltcG9ydCB7IGNyZWF0ZVVuaWZpZWRDc3NQcm9jZXNzb3IgfSBmcm9tIFwiLi4vaGVscGVycy9jcmVhdGVVbmlmaWVkQ3NzUHJvY2Vzc29yLmpzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbnRlcmZhY2UgUHJvY2Vzc0Nzc0ZpbGVzRm9yUGFnZXNPcHRpb25zIHtcbiAgdXNlck9wdGlvbnM6IFJlc29sdmVkVXNlck9wdGlvbnM7XG4gIGF1dG9EaXNjb3ZlcmVkRmlsZXM6IEF1dG9EaXNjb3ZlcmVkRmlsZXMgfCBudWxsO1xuICBzdGF0aWNNYW5pZmVzdDogTWFuaWZlc3QgfCB1bmRlZmluZWQ7XG4gIHNlcnZlck1hbmlmZXN0OiBNYW5pZmVzdCB8IHVuZGVmaW5lZDtcbiAgYnVuZGxlOiBhbnk7XG4gIGxvZ2dlcjogTG9nZ2VyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0Nzc0ZpbGVzRm9yUGFnZXMoe1xuICB1c2VyT3B0aW9ucyxcbiAgYXV0b0Rpc2NvdmVyZWRGaWxlcyxcbiAgc3RhdGljTWFuaWZlc3QsXG4gIHNlcnZlck1hbmlmZXN0LFxuICBidW5kbGUsXG4gIGxvZ2dlcixcbn06IFByb2Nlc3NDc3NGaWxlc0ZvclBhZ2VzT3B0aW9ucyk6IHtcbiAgY3NzRmlsZXNCeVBhZ2U6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIENzc0NvbnRlbnQ+PjtcbiAgZ2xvYmFsQ3NzOiBNYXA8c3RyaW5nLCBDc3NDb250ZW50Pjtcbn0ge1xuICBjb25zdCBjc3NGaWxlc0J5UGFnZSA9IG5ldyBNYXAoKTtcblxuICAvLyBGaXJzdCBjb2xsZWN0IGdsb2JhbCBzdHlsZXMgZnJvbSBpbmRleC5odG1sXG4gIGNvbnN0IGluZGV4SHRtbENzc0lucHV0cyA9IGNvbGxlY3RNYW5pZmVzdENzcyhcbiAgICBzdGF0aWNNYW5pZmVzdCA/PyB7fSxcbiAgICBcImluZGV4Lmh0bWxcIlxuICApO1xuICBjb25zdCBjbGllbnRFbnRyeUNzc0lucHV0cyA9IHVzZXJPcHRpb25zLmNsaWVudEVudHJ5XG4gICAgPyBjb2xsZWN0TWFuaWZlc3RDc3MoXG4gICAgICAgIHN0YXRpY01hbmlmZXN0ID8/IHt9LFxuICAgICAgICB1c2VyT3B0aW9ucy5jbGllbnRFbnRyeVxuICAgICAgKVxuICAgIDogbnVsbDtcbiAgY29uc3QgZ2xvYmFsQ3NzSW5wdXRzID0ge1xuICAgIC4uLmluZGV4SHRtbENzc0lucHV0cyxcbiAgICAuLi5jbGllbnRFbnRyeUNzc0lucHV0cyxcbiAgfTtcblxuICAvLyB0cmFuc2Zvcm0gdGhlIHNlcnZlciBtYW5pZmVzdCB0byBpbmNsdWRlIHRoZSBjc3MgZmlsZXMgZnJvbSB0aGUgc3RhdGljIG1hbmlmZXN0XG4gIC8vIFRoZSBzZXJ2ZXIgbWFuaWZlc3QgbmVlZHMgQ1NTIGluZm8gZm9yIGlubGluaW5nIG9yIHJlcXVlc3RpbmcgLmpzIG1vZHVsZXMgZm9yIGNsYXNzbmFtZXNcbiAgY29uc3QgdHJhbnNmb3JtZWRTZXJ2ZXJNYW5pZmVzdCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhzZXJ2ZXJNYW5pZmVzdCA/PyB7fSkubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGNvbnN0IG1hbmlmZXN0RW50cnkgPSB2YWx1ZSBhcyBhbnk7XG4gICAgICBcbiAgICAgIC8vIElmIGl0J3MgYSBidW5kbGUgZW50cnksIGp1c3QgdXNlIHRoZSBmaWxlIHByb3BlcnR5IGRpcmVjdGx5XG4gICAgICBpZiAobWFuaWZlc3RFbnRyeS5pc0VudHJ5ICYmIG1hbmlmZXN0RW50cnkuZmlsZSkge1xuICAgICAgICAvLyBGaW5kIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRpYyBtYW5pZmVzdCBlbnRyeSBieSBtYXRjaGluZyB0aGUgZmlsZSBwYXRoXG4gICAgICAgIGZvciAoY29uc3QgWywgc3RhdGljVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHN0YXRpY01hbmlmZXN0ID8/IHt9KSkge1xuICAgICAgICAgIGlmIChzdGF0aWNWYWx1ZSAmJiB0eXBlb2Ygc3RhdGljVmFsdWUgPT09ICdvYmplY3QnICYmICdmaWxlJyBpbiBzdGF0aWNWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKHN0YXRpY1ZhbHVlLmZpbGUgPT09IG1hbmlmZXN0RW50cnkuZmlsZSAmJiBzdGF0aWNWYWx1ZS5jc3M/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAuLi5tYW5pZmVzdEVudHJ5LFxuICAgICAgICAgICAgICAgICAgY3NzOiBzdGF0aWNWYWx1ZS5jc3MsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIFtrZXksIHZhbHVlXTtcbiAgICB9KVxuICApO1xuICBjb25zdCBnbG9iYWxDc3MgPSBuZXcgTWFwKCk7XG4gIGNvbnN0IHsgdXJsTWFwID0gbmV3IE1hcCgpIH0gPSBhdXRvRGlzY292ZXJlZEZpbGVzID8/IHt9O1xuXG4gIC8vIENyZWF0ZSB1bmlmaWVkIENTUyBwcm9jZXNzb3JcbiAgY29uc3QgY3NzUHJvY2Vzc29yID0gY3JlYXRlVW5pZmllZENzc1Byb2Nlc3Nvcih7XG4gICAgdXNlck9wdGlvbnMsXG4gICAgbG9nZ2VyLFxuICAgIHZlcmJvc2U6IHVzZXJPcHRpb25zLnZlcmJvc2UsXG4gICAgc3RhdGljT3V0RGlyOiBzdGF0aWNNYW5pZmVzdCA/IGpvaW4odXNlck9wdGlvbnMucHJvamVjdFJvb3QgfHwgJycsIHVzZXJPcHRpb25zLmJ1aWxkLm91dERpciwgdXNlck9wdGlvbnMuYnVpbGQuY2xpZW50KSA6IHVuZGVmaW5lZCxcbiAgICBzdGF0aWNNYW5pZmVzdCxcbiAgICBidW5kbGUsXG4gIH0pO1xuXG4gIC8vIENvbGxlY3QgQ1NTIGZpbGVzIGZvciBlYWNoIHBhZ2UgYW5kIGl0cyBwcm9wc1xuICBmb3IgKGNvbnN0IFt1cmwsIHsgcGFnZSwgcHJvcHMgfV0gb2YgdXJsTWFwKSB7XG4gICAgaWYgKHVzZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgW3BsdWdpbi5zZXJ2ZXJdIFByb2Nlc3Npbmcgcm91dGU6ICR7dXJsfSwgcGFnZTogJHtwYWdlfSwgcHJvcHM6ICR7cHJvcHN9YFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gVXNlIHRoZSB0cmFuc2Zvcm1lZCBzZXJ2ZXIgbWFuaWZlc3Qgd2hpY2ggbm93IGluY2x1ZGVzIENTUyBpbmZvIGZyb20gdGhlIHN0YXRpYyBtYW5pZmVzdFxuICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBzZXJ2ZXIgdG8gaW5saW5lIENTUyBvciByZXF1ZXN0IC5qcyBtb2R1bGVzIGZvciBjbGFzc25hbWVzXG4gICAgaWYgKHVzZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBbcGx1Z2luLnNlcnZlcl0gdHJhbnNmb3JtZWRTZXJ2ZXJNYW5pZmVzdCBrZXlzOiAke09iamVjdC5rZXlzKHRyYW5zZm9ybWVkU2VydmVyTWFuaWZlc3QpLmpvaW4oJywgJyl9YCk7XG4gICAgICBsb2dnZXIuaW5mbyhgW3BsdWdpbi5zZXJ2ZXJdIExvb2tpbmcgZm9yIENTUyBzdGFydGluZyBmcm9tOiAke3BhZ2V9IGFuZCAke3Byb3BzIHx8ICdub25lJ31gKTtcbiAgICAgIGlmICh0cmFuc2Zvcm1lZFNlcnZlck1hbmlmZXN0W3BhZ2VdKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbcGx1Z2luLnNlcnZlcl0gUGFnZSBlbnRyeTogJHtKU09OLnN0cmluZ2lmeSh0cmFuc2Zvcm1lZFNlcnZlck1hbmlmZXN0W3BhZ2VdLCBudWxsLCAyKX1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcyAmJiB0cmFuc2Zvcm1lZFNlcnZlck1hbmlmZXN0W3Byb3BzXSkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgW3BsdWdpbi5zZXJ2ZXJdIFByb3BzIGVudHJ5OiAke0pTT04uc3RyaW5naWZ5KHRyYW5zZm9ybWVkU2VydmVyTWFuaWZlc3RbcHJvcHNdLCBudWxsLCAyKX1gKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRGVidWc6IENoZWNrIHdoYXQgQ1NTIGVudHJpZXMgZXhpc3QgaW4gdGhlIHRyYW5zZm9ybWVkIG1hbmlmZXN0XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0cmFuc2Zvcm1lZFNlcnZlck1hbmlmZXN0KSkge1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAnY3NzJyBpbiB2YWx1ZSAmJiBBcnJheS5pc0FycmF5KHZhbHVlLmNzcykgJiYgdmFsdWUuY3NzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgW3BsdWdpbi5zZXJ2ZXJdIEZvdW5kIENTUyBlbnRyeTogJHtrZXl9IC0+ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUuY3NzKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBjb25zdCBjc3NJbnB1dHMgPSBjb2xsZWN0TWFuaWZlc3RDc3MoXG4gICAgICB0cmFuc2Zvcm1lZFNlcnZlck1hbmlmZXN0LFxuICAgICAgcHJvcHMgPyBbcGFnZSwgcHJvcHNdIDogcGFnZVxuICAgICk7XG4gICAgaWYgKHVzZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgW3BsdWdpbi5zZXJ2ZXJdIENTUyBpbnB1dHMgZm9yICR7dXJsfTogJHtcbiAgICAgICAgICBPYmplY3Qua2V5cyhjc3NJbnB1dHMpLmxlbmd0aFxuICAgICAgICB9IGZpbGVzYFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNzc0lucHV0cykpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtwbHVnaW4uc2VydmVyXSBDU1MgaW5wdXQ6ICR7a2V5fSAtPiAke3ZhbHVlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgQ1NTIGZpbGVzIHVzaW5nIHVuaWZpZWQgQ1NTIHByb2Nlc3NvclxuICAgIGNvbnN0IHBhZ2VDc3NNYXAgPSBjc3NQcm9jZXNzb3IucHJvY2Vzc0Nzc0Zyb21TdGF0aWNCdWlsZChjc3NJbnB1dHMpO1xuXG4gICAgLy8gQWRkIGdsb2JhbCBzdHlsZXMgaWYgdGhleSBleGlzdFxuICAgIGlmIChPYmplY3Qua2V5cyhnbG9iYWxDc3NJbnB1dHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGdsb2JhbENzc01hcCA9IGNzc1Byb2Nlc3Nvci5wcm9jZXNzQ3NzRnJvbVN0YXRpY0J1aWxkKGdsb2JhbENzc0lucHV0cyk7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBnbG9iYWxDc3NNYXAuZW50cmllcygpKSB7XG4gICAgICAgIGdsb2JhbENzcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNzc0ZpbGVzQnlQYWdlLnNldCh1cmwsIHBhZ2VDc3NNYXApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBj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