vite-plugin-react-server 1.3.6 → 1.4.0

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 (48) hide show
  1. package/README.md +32 -18
  2. package/dist/package.json +4 -2
  3. package/dist/plugin/config/resolveOptions.d.ts.map +1 -1
  4. package/dist/plugin/config/resolveOptions.js +4 -2
  5. package/dist/plugin/dev-server/plugin.client.d.ts.map +1 -1
  6. package/dist/plugin/dev-server/plugin.client.js +13 -3
  7. package/dist/plugin/dev-server/plugin.server.d.ts.map +1 -1
  8. package/dist/plugin/dev-server/plugin.server.js +54 -4
  9. package/dist/plugin/react-static/plugin.server.d.ts.map +1 -1
  10. package/dist/plugin/react-static/plugin.server.js +9 -1
  11. package/dist/plugin/react-static/renderPagesBatched.d.ts.map +1 -1
  12. package/dist/plugin/react-static/renderPagesBatched.js +136 -36
  13. package/dist/plugin/react-static/types.d.ts +1 -0
  14. package/dist/plugin/react-static/types.d.ts.map +1 -1
  15. package/dist/plugin/types.d.ts +15 -0
  16. package/dist/plugin/types.d.ts.map +1 -1
  17. package/dist/plugin/utils/createReactFetcher.js +24 -2
  18. package/dist/plugin/utils/useRscHmr.js +10 -2
  19. package/dist/plugin/vendor/register-vendor.js +1 -1
  20. package/dist/plugin/vendor/vendor-alias.d.ts +5 -2
  21. package/dist/plugin/vendor/vendor-alias.d.ts.map +1 -1
  22. package/dist/plugin/vendor/vendor-alias.js +60 -26
  23. package/dist/plugin/vendor/vendor.server.d.ts.map +1 -1
  24. package/dist/plugin/vendor/vendor.server.js +2 -2
  25. package/dist/plugin/vendor/vendor.static.d.ts.map +1 -1
  26. package/dist/plugin/vendor/vendor.static.js +2 -2
  27. package/dist/tsconfig.tsbuildinfo +1 -1
  28. package/oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +1 -1
  29. package/oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js +1 -1
  30. package/oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +1 -1
  31. package/oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js +1 -1
  32. package/oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +1 -1
  33. package/oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js +1 -1
  34. package/oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +1 -1
  35. package/oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js +1 -1
  36. package/oss-experimental/react-server-dom-esm/package.json +3 -3
  37. package/package.json +4 -2
  38. package/plugin/config/resolveOptions.ts +2 -0
  39. package/plugin/dev-server/plugin.client.ts +13 -2
  40. package/plugin/dev-server/plugin.server.ts +71 -4
  41. package/plugin/react-static/plugin.server.ts +11 -1
  42. package/plugin/react-static/renderPagesBatched.ts +148 -39
  43. package/plugin/react-static/types.ts +1 -0
  44. package/plugin/types.ts +15 -0
  45. package/plugin/vendor/register-vendor.ts +1 -1
  46. package/plugin/vendor/vendor-alias.ts +61 -39
  47. package/plugin/vendor/vendor.server.ts +3 -3
  48. package/plugin/vendor/vendor.static.ts +3 -2
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import { configureReactServer } from './configureReactServer.server.js';
7
7
  import { resolveOptions } from '../config/resolveOptions.js';
8
+ import { readFileSync } from 'node:fs';
8
9
 
