vite-plugin-react-server 1.4.1 → 1.4.3

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 (146) 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/configureReactServer.server.d.ts.map +1 -1
  11. package/dist/plugin/dev-server/configureReactServer.server.js +5 -8
  12. package/dist/plugin/dev-server/plugin.client.d.ts.map +1 -1
  13. package/dist/plugin/dev-server/plugin.client.js +2 -1
  14. package/dist/plugin/dev-server/plugin.server.d.ts.map +1 -1
  15. package/dist/plugin/dev-server/plugin.server.js +2 -36
  16. package/dist/plugin/dev-server/virtualRscHmrPlugin.js +23 -23
  17. package/dist/plugin/environments/createBuildEventPlugin.js +88 -98
  18. package/dist/plugin/environments/createEnvironmentPlugin.js +222 -250
  19. package/dist/plugin/error/index.d.ts +1 -2
  20. package/dist/plugin/error/index.d.ts.map +1 -1
  21. package/dist/plugin/error/index.js +2 -3
  22. package/dist/plugin/error/panicThresholdHandler.js +14 -3
  23. package/dist/plugin/error/setupGlobalErrorHandler.d.ts.map +1 -1
  24. package/dist/plugin/error/setupGlobalErrorHandler.js +23 -16
  25. package/dist/plugin/helpers/createRscRenderHelpers.d.ts +0 -5
  26. package/dist/plugin/helpers/createRscRenderHelpers.d.ts.map +1 -1
  27. package/dist/plugin/helpers/createRscRenderHelpers.js +32 -55
  28. package/dist/plugin/helpers/createSharedLoader.d.ts.map +1 -1
  29. package/dist/plugin/helpers/createSharedLoader.js +4 -2
  30. package/dist/plugin/helpers/headlessStreamReuseHandler.js +30 -22
  31. package/dist/plugin/helpers/headlessStreamState.d.ts +0 -38
  32. package/dist/plugin/helpers/headlessStreamState.d.ts.map +1 -1
  33. package/dist/plugin/helpers/headlessStreamState.js +15 -76
  34. package/dist/plugin/helpers/index.d.ts +0 -3
  35. package/dist/plugin/helpers/index.d.ts.map +1 -1
  36. package/dist/plugin/helpers/index.js +1 -4
  37. package/dist/plugin/helpers/requestInfo.d.ts.map +1 -1
  38. package/dist/plugin/helpers/requestInfo.js +3 -3
  39. package/dist/plugin/helpers/resolveComponent.d.ts.map +1 -1
  40. package/dist/plugin/helpers/resolveComponent.js +4 -2
  41. package/dist/plugin/helpers/workerCleanup.d.ts +1 -12
  42. package/dist/plugin/helpers/workerCleanup.d.ts.map +1 -1
  43. package/dist/plugin/helpers/workerCleanup.js +1 -1
  44. package/dist/plugin/index.client.d.ts +5 -0
  45. package/dist/plugin/index.client.d.ts.map +1 -0
  46. package/dist/plugin/index.client.js +4 -0
  47. package/dist/plugin/index.d.ts +4 -3
  48. package/dist/plugin/index.d.ts.map +1 -1
  49. package/dist/plugin/index.js +10 -5
  50. package/dist/plugin/index.server.d.ts +5 -0
  51. package/dist/plugin/index.server.d.ts.map +1 -0
  52. package/dist/plugin/index.server.js +4 -0
  53. package/dist/plugin/loader/directives/index.d.ts +0 -1
  54. package/dist/plugin/loader/directives/index.d.ts.map +1 -1
  55. package/dist/plugin/loader/directives/index.js +1 -2
  56. package/dist/plugin/metrics/createWorkerStartupMetrics.js +31 -13
  57. package/dist/plugin/orchestrator/createPluginOrchestrator.client.js +41 -38
  58. package/dist/plugin/orchestrator/createPluginOrchestrator.server.js +43 -46
  59. package/dist/plugin/plugin.client.js +2 -2
  60. package/dist/plugin/plugin.server.js +2 -2
  61. package/dist/plugin/react-static/createBuildLoader.client.js +12 -6
  62. package/dist/plugin/react-static/createBuildLoader.server.js +255 -235
  63. package/dist/plugin/react-static/plugin.client.js +684 -770
  64. package/dist/plugin/react-static/plugin.server.js +517 -603
  65. package/dist/plugin/react-static/processCssFilesForPages.js +103 -88
  66. package/dist/plugin/react-static/renderPage.client.js +455 -529
  67. package/dist/plugin/react-static/renderPage.server.js +485 -508
  68. package/dist/plugin/react-static/renderPagesBatched.js +277 -275
  69. package/dist/plugin/react-static/rscToHtmlStream.client.js +48 -29
  70. package/dist/plugin/react-static/rscToHtmlStream.server.js +62 -37
  71. package/dist/plugin/react-static/temporaryReferences.server.js +11 -2
  72. package/dist/plugin/stream/createMainThreadHandlers.js +40 -31
  73. package/dist/plugin/stream/renderRscStream.server.d.ts.map +1 -1
  74. package/dist/plugin/stream/renderRscStream.server.js +127 -144
  75. package/dist/plugin/transformer/createTransformerPlugin.js +226 -265
  76. package/dist/plugin/utils/checkReactVersion.d.ts +7 -0
  77. package/dist/plugin/utils/checkReactVersion.d.ts.map +1 -0
  78. package/dist/plugin/utils/checkReactVersion.js +23 -0
  79. package/dist/plugin/utils/envUrls.node.js +12 -11
  80. package/dist/plugin/vendor/vendor-alias.js +84 -114
  81. package/dist/plugin/vendor/vendor.client.d.ts.map +1 -1
  82. package/dist/plugin/vendor/vendor.client.js +1 -3
  83. package/dist/plugin/worker/rsc/handleRscRender.d.ts.map +1 -1
  84. package/dist/plugin/worker/rsc/handleRscRender.js +3 -1
  85. package/dist/tsconfig.tsbuildinfo +1 -1
  86. package/package.json +123 -13
  87. package/plugin/config/autoDiscover/resolveAutoDiscover.ts +4 -0
  88. package/plugin/config/getCondition.ts +6 -4
  89. package/plugin/dev-server/configureReactServer.server.ts +7 -10
  90. package/plugin/dev-server/plugin.client.ts +2 -0
  91. package/plugin/dev-server/plugin.server.ts +2 -49
  92. package/plugin/error/index.ts +1 -2
  93. package/plugin/error/setupGlobalErrorHandler.ts +24 -25
  94. package/plugin/helpers/createRscRenderHelpers.ts +0 -29
  95. package/plugin/helpers/createSharedLoader.ts +6 -1
  96. package/plugin/helpers/headlessStreamState.ts +0 -69
  97. package/plugin/helpers/index.ts +0 -3
  98. package/plugin/helpers/requestInfo.ts +1 -2
  99. package/plugin/helpers/resolveComponent.ts +6 -1
  100. package/plugin/helpers/workerCleanup.ts +1 -38
  101. package/plugin/index.client.ts +4 -0
  102. package/plugin/index.server.ts +4 -0
  103. package/plugin/index.ts +12 -5
  104. package/plugin/loader/directives/index.ts +0 -1
  105. package/plugin/plugin.client.ts +1 -1
  106. package/plugin/plugin.server.ts +1 -1
  107. package/plugin/stream/renderRscStream.server.ts +3 -0
  108. package/plugin/transformer/README.md +1 -1
  109. package/plugin/utils/checkReactVersion.ts +28 -0
  110. package/plugin/vendor/vendor.client.ts +0 -2
  111. package/plugin/worker/html/README.md +1 -1
  112. package/plugin/worker/rsc/README.md +1 -1
  113. package/plugin/worker/rsc/handleRscRender.ts +2 -0
  114. package/scripts/generate-toc.mjs +27 -294
  115. package/dist/plugin/error/assertPanic.d.ts +0 -2
  116. package/dist/plugin/error/assertPanic.d.ts.map +0 -1
  117. package/dist/plugin/error/assertPanic.js +0 -15
  118. package/dist/plugin/error/directiveError.d.ts +0 -13
  119. package/dist/plugin/error/directiveError.d.ts.map +0 -1
  120. package/dist/plugin/error/directiveError.js +0 -21
  121. package/dist/plugin/error/enhanceError.d.ts +0 -14
  122. package/dist/plugin/error/enhanceError.d.ts.map +0 -1
  123. package/dist/plugin/error/enhanceError.js +0 -24
  124. package/dist/plugin/helpers/createSafePageComponent.d.ts +0 -36
  125. package/dist/plugin/helpers/createSafePageComponent.d.ts.map +0 -1
  126. package/dist/plugin/helpers/createSafePageComponent.js +0 -50
  127. package/dist/plugin/helpers/moduleResolver.d.ts +0 -25
  128. package/dist/plugin/helpers/moduleResolver.d.ts.map +0 -1
  129. package/dist/plugin/helpers/moduleResolver.js +0 -64
  130. package/dist/plugin/helpers/stashReturnValue.d.ts +0 -3
  131. package/dist/plugin/helpers/stashReturnValue.d.ts.map +0 -1
  132. package/dist/plugin/helpers/stashReturnValue.js +0 -23
  133. package/dist/plugin/helpers/workerManager.d.ts +0 -5
  134. package/dist/plugin/helpers/workerManager.d.ts.map +0 -1
  135. package/dist/plugin/helpers/workerManager.js +0 -18
  136. package/dist/plugin/loader/directives/collectExportsFromModule.d.ts +0 -6
  137. package/dist/plugin/loader/directives/collectExportsFromModule.d.ts.map +0 -1
  138. package/dist/plugin/loader/directives/collectExportsFromModule.js +0 -24
  139. package/plugin/error/assertPanic.ts +0 -9
  140. package/plugin/error/directiveError.ts +0 -29
  141. package/plugin/error/enhanceError.ts +0 -41
  142. package/plugin/helpers/createSafePageComponent.ts +0 -64
  143. package/plugin/helpers/moduleResolver.ts +0 -91
  144. package/plugin/helpers/stashReturnValue.ts +0 -19
  145. package/plugin/helpers/workerManager.ts +0 -16
  146. package/plugin/loader/directives/collectExportsFromModule.ts +0 -25
