@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,92 +1,118 @@
|
|
|
1
1
|
import { resolveViteId } from "../utils.js";
|
|
2
2
|
import { VITE_ENVIRONMENT_NAMES } from "../constants.js";
|
|
3
|
-
import { isValidExportName } from "./rewriteDeniedImports.js";
|
|
4
|
-
import { CLIENT_ENV_SUGGESTIONS } from "./trace.js";
|
|
5
3
|
import { VITE_BROWSER_VIRTUAL_PREFIX } from "./constants.js";
|
|
6
4
|
import { relativizePath } from "./utils.js";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
5
|
+
import { CLIENT_ENV_SUGGESTIONS } from "./trace.js";
|
|
6
|
+
import { isValidExportName } from "./rewriteDeniedImports.js";
|
|
7
|
+
//#region src/import-protection-plugin/virtualModules.ts
|
|
8
|
+
var MOCK_MODULE_ID = "tanstack-start-import-protection:mock";
|
|
9
|
+
var RESOLVED_MOCK_MODULE_ID = resolveViteId(MOCK_MODULE_ID);
|
|
10
|
+
/**
|
|
11
|
+
* Per-violation mock prefix used in build+error mode.
|
|
12
|
+
* Each deferred violation gets a unique ID so we can check which ones
|
|
13
|
+
* survived tree-shaking in `generateBundle`.
|
|
14
|
+
*/
|
|
15
|
+
var MOCK_BUILD_PREFIX = "tanstack-start-import-protection:mock:build:";
|
|
16
|
+
var RESOLVED_MOCK_BUILD_PREFIX = resolveViteId(MOCK_BUILD_PREFIX);
|
|
17
|
+
var MOCK_EDGE_PREFIX = "tanstack-start-import-protection:mock-edge:";
|
|
18
|
+
var RESOLVED_MOCK_EDGE_PREFIX = resolveViteId(MOCK_EDGE_PREFIX);
|
|
19
|
+
var MOCK_RUNTIME_PREFIX = "tanstack-start-import-protection:mock-runtime:";
|
|
20
|
+
var RESOLVED_MOCK_RUNTIME_PREFIX = resolveViteId(MOCK_RUNTIME_PREFIX);
|
|
21
|
+
var MARKER_PREFIX = "tanstack-start-import-protection:marker:";
|
|
22
|
+
var RESOLVED_MARKER_PREFIX = resolveViteId(MARKER_PREFIX);
|
|
23
|
+
var RESOLVED_MARKER_SERVER_ONLY = resolveViteId(`${MARKER_PREFIX}server-only`);
|
|
24
|
+
var RESOLVED_MARKER_CLIENT_ONLY = resolveViteId(`${MARKER_PREFIX}client-only`);
|
|
19
25
|
function resolvedMarkerVirtualModuleId(kind) {
|
|
20
|
-
|
|
26
|
+
return kind === "server" ? RESOLVED_MARKER_SERVER_ONLY : RESOLVED_MARKER_CLIENT_ONLY;
|
|
21
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Convenience list for plugin `load` filters/handlers.
|
|
30
|
+
*
|
|
31
|
+
* Vite/Rollup call `load(id)` with the *resolved* virtual id (prefixed by `\0`).
|
|
32
|
+
* `resolveId(source)` sees the *unresolved* id/prefix (without `\0`).
|
|
33
|
+
*/
|
|
22
34
|
function getResolvedVirtualModuleMatchers() {
|
|
23
|
-
|
|
35
|
+
return RESOLVED_VIRTUAL_MODULE_MATCHERS;
|
|
24
36
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
37
|
+
var RESOLVED_VIRTUAL_MODULE_MATCHERS = [
|
|
38
|
+
RESOLVED_MOCK_MODULE_ID,
|
|
39
|
+
RESOLVED_MOCK_BUILD_PREFIX,
|
|
40
|
+
RESOLVED_MOCK_EDGE_PREFIX,
|
|
41
|
+
RESOLVED_MOCK_RUNTIME_PREFIX,
|
|
42
|
+
RESOLVED_MARKER_PREFIX
|
|
31
43
|
];
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
44
|
+
var RESOLVE_PREFIX_PAIRS = [
|
|
45
|
+
[MOCK_EDGE_PREFIX, RESOLVED_MOCK_EDGE_PREFIX],
|
|
46
|
+
[MOCK_RUNTIME_PREFIX, RESOLVED_MOCK_RUNTIME_PREFIX],
|
|
47
|
+
[MOCK_BUILD_PREFIX, RESOLVED_MOCK_BUILD_PREFIX],
|
|
48
|
+
[MARKER_PREFIX, RESOLVED_MARKER_PREFIX]
|
|
37
49
|
];
|
|
50
|
+
/**
|
|
51
|
+
* Resolve import-protection's internal virtual module IDs.
|
|
52
|
+
*
|
|
53
|
+
* `resolveId(source)` sees *unresolved* ids/prefixes (no `\0`).
|
|
54
|
+
* Returning a resolved id (with `\0`) ensures Vite/Rollup route it to `load`.
|
|
55
|
+
*/
|
|
38
56
|
function resolveInternalVirtualModuleId(source) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
return RESOLVED_MOCK_MODULE_ID;
|
|
46
|
-
}
|
|
47
|
-
for (const [unresolvedPrefix, resolvedPrefix] of RESOLVE_PREFIX_PAIRS) {
|
|
48
|
-
if (source.startsWith(unresolvedPrefix)) {
|
|
49
|
-
return resolveViteId(source);
|
|
50
|
-
}
|
|
51
|
-
if (source.startsWith(resolvedPrefix)) {
|
|
52
|
-
return source;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
return void 0;
|
|
57
|
+
if (source.startsWith("/@id/__x00__")) return resolveInternalVirtualModuleId(`\0${source.slice(VITE_BROWSER_VIRTUAL_PREFIX.length)}`);
|
|
58
|
+
if (source === "tanstack-start-import-protection:mock" || source === RESOLVED_MOCK_MODULE_ID) return RESOLVED_MOCK_MODULE_ID;
|
|
59
|
+
for (const [unresolvedPrefix, resolvedPrefix] of RESOLVE_PREFIX_PAIRS) {
|
|
60
|
+
if (source.startsWith(unresolvedPrefix)) return resolveViteId(source);
|
|
61
|
+
if (source.startsWith(resolvedPrefix)) return source;
|
|
62
|
+
}
|
|
56
63
|
}
|
|
57
64
|
function toBase64Url(input) {
|
|
58
|
-
|
|
65
|
+
return Buffer.from(input, "utf8").toString("base64url");
|
|
59
66
|
}
|
|
60
67
|
function fromBase64Url(input) {
|
|
61
|
-
|
|
68
|
+
return Buffer.from(input, "base64url").toString("utf8");
|
|
62
69
|
}
|
|
63
|
-
|
|
70
|
+
/**
|
|
71
|
+
* Compact runtime suggestion text for browser console, derived from
|
|
72
|
+
* {@link CLIENT_ENV_SUGGESTIONS} so there's a single source of truth.
|
|
73
|
+
*/
|
|
74
|
+
var RUNTIME_SUGGESTION_TEXT = "Fix: " + CLIENT_ENV_SUGGESTIONS.join(". ") + ". To disable these runtime diagnostics, set importProtection.mockAccess: \"off\".";
|
|
64
75
|
function mockRuntimeModuleIdFromViolation(info, mode, root) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
76
|
+
if (mode === "off") return MOCK_MODULE_ID;
|
|
77
|
+
if (info.env !== VITE_ENVIRONMENT_NAMES.client) return MOCK_MODULE_ID;
|
|
78
|
+
const rel = (p) => relativizePath(p, root);
|
|
79
|
+
const trace = info.trace.map((s) => {
|
|
80
|
+
const file = rel(s.file);
|
|
81
|
+
if (s.line == null) return file;
|
|
82
|
+
return `${file}:${s.line}:${s.column ?? 1}`;
|
|
83
|
+
});
|
|
84
|
+
const payload = {
|
|
85
|
+
env: info.env,
|
|
86
|
+
importer: info.importer,
|
|
87
|
+
specifier: info.specifier,
|
|
88
|
+
trace,
|
|
89
|
+
mode
|
|
90
|
+
};
|
|
91
|
+
return `${MOCK_RUNTIME_PREFIX}${toBase64Url(JSON.stringify(payload))}`;
|
|
81
92
|
}
|
|
82
93
|
function makeMockEdgeModuleId(exports, runtimeId) {
|
|
83
|
-
|
|
84
|
-
|
|
94
|
+
const payload = {
|
|
95
|
+
exports,
|
|
96
|
+
runtimeId
|
|
97
|
+
};
|
|
98
|
+
return `${MOCK_EDGE_PREFIX}${toBase64Url(JSON.stringify(payload))}`;
|
|
85
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Generate a recursive Proxy-based mock module.
|
|
102
|
+
*
|
|
103
|
+
* When `diagnostics` is provided, the generated code includes a `__report`
|
|
104
|
+
* function that logs runtime warnings/errors when the mock is actually used
|
|
105
|
+
* (property access for primitive coercion, calls, construction, sets).
|
|
106
|
+
*
|
|
107
|
+
* When `diagnostics` is omitted, the mock is completely silent — suitable
|
|
108
|
+
* for base mock modules (e.g. `MOCK_MODULE_ID` or per-violation build mocks)
|
|
109
|
+
* that are consumed by mock-edge modules providing explicit named exports.
|
|
110
|
+
*/
|
|
86
111
|
function generateMockCode(diagnostics) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
112
|
+
const fnName = diagnostics ? "__createMock" : "createMock";
|
|
113
|
+
const hasDiag = !!diagnostics;
|
|
114
|
+
return `
|
|
115
|
+
${hasDiag ? `const __meta = ${JSON.stringify(diagnostics.meta)};
|
|
90
116
|
const __mode = ${JSON.stringify(diagnostics.mode)};
|
|
91
117
|
|
|
92
118
|
const __seen = new Set();
|
|
@@ -115,31 +141,7 @@ function __report(action, accessPath) {
|
|
|
115
141
|
console.error(err);
|
|
116
142
|
}
|
|
117
143
|
}
|
|
118
|
-
` : ""
|
|
119
|
-
const diagGetTraps = hasDiag ? `
|
|
120
|
-
if (prop === Symbol.toPrimitive) {
|
|
121
|
-
return () => {
|
|
122
|
-
__report('toPrimitive', name);
|
|
123
|
-
return '[import-protection mock]';
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
if (prop === 'toString' || prop === 'valueOf' || prop === 'toJSON') {
|
|
127
|
-
return () => {
|
|
128
|
-
__report(String(prop), name);
|
|
129
|
-
return '[import-protection mock]';
|
|
130
|
-
};
|
|
131
|
-
}` : "";
|
|
132
|
-
const applyBody = hasDiag ? `__report('call', name + '()');
|
|
133
|
-
return ${fnName}(name + '()');` : `return ${fnName}(name + '()');`;
|
|
134
|
-
const constructBody = hasDiag ? `__report('construct', 'new ' + name);
|
|
135
|
-
return ${fnName}('new ' + name);` : `return ${fnName}('new ' + name);`;
|
|
136
|
-
const setTrap = hasDiag ? `
|
|
137
|
-
set(_target, prop) {
|
|
138
|
-
__report('set', name + '.' + String(prop));
|
|
139
|
-
return true;
|
|
140
|
-
},` : "";
|
|
141
|
-
return `
|
|
142
|
-
${preamble}/* @__NO_SIDE_EFFECTS__ */
|
|
144
|
+
` : ""}/* @__NO_SIDE_EFFECTS__ */
|
|
143
145
|
function ${fnName}(name) {
|
|
144
146
|
const fn = function () {};
|
|
145
147
|
fn.prototype.name = name;
|
|
@@ -151,7 +153,19 @@ function ${fnName}(name) {
|
|
|
151
153
|
if (prop === 'caller') return null;
|
|
152
154
|
if (prop === 'then') return (f) => Promise.resolve(f(proxy));
|
|
153
155
|
if (prop === 'catch') return () => Promise.resolve(proxy);
|
|
154
|
-
if (prop === 'finally') return (f) => { f(); return Promise.resolve(proxy); };${
|
|
156
|
+
if (prop === 'finally') return (f) => { f(); return Promise.resolve(proxy); };${hasDiag ? `
|
|
157
|
+
if (prop === Symbol.toPrimitive) {
|
|
158
|
+
return () => {
|
|
159
|
+
__report('toPrimitive', name);
|
|
160
|
+
return '[import-protection mock]';
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
if (prop === 'toString' || prop === 'valueOf' || prop === 'toJSON') {
|
|
164
|
+
return () => {
|
|
165
|
+
__report(String(prop), name);
|
|
166
|
+
return '[import-protection mock]';
|
|
167
|
+
};
|
|
168
|
+
}` : ""}
|
|
155
169
|
if (typeof prop === 'symbol') return undefined;
|
|
156
170
|
if (!(prop in children)) {
|
|
157
171
|
children[prop] = ${fnName}(name + '.' + prop);
|
|
@@ -159,11 +173,17 @@ function ${fnName}(name) {
|
|
|
159
173
|
return children[prop];
|
|
160
174
|
},
|
|
161
175
|
apply() {
|
|
162
|
-
${
|
|
176
|
+
${hasDiag ? `__report('call', name + '()');
|
|
177
|
+
return ${fnName}(name + '()');` : `return ${fnName}(name + '()');`}
|
|
163
178
|
},
|
|
164
179
|
construct() {
|
|
165
|
-
${
|
|
166
|
-
|
|
180
|
+
${hasDiag ? `__report('construct', 'new ' + name);
|
|
181
|
+
return ${fnName}('new ' + name);` : `return ${fnName}('new ' + name);`}
|
|
182
|
+
},${hasDiag ? `
|
|
183
|
+
set(_target, prop) {
|
|
184
|
+
__report('set', name + '.' + String(prop));
|
|
185
|
+
return true;
|
|
186
|
+
},` : ""}
|
|
167
187
|
});
|
|
168
188
|
return proxy;
|
|
169
189
|
}
|
|
@@ -172,121 +192,121 @@ export default mock;
|
|
|
172
192
|
`;
|
|
173
193
|
}
|
|
174
194
|
function loadSilentMockModule() {
|
|
175
|
-
|
|
195
|
+
return { code: generateMockCode() };
|
|
176
196
|
}
|
|
197
|
+
/**
|
|
198
|
+
* Filter export names to valid, non-default names.
|
|
199
|
+
*/
|
|
177
200
|
function filterExportNames(exports) {
|
|
178
|
-
|
|
201
|
+
return exports.filter((n) => n.length > 0 && n !== "default");
|
|
179
202
|
}
|
|
203
|
+
/**
|
|
204
|
+
* Generate ESM export lines that re-export named properties from `mock`.
|
|
205
|
+
*
|
|
206
|
+
* Produces `export const foo = mock.foo;` for valid identifiers and
|
|
207
|
+
* string-keyed re-exports for non-identifier names.
|
|
208
|
+
*/
|
|
180
209
|
function generateExportLines(names) {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
210
|
+
const lines = [];
|
|
211
|
+
const stringExports = [];
|
|
212
|
+
for (let i = 0; i < names.length; i++) {
|
|
213
|
+
const n = names[i];
|
|
214
|
+
if (isValidExportName(n)) lines.push(`export const ${n} = mock.${n};`);
|
|
215
|
+
else {
|
|
216
|
+
const alias = `__tss_str_${i}`;
|
|
217
|
+
lines.push(`const ${alias} = mock[${JSON.stringify(n)}];`);
|
|
218
|
+
stringExports.push({
|
|
219
|
+
alias,
|
|
220
|
+
name: n
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (stringExports.length > 0) {
|
|
225
|
+
const reexports = stringExports.map((s) => `${s.alias} as ${JSON.stringify(s.name)}`).join(", ");
|
|
226
|
+
lines.push(`export { ${reexports} };`);
|
|
227
|
+
}
|
|
228
|
+
return lines;
|
|
198
229
|
}
|
|
230
|
+
/**
|
|
231
|
+
* Generate a self-contained mock module with explicit named exports.
|
|
232
|
+
*
|
|
233
|
+
* Used by the transform hook's "self-denial" check: when a denied file
|
|
234
|
+
* (e.g. `.server.ts` in the client environment) is transformed, its entire
|
|
235
|
+
* content is replaced with this mock module. This avoids returning virtual
|
|
236
|
+
* module IDs from `resolveId`, which prevents cross-environment cache
|
|
237
|
+
* contamination from third-party resolver plugins.
|
|
238
|
+
*
|
|
239
|
+
* The generated code is side-effect-free and tree-shakeable.
|
|
240
|
+
*/
|
|
199
241
|
function generateSelfContainedMockModule(exportNames) {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
code: `${mockCode}
|
|
204
|
-
${exportLines.join("\n")}
|
|
205
|
-
`
|
|
206
|
-
};
|
|
242
|
+
return { code: `${generateMockCode()}
|
|
243
|
+
${generateExportLines(filterExportNames(exportNames)).join("\n")}
|
|
244
|
+
` };
|
|
207
245
|
}
|
|
246
|
+
/**
|
|
247
|
+
* Generate a dev-mode mock module for self-denial transforms.
|
|
248
|
+
*
|
|
249
|
+
* Similar to `loadMockEdgeModule` but takes export names and a runtime ID
|
|
250
|
+
* directly (instead of parsing them from a base64url-encoded payload).
|
|
251
|
+
* Used by the transform hook when a denied file (e.g. `.server.ts` in
|
|
252
|
+
* the client environment) is replaced in dev mode.
|
|
253
|
+
*
|
|
254
|
+
* The generated module imports mock-runtime for runtime diagnostics
|
|
255
|
+
* (error/warn on property access) and re-exports explicit named exports
|
|
256
|
+
* so that `import { foo } from './denied.server'` works.
|
|
257
|
+
*/
|
|
208
258
|
function generateDevSelfDenialModule(exportNames, runtimeId) {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
return {
|
|
212
|
-
code: `import mock from ${JSON.stringify(runtimeId)};
|
|
259
|
+
const exportLines = generateExportLines(filterExportNames(exportNames));
|
|
260
|
+
return { code: `import mock from ${JSON.stringify(runtimeId)};
|
|
213
261
|
${exportLines.join("\n")}
|
|
214
262
|
export default mock;
|
|
215
|
-
`
|
|
216
|
-
};
|
|
263
|
+
` };
|
|
217
264
|
}
|
|
218
265
|
function loadMockEdgeModule(encodedPayload) {
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
code: `import mock from ${JSON.stringify(runtimeId)};
|
|
266
|
+
let payload;
|
|
267
|
+
try {
|
|
268
|
+
payload = JSON.parse(fromBase64Url(encodedPayload));
|
|
269
|
+
} catch {
|
|
270
|
+
payload = { exports: [] };
|
|
271
|
+
}
|
|
272
|
+
const names = filterExportNames(payload.exports ?? []);
|
|
273
|
+
const runtimeId = typeof payload.runtimeId === "string" && payload.runtimeId.length > 0 ? payload.runtimeId : MOCK_MODULE_ID;
|
|
274
|
+
const exportLines = generateExportLines(names);
|
|
275
|
+
return { code: `import mock from ${JSON.stringify(runtimeId)};
|
|
230
276
|
${exportLines.join("\n")}
|
|
231
277
|
export default mock;
|
|
232
|
-
`
|
|
233
|
-
};
|
|
278
|
+
` };
|
|
234
279
|
}
|
|
235
280
|
function loadMockRuntimeModule(encodedPayload) {
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
281
|
+
let payload;
|
|
282
|
+
try {
|
|
283
|
+
payload = JSON.parse(fromBase64Url(encodedPayload));
|
|
284
|
+
} catch {
|
|
285
|
+
payload = {};
|
|
286
|
+
}
|
|
287
|
+
const mode = payload.mode === "warn" || payload.mode === "off" ? payload.mode : "error";
|
|
288
|
+
return { code: generateMockCode({
|
|
289
|
+
meta: {
|
|
290
|
+
env: String(payload.env ?? ""),
|
|
291
|
+
importer: String(payload.importer ?? ""),
|
|
292
|
+
specifier: String(payload.specifier ?? ""),
|
|
293
|
+
trace: Array.isArray(payload.trace) ? payload.trace : []
|
|
294
|
+
},
|
|
295
|
+
mode
|
|
296
|
+
}) };
|
|
250
297
|
}
|
|
251
|
-
|
|
298
|
+
var MARKER_MODULE_RESULT = { code: "export {}" };
|
|
252
299
|
function loadMarkerModule() {
|
|
253
|
-
|
|
300
|
+
return MARKER_MODULE_RESULT;
|
|
254
301
|
}
|
|
255
302
|
function loadResolvedVirtualModule(id) {
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
}
|
|
262
|
-
if (id.startsWith(RESOLVED_MOCK_EDGE_PREFIX)) {
|
|
263
|
-
return loadMockEdgeModule(id.slice(RESOLVED_MOCK_EDGE_PREFIX.length));
|
|
264
|
-
}
|
|
265
|
-
if (id.startsWith(RESOLVED_MOCK_RUNTIME_PREFIX)) {
|
|
266
|
-
return loadMockRuntimeModule(id.slice(RESOLVED_MOCK_RUNTIME_PREFIX.length));
|
|
267
|
-
}
|
|
268
|
-
if (id.startsWith(RESOLVED_MARKER_PREFIX)) {
|
|
269
|
-
return loadMarkerModule();
|
|
270
|
-
}
|
|
271
|
-
return void 0;
|
|
303
|
+
if (id === RESOLVED_MOCK_MODULE_ID) return loadSilentMockModule();
|
|
304
|
+
if (id.startsWith(RESOLVED_MOCK_BUILD_PREFIX)) return loadSilentMockModule();
|
|
305
|
+
if (id.startsWith(RESOLVED_MOCK_EDGE_PREFIX)) return loadMockEdgeModule(id.slice(RESOLVED_MOCK_EDGE_PREFIX.length));
|
|
306
|
+
if (id.startsWith(RESOLVED_MOCK_RUNTIME_PREFIX)) return loadMockRuntimeModule(id.slice(RESOLVED_MOCK_RUNTIME_PREFIX.length));
|
|
307
|
+
if (id.startsWith(RESOLVED_MARKER_PREFIX)) return loadMarkerModule();
|
|
272
308
|
}
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
MOCK_RUNTIME_PREFIX,
|
|
278
|
-
RUNTIME_SUGGESTION_TEXT,
|
|
279
|
-
generateDevSelfDenialModule,
|
|
280
|
-
generateSelfContainedMockModule,
|
|
281
|
-
getResolvedVirtualModuleMatchers,
|
|
282
|
-
loadMarkerModule,
|
|
283
|
-
loadMockEdgeModule,
|
|
284
|
-
loadMockRuntimeModule,
|
|
285
|
-
loadResolvedVirtualModule,
|
|
286
|
-
loadSilentMockModule,
|
|
287
|
-
makeMockEdgeModuleId,
|
|
288
|
-
mockRuntimeModuleIdFromViolation,
|
|
289
|
-
resolveInternalVirtualModuleId,
|
|
290
|
-
resolvedMarkerVirtualModuleId
|
|
291
|
-
};
|
|
292
|
-
//# sourceMappingURL=virtualModules.js.map
|
|
309
|
+
//#endregion
|
|
310
|
+
export { MOCK_BUILD_PREFIX, MOCK_MODULE_ID, generateDevSelfDenialModule, generateSelfContainedMockModule, getResolvedVirtualModuleMatchers, loadResolvedVirtualModule, makeMockEdgeModuleId, mockRuntimeModuleIdFromViolation, resolveInternalVirtualModuleId, resolvedMarkerVirtualModuleId };
|
|
311
|
+
|
|
312
|
+
//# sourceMappingURL=virtualModules.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"virtualModules.js","sources":["../../../src/import-protection-plugin/virtualModules.ts"],"sourcesContent":["import { resolveViteId } from '../utils'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { isValidExportName } from './rewriteDeniedImports'\nimport { CLIENT_ENV_SUGGESTIONS } from './trace'\nimport { VITE_BROWSER_VIRTUAL_PREFIX } from './constants'\nimport { relativizePath } from './utils'\nimport type { ViolationInfo } from './trace'\n\nexport const MOCK_MODULE_ID = 'tanstack-start-import-protection:mock'\nconst RESOLVED_MOCK_MODULE_ID = resolveViteId(MOCK_MODULE_ID)\n\n/**\n * Per-violation mock prefix used in build+error mode.\n * Each deferred violation gets a unique ID so we can check which ones\n * survived tree-shaking in `generateBundle`.\n */\nexport const MOCK_BUILD_PREFIX = 'tanstack-start-import-protection:mock:build:'\nconst RESOLVED_MOCK_BUILD_PREFIX = resolveViteId(MOCK_BUILD_PREFIX)\n\nexport const MOCK_EDGE_PREFIX = 'tanstack-start-import-protection:mock-edge:'\nconst RESOLVED_MOCK_EDGE_PREFIX = resolveViteId(MOCK_EDGE_PREFIX)\n\nexport const MOCK_RUNTIME_PREFIX =\n 'tanstack-start-import-protection:mock-runtime:'\nconst RESOLVED_MOCK_RUNTIME_PREFIX = resolveViteId(MOCK_RUNTIME_PREFIX)\n\nconst MARKER_PREFIX = 'tanstack-start-import-protection:marker:'\nconst RESOLVED_MARKER_PREFIX = resolveViteId(MARKER_PREFIX)\n\nconst RESOLVED_MARKER_SERVER_ONLY = resolveViteId(`${MARKER_PREFIX}server-only`)\nconst RESOLVED_MARKER_CLIENT_ONLY = resolveViteId(`${MARKER_PREFIX}client-only`)\n\nexport function resolvedMarkerVirtualModuleId(\n kind: 'server' | 'client',\n): string {\n return kind === 'server'\n ? RESOLVED_MARKER_SERVER_ONLY\n : RESOLVED_MARKER_CLIENT_ONLY\n}\n\n/**\n * Convenience list for plugin `load` filters/handlers.\n *\n * Vite/Rollup call `load(id)` with the *resolved* virtual id (prefixed by `\\0`).\n * `resolveId(source)` sees the *unresolved* id/prefix (without `\\0`).\n */\nexport function getResolvedVirtualModuleMatchers(): ReadonlyArray<string> {\n return RESOLVED_VIRTUAL_MODULE_MATCHERS\n}\n\nconst RESOLVED_VIRTUAL_MODULE_MATCHERS = [\n RESOLVED_MOCK_MODULE_ID,\n RESOLVED_MOCK_BUILD_PREFIX,\n RESOLVED_MOCK_EDGE_PREFIX,\n RESOLVED_MOCK_RUNTIME_PREFIX,\n RESOLVED_MARKER_PREFIX,\n] as const\n\nconst RESOLVE_PREFIX_PAIRS = [\n [MOCK_EDGE_PREFIX, RESOLVED_MOCK_EDGE_PREFIX],\n [MOCK_RUNTIME_PREFIX, RESOLVED_MOCK_RUNTIME_PREFIX],\n [MOCK_BUILD_PREFIX, RESOLVED_MOCK_BUILD_PREFIX],\n [MARKER_PREFIX, RESOLVED_MARKER_PREFIX],\n] as const\n\n/**\n * Resolve import-protection's internal virtual module IDs.\n *\n * `resolveId(source)` sees *unresolved* ids/prefixes (no `\\0`).\n * Returning a resolved id (with `\\0`) ensures Vite/Rollup route it to `load`.\n */\nexport function resolveInternalVirtualModuleId(\n source: string,\n): string | undefined {\n if (source.startsWith(VITE_BROWSER_VIRTUAL_PREFIX)) {\n return resolveInternalVirtualModuleId(\n `\\0${source.slice(VITE_BROWSER_VIRTUAL_PREFIX.length)}`,\n )\n }\n\n if (source === MOCK_MODULE_ID || source === RESOLVED_MOCK_MODULE_ID) {\n return RESOLVED_MOCK_MODULE_ID\n }\n\n for (const [unresolvedPrefix, resolvedPrefix] of RESOLVE_PREFIX_PAIRS) {\n if (source.startsWith(unresolvedPrefix)) {\n return resolveViteId(source)\n }\n\n if (source.startsWith(resolvedPrefix)) {\n return source\n }\n }\n\n return undefined\n}\n\nfunction toBase64Url(input: string): string {\n return Buffer.from(input, 'utf8').toString('base64url')\n}\n\nfunction fromBase64Url(input: string): string {\n return Buffer.from(input, 'base64url').toString('utf8')\n}\n\ntype MockAccessMode = 'error' | 'warn' | 'off'\n\n/**\n * Compact runtime suggestion text for browser console, derived from\n * {@link CLIENT_ENV_SUGGESTIONS} so there's a single source of truth.\n */\nexport const RUNTIME_SUGGESTION_TEXT =\n 'Fix: ' +\n CLIENT_ENV_SUGGESTIONS.join('. ') +\n '. To disable these runtime diagnostics, set importProtection.mockAccess: \"off\".'\n\nexport function mockRuntimeModuleIdFromViolation(\n info: ViolationInfo,\n mode: MockAccessMode,\n root: string,\n): string {\n if (mode === 'off') return MOCK_MODULE_ID\n if (info.env !== VITE_ENVIRONMENT_NAMES.client) return MOCK_MODULE_ID\n\n const rel = (p: string) => relativizePath(p, root)\n const trace = info.trace.map((s) => {\n const file = rel(s.file)\n if (s.line == null) return file\n return `${file}:${s.line}:${s.column ?? 1}`\n })\n\n const payload = {\n env: info.env,\n importer: info.importer,\n specifier: info.specifier,\n trace,\n mode,\n }\n return `${MOCK_RUNTIME_PREFIX}${toBase64Url(JSON.stringify(payload))}`\n}\n\nexport function makeMockEdgeModuleId(\n exports: Array<string>,\n runtimeId: string,\n): string {\n const payload = { exports, runtimeId }\n return `${MOCK_EDGE_PREFIX}${toBase64Url(JSON.stringify(payload))}`\n}\n\n/**\n * Generate a recursive Proxy-based mock module.\n *\n * When `diagnostics` is provided, the generated code includes a `__report`\n * function that logs runtime warnings/errors when the mock is actually used\n * (property access for primitive coercion, calls, construction, sets).\n *\n * When `diagnostics` is omitted, the mock is completely silent — suitable\n * for base mock modules (e.g. `MOCK_MODULE_ID` or per-violation build mocks)\n * that are consumed by mock-edge modules providing explicit named exports.\n */\nfunction generateMockCode(diagnostics?: {\n meta: {\n env: string\n importer: string\n specifier: string\n trace: Array<unknown>\n }\n mode: 'error' | 'warn' | 'off'\n}): string {\n const fnName = diagnostics ? '__createMock' : 'createMock'\n const hasDiag = !!diagnostics\n\n const preamble = hasDiag\n ? `const __meta = ${JSON.stringify(diagnostics.meta)};\nconst __mode = ${JSON.stringify(diagnostics.mode)};\n\nconst __seen = new Set();\nfunction __report(action, accessPath) {\n if (__mode === 'off') return;\n const key = action + ':' + accessPath;\n if (__seen.has(key)) return;\n __seen.add(key);\n\n const traceLines = Array.isArray(__meta.trace) && __meta.trace.length\n ? \"\\\\n\\\\nTrace:\\\\n\" + __meta.trace.map((t, i) => ' ' + (i + 1) + '. ' + String(t)).join('\\\\n')\n : '';\n\n const msg =\n '[import-protection] Mocked import used in dev client\\\\n\\\\n' +\n 'Denied import: \"' + __meta.specifier + '\"\\\\n' +\n 'Importer: ' + __meta.importer + '\\\\n' +\n 'Access: ' + accessPath + ' (' + action + ')' +\n traceLines +\n '\\\\n\\\\n' + ${JSON.stringify(RUNTIME_SUGGESTION_TEXT)};\n\n const err = new Error(msg);\n if (__mode === 'warn') {\n console.warn(err);\n } else {\n console.error(err);\n }\n}\n`\n : ''\n\n // Diagnostic-only traps for primitive coercion, set\n const diagGetTraps = hasDiag\n ? `\n if (prop === Symbol.toPrimitive) {\n return () => {\n __report('toPrimitive', name);\n return '[import-protection mock]';\n };\n }\n if (prop === 'toString' || prop === 'valueOf' || prop === 'toJSON') {\n return () => {\n __report(String(prop), name);\n return '[import-protection mock]';\n };\n }`\n : ''\n\n const applyBody = hasDiag\n ? `__report('call', name + '()');\n return ${fnName}(name + '()');`\n : `return ${fnName}(name + '()');`\n\n const constructBody = hasDiag\n ? `__report('construct', 'new ' + name);\n return ${fnName}('new ' + name);`\n : `return ${fnName}('new ' + name);`\n\n const setTrap = hasDiag\n ? `\n set(_target, prop) {\n __report('set', name + '.' + String(prop));\n return true;\n },`\n : ''\n\n return `\n${preamble}/* @__NO_SIDE_EFFECTS__ */\nfunction ${fnName}(name) {\n const fn = function () {};\n fn.prototype.name = name;\n const children = Object.create(null);\n const proxy = new Proxy(fn, {\n get(_target, prop) {\n if (prop === '__esModule') return true;\n if (prop === 'default') return proxy;\n if (prop === 'caller') return null;\n if (prop === 'then') return (f) => Promise.resolve(f(proxy));\n if (prop === 'catch') return () => Promise.resolve(proxy);\n if (prop === 'finally') return (f) => { f(); return Promise.resolve(proxy); };${diagGetTraps}\n if (typeof prop === 'symbol') return undefined;\n if (!(prop in children)) {\n children[prop] = ${fnName}(name + '.' + prop);\n }\n return children[prop];\n },\n apply() {\n ${applyBody}\n },\n construct() {\n ${constructBody}\n },${setTrap}\n });\n return proxy;\n}\nconst mock = /* @__PURE__ */ ${fnName}('mock');\nexport default mock;\n`\n}\n\nexport function loadSilentMockModule(): { code: string } {\n return { code: generateMockCode() }\n}\n\n/**\n * Filter export names to valid, non-default names.\n */\nfunction filterExportNames(exports: ReadonlyArray<string>): Array<string> {\n return exports.filter((n) => n.length > 0 && n !== 'default')\n}\n\n/**\n * Generate ESM export lines that re-export named properties from `mock`.\n *\n * Produces `export const foo = mock.foo;` for valid identifiers and\n * string-keyed re-exports for non-identifier names.\n */\nfunction generateExportLines(names: ReadonlyArray<string>): Array<string> {\n const lines: Array<string> = []\n const stringExports: Array<{ alias: string; name: string }> = []\n\n for (let i = 0; i < names.length; i++) {\n const n = names[i]!\n if (isValidExportName(n)) {\n lines.push(`export const ${n} = mock.${n};`)\n } else {\n const alias = `__tss_str_${i}`\n lines.push(`const ${alias} = mock[${JSON.stringify(n)}];`)\n stringExports.push({ alias, name: n })\n }\n }\n\n if (stringExports.length > 0) {\n const reexports = stringExports\n .map((s) => `${s.alias} as ${JSON.stringify(s.name)}`)\n .join(', ')\n lines.push(`export { ${reexports} };`)\n }\n\n return lines\n}\n\n/**\n * Generate a self-contained mock module with explicit named exports.\n *\n * Used by the transform hook's \"self-denial\" check: when a denied file\n * (e.g. `.server.ts` in the client environment) is transformed, its entire\n * content is replaced with this mock module. This avoids returning virtual\n * module IDs from `resolveId`, which prevents cross-environment cache\n * contamination from third-party resolver plugins.\n *\n * The generated code is side-effect-free and tree-shakeable.\n */\nexport function generateSelfContainedMockModule(exportNames: Array<string>): {\n code: string\n} {\n const mockCode = generateMockCode()\n const exportLines = generateExportLines(filterExportNames(exportNames))\n\n return {\n code: `${mockCode}\n${exportLines.join('\\n')}\n`,\n }\n}\n\n/**\n * Generate a dev-mode mock module for self-denial transforms.\n *\n * Similar to `loadMockEdgeModule` but takes export names and a runtime ID\n * directly (instead of parsing them from a base64url-encoded payload).\n * Used by the transform hook when a denied file (e.g. `.server.ts` in\n * the client environment) is replaced in dev mode.\n *\n * The generated module imports mock-runtime for runtime diagnostics\n * (error/warn on property access) and re-exports explicit named exports\n * so that `import { foo } from './denied.server'` works.\n */\nexport function generateDevSelfDenialModule(\n exportNames: Array<string>,\n runtimeId: string,\n): { code: string } {\n const names = filterExportNames(exportNames)\n const exportLines = generateExportLines(names)\n\n return {\n code: `import mock from ${JSON.stringify(runtimeId)};\n${exportLines.join('\\n')}\nexport default mock;\n`,\n }\n}\n\nexport function loadMockEdgeModule(encodedPayload: string): { code: string } {\n let payload: { exports?: Array<string>; runtimeId?: string }\n try {\n payload = JSON.parse(fromBase64Url(encodedPayload)) as typeof payload\n } catch {\n payload = { exports: [] }\n }\n const names = filterExportNames(payload.exports ?? [])\n\n const runtimeId: string =\n typeof payload.runtimeId === 'string' && payload.runtimeId.length > 0\n ? payload.runtimeId\n : MOCK_MODULE_ID\n\n const exportLines = generateExportLines(names)\n\n return {\n code: `import mock from ${JSON.stringify(runtimeId)};\n${exportLines.join('\\n')}\nexport default mock;\n`,\n }\n}\n\nexport function loadMockRuntimeModule(encodedPayload: string): {\n code: string\n} {\n let payload: {\n mode?: string\n env?: string\n importer?: string\n specifier?: string\n trace?: Array<unknown>\n }\n try {\n payload = JSON.parse(fromBase64Url(encodedPayload)) as typeof payload\n } catch {\n payload = {}\n }\n\n const mode: 'error' | 'warn' | 'off' =\n payload.mode === 'warn' || payload.mode === 'off' ? payload.mode : 'error'\n\n const meta = {\n env: String(payload.env ?? ''),\n importer: String(payload.importer ?? ''),\n specifier: String(payload.specifier ?? ''),\n trace: Array.isArray(payload.trace) ? payload.trace : [],\n }\n\n return { code: generateMockCode({ meta, mode }) }\n}\n\nconst MARKER_MODULE_RESULT = { code: 'export {}' } as const\n\nexport function loadMarkerModule(): { code: string } {\n return MARKER_MODULE_RESULT\n}\n\nexport function loadResolvedVirtualModule(\n id: string,\n): { code: string } | undefined {\n if (id === RESOLVED_MOCK_MODULE_ID) {\n return loadSilentMockModule()\n }\n\n // Per-violation build mock modules — same silent mock code\n if (id.startsWith(RESOLVED_MOCK_BUILD_PREFIX)) {\n return loadSilentMockModule()\n }\n\n if (id.startsWith(RESOLVED_MOCK_EDGE_PREFIX)) {\n return loadMockEdgeModule(id.slice(RESOLVED_MOCK_EDGE_PREFIX.length))\n }\n\n if (id.startsWith(RESOLVED_MOCK_RUNTIME_PREFIX)) {\n return loadMockRuntimeModule(id.slice(RESOLVED_MOCK_RUNTIME_PREFIX.length))\n }\n\n if (id.startsWith(RESOLVED_MARKER_PREFIX)) {\n return loadMarkerModule()\n }\n\n return undefined\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"virtualModules.js","names":[],"sources":["../../../src/import-protection-plugin/virtualModules.ts"],"sourcesContent":["import { resolveViteId } from '../utils'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { isValidExportName } from './rewriteDeniedImports'\nimport { CLIENT_ENV_SUGGESTIONS } from './trace'\nimport { VITE_BROWSER_VIRTUAL_PREFIX } from './constants'\nimport { relativizePath } from './utils'\nimport type { ViolationInfo } from './trace'\n\nexport const MOCK_MODULE_ID = 'tanstack-start-import-protection:mock'\nconst RESOLVED_MOCK_MODULE_ID = resolveViteId(MOCK_MODULE_ID)\n\n/**\n * Per-violation mock prefix used in build+error mode.\n * Each deferred violation gets a unique ID so we can check which ones\n * survived tree-shaking in `generateBundle`.\n */\nexport const MOCK_BUILD_PREFIX = 'tanstack-start-import-protection:mock:build:'\nconst RESOLVED_MOCK_BUILD_PREFIX = resolveViteId(MOCK_BUILD_PREFIX)\n\nexport const MOCK_EDGE_PREFIX = 'tanstack-start-import-protection:mock-edge:'\nconst RESOLVED_MOCK_EDGE_PREFIX = resolveViteId(MOCK_EDGE_PREFIX)\n\nexport const MOCK_RUNTIME_PREFIX =\n 'tanstack-start-import-protection:mock-runtime:'\nconst RESOLVED_MOCK_RUNTIME_PREFIX = resolveViteId(MOCK_RUNTIME_PREFIX)\n\nconst MARKER_PREFIX = 'tanstack-start-import-protection:marker:'\nconst RESOLVED_MARKER_PREFIX = resolveViteId(MARKER_PREFIX)\n\nconst RESOLVED_MARKER_SERVER_ONLY = resolveViteId(`${MARKER_PREFIX}server-only`)\nconst RESOLVED_MARKER_CLIENT_ONLY = resolveViteId(`${MARKER_PREFIX}client-only`)\n\nexport function resolvedMarkerVirtualModuleId(\n kind: 'server' | 'client',\n): string {\n return kind === 'server'\n ? RESOLVED_MARKER_SERVER_ONLY\n : RESOLVED_MARKER_CLIENT_ONLY\n}\n\n/**\n * Convenience list for plugin `load` filters/handlers.\n *\n * Vite/Rollup call `load(id)` with the *resolved* virtual id (prefixed by `\\0`).\n * `resolveId(source)` sees the *unresolved* id/prefix (without `\\0`).\n */\nexport function getResolvedVirtualModuleMatchers(): ReadonlyArray<string> {\n return RESOLVED_VIRTUAL_MODULE_MATCHERS\n}\n\nconst RESOLVED_VIRTUAL_MODULE_MATCHERS = [\n RESOLVED_MOCK_MODULE_ID,\n RESOLVED_MOCK_BUILD_PREFIX,\n RESOLVED_MOCK_EDGE_PREFIX,\n RESOLVED_MOCK_RUNTIME_PREFIX,\n RESOLVED_MARKER_PREFIX,\n] as const\n\nconst RESOLVE_PREFIX_PAIRS = [\n [MOCK_EDGE_PREFIX, RESOLVED_MOCK_EDGE_PREFIX],\n [MOCK_RUNTIME_PREFIX, RESOLVED_MOCK_RUNTIME_PREFIX],\n [MOCK_BUILD_PREFIX, RESOLVED_MOCK_BUILD_PREFIX],\n [MARKER_PREFIX, RESOLVED_MARKER_PREFIX],\n] as const\n\n/**\n * Resolve import-protection's internal virtual module IDs.\n *\n * `resolveId(source)` sees *unresolved* ids/prefixes (no `\\0`).\n * Returning a resolved id (with `\\0`) ensures Vite/Rollup route it to `load`.\n */\nexport function resolveInternalVirtualModuleId(\n source: string,\n): string | undefined {\n if (source.startsWith(VITE_BROWSER_VIRTUAL_PREFIX)) {\n return resolveInternalVirtualModuleId(\n `\\0${source.slice(VITE_BROWSER_VIRTUAL_PREFIX.length)}`,\n )\n }\n\n if (source === MOCK_MODULE_ID || source === RESOLVED_MOCK_MODULE_ID) {\n return RESOLVED_MOCK_MODULE_ID\n }\n\n for (const [unresolvedPrefix, resolvedPrefix] of RESOLVE_PREFIX_PAIRS) {\n if (source.startsWith(unresolvedPrefix)) {\n return resolveViteId(source)\n }\n\n if (source.startsWith(resolvedPrefix)) {\n return source\n }\n }\n\n return undefined\n}\n\nfunction toBase64Url(input: string): string {\n return Buffer.from(input, 'utf8').toString('base64url')\n}\n\nfunction fromBase64Url(input: string): string {\n return Buffer.from(input, 'base64url').toString('utf8')\n}\n\ntype MockAccessMode = 'error' | 'warn' | 'off'\n\n/**\n * Compact runtime suggestion text for browser console, derived from\n * {@link CLIENT_ENV_SUGGESTIONS} so there's a single source of truth.\n */\nexport const RUNTIME_SUGGESTION_TEXT =\n 'Fix: ' +\n CLIENT_ENV_SUGGESTIONS.join('. ') +\n '. To disable these runtime diagnostics, set importProtection.mockAccess: \"off\".'\n\nexport function mockRuntimeModuleIdFromViolation(\n info: ViolationInfo,\n mode: MockAccessMode,\n root: string,\n): string {\n if (mode === 'off') return MOCK_MODULE_ID\n if (info.env !== VITE_ENVIRONMENT_NAMES.client) return MOCK_MODULE_ID\n\n const rel = (p: string) => relativizePath(p, root)\n const trace = info.trace.map((s) => {\n const file = rel(s.file)\n if (s.line == null) return file\n return `${file}:${s.line}:${s.column ?? 1}`\n })\n\n const payload = {\n env: info.env,\n importer: info.importer,\n specifier: info.specifier,\n trace,\n mode,\n }\n return `${MOCK_RUNTIME_PREFIX}${toBase64Url(JSON.stringify(payload))}`\n}\n\nexport function makeMockEdgeModuleId(\n exports: Array<string>,\n runtimeId: string,\n): string {\n const payload = { exports, runtimeId }\n return `${MOCK_EDGE_PREFIX}${toBase64Url(JSON.stringify(payload))}`\n}\n\n/**\n * Generate a recursive Proxy-based mock module.\n *\n * When `diagnostics` is provided, the generated code includes a `__report`\n * function that logs runtime warnings/errors when the mock is actually used\n * (property access for primitive coercion, calls, construction, sets).\n *\n * When `diagnostics` is omitted, the mock is completely silent — suitable\n * for base mock modules (e.g. `MOCK_MODULE_ID` or per-violation build mocks)\n * that are consumed by mock-edge modules providing explicit named exports.\n */\nfunction generateMockCode(diagnostics?: {\n meta: {\n env: string\n importer: string\n specifier: string\n trace: Array<unknown>\n }\n mode: 'error' | 'warn' | 'off'\n}): string {\n const fnName = diagnostics ? '__createMock' : 'createMock'\n const hasDiag = !!diagnostics\n\n const preamble = hasDiag\n ? `const __meta = ${JSON.stringify(diagnostics.meta)};\nconst __mode = ${JSON.stringify(diagnostics.mode)};\n\nconst __seen = new Set();\nfunction __report(action, accessPath) {\n if (__mode === 'off') return;\n const key = action + ':' + accessPath;\n if (__seen.has(key)) return;\n __seen.add(key);\n\n const traceLines = Array.isArray(__meta.trace) && __meta.trace.length\n ? \"\\\\n\\\\nTrace:\\\\n\" + __meta.trace.map((t, i) => ' ' + (i + 1) + '. ' + String(t)).join('\\\\n')\n : '';\n\n const msg =\n '[import-protection] Mocked import used in dev client\\\\n\\\\n' +\n 'Denied import: \"' + __meta.specifier + '\"\\\\n' +\n 'Importer: ' + __meta.importer + '\\\\n' +\n 'Access: ' + accessPath + ' (' + action + ')' +\n traceLines +\n '\\\\n\\\\n' + ${JSON.stringify(RUNTIME_SUGGESTION_TEXT)};\n\n const err = new Error(msg);\n if (__mode === 'warn') {\n console.warn(err);\n } else {\n console.error(err);\n }\n}\n`\n : ''\n\n // Diagnostic-only traps for primitive coercion, set\n const diagGetTraps = hasDiag\n ? `\n if (prop === Symbol.toPrimitive) {\n return () => {\n __report('toPrimitive', name);\n return '[import-protection mock]';\n };\n }\n if (prop === 'toString' || prop === 'valueOf' || prop === 'toJSON') {\n return () => {\n __report(String(prop), name);\n return '[import-protection mock]';\n };\n }`\n : ''\n\n const applyBody = hasDiag\n ? `__report('call', name + '()');\n return ${fnName}(name + '()');`\n : `return ${fnName}(name + '()');`\n\n const constructBody = hasDiag\n ? `__report('construct', 'new ' + name);\n return ${fnName}('new ' + name);`\n : `return ${fnName}('new ' + name);`\n\n const setTrap = hasDiag\n ? `\n set(_target, prop) {\n __report('set', name + '.' + String(prop));\n return true;\n },`\n : ''\n\n return `\n${preamble}/* @__NO_SIDE_EFFECTS__ */\nfunction ${fnName}(name) {\n const fn = function () {};\n fn.prototype.name = name;\n const children = Object.create(null);\n const proxy = new Proxy(fn, {\n get(_target, prop) {\n if (prop === '__esModule') return true;\n if (prop === 'default') return proxy;\n if (prop === 'caller') return null;\n if (prop === 'then') return (f) => Promise.resolve(f(proxy));\n if (prop === 'catch') return () => Promise.resolve(proxy);\n if (prop === 'finally') return (f) => { f(); return Promise.resolve(proxy); };${diagGetTraps}\n if (typeof prop === 'symbol') return undefined;\n if (!(prop in children)) {\n children[prop] = ${fnName}(name + '.' + prop);\n }\n return children[prop];\n },\n apply() {\n ${applyBody}\n },\n construct() {\n ${constructBody}\n },${setTrap}\n });\n return proxy;\n}\nconst mock = /* @__PURE__ */ ${fnName}('mock');\nexport default mock;\n`\n}\n\nexport function loadSilentMockModule(): { code: string } {\n return { code: generateMockCode() }\n}\n\n/**\n * Filter export names to valid, non-default names.\n */\nfunction filterExportNames(exports: ReadonlyArray<string>): Array<string> {\n return exports.filter((n) => n.length > 0 && n !== 'default')\n}\n\n/**\n * Generate ESM export lines that re-export named properties from `mock`.\n *\n * Produces `export const foo = mock.foo;` for valid identifiers and\n * string-keyed re-exports for non-identifier names.\n */\nfunction generateExportLines(names: ReadonlyArray<string>): Array<string> {\n const lines: Array<string> = []\n const stringExports: Array<{ alias: string; name: string }> = []\n\n for (let i = 0; i < names.length; i++) {\n const n = names[i]!\n if (isValidExportName(n)) {\n lines.push(`export const ${n} = mock.${n};`)\n } else {\n const alias = `__tss_str_${i}`\n lines.push(`const ${alias} = mock[${JSON.stringify(n)}];`)\n stringExports.push({ alias, name: n })\n }\n }\n\n if (stringExports.length > 0) {\n const reexports = stringExports\n .map((s) => `${s.alias} as ${JSON.stringify(s.name)}`)\n .join(', ')\n lines.push(`export { ${reexports} };`)\n }\n\n return lines\n}\n\n/**\n * Generate a self-contained mock module with explicit named exports.\n *\n * Used by the transform hook's \"self-denial\" check: when a denied file\n * (e.g. `.server.ts` in the client environment) is transformed, its entire\n * content is replaced with this mock module. This avoids returning virtual\n * module IDs from `resolveId`, which prevents cross-environment cache\n * contamination from third-party resolver plugins.\n *\n * The generated code is side-effect-free and tree-shakeable.\n */\nexport function generateSelfContainedMockModule(exportNames: Array<string>): {\n code: string\n} {\n const mockCode = generateMockCode()\n const exportLines = generateExportLines(filterExportNames(exportNames))\n\n return {\n code: `${mockCode}\n${exportLines.join('\\n')}\n`,\n }\n}\n\n/**\n * Generate a dev-mode mock module for self-denial transforms.\n *\n * Similar to `loadMockEdgeModule` but takes export names and a runtime ID\n * directly (instead of parsing them from a base64url-encoded payload).\n * Used by the transform hook when a denied file (e.g. `.server.ts` in\n * the client environment) is replaced in dev mode.\n *\n * The generated module imports mock-runtime for runtime diagnostics\n * (error/warn on property access) and re-exports explicit named exports\n * so that `import { foo } from './denied.server'` works.\n */\nexport function generateDevSelfDenialModule(\n exportNames: Array<string>,\n runtimeId: string,\n): { code: string } {\n const names = filterExportNames(exportNames)\n const exportLines = generateExportLines(names)\n\n return {\n code: `import mock from ${JSON.stringify(runtimeId)};\n${exportLines.join('\\n')}\nexport default mock;\n`,\n }\n}\n\nexport function loadMockEdgeModule(encodedPayload: string): { code: string } {\n let payload: { exports?: Array<string>; runtimeId?: string }\n try {\n payload = JSON.parse(fromBase64Url(encodedPayload)) as typeof payload\n } catch {\n payload = { exports: [] }\n }\n const names = filterExportNames(payload.exports ?? [])\n\n const runtimeId: string =\n typeof payload.runtimeId === 'string' && payload.runtimeId.length > 0\n ? payload.runtimeId\n : MOCK_MODULE_ID\n\n const exportLines = generateExportLines(names)\n\n return {\n code: `import mock from ${JSON.stringify(runtimeId)};\n${exportLines.join('\\n')}\nexport default mock;\n`,\n }\n}\n\nexport function loadMockRuntimeModule(encodedPayload: string): {\n code: string\n} {\n let payload: {\n mode?: string\n env?: string\n importer?: string\n specifier?: string\n trace?: Array<unknown>\n }\n try {\n payload = JSON.parse(fromBase64Url(encodedPayload)) as typeof payload\n } catch {\n payload = {}\n }\n\n const mode: 'error' | 'warn' | 'off' =\n payload.mode === 'warn' || payload.mode === 'off' ? payload.mode : 'error'\n\n const meta = {\n env: String(payload.env ?? ''),\n importer: String(payload.importer ?? ''),\n specifier: String(payload.specifier ?? ''),\n trace: Array.isArray(payload.trace) ? payload.trace : [],\n }\n\n return { code: generateMockCode({ meta, mode }) }\n}\n\nconst MARKER_MODULE_RESULT = { code: 'export {}' } as const\n\nexport function loadMarkerModule(): { code: string } {\n return MARKER_MODULE_RESULT\n}\n\nexport function loadResolvedVirtualModule(\n id: string,\n): { code: string } | undefined {\n if (id === RESOLVED_MOCK_MODULE_ID) {\n return loadSilentMockModule()\n }\n\n // Per-violation build mock modules — same silent mock code\n if (id.startsWith(RESOLVED_MOCK_BUILD_PREFIX)) {\n return loadSilentMockModule()\n }\n\n if (id.startsWith(RESOLVED_MOCK_EDGE_PREFIX)) {\n return loadMockEdgeModule(id.slice(RESOLVED_MOCK_EDGE_PREFIX.length))\n }\n\n if (id.startsWith(RESOLVED_MOCK_RUNTIME_PREFIX)) {\n return loadMockRuntimeModule(id.slice(RESOLVED_MOCK_RUNTIME_PREFIX.length))\n }\n\n if (id.startsWith(RESOLVED_MARKER_PREFIX)) {\n return loadMarkerModule()\n }\n\n return undefined\n}\n"],"mappings":"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"}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
import { TanStackStartVitePluginCore } from "./plugin.js";
|
|
2
1
|
import { resolveViteId } from "./utils.js";
|
|
3
2
|
import { VITE_ENVIRONMENT_NAMES } from "./constants.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
VITE_ENVIRONMENT_NAMES,
|
|
7
|
-
resolveViteId
|
|
8
|
-
};
|
|
9
|
-
//# sourceMappingURL=index.js.map
|
|
3
|
+
import { TanStackStartVitePluginCore } from "./plugin.js";
|
|
4
|
+
export { TanStackStartVitePluginCore, VITE_ENVIRONMENT_NAMES, resolveViteId };
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { loadEnv } from "vite";
|
|
2
|
+
//#region src/load-env-plugin/plugin.ts
|
|
2
3
|
function loadEnvPlugin() {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
return {
|
|
5
|
+
name: "tanstack-start-core:load-env",
|
|
6
|
+
enforce: "pre",
|
|
7
|
+
configResolved(config) {
|
|
8
|
+
Object.assign(process.env, loadEnv(config.mode, config.root, ""));
|
|
9
|
+
}
|
|
10
|
+
};
|
|
10
11
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
//# sourceMappingURL=plugin.js.map
|
|
12
|
+
//#endregion
|
|
13
|
+
export { loadEnvPlugin };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sources":["../../../src/load-env-plugin/plugin.ts"],"sourcesContent":["import { loadEnv } from 'vite'\nimport type { Plugin } from 'vite'\n\nexport function loadEnvPlugin(): Plugin {\n return {\n name: 'tanstack-start-core:load-env',\n enforce: 'pre',\n configResolved(config) {\n Object.assign(process.env, loadEnv(config.mode, config.root, ''))\n },\n }\n}\n"],"
|
|
1
|
+
{"version":3,"file":"plugin.js","names":[],"sources":["../../../src/load-env-plugin/plugin.ts"],"sourcesContent":["import { loadEnv } from 'vite'\nimport type { Plugin } from 'vite'\n\nexport function loadEnvPlugin(): Plugin {\n return {\n name: 'tanstack-start-core:load-env',\n enforce: 'pre',\n configResolved(config) {\n Object.assign(process.env, loadEnv(config.mode, config.root, ''))\n },\n }\n}\n"],"mappings":";;AAGA,SAAgB,gBAAwB;AACtC,QAAO;EACL,MAAM;EACN,SAAS;EACT,eAAe,QAAQ;AACrB,UAAO,OAAO,QAAQ,KAAK,QAAQ,OAAO,MAAM,OAAO,MAAM,GAAG,CAAC;;EAEpE"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { join } from "pathe";
|
|
2
1
|
import { VITE_ENVIRONMENT_NAMES } from "./constants.js";
|
|
2
|
+
import { join } from "pathe";
|
|
3
|
+
//#region src/output-directory.ts
|
|
3
4
|
function getClientOutputDirectory(userConfig) {
|
|
4
|
-
|
|
5
|
+
return getOutputDirectory(userConfig, VITE_ENVIRONMENT_NAMES.client, "client");
|
|
5
6
|
}
|
|
6
7
|
function getServerOutputDirectory(userConfig) {
|
|
7
|
-
|
|
8
|
+
return getOutputDirectory(userConfig, VITE_ENVIRONMENT_NAMES.server, "server");
|
|
8
9
|
}
|
|
9
10
|
function getOutputDirectory(userConfig, environmentName, directoryName) {
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
const rootOutputDirectory = userConfig.build?.outDir ?? "dist";
|
|
12
|
+
return userConfig.environments?.[environmentName]?.build?.outDir ?? join(rootOutputDirectory, directoryName);
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
//# sourceMappingURL=output-directory.js.map
|
|
14
|
+
//#endregion
|
|
15
|
+
export { getClientOutputDirectory, getServerOutputDirectory };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=output-directory.js.map
|