9
10
  const vitePluginReactDevServer = function _vitePluginReactServerDevServer(options) {
10
11
  if (options == null) {
@@ -22,13 +23,59 @@ const vitePluginReactDevServer = function _vitePluginReactServerDevServer(option
22
23
  name: "vite-plugin-react-server:server-hmr",
23
24
  apply: "serve",
24
25
  // Server-level handleHotUpdate — sends custom WS event to client
26
+ // Vite 6 Environment API: hotUpdate runs per-environment.
27
+ // Prevent server/ssr environments from triggering page reload for client components.
28
+ hotUpdate(ctx) {
29
+ const { file, server } = ctx;
30
+ const envName = ctx.environment?.name ?? "unknown";
31
+ const moduleBase = userOptions.moduleBase || "src";
32
+ const projectRoot = userOptions.projectRoot || server?.config?.root || "";
33
+ const normalizedFile = file.replace(projectRoot, "").replace(/^\/+/, "");
34
+ const isSourceFile = normalizedFile.startsWith(moduleBase + "/");
35
+ if (!isSourceFile) return;
36
+ if (envName === "client") {
37
+ const isClient = (file.endsWith(".tsx") || file.endsWith(".ts") || file.endsWith(".jsx") || file.endsWith(".js")) && (() => {
38
+ try {
39
+ const head = readFileSync(file, "utf-8").slice(0, 200);
40
+ return /^\s*["']use client["']/.test(head.split("\n")[0]);
41
+ } catch {
42
+ return false;
43
+ }
44
+ })();
45
+ if (isClient) return;
46
+ server.config.logger.info(`[vite-plugin-react-server] File changed (RSC refetch): ${normalizedFile}`);
47
+ server.ws.send({
48
+ type: "custom",
49
+ event: "vite-plugin-react-server:server-component-update",
50
+ data: { file: normalizedFile, path: file }
51
+ });
52
+ return [];
53
+ }
54
+ if (envName === "server") {
55
+ const mod = ctx.environment?.moduleGraph?.getModulesByFile(file);
56
+ if (mod) {
57
+ for (const m of mod) {
58
+ ctx.environment.moduleGraph.invalidateModule(m);
59
+ }
60
+ }
61
+ }
62
+ return [];
63
+ },
25
64
  handleHotUpdate({ file, server }) {
26
65
  const moduleBase = userOptions.moduleBase || "src";
27
66
  const projectRoot = userOptions.projectRoot || server.config.root;
28
67
  const normalizedFile = file.replace(projectRoot, "").replace(/^\/+/, "");
29
- const isServerFile = normalizedFile.startsWith(moduleBase + "/") && (file.endsWith(".tsx") || file.endsWith(".ts") || file.endsWith(".jsx") || file.endsWith(".js"));
30
- if (isServerFile) {
31
- server.config.logger.info(`[vite-plugin-react-server] Server component changed: ${normalizedFile}`);
68
+ const isSourceFile = normalizedFile.startsWith(moduleBase + "/") && (file.endsWith(".tsx") || file.endsWith(".ts") || file.endsWith(".jsx") || file.endsWith(".js"));
69
+ const isClientFile = isSourceFile && (() => {
70
+ try {
71
+ const head = readFileSync(file, "utf-8").slice(0, 200);
72
+ return /^\s*["']use client["']/.test(head.split("\n")[0]);
73
+ } catch {
74
+ return false;
75
+ }
76
+ })();
77
+ if (isSourceFile && !isClientFile) {
78
+ server.config.logger.info(`[vite-plugin-react-server] File changed (RSC refetch): ${normalizedFile}`);
32
79
  server.ws.send({
33
80
  type: "custom",
34
81
  event: "vite-plugin-react-server:server-component-update",
@@ -45,6 +92,9 @@ const vitePluginReactDevServer = function _vitePluginReactServerDevServer(option
45
92
  }
46
93
  return [];
47
94
  }
95
+ if (isClientFile) {
96
+ return [];
97
+ }
48
98
  }
49
99
  };
50
100
  const serverPlugin = {
@@ -105,4 +155,4 @@ const vitePluginReactDevServer = function _vitePluginReactServerDevServer(option
105
155
  };
106
156
 
107
157
  export { vitePluginReactDevServer };
108
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLnNlcnZlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL2Rldi1zZXJ2ZXIvcGx1Z2luLnNlcnZlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFN0cmVhbVBsdWdpbk9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMuanNcIjtcbmltcG9ydCB7IGNvbmZpZ3VyZVJlYWN0U2VydmVyIH0gZnJvbSBcIi4vY29uZmlndXJlUmVhY3RTZXJ2ZXIuc2VydmVyLmpzXCI7XG5pbXBvcnQgeyByZXNvbHZlT3B0aW9ucyB9IGZyb20gXCIuLi9jb25maWcvcmVzb2x2ZU9wdGlvbnMuanNcIjtcbmltcG9ydCB0eXBlIHsgUGx1Z2luLCBWaXRlRGV2U2VydmVyIH0gZnJvbSBcInZpdGVcIjtcblxuLyoqXG4gKiBEZXYgc2VydmVyIHBsdWdpbiBmb3Igc2VydmVyIGVudmlyb25tZW50LlxuICogUmV0dXJucyB0d28gcGx1Z2luczogb25lIGZvciBITVIgaGFuZGxpbmcgKGFsbCBlbnZpcm9ubWVudHMpIGFuZCBvbmUgZm9yIHNlcnZlciBjb25maWcuXG4gKi9cbmV4cG9ydCBjb25zdCB2aXRlUGx1Z2luUmVhY3REZXZTZXJ2ZXIgPSBmdW5jdGlvbiBfdml0ZVBsdWdpblJlYWN0U2VydmVyRGV2U2VydmVyKG9wdGlvbnM6IFN0cmVhbVBsdWdpbk9wdGlvbnMpOiBQbHVnaW5bXSB7XG4gIGlmIChvcHRpb25zID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zIGlzIHJlcXVpcmVkXCIpO1xuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRPcHRpb25zID0gcmVzb2x2ZU9wdGlvbnMob3B0aW9ucyk7XG4gIGlmIChyZXNvbHZlZE9wdGlvbnMudHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgaWYgKHJlc29sdmVkT3B0aW9ucy5lcnJvciAhPSBudWxsKSB7XG4gICAgICB0aHJvdyByZXNvbHZlZE9wdGlvbnMuZXJyb3I7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byByZXNvbHZlIG9wdGlvbnNcIik7XG4gIH1cbiAgY29uc3QgdXNlck9wdGlvbnMgPSByZXNvbHZlZE9wdGlvbnMudXNlck9wdGlvbnM7XG5cbiAgLy8gU2VwYXJhdGUgcGx1Z2luIGZvciBITVIgaGFuZGxpbmcgKG11c3QgYXBwbHkgdG8gYWxsIGVudmlyb25tZW50cylcbiAgY29uc3QgaG1yUGx1Z2luID0ge1xuICAgIG5hbWU6IFwidml0ZS1wbHVnaW4tcmVhY3Qtc2VydmVyOnNlcnZlci1obXJcIixcbiAgICBhcHBseTogXCJzZXJ2ZVwiIGFzIGNvbnN0LFxuICAgIC8vIFNlcnZlci1sZXZlbCBoYW5kbGVIb3RVcGRhdGUg4oCUIHNlbmRzIGN1c3RvbSBXUyBldmVudCB0byBjbGllbnRcbiAgICBoYW5kbGVIb3RVcGRhdGUoeyBmaWxlLCBzZXJ2ZXIgfTogeyBmaWxlOiBzdHJpbmc7IHNlcnZlcjogVml0ZURldlNlcnZlciB9KSB7XG4gICAgICBjb25zdCBtb2R1bGVCYXNlID0gdXNlck9wdGlvbnMubW9kdWxlQmFzZSB8fCBcInNyY1wiO1xuICAgICAgY29uc3QgcHJvamVjdFJvb3QgPSB1c2VyT3B0aW9ucy5wcm9qZWN0Um9vdCB8fCBzZXJ2ZXIuY29uZmlnLnJvb3Q7XG4gICAgICBjb25zdCBub3JtYWxpemVkRmlsZSA9IGZpbGUucmVwbGFjZShwcm9qZWN0Um9vdCwgJycpLnJlcGxhY2UoL15cXC8rLywgJycpO1xuICAgICAgY29uc3QgaXNTZXJ2ZXJGaWxlID0gbm9ybWFsaXplZEZpbGUuc3RhcnRzV2l0aChtb2R1bGVCYXNlICsgJy8nKSAmJiBcbiAgICAgICAgKGZpbGUuZW5kc1dpdGgoJy50c3gnKSB8fCBmaWxlLmVuZHNXaXRoKCcudHMnKSB8fCBmaWxlLmVuZHNXaXRoKCcuanN4JykgfHwgZmlsZS5lbmRzV2l0aCgnLmpzJykpO1xuICAgICAgXG4gICAgICBpZiAoaXNTZXJ2ZXJGaWxlKSB7XG4gICAgICAgIHNlcnZlci5jb25maWcubG9nZ2VyLmluZm8oYFt2aXRlLXBsdWdpbi1yZWFjdC1zZXJ2ZXJdIFNlcnZlciBjb21wb25lbnQgY2hhbmdlZDogJHtub3JtYWxpemVkRmlsZX1gKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFNlbmQgY3VzdG9tIEhNUiBldmVudCBzbyBjbGllbnQgY2FuIHJlZmV0Y2ggUlNDIHN0cmVhbVxuICAgICAgICBzZXJ2ZXIud3Muc2VuZCh7XG4gICAgICAgICAgdHlwZTogJ2N1c3RvbScsXG4gICAgICAgICAgZXZlbnQ6ICd2aXRlLXBsdWdpbi1yZWFjdC1zZXJ2ZXI6c2VydmVyLWNvbXBvbmVudC11cGRhdGUnLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGZpbGU6IG5vcm1hbGl6ZWRGaWxlLFxuICAgICAgICAgICAgcGF0aDogZmlsZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIEludmFsaWRhdGUgdGhlIHNlcnZlciBtb2R1bGUgc28gbmV4dCByZXF1ZXN0IGdldHMgZnJlc2ggY29udGVudFxuICAgICAgICBjb25zdCBtb2QgPSBzZXJ2ZXIuZW52aXJvbm1lbnRzWydzZXJ2ZXInXT8ubW9kdWxlR3JhcGg/LmdldE1vZHVsZXNCeUZpbGUoZmlsZSk7XG4gICAgICAgIGlmIChtb2QpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG0gb2YgbW9kKSB7XG4gICAgICAgICAgICBzZXJ2ZXIuZW52aXJvbm1lbnRzWydzZXJ2ZXInXT8ubW9kdWxlR3JhcGg/LmludmFsaWRhdGVNb2R1bGUobSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBSZXR1cm4gZW1wdHkgYXJyYXkgdG8gcHJldmVudCBWaXRlJ3MgZGVmYXVsdCBmdWxsLXBhZ2UgcmVsb2FkXG4gICAgICAgIC8vIFRoZSBjbGllbnQgd2lsbCByZWZldGNoIHRoZSBSU0Mgc3RyZWFtIHZpYSB0aGUgY3VzdG9tIGV2ZW50XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IHNlcnZlclBsdWdpbiA9IHtcbiAgICBuYW1lOiBcInZpdGUtcGx1Z2luLXJlYWN0LXNlcnZlcjpkZXYtc2VydmVyLXNlcnZlclwiLFxuICAgIGFwcGx5OiBcInNlcnZlXCIgYXMgY29uc3QsXG4gICAgYXBwbHlUb0Vudmlyb25tZW50KHBhcnRpYWxFbnZpcm9ubWVudDogYW55KSB7XG4gICAgICByZXR1cm4gcGFydGlhbEVudmlyb25tZW50Py5jb25zdW1lciA9PT0gJ3NlcnZlcic7XG4gICAgfSxcbiAgICBjb25maWd1cmVTZXJ2ZXIoc2VydmVyOiBWaXRlRGV2U2VydmVyKSB7XG4gICAgICAvLyBMb2cgdGhhdCBwbHVnaW4gaXMgYmVpbmcgY29uZmlndXJlZFxuICAgICAgc2VydmVyLmNvbmZpZy5sb2dnZXIuaW5mbyhgW3ZpdGUtcGx1Z2luLXJlYWN0LXNlcnZlcl0gRGV2IHNlcnZlciBwbHVnaW4gY29uZmlndXJlZCBmb3Igc2VydmVyIGVudmlyb25tZW50IChyZWFjdC1zZXJ2ZXIgY29uZGl0aW9uKWApO1xuICAgICAgXG4gICAgICAvLyBDb25maWd1cmUgdGhlIFJlYWN0IHNlcnZlciBmb3Igc2VydmVyIGVudmlyb25tZW50IChkaXJlY3QgUlNDIHByb2Nlc3NpbmcpXG4gICAgICAvLyBUaGlzIHVzZXMgdGhlIGV4aXN0aW5nIGNvbmZpZ3VyZVJlYWN0U2VydmVyLnNlcnZlci5qcyBpbXBsZW1lbnRhdGlvblxuICAgICAgY29uZmlndXJlUmVhY3RTZXJ2ZXIoe1xuICAgICAgICBzZXJ2ZXIsXG4gICAgICAgIGF1dG9EaXNjb3ZlcmVkRmlsZXM6IHtcbiAgICAgICAgICBwcm9wc01hcDogbmV3IE1hcCgpLFxuICAgICAgICAgIHBhZ2VNYXA6IG5ldyBNYXAoKSxcbiAgICAgICAgICByb290TWFwOiBuZXcgTWFwKCksXG4gICAgICAgICAgaHRtbE1hcDogbmV3IE1hcCgpLFxuICAgICAgICAgIHJvdXRlTWFwOiBuZXcgTWFwKCksXG4gICAgICAgICAgdXJsTWFwOiBuZXcgTWFwKCksXG4gICAgICAgICAgZXJyb3JzOiBbXSxcbiAgICAgICAgICB3b3JrZXJQYXRoczoge30sXG4gICAgICAgICAgc2VydmVyRW50cnk6IG51bGwsXG4gICAgICAgICAgY2xpZW50RW50cnk6IHt9LFxuICAgICAgICAgIGNsaWVudElucHV0czoge30sXG4gICAgICAgICAgc3RhdGljSW5wdXRzOiB7fSxcbiAgICAgICAgICBzZXJ2ZXJJbnB1dHM6IHt9LFxuICAgICAgICAgIC8vIHN0YXRpY01hbmlmZXN0IHJlbW92ZWQgZnJvbSBBdXRvRGlzY292ZXJlZEZpbGVzXG4gICAgICAgICAgc2VydmVyQWN0aW9uczoge30sXG4gICAgICAgIH0sXG4gICAgICAgIHVzZXJPcHRpb25zLFxuICAgICAgICBzZXJ2ZXJNYW5pZmVzdDoge30sXG4gICAgICAgIHJlc29sdmVkQ29uZmlnOiBzZXJ2ZXIuY29uZmlnLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcblxuICAvLyBGaXggQ0pTIG5hbWVkIGltcG9ydHMgaW4gc2VydmVyIGVudmlyb25tZW50LlxuICAvLyBWaXRlJ3MgZXNidWlsZCBKU1ggdHJhbnNmb3JtIChhbmQgQHZpdGVqcy9wbHVnaW4tcmVhY3QgaWYgcHJlc2VudCkgZ2VuZXJhdGVzXG4gIC8vIG5hbWVkIGltcG9ydHMgbGlrZSBgaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCJgLiBJbiB0aGUgc2VydmVyIGVudmlyb25tZW50LFxuICAvLyByZWFjdCdzIHJlYWN0LXNlcnZlciBleHBvcnQgaXMgQ0pTLW9ubHksIGFuZCBOb2RlJ3MgRVNNIGludGVyb3AgZG9lc24ndCBzdXBwb3J0XG4gIC8vIG5hbWVkIGV4cG9ydHMgZnJvbSBDSlMuIFRoaXMgcG9zdC10cmFuc2Zvcm0gcmV3cml0ZXMgdGhlbS5cbiAgY29uc3QgY2pzRml4UGx1Z2luOiBQbHVnaW4gPSB7XG4gICAgbmFtZTogXCJ2aXRlLXBsdWdpbi1yZWFjdC1zZXJ2ZXI6c2VydmVyLWNqcy1maXhcIixcbiAgICBhcHBseTogXCJzZXJ2ZVwiIGFzIGNvbnN0LFxuICAgIGVuZm9yY2U6IFwicG9zdFwiIGFzIGNvbnN0LFxuICAgIGFwcGx5VG9FbnZpcm9ubWVudChlbnY6IGFueSkge1xuICAgICAgcmV0dXJuIGVudj8ubmFtZSA9PT0gJ3NlcnZlcic7XG4gICAgfSxcbiAgICB0cmFuc2Zvcm0oY29kZTogc3RyaW5nLCBpZDogc3RyaW5nKSB7XG4gICAgICBpZiAoaWQuaW5jbHVkZXMoJ25vZGVfbW9kdWxlcycpKSByZXR1cm47XG4gICAgICBpZiAoIWlkLm1hdGNoKC9cXC5banRdc3g/JC8pKSByZXR1cm47XG4gICAgICBcbiAgICAgIGNvbnN0IG5hbWVkSW1wb3J0UmUgPSAvaW1wb3J0XFxzKlxceyhbXn1dKylcXH1cXHMqZnJvbVxccypbXCInXXJlYWN0W1wiJ11cXHMqOz8vZztcbiAgICAgIGlmICghbmFtZWRJbXBvcnRSZS50ZXN0KGNvZGUpKSByZXR1cm47XG4gICAgICBcbiAgICAgIG5hbWVkSW1wb3J0UmUubGFzdEluZGV4ID0gMDtcbiAgICAgIGxldCBjb3VudGVyID0gMDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvZGUucmVwbGFjZShuYW1lZEltcG9ydFJlLCAoX21hdGNoLCBpbXBvcnRzKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsaWFzID0gYF9fcmVhY3RfY2pzXyR7Y291bnRlcisrfWA7XG4gICAgICAgIHJldHVybiBgaW1wb3J0ICR7YWxpYXN9IGZyb20gXCJyZWFjdFwiOyBjb25zdCB7JHtpbXBvcnRzfX0gPSAke2FsaWFzfTtgO1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7IGNvZGU6IHJlc3VsdCwgbWFwOiBudWxsIH07XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gW2htclBsdWdpbiwgY2pzRml4UGx1Z2luLCBzZXJ2ZXJQbHVnaW5dO1xufTtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVNhLE1B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
158
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLnNlcnZlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL2Rldi1zZXJ2ZXIvcGx1Z2luLnNlcnZlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFN0cmVhbVBsdWdpbk9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMuanNcIjtcbmltcG9ydCB7IGNvbmZpZ3VyZVJlYWN0U2VydmVyIH0gZnJvbSBcIi4vY29uZmlndXJlUmVhY3RTZXJ2ZXIuc2VydmVyLmpzXCI7XG5pbXBvcnQgeyByZXNvbHZlT3B0aW9ucyB9IGZyb20gXCIuLi9jb25maWcvcmVzb2x2ZU9wdGlvbnMuanNcIjtcbmltcG9ydCB0eXBlIHsgUGx1Z2luLCBWaXRlRGV2U2VydmVyIH0gZnJvbSBcInZpdGVcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5cbi8qKlxuICogRGV2IHNlcnZlciBwbHVnaW4gZm9yIHNlcnZlciBlbnZpcm9ubWVudC5cbiAqIFJldHVybnMgdHdvIHBsdWdpbnM6IG9uZSBmb3IgSE1SIGhhbmRsaW5nIChhbGwgZW52aXJvbm1lbnRzKSBhbmQgb25lIGZvciBzZXJ2ZXIgY29uZmlnLlxuICovXG5leHBvcnQgY29uc3Qgdml0ZVBsdWdpblJlYWN0RGV2U2VydmVyID0gZnVuY3Rpb24gX3ZpdGVQbHVnaW5SZWFjdFNlcnZlckRldlNlcnZlcihvcHRpb25zOiBTdHJlYW1QbHVnaW5PcHRpb25zKTogUGx1Z2luW10ge1xuICBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwib3B0aW9ucyBpcyByZXF1aXJlZFwiKTtcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkT3B0aW9ucyA9IHJlc29sdmVPcHRpb25zKG9wdGlvbnMpO1xuICBpZiAocmVzb2x2ZWRPcHRpb25zLnR5cGUgPT09IFwiZXJyb3JcIikge1xuICAgIGlmIChyZXNvbHZlZE9wdGlvbnMuZXJyb3IgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgcmVzb2x2ZWRPcHRpb25zLmVycm9yO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcmVzb2x2ZSBvcHRpb25zXCIpO1xuICB9XG4gIGNvbnN0IHVzZXJPcHRpb25zID0gcmVzb2x2ZWRPcHRpb25zLnVzZXJPcHRpb25zO1xuXG4gIC8vIFNlcGFyYXRlIHBsdWdpbiBmb3IgSE1SIGhhbmRsaW5nIChtdXN0IGFwcGx5IHRvIGFsbCBlbnZpcm9ubWVudHMpXG4gIGNvbnN0IGhtclBsdWdpbiA9IHtcbiAgICBuYW1lOiBcInZpdGUtcGx1Z2luLXJlYWN0LXNlcnZlcjpzZXJ2ZXItaG1yXCIsXG4gICAgYXBwbHk6IFwic2VydmVcIiBhcyBjb25zdCxcbiAgICAvLyBTZXJ2ZXItbGV2ZWwgaGFuZGxlSG90VXBkYXRlIOKAlCBzZW5kcyBjdXN0b20gV1MgZXZlbnQgdG8gY2xpZW50XG4gICAgLy8gVml0ZSA2IEVudmlyb25tZW50IEFQSTogaG90VXBkYXRlIHJ1bnMgcGVyLWVudmlyb25tZW50LlxuICAgIC8vIFByZXZlbnQgc2VydmVyL3NzciBlbnZpcm9ubWVudHMgZnJvbSB0cmlnZ2VyaW5nIHBhZ2UgcmVsb2FkIGZvciBjbGllbnQgY29tcG9uZW50cy5cbiAgICBob3RVcGRhdGUoY3R4OiBhbnkpIHtcbiAgICAgIGNvbnN0IHsgZmlsZSwgc2VydmVyIH0gPSBjdHg7XG4gICAgICBjb25zdCBlbnZOYW1lID0gY3R4LmVudmlyb25tZW50Py5uYW1lID8/ICd1bmtub3duJztcbiAgICAgIFxuICAgICAgY29uc3QgbW9kdWxlQmFzZSA9IHVzZXJPcHRpb25zLm1vZHVsZUJhc2UgfHwgXCJzcmNcIjtcbiAgICAgIGNvbnN0IHByb2plY3RSb290ID0gdXNlck9wdGlvbnMucHJvamVjdFJvb3QgfHwgc2VydmVyPy5jb25maWc/LnJvb3QgfHwgJyc7XG4gICAgICBjb25zdCBub3JtYWxpemVkRmlsZSA9IGZpbGUucmVwbGFjZShwcm9qZWN0Um9vdCwgJycpLnJlcGxhY2UoL15cXC8rLywgJycpO1xuICAgICAgY29uc3QgaXNTb3VyY2VGaWxlID0gbm9ybWFsaXplZEZpbGUuc3RhcnRzV2l0aChtb2R1bGVCYXNlICsgJy8nKTtcbiAgICAgIFxuICAgICAgaWYgKCFpc1NvdXJjZUZpbGUpIHJldHVybjtcbiAgICAgIFxuICAgICAgLy8gQ2xpZW50IGVudmlyb25tZW50OiBsZXQgVml0ZS9Adml0ZWpzL3BsdWdpbi1yZWFjdCBoYW5kbGUgaXRcbiAgICAgIGlmIChlbnZOYW1lID09PSAnY2xpZW50Jykge1xuICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGEgY2xpZW50IGNvbXBvbmVudCDigJQgbGV0IEZhc3QgUmVmcmVzaCBoYW5kbGUgaXRcbiAgICAgICAgY29uc3QgaXNDbGllbnQgPSAoZmlsZS5lbmRzV2l0aCgnLnRzeCcpIHx8IGZpbGUuZW5kc1dpdGgoJy50cycpIHx8IGZpbGUuZW5kc1dpdGgoJy5qc3gnKSB8fCBmaWxlLmVuZHNXaXRoKCcuanMnKSkgJiYgKCgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgaGVhZCA9IHJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKS5zbGljZSgwLCAyMDApO1xuICAgICAgICAgICAgcmV0dXJuIC9eXFxzKltcIidddXNlIGNsaWVudFtcIiddLy50ZXN0KGhlYWQuc3BsaXQoJ1xcbicpWzBdKTtcbiAgICAgICAgICB9IGNhdGNoIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIH0pKCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoaXNDbGllbnQpIHJldHVybjsgLy8gTGV0IEZhc3QgUmVmcmVzaCBoYW5kbGUgY2xpZW50IGNvbXBvbmVudHNcbiAgICAgICAgXG4gICAgICAgIC8vIFNlcnZlciBjb21wb25lbnQgY2hhbmdlZCDigJQgc2VuZCBSU0MgcmVmZXRjaCBldmVudCB0byBjbGllbnRcbiAgICAgICAgLy8gT25seSBkbyB0aGlzIG9uY2UgKGZyb20gY2xpZW50IGVudikgdG8gYXZvaWQgZHVwbGljYXRlIGV2ZW50c1xuICAgICAgICBzZXJ2ZXIuY29uZmlnLmxvZ2dlci5pbmZvKGBbdml0ZS1wbHVnaW4tcmVhY3Qtc2VydmVyXSBGaWxlIGNoYW5nZWQgKFJTQyByZWZldGNoKTogJHtub3JtYWxpemVkRmlsZX1gKTtcbiAgICAgICAgc2VydmVyLndzLnNlbmQoe1xuICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxuICAgICAgICAgIGV2ZW50OiAndml0ZS1wbHVnaW4tcmVhY3Qtc2VydmVyOnNlcnZlci1jb21wb25lbnQtdXBkYXRlJyxcbiAgICAgICAgICBkYXRhOiB7IGZpbGU6IG5vcm1hbGl6ZWRGaWxlLCBwYXRoOiBmaWxlIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIFtdOyAvLyBEb24ndCB0cmlnZ2VyIGNsaWVudC1zaWRlIHBhZ2UgcmVsb2FkXG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNlcnZlci9TU1IgZW52aXJvbm1lbnRzOiBzdXBwcmVzcyBwYWdlIHJlbG9hZCBmb3IgYWxsIHNvdXJjZSBmaWxlc1xuICAgICAgLy8gU2VydmVyIGNvbXBvbmVudHMgYXJlIGhhbmRsZWQgYnkgdGhlIFJTQyByZWZldGNoIGV2ZW50IHNlbnQgYWJvdmVcbiAgICAgIC8vIEludmFsaWRhdGUgdGhlIHNlcnZlciBtb2R1bGUgc28gbmV4dCBSU0MgcmVxdWVzdCBnZXRzIGZyZXNoIGNvbnRlbnRcbiAgICAgIGlmIChlbnZOYW1lID09PSAnc2VydmVyJykge1xuICAgICAgICBjb25zdCBtb2QgPSBjdHguZW52aXJvbm1lbnQ/Lm1vZHVsZUdyYXBoPy5nZXRNb2R1bGVzQnlGaWxlKGZpbGUpO1xuICAgICAgICBpZiAobW9kKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBtIG9mIG1vZCkge1xuICAgICAgICAgICAgY3R4LmVudmlyb25tZW50Lm1vZHVsZUdyYXBoLmludmFsaWRhdGVNb2R1bGUobSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSxcbiAgICBoYW5kbGVIb3RVcGRhdGUoeyBmaWxlLCBzZXJ2ZXIgfTogeyBmaWxlOiBzdHJpbmc7IHNlcnZlcjogVml0ZURldlNlcnZlciB9KSB7XG4gICAgICBjb25zdCBtb2R1bGVCYXNlID0gdXNlck9wdGlvbnMubW9kdWxlQmFzZSB8fCBcInNyY1wiO1xuICAgICAgY29uc3QgcHJvamVjdFJvb3QgPSB1c2VyT3B0aW9ucy5wcm9qZWN0Um9vdCB8fCBzZXJ2ZXIuY29uZmlnLnJvb3Q7XG4gICAgICBjb25zdCBub3JtYWxpemVkRmlsZSA9IGZpbGUucmVwbGFjZShwcm9qZWN0Um9vdCwgJycpLnJlcGxhY2UoL15cXC8rLywgJycpO1xuICAgICAgY29uc3QgaXNTb3VyY2VGaWxlID0gbm9ybWFsaXplZEZpbGUuc3RhcnRzV2l0aChtb2R1bGVCYXNlICsgJy8nKSAmJiBcbiAgICAgICAgKGZpbGUuZW5kc1dpdGgoJy50c3gnKSB8fCBmaWxlLmVuZHNXaXRoKCcudHMnKSB8fCBmaWxlLmVuZHNXaXRoKCcuanN4JykgfHwgZmlsZS5lbmRzV2l0aCgnLmpzJykpO1xuICAgICAgXG4gICAgICAvLyBTa2lwIGNsaWVudCBjb21wb25lbnRzIOKAlCBsZXQgQHZpdGVqcy9wbHVnaW4tcmVhY3QgaGFuZGxlIHRoZW1cbiAgICAgIC8vIHdpdGggRmFzdCBSZWZyZXNoIChwcmVzZXJ2ZXMgY29tcG9uZW50LWxldmVsIHN0YXRlKS5cbiAgICAgIGNvbnN0IGlzQ2xpZW50RmlsZSA9IGlzU291cmNlRmlsZSAmJiAoKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGhlYWQgPSByZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04Jykuc2xpY2UoMCwgMjAwKTtcbiAgICAgICAgICByZXR1cm4gL15cXHMqW1wiJ111c2UgY2xpZW50W1wiJ10vLnRlc3QoaGVhZC5zcGxpdCgnXFxuJylbMF0pO1xuICAgICAgICB9IGNhdGNoIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICB9KSgpO1xuICAgICAgXG4gICAgICBpZiAoaXNTb3VyY2VGaWxlICYmICFpc0NsaWVudEZpbGUpIHtcbiAgICAgICAgc2VydmVyLmNvbmZpZy5sb2dnZXIuaW5mbyhgW3ZpdGUtcGx1Z2luLXJlYWN0LXNlcnZlcl0gRmlsZSBjaGFuZ2VkIChSU0MgcmVmZXRjaCk6ICR7bm9ybWFsaXplZEZpbGV9YCk7XG4gICAgICAgIFxuICAgICAgICAvLyBTZW5kIGN1c3RvbSBITVIgZXZlbnQgc28gY2xpZW50IGNhbiByZWZldGNoIFJTQyBzdHJlYW1cbiAgICAgICAgc2VydmVyLndzLnNlbmQoe1xuICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxuICAgICAgICAgIGV2ZW50OiAndml0ZS1wbHVnaW4tcmVhY3Qtc2VydmVyOnNlcnZlci1jb21wb25lbnQtdXBkYXRlJyxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBmaWxlOiBub3JtYWxpemVkRmlsZSxcbiAgICAgICAgICAgIHBhdGg6IGZpbGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBJbnZhbGlkYXRlIHRoZSBzZXJ2ZXIgbW9kdWxlIHNvIG5leHQgcmVxdWVzdCBnZXRzIGZyZXNoIGNvbnRlbnRcbiAgICAgICAgY29uc3QgbW9kID0gc2VydmVyLmVudmlyb25tZW50c1snc2VydmVyJ10/Lm1vZHVsZUdyYXBoPy5nZXRNb2R1bGVzQnlGaWxlKGZpbGUpO1xuICAgICAgICBpZiAobW9kKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBtIG9mIG1vZCkge1xuICAgICAgICAgICAgc2VydmVyLmVudmlyb25tZW50c1snc2VydmVyJ10/Lm1vZHVsZUdyYXBoPy5pbnZhbGlkYXRlTW9kdWxlKG0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUmV0dXJuIGVtcHR5IGFycmF5IHRvIHByZXZlbnQgVml0ZSdzIGRlZmF1bHQgZnVsbC1wYWdlIHJlbG9hZFxuICAgICAgICAvLyBUaGUgY2xpZW50IHdpbGwgcmVmZXRjaCB0aGUgUlNDIHN0cmVhbSB2aWEgdGhlIGN1c3RvbSBldmVudFxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChpc0NsaWVudEZpbGUpIHtcbiAgICAgICAgLy8gQ2xpZW50IGNvbXBvbmVudHMgYXJlIGhhbmRsZWQgYnkgQHZpdGVqcy9wbHVnaW4tcmVhY3QgKEZhc3QgUmVmcmVzaClcbiAgICAgICAgLy8gb3IgVml0ZSdzIGNsaWVudC1zaWRlIEhNUi4gUmV0dXJuIGVtcHR5IHRvIHByZXZlbnQgdGhlIHNlcnZlclxuICAgICAgICAvLyBlbnZpcm9ubWVudCBmcm9tIHRyaWdnZXJpbmcgYSBmdWxsIHBhZ2UgcmVsb2FkLlxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBzZXJ2ZXJQbHVnaW4gPSB7XG4gICAgbmFtZTogXCJ2aXRlLXBsdWdpbi1yZWFjdC1zZXJ2ZXI6ZGV2LXNlcnZlci1zZXJ2ZXJcIixcbiAgICBhcHBseTogXCJzZXJ2ZVwiIGFzIGNvbnN0LFxuYXBwbHlUb0Vudmlyb25tZW50KHBhcnRpYWxFbnZpcm9ubWVudDogYW55KSB7XG4gICAgICByZXR1cm4gcGFydGlhbEVudmlyb25tZW50Py5jb25zdW1lciA9PT0gJ3NlcnZlcic7XG4gICAgfSxcbiAgICBjb25maWd1cmVTZXJ2ZXIoc2VydmVyOiBWaXRlRGV2U2VydmVyKSB7XG4gICAgICAvLyBMb2cgdGhhdCBwbHVnaW4gaXMgYmVpbmcgY29uZmlndXJlZFxuICAgICAgc2VydmVyLmNvbmZpZy5sb2dnZXIuaW5mbyhgW3ZpdGUtcGx1Z2luLXJlYWN0LXNlcnZlcl0gRGV2IHNlcnZlciBwbHVnaW4gY29uZmlndXJlZCBmb3Igc2VydmVyIGVudmlyb25tZW50IChyZWFjdC1zZXJ2ZXIgY29uZGl0aW9uKWApO1xuICAgICAgXG4gICAgICAvLyBDb25maWd1cmUgdGhlIFJlYWN0IHNlcnZlciBmb3Igc2VydmVyIGVudmlyb25tZW50IChkaXJlY3QgUlNDIHByb2Nlc3NpbmcpXG4gICAgICAvLyBUaGlzIHVzZXMgdGhlIGV4aXN0aW5nIGNvbmZpZ3VyZVJlYWN0U2VydmVyLnNlcnZlci5qcyBpbXBsZW1lbnRhdGlvblxuICAgICAgY29uZmlndXJlUmVhY3RTZXJ2ZXIoe1xuICAgICAgICBzZXJ2ZXIsXG4gICAgICAgIGF1dG9EaXNjb3ZlcmVkRmlsZXM6IHtcbiAgICAgICAgICBwcm9wc01hcDogbmV3IE1hcCgpLFxuICAgICAgICAgIHBhZ2VNYXA6IG5ldyBNYXAoKSxcbiAgICAgICAgICByb290TWFwOiBuZXcgTWFwKCksXG4gICAgICAgICAgaHRtbE1hcDogbmV3IE1hcCgpLFxuICAgICAgICAgIHJvdXRlTWFwOiBuZXcgTWFwKCksXG4gICAgICAgICAgdXJsTWFwOiBuZXcgTWFwKCksXG4gICAgICAgICAgZXJyb3JzOiBbXSxcbiAgICAgICAgICB3b3JrZXJQYXRoczoge30sXG4gICAgICAgICAgc2VydmVyRW50cnk6IG51bGwsXG4gICAgICAgICAgY2xpZW50RW50cnk6IHt9LFxuICAgICAgICAgIGNsaWVudElucHV0czoge30sXG4gICAgICAgICAgc3RhdGljSW5wdXRzOiB7fSxcbiAgICAgICAgICBzZXJ2ZXJJbnB1dHM6IHt9LFxuICAgICAgICAgIC8vIHN0YXRpY01hbmlmZXN0IHJlbW92ZWQgZnJvbSBBdXRvRGlzY292ZXJlZEZpbGVzXG4gICAgICAgICAgc2VydmVyQWN0aW9uczoge30sXG4gICAgICAgIH0sXG4gICAgICAgIHVzZXJPcHRpb25zLFxuICAgICAgICBzZXJ2ZXJNYW5pZmVzdDoge30sXG4gICAgICAgIHJlc29sdmVkQ29uZmlnOiBzZXJ2ZXIuY29uZmlnLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcblxuICAvLyBGaXggQ0pTIG5hbWVkIGltcG9ydHMgaW4gc2VydmVyIGVudmlyb25tZW50LlxuICAvLyBWaXRlJ3MgZXNidWlsZCBKU1ggdHJhbnNmb3JtIChhbmQgQHZpdGVqcy9wbHVnaW4tcmVhY3QgaWYgcHJlc2VudCkgZ2VuZXJhdGVzXG4gIC8vIG5hbWVkIGltcG9ydHMgbGlrZSBgaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCJgLiBJbiB0aGUgc2VydmVyIGVudmlyb25tZW50LFxuICAvLyByZWFjdCdzIHJlYWN0LXNlcnZlciBleHBvcnQgaXMgQ0pTLW9ubHksIGFuZCBOb2RlJ3MgRVNNIGludGVyb3AgZG9lc24ndCBzdXBwb3J0XG4gIC8vIG5hbWVkIGV4cG9ydHMgZnJvbSBDSlMuIFRoaXMgcG9zdC10cmFuc2Zvcm0gcmV3cml0ZXMgdGhlbS5cbiAgY29uc3QgY2pzRml4UGx1Z2luOiBQbHVnaW4gPSB7XG4gICAgbmFtZTogXCJ2aXRlLXBsdWdpbi1yZWFjdC1zZXJ2ZXI6c2VydmVyLWNqcy1maXhcIixcbiAgICBhcHBseTogXCJzZXJ2ZVwiIGFzIGNvbnN0LFxuICAgIGVuZm9yY2U6IFwicG9zdFwiIGFzIGNvbnN0LFxuICAgIGFwcGx5VG9FbnZpcm9ubWVudChlbnY6IGFueSkge1xuICAgICAgcmV0dXJuIGVudj8ubmFtZSA9PT0gJ3NlcnZlcic7XG4gICAgfSxcbiAgICB0cmFuc2Zvcm0oY29kZTogc3RyaW5nLCBpZDogc3RyaW5nKSB7XG4gICAgICBpZiAoaWQuaW5jbHVkZXMoJ25vZGVfbW9kdWxlcycpKSByZXR1cm47XG4gICAgICBpZiAoIWlkLm1hdGNoKC9cXC5banRdc3g/JC8pKSByZXR1cm47XG4gICAgICBcbiAgICAgIGNvbnN0IG5hbWVkSW1wb3J0UmUgPSAvaW1wb3J0XFxzKlxceyhbXn1dKylcXH1cXHMqZnJvbVxccypbXCInXXJlYWN0W1wiJ11cXHMqOz8vZztcbiAgICAgIGlmICghbmFtZWRJbXBvcnRSZS50ZXN0KGNvZGUpKSByZXR1cm47XG4gICAgICBcbiAgICAgIG5hbWVkSW1wb3J0UmUubGFzdEluZGV4ID0gMDtcbiAgICAgIGxldCBjb3VudGVyID0gMDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvZGUucmVwbGFjZShuYW1lZEltcG9ydFJlLCAoX21hdGNoLCBpbXBvcnRzKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsaWFzID0gYF9fcmVhY3RfY2pzXyR7Y291bnRlcisrfWA7XG4gICAgICAgIHJldHVybiBgaW1wb3J0ICR7YWxpYXN9IGZyb20gXCJyZWFjdFwiOyBjb25zdCB7JHtpbXBvcnRzfX0gPSAke2FsaWFzfTtgO1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7IGNvZGU6IHJlc3VsdCwgbWFwOiBudWxsIH07XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gW2htclBsdWdpbiwgY2pzRml4UGx1Z2luLCBzZXJ2ZXJQbHVnaW5dO1xufTtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFVYSxNQUFBLHdCQUFBLEdBQTJCLFNBQVMsK0JBQUEsQ0FBZ0MsT0FBd0MsRUFBQTtBQUN2SCxFQUFBLElBQUksV0FBVyxJQUFNLEVBQUE7QUFDbkIsSUFBTSxNQUFBLElBQUksTUFBTSxxQkFBcUIsQ0FBQTtBQUFBO0FBR3ZDLEVBQU0sTUFBQSxlQUFBLEdBQWtCLGVBQWUsT0FBTyxDQUFBO0FBQzlDLEVBQUksSUFBQSxlQUFBLENBQWdCLFNBQVMsT0FBUyxFQUFBO0FBQ3BDLElBQUksSUFBQSxlQUFBLENBQWdCLFNBQVMsSUFBTSxFQUFBO0FBQ2pDLE1BQUEsTUFBTSxlQUFnQixDQUFBLEtBQUE7QUFBQTtBQUV4QixJQUFNLE1BQUEsSUFBSSxNQUFNLDJCQUEyQixDQUFBO0FBQUE7QUFFN0MsRUFBQSxNQUFNLGNBQWMsZUFBZ0IsQ0FBQSxXQUFBO0FBR3BDLEVBQUEsTUFBTSxTQUFZLEdBQUE7QUFBQSxJQUNoQixJQUFNLEVBQUEscUNBQUE7QUFBQSxJQUNOLEtBQU8sRUFBQSxPQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJUCxVQUFVLEdBQVUsRUFBQTtBQUNsQixNQUFNLE1BQUEsRUFBRSxJQUFNLEVBQUEsTUFBQSxFQUFXLEdBQUEsR0FBQTtBQUN6QixNQUFNLE1BQUEs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
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.server.d.ts","sourceRoot":"","sources":["../../../plugin/react-static/plugin.server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAaH,OAAO,KAAK,EAIV,YAAY,EACb,MAAM,aAAa,CAAC;AAyCrB,eAAO,MAAM,iBAAiB,EAAE,YA+nB/B,CAAC"}
1
+ {"version":3,"file":"plugin.server.d.ts","sourceRoot":"","sources":["../../../plugin/react-static/plugin.server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAaH,OAAO,KAAK,EAIV,YAAY,EACb,MAAM,aAAa,CAAC;AA0CrB,eAAO,MAAM,iBAAiB,EAAE,YAwoB/B,CAAC"}
@@ -16,7 +16,8 @@
16
16
  import { createLogger, } from "vite";
17
17
  import { resolveOptions } from "../config/resolveOptions.js";
18
18
  import { createBuildLoader } from "./createBuildLoader.server.js";
19
- import { renderPages } from "./renderPages.js";
19
+ import { renderPagesBatched } from "./renderPagesBatched.js";
20
+ import { renderPages as renderPagesSequential } from "./renderPages.js";
20
21
  import { getBundleManifest } from "../helpers/getBundleManifest.js";
21
22
  import { createWorker } from "../worker/createWorker.js";
22
23
  import { serializedOptions, serializeResolvedConfig, } from "../helpers/serializeUserOptions.js";
@@ -375,6 +376,12 @@ export const reactStaticPlugin = function _reactStaticPlugin(options) {
375
376
  }
376
377
  }
377
378
  }
379
+ // Select render mode based on build config
380
+ const renderMode = userOptions.build?.renderMode ?? "parallel";
381
+ const renderPages = renderMode === "sequential" ? renderPagesSequential : renderPagesBatched;
382
+ if (userOptions.verbose) {
383
+ logger.info(`[static] Using ${renderMode} rendering${renderMode === "parallel" ? ` (batch size: ${userOptions.build?.batchSize ?? 8})` : ""}`);
384
+ }
378
385
  // this will render the routes
379
386
  const renderPagesGenerator = renderPages(routes, {
380
387
  ...handlerOptions,
@@ -393,6 +400,7 @@ export const reactStaticPlugin = function _reactStaticPlugin(options) {
393
400
  staticManifest: staticManifest, // Pass static manifest for path resolution
394
401
  autoDiscoveredFiles: autoDiscoveredFiles,
395
402
  cssFilesByPage: cssFilesByPage,
403
+ batchSize: userOptions.build?.batchSize,
396
404
  }, renderPage);
397
405
  // Process render results
398
406
  let finalResult;
@@ -1 +1 @@
1
- {"version":3,"file":"renderPagesBatched.d.ts","sourceRoot":"","sources":["../../../plugin/react-static/renderPagesBatched.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAA2C,MAAM,YAAY,CAAC;AA0GzF;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,aAkJhC,CAAC"}
1
+ {"version":3,"file":"renderPagesBatched.d.ts","sourceRoot":"","sources":["../../../plugin/react-static/renderPagesBatched.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAA2C,MAAM,YAAY,CAAC;AA4OzF;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,aA6HhC,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import { handleError } from "../error/handleError.js";
2
2
  import { fileWriter } from "./fileWriter.js";
3
+ import { createRenderMetrics } from "../metrics/createRenderMetrics.js";
4
+ import { createStreamMetrics } from "../metrics/createStreamMetrics.js";
3
5
  const DEFAULT_BATCH_SIZE = 8;
4
6
  function resolvePathWithManifest(path, manifest) {
5
7
  const entry = manifest[path];
@@ -10,9 +12,10 @@ function resolvePathWithManifest(path, manifest) {
10
12
  }
11
13
  /**
12
14
  * Renders a single route completely, consuming all yields from renderPage
13
- * and writing the RSC and HTML files
15
+ * and writing the RSC and HTML files. Collects metrics and handles events
16
+ * identically to the sequential renderPages.
14
17
  */
15
- async function renderSingleRoute(route, handlerOptions, renderPage, manifest) {
18
+ async function renderSingleRoute(route, handlerOptions, renderPage, manifest, failedRoutes) {
16
19
  const { autoDiscoveredFiles, cssFilesByPage, ...options } = handlerOptions;
17
20
  const { page, props, root, html } = autoDiscoveredFiles.urlMap?.get(route) || {};
18
21
  if (!page) {
@@ -23,6 +26,120 @@ async function renderSingleRoute(route, handlerOptions, renderPage, manifest) {
23
26
  const resolvedPropsPath = props ? resolvePathWithManifest(props, manifest) : undefined;
24
27
  const resolvedRootPath = root ? resolvePathWithManifest(root, manifest) : undefined;
25
28
  const resolvedHtmlPath = html ? resolvePathWithManifest(html, manifest) : undefined;
29
+ // Store results for metrics tracking
30
+ const routeResults = new Map();
31
+ // Create onEvent wrapper that handles route.error and metrics collection
32
+ // This mirrors the sequential renderPages behavior exactly
33
+ const wrapperOnEvent = (event) => {
34
+ // Call the original onEvent first
35
+ if (options.onEvent) {
36
+ options.onEvent(event);
37
+ }
38
+ // Handle route.error events
39
+ if (event.type === "route.error") {
40
+ const detectedPanicError = handleError({
41
+ error: event.data.error,
42
+ logger: options.logger,
43
+ panicThreshold: event.data.panicThreshold,
44
+ context: `route.error (${event.data.route})`,
45
+ });
46
+ if (detectedPanicError != null) {
47
+ options.logger?.error(`[renderPagesBatched] Panic error for route ${event.data.route}: ${event.data.error.message}`);
48
+ failedRoutes.set(event.data.route, event.data.error);
49
+ }
50
+ else {
51
+ options.logger?.warn(`[renderPagesBatched] Non-panic error for route ${event.data.route}: ${event.data.error.message}`);
52
+ }
53
+ }
54
+ // Handle metrics collection on file.write.done
55
+ if (event.type === "file.write.done" && event.data.route === route) {
56
+ const routeResult = routeResults.get(route);
57
+ if (routeResult && routeResult.type === "success") {
58
+ if (event.data.fileType === "html") {
59
+ const endTime = performance.now();
60
+ const htmlMetrics = createRenderMetrics({
61
+ route: route,
62
+ type: routeResult.metrics.html.type,
63
+ fromMainThread: routeResult.metrics.html.fromMainThread,
64
+ fromRscWorker: routeResult.metrics.html.fromRscWorker,
65
+ fromHtmlWorker: routeResult.metrics.html.fromHtmlWorker,
66
+ fileSize: event.data.content.length,
67
+ chunks: event.data.chunks || 0,
68
+ processingTime: endTime - routeResult.metrics.html.streamMetrics.startTime,
69
+ chunkRate: (event.data.chunks || 0) / ((endTime - routeResult.metrics.html.streamMetrics.startTime) / 1000),
70
+ fileName: event.data.fileName,
71
+ outputPath: event.data.path,
72
+ baseDir: event.data.baseDir,
73
+ routePath: event.data.routePath,
74
+ streamMetrics: createStreamMetrics({
75
+ ...routeResult.metrics.html.streamMetrics,
76
+ chunks: event.data.chunks || 0,
77
+ bytes: event.data.content.length,
78
+ duration: endTime - routeResult.metrics.html.streamMetrics.startTime,
79
+ endTime: endTime,
80
+ }),
81
+ });
82
+ if (options.onMetrics) {
83
+ options.onMetrics(htmlMetrics);
84
+ }
85
+ // Also emit RSC Full metrics if available
86
+ if (routeResult.metrics?.rscFull) {
87
+ const rscFullEndTime = performance.now();
88
+ const rscFullMetrics = createRenderMetrics({
89
+ route: route,
90
+ type: routeResult.metrics.rscFull.type,
91
+ fromMainThread: routeResult.metrics.rscFull.fromMainThread,
92
+ fromRscWorker: routeResult.metrics.rscFull.fromRscWorker,
93
+ fromHtmlWorker: routeResult.metrics.rscFull.fromHtmlWorker,
94
+ processingTime: rscFullEndTime - routeResult.metrics.rscFull.streamMetrics.startTime,
95
+ chunks: routeResult.metrics.rscFull.streamMetrics.chunks,
96
+ chunkRate: routeResult.metrics.rscFull.streamMetrics.chunks / ((rscFullEndTime - routeResult.metrics.rscFull.streamMetrics.startTime) / 1000),
97
+ fileName: event.data.fileName,
98
+ outputPath: event.data.path,
99
+ baseDir: event.data.baseDir,
100
+ routePath: event.data.routePath,
101
+ streamMetrics: createStreamMetrics({
102
+ ...routeResult.metrics.rscFull.streamMetrics,
103
+ duration: rscFullEndTime - routeResult.metrics.rscFull.streamMetrics.startTime,
104
+ endTime: rscFullEndTime,
105
+ }),
106
+ });
107
+ if (options.onMetrics) {
108
+ options.onMetrics(rscFullMetrics);
109
+ }
110
+ }
111
+ }
112
+ else if (event.data.fileType === "rsc") {
113
+ const rscEndTime = performance.now();
114
+ const rscMetrics = createRenderMetrics({
115
+ route: route,
116
+ type: routeResult.metrics.rscHeadless.type,
117
+ fromMainThread: routeResult.metrics.rscHeadless.fromMainThread,
118
+ fromRscWorker: routeResult.metrics.rscHeadless.fromRscWorker,
119
+ fromHtmlWorker: routeResult.metrics.rscHeadless.fromHtmlWorker,
120
+ fileSize: event.data.content.length,
121
+ chunks: event.data.chunks || 0,
122
+ processingTime: rscEndTime - routeResult.metrics.rscHeadless.streamMetrics.startTime,
123
+ chunkRate: (event.data.chunks || 0) / ((rscEndTime - routeResult.metrics.rscHeadless.streamMetrics.startTime) / 1000),
124
+ fileName: event.data.fileName,
125
+ outputPath: event.data.path,
126
+ baseDir: event.data.baseDir,
127
+ routePath: event.data.routePath,
128
+ streamMetrics: createStreamMetrics({
129
+ ...routeResult.metrics.rscHeadless.streamMetrics,
130
+ chunks: event.data.chunks || 0,
131
+ bytes: event.data.content.length,
132
+ duration: rscEndTime - routeResult.metrics.rscHeadless.streamMetrics.startTime,
133
+ endTime: rscEndTime,
134
+ }),
135
+ });
136
+ if (options.onMetrics) {
137
+ options.onMetrics(rscMetrics);
138
+ }
139
+ }
140
+ }
141
+ }
142
+ };
26
143
  const routeHandlerOptions = {
27
144
  ...options,
28
145
  manifest,
@@ -34,6 +151,7 @@ async function renderSingleRoute(route, handlerOptions, renderPage, manifest) {
34
151
  cssFiles: cssFilesByPage?.get(route) ?? new Map(),
35
152
  globalCss: options.globalCss ?? new Map(),
36
153
  id: `${route}-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`,
154
+ onEvent: wrapperOnEvent,
37
155
  };
38
156
  const pageRenderer = renderPage(routeHandlerOptions);
39
157
  const results = [];
@@ -41,18 +159,17 @@ async function renderSingleRoute(route, handlerOptions, renderPage, manifest) {
41
159
  // Consume all yields from the page renderer and write files
42
160
  for await (const result of pageRenderer) {
43
161
  results.push(result);
44
- // Track error results
45
162
  if (result.type === "error" && result.error) {
46
163
  routeError = result.error instanceof Error ? result.error : new Error(String(result.error));
47
164
  }
48
- // Write files for success and skip results
49
- if ((result.type === "success" || result.type === "skip") && result.html && result.rsc) {
50
- const rscWritePromise = fileWriter(result.rsc, "rsc", { ...options, route, logger: options.logger }, options.signal);
51
- const htmlWritePromise = fileWriter(result.html, "html", { ...options, route, logger: options.logger }, options.signal);
165
+ if (result.type === "success" || result.type === "skip") {
166
+ // Store result for metrics tracking (wrapperOnEvent needs this)
167
+ routeResults.set(route, result);
168
+ const rscWritePromise = fileWriter(result.rsc, "rsc", { ...options, route, onEvent: wrapperOnEvent, logger: options.logger }, options.signal);
169
+ const htmlWritePromise = fileWriter(result.html, "html", { ...options, route, onEvent: wrapperOnEvent, logger: options.logger }, options.signal);
52
170
  await Promise.all([rscWritePromise, htmlWritePromise]);
53
171
  }
54
172
  }
55
- // Return error if any result was an error
56
173
  if (routeError) {
57
174
  return { route, results, error: routeError };
58
175
  }
@@ -116,7 +233,7 @@ export const renderPagesBatched = (routes, handlerOptions, renderPage) => {
116
233
  return abortResult;
117
234
  }
118
235
  // Render all pages in this batch concurrently
119
- const batchPromises = batch.map(route => renderSingleRoute(route, handlerOptions, renderPage, manifest));
236
+ const batchPromises = batch.map(route => renderSingleRoute(route, handlerOptions, renderPage, manifest, failedRoutes));
120
237
  const batchResults = await Promise.all(batchPromises);
121
238
  // Process results from this batch
122
239
  for (const { route, results: pageResults, error } of batchResults) {
@@ -130,6 +247,16 @@ export const renderPagesBatched = (routes, handlerOptions, renderPage) => {
130
247
  if (panicError != null) {
131
248
  failedRoutes.set(route, error);
132
249
  options.logger?.error(`[renderPagesBatched] Panic error for route ${route}: ${error.message}`);
250
+ const errorResult = {
251
+ type: "error",
252
+ error,
253
+ route,
254
+ failedRoutes,
255
+ completedRoutes,
256
+ results,
257
+ };
258
+ yield errorResult;
259
+ return errorResult;
133
260
  }
134
261
  else {
135
262
  options.logger?.warn(`[renderPagesBatched] Non-panic error for route ${route}: ${error.message}`);
@@ -137,7 +264,6 @@ export const renderPagesBatched = (routes, handlerOptions, renderPage) => {
137
264
  }
138
265
  else {
139
266
  completedRoutes.add(route);
140
- // Yield each result from this page
141
267
  for (const result of pageResults) {
142
268
  if (result.type === "success" || result.type === "skip") {
143
269
  results.set(route, result);
@@ -156,32 +282,6 @@ export const renderPagesBatched = (routes, handlerOptions, renderPage) => {
156
282
  options.logger?.info(`[renderPagesBatched] Completed batch: ${completedRoutes.size}/${routeArray.length} pages`);
157
283
  }
158
284
  }
159
- // Check if we should panic based on failed routes
160
- if (failedRoutes.size > 0) {
161
- const firstError = Array.from(failedRoutes.values())[0];
162
- const panicError = handleError({
163
- error: firstError,
164
- logger: options.logger,
165
- panicThreshold: options.panicThreshold,
166
- context: `renderPagesBatched final check`,
167
- });
168
- if (panicError != null) {
169
- if (options.verbose) {
170
- options.logger?.error(`[renderPagesBatched] Build failed due to panic threshold: ${failedRoutes.size} routes failed`);
171
- }
172
- // Yield error before returning
173
- const errorResult = {
174
- type: "error",
175
- error: panicError,
176
- route: "",
177
- failedRoutes,
178
- completedRoutes,
179
- results,
180
- };
181
- yield errorResult;
182
- return errorResult;
183
- }
184
- }
185
285
  // Final success result
186
286
  const finalResult = {
187
287
  type: "success",
@@ -59,6 +59,7 @@ export type RenderPagesHandlerOptions = Omit<CreateHandlerOptions, "pagePath" |
59
59
  cssFilesByPage: Map<string, Map<string, CssContent>>;
60
60
  serverPipeableStreamOptions: any;
61
61
  staticManifest?: Manifest;
62
+ batchSize?: number;
62
63
  };
63
64
  export type RenderPagesFn = (routes: string[], handlerOptions: RenderPagesHandlerOptions, renderPage: RenderPageFn) => RenderPagesReturn;
64
65
  export type RenderPageReturn = AsyncGenerator<RenderPageResult, void, unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../plugin/react-static/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../plugin/react-static/types.ts"],"names":[],"mappings":"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"}
@@ -724,6 +724,21 @@ export type BuildConfig = {
724
724
  rscExtension?: string;
725
725
  cssModuleExtension?: string;
726
726
  nodeExtension?: string;
727
+ /**
728
+ * Controls how pages are rendered during static generation.
729
+ *
730
+ * - `"parallel"` (default): Renders pages in concurrent batches for faster builds.
731
+ * Use `batchSize` to control concurrency (default: 8).
732
+ * - `"sequential"`: Renders pages one at a time. Slower but uses less memory
733
+ * and produces deterministic output order.
734
+ */
735
+ renderMode?: "parallel" | "sequential";
736
+ /**
737
+ * Number of pages to render concurrently when `renderMode` is `"parallel"`.
738
+ * Higher values use more memory but build faster.
739
+ * @default 8
740
+ */
741
+ batchSize?: number;
727
742
  };
728
743
  export type DevConfig = {
729
744
  useHtmlWorker?: boolean | undefined;