Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update SvelteKit anchor tag props #1682

Merged
merged 7 commits into from
Nov 29, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
61 changes: 40 additions & 21 deletions packages/language-server/src/plugins/html/dataProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,40 @@ const svelteAttributes: IAttributeData[] = [
'To get a reference to a DOM node, use bind:this. If used on a component, gets a reference to that component instance.'
}
];
const sveltekitAttributes: IAttributeData[] = [
{
name: 'data-sveltekit-noscroll',
description:
'SvelteKit-specific attribute. Will prevent scrolling after the link is clicked.',
valueSet: 'v'
},
{
name: 'data-sveltekit-preload-code',
description:
"SvelteKit-specific attribute. Will cause SvelteKit to run the page's load function as soon as the user hovers over the link (on a desktop) or touches it (on mobile), rather than waiting for the click event to trigger navigation.",
valueSet: 'v',
values: [
{ name: 'eager' },
{ name: 'viewport' },
{ name: 'hover' },
{ name: 'tap' },
{ name: 'off' }
]
},
{
name: 'data-sveltekit-preload-data',
description:
"SvelteKit-specific attribute. Will cause SvelteKit to run the page's load function as soon as the user hovers over the link (on a desktop) or touches it (on mobile), rather than waiting for the click event to trigger navigation.",
valueSet: 'v',
values: [{ name: 'hover' }, { name: 'tap' }, { name: 'off' }]
},
{
name: 'data-sveltekit-reload',
description:
'SvelteKit-specific attribute. Will cause SvelteKit to do a normal browser navigation which results in a full page reload.',
valueSet: 'v'
}
];