@@ -1,269 +1,230 @@
1
- import { perEnvironmentState } from "vite";
2
- import { createTransformer } from "../loader/createTransformer.js";
3
- import { resolveOptions } from "../config/resolveOptions.js";
4
- import { readFileSync } from "node:fs";
5
- import { resolve, join } from "node:path";
6
- import { getNodeEnv, isValidEnv } from "../config/getNodeEnv.js";
7
- // import { getEnvironmentName } from "../env/plugin.js";
8
- import { DEFAULT_CONFIG } from "../config/defaults.js";
9
- import { resolveRegExp } from "../config/resolveRegExp.js";
10
- import { userProjectRoot } from "../root.js";
11
- import { createDefaultModuleID } from "../config/createModuleID.js";
12
- export const createTransformerPlugin = (options) => {
13
- return (userOptions) => {
14
- const { name } = options;
15
- // CRITICAL: Use per-environment state to prevent cross-environment cache contamination
16
- // This fixes the issue where server environment cached modules affect client environment builds
17
- const transformationCache = perEnvironmentState(() => new Map());
18
- const defaultEnvironment = options.defaultEnvironment ?? (name === "client" ? "client" : "server");
19
- const allowedEnvironments = options.allowedEnvironments ??
20
- (name === "client"
21
- ? defaultEnvironment === "client"
22
- ? ["client", "ssr"]
23
- : ["client"]
24
- : defaultEnvironment === "server"
25
- ? ["server", "ssr"]
26
- : ["server"]);
27
- const logPrefix = `[vite-plugin-react-server:transform-${defaultEnvironment}-as-${name}]`;
28
- const resolvedOptionsResult = resolveOptions(userOptions);
29
- if (resolvedOptionsResult.type === "error")
30
- throw resolvedOptionsResult.error;
31
- const { userOptions: resolvedUserOptions } = resolvedOptionsResult;
32
- let isBuild = true;
33
- let isSSR = true;
34
- const nodeEnv = getNodeEnv(process.env.NODE_ENV);
35
- let mode = nodeEnv;
36
- let runtimeResolvedUserOptions = resolvedUserOptions;
37
- // Use global cache for transformation results to ensure consistent hashing across all plugin instances
38
- const outDir = resolvedUserOptions.build.outDir || "dist";
39
- const serverDir = join(outDir, resolvedUserOptions.build.server || "server");
40
- const clientDir = join(outDir, resolvedUserOptions.build.client || "client");
41
- const staticDir = join(outDir, resolvedUserOptions.build.static || "static");
42
- const modulePattern = resolveRegExp(userOptions.autoDiscover?.modulePattern ??
43
- DEFAULT_CONFIG.AUTO_DISCOVER.modulePattern);
44
- const nodeModulesPattern = resolveRegExp(userOptions.autoDiscover?.vendorPattern ??
45
- DEFAULT_CONFIG.AUTO_DISCOVER.vendorPattern);
46
- const noDist = (id) => {
47
- // Allow files from test fixtures and project root
48
- if (id.startsWith(userProjectRoot) ||
49
- id.startsWith(join(userProjectRoot, outDir)) ||
50
- id.startsWith(join(outDir, staticDir)) ||
51
- id.startsWith(join(outDir, serverDir)) ||
52
- id.startsWith(join(outDir, clientDir))) {
53
- return true;
1
+ /**
2
+ * vite-plugin-react-server
3
+ * Copyright (c) Nico Brinkkemper
4
+ * MIT License
5
+ */
6
+ import { perEnvironmentState } from 'vite';
7
+ import { createTransformer } from '../loader/createTransformer.js';
8
+ import { resolveOptions } from '../config/resolveOptions.js';
9
+ import { readFileSync } from 'node:fs';
10
+ import { join, resolve } from 'node:path';
11
+ import { getNodeEnv, isValidEnv } from '../config/getNodeEnv.js';
12
+ import { DEFAULT_CONFIG } from '../config/defaults.js';
13
+ import { resolveRegExp } from '../config/resolveRegExp.js';
14
+ import { userProjectRoot } from '../root.js';
15
+ import { createDefaultModuleID } from '../config/createModuleID.js';
16
+
17
+ const createTransformerPlugin = (options) => {
18
+ return (userOptions) => {
19
+ const { name } = options;
20
+ const transformationCache = perEnvironmentState(() => /* @__PURE__ */ new Map());
21
+ const defaultEnvironment = options.defaultEnvironment ?? (name === "client" ? "client" : "server");
22
+ const allowedEnvironments = options.allowedEnvironments ?? (name === "client" ? defaultEnvironment === "client" ? ["client", "ssr"] : ["client"] : defaultEnvironment === "server" ? ["server", "ssr"] : ["server"]);
23
+ const logPrefix = `[vite-plugin-react-server:transform-${defaultEnvironment}-as-${name}]`;
24
+ const resolvedOptionsResult = resolveOptions(userOptions);
25
+ if (resolvedOptionsResult.type === "error")
26
+ throw resolvedOptionsResult.error;
27
+ const { userOptions: resolvedUserOptions } = resolvedOptionsResult;
28
+ let isBuild = true;
29
+ let isSSR = true;
30
+ const nodeEnv = getNodeEnv(process.env.NODE_ENV);
31
+ let mode = nodeEnv;
32
+ let runtimeResolvedUserOptions = resolvedUserOptions;
33
+ const outDir = resolvedUserOptions.build.outDir || "dist";
34
+ const serverDir = join(
35
+ outDir,
36
+ resolvedUserOptions.build.server || "server"
37
+ );
38
+ const clientDir = join(
39
+ outDir,
40
+ resolvedUserOptions.build.client || "client"
41
+ );
42
+ const staticDir = join(
43
+ outDir,
44
+ resolvedUserOptions.build.static || "static"
45
+ );
46
+ const modulePattern = resolveRegExp(
47
+ userOptions.autoDiscover?.modulePattern ?? DEFAULT_CONFIG.AUTO_DISCOVER.modulePattern
48
+ );
49
+ const nodeModulesPattern = resolveRegExp(
50
+ userOptions.autoDiscover?.vendorPattern ?? DEFAULT_CONFIG.AUTO_DISCOVER.vendorPattern
51
+ );
52
+ const noDist = (id) => {
53
+ if (id.startsWith(userProjectRoot) || id.startsWith(join(userProjectRoot, outDir)) || id.startsWith(join(outDir, staticDir)) || id.startsWith(join(outDir, serverDir)) || id.startsWith(join(outDir, clientDir))) {
54
+ return true;
55
+ }
56
+ return false;
57
+ };
58
+ return {
59
+ name: `vite-plugin-react-server:transform-${name}`,
60
+ enforce: "post",
61
+ // CRITICAL: Enable per-environment hooks during dev to prevent cache contamination
62
+ perEnvironmentStartEndDuringDev: true,
63
+ // Note: Removed applyToEnvironment - let transform hook handle filtering
64
+ // With --app builds, applyToEnvironment may not be called correctly
65
+ configResolved(config) {
66
+ isBuild = config.command === "build";
67
+ isSSR = Boolean(config.build.ssr);
68
+ mode = config.mode;
69
+ if (!isValidEnv(mode)) {
70
+ throw new Error(`Invalid mode: ${mode}`);
71
+ }
72
+ const runtimeOptionsResult = resolveOptions({
73
+ ...userOptions,
74
+ loader: {
75
+ ...userOptions.loader,
76
+ mode
77
+ }
78
+ }, true);
79
+ if (runtimeOptionsResult.type === "success") {
80
+ runtimeResolvedUserOptions = runtimeOptionsResult.userOptions;
81
+ }
82
+ if (runtimeResolvedUserOptions.loader) {
83
+ runtimeResolvedUserOptions.loader.moduleID = createDefaultModuleID(
84
+ runtimeResolvedUserOptions,
85
+ {
86
+ command: config.command,
87
+ mode: config.mode},
88
+ mode
89
+ );
90
+ }
91
+ const logger = config.customLogger || config.logger;
92
+ if (runtimeResolvedUserOptions.verbose) {
93
+ logger.info(
94
+ `${logPrefix} configResolved: isBuild=${isBuild} isSSR=${isSSR} mode=${mode} allowed=${JSON.stringify(
95
+ allowedEnvironments
96
+ )} defaultEnv=${defaultEnvironment} importServerPath=${runtimeResolvedUserOptions.loader?.importServerPath}`
97
+ );
98
+ }
99
+ },
100
+ async buildStart() {
101
+ },
102
+ transform: {
103
+ order: "post",
104
+ // when transforming to:
105
+ // dist/server / env=server - it adds registerClientReference and registerServerReference based on directive (ssg portable)
106
+ // dist/client / env=ssr - removes use client directive and hides server modules, hides client entry or without exports (ssg portable)
107
+ // dist/static / env=client - removes use client directive and hides server modules, emits client entry (and is browser portable)
108
+ async handler(code, id, { ssr } = {}) {
109
+ if (nodeModulesPattern.test(id) || !modulePattern.test(id) || !noDist(id)) {
110
+ return null;
111
+ }
112
+ let [, normalizedPath] = resolvedUserOptions.normalizer(id);
113
+ const normalizedId = id.replace(/\\/g, "/");
114
+ const normalizedServerDir = serverDir.replace(/\\/g, "/");
115
+ const normalizedClientDir = clientDir.replace(/\\/g, "/");
116
+ const isFromServerBuild = normalizedId.includes(`/${normalizedServerDir}/`) || normalizedId.includes(`dist/server/`);
117
+ const isFromClientBuild = normalizedId.includes(`/${normalizedClientDir}/`) || normalizedId.includes(`dist/client/`);
118
+ const isFromStaticBuild = normalizedId.includes(`dist/static/`);
119
+ const isBuiltFile = isBuild && /-[a-zA-Z0-9_]{6,}\.(js|mjs|cjs)$/.test(normalizedId);
120
+ const isAlreadyTransformed = code.includes(
121
+ runtimeResolvedUserOptions.loader?.registerClientReferenceName ?? "registerClientReference"
122
+ );
123
+ if (isAlreadyTransformed) {
124
+ if (runtimeResolvedUserOptions.verbose) {
125
+ this.environment?.logger?.info(
126
+ `[react-${name}-transform] Encountered already transformed file: ${id}. This indicates two transformers are running on the same file: ${this.environment?.name} and ${Object.entries(this.environment?.plugins ?? {}).map(([name2, plugin]) => `${name2} (${plugin.name})`).join(", ")}`
127
+ );
128
+ this.environment?.logger?.info("");
54
129
  }
55
- return false;
56
- };
57
- return {
58
- name: `vite-plugin-react-server:transform-${name}`,
59
- enforce: "post",
60
- // CRITICAL: Enable per-environment hooks during dev to prevent cache contamination
61
- perEnvironmentStartEndDuringDev: true,
62
- // Note: Removed applyToEnvironment - let transform hook handle filtering
63
- // With --app builds, applyToEnvironment may not be called correctly
64
- configResolved(config) {
65
- isBuild = config.command === "build";
66
- isSSR = Boolean(config.build.ssr);
67
- mode = config.mode;
68
- if (!isValidEnv(mode)) {
69
- throw new Error(`Invalid mode: ${mode}`);
70
- }
71
- // CRITICAL: Re-resolve options with runtime mode to get correct importServerPath
72
- // This ensures test mode uses react-server-dom-esm/server.node instead of server
73
- // Force re-resolve to avoid cached moduleID functions from different build contexts
74
- const runtimeOptionsResult = resolveOptions({
75
- ...userOptions,
76
- loader: {
77
- ...userOptions.loader,
78
- mode: mode,
79
- },
80
- }, true); // Force resolve to bypass cache
81
- if (runtimeOptionsResult.type === "success") {
82
- runtimeResolvedUserOptions = runtimeOptionsResult.userOptions;
83
- }
84
- // CRITICAL: Update moduleID function with correct configEnv for build mode
85
- // This ensures client component hashing uses the correct build context
86
- // ALWAYS recreate the moduleID to ensure it matches the current command
87
- if (runtimeResolvedUserOptions.loader) {
88
- runtimeResolvedUserOptions.loader.moduleID = createDefaultModuleID(runtimeResolvedUserOptions, {
89
- command: config.command,
90
- mode: config.mode,
91
- isSsrBuild: isSSR,
92
- isPreview: false,
93
- }, mode);
94
- }
95
- // Note: condition override is set in env plugin during config phase
96
- // Verbose summary (config hook has void context, use config logger)
97
- const logger = config.customLogger || config.logger;
98
- // Only log in verbose mode
99
- if (runtimeResolvedUserOptions.verbose) {
100
- logger.info(`${logPrefix} configResolved: isBuild=${isBuild} isSSR=${isSSR} mode=${mode} allowed=${JSON.stringify(allowedEnvironments)} defaultEnv=${defaultEnvironment} importServerPath=${runtimeResolvedUserOptions.loader?.importServerPath}`);
101
- }
102
- },
103
- async buildStart() {
104
- // No longer load static manifest - rely on hash coordination to ensure consistent hashes
105
- // This removes the file I/O dependency and allows parallel builds
106
- },
107
- transform: {
108
- order: "post",
109
- // when transforming to:
110
- // dist/server / env=server - it adds registerClientReference and registerServerReference based on directive (ssg portable)
111
- // dist/client / env=ssr - removes use client directive and hides server modules, hides client entry or without exports (ssg portable)
112
- // dist/static / env=client - removes use client directive and hides server modules, emits client entry (and is browser portable)
113
- async handler(code, id, { ssr } = {}) {
114
- if (nodeModulesPattern.test(id) ||
115
- !modulePattern.test(id) ||
116
- !noDist(id)) {
117
- return null;
118
- }
119
- let [, normalizedPath] = resolvedUserOptions.normalizer(id);
120
- // Check if this is a built file that doesn't need transformation
121
- // Normalize paths to handle cross-platform differences
122
- const normalizedId = id.replace(/\\/g, "/");
123
- const normalizedServerDir = serverDir.replace(/\\/g, "/");
124
- const normalizedClientDir = clientDir.replace(/\\/g, "/");
125
- // Check if the file is from a build output directory
126
- const isFromServerBuild = normalizedId.includes(`/${normalizedServerDir}/`) ||
127
- normalizedId.includes(`dist/server/`);
128
- const isFromClientBuild = normalizedId.includes(`/${normalizedClientDir}/`) ||
129
- normalizedId.includes(`dist/client/`);
130
- const isFromStaticBuild = normalizedId.includes(`dist/static/`);
131
- // Check if this looks like a built/hashed file (should never be transformed)
132
- // Built files have hashes and are already processed
133
- const isBuiltFile = isBuild && /-[a-zA-Z0-9_]{6,}\.(js|mjs|cjs)$/.test(normalizedId);
134
- // Check if this file is already transformed (contains registerClientReference)
135
- const isAlreadyTransformed = code.includes(runtimeResolvedUserOptions.loader?.registerClientReferenceName ??
136
- "registerClientReference");
137
- if (isAlreadyTransformed) {
138
- if (runtimeResolvedUserOptions.verbose) {
139
- this.environment?.logger?.info(`[react-${name}-transform] Encountered already transformed file: ${id}. This indicates two transformers are running on the same file: ${this.environment?.name} and ${Object.entries(this.environment?.plugins ?? {})
140
- .map(([name, plugin]) => `${name} (${plugin.name})`)
141
- .join(", ")}`);
142
- this.environment?.logger?.info('');
143
- }
144
- return {
145
- code: code,
146
- map: null,
147
- };
148
- }
149
- // Check if we've already transformed this module to avoid double-hashing
150
- // Include environment context in cache key since different environments need different transformations
151
- const isServerEnv = this.environment?.name === "server";
152
- // CRITICAL: Use per-environment cache to prevent cross-environment contamination
153
- const envCache = transformationCache(this);
154
- const cacheKey = `${normalizedPath}:${isServerEnv ? "server" : "client"}:${code}`;
155
- if (envCache.has(cacheKey)) {
156
- if (runtimeResolvedUserOptions.verbose) {
157
- this.environment?.logger?.info(`[react-${name}-transform] Using cached transformation for: ${normalizedPath} (${isServerEnv ? "server" : "client"}) env=${this.environment?.name}`);
158
- }
159
- return envCache.get(cacheKey);
160
- }
161
- // Get the original source content for consistent hashing
162
- // Read the file directly to ensure we use the original content, not transformed code
163
- let originalSourceContent;
164
- try {
165
- const sourcePath = resolve(userProjectRoot, id);
166
- originalSourceContent = readFileSync(sourcePath, "utf-8");
167
- }
168
- catch (error) {
169
- // Fallback to the provided code if we can't read the file
170
- originalSourceContent = code;
171
- }
172
- // Use the original normalized path for moduleID function calls
173
- // This ensures registerClientReference calls use the correct paths
174
- let finalModuleID = runtimeResolvedUserOptions.loader?.moduleID
175
- ? runtimeResolvedUserOptions.loader.moduleID(normalizedPath, originalSourceContent)
176
- : normalizedPath;
177
- if (runtimeResolvedUserOptions.verbose) {
178
- this.environment?.logger?.info(`[react-${name}-transform] ModuleID transformation: ${normalizedPath} -> ${finalModuleID}`);
179
- }
180
- // Determine if this is a server environment
181
- // Check both the environment name and if we're doing server-side rendering for static generation
182
- const envName = this.environment?.name?.toLowerCase() || "";
183
- const isServerEnvironment = envName === "server" || envName === "rsc" || envName === "react-server";
184
- const transformer = createTransformer({
185
- parseFn: (source) => {
186
- const ast = this.parse(source, {
187
- allowReturnOutsideFunction: true,
188
- jsx: true,
189
- });
190
- return ast;
191
- },
192
- options: {
193
- loader: runtimeResolvedUserOptions.loader,
194
- verbose: runtimeResolvedUserOptions.verbose,
195
- panicThreshold: runtimeResolvedUserOptions.panicThreshold,
196
- logger: this.environment?.logger,
197
- moduleBase: userOptions.moduleBase ?? "",
198
- },
199
- // Pass the actual environment context to the transformer
200
- // Only the actual "server" environment should transform client components to registerClientReference
201
- // SSR environment needs actual React components, not placeholders
202
- isServerEnvironment: isServerEnvironment,
203
- ssr: ssr,
204
- });
205
- // Skip files from output directories that are already built and transformed
206
- // But allow transformation of server-built client components that need registerClientReference
207
- if (isFromServerBuild ||
208
- isFromClientBuild ||
209
- isFromStaticBuild ||
210
- isBuiltFile) {
211
- const buildType = isFromServerBuild
212
- ? "server"
213
- : isFromClientBuild
214
- ? "client"
215
- : isFromStaticBuild
216
- ? "static"
217
- : "built";
218
- // Allow transformation of server-built client components
219
- if (isFromServerBuild &&
220
- runtimeResolvedUserOptions.loader?.isClientComponentByName?.(id)) {
221
- if (runtimeResolvedUserOptions.verbose) {
222
- this.environment?.logger?.info(`[react-${name}-transform] Allowing transformation of server-built client component: ${id}`);
223
- }
224
- // Don't skip - let it fall through to transformer
225
- }
226
- else {
227
- if (runtimeResolvedUserOptions.verbose) {
228
- this.environment?.logger?.info(`[react-${name}-transform] Skipping built file from ${buildType} build: ${id}`);
229
- }
230
- return {
231
- code: code,
232
- map: null,
233
- };
234
- }
235
- }
236
- const transformResult = await transformer(code, normalizedPath, finalModuleID);
237
- // If transformer returns null (e.g., for built files), return original code
238
- if (!transformResult) {
239
- return { code, map: null };
240
- }
241
- const { code: transformed, map } = transformResult;
242
- // Store the transformation result in per-environment cache
243
- const result = { code: transformed, map };
244
- envCache.set(cacheKey, result);
245
- // Logging for verbose mode
246
- if (runtimeResolvedUserOptions.verbose) {
247
- const hasDirectives = code.includes('"use client"') ||
248
- code.includes('"use server"') ||
249
- code.includes("'use client'") ||
250
- code.includes("'use server'");
251
- if (transformed !== code) {
252
- this.environment?.logger?.info(`[react-${name}-transform] ` +
253
- id.split("/").pop() +
254
- (code.startsWith('"use client"') ? " (client)" : "") +
255
- (hasDirectives ? " (directives processed)" : ""));
256
- this.environment?.logger?.info(`[react-${name}-transform] ` + transformed.slice(0, 100) + "...");
257
- }
258
- else if (hasDirectives) {
259
- this.environment?.logger?.info(`[react-${name}-transform] ` +
260
- id.split("/").pop() +
261
- " (directives already processed)");
262
- }
263
- }
264
- return result;
265
- },
130
+ return {
131
+ code,
132
+ map: null
133
+ };
134
+ }
135
+ const isServerEnv = this.environment?.name === "server";
136
+ const envCache = transformationCache(this);
137
+ const cacheKey = `${normalizedPath}:${isServerEnv ? "server" : "client"}:${code}`;
138
+ if (envCache.has(cacheKey)) {
139
+ if (runtimeResolvedUserOptions.verbose) {
140
+ this.environment?.logger?.info(
141
+ `[react-${name}-transform] Using cached transformation for: ${normalizedPath} (${isServerEnv ? "server" : "client"}) env=${this.environment?.name}`
142
+ );
143
+ }
144
+ return envCache.get(cacheKey);
145
+ }
146
+ let originalSourceContent;
147
+ try {
148
+ const sourcePath = resolve(userProjectRoot, id);
149
+ originalSourceContent = readFileSync(sourcePath, "utf-8");
150
+ } catch (error) {
151
+ originalSourceContent = code;
152
+ }
153
+ let finalModuleID = runtimeResolvedUserOptions.loader?.moduleID ? runtimeResolvedUserOptions.loader.moduleID(
154
+ normalizedPath,
155
+ originalSourceContent
156
+ ) : normalizedPath;
157
+ if (runtimeResolvedUserOptions.verbose) {
158
+ this.environment?.logger?.info(
159
+ `[react-${name}-transform] ModuleID transformation: ${normalizedPath} -> ${finalModuleID}`
160
+ );
161
+ }
162
+ const envName = this.environment?.name?.toLowerCase() || "";
163
+ const isServerEnvironment = envName === "server" || envName === "rsc" || envName === "react-server";
164
+ const transformer = createTransformer({
165
+ options: {
166
+ loader: runtimeResolvedUserOptions.loader,
167
+ verbose: runtimeResolvedUserOptions.verbose,
168
+ panicThreshold: runtimeResolvedUserOptions.panicThreshold,
169
+ logger: this.environment?.logger,
170
+ moduleBase: userOptions.moduleBase ?? ""
266
171
  },
267
- };
172
+ // Pass the actual environment context to the transformer
173
+ // Only the actual "server" environment should transform client components to registerClientReference
174
+ // SSR environment needs actual React components, not placeholders
175
+ isServerEnvironment});
176
+ if (isFromServerBuild || isFromClientBuild || isFromStaticBuild || isBuiltFile) {
177
+ const buildType = isFromServerBuild ? "server" : isFromClientBuild ? "client" : isFromStaticBuild ? "static" : "built";
178
+ if (isFromServerBuild && runtimeResolvedUserOptions.loader?.isClientComponentByName?.(id)) {
179
+ if (runtimeResolvedUserOptions.verbose) {
180
+ this.environment?.logger?.info(
181
+ `[react-${name}-transform] Allowing transformation of server-built client component: ${id}`
182
+ );
183
+ }
184
+ } else {
185
+ if (runtimeResolvedUserOptions.verbose) {
186
+ this.environment?.logger?.info(
187
+ `[react-${name}-transform] Skipping built file from ${buildType} build: ${id}`
188
+ );
189
+ }
190
+ return {
191
+ code,
192
+ map: null
193
+ };
194
+ }
195
+ }
196
+ const transformResult = await transformer(
197
+ code,
198
+ normalizedPath,
199
+ finalModuleID
200
+ );
201
+ if (!transformResult) {
202
+ return { code, map: null };
203
+ }
204
+ const { code: transformed, map } = transformResult;
205
+ const result = { code: transformed, map };
206
+ envCache.set(cacheKey, result);
207
+ if (runtimeResolvedUserOptions.verbose) {
208
+ const hasDirectives = code.includes('"use client"') || code.includes('"use server"') || code.includes("'use client'") || code.includes("'use server'");
209
+ if (transformed !== code) {
210
+ this.environment?.logger?.info(
211
+ `[react-${name}-transform] ` + id.split("/").pop() + (code.startsWith('"use client"') ? " (client)" : "") + (hasDirectives ? " (directives processed)" : "")
212
+ );
213
+ this.environment?.logger?.info(
214
+ `[react-${name}-transform] ` + transformed.slice(0, 100) + "..."
215
+ );
216
+ } else if (hasDirectives) {
217
+ this.environment?.logger?.info(
218
+ `[react-${name}-transform] ` + id.split("/").pop() + " (directives already processed)"
219
+ );
220
+ }
221
+ }
222
+ return result;
223
+ }
224
+ }
268
225
  };
226
+ };
269
227
  };
228
+
229
+ export { createTransformerPlugin };
230
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlVHJhbnNmb3JtZXJQbHVnaW4uanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BsdWdpbi90cmFuc2Zvcm1lci9jcmVhdGVUcmFuc2Zvcm1lclBsdWdpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gXCJ2aXRlXCI7XG5pbXBvcnQgeyBwZXJFbnZpcm9ubWVudFN0YXRlIH0gZnJvbSBcInZpdGVcIjtcbmltcG9ydCB0eXBlIHsgVml0ZVBsdWdpbkZuIH0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyBjcmVhdGVUcmFuc2Zvcm1lciB9IGZyb20gXCIuLi9sb2FkZXIvY3JlYXRlVHJhbnNmb3JtZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgUHJvZ3JhbSB9IGZyb20gXCJhY29yblwiO1xuaW1wb3J0IHsgcmVzb2x2ZU9wdGlvbnMgfSBmcm9tIFwiLi4vY29uZmlnL3Jlc29sdmVPcHRpb25zLmpzXCI7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVzb2x2ZSwgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGdldE5vZGVFbnYsIGlzVmFsaWRFbnYgfSBmcm9tIFwiLi4vY29uZmlnL2dldE5vZGVFbnYuanNcIjtcblxuLy8gaW1wb3J0IHsgZ2V0RW52aXJvbm1lbnROYW1lIH0gZnJvbSBcIi4uL2Vudi9wbHVnaW4uanNcIjtcbmltcG9ydCB7IERFRkFVTFRfQ09ORklHIH0gZnJvbSBcIi4uL2NvbmZpZy9kZWZhdWx0cy5qc1wiO1xuaW1wb3J0IHsgcmVzb2x2ZVJlZ0V4cCB9IGZyb20gXCIuLi9jb25maWcvcmVzb2x2ZVJlZ0V4cC5qc1wiO1xuaW1wb3J0IHsgdXNlclByb2plY3RSb290IH0gZnJvbSBcIi4uL3Jvb3QuanNcIjtcbmltcG9ydCB7IGNyZWF0ZURlZmF1bHRNb2R1bGVJRCB9IGZyb20gXCIuLi9jb25maWcvY3JlYXRlTW9kdWxlSUQuanNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zvcm1lclBsdWdpbk9wdGlvbnMge1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcHRpb25hbC4gSWYgb21pdHRlZCwgc2Vuc2libGUgZGVmYXVsdHMgYXJlIGFwcGxpZWQgYmFzZWQgb24gYG5hbWVgOlxuICAgKiAtIG5hbWUgPT09IFwiY2xpZW50XCIgLT4gW1wiY2xpZW50XCIsIFwic3NyXCJdXG4gICAqIC0gbmFtZSA9PT0gXCJzZXJ2ZXJcIiAtPiBbXCJzZXJ2ZXJcIl1cbiAgICovXG4gIGFsbG93ZWRFbnZpcm9ubWVudHM/OiAoXCJjbGllbnRcIiB8IFwic2VydmVyXCIgfCBcInNzclwiKVtdO1xuICAvKipcbiAgICogT3B0aW9uYWwuIElmIG9taXR0ZWQsIHNlbnNpYmxlIGRlZmF1bHRzIGFyZSBhcHBsaWVkIGJhc2VkIG9uIGBuYW1lYDpcbiAgICogLSBuYW1lID09PSBcImNsaWVudFwiIC0+IFwiY2xpZW50XCJcbiAgICogLSBuYW1lID09PSBcInNlcnZlclwiIC0+IFwic2VydmVyXCJcbiAgICovXG4gIGRlZmF1bHRFbnZpcm9ubWVudD86IFwiY2xpZW50XCIgfCBcInNlcnZlclwiIHwgXCJzc3JcIjtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVRyYW5zZm9ybWVyUGx1Z2luID0gKFxuICBvcHRpb25zOiBUcmFuc2Zvcm1lclBsdWdpbk9wdGlvbnNcbik6IFZpdGVQbHVnaW5GbiA9PiB7XG4gIHJldHVybiAodXNlck9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB7IG5hbWUgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyBDUklUSUNBTDogVXNlIHBlci1lbnZpcm9ubWVudCBzdGF0ZSB0byBwcmV2ZW50IGNyb3NzLWVudmlyb25tZW50IGNhY2hlIGNvbnRhbWluYXRpb25cbiAgICAvLyBUaGlzIGZpeGVzIHRoZSBpc3N1ZSB3aGVyZSBzZXJ2ZXIgZW52aXJvbm1lbnQgY2FjaGVkIG1vZHVsZXMgYWZmZWN0IGNsaWVudCBlbnZpcm9ubWVudCBidWlsZHNcbiAgICBjb25zdCB0cmFuc2Zvcm1hdGlvbkNhY2hlID0gcGVyRW52aXJvbm1lbnRTdGF0ZTxcbiAgICAgIE1hcDxzdHJpbmcsIHsgY29kZTogc3RyaW5nOyBtYXA6IGFueSB9PlxuICAgID4oKCkgPT4gbmV3IE1hcCgpKTtcbiAgICBjb25zdCBkZWZhdWx0RW52aXJvbm1lbnQgPVxuICAgICAgb3B0aW9ucy5kZWZhdWx0RW52aXJvbm1lbnQgPz8gKG5hbWUgPT09IFwiY2xpZW50XCIgPyBcImNsaWVudFwiIDogXCJzZXJ2ZXJcIik7XG4gICAgY29uc3QgYWxsb3dlZEVudmlyb25tZW50cyA9XG4gICAgICBvcHRpb25zLmFsbG93ZWRFbnZpcm9ubWVudHMgPz9cbiAgICAgIChuYW1lID09PSBcImNsaWVudFwiXG4gICAgICAgID8gZGVmYXVsdEVudmlyb25tZW50ID09PSBcImNsaWVudFwiXG4gICAgICAgICAgPyBbXCJjbGllbnRcIiwgXCJzc3JcIl1cbiAgICAgICAgICA6IFtcImNsaWVudFwiXVxuICAgICAgICA6IGRlZmF1bHRFbnZpcm9ubWVudCA9PT0gXCJzZXJ2ZXJcIlxuICAgICAgICA/IFtcInNlcnZlclwiLCBcInNzclwiXVxuICAgICAgICA6IFtcInNlcnZlclwiXSk7XG4gICAgY29uc3QgbG9nUHJlZml4ID0gYFt2aXRlLXBsdWdpbi1yZWFjdC1zZXJ2ZXI6dHJhbnNmb3JtLSR7ZGVmYXVsdEVudmlyb25tZW50fS1hcy0ke25hbWV9XWA7XG5cbiAgICBjb25zdCByZXNvbHZlZE9wdGlvbnNSZXN1bHQgPSByZXNvbHZlT3B0aW9ucyh1c2VyT3B0aW9ucyk7XG4gICAgaWYgKHJlc29sdmVkT3B0aW9uc1Jlc3VsdC50eXBlID09PSBcImVycm9yXCIpXG4gICAgICB0aHJvdyByZXNvbHZlZE9wdGlvbnNSZXN1bHQuZXJyb3I7XG4gICAgY29uc3QgeyB1c2VyT3B0aW9uczogcmVzb2x2ZWRVc2VyT3B0aW9ucyB9ID0gcmVzb2x2ZWRPcHRpb25zUmVzdWx0O1xuXG4gICAgbGV0IGlzQnVpbGQgPSB0cnVlO1xuICAgIGxldCBpc1NTUiA9IHRydWU7XG4gICAgY29uc3Qgbm9kZUVudiA9IGdldE5vZGVFbnYocHJvY2Vzcy5lbnYuTk9ERV9FTlYpO1xuICAgIGxldCBtb2RlID0gbm9kZUVudjtcbiAgICBsZXQgcnVudGltZVJlc29sdmVkVXNlck9wdGlvbnMgPSByZXNvbHZlZFVzZXJPcHRpb25zO1xuXG4gICAgLy8gVXNlIGdsb2JhbCBjYWNoZSBmb3IgdHJhbnNmb3JtYXRpb24gcmVzdWx0cyB0byBlbnN1cmUgY29uc2lzdGVudCBoYXNoaW5nIGFjcm9zcyBhbGwgcGx1Z2luIGluc3RhbmNlc1xuICAgIGNvbnN0IG91dERpciA9IHJlc29sdmVkVXNlck9wdGlvbnMuYnVpbGQub3V0RGlyIHx8IFwiZGlzdFwiO1xuICAgIGNvbnN0IHNlcnZlckRpciA9IGpvaW4oXG4gICAgICBvdXREaXIsXG4gICAgICByZXNvbHZlZFVzZXJPcHRpb25zLmJ1aWxkLnNlcnZlciB8fCBcInNlcnZlclwiXG4gICAgKTtcbiAgICBjb25zdCBjbGllbnREaXIgPSBqb2luKFxuICAgICAgb3V0RGlyLFxuICAgICAgcmVzb2x2ZWRVc2VyT3B0aW9ucy5idWlsZC5jbGllbnQgfHwgXCJjbGllbnRcIlxuICAgICk7XG4gICAgY29uc3Qgc3RhdGljRGlyID0gam9pbihcbiAgICAgIG91dERpcixcbiAgICAgIHJlc29sdmVkVXNlck9wdGlvbnMuYnVpbGQuc3RhdGljIHx8IFwic3RhdGljXCJcbiAgICApO1xuICAgIGNvbnN0IG1vZHVsZVBhdHRlcm4gPSByZXNvbHZlUmVnRXhwKFxuICAgICAgdXNlck9wdGlvbnMuYXV0b0Rpc2NvdmVyPy5tb2R1bGVQYXR0ZXJuID8/XG4gICAgICAgIERFRkFVTFRfQ09ORklHLkFVVE9fRElTQ09WRVIubW9kdWxlUGF0dGVyblxuICAgICk7XG4gICAgY29uc3Qgbm9kZU1vZHVsZXNQYXR0ZXJuID0gcmVzb2x2ZVJlZ0V4cChcbiAgICAgIHVzZXJPcHRpb25zLmF1dG9EaXNjb3Zlcj8udmVuZG9yUGF0dGVybiA/P1xuICAgICAgICBERUZBVUxUX0NPTkZJRy5BVVRPX0RJU0NPVkVSLnZlbmRvclBhdHRlcm5cbiAgICApO1xuICAgIGNvbnN0IG5vRGlzdCA9IChpZDogc3RyaW5nKSA9PiB7XG4gICAgICAvLyBBbGxvdyBmaWxlcyBmcm9tIHRlc3QgZml4dHVyZXMgYW5kIHByb2plY3Qgcm9vdFxuICAgICAgaWYgKFxuICAgICAgICBpZC5zdGFydHNXaXRoKHVzZXJQcm9qZWN0Um9vdCkgfHxcbiAgICAgICAgaWQuc3RhcnRzV2l0aChqb2luKHVzZXJQcm9qZWN0Um9vdCwgb3V0RGlyKSkgfHxcbiAgICAgICAgaWQuc3RhcnRzV2l0aChqb2luKG91dERpciwgc3RhdGljRGlyKSkgfHxcbiAgICAgICAgaWQuc3RhcnRzV2l0aChqb2luKG91dERpciwgc2VydmVyRGlyKSkgfHxcbiAgICAgICAgaWQuc3RhcnRzV2l0aChqb2luKG91dERpciwgY2xpZW50RGlyKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGB2aXRlLXBsdWdpbi1yZWFjdC1zZXJ2ZXI6dHJhbnNmb3JtLSR7bmFtZX1gLFxuICAgICAgZW5mb3JjZTogXCJwb3N0XCIsXG4gICAgICAvLyBDUklUSUNBTDogRW5hYmxlIHBlci1lbnZpcm9ubWVudCBob29rcyBkdXJpbmcgZGV2IHRvIHByZXZlbnQgY2FjaGUgY29udGFtaW5hdGlvblxuICAgICAgcGVyRW52aXJvbm1lbnRTdGFydEVuZER1cmluZ0RldjogdHJ1ZSxcbiAgICAgIC8vIE5vdGU6IFJlbW92ZWQgYXBwbHlUb0Vudmlyb25tZW50IC0gbGV0IHRyYW5zZm9ybSBob29rIGhhbmRsZSBmaWx0ZXJpbmdcbiAgICAgIC8vIFdpdGggLS1hcHAgYnVpbGRzLCBhcHBseVRvRW52aXJvbm1lbnQgbWF5IG5vdCBiZSBjYWxsZWQgY29ycmVjdGx5XG4gICAgICBjb25maWdSZXNvbHZlZChjb25maWcpIHtcbiAgICAgICAgaXNCdWlsZCA9IGNvbmZpZy5jb21tYW5kID09PSBcImJ1aWxkXCI7XG4gICAgICAgIGlzU1NSID0gQm9vbGVhbihjb25maWcuYnVpbGQuc3NyKTtcbiAgICAgICAgbW9kZSA9IGNvbmZpZy5tb2RlIGFzIFwiZGV2ZWxvcG1lbnRcIiB8IFwicHJvZHVjdGlvblwiIHwgXCJ0ZXN0XCI7XG4gICAgICAgIGlmICghaXNWYWxpZEVudihtb2RlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBtb2RlOiAke21vZGV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDUklUSUNBTDogUmUtcmVzb2x2ZSBvcHRpb25zIHdpdGggcnVudGltZSBtb2RlIHRvIGdldCBjb3JyZWN0IGltcG9ydFNlcnZlclBhdGhcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRlc3QgbW9kZSB1c2VzIHJlYWN0LXNlcnZlci1kb20tZXNtL3NlcnZlci5ub2RlIGluc3RlYWQgb2Ygc2VydmVyXG4gICAgICAgIC8vIEZvcmNlIHJlLXJlc29sdmUgdG8gYXZvaWQgY2FjaGVkIG1vZHVsZUlEIGZ1bmN0aW9ucyBmcm9tIGRpZmZlcmVudCBidWlsZCBjb250ZXh0c1xuICAgICAgICBjb25zdCBydW50aW1lT3B0aW9uc1Jlc3VsdCA9IHJlc29sdmVPcHRpb25zKHtcbiAgICAgICAgICAuLi51c2VyT3B0aW9ucyxcbiAgICAgICAgICBsb2FkZXI6IHtcbiAgICAgICAgICAgIC4uLnVzZXJPcHRpb25zLmxvYWRlcixcbiAgICAgICAgICAgIG1vZGU6IG1vZGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSwgdHJ1ZSk7IC8vIEZvcmNlIHJlc29sdmUgdG8gYnlwYXNzIGNhY2hlXG4gICAgICAgIGlmIChydW50aW1lT3B0aW9uc1Jlc3VsdC50eXBlID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgIHJ1bnRpbWVSZXNvbHZlZFVzZXJPcHRpb25zID0gcnVudGltZU9wdGlvbnNSZXN1bHQudXNlck9wdGlvbnM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDUklUSUNBTDogVXBkYXRlIG1vZHVsZUlEIGZ1bmN0aW9uIHdpdGggY29ycmVjdCBjb25maWdFbnYgZm9yIGJ1aWxkIG1vZGVcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGNsaWVudCBjb21wb25lbnQgaGFzaGluZyB1c2VzIHRoZSBjb3JyZWN0IGJ1aWxkIGNvbnRleHRcbiAgICAgICAgLy8gQUxXQVlTIHJlY3JlYXRlIHRoZSBtb2R1bGVJRCB0byBlbnN1cmUgaXQgbWF0Y2hlcyB0aGUgY3VycmVudCBjb21tYW5kXG4gICAgICAgIGlmIChydW50aW1lUmVzb2x2ZWRVc2VyT3B0aW9ucy5sb2FkZXIpIHtcbiAgICAgICAgICBydW50aW1lUmVzb2x2ZWRVc2VyT3B0aW9ucy5sb2FkZXIubW9kdWxlSUQgPSBjcmVhdGVEZWZhdWx0TW9kdWxlSUQoXG4gICAgICAgICAgICBydW50aW1lUmVzb2x2ZWRVc2VyT3B0aW9ucyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29tbWFuZDogY29uZmlnLmNvbW1hbmQsXG4gICAgICAgICAgICAgIG1vZGU6IGNvbmZpZy5tb2RlLFxuICAgICAgICAgICAgICBpc1NzckJ1aWxkOiBpc1NTUixcbiAgICAgICAgICAgICAgaXNQcmV2aWV3OiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb2RlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdGU6IGNvbmRpdGlvbiBvdmVycmlkZSBpcyBzZXQgaW4gZW52IHBsdWdpbiBkdXJpbmcgY29uZmlnIHBoYXNlXG4gICAgICAgIC8vIFZlcmJvc2Ugc3VtbWFyeSAoY29uZmlnIGhvb2sgaGFzIHZvaWQgY29udGV4dCwgdXNlIGNvbmZpZyBsb2dnZXIpXG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IGNvbmZpZy5jdXN0b21Mb2dnZXIgfHwgY29uZmlnLmxvZ2dlcjtcbiAgICAgICAgLy8gT25seSBsb2cgaW4gdmVyYm9zZSBtb2RlXG4gICAgICAgIGlmIChydW50aW1lUmVzb2x2ZWRVc2VyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICBgJHtsb2dQcmVmaXh9IGNvbmZpZ1Jlc29sdmVkOiBpc0J1aWxkPSR7aXNCdWlsZH0gaXNTU1I9JHtpc1NTUn0gbW9kZT0ke21vZGV9IGFsbG93ZWQ9JHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgYWxsb3dlZEVudmlyb25tZW50c1xuICAgICAgICAgICAgKX0gZGVmYXVsdEVudj0ke2RlZmF1bHRFbnZpcm9ubWVudH0gaW1wb3J0U2VydmVyUGF0aD0ke1xuICAgICAgICAgICAgICBydW50aW1lUmVzb2x2ZWRVc2VyT3B0aW9ucy5sb2FkZXI/LmltcG9ydFNlcnZlclBhdGhcbiAgICAgICAgICAgIH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFzeW5jIGJ1aWxkU3RhcnQoKSB7XG4gICAgICAgIC8vIE5vIGxvbmdlciBsb2FkIHN0YXRpYyBtYW5pZmVzdCAtIHJlbHkgb24gaGFzaCBjb29yZGluYXRpb24gdG8gZW5zdXJlIGNvbnNpc3RlbnQgaGFzaGVzXG4gICAgICAgIC8vIFRoaXMgcmVtb3ZlcyB0aGUgZmlsZSBJL08gZGVwZW5kZW5jeSBhbmQgYWxsb3dzIHBhcmFsbGVsIGJ1aWxkc1xuICAgICAgfSxcbiAgICAgIHRyYW5zZm9ybToge1xuICAgICAgICBvcmRlcjogXCJwb3N0XCIsXG4gICAgICAgIC8vIHdoZW4gdHJhbnNmb3JtaW5nIHRvOlxuICAgICAgICAvLyBkaXN0L3NlcnZlciAvIGVudj1zZXJ2ZXIgLSBpdCBhZGRzIHJlZ2lzdGVyQ2xpZW50UmVmZXJlbmNlIGFuZCByZWdpc3RlclNlcnZlclJlZmVyZW5jZSBiYXNlZCBvbiBkaXJlY3RpdmUgKHNzZyBwb3J0YWJsZSlcbiAgICAgICAgLy8gZGlzdC9jbGllbnQgLyBlbnY9c3NyIC0gcmVtb3ZlcyB1c2UgY2xpZW50IGRpcmVjdGl2ZSBhbmQgaGlkZXMgc2VydmVyIG1vZHVsZXMsIGhpZGVzIGNsaWVudCBlbnRyeSBvciB3aXRob3V0IGV4cG9ydHMgKHNzZyBwb3J0YWJsZSlcbiAgICAgICAgLy8gZGlzdC9zdGF0aWMgLyBlbnY9Y2xpZW50ICAtICByZW1vdmVzIHVzZSBjbGllbnQgZGlyZWN0aXZlIGFuZCBoaWRlcyBzZXJ2ZXIgbW9kdWxlcywgZW1pdHMgY2xpZW50IGVudHJ5IChhbmQgaXMgYnJvd3NlciBwb3J0YWJsZSlcbiAgICAgICAgYXN5bmMgaGFuZGxlcihjb2RlLCBpZCwgeyBzc3IgfSA9IHt9KSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbm9kZU1vZHVsZXNQYXR0ZXJuLnRlc3QoaWQpIHx8XG4gICAgICAgICAgICAhbW9kdWxlUGF0dGVybi50ZXN0KGlkKSB8fFxuICAgICAgICAgICAgIW5vRGlzdChpZClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgWywgbm9ybWFsaXplZFBhdGhdID0gcmVzb2x2ZWRVc2VyT3B0aW9ucy5ub3JtYWxpemVyKGlkKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBidWlsdCBmaWxlIHRoYXQgZG9lc24ndCBuZWVkIHRyYW5zZm9ybWF0aW9uXG4gICAgICAgICAgLy8gTm9ybWFsaXplIHBhdGhzIHRvIGhhbmRsZSBjcm9zcy1wbGF0Zm9ybSBkaWZmZXJlbmNlc1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZCA9IGlkLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTZXJ2ZXJEaXIgPSBzZXJ2ZXJEaXIucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZENsaWVudERpciA9IGNsaWVudERpci5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIGlzIGZyb20gYSBidWlsZCBvdXRwdXQgZGlyZWN0b3J5XG4gICAgICAgICAgY29uc3QgaXNGcm9tU2VydmVyQnVpbGQgPVxuICAgICAgICAgICAgbm9ybWFsaXplZElkLmluY2x1ZGVzKGAvJHtub3JtYWxpemVkU2VydmVyRGlyfS9gKSB8fFxuICAgICAgICAgICAgbm9ybWFsaXplZElkLmluY2x1ZGVzKGBkaXN0L3NlcnZlci9gKTtcbiAgICAgICAgICBjb25zdCBpc0Zyb21DbGllbnRCdWlsZCA9XG4gICAgICAgICAgICBub3JtYWxpemVkSWQuaW5jbHVkZXMoYC8ke25vcm1hbGl6ZWRDbGllbnREaXJ9L2ApIHx8XG4gICAgICAgICAgICBub3JtYWxpemVkSWQuaW5jbHVkZXMoYGRpc3QvY2xpZW50L2ApO1xuICAgICAgICAgIGNvbnN0IGlzRnJvbVN0YXRpY0J1aWxkID0gbm9ybWFsaXplZElkLmluY2x1ZGVzKGBkaXN0L3N0YXRpYy9gKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbG9va3MgbGlrZSBhIGJ1aWx0L2hhc2hlZCBmaWxlIChzaG91bGQgbmV2ZXIgYmUgdHJhbnNmb3JtZWQpXG4gICAgICAgICAgLy8gQnVpbHQgZmlsZXMgaGF2ZSBoYXNoZXMgYW5kIGFyZSBhbHJlYWR5IHByb2Nlc3NlZFxuICAgICAgICAgIGNvbnN0IGlzQnVpbHRGaWxlID1cbiAgICAgICAgICAgIGlzQnVpbGQgJiYgLy1bYS16QS1aMC05X117Nix9XFwuKGpzfG1qc3xjanMpJC8udGVzdChub3JtYWxpemVkSWQpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBmaWxlIGlzIGFscmVhZHkgdHJhbnNmb3JtZWQgKGNvbnRhaW5zIHJlZ2lzdGVyQ2xpZW50UmVmZXJlbmNlKVxuICAgICAgICAgIGNvbnN0IGlzQWxyZWFkeVRyYW5zZm9ybWVkID0gY29kZS5pbmNsdWRlcyhcbiAgICAgICAgICAgIHJ1bnRpbWVSZXNvbHZlZFVzZXJPcHRpb25zLmxvYWRlcj8ucmVnaXN0ZXJDbGllbnRSZWZlcmVuY2VOYW1lID8/XG4gICAgICAgICAgICAgIFwicmVnaXN0ZXJDbGllbnRSZWZlcmVuY2VcIlxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGlzQWxyZWFkeVRyYW5zZm9ybWVkKSB7XG4gICAgICAgICAgICBpZiAocnVudGltZVJlc29sdmVkVXNlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICB0aGlzLmVudmlyb25tZW50Py5sb2dnZXI/LmluZm8oXG4gICAgICAgICAgICAgICAgYFtyZWFjdC0ke25hbWV9LXRyYW5zZm9ybV0gRW5jb3VudGVyZWQgYWxyZWFkeSB0cmFuc2Zvcm1lZCBmaWxlOiAke2lkfS4gVGhpcyBpbmRpY2F0ZXMgdHdvIHRyYW5zZm9ybWVycyBhcmUgcnVubmluZyBvbiB0aGUgc2FtZSBmaWxlOiAke1xuICAgICAgICAgICAgICAgICAgdGhpcy5lbnZpcm9ubWVudD8ubmFtZVxuICAgICAgICAgICAgICAgIH0gYW5kICR7T2JqZWN0LmVudHJpZXModGhpcy5lbnZpcm9ubWVudD8ucGx1Z2lucyA/PyB7fSlcbiAgICAgICAgICAgICAgICAgIC5tYXAoKFtuYW1lLCBwbHVnaW5dKSA9PiBgJHtuYW1lfSAoJHtwbHVnaW4ubmFtZX0pYClcbiAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB0aGlzLmVudmlyb25tZW50Py5sb2dnZXI/LmluZm8oJycpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb2RlOiBjb2RlLFxuICAgICAgICAgICAgICBtYXA6IG51bGwsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGlmIHdlJ3ZlIGFscmVhZHkgdHJhbnNmb3JtZWQgdGhpcyBtb2R1bGUgdG8gYXZvaWQgZG91YmxlLWhhc2hpbmdcbiAgICAgICAgICAvLyBJbmNsdWRlIGVudmlyb25tZW50IGNvbnRleHQgaW4gY2FjaGUga2V5IHNpbmNlIGRpZmZlcmVudCBlbnZpcm9ubWVudHMgbmVlZCBkaWZmZXJlbnQgdHJhbnNmb3JtYXRpb25zXG4gICAgICAgICAgY29uc3QgaXNTZXJ2ZXJFbnYgPSB0aGlzLmVudmlyb25tZW50Py5uYW1lID09PSBcInNlcnZlclwiO1xuICAgICAgICAgIC8vIENSSVRJQ0FMOiBVc2UgcGVyLWVudmlyb25tZW50IGNhY2hlIHRvIHByZXZlbnQgY3Jvc3MtZW52aXJvbm1lbnQgY29udGFtaW5hdGlvblxuICAgICAgICAgIGNvbnN0IGVudkNhY2hlID0gdHJhbnNmb3JtYXRpb25DYWNoZSh0aGlzKTtcbiAgICAgICAgICBjb25zdCBjYWNoZUtleSA9IGAke25vcm1hbGl6ZWRQYXRofToke1xuICAgICAgICAgICAgaXNTZXJ2ZXJFbnYgPyBcInNlcnZlclwiIDogXCJjbGllbnRcIlxuICAgICAgICAgIH06JHtjb2RlfWA7XG4gICAgICAgICAgaWYgKGVudkNhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgICAgICAgIGlmIChydW50aW1lUmVzb2x2ZWRVc2VyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgIHRoaXMuZW52aXJvbm1lbnQ/LmxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgICAgICBgW3JlYWN0LSR7bmFtZX0tdHJhbnNmb3JtXSBVc2luZyBjYWNoZWQgdHJhbnNmb3JtYXRpb24gZm9yOiAke25vcm1hbGl6ZWRQYXRofSAoJHtcbiAgICAgICAgICAgICAgICAgIGlzU2VydmVyRW52ID8gXCJzZXJ2ZXJcIiA6IFwiY2xpZW50XCJcbiAgICAgICAgICAgICAgICB9KSBlbnY9JHt0aGlzLmVudmlyb25tZW50Py5uYW1lfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbnZDYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEdldCB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQgZm9yIGNvbnNpc3RlbnQgaGFzaGluZ1xuICAgICAgICAgIC8vIFJlYWQgdGhlIGZpbGUgZGlyZWN0bHkgdG8gZW5zdXJlIHdlIHVzZSB0aGUgb3JpZ2luYWwgY29udGVudCwgbm90IHRyYW5zZm9ybWVkIGNvZGVcbiAgICAgICAgICBsZXQgb3JpZ2luYWxTb3VyY2VDb250ZW50OiBzdHJpbmc7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVBhdGggPSByZXNvbHZlKHVzZXJQcm9qZWN0Um9vdCwgaWQpO1xuICAgICAgICAgICAgb3JpZ2luYWxTb3VyY2VDb250ZW50ID0gcmVhZEZpbGVTeW5jKHNvdXJjZVBhdGgsIFwidXRmLThcIik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIHRoZSBwcm92aWRlZCBjb2RlIGlmIHdlIGNhbid0IHJlYWQgdGhlIGZpbGVcbiAgICAgICAgICAgIG9yaWdpbmFsU291cmNlQ29udGVudCA9IGNvZGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXNlIHRoZSBvcmlnaW5hbCBub3JtYWxpemVkIHBhdGggZm9yIG1vZHVsZUlEIGZ1bmN0aW9uIGNhbGxzXG4gICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHJlZ2lzdGVyQ2xpZW50UmVmZXJlbmNlIGNhbGxzIHVzZSB0aGUgY29ycmVjdCBwYXRoc1xuICAgICAgICAgIGxldCBmaW5hbE1vZHVsZUlEID0gcnVudGltZVJlc29sdmVkVXNlck9wdGlvbnMubG9hZGVyPy5tb2R1bGVJRFxuICAgICAgICAgICAgPyBydW50aW1lUmVzb2x2ZWRVc2VyT3B0aW9ucy5sb2FkZXIubW9kdWxlSUQoXG4gICAgICAgICAgICAgICAgbm9ybWFsaXplZFBhdGgsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxTb3VyY2VDb250ZW50XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogbm9ybWFsaXplZFBhdGg7XG5cbiAgICAgICAgICBpZiAocnVudGltZVJlc29sdmVkVXNlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgdGhpcy5lbnZpcm9ubWVudD8ubG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgICBgW3JlYWN0LSR7bmFtZX0tdHJhbnNmb3JtXSBNb2R1bGVJRCB0cmFuc2Zvcm1hdGlvbjogJHtub3JtYWxpemVkUGF0aH0gLT4gJHtmaW5hbE1vZHVsZUlEfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBzZXJ2ZXIgZW52aXJvbm1lbnRcbiAgICAgICAgICAvLyBDaGVjayBib3RoIHRoZSBlbnZpcm9ubWVudCBuYW1lIGFuZCBpZiB3ZSdyZSBkb2luZyBzZXJ2ZXItc2lkZSByZW5kZXJpbmcgZm9yIHN0YXRpYyBnZW5lcmF0aW9uXG4gICAgICAgICAgY29uc3QgZW52TmFtZSA9IHRoaXMuZW52aXJvbm1lbnQ/Lm5hbWU/LnRvTG93ZXJDYXNlKCkgfHwgXCJcIjtcbiAgICAgICAgICBjb25zdCBpc1NlcnZlckVudmlyb25tZW50ID0gZW52TmFtZSA9PT0gXCJzZXJ2ZXJcIiB8fCBlbnZOYW1lID09PSBcInJzY1wiIHx8IGVudk5hbWUgPT09IFwicmVhY3Qtc2VydmVyXCI7XG5cbiAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IGNyZWF0ZVRyYW5zZm9ybWVyKHtcbiAgICAgICAgICAgIHBhcnNlRm46IChzb3VyY2UpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgYXN0ID0gdGhpcy5wYXJzZShzb3VyY2UsIHtcbiAgICAgICAgICAgICAgICBhbGxvd1JldHVybk91dHNpZGVGdW5jdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBqc3g6IHRydWUsXG4gICAgICAgICAgICAgIH0pIGFzIFByb2dyYW07XG4gICAgICAgICAgICAgIHJldHVybiBhc3Q7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICBsb2FkZXI6IHJ1bnRpbWVSZXNvbHZlZFVzZXJPcHRpb25zLmxvYWRlcixcbiAgICAgICAgICAgICAgdmVyYm9zZTogcnVudGltZVJlc29sdmVkVXNlck9wdGlvbnMudmVyYm9zZSxcbiAgICAgICAgICAgICAgcGFuaWNUaHJlc2hvbGQ6IHJ1bnRpbWVSZXNvbHZlZFVzZXJPcHRpb25zLnBhbmljVGhyZXNob2xkLFxuICAgICAgICAgICAgICBsb2dnZXI6IHRoaXMuZW52aXJvbm1lbnQ/LmxvZ2dlcixcbiAgICAgICAgICAgICAgbW9kdWxlQmFzZTogdXNlck9wdGlvbnMubW9kdWxlQmFzZSA/PyBcIlwiLFxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gUGFzcyB0aGUgYWN0dWFsIGVudmlyb25tZW50IGNvbnRleHQgdG8gdGhlIHRyYW5zZm9ybWVyXG4gICAgICAgICAgICAvLyBPbmx5IHRoZSBhY3R1YWwgXCJzZXJ2ZXJcIiBlbnZpcm9ubWVudCBzaG91bGQgdHJhbnNmb3JtIGNsaWVudCBjb21wb25lbnRzIHRvIHJlZ2lzdGVyQ2xpZW50UmVmZXJlbmNlXG4gICAgICAgICAgICAvLyBTU1IgZW52aXJvbm1lbnQgbmVlZHMgYWN0dWFsIFJlYWN0IGNvbXBvbmVudHMsIG5vdCBwbGFjZWhvbGRlcnNcbiAgICAgICAgICAgIGlzU2VydmVyRW52aXJvbm1lbnQ6IGlzU2VydmVyRW52aXJvbm1lbnQsXG4gICAgICAgICAgICBzc3I6IHNzcixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFNraXAgZmlsZXMgZnJvbSBvdXRwdXQgZGlyZWN0b3JpZXMgdGhhdCBhcmUgYWxyZWFkeSBidWlsdCBhbmQgdHJhbnNmb3JtZWRcbiAgICAgICAgICAvLyBCdXQgYWxsb3cgdHJhbnNmb3JtYXRpb24gb2Ygc2VydmVyLWJ1aWx0IGNsaWVudCBjb21wb25lbnRzIHRoYXQgbmVlZCByZWdpc3RlckNsaWVudFJlZmVyZW5jZVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNGcm9tU2VydmVyQnVpbGQgfHxcbiAgICAgICAgICAgIGlzRnJvbUNsaWVudEJ1aWxkIHx8XG4gICAgICAgICAgICBpc0Zyb21TdGF0aWNCdWlsZCB8fFxuICAgICAgICAgICAgaXNCdWlsdEZpbGVcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkVHlwZSA9IGlzRnJvbVNlcnZlckJ1aWxkXG4gICAgICAgICAgICAgID8gXCJzZXJ2ZXJcIlxuICAgICAgICAgICAgICA6IGlzRnJvbUNsaWVudEJ1aWxkXG4gICAgICAgICAgICAgID8gXCJjbGllbnRcIlxuICAgICAgICAgICAgICA6IGlzRnJvbVN0YXRpY0J1aWxkXG4gICAgICAgICAgICAgID8gXCJzdGF0aWNcIlxuICAgICAgICAgICAgICA6IFwiYnVpbHRcIjtcblxuICAgICAgICAgICAgLy8gQWxsb3cgdHJhbnNmb3JtYXRpb24gb2Ygc2VydmVyLWJ1aWx0IGNsaWVudCBjb21wb25lbnRzXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGlzRnJvbVNlcnZlckJ1aWxkICYmXG4gICAgICAgICAgICAgIHJ1bnRpbWVSZXNvbHZlZFVzZXJPcHRpb25zLmxvYWRlcj8uaXNDbGllbnRDb21wb25lbnRCeU5hbWU/LihpZClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpZiAocnVudGltZVJlc29sdmVkVXNlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW52aXJvbm1lbnQ/LmxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgICAgICAgIGBbcmVhY3QtJHtuYW1lfS10cmFuc2Zvcm1dIEFsbG93aW5nIHRyYW5zZm9ybWF0aW9uIG9mIHNlcnZlci1idWlsdCBjbGllbnQgY29tcG9uZW50OiAke2lkfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIERvbid0IHNraXAgLSBsZXQgaXQgZmFsbCB0aHJvdWdoIHRvIHRyYW5zZm9ybWVyXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocnVudGltZVJlc29sdmVkVXNlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW52aXJvbm1lbnQ/LmxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgICAgICAgIGBbcmVhY3QtJHtuYW1lfS10cmFuc2Zvcm1dIFNraXBwaW5nIGJ1aWx0IGZpbGUgZnJvbSAke2J1aWxkVHlwZX0gYnVpbGQ6ICR7aWR9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBjb2RlLFxuICAgICAgICAgICAgICAgIG1hcDogbnVsbCxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1SZXN1bHQgPSBhd2FpdCB0cmFuc2Zvcm1lcihcbiAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICBub3JtYWxpemVkUGF0aCxcbiAgICAgICAgICAgIGZpbmFsTW9kdWxlSURcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gSWYgdHJhbnNmb3JtZXIgcmV0dXJucyBudWxsIChlLmcuLCBmb3IgYnVpbHQgZmlsZXMpLCByZXR1cm4gb3JpZ2luYWwgY29kZVxuICAgICAgICAgIGlmICghdHJhbnNmb3JtUmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4geyBjb2RlLCBtYXA6IG51bGwgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB7IGNvZGU6IHRyYW5zZm9ybWVkLCBtYXAgfSA9IHRyYW5zZm9ybVJlc3VsdDtcblxuICAgICAgICAgIC8vIFN0b3JlIHRoZSB0cmFuc2Zvcm1hdGlvbiByZXN1bHQgaW4gcGVyLWVudmlyb25tZW50IGNhY2hlXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0geyBjb2RlOiB0cmFuc2Zvcm1lZCwgbWFwIH07XG4gICAgICAgICAgZW52Q2FjaGUuc2V0KGNhY2hlS2V5LCByZXN1bHQpO1xuXG4gICAgICAgICAgLy8gTG9nZ2luZyBmb3IgdmVyYm9zZSBtb2RlXG4gICAgICAgICAgaWYgKHJ1bnRpbWVSZXNvbHZlZFVzZXJPcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhc0RpcmVjdGl2ZXMgPVxuICAgICAgICAgICAgICBjb2RlLmluY2x1ZGVzKCdcInVzZSBjbGllbnRcIicpIHx8XG4gICAgICAgICAgICAgIGNvZGUuaW5jbHVkZXMoJ1widXNlIHNlcnZlclwiJykgfHxcbiAgICAgICAgICAgICAgY29kZS5pbmNsdWRlcyhcIid1c2UgY2xpZW50J1wiKSB8fFxuICAgICAgICAgICAgICBjb2RlLmluY2x1ZGVzKFwiJ3VzZSBzZXJ2ZXInXCIpO1xuXG4gICAgICAgICAgICBpZiAodHJhbnNmb3JtZWQgIT09IGNvZGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5lbnZpcm9ubWVudD8ubG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgICAgIGBbcmVhY3QtJHtuYW1lfS10cmFuc2Zvcm1dIGAgK1xuICAgICAgICAgICAgICAgICAgaWQuc3BsaXQoXCIvXCIpLnBvcCgpICtcbiAgICAgICAgICAgICAgICAgIChjb2RlLnN0YXJ0c1dpdGgoJ1widXNlIGNsaWVudFwiJykgPyBcIiAoY2xpZW50KVwiIDogXCJcIikgK1xuICAgICAgICAgICAgICAgICAgKGhhc0RpcmVjdGl2ZXMgPyBcIiAoZGlyZWN0aXZlcyBwcm9jZXNzZWQpXCIgOiBcIlwiKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB0aGlzLmVudmlyb25tZW50Py5sb2dnZXI/LmluZm8oXG4gICAgICAgICAgICAgICAgYFtyZWFjdC0ke25hbWV9LXRyYW5zZm9ybV0gYCArIHRyYW5zZm9ybWVkLnNsaWNlKDAsIDEwMCkgKyBcIi4uLlwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhhc0RpcmVjdGl2ZXMpIHtcbiAgICAgICAgICAgICAgdGhpcy5lbnZpcm9ubWVudD8ubG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgICAgIGBbcmVhY3QtJHtuYW1lfS10cmFuc2Zvcm1dIGAgK1xuICAgICAgICAgICAgICAgICAgaWQuc3BsaXQoXCIvXCIpLnBvcCgpICtcbiAgICAgICAgICAgICAgICAgIFwiIChkaXJlY3RpdmVzIGFscmVhZHkgcHJvY2Vzc2VkKVwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSBhcyBQbHVnaW47XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbIm5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQ2EsTUFBQSx1QkFBQSxHQUEwQixDQUNyQyxPQUNpQixLQUFBO0FBQ2pCLEVBQUEsT0FBTyxDQUFDLFdBQWdCLEtBQUE7QUFDdEIsSUFBTSxNQUFBLEVBQUUsTUFBUyxHQUFBLE9BQUE7QUFJakIsSUFBQSxNQUFNLG1CQUFzQixHQUFBLG1CQUFBLENBRTFCLHNCQUFNLElBQUksS0FBSyxDQUFBO0FBQ2pCLElBQUEsTUFBTSxrQkFDSixHQUFBLE9BQUEsQ0FBUSxrQkFBdUIsS0FBQSxJQUFBLEtBQVMsV0FBVyxRQUFXLEdBQUEsUUFBQSxDQUFBO0FBQ2hFLElBQU0sTUFBQSxtQkFBQSxHQUNKLFFBQVEsbUJBQ1AsS0FBQSxJQUFBLEtBQVMsV0FDTixrQkFBdUIsS0FBQSxRQUFBLEdBQ3JCLENBQUMsUUFBVSxFQUFBLEtBQUssSUFDaEIsQ0FBQyxRQUFRLElBQ1gsa0JBQXVCLEtBQUEsUUFBQSxHQUN2QixDQUFDLFFBQVUsRUFBQSxLQUFLLENBQ2hCLEdBQUEsQ0FBQyxRQUFRLENBQUEsQ0FBQTtBQUNmLElBQUEsTUFBTSxTQUFZLEdBQUEsQ0FBQSxvQ0FBQSxFQUF1QyxrQkFBa0IsQ0FBQSxJQUFBLEVBQU8sSUFBSSxDQUFBLENBQUEsQ0FBQTtBQUV0RixJQUFNLE1BQUEscUJBQUEsR0FBd0IsZUFBZSxXQUFXLENBQUE7QUFDeEQsSUFBQSxJQUFJLHNCQUFzQixJQUFTLEtBQUEsT0FBQTtBQUNqQyxNQUFBLE1BQU0scUJBQXNCLENBQUEsS0FBQTtBQUM5QixJQUFNLE1BQUEsRUFBRSxXQUFhLEVBQUEsbUJBQUEsRUFBd0IsR0FBQSxxQkFBQTtBQUU3QyxJQUFBLElBQUksT0FBVSxHQUFBLElBQUE7QUFDZCxJQUFBLElBQUksS0FBUSxHQUFBLElBQUE7QUFDWixJQUFBLE1BQU0sT0FBVSxHQUFBLFVBQUEsQ0FBVyxPQUFRLENBQUEsR0FBQSxDQUFJLFFBQVEsQ0FBQTtBQUMvQyxJQUFBLElBQUksSUFBTyxHQUFBLE9BQUE7QUFDWCxJQUFBLElBQUksMEJBQTZCLEdBQUEsbUJBQUE7QUFHakMsSUFBTSxNQUFBLE1BQUEsR0FBUyxtQkFBb0IsQ0FBQSxLQUFBLENBQU0sTUFBVSxJQUFBLE1BQUE7QUFDbkQsSUFBQSxNQUFNLFNBQVksR0FBQSxJQUFBO0FBQUEsTUFDaEIsTUFBQTtBQUFBLE1BQ0EsbUJBQUEsQ0FBb0IsTUFBTSxNQUFVLElBQUE7QUFBQSxLQUN0QztBQUNBLElBQUEsTUFBTSxTQUFZLEdBQUEsSUFBQTtBQUFBLE1BQ2hCLE1BQUE7QUFBQSxNQUNBLG1CQUFBLENBQW9CLE1BQU0sTUFBVSxJQUFBO0FBQUEsS0FDdEM7QUFDQSxJQUFBLE1BQU0sU0FBWSxHQUFBLElBQUE7QUFBQSxNQUNoQixNQUFBO0FBQUEsTUFDQSxtQkFBQSxDQUFvQixNQUFNLE1BQVUsSUFBQTtBQUFBLEtBQ3RDO0FBQ0EsSUFBQSxNQUFNLGFBQWdCLEdBQUEsYUFBQTtBQUFBLE1BQ3BCLFdBQVksQ0FBQSxZQUFBLEVBQWMsYUFDeEIsSUFBQSxjQUFBLENBQWUsYUFBYyxDQUFBO0FBQUEsS0FDakM7QUFDQSxJQUFBLE1BQU0sa0JBQXFCLEdBQUEsYUFBQTtBQUFBLE1BQ3pCLFdBQVksQ0FBQSxZQUFBLEVBQWMsYUFDeEIsSUFBQSxjQUFBLENBQWUsYUFBYyxDQUFBO0FBQUEsS0FDakM7QUFDQSxJQUFNLE1BQUEsTUFBQSxHQUFTLENBQUMsRUFBZSxLQUFBO0FBRTdCLE1BQUEsSUFDRSxFQUFHLENBQUEsVUFBQSxDQUFXLGVBQWUsQ0FBQSxJQUM3QixFQUFHLENBQUEsVUFBQSxDQUFXLElBQUssQ0FBQSxlQUFBLEVBQWlCLE1BQU0sQ0FBQyxDQUMzQyxJQUFBLEVBQUEsQ0FBRyxXQUFXLElBQUssQ0FBQSxNQUFBLEVBQVEsU0FBUyxDQUFDLENBQ3JDLElBQUEsRUFBQSxDQUFHLFVBQVcsQ0FBQSxJQUFBLENBQUssUUFBUSxTQUFTLENBQUMsQ0FDckMsSUFBQSxFQUFBLENBQUcsVUFBVyxDQUFBLElBQUEsQ0FBSyxNQUFRLEVBQUEsU0FBUyxDQUFDLENBQ3JDLEVBQUE7QUFDQSxRQUFPLE9BQUEsSUFBQTtBQUFBO0FBRVQsTUFBTyxPQUFBLEtBQUE7QUFBQSxLQUNUO0FBRUEsSUFBTyxPQUFBO0FBQUEsTUFDTCxJQUFBLEVBQU0sc0NBQXNDLElBQUksQ0FBQSxDQUFBO0FBQUEsTUFDaEQsT0FBUyxFQUFBLE1BQUE7QUFBQTtBQUFBLE1BRVQsK0JBQWlDLEVBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQSxNQUdqQyxlQUFlLE1BQVEsRUFBQTtBQUNyQixRQUFBLE9BQUEsR0FBVSxPQUFPLE9BQVksS0FBQSxPQUFBO0FBQzdCLFFBQVEsS0FBQSxHQUFBLE9BQUEsQ0FBUSxNQUFPLENBQUEsS0FBQSxDQUFNLEdBQUcsQ0FBQTtBQUNoQyxRQUFBLElBQUEsR0FBTyxNQUFPLENBQUEsSUFBQTtBQUNkLFFBQUksSUFBQSxDQUFDLFVBQVcsQ0FBQSxJQUFJLENBQUcsRUFBQTtBQUNyQixVQUFBLE1BQU0sSUFBSSxLQUFBLENBQU0sQ0FBaUIsY0FBQSxFQUFBLElBQUksQ0FBRSxDQUFBLENBQUE7QUFBQTtBQU16QyxRQUFBLE1BQU0sdUJBQXVCLGNBQWUsQ0FBQTtBQUFBLFVBQzFDLEdBQUcsV0FBQTtBQUFBLFVBQ0gsTUFBUSxFQUFBO0FBQUEsWUFDTixHQUFHLFdBQVksQ0FBQSxNQUFBO0FBQUEsWUFDZjtBQUFBO0FBQ0YsV0FDQyxJQUFJLENBQUE7QUFDUCxRQUFJLElBQUEsb0JBQUEsQ0FBcUIsU0FBUyxTQUFXLEVBQUE7QUFDM0MsVUFBQSwwQkFBQSxHQUE2QixvQkFBcUIsQ0FBQSxXQUFBO0FBQUE7QUFNcEQsUUFBQSxJQUFJLDJCQUEyQixNQUFRLEVBQUE7QUFDckMsVUFBQSwwQkFBQSxDQUEyQixPQUFPLFFBQVcsR0FBQSxxQkFBQTtBQUFBLFlBQzNDLDBCQUFBO0FBQUEsWUFDQTtBQUFBLGNBQ0UsU0FBUyxNQUFPLENBQUEsT0FBQTtBQUFBLGNBQ2hCLE1BQU0sTUFBTyxDQUFBLElBR2YsQ0FBQTtBQUFBLFlBQ0E7QUFBQSxXQUNGO0FBQUE7QUFLRixRQUFNLE1BQUEsTUFBQSxHQUFTLE1BQU8sQ0FBQSxZQUFBLElBQWdCLE1BQU8sQ0FBQSxNQUFBO0FBRTdDLFFBQUEsSUFBSSwyQkFBMkIsT0FBUyxFQUFBO0FBQ3RDLFVBQU8sTUFBQSxDQUFBLElBQUE7QUFBQSxZQUNMLENBQUEsRUFBRyxTQUFTLENBQTRCLHlCQUFBLEVBQUEsT0FBTyxVQUFVLEtBQUssQ0FBQSxNQUFBLEVBQVMsSUFBSSxDQUFBLFNBQUEsRUFBWSxJQUFLLENBQUEsU0FBQTtBQUFBLGNBQzFGO0FBQUEsYUFDRCxDQUFlLFlBQUEsRUFBQSxrQkFBa0IsQ0FDaEMsa0JBQUEsRUFBQSwwQkFBQSxDQUEyQixRQUFRLGdCQUNyQyxDQUFBO0FBQUEsV0FDRjtBQUFBO0FBQ0YsT0FDRjtBQUFBLE1BQ0EsTUFBTSxVQUFhLEdBQUE7QUFBQSxPQUduQjtBQUFBLE1BQ0EsU0FBVyxFQUFBO0FBQUEsUUFDVCxLQUFPLEVBQUEsTUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFLUCxNQUFNLFFBQVEsSUFBTSxFQUFBLEVBQUEsRUFBSSxFQUFFLEdBQUksRUFBQSxHQUFJLEVBQUksRUFBQTtBQUNwQyxVQUFBLElBQ0Usa0JBQW1CLENBQUEsSUFBQSxDQUFLLEVBQUUsQ0FBQSxJQUMxQixDQUFDLGFBQUEsQ0FBYyxJQUFLLENBQUEsRUFBRSxDQUN0QixJQUFBLENBQUMsTUFBTyxDQUFBLEVBQUUsQ0FDVixFQUFBO0FBQ0EsWUFBTyxPQUFBLElBQUE7QUFBQTtBQUVULFVBQUEsSUFBSSxHQUFHLGNBQWMsQ0FBSSxHQUFBLG1CQUFBLENBQW9CLFdBQVcsRUFBRSxDQUFBO0FBSTFELFVBQUEsTUFBTSxZQUFlLEdBQUEsRUFBQSxDQUFHLE9BQVEsQ0FBQSxLQUFBLEVBQU8sR0FBRyxDQUFBO0FBQzFDLFVBQUEsTUFBTSxtQkFBc0IsR0FBQSxTQUFBLENBQVUsT0FBUSxDQUFBLEtBQUEsRUFBTyxHQUFHLENBQUE7QUFDeEQsVUFBQSxNQUFNLG1CQUFzQixHQUFBLFNBQUEsQ0FBVSxPQUFRLENBQUEsS0FBQSxFQUFPLEdBQUcsQ0FBQTtBQUd4RCxVQUFNLE1BQUEsaUJBQUEsR0FDSixhQUFhLFFBQVMsQ0FBQSxDQUFBLENBQUEsRUFBSSxtQkFBbUIsQ0FBRyxDQUFBLENBQUEsQ0FBQSxJQUNoRCxZQUFhLENBQUEsUUFBQSxDQUFTLENBQWMsWUFBQSxDQUFBLENBQUE7QUFDdEMsVUFBTSxNQUFBLGlCQUFBLEdBQ0osYUFBYSxRQUFTLENBQUEsQ0FBQSxDQUFBLEVBQUksbUJBQW1CLENBQUcsQ0FBQSxDQUFBLENBQUEsSUFDaEQsWUFBYSxDQUFBLFFBQUEsQ0FBUyxDQUFjLFlBQUEsQ0FBQSxDQUFBO0FBQ3RDLFVBQU0sTUFBQSxpQkFBQSxHQUFvQixZQUFhLENBQUEsUUFBQSxDQUFTLENBQWMsWUFBQSxDQUFBLENBQUE7QUFJOUQsVUFBQSxNQUFNLFdBQ0osR0FBQSxPQUFBLElBQVcsa0NBQW1DLENBQUEsSUFBQSxDQUFLLFlBQVksQ0FBQTtBQUdqRSxVQUFBLE1BQU0sdUJBQXVCLElBQUssQ0FBQSxRQUFBO0FBQUEsWUFDaEMsMEJBQUEsQ0FBMkIsUUFBUSwyQkFDakMsSUFBQTtBQUFBLFdBQ0o7QUFDQSxVQUFBLElBQUksb0JBQXNCLEVBQUE7QUFDeEIsWUFBQSxJQUFJLDJCQUEyQixPQUFTLEVBQUE7QUFDdEMsY0FBQSxJQUFBLENBQUssYUFBYSxNQUFRLEVBQUEsSUFBQTtBQUFBLGdCQUN4QixDQUFVLE9BQUEsRUFBQSxJQUFJLENBQXFELGtEQUFBLEVBQUEsRUFBRSxtRUFDbkUsSUFBSyxDQUFBLFdBQUEsRUFBYSxJQUNwQixDQUFBLEtBQUEsRUFBUSxNQUFPLENBQUEsT0FBQSxDQUFRLElBQUssQ0FBQSxXQUFBLEVBQWEsV0FBVyxFQUFFLENBQ25ELENBQUEsR0FBQSxDQUFJLENBQUMsQ0FBQ0EsS0FBTSxFQUFBLE1BQU0sTUFBTSxDQUFHQSxFQUFBQSxLQUFJLENBQUssRUFBQSxFQUFBLE1BQUEsQ0FBTyxJQUFJLENBQUEsQ0FBQSxDQUFHLENBQ2xELENBQUEsSUFBQSxDQUFLLElBQUksQ0FBQyxDQUFBO0FBQUEsZUFDZjtBQUNBLGNBQUssSUFBQSxDQUFBLFdBQUEsRUFBYSxNQUFRLEVBQUEsSUFBQSxDQUFLLEVBQUUsQ0FBQTtBQUFBO0FBRW5DLFlBQU8sT0FBQTtBQUFBLGNBQ0wsSUFBQTtBQUFBLGNBQ0EsR0FBSyxFQUFBO0FBQUEsYUFDUDtBQUFBO0FBS0YsVUFBTSxNQUFBLFdBQUEsR0FBYyxJQUFLLENBQUEsV0FBQSxFQUFhLElBQVMsS0FBQSxRQUFBO0FBRS9DLFVBQU0sTUFBQSxRQUFBLEdBQVcsb0JBQW9CLElBQUksQ0FBQTtBQUN6QyxVQUFNLE1BQUEsUUFBQSxHQUFXLEdBQUcsY0FBYyxDQUFBLENBQUEsRUFDaEMsY0FBYyxRQUFXLEdBQUEsUUFDM0IsSUFBSSxJQUFJLENBQUEsQ0FBQTtBQUNSLFVBQUksSUFBQSxRQUFBLENBQVMsR0FBSSxDQUFBLFFBQVEsQ0FBRyxFQUFBO0FBQzFCLFlBQUEsSUFBSSwyQkFBMkIsT0FBUyxFQUFBO0FBQ3RDLGNBQUEsSUFBQSxDQUFLLGFBQWEsTUFBUSxFQUFBLElBQUE7QUFBQSxnQkFDeEIsQ0FBQSxPQUFBLEVBQVUsSUFBSSxDQUFBLDZDQUFBLEVBQWdELGNBQWMsQ0FBQSxFQUFBLEVBQzFFLFdBQWMsR0FBQSxRQUFBLEdBQVcsUUFDM0IsQ0FBQSxNQUFBLEVBQVMsSUFBSyxDQUFBLFdBQUEsRUFBYSxJQUFJLENBQUE7QUFBQSxlQUNqQztBQUFBO0FBRUYsWUFBTyxPQUFBLFFBQUEsQ0FBUyxJQUFJLFFBQVEsQ0FBQTtBQUFBO0FBSzlCLFVBQUksSUFBQSxxQkFBQTtBQUNKLFVBQUksSUFBQTtBQUNGLFlBQU0sTUFBQSxVQUFBLEdBQWEsT0FBUSxDQUFBLGVBQUEsRUFBaUIsRUFBRSxDQUFBO0FBQzlDLFlBQXdCLHFCQUFBLEdBQUEsWUFBQSxDQUFhLFlBQVksT0FBTyxDQUFBO0FBQUEsbUJBQ2pELEtBQU8sRUFBQTtBQUVkLFlBQXdCLHFCQUFBLEdBQUEsSUFBQTtBQUFBO0FBSzFCLFVBQUEsSUFBSSxhQUFnQixHQUFBLDBCQUFBLENBQTJCLE1BQVEsRUFBQSxRQUFBLEdBQ25ELDJCQUEyQixNQUFPLENBQUEsUUFBQTtBQUFBLFlBQ2hDLGNBQUE7QUFBQSxZQUNBO0FBQUEsV0FFRixHQUFBLGNBQUE7QUFFSixVQUFBLElBQUksMkJBQTJCLE9BQVMsRUFBQTtBQUN0QyxZQUFBLElBQUEsQ0FBSyxhQUFhLE1BQVEsRUFBQSxJQUFBO0FBQUEsY0FDeEIsQ0FBVSxPQUFBLEVBQUEsSUFBSSxDQUF3QyxxQ0FBQSxFQUFBLGNBQWMsT0FBTyxhQUFhLENBQUE7QUFBQSxhQUMxRjtBQUFBO0FBS0YsVUFBQSxNQUFNLE9BQVUsR0FBQSxJQUFBLENBQUssV0FBYSxFQUFBLElBQUEsRUFBTSxhQUFpQixJQUFBLEVBQUE7QUFDekQsVUFBQSxNQUFNLG1CQUFzQixHQUFBLE9BQUEsS0FBWSxRQUFZLElBQUEsT0FBQSxLQUFZLFNBQVMsT0FBWSxLQUFBLGNBQUE7QUFFckYsVUFBQSxNQUFNLGNBQWMsaUJBQWtCLENBQUE7QUFBQSxZQVFwQyxPQUFTLEVBQUE7QUFBQSxjQUNQLFFBQVEsMEJBQTJCLENBQUEsTUFBQTtBQUFBLGNBQ25DLFNBQVMsMEJBQTJCLENBQUEsT0FBQTtBQUFBLGNBQ3BDLGdCQUFnQiwwQkFBMkIsQ0FBQSxjQUFBO0FBQUEsY0FDM0MsTUFBQSxFQUFRLEtBQUssV0FBYSxFQUFBLE1BQUE7QUFBQSxjQUMxQixVQUFBLEVBQVksWUFBWSxVQUFjLElBQUE7QUFBQSxhQUN4QztBQUFBO0FBQUE7QUFBQTtBQUFBLFlBS0EsbUJBRUYsQ0FBQyxDQUFBO0FBS0QsVUFDRSxJQUFBLGlCQUFBLElBQ0EsaUJBQ0EsSUFBQSxpQkFBQSxJQUNBLFdBQ0EsRUFBQTtBQUNBLFlBQUEsTUFBTSxZQUFZLGlCQUNkLEdBQUEsUUFBQSxHQUNBLGlCQUNBLEdBQUEsUUFBQSxHQUNBLG9CQUNBLFFBQ0EsR0FBQSxPQUFBO0FBR0osWUFBQSxJQUNFLGlCQUNBLElBQUEsMEJBQUEsQ0FBMkIsTUFBUSxFQUFBLHVCQUFBLEdBQTBCLEVBQUUsQ0FDL0QsRUFBQTtBQUNBLGNBQUEsSUFBSSwyQkFBMkIsT0FBUyxFQUFBO0FBQ3RDLGdCQUFBLElBQUEsQ0FBSyxhQUFhLE1BQVEsRUFBQSxJQUFBO0FBQUEsa0JBQ3hCLENBQUEsT0FBQSxFQUFVLElBQUksQ0FBQSxzRUFBQSxFQUF5RSxFQUFFLENBQUE7QUFBQSxpQkFDM0Y7QUFBQTtBQUNGLGFBRUssTUFBQTtBQUNMLGNBQUEsSUFBSSwyQkFBMkIsT0FBUyxFQUFBO0FBQ3RDLGdCQUFBLElBQUEsQ0FBSyxhQUFhLE1BQVEsRUFBQSxJQUFBO0FBQUEsa0JBQ3hCLENBQVUsT0FBQSxFQUFBLElBQUksQ0FBd0MscUNBQUEsRUFBQSxTQUFTLFdBQVcsRUFBRSxDQUFBO0FBQUEsaUJBQzlFO0FBQUE7QUFFRixjQUFPLE9BQUE7QUFBQSxnQkFDTCxJQUFBO0FBQUEsZ0JBQ0EsR0FBSyxFQUFBO0FBQUEsZUFDUDtBQUFBO0FBQ0Y7QUFHRixVQUFBLE1BQU0sa0JBQWtCLE1BQU0sV0FBQTtBQUFBLFlBQzVCLElBQUE7QUFBQSxZQUNBLGNBQUE7QUFBQSxZQUNBO0FBQUEsV0FDRjtBQUdBLFVBQUEsSUFBSSxDQUFDLGVBQWlCLEVBQUE7QUFDcEIsWUFBTyxPQUFBLEVBQUUsSUFBTSxFQUFBLEdBQUEsRUFBSyxJQUFLLEVBQUE7QUFBQTtBQUczQixVQUFBLE1BQU0sRUFBRSxJQUFBLEVBQU0sV0FBYSxFQUFBLEdBQUEsRUFBUSxHQUFBLGVBQUE7QUFHbkMsVUFBQSxNQUFNLE1BQVMsR0FBQSxFQUFFLElBQU0sRUFBQSxXQUFBLEVBQWEsR0FBSSxFQUFBO0FBQ3hDLFVBQVMsUUFBQSxDQUFBLEdBQUEsQ0FBSSxVQUFVLE1BQU0sQ0FBQTtBQUc3QixVQUFBLElBQUksMkJBQTJCLE9BQVMsRUFBQTtBQUN0QyxZQUFBLE1BQU0sYUFDSixHQUFBLElBQUEsQ0FBSyxRQUFTLENBQUEsY0FBYyxLQUM1QixJQUFLLENBQUEsUUFBQSxDQUFTLGNBQWMsQ0FBQSxJQUM1QixLQUFLLFFBQVMsQ0FBQSxjQUFjLENBQzVCLElBQUEsSUFBQSxDQUFLLFNBQVMsY0FBYyxDQUFBO0FBRTlCLFlBQUEsSUFBSSxnQkFBZ0IsSUFBTSxFQUFBO0FBQ3hCLGNBQUEsSUFBQSxDQUFLLGFBQWEsTUFBUSxFQUFBLElBQUE7QUFBQSxnQkFDeEIsVUFBVSxJQUFJLENBQUEsWUFBQSxDQUFBLEdBQ1osRUFBRyxDQUFBLEtBQUEsQ0FBTSxHQUFHLENBQUUsQ0FBQSxHQUFBLEVBQ2IsSUFBQSxJQUFBLENBQUssV0FBVyxjQUFjLENBQUEsR0FBSSxXQUFjLEdBQUEsRUFBQSxDQUFBLElBQ2hELGdCQUFnQix5QkFBNEIsR0FBQSxFQUFBO0FBQUEsZUFDakQ7QUFDQSxjQUFBLElBQUEsQ0FBSyxhQUFhLE1BQVEsRUFBQSxJQUFBO0FBQUEsZ0JBQ3hCLFVBQVUsSUFBSSxDQUFBLFlBQUEsQ0FBQSxHQUFpQixZQUFZLEtBQU0sQ0FBQSxDQUFBLEVBQUcsR0FBRyxDQUFJLEdBQUE7QUFBQSxlQUM3RDtBQUFBLHVCQUNTLGFBQWUsRUFBQTtBQUN4QixjQUFBLElBQUEsQ0FBSyxhQUFhLE1BQVEsRUFBQSxJQUFBO0FBQUEsZ0JBQ3hCLENBQUEsT0FBQSxFQUFVLElBQUksQ0FDWixZQUFBLENBQUEsR0FBQSxFQUFBLENBQUcsTUFBTSxHQUFHLENBQUEsQ0FBRSxLQUNkLEdBQUE7QUFBQSxlQUNKO0FBQUE7QUFDRjtBQUdGLFVBQU8sT0FBQSxNQUFBO0FBQUE7QUFDVDtBQUNGLEtBQ0Y7QUFBQSxHQUNGO0FBQ0Y7Ozs7In0=
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Verify React experimental is available. The vendored react-server-dom-esm
3
+ * transport requires Taint APIs that only exist in React experimental builds.
4
+ * Stable React 19.x causes: "Cannot read properties of undefined (reading 'add')"
5
+ */
6
+ export declare function checkReactExperimental(): void;
7
+ //# sourceMappingURL=checkReactVersion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkReactVersion.d.ts","sourceRoot":"","sources":["../../../plugin/utils/checkReactVersion.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,sBAAsB,SAoBrC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * vite-plugin-react-server
3
+ * Copyright (c) Nico Brinkkemper
4
+ * MIT License
5
+ */
6
+ let checked = false;
7
+ function checkReactExperimental() {
8
+ if (checked) return;
9
+ checked = true;
10
+ try {
11
+ const version = globalThis.process?.versions ? require("react").version : "";
12
+ if (version && !version.includes("experimental")) {
13
+ throw new Error(
14
+ `[vite-plugin-react-server] React ${version} is not supported. This plugin requires React experimental builds. Install with: npm install react@experimental react-dom@experimental`
15
+ );
16
+ }
17
+ } catch (e) {
18
+ if (e instanceof Error && e.message.includes("not supported")) throw e;
19
+ }
20
+ }
21
+
22
+ export { checkReactExperimental };
23
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tSZWFjdFZlcnNpb24uanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BsdWdpbi91dGlscy9jaGVja1JlYWN0VmVyc2lvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJsZXQgY2hlY2tlZCA9IGZhbHNlO1xuXG4vKipcbiAqIFZlcmlmeSBSZWFjdCBleHBlcmltZW50YWwgaXMgYXZhaWxhYmxlLiBUaGUgdmVuZG9yZWQgcmVhY3Qtc2VydmVyLWRvbS1lc21cbiAqIHRyYW5zcG9ydCByZXF1aXJlcyBUYWludCBBUElzIHRoYXQgb25seSBleGlzdCBpbiBSZWFjdCBleHBlcmltZW50YWwgYnVpbGRzLlxuICogU3RhYmxlIFJlYWN0IDE5LnggY2F1c2VzOiBcIkNhbm5vdCByZWFkIHByb3BlcnRpZXMgb2YgdW5kZWZpbmVkIChyZWFkaW5nICdhZGQnKVwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1JlYWN0RXhwZXJpbWVudGFsKCkge1xuICBpZiAoY2hlY2tlZCkgcmV0dXJuO1xuICBjaGVja2VkID0gdHJ1ZTtcbiAgXG4gIHRyeSB7XG4gICAgLy8gVXNlIHJlcXVpcmUgZm9yIHN5bmMgYWNjZXNzIOKAlCBSZWFjdCBpcyBhbHdheXMgYXZhaWxhYmxlIGF0IHRoaXMgcG9pbnRcbiAgICBjb25zdCB2ZXJzaW9uOiBzdHJpbmcgPSBnbG9iYWxUaGlzLnByb2Nlc3M/LnZlcnNpb25zXG4gICAgICA/IHJlcXVpcmUoXCJyZWFjdFwiKS52ZXJzaW9uXG4gICAgICA6IFwiXCI7XG4gICAgXG4gICAgaWYgKHZlcnNpb24gJiYgIXZlcnNpb24uaW5jbHVkZXMoXCJleHBlcmltZW50YWxcIikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFt2aXRlLXBsdWdpbi1yZWFjdC1zZXJ2ZXJdIFJlYWN0ICR7dmVyc2lvbn0gaXMgbm90IHN1cHBvcnRlZC4gYCArXG4gICAgICAgIGBUaGlzIHBsdWdpbiByZXF1aXJlcyBSZWFjdCBleHBlcmltZW50YWwgYnVpbGRzLiBgICtcbiAgICAgICAgYEluc3RhbGwgd2l0aDogbnBtIGluc3RhbGwgcmVhY3RAZXhwZXJpbWVudGFsIHJlYWN0LWRvbUBleHBlcmltZW50YWxgXG4gICAgICApO1xuICAgIH1cbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKFwibm90IHN1cHBvcnRlZFwiKSkgdGhyb3cgZTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsSUFBSSxPQUFVLEdBQUEsS0FBQTtBQU9QLFNBQVMsc0JBQXlCLEdBQUE7QUFDdkMsRUFBQSxJQUFJLE9BQVMsRUFBQTtBQUNiLEVBQVUsT0FBQSxHQUFBLElBQUE7QUFFVixFQUFJLElBQUE7QUFFRixJQUFBLE1BQU0sVUFBa0IsVUFBVyxDQUFBLE9BQUEsRUFBUyxXQUN4QyxPQUFRLENBQUEsT0FBTyxFQUFFLE9BQ2pCLEdBQUEsRUFBQTtBQUVKLElBQUEsSUFBSSxPQUFXLElBQUEsQ0FBQyxPQUFRLENBQUEsUUFBQSxDQUFTLGNBQWMsQ0FBRyxFQUFBO0FBQ2hELE1BQUEsTUFBTSxJQUFJLEtBQUE7QUFBQSxRQUNSLG9DQUFvQyxPQUFPLENBQUEsc0lBQUE7QUFBQSxPQUc3QztBQUFBO0FBQ0YsV0FDTyxDQUFZLEVBQUE7QUFDbkIsSUFBQSxJQUFJLGFBQWEsS0FBUyxJQUFBLENBQUEsQ0FBRSxRQUFRLFFBQVMsQ0FBQSxlQUFlLEdBQVMsTUFBQSxDQUFBO0FBQUE7QUFFekU7Ozs7In0=