diff --git a/packages/language-server/src/plugins/svelte/features/SvelteTags.ts b/packages/language-server/src/plugins/svelte/features/SvelteTags.ts index cbbf2e443..0dc29792f 100644 --- a/packages/language-server/src/plugins/svelte/features/SvelteTags.ts +++ b/packages/language-server/src/plugins/svelte/features/SvelteTags.ts @@ -3,7 +3,7 @@ import { SvelteDocument } from '../SvelteDocument'; /** * Special svelte syntax tags that do template logic. */ -export type SvelteLogicTag = 'each' | 'if' | 'await'; +export type SvelteLogicTag = 'each' | 'if' | 'await' | 'key'; /** * Special svelte syntax tags. @@ -43,6 +43,15 @@ Content that is conditionally rendered can be wrapped in an if block. \`{#if expression}...{:else}...{/if}\`\\ \\ https://svelte.dev/docs#if +`, + key: `\`{#key expression}...{/key}\`\\ +Key blocks destroy and recreate their contents when the value of an expression changes.\\ +This is useful if you want an element to play its transition whenever a value changes.\\ +When used around components, this will cause them to be reinstantiated and reinitialised. +#### Usage: +\`{#key expression}...{/key}\`\\ +\\ +https://svelte.dev/docs#key `, html: `\`{@html ...}\`\\ @@ -88,6 +97,7 @@ export function getLatestOpeningTag( idxOfLastOpeningTag(content, 'each'), idxOfLastOpeningTag(content, 'if'), idxOfLastOpeningTag(content, 'await'), + idxOfLastOpeningTag(content, 'key'), ]; const lastIdx = lastIdxs.sort((i1, i2) => i2.lastIdx - i1.lastIdx); return lastIdx[0].lastIdx === -1 ? null : lastIdx[0].tag; diff --git a/packages/language-server/src/plugins/svelte/features/getCompletions.ts b/packages/language-server/src/plugins/svelte/features/getCompletions.ts index 10f0819b5..0e8720fa1 100644 --- a/packages/language-server/src/plugins/svelte/features/getCompletions.ts +++ b/packages/language-server/src/plugins/svelte/features/getCompletions.ts @@ -15,7 +15,8 @@ const HTML_COMMENT_START = ' {expr || <>...>} + * {#key expr}content{/key} ---> {expr} content */ export function handleKey(htmlx: string, str: MagicString, keyBlock: Node): void { - // {#key expr} -> {expr || <> + // {#key expr} -> {expr} str.overwrite(keyBlock.start, keyBlock.expression.start, '{'); const end = htmlx.indexOf('}', keyBlock.expression.end); - str.overwrite(keyBlock.expression.end, end + 1, ' || <>'); + str.overwrite(keyBlock.expression.end, end + 1, '} '); - // {/key} -> >} + // {/key} -> const endKey = htmlx.lastIndexOf('{', keyBlock.end - 1); - str.overwrite(endKey, keyBlock.end, '>}'); + str.remove(endKey, keyBlock.end); } diff --git a/packages/svelte2tsx/test/htmlx2jsx/samples/key-block/expected.jsx b/packages/svelte2tsx/test/htmlx2jsx/samples/key-block/expected.jsx index e07beb037..30a942823 100644 --- a/packages/svelte2tsx/test/htmlx2jsx/samples/key-block/expected.jsx +++ b/packages/svelte2tsx/test/htmlx2jsx/samples/key-block/expected.jsx @@ -1,9 +1,9 @@ -<>{value || <> +<>{value}
hello
->} -{$store || <> + +{$store}hello
->} -{expr.obj || <> + +{expr.obj}hello
->}> \ No newline at end of file +> \ No newline at end of file