@tanstack/start-plugin-core 1.166.11 → 1.166.13
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/dist/esm/build-sitemap.js +94 -123
- package/dist/esm/build-sitemap.js.map +1 -1
- package/dist/esm/constants.js +15 -20
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/dev-server-plugin/dev-styles.js +137 -150
- package/dist/esm/dev-server-plugin/dev-styles.js.map +1 -1
- package/dist/esm/dev-server-plugin/extract-html-scripts.js +16 -15
- package/dist/esm/dev-server-plugin/extract-html-scripts.js.map +1 -1
- package/dist/esm/dev-server-plugin/plugin.js +125 -195
- package/dist/esm/dev-server-plugin/plugin.js.map +1 -1
- package/dist/esm/import-protection-plugin/ast.js +6 -5
- package/dist/esm/import-protection-plugin/ast.js.map +1 -1
- package/dist/esm/import-protection-plugin/constants.js +20 -22
- package/dist/esm/import-protection-plugin/constants.js.map +1 -1
- package/dist/esm/import-protection-plugin/defaults.js +35 -25
- package/dist/esm/import-protection-plugin/defaults.js.map +1 -1
- package/dist/esm/import-protection-plugin/extensionlessAbsoluteIdResolver.js +93 -92
- package/dist/esm/import-protection-plugin/extensionlessAbsoluteIdResolver.js.map +1 -1
- package/dist/esm/import-protection-plugin/matchers.js +23 -24
- package/dist/esm/import-protection-plugin/matchers.js.map +1 -1
- package/dist/esm/import-protection-plugin/plugin.js +1045 -1361
- package/dist/esm/import-protection-plugin/plugin.js.map +1 -1
- package/dist/esm/import-protection-plugin/postCompileUsage.js +58 -55
- package/dist/esm/import-protection-plugin/postCompileUsage.js.map +1 -1
- package/dist/esm/import-protection-plugin/rewriteDeniedImports.js +187 -259
- package/dist/esm/import-protection-plugin/rewriteDeniedImports.js.map +1 -1
- package/dist/esm/import-protection-plugin/sourceLocation.js +238 -248
- package/dist/esm/import-protection-plugin/sourceLocation.js.map +1 -1
- package/dist/esm/import-protection-plugin/trace.js +173 -184
- package/dist/esm/import-protection-plugin/trace.js.map +1 -1
- package/dist/esm/import-protection-plugin/utils.js +132 -111
- package/dist/esm/import-protection-plugin/utils.js.map +1 -1
- package/dist/esm/import-protection-plugin/virtualModules.js +214 -194
- package/dist/esm/import-protection-plugin/virtualModules.js.map +1 -1
- package/dist/esm/index.js +2 -7
- package/dist/esm/load-env-plugin/plugin.js +12 -11
- package/dist/esm/load-env-plugin/plugin.js.map +1 -1
- package/dist/esm/output-directory.js +10 -10
- package/dist/esm/output-directory.js.map +1 -1
- package/dist/esm/plugin.js +275 -355
- package/dist/esm/plugin.js.map +1 -1
- package/dist/esm/post-server-build.js +39 -53
- package/dist/esm/post-server-build.js.map +1 -1
- package/dist/esm/prerender.js +177 -239
- package/dist/esm/prerender.js.map +1 -1
- package/dist/esm/preview-server-plugin/plugin.js +41 -44
- package/dist/esm/preview-server-plugin/plugin.js.map +1 -1
- package/dist/esm/queue.js +115 -126
- package/dist/esm/queue.js.map +1 -1
- package/dist/esm/resolve-entries.js +31 -32
- package/dist/esm/resolve-entries.js.map +1 -1
- package/dist/esm/schema.js +156 -179
- package/dist/esm/schema.js.map +1 -1
- package/dist/esm/start-compiler-plugin/compiler.js +655 -812
- package/dist/esm/start-compiler-plugin/compiler.js.map +1 -1
- package/dist/esm/start-compiler-plugin/handleClientOnlyJSX.js +25 -8
- package/dist/esm/start-compiler-plugin/handleClientOnlyJSX.js.map +1 -1
- package/dist/esm/start-compiler-plugin/handleCreateIsomorphicFn.js +22 -19
- package/dist/esm/start-compiler-plugin/handleCreateIsomorphicFn.js.map +1 -1
- package/dist/esm/start-compiler-plugin/handleCreateMiddleware.js +20 -22
- package/dist/esm/start-compiler-plugin/handleCreateMiddleware.js.map +1 -1
- package/dist/esm/start-compiler-plugin/handleCreateServerFn.js +187 -255
- package/dist/esm/start-compiler-plugin/handleCreateServerFn.js.map +1 -1
- package/dist/esm/start-compiler-plugin/handleEnvOnly.js +23 -33
- package/dist/esm/start-compiler-plugin/handleEnvOnly.js.map +1 -1
- package/dist/esm/start-compiler-plugin/plugin.js +247 -291
- package/dist/esm/start-compiler-plugin/plugin.js.map +1 -1
- package/dist/esm/start-compiler-plugin/utils.js +27 -27
- package/dist/esm/start-compiler-plugin/utils.js.map +1 -1
- package/dist/esm/start-manifest-plugin/manifestBuilder.js +272 -378
- package/dist/esm/start-manifest-plugin/manifestBuilder.js.map +1 -1
- package/dist/esm/start-manifest-plugin/plugin.js +35 -44
- package/dist/esm/start-manifest-plugin/plugin.js.map +1 -1
- package/dist/esm/start-router-plugin/constants.js +6 -5
- package/dist/esm/start-router-plugin/constants.js.map +1 -1
- package/dist/esm/start-router-plugin/generator-plugins/prerender-routes-plugin.js +24 -19
- package/dist/esm/start-router-plugin/generator-plugins/prerender-routes-plugin.js.map +1 -1
- package/dist/esm/start-router-plugin/generator-plugins/routes-manifest-plugin.js +28 -29
- package/dist/esm/start-router-plugin/generator-plugins/routes-manifest-plugin.js.map +1 -1
- package/dist/esm/start-router-plugin/plugin.js +146 -199
- package/dist/esm/start-router-plugin/plugin.js.map +1 -1
- package/dist/esm/start-router-plugin/pruneServerOnlySubtrees.js +32 -31
- package/dist/esm/start-router-plugin/pruneServerOnlySubtrees.js.map +1 -1
- package/dist/esm/utils.js +14 -14
- package/dist/esm/utils.js.map +1 -1
- package/package.json +7 -7
- package/dist/esm/index.js.map +0 -1
|
@@ -1,171 +1,158 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
//#region src/dev-server-plugin/dev-styles.ts
|
|
3
|
+
/**
|
|
4
|
+
* CSS collection for dev mode.
|
|
5
|
+
* Crawls the Vite module graph to collect CSS from the router entry and all its dependencies.
|
|
6
|
+
*/
|
|
7
|
+
var CSS_FILE_REGEX = /\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\?)/;
|
|
8
|
+
var CSS_MODULES_REGEX = /\.module\.(css|less|sass|scss|styl|stylus)(?:$|[?#])/i;
|
|
4
9
|
function normalizeCssModuleCacheKey(idOrFile) {
|
|
5
|
-
|
|
6
|
-
return baseId.replace(/\\/g, "/");
|
|
10
|
+
return idOrFile.split("?")[0].split("#")[0].replace(/\\/g, "/");
|
|
7
11
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
var CSS_SIDE_EFFECT_FREE_PARAMS = [
|
|
13
|
+
"url",
|
|
14
|
+
"inline",
|
|
15
|
+
"raw",
|
|
16
|
+
"inline-css"
|
|
17
|
+
];
|
|
18
|
+
var VITE_CSS_MARKER = "const __vite__css = ";
|
|
19
|
+
var ESCAPE_CSS_COMMENT_START_REGEX = /\/\*/g;
|
|
20
|
+
var ESCAPE_CSS_COMMENT_END_REGEX = /\*\//g;
|
|
12
21
|
function isCssFile(file) {
|
|
13
|
-
|
|
22
|
+
return CSS_FILE_REGEX.test(file);
|
|
14
23
|
}
|
|
15
24
|
function isCssModulesFile(file) {
|
|
16
|
-
|
|
25
|
+
return CSS_MODULES_REGEX.test(file);
|
|
17
26
|
}
|
|
18
27
|
function hasCssSideEffectFreeParam(url) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
(param) => params.get(param) === "" && !url.includes(`?${param}=`) && !url.includes(`&${param}=`)
|
|
24
|
-
);
|
|
28
|
+
const queryString = url.split("?")[1];
|
|
29
|
+
if (!queryString) return false;
|
|
30
|
+
const params = new URLSearchParams(queryString);
|
|
31
|
+
return CSS_SIDE_EFFECT_FREE_PARAMS.some((param) => params.get(param) === "" && !url.includes(`?${param}=`) && !url.includes(`&${param}=`));
|
|
25
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Resolve a file path to a Vite dev server URL.
|
|
35
|
+
* Files within the root directory use relative paths, files outside use /@fs prefix.
|
|
36
|
+
*/
|
|
26
37
|
function resolveDevUrl(rootDirectory, filePath) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
);
|
|
32
|
-
const isWithinRoot = !relativePath.startsWith("..") && !path.isAbsolute(relativePath);
|
|
33
|
-
if (isWithinRoot) {
|
|
34
|
-
return path.posix.join("/", relativePath);
|
|
35
|
-
}
|
|
36
|
-
return path.posix.join("/@fs", normalizedPath);
|
|
38
|
+
const normalizedPath = filePath.replace(/\\/g, "/");
|
|
39
|
+
const relativePath = path.posix.relative(rootDirectory.replace(/\\/g, "/"), normalizedPath);
|
|
40
|
+
if (!relativePath.startsWith("..") && !path.isAbsolute(relativePath)) return path.posix.join("/", relativePath);
|
|
41
|
+
return path.posix.join("/@fs", normalizedPath);
|
|
37
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Collect CSS content from the module graph starting from the given entry points.
|
|
45
|
+
*/
|
|
38
46
|
async function collectDevStyles(opts) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
cssPromises.push(
|
|
66
|
-
fetchCssFromModule(viteDevServer, dep).then(
|
|
67
|
-
(css) => css ? [dep.url, css] : null
|
|
68
|
-
)
|
|
69
|
-
);
|
|
70
|
-
}
|
|
71
|
-
const cssResults = await Promise.all(cssPromises);
|
|
72
|
-
for (const result of cssResults) {
|
|
73
|
-
if (result) {
|
|
74
|
-
styles.set(result[0], result[1]);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
if (styles.size === 0) return void 0;
|
|
78
|
-
const parts = [];
|
|
79
|
-
for (const [fileName, css] of styles.entries()) {
|
|
80
|
-
const escapedFileName = fileName.replace(ESCAPE_CSS_COMMENT_START_REGEX, "/\\*").replace(ESCAPE_CSS_COMMENT_END_REGEX, "*\\/");
|
|
81
|
-
parts.push(`
|
|
82
|
-
/* ${escapedFileName} */
|
|
83
|
-
${css}`);
|
|
84
|
-
}
|
|
85
|
-
return parts.join("\n");
|
|
47
|
+
const { viteDevServer, entries, cssModulesCache = {} } = opts;
|
|
48
|
+
const styles = /* @__PURE__ */ new Map();
|
|
49
|
+
const visited = /* @__PURE__ */ new Set();
|
|
50
|
+
const rootDirectory = viteDevServer.config.root;
|
|
51
|
+
await Promise.all(entries.map((entry) => processEntry(viteDevServer, resolveDevUrl(rootDirectory, entry), visited)));
|
|
52
|
+
const cssPromises = [];
|
|
53
|
+
for (const dep of visited) {
|
|
54
|
+
if (hasCssSideEffectFreeParam(dep.url)) continue;
|
|
55
|
+
if (dep.file && isCssModulesFile(dep.file)) {
|
|
56
|
+
const css = cssModulesCache[normalizeCssModuleCacheKey(dep.file)];
|
|
57
|
+
if (!css) continue;
|
|
58
|
+
styles.set(dep.url, css);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (!isCssFile(dep.file ?? dep.url)) continue;
|
|
62
|
+
cssPromises.push(fetchCssFromModule(viteDevServer, dep).then((css) => css ? [dep.url, css] : null));
|
|
63
|
+
}
|
|
64
|
+
const cssResults = await Promise.all(cssPromises);
|
|
65
|
+
for (const result of cssResults) if (result) styles.set(result[0], result[1]);
|
|
66
|
+
if (styles.size === 0) return void 0;
|
|
67
|
+
const parts = [];
|
|
68
|
+
for (const [fileName, css] of styles.entries()) {
|
|
69
|
+
const escapedFileName = fileName.replace(ESCAPE_CSS_COMMENT_START_REGEX, "/\\*").replace(ESCAPE_CSS_COMMENT_END_REGEX, "*\\/");
|
|
70
|
+
parts.push(`\n/* ${escapedFileName} */\n${css}`);
|
|
71
|
+
}
|
|
72
|
+
return parts.join("\n");
|
|
86
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Process an entry URL: transform it if needed, get the module node, and crawl its dependencies.
|
|
76
|
+
*/
|
|
87
77
|
async function processEntry(viteDevServer, entryUrl, visited) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
await findModuleDeps(viteDevServer, node, visited);
|
|
78
|
+
let node = await viteDevServer.moduleGraph.getModuleByUrl(entryUrl);
|
|
79
|
+
if (!node?.ssrTransformResult) {
|
|
80
|
+
try {
|
|
81
|
+
await viteDevServer.transformRequest(entryUrl);
|
|
82
|
+
} catch {}
|
|
83
|
+
node = await viteDevServer.moduleGraph.getModuleByUrl(entryUrl);
|
|
84
|
+
}
|
|
85
|
+
if (!node || visited.has(node)) return;
|
|
86
|
+
visited.add(node);
|
|
87
|
+
await findModuleDeps(viteDevServer, node, visited);
|
|
99
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* Find all module dependencies by crawling the module graph.
|
|
91
|
+
* Uses transformResult.deps for URL-based lookups (parallel) and
|
|
92
|
+
* importedModules for already-resolved nodes (parallel).
|
|
93
|
+
*/
|
|
100
94
|
async function findModuleDeps(viteDevServer, node, visited) {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
await branches[0];
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
await Promise.all(branches);
|
|
95
|
+
const deps = node.ssrTransformResult?.deps ?? node.transformResult?.deps ?? null;
|
|
96
|
+
const importedModules = node.importedModules;
|
|
97
|
+
if ((!deps || deps.length === 0) && importedModules.size === 0) return;
|
|
98
|
+
const branches = [];
|
|
99
|
+
if (deps) for (const depUrl of deps) {
|
|
100
|
+
const dep = await viteDevServer.moduleGraph.getModuleByUrl(depUrl);
|
|
101
|
+
if (!dep) continue;
|
|
102
|
+
if (visited.has(dep)) continue;
|
|
103
|
+
visited.add(dep);
|
|
104
|
+
branches.push(findModuleDeps(viteDevServer, dep, visited));
|
|
105
|
+
}
|
|
106
|
+
for (const depNode of importedModules) {
|
|
107
|
+
if (visited.has(depNode)) continue;
|
|
108
|
+
visited.add(depNode);
|
|
109
|
+
branches.push(findModuleDeps(viteDevServer, depNode, visited));
|
|
110
|
+
}
|
|
111
|
+
if (branches.length === 1) {
|
|
112
|
+
await branches[0];
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
await Promise.all(branches);
|
|
126
116
|
}
|
|
127
117
|
async function fetchCssFromModule(viteDevServer, node) {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
return void 0;
|
|
138
|
-
}
|
|
118
|
+
const cachedCode = node.transformResult?.code ?? node.ssrTransformResult?.code;
|
|
119
|
+
if (cachedCode) return extractCssFromCode(cachedCode);
|
|
120
|
+
try {
|
|
121
|
+
const transformResult = await viteDevServer.transformRequest(node.url);
|
|
122
|
+
if (!transformResult?.code) return void 0;
|
|
123
|
+
return extractCssFromCode(transformResult.code);
|
|
124
|
+
} catch {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
139
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* Extract CSS content from Vite's transformed CSS module code.
|
|
130
|
+
*
|
|
131
|
+
* Vite embeds CSS into the module as a JS string via `JSON.stringify(cssContent)`,
|
|
132
|
+
* e.g. `const __vite__css = ${JSON.stringify('...css...')}`.
|
|
133
|
+
*
|
|
134
|
+
* We locate that JSON string literal and run `JSON.parse` on it to reverse the
|
|
135
|
+
* escaping (\\n, \\t, \\", \\\\, \\uXXXX, etc.).
|
|
136
|
+
*/
|
|
140
137
|
function extractCssFromCode(code) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
i += 2;
|
|
158
|
-
} else {
|
|
159
|
-
i++;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
return void 0;
|
|
138
|
+
const startIdx = code.indexOf(VITE_CSS_MARKER);
|
|
139
|
+
if (startIdx === -1) return void 0;
|
|
140
|
+
const valueStart = startIdx + 20;
|
|
141
|
+
if (code.charCodeAt(valueStart) !== 34) return void 0;
|
|
142
|
+
const codeLength = code.length;
|
|
143
|
+
let i = valueStart + 1;
|
|
144
|
+
while (i < codeLength) {
|
|
145
|
+
const charCode = code.charCodeAt(i);
|
|
146
|
+
if (charCode === 34) try {
|
|
147
|
+
return JSON.parse(code.slice(valueStart, i + 1));
|
|
148
|
+
} catch {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (charCode === 92) i += 2;
|
|
152
|
+
else i++;
|
|
153
|
+
}
|
|
163
154
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
isCssModulesFile,
|
|
169
|
-
normalizeCssModuleCacheKey
|
|
170
|
-
};
|
|
171
|
-
//# sourceMappingURL=dev-styles.js.map
|
|
155
|
+
//#endregion
|
|
156
|
+
export { CSS_MODULES_REGEX, collectDevStyles, normalizeCssModuleCacheKey };
|
|
157
|
+
|
|
158
|
+
//# sourceMappingURL=dev-styles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-styles.js","sources":["../../../src/dev-server-plugin/dev-styles.ts"],"sourcesContent":["/**\n * CSS collection for dev mode.\n * Crawls the Vite module graph to collect CSS from the router entry and all its dependencies.\n */\nimport path from 'node:path'\nimport type { ModuleNode, ViteDevServer } from 'vite'\n\n// CSS file extensions supported by Vite\nconst CSS_FILE_REGEX =\n /\\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\\?)/\n// CSS modules file pattern - exported for use in plugin hook filters\n// Note: allow query/hash suffix since Vite ids often include them.\nexport const CSS_MODULES_REGEX =\n /\\.module\\.(css|less|sass|scss|styl|stylus)(?:$|[?#])/i\n\nexport function normalizeCssModuleCacheKey(idOrFile: string): string {\n const baseId = idOrFile.split('?')[0]!.split('#')[0]!\n return baseId.replace(/\\\\/g, '/')\n}\n// URL params that indicate CSS should not be injected (e.g., ?url, ?inline)\nconst CSS_SIDE_EFFECT_FREE_PARAMS = ['url', 'inline', 'raw', 'inline-css']\n\n// Marker to find the CSS string in Vite's transformed output\nconst VITE_CSS_MARKER = 'const __vite__css = '\n\nconst ESCAPE_CSS_COMMENT_START_REGEX = /\\/\\*/g\nconst ESCAPE_CSS_COMMENT_END_REGEX = /\\*\\//g\n\nfunction isCssFile(file: string): boolean {\n return CSS_FILE_REGEX.test(file)\n}\n\nexport function isCssModulesFile(file: string): boolean {\n return CSS_MODULES_REGEX.test(file)\n}\n\nfunction hasCssSideEffectFreeParam(url: string): boolean {\n const queryString = url.split('?')[1]\n if (!queryString) return false\n\n const params = new URLSearchParams(queryString)\n return CSS_SIDE_EFFECT_FREE_PARAMS.some(\n (param) =>\n params.get(param) === '' &&\n !url.includes(`?${param}=`) &&\n !url.includes(`&${param}=`),\n )\n}\n\n/**\n * Resolve a file path to a Vite dev server URL.\n * Files within the root directory use relative paths, files outside use /@fs prefix.\n */\nfunction resolveDevUrl(rootDirectory: string, filePath: string): string {\n const normalizedPath = filePath.replace(/\\\\/g, '/')\n const relativePath = path.posix.relative(\n rootDirectory.replace(/\\\\/g, '/'),\n normalizedPath,\n )\n const isWithinRoot =\n !relativePath.startsWith('..') && !path.isAbsolute(relativePath)\n\n if (isWithinRoot) {\n return path.posix.join('/', relativePath)\n }\n // Files outside root need /@fs prefix\n return path.posix.join('/@fs', normalizedPath)\n}\n\nexport interface CollectDevStylesOptions {\n viteDevServer: ViteDevServer\n entries: Array<string>\n /** Cache of CSS modules content captured during transform hook */\n cssModulesCache?: Record<string, string>\n}\n\n/**\n * Collect CSS content from the module graph starting from the given entry points.\n */\nexport async function collectDevStyles(\n opts: CollectDevStylesOptions,\n): Promise<string | undefined> {\n const { viteDevServer, entries, cssModulesCache = {} } = opts\n const styles: Map<string, string> = new Map()\n const visited = new Set<ModuleNode>()\n\n const rootDirectory = viteDevServer.config.root\n\n // Process entries in parallel - each entry is independent\n await Promise.all(\n entries.map((entry) =>\n processEntry(viteDevServer, resolveDevUrl(rootDirectory, entry), visited),\n ),\n )\n\n // Collect CSS from visited modules in parallel\n const cssPromises: Array<Promise<readonly [string, string] | null>> = []\n\n for (const dep of visited) {\n if (hasCssSideEffectFreeParam(dep.url)) {\n continue\n }\n\n if (dep.file && isCssModulesFile(dep.file)) {\n const css = cssModulesCache[normalizeCssModuleCacheKey(dep.file)]\n if (!css) {\n // skip this module - it may not be a real CSS module or it may not have been transformed yet\n continue\n }\n styles.set(dep.url, css)\n continue\n }\n\n const fileOrUrl = dep.file ?? dep.url\n if (!isCssFile(fileOrUrl)) {\n continue\n }\n\n // Load regular CSS files in parallel\n cssPromises.push(\n fetchCssFromModule(viteDevServer, dep).then((css) =>\n css ? ([dep.url, css] as const) : null,\n ),\n )\n }\n\n // Wait for all CSS loads to complete\n const cssResults = await Promise.all(cssPromises)\n for (const result of cssResults) {\n if (result) {\n styles.set(result[0], result[1])\n }\n }\n\n if (styles.size === 0) return undefined\n\n const parts: Array<string> = []\n for (const [fileName, css] of styles.entries()) {\n const escapedFileName = fileName\n .replace(ESCAPE_CSS_COMMENT_START_REGEX, '/\\\\*')\n .replace(ESCAPE_CSS_COMMENT_END_REGEX, '*\\\\/')\n parts.push(`\\n/* ${escapedFileName} */\\n${css}`)\n }\n return parts.join('\\n')\n}\n\n/**\n * Process an entry URL: transform it if needed, get the module node, and crawl its dependencies.\n */\nasync function processEntry(\n viteDevServer: ViteDevServer,\n entryUrl: string,\n visited: Set<ModuleNode>,\n): Promise<void> {\n let node = await viteDevServer.moduleGraph.getModuleByUrl(entryUrl)\n\n // Only transform if not yet SSR-transformed (need ssrTransformResult.deps for crawling)\n if (!node?.ssrTransformResult) {\n try {\n await viteDevServer.transformRequest(entryUrl)\n } catch {\n // ignore - module might not exist yet\n }\n node = await viteDevServer.moduleGraph.getModuleByUrl(entryUrl)\n }\n\n if (!node || visited.has(node)) return\n\n visited.add(node)\n await findModuleDeps(viteDevServer, node, visited)\n}\n\n/**\n * Find all module dependencies by crawling the module graph.\n * Uses transformResult.deps for URL-based lookups (parallel) and\n * importedModules for already-resolved nodes (parallel).\n */\nasync function findModuleDeps(\n viteDevServer: ViteDevServer,\n node: ModuleNode,\n visited: Set<ModuleNode>,\n): Promise<void> {\n // Note: caller must add node to visited BEFORE calling this function\n // to prevent race conditions with parallel traversal\n\n // Process deps from transformResult if available (URLs including bare imports)\n const deps =\n node.ssrTransformResult?.deps ?? node.transformResult?.deps ?? null\n\n const importedModules = node.importedModules\n\n // Fast path: no deps and no imports\n if ((!deps || deps.length === 0) && importedModules.size === 0) {\n return\n }\n\n // Build branches only when needed (avoid array allocation on leaf nodes)\n const branches: Array<Promise<void>> = []\n\n if (deps) {\n for (const depUrl of deps) {\n const dep = await viteDevServer.moduleGraph.getModuleByUrl(depUrl)\n if (!dep) continue\n\n if (visited.has(dep)) continue\n visited.add(dep)\n branches.push(findModuleDeps(viteDevServer, dep, visited))\n }\n }\n\n // ALWAYS also traverse importedModules - this catches:\n // - Code-split chunks (e.g. ?tsr-split=component) not in deps\n // - Already-resolved nodes\n for (const depNode of importedModules) {\n if (visited.has(depNode)) continue\n visited.add(depNode)\n branches.push(findModuleDeps(viteDevServer, depNode, visited))\n }\n\n if (branches.length === 1) {\n await branches[0]\n return\n }\n\n await Promise.all(branches)\n}\n\nasync function fetchCssFromModule(\n viteDevServer: ViteDevServer,\n node: ModuleNode,\n): Promise<string | undefined> {\n // Use cached transform result if available\n const cachedCode = node.transformResult?.code ?? node.ssrTransformResult?.code\n if (cachedCode) {\n return extractCssFromCode(cachedCode)\n }\n\n // Otherwise request a fresh transform\n try {\n const transformResult = await viteDevServer.transformRequest(node.url)\n if (!transformResult?.code) return undefined\n\n return extractCssFromCode(transformResult.code)\n } catch {\n // Preprocessor partials (e.g., Sass files with mixins) can't compile in isolation.\n // The root stylesheet that @imports them will contain the compiled CSS.\n return undefined\n }\n}\n\n/**\n * Extract CSS content from Vite's transformed CSS module code.\n *\n * Vite embeds CSS into the module as a JS string via `JSON.stringify(cssContent)`,\n * e.g. `const __vite__css = ${JSON.stringify('...css...')}`.\n *\n * We locate that JSON string literal and run `JSON.parse` on it to reverse the\n * escaping (\\\\n, \\\\t, \\\\\", \\\\\\\\, \\\\uXXXX, etc.).\n */\nexport function extractCssFromCode(code: string): string | undefined {\n const startIdx = code.indexOf(VITE_CSS_MARKER)\n if (startIdx === -1) return undefined\n\n const valueStart = startIdx + VITE_CSS_MARKER.length\n // Vite emits `const __vite__css = ${JSON.stringify(cssContent)}` which always\n // produces double-quoted JSON string literals.\n if (code.charCodeAt(valueStart) !== 34) return undefined\n\n const codeLength = code.length\n let i = valueStart + 1\n while (i < codeLength) {\n const charCode = code.charCodeAt(i)\n // 34 = '\"'\n if (charCode === 34) {\n try {\n return JSON.parse(code.slice(valueStart, i + 1))\n } catch {\n return undefined\n }\n }\n // 92 = '\\\\'\n if (charCode === 92) {\n i += 2\n } else {\n i++\n }\n }\n\n return undefined\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dev-styles.js","names":[],"sources":["../../../src/dev-server-plugin/dev-styles.ts"],"sourcesContent":["/**\n * CSS collection for dev mode.\n * Crawls the Vite module graph to collect CSS from the router entry and all its dependencies.\n */\nimport path from 'node:path'\nimport type { ModuleNode, ViteDevServer } from 'vite'\n\n// CSS file extensions supported by Vite\nconst CSS_FILE_REGEX =\n /\\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\\?)/\n// CSS modules file pattern - exported for use in plugin hook filters\n// Note: allow query/hash suffix since Vite ids often include them.\nexport const CSS_MODULES_REGEX =\n /\\.module\\.(css|less|sass|scss|styl|stylus)(?:$|[?#])/i\n\nexport function normalizeCssModuleCacheKey(idOrFile: string): string {\n const baseId = idOrFile.split('?')[0]!.split('#')[0]!\n return baseId.replace(/\\\\/g, '/')\n}\n// URL params that indicate CSS should not be injected (e.g., ?url, ?inline)\nconst CSS_SIDE_EFFECT_FREE_PARAMS = ['url', 'inline', 'raw', 'inline-css']\n\n// Marker to find the CSS string in Vite's transformed output\nconst VITE_CSS_MARKER = 'const __vite__css = '\n\nconst ESCAPE_CSS_COMMENT_START_REGEX = /\\/\\*/g\nconst ESCAPE_CSS_COMMENT_END_REGEX = /\\*\\//g\n\nfunction isCssFile(file: string): boolean {\n return CSS_FILE_REGEX.test(file)\n}\n\nexport function isCssModulesFile(file: string): boolean {\n return CSS_MODULES_REGEX.test(file)\n}\n\nfunction hasCssSideEffectFreeParam(url: string): boolean {\n const queryString = url.split('?')[1]\n if (!queryString) return false\n\n const params = new URLSearchParams(queryString)\n return CSS_SIDE_EFFECT_FREE_PARAMS.some(\n (param) =>\n params.get(param) === '' &&\n !url.includes(`?${param}=`) &&\n !url.includes(`&${param}=`),\n )\n}\n\n/**\n * Resolve a file path to a Vite dev server URL.\n * Files within the root directory use relative paths, files outside use /@fs prefix.\n */\nfunction resolveDevUrl(rootDirectory: string, filePath: string): string {\n const normalizedPath = filePath.replace(/\\\\/g, '/')\n const relativePath = path.posix.relative(\n rootDirectory.replace(/\\\\/g, '/'),\n normalizedPath,\n )\n const isWithinRoot =\n !relativePath.startsWith('..') && !path.isAbsolute(relativePath)\n\n if (isWithinRoot) {\n return path.posix.join('/', relativePath)\n }\n // Files outside root need /@fs prefix\n return path.posix.join('/@fs', normalizedPath)\n}\n\nexport interface CollectDevStylesOptions {\n viteDevServer: ViteDevServer\n entries: Array<string>\n /** Cache of CSS modules content captured during transform hook */\n cssModulesCache?: Record<string, string>\n}\n\n/**\n * Collect CSS content from the module graph starting from the given entry points.\n */\nexport async function collectDevStyles(\n opts: CollectDevStylesOptions,\n): Promise<string | undefined> {\n const { viteDevServer, entries, cssModulesCache = {} } = opts\n const styles: Map<string, string> = new Map()\n const visited = new Set<ModuleNode>()\n\n const rootDirectory = viteDevServer.config.root\n\n // Process entries in parallel - each entry is independent\n await Promise.all(\n entries.map((entry) =>\n processEntry(viteDevServer, resolveDevUrl(rootDirectory, entry), visited),\n ),\n )\n\n // Collect CSS from visited modules in parallel\n const cssPromises: Array<Promise<readonly [string, string] | null>> = []\n\n for (const dep of visited) {\n if (hasCssSideEffectFreeParam(dep.url)) {\n continue\n }\n\n if (dep.file && isCssModulesFile(dep.file)) {\n const css = cssModulesCache[normalizeCssModuleCacheKey(dep.file)]\n if (!css) {\n // skip this module - it may not be a real CSS module or it may not have been transformed yet\n continue\n }\n styles.set(dep.url, css)\n continue\n }\n\n const fileOrUrl = dep.file ?? dep.url\n if (!isCssFile(fileOrUrl)) {\n continue\n }\n\n // Load regular CSS files in parallel\n cssPromises.push(\n fetchCssFromModule(viteDevServer, dep).then((css) =>\n css ? ([dep.url, css] as const) : null,\n ),\n )\n }\n\n // Wait for all CSS loads to complete\n const cssResults = await Promise.all(cssPromises)\n for (const result of cssResults) {\n if (result) {\n styles.set(result[0], result[1])\n }\n }\n\n if (styles.size === 0) return undefined\n\n const parts: Array<string> = []\n for (const [fileName, css] of styles.entries()) {\n const escapedFileName = fileName\n .replace(ESCAPE_CSS_COMMENT_START_REGEX, '/\\\\*')\n .replace(ESCAPE_CSS_COMMENT_END_REGEX, '*\\\\/')\n parts.push(`\\n/* ${escapedFileName} */\\n${css}`)\n }\n return parts.join('\\n')\n}\n\n/**\n * Process an entry URL: transform it if needed, get the module node, and crawl its dependencies.\n */\nasync function processEntry(\n viteDevServer: ViteDevServer,\n entryUrl: string,\n visited: Set<ModuleNode>,\n): Promise<void> {\n let node = await viteDevServer.moduleGraph.getModuleByUrl(entryUrl)\n\n // Only transform if not yet SSR-transformed (need ssrTransformResult.deps for crawling)\n if (!node?.ssrTransformResult) {\n try {\n await viteDevServer.transformRequest(entryUrl)\n } catch {\n // ignore - module might not exist yet\n }\n node = await viteDevServer.moduleGraph.getModuleByUrl(entryUrl)\n }\n\n if (!node || visited.has(node)) return\n\n visited.add(node)\n await findModuleDeps(viteDevServer, node, visited)\n}\n\n/**\n * Find all module dependencies by crawling the module graph.\n * Uses transformResult.deps for URL-based lookups (parallel) and\n * importedModules for already-resolved nodes (parallel).\n */\nasync function findModuleDeps(\n viteDevServer: ViteDevServer,\n node: ModuleNode,\n visited: Set<ModuleNode>,\n): Promise<void> {\n // Note: caller must add node to visited BEFORE calling this function\n // to prevent race conditions with parallel traversal\n\n // Process deps from transformResult if available (URLs including bare imports)\n const deps =\n node.ssrTransformResult?.deps ?? node.transformResult?.deps ?? null\n\n const importedModules = node.importedModules\n\n // Fast path: no deps and no imports\n if ((!deps || deps.length === 0) && importedModules.size === 0) {\n return\n }\n\n // Build branches only when needed (avoid array allocation on leaf nodes)\n const branches: Array<Promise<void>> = []\n\n if (deps) {\n for (const depUrl of deps) {\n const dep = await viteDevServer.moduleGraph.getModuleByUrl(depUrl)\n if (!dep) continue\n\n if (visited.has(dep)) continue\n visited.add(dep)\n branches.push(findModuleDeps(viteDevServer, dep, visited))\n }\n }\n\n // ALWAYS also traverse importedModules - this catches:\n // - Code-split chunks (e.g. ?tsr-split=component) not in deps\n // - Already-resolved nodes\n for (const depNode of importedModules) {\n if (visited.has(depNode)) continue\n visited.add(depNode)\n branches.push(findModuleDeps(viteDevServer, depNode, visited))\n }\n\n if (branches.length === 1) {\n await branches[0]\n return\n }\n\n await Promise.all(branches)\n}\n\nasync function fetchCssFromModule(\n viteDevServer: ViteDevServer,\n node: ModuleNode,\n): Promise<string | undefined> {\n // Use cached transform result if available\n const cachedCode = node.transformResult?.code ?? node.ssrTransformResult?.code\n if (cachedCode) {\n return extractCssFromCode(cachedCode)\n }\n\n // Otherwise request a fresh transform\n try {\n const transformResult = await viteDevServer.transformRequest(node.url)\n if (!transformResult?.code) return undefined\n\n return extractCssFromCode(transformResult.code)\n } catch {\n // Preprocessor partials (e.g., Sass files with mixins) can't compile in isolation.\n // The root stylesheet that @imports them will contain the compiled CSS.\n return undefined\n }\n}\n\n/**\n * Extract CSS content from Vite's transformed CSS module code.\n *\n * Vite embeds CSS into the module as a JS string via `JSON.stringify(cssContent)`,\n * e.g. `const __vite__css = ${JSON.stringify('...css...')}`.\n *\n * We locate that JSON string literal and run `JSON.parse` on it to reverse the\n * escaping (\\\\n, \\\\t, \\\\\", \\\\\\\\, \\\\uXXXX, etc.).\n */\nexport function extractCssFromCode(code: string): string | undefined {\n const startIdx = code.indexOf(VITE_CSS_MARKER)\n if (startIdx === -1) return undefined\n\n const valueStart = startIdx + VITE_CSS_MARKER.length\n // Vite emits `const __vite__css = ${JSON.stringify(cssContent)}` which always\n // produces double-quoted JSON string literals.\n if (code.charCodeAt(valueStart) !== 34) return undefined\n\n const codeLength = code.length\n let i = valueStart + 1\n while (i < codeLength) {\n const charCode = code.charCodeAt(i)\n // 34 = '\"'\n if (charCode === 34) {\n try {\n return JSON.parse(code.slice(valueStart, i + 1))\n } catch {\n return undefined\n }\n }\n // 92 = '\\\\'\n if (charCode === 92) {\n i += 2\n } else {\n i++\n }\n }\n\n return undefined\n}\n"],"mappings":"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"}
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import * as cheerio from "cheerio";
|
|
2
|
+
//#region src/dev-server-plugin/extract-html-scripts.ts
|
|
2
3
|
function extractHtmlScripts(html) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
4
|
+
const $ = cheerio.load(html);
|
|
5
|
+
const scripts = [];
|
|
6
|
+
$("script").each((_, element) => {
|
|
7
|
+
const src = $(element).attr("src");
|
|
8
|
+
const content = $(element).html() ?? void 0;
|
|
9
|
+
scripts.push({
|
|
10
|
+
src,
|
|
11
|
+
content
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
return scripts;
|
|
14
15
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
//# sourceMappingURL=extract-html-scripts.js.map
|
|
16
|
+
//#endregion
|
|
17
|
+
export { extractHtmlScripts };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=extract-html-scripts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-html-scripts.js","sources":["../../../src/dev-server-plugin/extract-html-scripts.ts"],"sourcesContent":["import * as cheerio from 'cheerio'\n\nexport function extractHtmlScripts(\n html: string,\n): Array<{ content?: string; src?: string }> {\n const $ = cheerio.load(html)\n const scripts: Array<{ content?: string; src?: string }> = []\n\n $('script').each((_, element) => {\n const src = $(element).attr('src')\n const content = $(element).html() ?? undefined\n scripts.push({\n src,\n content,\n })\n })\n\n return scripts\n}\n"],"
|
|
1
|
+
{"version":3,"file":"extract-html-scripts.js","names":[],"sources":["../../../src/dev-server-plugin/extract-html-scripts.ts"],"sourcesContent":["import * as cheerio from 'cheerio'\n\nexport function extractHtmlScripts(\n html: string,\n): Array<{ content?: string; src?: string }> {\n const $ = cheerio.load(html)\n const scripts: Array<{ content?: string; src?: string }> = []\n\n $('script').each((_, element) => {\n const src = $(element).attr('src')\n const content = $(element).html() ?? undefined\n scripts.push({\n src,\n content,\n })\n })\n\n return scripts\n}\n"],"mappings":";;AAEA,SAAgB,mBACd,MAC2C;CAC3C,MAAM,IAAI,QAAQ,KAAK,KAAK;CAC5B,MAAM,UAAqD,EAAE;AAE7D,GAAE,SAAS,CAAC,MAAM,GAAG,YAAY;EAC/B,MAAM,MAAM,EAAE,QAAQ,CAAC,KAAK,MAAM;EAClC,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,IAAI,KAAA;AACrC,UAAQ,KAAK;GACX;GACA;GACD,CAAC;GACF;AAEF,QAAO"}
|