Skip to content

Commit d0f156c

Browse files
trueadmRich-Harris
andauthored
fix: ensure $inspect.trace code is treeshaken out if unused (#14770)
* fix: ensure $inspect.trace code is treeshaken out if unused * Update .changeset/tough-dingos-deliver.md --------- Co-authored-by: Rich Harris <[email protected]>
1 parent 8705d44 commit d0f156c

File tree

13 files changed

+44
-6
lines changed

13 files changed

+44
-6
lines changed

Diff for: .changeset/tough-dingos-deliver.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: treeshake `$inspect.trace` code if unused

Diff for: packages/svelte/package.json

+3
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@
5656
"./internal/flags/legacy": {
5757
"default": "./src/internal/flags/legacy.js"
5858
},
59+
"./internal/flags/tracing": {
60+
"default": "./src/internal/flags/tracing.js"
61+
},
5962
"./internal/server": {
6063
"default": "./src/internal/server/index.js"
6164
},

Diff for: packages/svelte/scripts/check-treeshakeability.js

+11
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ for (const key in pkg.exports) {
5858
if (key === './internal') continue;
5959
if (key === './internal/disclose-version') continue;
6060
if (key === './internal/flags/legacy') continue;
61+
if (key === './internal/flags/tracing') continue;
6162

6263
for (const type of ['browser', 'default']) {
6364
if (!pkg.exports[key][type]) continue;
@@ -91,6 +92,7 @@ const bundle = await bundle_code(
9192
</script>
9293
9394
<svelte:head><title>hi</title></svelte:head>
95+
<input bind:value={foo} />
9496
9597
<a href={foo} class={foo}>a</a>
9698
<a {...foo}>a</a>
@@ -134,6 +136,15 @@ if (!bundle.includes('component_context.l')) {
134136
console.error(`❌ Legacy code not treeshakeable`);
135137
}
136138

139+
if (!bundle.includes(`'CreatedAt'`)) {
140+
// eslint-disable-next-line no-console
141+
console.error(`✅ $inspect.trace code treeshakeable`);
142+
} else {
143+
failed = true;
144+
// eslint-disable-next-line no-console
145+
console.error(`❌ $inspect.trace code not treeshakeable`);
146+
}
147+
137148
if (failed) {
138149
// eslint-disable-next-line no-console
139150
console.error(bundle);

Diff for: packages/svelte/src/compiler/phases/2-analyze/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,7 @@ export function analyze_component(root, source, options) {
408408
template,
409409
elements: [],
410410
runes,
411+
tracing: false,
411412
immutable: runes || options.immutable,
412413
exports: [],
413414
uses_props: false,

Diff for: packages/svelte/src/compiler/phases/2-analyze/visitors/CallExpression.js

+2
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,8 @@ export function CallExpression(node, context) {
171171

172172
context.state.scope.tracing = b.thunk(b.literal(label + ' ' + loc));
173173
}
174+
175+
context.state.analysis.tracing = true;
174176
}
175177

176178
break;

Diff for: packages/svelte/src/compiler/phases/3-transform/client/transform-client.js

+4
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,10 @@ export function client_component(analysis, options) {
539539
body.unshift(b.imports([], 'svelte/internal/flags/legacy'));
540540
}
541541

542+
if (analysis.tracing) {
543+
body.unshift(b.imports([], 'svelte/internal/flags/tracing'));
544+
}
545+
542546
if (options.discloseVersion) {
543547
body.unshift(b.imports([], 'svelte/internal/disclose-version'));
544548
}

Diff for: packages/svelte/src/compiler/phases/types.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export interface ComponentAnalysis extends Analysis {
3939
/** Used for CSS pruning and scoping */
4040
elements: Array<AST.RegularElement | AST.SvelteElement>;
4141
runes: boolean;
42+
tracing: boolean;
4243
exports: Array<{ name: string; alias: string | null }>;
4344
/** Whether the component uses `$$props` */
4445
uses_props: boolean;

Diff for: packages/svelte/src/internal/client/proxy.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { STATE_SYMBOL, STATE_SYMBOL_METADATA } from './constants.js';
1414
import { UNINITIALIZED } from '../../constants.js';
1515
import * as e from './errors.js';
1616
import { get_stack } from './dev/tracing.js';
17+
import { tracing_mode_flag } from '../flags/index.js';
1718

1819
/**
1920
* @template T
@@ -25,7 +26,7 @@ import { get_stack } from './dev/tracing.js';
2526
export function proxy(value, parent = null, prev) {
2627
/** @type {Error | null} */
2728
var stack = null;
28-
if (DEV) {
29+
if (DEV && tracing_mode_flag) {
2930
stack = get_stack('CreatedAt');
3031
}
3132
// if non-proxyable, or is already a proxy, return `value`

Diff for: packages/svelte/src/internal/client/reactivity/deriveds.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import * as e from '../errors.js';
2525
import { destroy_effect } from './effects.js';
2626
import { inspect_effects, set_inspect_effects } from './sources.js';
2727
import { get_stack } from '../dev/tracing.js';
28+
import { tracing_mode_flag } from '../../flags/index.js';
2829

2930
/**
3031
* @template V
@@ -62,7 +63,7 @@ export function derived(fn) {
6263
parent: parent_derived ?? active_effect
6364
};
6465

65-
if (DEV) {
66+
if (DEV && tracing_mode_flag) {
6667
signal.created = get_stack('CreatedAt');
6768
}
6869

Diff for: packages/svelte/src/internal/client/reactivity/sources.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import {
3232
BLOCK_EFFECT
3333
} from '../constants.js';
3434
import * as e from '../errors.js';
35-
import { legacy_mode_flag } from '../../flags/index.js';
35+
import { legacy_mode_flag, tracing_mode_flag } from '../../flags/index.js';
3636
import { get_stack } from '../dev/tracing.js';
3737

3838
export let inspect_effects = new Set();
@@ -60,7 +60,7 @@ export function source(v, stack) {
6060
version: 0
6161
};
6262

63-
if (DEV) {
63+
if (DEV && tracing_mode_flag) {
6464
signal.created = stack ?? get_stack('CreatedAt');
6565
signal.debug = null;
6666
}
@@ -170,7 +170,7 @@ export function internal_set(source, value) {
170170
source.v = value;
171171
source.version = increment_version();
172172

173-
if (DEV) {
173+
if (DEV && tracing_mode_flag) {
174174
source.updated = get_stack('UpdatedAt');
175175
}
176176

Diff for: packages/svelte/src/internal/client/runtime.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import { destroy_derived, execute_derived, update_derived } from './reactivity/d
3434
import * as e from './errors.js';
3535
import { lifecycle_outside_component } from '../shared/errors.js';
3636
import { FILENAME } from '../../constants.js';
37-
import { legacy_mode_flag } from '../flags/index.js';
37+
import { legacy_mode_flag, tracing_mode_flag } from '../flags/index.js';
3838
import { tracing_expressions, get_stack } from './dev/tracing.js';
3939

4040
const FLUSH_MICROTASK = 0;
@@ -917,6 +917,7 @@ export function get(signal) {
917917

918918
if (
919919
DEV &&
920+
tracing_mode_flag &&
920921
tracing_expressions !== null &&
921922
active_reaction !== null &&
922923
tracing_expressions.reaction === active_reaction

Diff for: packages/svelte/src/internal/flags/index.js

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
export let legacy_mode_flag = false;
2+
export let tracing_mode_flag = false;
23

34
export function enable_legacy_mode_flag() {
45
legacy_mode_flag = true;
56
}
7+
8+
export function enable_tracing_mode_flag() {
9+
tracing_mode_flag = true;
10+
}

Diff for: packages/svelte/src/internal/flags/tracing.js

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { enable_tracing_mode_flag } from './index.js';
2+
3+
enable_tracing_mode_flag();

0 commit comments

Comments
 (0)