Skip to content

Commit 09ef8b7

Browse files
authored
breaking: enhanced-img with v-p-s6 preprocessor support (#13967)
1 parent 8692d98 commit 09ef8b7

File tree

4 files changed

+30
-32
lines changed

4 files changed

+30
-32
lines changed

.changeset/rude-jeans-yell.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/enhanced-img': minor
3+
---
4+
5+
breaking: use new filters and enhancements from `vite-plugin-svelte`. Requires `vite >= 6.3` and `vite-plugin-svelte >= 6.0`.

packages/enhanced-img/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@
5353
"vitest": "catalog:"
5454
},
5555
"peerDependencies": {
56-
"@sveltejs/vite-plugin-svelte": "^5.0.0 || ^6.0.0-next.0",
56+
"@sveltejs/vite-plugin-svelte": "^6.0.0",
5757
"svelte": "^5.0.0",
58-
"vite": ">= 5.0.0"
58+
"vite": "^6.3.0 || >=7.0.0"
5959
}
6060
}

packages/enhanced-img/src/vite-plugin.js

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
/** @import { AST } from 'svelte/compiler' */
2-
32
import { existsSync } from 'node:fs';
43
import path from 'node:path';
5-
import { loadSvelteConfig } from '@sveltejs/vite-plugin-svelte';
64
import MagicString from 'magic-string';
75
import sharp from 'sharp';
86
import { parse } from 'svelte-parse-markup';
@@ -27,37 +25,30 @@ export function image_plugin(imagetools_plugin) {
2725
/** @type {import('vite').ResolvedConfig} */
2826
let vite_config;
2927

30-
/** @type {Partial<import('@sveltejs/vite-plugin-svelte').SvelteConfig | undefined>} */
31-
let svelte_config;
32-
3328
const name = 'vite-plugin-enhanced-img-markup';
3429

35-
return {
30+
/** @type {import('vite').Plugin<void>} */
31+
const plugin = {
3632
name,
37-
enforce: 'pre',
38-
async configResolved(config) {
33+
configResolved(config) {
3934
vite_config = config;
40-
for (const plugin of config.plugins || []) {
41-
if (plugin.name === name) {
42-
break;
43-
}
44-
if (plugin.name === 'vite-plugin-svelte') {
45-
throw new Error(
46-
'@sveltejs/enhanced-img must come before the Svelte or SvelteKit plugins'
47-
);
48-
}
35+
const svelteConfigPlugin = config.plugins.find((p) => p.name === 'vite-plugin-svelte:config');
36+
if (!svelteConfigPlugin) {
37+
throw new Error(
38+
'@sveltejs/enhanced-img requires @sveltejs/vite-plugin-svelte 6 or higher to be installed'
39+
);
4940
}
50-
svelte_config = await loadSvelteConfig();
51-
if (!svelte_config) throw new Error('Could not load Svelte config file');
41+
// @ts-expect-error plugin.transform is defined below before configResolved is called
42+
plugin.transform.filter.id = svelteConfigPlugin.api.idFilter;
5243
},
53-
async transform(content, filename) {
54-
const plugin_context = this;
55-
const extensions = svelte_config?.extensions || ['.svelte'];
56-
if (extensions.some((ext) => filename.endsWith(ext))) {
57-
if (!content.includes('<enhanced:img')) {
58-
return;
59-
}
60-
44+
transform: {
45+
order: 'pre', // puts it before vite-plugin-svelte:compile
46+
filter: {
47+
code: /<enhanced:img/ // code filter must match in addition to the id filter set in configResolved hook above
48+
},
49+
50+
async handler(content, filename) {
51+
const plugin_context = this;
6152
const s = new MagicString(content);
6253
const ast = parse(content, { filename, modern: true });
6354

@@ -196,11 +187,12 @@ export function image_plugin(imagetools_plugin) {
196187

197188
return {
198189
code: s.toString(),
199-
map: s.generateMap()
190+
map: s.generateMap({ hires: 'boundary' })
200191
};
201192
}
202193
}
203194
};
195+
return plugin;
204196
}
205197

206198
/**

packages/enhanced-img/test/markup-plugin.spec.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ it('Image preprocess snapshot test', async () => {
2727
})
2828
);
2929
const transform =
30-
/** @type {(this: import('vite').Rollup.TransformPluginContext, code: string, id: string, options?: {ssr?: boolean;}) => Promise<import('rollup').TransformResult>} */ (
31-
vite_plugin.transform
30+
/** @type {(this: import('vite').Rollup.TransformPluginContext, code: string, id: string, options?: {ssr?: boolean;}) => Promise<import('vite').Rollup.TransformResult>} */ (
31+
// @ts-expect-error fails until vite is updated
32+
vite_plugin.transform.handler
3233
);
3334
const transformed = await transform.call(
3435
plugin_context,

0 commit comments

Comments
 (0)