From f9fe9f042a8fc07e9558e657d2312e1ad5b716b4 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 6 Nov 2024 12:17:00 +0000 Subject: [PATCH 1/8] feat: adds legacy mode flag --- .changeset/warm-snakes-remain.md | 5 +++++ packages/svelte/package.json | 3 +++ .../compiler/phases/3-transform/client/transform-client.js | 4 ++++ packages/svelte/src/internal/client/reactivity/props.js | 3 ++- packages/svelte/src/internal/client/runtime.js | 5 +++-- packages/svelte/src/internal/feature-flags.js | 5 +++++ packages/svelte/src/internal/legacy-component.js | 3 +++ .../svelte/tests/migrate/samples/derivations/output.svelte | 2 +- packages/svelte/tests/migrate/samples/props-ts/output.svelte | 2 +- .../samples/bind-this/_expected/client/index.svelte.js | 1 + .../each-string-template/_expected/client/index.svelte.js | 1 + .../samples/hello-world/_expected/client/index.svelte.js | 1 + .../snapshot/samples/hmr/_expected/client/index.svelte.js | 1 + .../imports-in-modules/_expected/client/index.svelte.js | 1 + .../snapshot/samples/purity/_expected/client/index.svelte.js | 1 + 15 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 .changeset/warm-snakes-remain.md create mode 100644 packages/svelte/src/internal/feature-flags.js create mode 100644 packages/svelte/src/internal/legacy-component.js diff --git a/.changeset/warm-snakes-remain.md b/.changeset/warm-snakes-remain.md new file mode 100644 index 000000000000..5d7ef6e5f5cc --- /dev/null +++ b/.changeset/warm-snakes-remain.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +feat: adds legacy mode flag diff --git a/packages/svelte/package.json b/packages/svelte/package.json index 5234e334b681..94b5d8baf093 100644 --- a/packages/svelte/package.json +++ b/packages/svelte/package.json @@ -53,6 +53,9 @@ "./internal/disclose-version": { "default": "./src/internal/disclose-version.js" }, + "./internal/legacy-component": { + "default": "./src/internal/legacy-component.js" + }, "./internal/server": { "default": "./src/internal/server/index.js" }, diff --git a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js index 4daff53efb0f..c0d2694b0b6b 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js @@ -531,6 +531,10 @@ export function client_component(analysis, options) { body.push(b.stmt(b.call(b.id('$.mark_module_end'), b.id(analysis.name)))); } + if (!analysis.runes) { + body.unshift(b.imports([], 'svelte/internal/legacy-component')); + } + if (options.discloseVersion) { body.unshift(b.imports([], 'svelte/internal/disclose-version')); } diff --git a/packages/svelte/src/internal/client/reactivity/props.js b/packages/svelte/src/internal/client/reactivity/props.js index e24deb5a20c2..43a8182527e6 100644 --- a/packages/svelte/src/internal/client/reactivity/props.js +++ b/packages/svelte/src/internal/client/reactivity/props.js @@ -23,6 +23,7 @@ import * as e from '../errors.js'; import { BRANCH_EFFECT, LEGACY_DERIVED_PROP, ROOT_EFFECT } from '../constants.js'; import { proxy } from '../proxy.js'; import { capture_store_binding } from './store.js'; +import { legacy_mode_flag } from '../../feature-flags.js'; /** * @param {((value?: number) => number)} fn @@ -270,7 +271,7 @@ function with_parent_branch(fn) { */ export function prop(props, key, flags, fallback) { var immutable = (flags & PROPS_IS_IMMUTABLE) !== 0; - var runes = (flags & PROPS_IS_RUNES) !== 0; + var runes = !legacy_mode_flag || (flags & PROPS_IS_RUNES) !== 0; var bindable = (flags & PROPS_IS_BINDABLE) !== 0; var lazy = (flags & PROPS_IS_LAZY_INITIAL) !== 0; var is_store_sub = false; diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index bd4d23dd15b6..797d97403d65 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -33,6 +33,7 @@ import { destroy_derived, execute_derived, update_derived } from './reactivity/d import * as e from './errors.js'; import { lifecycle_outside_component } from '../shared/errors.js'; import { FILENAME } from '../../constants.js'; +import { legacy_mode_flag } from '../feature-flags.js'; const FLUSH_MICROTASK = 0; const FLUSH_SYNC = 1; @@ -162,7 +163,7 @@ export function increment_version() { /** @returns {boolean} */ export function is_runes() { - return component_context !== null && component_context.l === null; + return !legacy_mode_flag || (component_context !== null && component_context.l === null); } /** @@ -1025,7 +1026,7 @@ export function push(props, runes = false, fn) { l: null }; - if (!runes) { + if (legacy_mode_flag && !runes) { component_context.l = { s: null, u: null, diff --git a/packages/svelte/src/internal/feature-flags.js b/packages/svelte/src/internal/feature-flags.js new file mode 100644 index 000000000000..767a40a76543 --- /dev/null +++ b/packages/svelte/src/internal/feature-flags.js @@ -0,0 +1,5 @@ +export let legacy_mode_flag = false; + +export function enable_legacy_mode_flag() { + legacy_mode_flag = true; +} diff --git a/packages/svelte/src/internal/legacy-component.js b/packages/svelte/src/internal/legacy-component.js new file mode 100644 index 000000000000..7a02002f763c --- /dev/null +++ b/packages/svelte/src/internal/legacy-component.js @@ -0,0 +1,3 @@ +import { enable_legacy_mode_flag } from './feature-flags.js'; + +enable_legacy_mode_flag(); diff --git a/packages/svelte/tests/migrate/samples/derivations/output.svelte b/packages/svelte/tests/migrate/samples/derivations/output.svelte index 79ff089018f8..5200b7f8a733 100644 --- a/packages/svelte/tests/migrate/samples/derivations/output.svelte +++ b/packages/svelte/tests/migrate/samples/derivations/output.svelte @@ -13,4 +13,4 @@ -{count} / {doubled} / {quadrupled} / {time_8} / {time_16} +{count} / {doubled} / {quadrupled} / {time_8} / {time_16} \ No newline at end of file diff --git a/packages/svelte/tests/migrate/samples/props-ts/output.svelte b/packages/svelte/tests/migrate/samples/props-ts/output.svelte index e9deea13846d..b75f4383f52f 100644 --- a/packages/svelte/tests/migrate/samples/props-ts/output.svelte +++ b/packages/svelte/tests/migrate/samples/props-ts/output.svelte @@ -39,4 +39,4 @@ {readonly} {optional} - + \ No newline at end of file diff --git a/packages/svelte/tests/snapshot/samples/bind-this/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/bind-this/_expected/client/index.svelte.js index bd24eca96227..3ba3c9a0cfbb 100644 --- a/packages/svelte/tests/snapshot/samples/bind-this/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/bind-this/_expected/client/index.svelte.js @@ -1,4 +1,5 @@ import "svelte/internal/disclose-version"; +import "svelte/internal/legacy-component"; import * as $ from "svelte/internal/client"; export default function Bind_this($$anchor) { diff --git a/packages/svelte/tests/snapshot/samples/each-string-template/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/each-string-template/_expected/client/index.svelte.js index 81c06f23ec3a..b7fa8fa6cf33 100644 --- a/packages/svelte/tests/snapshot/samples/each-string-template/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/each-string-template/_expected/client/index.svelte.js @@ -1,4 +1,5 @@ import "svelte/internal/disclose-version"; +import "svelte/internal/legacy-component"; import * as $ from "svelte/internal/client"; export default function Each_string_template($$anchor) { diff --git a/packages/svelte/tests/snapshot/samples/hello-world/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/hello-world/_expected/client/index.svelte.js index 92354d8f1483..5d80754ad243 100644 --- a/packages/svelte/tests/snapshot/samples/hello-world/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/hello-world/_expected/client/index.svelte.js @@ -1,4 +1,5 @@ import "svelte/internal/disclose-version"; +import "svelte/internal/legacy-component"; import * as $ from "svelte/internal/client"; var root = $.template(`

hello world

`); diff --git a/packages/svelte/tests/snapshot/samples/hmr/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/hmr/_expected/client/index.svelte.js index 01daada7acd0..d21e6c3ff8f2 100644 --- a/packages/svelte/tests/snapshot/samples/hmr/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/hmr/_expected/client/index.svelte.js @@ -1,4 +1,5 @@ import "svelte/internal/disclose-version"; +import "svelte/internal/legacy-component"; import * as $ from "svelte/internal/client"; var root = $.template(`

hello world

`); diff --git a/packages/svelte/tests/snapshot/samples/imports-in-modules/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/imports-in-modules/_expected/client/index.svelte.js index 464ef519afa0..6a0a38a702cc 100644 --- a/packages/svelte/tests/snapshot/samples/imports-in-modules/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/imports-in-modules/_expected/client/index.svelte.js @@ -1,4 +1,5 @@ import "svelte/internal/disclose-version"; +import "svelte/internal/legacy-component"; import * as $ from "svelte/internal/client"; import { random } from './module.svelte'; diff --git a/packages/svelte/tests/snapshot/samples/purity/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/purity/_expected/client/index.svelte.js index 305e9aa0d772..09f4e61e4be9 100644 --- a/packages/svelte/tests/snapshot/samples/purity/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/purity/_expected/client/index.svelte.js @@ -1,4 +1,5 @@ import "svelte/internal/disclose-version"; +import "svelte/internal/legacy-component"; import * as $ from "svelte/internal/client"; var root = $.template(`

`, 1); From 4cd06e223855c6bbf212ef119468c8eaa75979a1 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 6 Nov 2024 12:43:05 +0000 Subject: [PATCH 2/8] feedback --- packages/svelte/package.json | 4 ++-- .../compiler/phases/3-transform/client/transform-client.js | 2 +- packages/svelte/src/internal/client/reactivity/props.js | 2 +- packages/svelte/src/internal/client/runtime.js | 2 +- .../svelte/src/internal/{feature-flags.js => flags/index.js} | 0 packages/svelte/src/internal/flags/legacy.js | 3 +++ packages/svelte/src/internal/legacy-component.js | 3 --- .../samples/bind-this/_expected/client/index.svelte.js | 2 +- .../each-string-template/_expected/client/index.svelte.js | 2 +- .../samples/hello-world/_expected/client/index.svelte.js | 2 +- .../snapshot/samples/hmr/_expected/client/index.svelte.js | 2 +- .../imports-in-modules/_expected/client/index.svelte.js | 2 +- .../snapshot/samples/purity/_expected/client/index.svelte.js | 2 +- 13 files changed, 14 insertions(+), 14 deletions(-) rename packages/svelte/src/internal/{feature-flags.js => flags/index.js} (100%) create mode 100644 packages/svelte/src/internal/flags/legacy.js delete mode 100644 packages/svelte/src/internal/legacy-component.js diff --git a/packages/svelte/package.json b/packages/svelte/package.json index 94b5d8baf093..144726436ffd 100644 --- a/packages/svelte/package.json +++ b/packages/svelte/package.json @@ -53,8 +53,8 @@ "./internal/disclose-version": { "default": "./src/internal/disclose-version.js" }, - "./internal/legacy-component": { - "default": "./src/internal/legacy-component.js" + "./internal/flags/legacy": { + "default": "./src/internal/flags/legacy.js" }, "./internal/server": { "default": "./src/internal/server/index.js" diff --git a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js index c0d2694b0b6b..5349f6025533 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js @@ -532,7 +532,7 @@ export function client_component(analysis, options) { } if (!analysis.runes) { - body.unshift(b.imports([], 'svelte/internal/legacy-component')); + body.unshift(b.imports([], 'svelte/internal/flags/legacy')); } if (options.discloseVersion) { diff --git a/packages/svelte/src/internal/client/reactivity/props.js b/packages/svelte/src/internal/client/reactivity/props.js index 43a8182527e6..ae934c01a561 100644 --- a/packages/svelte/src/internal/client/reactivity/props.js +++ b/packages/svelte/src/internal/client/reactivity/props.js @@ -23,7 +23,7 @@ import * as e from '../errors.js'; import { BRANCH_EFFECT, LEGACY_DERIVED_PROP, ROOT_EFFECT } from '../constants.js'; import { proxy } from '../proxy.js'; import { capture_store_binding } from './store.js'; -import { legacy_mode_flag } from '../../feature-flags.js'; +import { legacy_mode_flag } from '../../flags/index.js'; /** * @param {((value?: number) => number)} fn diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 797d97403d65..e9f1c773e689 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -33,7 +33,7 @@ import { destroy_derived, execute_derived, update_derived } from './reactivity/d import * as e from './errors.js'; import { lifecycle_outside_component } from '../shared/errors.js'; import { FILENAME } from '../../constants.js'; -import { legacy_mode_flag } from '../feature-flags.js'; +import { legacy_mode_flag } from '../flags/index.js'; const FLUSH_MICROTASK = 0; const FLUSH_SYNC = 1; diff --git a/packages/svelte/src/internal/feature-flags.js b/packages/svelte/src/internal/flags/index.js similarity index 100% rename from packages/svelte/src/internal/feature-flags.js rename to packages/svelte/src/internal/flags/index.js diff --git a/packages/svelte/src/internal/flags/legacy.js b/packages/svelte/src/internal/flags/legacy.js new file mode 100644 index 000000000000..cab3c010635f --- /dev/null +++ b/packages/svelte/src/internal/flags/legacy.js @@ -0,0 +1,3 @@ +import { enable_legacy_mode_flag } from './index.js'; + +enable_legacy_mode_flag(); diff --git a/packages/svelte/src/internal/legacy-component.js b/packages/svelte/src/internal/legacy-component.js deleted file mode 100644 index 7a02002f763c..000000000000 --- a/packages/svelte/src/internal/legacy-component.js +++ /dev/null @@ -1,3 +0,0 @@ -import { enable_legacy_mode_flag } from './feature-flags.js'; - -enable_legacy_mode_flag(); diff --git a/packages/svelte/tests/snapshot/samples/bind-this/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/bind-this/_expected/client/index.svelte.js index 3ba3c9a0cfbb..fedcc87696cf 100644 --- a/packages/svelte/tests/snapshot/samples/bind-this/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/bind-this/_expected/client/index.svelte.js @@ -1,5 +1,5 @@ import "svelte/internal/disclose-version"; -import "svelte/internal/legacy-component"; +import "svelte/internal/flags/legacy"; import * as $ from "svelte/internal/client"; export default function Bind_this($$anchor) { diff --git a/packages/svelte/tests/snapshot/samples/each-string-template/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/each-string-template/_expected/client/index.svelte.js index b7fa8fa6cf33..80f2da11a2a1 100644 --- a/packages/svelte/tests/snapshot/samples/each-string-template/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/each-string-template/_expected/client/index.svelte.js @@ -1,5 +1,5 @@ import "svelte/internal/disclose-version"; -import "svelte/internal/legacy-component"; +import "svelte/internal/flags/legacy"; import * as $ from "svelte/internal/client"; export default function Each_string_template($$anchor) { diff --git a/packages/svelte/tests/snapshot/samples/hello-world/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/hello-world/_expected/client/index.svelte.js index 5d80754ad243..9f6f29166975 100644 --- a/packages/svelte/tests/snapshot/samples/hello-world/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/hello-world/_expected/client/index.svelte.js @@ -1,5 +1,5 @@ import "svelte/internal/disclose-version"; -import "svelte/internal/legacy-component"; +import "svelte/internal/flags/legacy"; import * as $ from "svelte/internal/client"; var root = $.template(`

hello world

`); diff --git a/packages/svelte/tests/snapshot/samples/hmr/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/hmr/_expected/client/index.svelte.js index d21e6c3ff8f2..86c2880abc8f 100644 --- a/packages/svelte/tests/snapshot/samples/hmr/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/hmr/_expected/client/index.svelte.js @@ -1,5 +1,5 @@ import "svelte/internal/disclose-version"; -import "svelte/internal/legacy-component"; +import "svelte/internal/flags/legacy"; import * as $ from "svelte/internal/client"; var root = $.template(`

hello world

`); diff --git a/packages/svelte/tests/snapshot/samples/imports-in-modules/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/imports-in-modules/_expected/client/index.svelte.js index 6a0a38a702cc..9c7d2f3f23b0 100644 --- a/packages/svelte/tests/snapshot/samples/imports-in-modules/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/imports-in-modules/_expected/client/index.svelte.js @@ -1,5 +1,5 @@ import "svelte/internal/disclose-version"; -import "svelte/internal/legacy-component"; +import "svelte/internal/flags/legacy"; import * as $ from "svelte/internal/client"; import { random } from './module.svelte'; diff --git a/packages/svelte/tests/snapshot/samples/purity/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/purity/_expected/client/index.svelte.js index 09f4e61e4be9..0a627a55ae6c 100644 --- a/packages/svelte/tests/snapshot/samples/purity/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/purity/_expected/client/index.svelte.js @@ -1,5 +1,5 @@ import "svelte/internal/disclose-version"; -import "svelte/internal/legacy-component"; +import "svelte/internal/flags/legacy"; import * as $ from "svelte/internal/client"; var root = $.template(`

`, 1); From 8f63b179f6e8e5f1240a9f1b435ccbe6ed9bf133 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 6 Nov 2024 14:00:41 +0000 Subject: [PATCH 3/8] feedback and tweaks --- .../svelte/scripts/check-treeshakeability.js | 17 +++++++- .../src/internal/client/dom/blocks/each.js | 39 ++++++++++--------- 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/packages/svelte/scripts/check-treeshakeability.js b/packages/svelte/scripts/check-treeshakeability.js index 9263649956f5..23982adaacea 100644 --- a/packages/svelte/scripts/check-treeshakeability.js +++ b/packages/svelte/scripts/check-treeshakeability.js @@ -57,6 +57,7 @@ for (const key in pkg.exports) { if (key === './compiler') continue; if (key === './internal') continue; if (key === './internal/disclose-version') continue; + if (key === './internal/flags/legacy') continue; for (const type of ['browser', 'default']) { if (!pkg.exports[key][type]) continue; @@ -83,6 +84,7 @@ const bundle = await bundle_code( // Use all features which contain hydration code to ensure it's treeshakeable compile( ` +