const svelteTags: ITagData[] = [
{
Expand Down Expand Up @@ -288,26 +322,6 @@ const addAttributes: Record<string, IAttributeData[]> = {
textarea: [{ name: 'bind:value' }],
video: [...mediaAttributes, ...videoAttributes],
audio: [...mediaAttributes],
a: [
{
name: 'sveltekit:noscroll',
description:
'SvelteKit-specific attribute. Will prevent scrolling after the link is clicked.',
valueSet: 'v'
},
{
name: 'sveltekit:prefetch',
description:
"SvelteKit-specific attribute. Will cause SvelteKit to run the page's load function as soon as the user hovers over the link (on a desktop) or touches it (on mobile), rather than waiting for the click event to trigger navigation.",
valueSet: 'v'
},
{
name: 'sveltekit:reload',
description:
'SvelteKit-specific attribute. Will cause SvelteKit to do a normal browser navigation which results in a full page reload.',
valueSet: 'v'
}
],
details: [
{
name: 'bind:open'
Expand All @@ -328,7 +342,12 @@ const html5Tags = htmlData.tags!.map((tag) => {

export const svelteHtmlDataProvider = newHTMLDataProvider('svelte-builtin', {
version: 1,
globalAttributes: [...htmlData.globalAttributes!, ...svelteEvents, ...svelteAttributes],
globalAttributes: [
...htmlData.globalAttributes!,
...svelteEvents,
...svelteAttributes,
...sveltekitAttributes
],
tags: [...html5Tags, ...svelteTags],
valueSets: htmlData.valueSets
});
Expand Down
9 changes: 5 additions & 4 deletions packages/svelte2tsx/src/htmlxtojsx/nodes/attribute.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import MagicString from 'magic-string';
import { Attribute, BaseNode } from '../../interfaces';
import svgAttributes from '../svgattributes';
import { buildTemplateString } from '../utils/node-utils';
import { Attribute, BaseNode } from '../../interfaces';

/**
* List taken from `svelte-jsx.d.ts` by searching for all attributes of type number
Expand Down Expand Up @@ -61,9 +61,10 @@ export function handleAttribute(
if (parent.type == 'Element') {
const sapperLinkActions = ['sapper:prefetch', 'sapper:noscroll'];
const sveltekitLinkActions = [
'sveltekit:prefetch',
'sveltekit:noscroll',
'sveltekit:reload'
'data-sveltekit-preload-code',
'data-sveltekit-preload-data',
'data-sveltekit-noscroll',
'data-sveltekit-reload'
];
// skip Attribute shorthand, that is handled below
if (
Expand Down
2 changes: 1 addition & 1 deletion packages/svelte2tsx/src/htmlxtojsx_v2/nodes/Attribute.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ export function handleAttribute(
const addAttribute =
element instanceof Element
? (name: TransformationArray, value?: TransformationArray) => {
if (attr.name.startsWith('data-')) {
if (attr.name.startsWith('data-') && !attr.name.startsWith('data-sveltekit-')) {
// any attribute prefixed with data- is valid, but we can't
// type that statically, so we need this workaround
name.unshift('...__sveltets_2_empty({');
Expand Down
7 changes: 4 additions & 3 deletions packages/svelte2tsx/svelte-html-do-not-use.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -559,9 +559,10 @@ export interface HTMLAnchorAttributes extends HTMLAttributes<HTMLAnchorElement>
referrerpolicy?: ReferrerPolicy | undefined | null;

// SvelteKit
'sveltekit:noscroll'?: true | undefined | null;
'sveltekit:prefetch'?: true | undefined | null;
'sveltekit:reload'?: true | undefined | null;
'data-sveltekit-noscroll'?: true | undefined | null;
'data-sveltekit-preload-code'?: true | 'eager' | 'viewport' | 'hover' | 'tap' | 'off' | undefined | null;
'data-sveltekit-preload-data'?: true | 'hover' | 'tap' | 'off' | undefined | null;
'data-sveltekit-reload'?: true | undefined | null;

// Sapper
'sapper:noscroll'?: true | undefined | null;
Expand Down
8 changes: 4 additions & 4 deletions packages/svelte2tsx/svelte-jsx.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1176,10 +1176,10 @@ declare namespace svelte.JSX {
}

interface SvelteKitAnchorProps {
// transformed from sveltekit:noscroll so it should be camel case
sveltekitNoscroll?: true | undefined | null;
sveltekitPrefetch?: true | undefined | null;
sveltekitReload?: true | undefined | null;
'data-sveltekit-noscroll'?: true | undefined | null;
'data-sveltekit-preload-code'?: true | 'eager' | 'viewport' | 'hover' | 'tap' | 'off' | undefined | null;
'data-sveltekit-preload-data'?: true | 'hover' | 'tap' | 'off' | undefined | null;
'data-sveltekit-reload'?: true | undefined | null;
}

interface SvelteMediaTimeRange {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<><a sveltekitNoscroll></a>
<a sveltekitPrefetch></a>
<a sveltekitReload></a>
<svelteelement this="a" sveltekitPrefetch></svelteelement></>
<><a data-sveltekit-noscroll></a>
<a data-sveltekit-preload-code></a>
<a data-sveltekit-preload-data></a>
<a data-sveltekit-reload></a>
<svelteelement this="a" data-sveltekit-preload-data></svelteelement></>
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{ svelteHTML.createElement("a", {"sveltekit:noscroll":true,}); }
{ svelteHTML.createElement("a", {"sveltekit:prefetch":true,}); }
{ svelteHTML.createElement("a", {"sveltekit:reload":true,}); }
{ svelteHTML.createElement("a", { "sveltekit:prefetch":true,}); }
{ svelteHTML.createElement("a", {"data-sveltekit-noscroll":true,}); }
{ svelteHTML.createElement("a", {"data-sveltekit-preload-code":true,}); }
{ svelteHTML.createElement("a", {"data-sveltekit-preload-data":true,}); }
{ svelteHTML.createElement("a", {"data-sveltekit-reload":true,}); }
{ svelteHTML.createElement("a", { "data-sveltekit-preload-data":true,}); }
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<a sveltekit:noscroll></a>
<a sveltekit:prefetch></a>
<a sveltekit:reload></a>
<svelte:element this="a" sveltekit:prefetch></svelte:element>
<a data-sveltekit-noscroll></a>
<a data-sveltekit-preload-code></a>
<a data-sveltekit-preload-data></a>
<a data-sveltekit-reload></a>
<svelte:element this="a" data-sveltekit-preload-data></svelte:element>
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<svelteelement this={tag ? 'a' : 'b'} />
<svelteelement this={tag}>{tag}</svelteelement>
<svelteelement this={tag} onclick={() => tag} />
<svelteelement this={'a'} sveltekitPrefetch href="https://kit.svelte.dev" /></>);
<svelteelement this={'a'} data-sveltekit-preload-data href="https://kit.svelte.dev" /></>);
return { props: /** @type {Record<string, never>} */ ({}), slots: {}, events: {} }}

export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ async () => {
{ svelteHTML.createElement(tag ? 'a' : 'b', { });}
{ svelteHTML.createElement(tag, { });tag; }
{ svelteHTML.createElement(tag, { "on:click":() => tag,});}
{ svelteHTML.createElement('a', { "sveltekit:prefetch":true,"href":`https://kit.svelte.dev`,});}};
{ svelteHTML.createElement('a', { "data-sveltekit-preload-data":true,"href":`https://kit.svelte.dev`,});}};
return { props: /** @type {Record<string, never>} */ ({}), slots: {}, events: {} }}

export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(__sveltets_1_with_any_event(render()))) {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@
<svelte:element this={tag ? 'a' : 'b'} />
<svelte:element this={tag}>{tag}</svelte:element>
<svelte:element this={tag} on:click={() => tag} />
<svelte:element this={'a'} sveltekit:prefetch href="https://kit.svelte.dev" />
<svelte:element this={'a'} data-sveltekit-preload-data href="https://kit.svelte.dev" />