Skip to content

Commit 5ba9d66

Browse files
committed
adapt rewrite frames integration
1 parent b7af7a6 commit 5ba9d66

3 files changed

Lines changed: 56 additions & 1 deletion

File tree

dev-packages/e2e-tests/test-applications/sveltekit-3/tests/errors.server.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ test.describe('server-side errors', () => {
7070

7171
expect(errorEventFrames?.[errorEventFrames?.length - 1]).toEqual(
7272
expect.objectContaining({
73-
filename: expect.stringMatching(/app:\/\/\/_server.ts-.+.js/),
73+
filename: 'app:///src/routes/server-route-error/+server.ts',
7474
function: 'GET',
7575
in_app: true,
7676
}),

packages/sveltekit/src/server-common/integrations/rewriteFramesIntegration.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,13 @@ export function rewriteFramesIteratee(frame: StackFrame): StackFrame {
6868
strippedFilename = basename(filename);
6969
}
7070
frame.filename = `${prefix}${strippedFilename}`;
71+
} else if (isAppRelativeSourceFrame(frame.filename)) {
72+
// SvelteKit 3 (Vite/Rolldown) source-maps server frames to relative project paths such as
73+
// `src/routes/+page.ts` instead of the previous bundled absolute chunk paths. These skip the
74+
// branch above, so the default parser marks them as `in_app: false` (relative paths look like
75+
// Node internals). Prefix them like the absolute frames and flag them as app code.
76+
frame.filename = `${prefix}${frame.filename.replace(/^\.\//, '')}`;
77+
frame.in_app = true;
7178
}
7279

7380
delete frame.module;
@@ -80,3 +87,12 @@ export function rewriteFramesIteratee(frame: StackFrame): StackFrame {
8087

8188
return frame;
8289
}
90+
91+
/**
92+
* Whether a (non-absolute) frame filename is an app-relative source path like `src/routes/+page.ts`,
93+
* as opposed to a dependency or a Node built-in. Excludes `node_modules` and any scheme/drive prefix
94+
* (e.g. `node:`, `data:`, `C:/`).
95+
*/
96+
function isAppRelativeSourceFrame(filename: string): boolean {
97+
return !filename.includes('node_modules/') && !/^[a-zA-Z][a-zA-Z0-9.+-]*:/.test(filename);
98+
}

packages/sveltekit/test/server-common/integrations/rewriteFramesIntegration.test.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,45 @@ describe('rewriteFramesIteratee', () => {
5252
expect(result).toStrictEqual(originalResult);
5353
});
5454

55+
it.each([
56+
['src/routes/universal-load-error/+page.ts', 'app:///src/routes/universal-load-error/+page.ts'],
57+
['./src/routes/server-load-error/+page.server.ts', 'app:///src/routes/server-load-error/+page.server.ts'],
58+
['src/hooks.server.ts', 'app:///src/hooks.server.ts'],
59+
])('rewrites and flags SvelteKit 3 app-relative source frames as in_app (%s)', (frameFilename, modifiedFilename) => {
60+
const frame: StackFrame = {
61+
filename: frameFilename,
62+
lineno: 2,
63+
colno: 9,
64+
function: 'load',
65+
};
66+
67+
const result = rewriteFramesIteratee({ ...frame });
68+
69+
expect(result).toStrictEqual({
70+
filename: modifiedFilename,
71+
lineno: 2,
72+
colno: 9,
73+
function: 'load',
74+
in_app: true,
75+
});
76+
});
77+
78+
it.each([['node_modules/@sveltejs/kit/src/runtime/server/index.js'], ['node:internal/process/task_queues']])(
79+
'does not rewrite or flag dependency/internal relative frames (%s)',
80+
frameFilename => {
81+
const frame: StackFrame = {
82+
filename: frameFilename,
83+
lineno: 1,
84+
colno: 1,
85+
};
86+
87+
const result = rewriteFramesIteratee({ ...frame });
88+
89+
expect(result.filename).toBe(frameFilename);
90+
expect(result.in_app).toBeUndefined();
91+
},
92+
);
93+
5594
it.each([
5695
['adapter-node', 'build', '/absolute/path/to/build/server/chunks/3-ab34d22f.js', 'app:///chunks/3-ab34d22f.js'],
5796
[

0 commit comments

Comments
 (0)