Skip to content

Commit 74e701f

Browse files
authored
refactor: modular plugins (#1145)
* wip: first steps * wip: second day, getting a hang for it * fix: don't destructure api * mostly working, but hacky raw/direct need work * ensure hotUpdate returns non-svelte modules, cleanup * fix: load raw&svelte files ourselves to prevent vite asset middleware from turning them into a default export, reorder plugins * heureka * fixes for rolldown: remove duplicate optimizer setup and use svelte5 syntax to mount test app * fix: add back .svelte optimizer extension, remove unused file * chore: remove unused files & code * chore: add changesets * chore: add test for preprocessor transform order * chore: fix rolldown-vite * fix again * docs: add section about vite-plugin-transforms for preprocessing svelte * chore: deprecate plugin.api.sveltePreprocess * refactor: remove advanced raw queries * improve inspector plugin * chore: improve regex and documentation for code normalization in hotUpdate
1 parent 424890e commit 74e701f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+1196
-1226
lines changed

.changeset/fair-pets-crash.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/vite-plugin-svelte': major
3+
---
4+
5+
Remove experimental "advanced raw queries" feature. Basic `File.svelte?raw` is still supported.

.changeset/shiny-hats-move.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@sveltejs/vite-plugin-svelte-inspector': patch
3+
'@sveltejs/vite-plugin-svelte': patch
4+
---
5+
6+
use vite environment api internally

.changeset/thirty-roses-tell.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/vite-plugin-svelte': major
3+
---
4+
5+
split preprocess and compile into separate plugins

.changeset/two-facts-sink.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/vite-plugin-svelte': patch
3+
---
4+
5+
deprecate `plugin.api.sveltePreprocess`

docs/advanced-usage.md

Lines changed: 44 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,50 @@
77
>
88
> **Proceed with caution!**
99
10+
## transform svelte files with vite plugins
11+
12+
vite-plugin-svelte uses 2 Vite plugins `vite-plugin-svelte:preprocess` and `vite-plugin-svelte:compile` to preprocess and compile input.
13+
The preprocess plugin uses `enforce: pre` but the compile plugin does not, giving you fine-grained control to add your own transforms
14+
15+
```js
16+
function mySvelteTransform() {
17+
const plugin = {
18+
name: 'vite-plugin-my-svelte-transformer',
19+
configResolved(c) {
20+
// optional, use the exact same id filter as vite-plugin-svelte itself
21+
const svelteIdFilter = c.plugins.find((p) => p.name === 'vite-plugin-svelte:config').api
22+
.idFilter;
23+
plugin.transform.filter.id = svelteIdFilter;
24+
},
25+
transform: {
26+
// if you don't use vite-plugin-svelte's filter make sure to include your own here
27+
filter: { id: /your id filter here/ },
28+
async handler(code, id) {
29+
const s = new MagicString(code);
30+
// do your transforms with s
31+
return {
32+
code: s.toString(),
33+
map: s.generateMap({ hires: 'boundary', includeContent: false })
34+
};
35+
}
36+
}
37+
};
38+
// To add your transform in the correct place use `enforce` and `transform.order`
39+
40+
// before preprocess
41+
plugin.enforce = 'pre';
42+
plugin.transform.order = 'pre';
43+
44+
// after preprocess but before compile
45+
plugin.transform.order = 'pre'; // leave plugin.enforce undefined
46+
47+
// after compile
48+
plugin.transform.order = 'post'; // leave plugin.enforce undefined
49+
50+
return plugin;
51+
}
52+
```
53+
1054
## custom queries
1155

1256
Vite supports using query parameters to request different outcomes for the same file.
@@ -19,103 +63,3 @@ The following schemes are supported by vite-plugin-svelte:
1963
//get .svelte file content as a string
2064
import content from 'File.svelte?raw';
2165
```
22-
23-
### experimental
24-
25-
In addition to the plain .svelte source content, you can use special svelte queries.
26-
27-
> These svelte subqueries are experimental, availability, syntax and output format may change
28-
29-
#### raw&svelte
30-
31-
```js
32-
//get output of svelte.preprocess code as string
33-
import preprocessed from 'File.svelte?raw&svelte&type=preprocessed';
34-
```
35-
36-
```js
37-
//get output of svelte.compile js.code as string
38-
import script from 'File.svelte?raw&svelte&type=script';
39-
```
40-
41-
```js
42-
//get output of svelte.compile css.code as string
43-
import style from 'File.svelte?raw&svelte&type=style';
44-
```
45-
46-
##### detail exports
47-
48-
raw&svelte exports code string as default export, but also offers named exports if you need details
49-
50-
```js
51-
//get output of svelte.preprocess
52-
import { code, map, dependencies } from 'File.svelte?raw&svelte&type=preprocessed';
53-
```
54-
55-
```js
56-
//get output of svelte.compile js
57-
import { code, map, dependencies } from 'File.svelte?raw&svelte&type=script';
58-
```
59-
60-
```js
61-
//get output of svelte.compile css
62-
import { code, map, dependencies } from 'File.svelte?raw&svelte&type=style';
63-
```
64-
65-
```js
66-
//get everything in one go
67-
import * as all from 'File.svelte?raw&svelte&type=all';
68-
import {
69-
source,
70-
preprocessed,
71-
dependencies,
72-
js,
73-
css,
74-
ast,
75-
normalizedFilename,
76-
ssr,
77-
lang,
78-
warnings,
79-
stats
80-
} from 'File.svelte?raw&svelte&type=all';
81-
```
82-
83-
#### direct&svelte
84-
85-
```html
86-
<!-- load and execute component script -->
87-
<script type="application/javascript" src="File.svelte?direct&svelte&type=script&lang.js" />
88-
<!-- embed component style as css -->
89-
<link rel="stylesheet" type="text/css" href="File.svelte?direct&svelte&type=style&lang.css" />
90-
```
91-
92-
#### sourcemap
93-
94-
add `&sourcemap` to `?(raw|direct)&svelte&type=(script|style|all)` queries to include sourcemaps (inline for direct)
95-
96-
#### compilerOptions
97-
98-
?raw and ?direct use default compilerOptions, even if you have different values in your svelte.config.js:
99-
100-
```js
101-
const compilerOptions = {
102-
dev: false,
103-
generate: 'client',
104-
css: 'external'
105-
};
106-
```
107-
108-
to get output with different compilerOptions, append them as json like this:
109-
110-
```js
111-
//get ssr output of svelte.compile js as {code, map, dependencies}
112-
import script from 'File.svelte?raw&svelte&type=script&compilerOptions={"generate":"server"}';
113-
```
114-
115-
only a subset of compilerOptions is supported
116-
117-
- generate
118-
- dev
119-
- css
120-
- customElement
121-
- immutable

docs/faq.md

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -82,19 +82,7 @@ However, `cssHash` is respected in production builds as HMR is a dev-only featur
8282

8383
### How do I add a Svelte preprocessor from a Vite plugin?
8484

85-
If you are building a Vite plugin that transforms CSS or JS, you can add a `api.sveltePreprocess: PreprocessorGroup` to your Vite plugin definition and it will be added to the list of Svelte preprocessors used at runtime.
86-
87-
```js
88-
const vitePluginCoolCss = {
89-
name: 'vite-plugin-coolcss',
90-
api: {
91-
sveltePreprocess: {
92-
/* your PreprocessorGroup here */
93-
}
94-
}
95-
/*... your cool css plugin implementation here .. */
96-
};
97-
```
85+
You don't have to anymore. See [advanced usage](advanced-usage.md) for examples how to put transform hooks before or after Svelte preprocess or compile
9886

9987
### What is going on with Vite and `Pre-bundling dependencies:`?
10088

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
11
import App from './App.svelte';
2-
3-
if (App.toString().startsWith('class ')) {
4-
new App({ target: document.body });
5-
} else {
6-
import('svelte').then(({ mount }) => mount(App, { target: document.body }));
7-
}
2+
import { mount } from 'svelte';
3+
mount(App, { target: document.body });
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
console.log('default svelte config loaded');
2+
export default {};

packages/e2e-tests/import-queries/__tests__/__snapshots__/svelte-5/preprocessed.txt

Lines changed: 0 additions & 14 deletions
This file was deleted.

packages/e2e-tests/import-queries/__tests__/__snapshots__/svelte-5/ssr-preprocessed.txt

Lines changed: 0 additions & 14 deletions
This file was deleted.

0 commit comments

Comments
 (0)