Skip to content

Commit 1301e80

Browse files
authored
fix: don't treat derived imported from svelte/store as a potential store (#2780)
#2772
1 parent 33f7e7f commit 1301e80

File tree

5 files changed

+60
-2
lines changed

5 files changed

+60
-2
lines changed

packages/svelte2tsx/src/svelte2tsx/index.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,11 @@ export function svelte2tsx(
9595
const renderFunctionStart = scriptTag
9696
? str.original.lastIndexOf('>', scriptTag.content.start) + 1
9797
: instanceScriptTarget;
98-
const implicitStoreValues = new ImplicitStoreValues(resolvedStores, renderFunctionStart);
98+
const implicitStoreValues = new ImplicitStoreValues(
99+
resolvedStores,
100+
renderFunctionStart,
101+
svelte5Plus
102+
);
99103
//move the instance script and process the content
100104
let exportedNames = new ExportedNames(str, 0, basename, isTsFile, svelte5Plus, isRunes);
101105
let generics = new Generics(str, 0, { attributes: [] } as any);
@@ -155,6 +159,7 @@ export function svelte2tsx(
155159
new ImplicitStoreValues(
156160
implicitStoreValues.getAccessedStores(),
157161
renderFunctionStart,
162+
svelte5Plus,
158163
scriptTag || options.mode === 'ts' ? undefined : (input) => `</>;${input}<>`
159164
),
160165
moduleAst

packages/svelte2tsx/src/svelte2tsx/nodes/ImplicitStoreValues.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export class ImplicitStoreValues {
2424
constructor(
2525
storesResolvedInTemplate: string[] = [],
2626
private renderFunctionStart: number,
27+
private isSvelte5Plus: boolean,
2728
private storeFromImportsWrapper = (input: string) => input
2829
) {
2930
storesResolvedInTemplate.forEach(this.addStoreAcess);
@@ -122,7 +123,12 @@ export class ImplicitStoreValues {
122123

123124
private attachStoreValueDeclarationOfImportsToRenderFn(str: MagicString) {
124125
const storeNames = this.importStatements
125-
.filter(({ name }) => name && this.accessedStores.has(name.getText()))
126+
.filter(
127+
(declaration) =>
128+
declaration.name &&
129+
(!this.isSvelte5Plus || !this.isSvelteStoreDerivedImport(declaration)) &&
130+
this.accessedStores.has(declaration.name.getText())
131+
)
126132
.map(({ name }) => name.getText());
127133
if (!storeNames.length) {
128134
return;
@@ -135,6 +141,20 @@ export class ImplicitStoreValues {
135141
str.appendRight(this.renderFunctionStart, storeDeclarations);
136142
}
137143

144+
private isSvelteStoreDerivedImport(declaration: ts.ImportClause | ts.ImportSpecifier): boolean {
145+
// named import of 'derived' from 'svelte/store'
146+
if (!ts.isImportSpecifier(declaration) || declaration.name.text !== 'derived') {
147+
return false;
148+
}
149+
const importDeclaration = declaration.parent.parent.parent;
150+
return (
151+
ts.isImportDeclaration(importDeclaration) &&
152+
importDeclaration.moduleSpecifier &&
153+
ts.isStringLiteral(importDeclaration.moduleSpecifier) &&
154+
importDeclaration.moduleSpecifier.text === 'svelte/store'
155+
);
156+
}
157+
138158
private createStoreDeclarations(storeNames: string[]): string {
139159
let declarations = '';
140160
for (let i = 0; i < storeNames.length; i++) {
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
///<reference types="svelte" />
2+
;
3+
import { derived } from 'svelte/store';
4+
function $$render() {
5+
6+
7+
8+
let a = $derived(1);
9+
;
10+
async () => {};
11+
return { props: /** @type {Record<string, never>} */ ({}), exports: {}, bindings: "", slots: {}, events: {} }}
12+
const Input__SvelteComponent_ = __sveltets_2_isomorphic_component(__sveltets_2_partial(__sveltets_2_with_any_event($$render())));
13+
/*Ωignore_startΩ*/type Input__SvelteComponent_ = InstanceType<typeof Input__SvelteComponent_>;
14+
/*Ωignore_endΩ*/export default Input__SvelteComponent_;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
///<reference types="svelte" />
2+
;
3+
import { derived } from 'svelte/store';
4+
function $$render() {
5+
/*Ωignore_startΩ*/;let $derived = __sveltets_2_store_get(derived);/*Ωignore_endΩ*/
6+
7+
8+
let a = $derived(1);
9+
;
10+
async () => {};
11+
return { props: /** @type {Record<string, never>} */ ({}), slots: {}, events: {} }}
12+
13+
export default class Input__SvelteComponent_ extends __sveltets_2_createSvelte2TsxComponent(__sveltets_2_partial(__sveltets_2_with_any_event($$render()))) {
14+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<script>
2+
import { derived } from 'svelte/store';
3+
4+
let a = $derived(1);
5+
</script>

0 commit comments

Comments
 (0)