mirror of
https://github.com/sveltejs/svelte.git
synced 2024-12-01 17:30:59 +01:00
error on contextual stores, for now (#2016)
This commit is contained in:
parent
47ab23c1de
commit
6f394e521a
@ -122,8 +122,16 @@ export default class Expression {
|
|||||||
const { name, nodes } = flattenReference(node);
|
const { name, nodes } = flattenReference(node);
|
||||||
|
|
||||||
if (scope.has(name)) return;
|
if (scope.has(name)) return;
|
||||||
|
|
||||||
if (globalWhitelist.has(name) && !component.var_lookup.has(name)) return;
|
if (globalWhitelist.has(name) && !component.var_lookup.has(name)) return;
|
||||||
|
|
||||||
|
if (name[0] === '$' && template_scope.names.has(name.slice(1))) {
|
||||||
|
component.error(node, {
|
||||||
|
code: `contextual-store`,
|
||||||
|
message: `Stores must be declared at the top level of the component (this may change in a future version of Svelte)`
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (template_scope.is_let(name)) {
|
if (template_scope.is_let(name)) {
|
||||||
if (!function_expression) {
|
if (!function_expression) {
|
||||||
dependencies.add(name);
|
dependencies.add(name);
|
||||||
|
76
test/runtime/samples/store-contextual/_config.js
Normal file
76
test/runtime/samples/store-contextual/_config.js
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
import { writable } from '../../../../store.js';
|
||||||
|
|
||||||
|
const todos = [
|
||||||
|
writable({ done: false, text: 'write docs' }),
|
||||||
|
writable({ done: false, text: 'implement contextual stores' }),
|
||||||
|
writable({ done: false, text: 'go outside' })
|
||||||
|
];
|
||||||
|
|
||||||
|
export default {
|
||||||
|
error: `Stores must be declared at the top level of the component (this may change in a future version of Svelte)`,
|
||||||
|
|
||||||
|
props: {
|
||||||
|
todos
|
||||||
|
},
|
||||||
|
|
||||||
|
html: `
|
||||||
|
<label>
|
||||||
|
<input type=checkbox>
|
||||||
|
[todo] write docs
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label>
|
||||||
|
<input type=checkbox>
|
||||||
|
[todo] implement contextual stores
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label>
|
||||||
|
<input type=checkbox>
|
||||||
|
[todo] go outside
|
||||||
|
</label>
|
||||||
|
`,
|
||||||
|
|
||||||
|
async test({ assert, component, target, window }) {
|
||||||
|
const inputs = target.querySelectorAll('input');
|
||||||
|
const change = new window.MouseEvent('change');
|
||||||
|
|
||||||
|
inputs[1].checked = true;
|
||||||
|
await inputs[1].dispatchEvent(change);
|
||||||
|
|
||||||
|
assert.htmlEqual(target.innerHTML, `
|
||||||
|
<label>
|
||||||
|
<input type=checkbox>
|
||||||
|
[todo] write docs
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label>
|
||||||
|
<input type=checkbox>
|
||||||
|
[done] implement contextual stores
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label>
|
||||||
|
<input type=checkbox>
|
||||||
|
[todo] go outside
|
||||||
|
</label>
|
||||||
|
`);
|
||||||
|
|
||||||
|
await todos[0].update(todo => ({ done: !todo.done, text: todo.text }));
|
||||||
|
|
||||||
|
assert.htmlEqual(target.innerHTML, `
|
||||||
|
<label>
|
||||||
|
<input type=checkbox>
|
||||||
|
[done] write docs
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label>
|
||||||
|
<input type=checkbox>
|
||||||
|
[done] implement contextual stores
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label>
|
||||||
|
<input type=checkbox>
|
||||||
|
[todo] go outside
|
||||||
|
</label>
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
};
|
6
test/runtime/samples/store-contextual/main.svelte
Normal file
6
test/runtime/samples/store-contextual/main.svelte
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{#each todos as todo}
|
||||||
|
<label>
|
||||||
|
<input type=checkbox on:change={e => todo.update(t => ({ done: e.target.checked, text: t.text }))}>
|
||||||
|
{$todo.done ? '[done]' : '[todo]'} {$todo.text}
|
||||||
|
</label>
|
||||||
|
{/each}
|
Loading…
Reference in New Issue
Block a user