List of some useful preprocessors for svelte
you can install this package as devDependency of your svelte based project.
npm install -D @ubeac/svelte-preprocessors
then edit your svelte.config.js file:
import {ifProcessor, previewProcessor} from '@ubeac/svelte-preprocessors'
export default {
preprocessors: [
ifProcessor(), // to enable if preprocessor
previewProcessor() // to enable Preview preprocessor
],
...other configs
kit: {
...sveltekit configs
}
}
if processor transforms if={...}
props to {#if ...}
in svelte templates for all Components and DOM Elements.
after installation and enabling if Processor you should be able to use if prop in your .sevlte files.
<Button if={2 + 2 === 4}>
My Button
</Button>
<p if={!!user}>
name: {user.name}
email: {user.email}
</p>
after build process above code will be changed to
{#if 2 + 2 === 4}
<Button>
My Button
</Button>
{/if}
{#if !!user}
<p>
name: {user.name}
email: {user.email}
</p>
{/if}
<div class="actions">
<button if={user.hasAccess('add-item')}>
Add
</button>
<button if={user.hasAccess('edit-item')}>
Edit
</button>
<button if={user.isAdmin()}>
Remove
</button>
</div>
after if processor:
<div class="actions">
{#if user.hasAccess('add-item')}
<button>
Add
</button>
{/if}
{#if user.hasAccess('edit-item')}
<button>
Edit
</button>
{/if}
{#if user.isAdmin()}
<button>
Remove
</button>
{/if}
</div>
you can add if as an attribute for all HTML Elements by adding below code in *.d.ts
file in your project.
declare namespace svelte.JSX {
interface HTMLAttributes<T> {
if?: boolean
}
}
also you need to ignore your editor's Intellisense errors for if={...}
prop in Components. everything works in dev-mode and after build. only editor doesn't know that you use ifProcessor.
Alternatively, you can add typing for if prop to your component.
<script lang="ts">
type $$Props = {
color: string;
size: string;
// other props
if: boolean
}
export let color: string = 'primary'
export let size: string = 'md'
// other props
</script>
<button ...>
<slot/>
</button>
one problem is that you cannot use ifProcessor with slot
prop in same element:
<Card>
<div if={hasHeader} slot="header">
Header
</div>
Body
</Card>
<Card>
{#if hasHeader}
<div slot="header"> <!-- cannot have slot="**" inside if conditions -->
Header
</div>
{/if}
Body
</Card>
using this processor you can extract source code of svelte components as string.
to get started you should have a Preview component which have some props:
Preview.svelte
<script lang="ts">
export let markup: string | undefined = undefined;
export let script: string | undefined = undefined;
export let style: string | undefined = undefined;
export let isTypescript: boolean | undefined = undefined;
$: finalScript = isTypescript ? script.replace('<script>', '<script lang="ts">')
</script>
{finalScript}
<br/>
{markup}
<br />
{style}
here is an example of Preview.svelte component which uses this preprocessor.
this processor is useful when you want to show source code of examples alongside live demo. Example