vite-plugin-react-server 1.4.2 → 1.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -313
- package/dist/package.json +123 -13
- package/dist/plugin/bundle/deferredStaticGeneration.js +14 -39
- package/dist/plugin/bundle/manifests.js +30 -48
- package/dist/plugin/config/autoDiscover/resolveAutoDiscover.d.ts.map +1 -1
- package/dist/plugin/config/autoDiscover/resolveAutoDiscover.js +4 -1
- package/dist/plugin/config/envPrefixFromConfig.js +12 -7
- package/dist/plugin/config/getCondition.d.ts.map +1 -1
- package/dist/plugin/config/getCondition.js +7 -5
- package/dist/plugin/dev-server/virtualRscHmrPlugin.js +23 -23
- package/dist/plugin/environments/createBuildEventPlugin.js +88 -98
- package/dist/plugin/environments/createEnvironmentPlugin.js +222 -250
- package/dist/plugin/helpers/createRscRenderHelpers.js +33 -34
- package/dist/plugin/helpers/createSharedLoader.d.ts.map +1 -1
- package/dist/plugin/helpers/createSharedLoader.js +4 -2
- package/dist/plugin/helpers/headlessStreamReuseHandler.js +30 -22
- package/dist/plugin/helpers/headlessStreamState.js +15 -28
- package/dist/plugin/helpers/resolveComponent.d.ts.map +1 -1
- package/dist/plugin/helpers/resolveComponent.js +4 -2
- package/dist/plugin/index.client.d.ts +5 -0
- package/dist/plugin/index.client.d.ts.map +1 -0
- package/dist/plugin/index.client.js +4 -0
- package/dist/plugin/index.d.ts +4 -3
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +10 -5
- package/dist/plugin/index.server.d.ts +5 -0
- package/dist/plugin/index.server.d.ts.map +1 -0
- package/dist/plugin/index.server.js +4 -0
- package/dist/plugin/metrics/createWorkerStartupMetrics.js +31 -13
- package/dist/plugin/orchestrator/createPluginOrchestrator.client.js +41 -38
- package/dist/plugin/orchestrator/createPluginOrchestrator.server.js +43 -46
- package/dist/plugin/plugin.client.js +2 -2
- package/dist/plugin/plugin.server.js +2 -2
- package/dist/plugin/react-static/createBuildLoader.client.js +12 -6
- package/dist/plugin/react-static/createBuildLoader.server.js +255 -235
- package/dist/plugin/react-static/plugin.client.js +684 -770
- package/dist/plugin/react-static/plugin.server.js +517 -603
- package/dist/plugin/react-static/processCssFilesForPages.js +103 -88
- package/dist/plugin/react-static/renderPage.client.js +455 -529
- package/dist/plugin/react-static/renderPage.server.js +485 -508
- package/dist/plugin/react-static/renderPagesBatched.js +277 -275
- package/dist/plugin/react-static/rscToHtmlStream.client.js +48 -29
- package/dist/plugin/react-static/rscToHtmlStream.server.js +62 -37
- package/dist/plugin/react-static/temporaryReferences.server.js +11 -2
- package/dist/plugin/stream/createMainThreadHandlers.js +40 -31
- package/dist/plugin/stream/renderRscStream.server.d.ts.map +1 -1
- package/dist/plugin/stream/renderRscStream.server.js +127 -144
- package/dist/plugin/transformer/createTransformerPlugin.js +226 -265
- package/dist/plugin/utils/checkReactVersion.d.ts +7 -0
- package/dist/plugin/utils/checkReactVersion.d.ts.map +1 -0
- package/dist/plugin/utils/checkReactVersion.js +23 -0
- package/dist/plugin/utils/envUrls.node.js +12 -11
- package/dist/plugin/vendor/vendor-alias.js +84 -114
- package/dist/plugin/vendor/vendor.client.d.ts.map +1 -1
- package/dist/plugin/vendor/vendor.client.js +1 -3
- package/dist/plugin/worker/rsc/handleRscRender.d.ts.map +1 -1
- package/dist/plugin/worker/rsc/handleRscRender.js +3 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +123 -13
- package/plugin/config/autoDiscover/resolveAutoDiscover.ts +4 -0
- package/plugin/config/getCondition.ts +6 -4
- package/plugin/helpers/createRscRenderHelpers.ts +1 -1
- package/plugin/helpers/createSharedLoader.ts +6 -1
- package/plugin/helpers/resolveComponent.ts +6 -1
- package/plugin/index.client.ts +4 -0
- package/plugin/index.server.ts +4 -0
- package/plugin/index.ts +12 -5
- package/plugin/plugin.client.ts +1 -1
- package/plugin/plugin.server.ts +1 -1
- package/plugin/stream/renderRscStream.server.ts +3 -0
- package/plugin/utils/checkReactVersion.ts +28 -0
- package/plugin/vendor/vendor.client.ts +0 -2
- package/plugin/worker/rsc/handleRscRender.ts +2 -0
- package/scripts/generate-toc.mjs +27 -294
|
@@ -1,269 +1,230 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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/LmluZm8oXG4gICAgICAgICAgICAgICAgYFtyZWFjdC0ke25hbWV9LXRyYW5zZm9ybV0gYCArIHRyYW5zZm9ybWVkLnNsaWNlKDAsIDEwMCkgKyBcIi4uLlwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhhc0RpcmVjdGl2ZXMpIHtcbiAgICAgICAgICAgICAgdGhpcy5lbnZpcm9ubWVudD8ubG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgICAgIGBbcmVhY3QtJHtuYW1lfS10cmFuc2Zvcm1dIGAgK1xuICAgICAgICAgICAgICAgICAgaWQuc3BsaXQoXCIvXCIpLnBvcCgpICtcbiAgICAgICAgICAgICAgICAgIFwiIChkaXJlY3RpdmVzIGFscmVhZHkgcHJvY2Vzc2VkKVwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSBhcyBQbHVnaW47XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbIm5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQ2EsTUFBQSx1QkFBQSxHQUEwQixDQUNyQyxPQUNpQixLQUFBO0FBQ2pCLEVBQUEsT0FBTyxDQUFDLFdBQWdCLEtBQUE7QUFDdEIsSUFBTSxNQUFBLEVBQUUsTUFBUyxHQUFBLE9BQUE7QUFJakIsSUFBQSxNQUFNLG1CQUFzQixHQUFBLG1CQUFBLENBRTFCLHNCQUFNLElBQUksS0FBSyxDQUFBO0FBQ2pCLElBQUEsTUFBTSxrQkFDSixHQUFBLE9BQUEsQ0FBUSxrQkFBdUIsS0FBQSxJQUFBLEtBQVMsV0FBVyxRQUFXLEdBQUEsUUFBQSxDQUFBO0FBQ2hFLElBQU0sTUFBQSxtQkFBQSxHQUNKLFFBQVEsbUJBQ1AsS0FBQSxJQUFBLEtBQVMsV0FDTixrQkFBdUIsS0FBQSxRQUFBLEdBQ3JCLENBQUMsUUFBVSxFQUFBLEtBQUssSUFDaEIsQ0FBQyxRQUFRLElBQ1gsa0JBQXVCLEtBQUEsUUFBQSxHQUN2QixDQUFDLFFBQVUsRUFBQSxLQUFLLENBQ2hCLEdBQUEsQ0FB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
|
|
@@ -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=
|