Description
Is your feature request related to a problem? Please describe.
i would like to use babel/typescript syntax inside of Svelte markup template code.
For example, let's say i have the babel optional chaining enabled:
// rollup.config.js
svelte({
// ...
preprocess: {
script: ({ content }) => {
return require("@babel/core").transform(content, {
plugins: ["@babel/plugin-proposal-optional-chaining"],
});
},
},
}),
This lets me use new JS syntax in my script tag:
<script>
let foo = {
bar: {
baz: true
}
}
let sub = foo?.ban?.baz
</script>
<main>
<h1>Hello {sub}!</h1>
</main>
this is great! however we try to move it down and Svelte complains:
<script>
let foo = {
bar: {
baz: true
}
}
</script>
<main>
<h1>Hello {foo?.ban?.baz}!</h1>
<!-- uh oh -->
</main>
Error:
[!] (plugin svelte) ParseError: Unexpected token
src/App.svelte
6:
7: <main>
8: <h1>Hello {foo?.ban?.baz}!</h1>
^
9: </main>
ParseError: Unexpected token
at error (/Users/swyx/Desktop/Work/testbed/trybabelrecipe/svelte-app/node_modules/svelte/src/compiler/utils/error.ts:25:16)
at Parser$1.error (/Users/swyx/Desktop/Work/testbed/trybabelrecipe/svelte-app/node_modules/svelte/src/compiler/parse/index.ts:96:3)
This is somewhat of a break of the mental model, since Svelte should accept the same kinds of JS inside templates as it does inside script tags. You can imagine other good usecases for this, e.g. {#if data?.foo?.bar}
in order to fix this, i would have to hook into a markup preprocessor, and then parse the template contents to sift out the js expressions, and then transpile it, and then stitch the markup back together. seems like repeat work to what Svelte already does anyway.
Describe the solution you'd like
Svelte should reuse the script
preprocessor for in-template js expressions, as well as for <script>
tags.
Describe alternatives you've considered
no change
How important is this feature to you?
it's a nice to have. i dont have any proof, but i suspect this might help the TypeScript effort too in case any assertions are needed (this is rare, though; more likely the "new syntax" usecase is more important than the "need to specify types in expressions" usecase)