Skip to content

Commit 450d0e5

Browse files
authored
fix: add Vite 9 forward compatibility (#312)
1 parent 63fe297 commit 450d0e5

8 files changed

Lines changed: 37 additions & 13 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@solidjs/vite-plugin': patch
3+
---
4+
5+
Add Vite 9 forward compatibility by using the per-environment consumer in plugin hooks and accepting Vite 9 as a peer.

examples/vite-8/vite.config.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ import { defineConfig } from 'vite';
22
import solidPlugin from '@solidjs/vite-plugin';
33

44
export default defineConfig({
5+
future: {
6+
removePluginHookSsrArgument: 'warn',
7+
},
58
plugins: [
69
{
710
name: 'simulate-eliminated-lazy-importer',

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@solidjs/vite-plugin",
33
"version": "3.0.0-next.30",
4-
"description": "solid-js integration plugin for vite 6/7/8",
4+
"description": "solid-js integration plugin for Vite",
55
"type": "module",
66
"files": [
77
"dist",
@@ -88,7 +88,7 @@
8888
"@solidjs/web": "^2.0.0-rc.0",
8989
"@testing-library/jest-dom": "^5.16.6 || ^5.17.0 || ^6.*",
9090
"solid-js": "^2.0.0-rc.0",
91-
"vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
91+
"vite": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
9292
},
9393
"peerDependenciesMeta": {
9494
"@testing-library/jest-dom": {

scripts/test-examples.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { promisify } from 'node:util';
33

44
const execAsync = promisify(exec);
55
const examples = ['vite-6', 'vite-7', 'vite-8'];
6+
const pluginHookSsrDeprecation =
7+
"Plugin hook `options.ssr` is replaced with `this.environment.config.consumer === 'server'`.";
68
const PORT = 4173;
79
const TEST_TIMEOUT = 5 * 60 * 1000; // 5 minutes
810
const cypressEnv = { ...process.env, ELECTRON_RUN_AS_NODE: undefined };
@@ -29,7 +31,10 @@ async function runExample(example) {
2931
try {
3032
// Install and build
3133
await execAsync('pnpm install', { cwd: examplePath });
32-
await execAsync('pnpm run build', { cwd: examplePath });
34+
const { stdout, stderr } = await execAsync('pnpm run build', { cwd: examplePath });
35+
if (`${stdout}\n${stderr}`.includes(pluginHookSsrDeprecation)) {
36+
throw new Error(`Vite's deprecated plugin hook SSR argument was used in ${example}`);
37+
}
3338

3439
// Start preview server with timeout
3540
const server = spawn('pnpm', ['run', 'preview'], { cwd: examplePath });

src/environment.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,13 @@
1313
export function isRunnableEnvironment(environment: unknown): boolean {
1414
return !!environment && typeof environment === 'object' && 'runner' in environment;
1515
}
16+
17+
export function getEnvironmentConsumer(
18+
environment: unknown,
19+
options?: { ssr?: boolean },
20+
): 'client' | 'server' {
21+
const consumer = (environment as { config?: { consumer?: string } } | undefined)?.config
22+
?.consumer;
23+
if (consumer === 'client' || consumer === 'server') return consumer;
24+
return options?.ssr ? 'server' : 'client';
25+
}

src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export type { StartOptions };
2626
import path from 'path';
2727
import type { FilterPattern, Plugin, ViteDevServer } from 'vite';
2828
import { createFilter, version } from 'vite';
29-
import { isRunnableEnvironment } from './environment.js';
29+
import { getEnvironmentConsumer, isRunnableEnvironment } from './environment.js';
3030
import { crawlFrameworkPkgs } from 'vitefu';
3131

3232
const require = createRequire(import.meta.url);
@@ -993,7 +993,7 @@ export default function solidPlugin(options: Partial<Options> = {}): Plugin[] {
993993
},
994994

995995
async transform(source, id, transformOptions) {
996-
const isSsr = transformOptions && transformOptions.ssr;
996+
const isSsr = getEnvironmentConsumer(this.environment, transformOptions) === 'server';
997997
const currentFileExtension = getExtension(id);
998998

999999
const extensionsToWatch = options.extensions || [];

src/server-functions/index.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
type Plugin,
1818
type ViteDevServer,
1919
} from 'vite';
20-
import { isRunnableEnvironment } from '../environment.js';
20+
import { getEnvironmentConsumer, isRunnableEnvironment } from '../environment.js';
2121
import { joinBase, sendWebResponse, webRequestFromNode } from '../http.js';
2222
import { compile, type CompileOptions } from './compile.js';
2323
import xxHash32 from './xxhash32.js';
@@ -487,7 +487,7 @@ export function serverFunctions(
487487
enforce: 'pre',
488488
resolveId(source, _importer, opts) {
489489
if (source === HANDLER_ID) {
490-
if (!opts?.ssr) {
490+
if (getEnvironmentConsumer(this.environment, opts) !== 'server') {
491491
this.error(
492492
`${HANDLER_ID} is server-only; import it from your server entry (SSR build).`,
493493
);
@@ -497,7 +497,7 @@ export function serverFunctions(
497497
return null;
498498
},
499499
load(id, opts) {
500-
if (id === HANDLER_ID && opts?.ssr) {
500+
if (id === HANDLER_ID && getEnvironmentConsumer(this.environment, opts) === 'server') {
501501
const externalDev =
502502
this.environment.mode === 'dev' &&
503503
(internal.externalDevServer || !isRunnableEnvironment(this.environment));
@@ -633,7 +633,7 @@ export function serverFunctions(
633633
return null;
634634
},
635635
async load(id, opts) {
636-
const mode = opts?.ssr ? 'server' : 'client';
636+
const mode = getEnvironmentConsumer(this.environment, opts);
637637
if (id === manifestId) {
638638
if (isBuild && mode === 'server') {
639639
// Merge the client build's persisted discoveries at load time,
@@ -659,7 +659,7 @@ export function serverFunctions(
659659
name: 'solid:server-functions/compiler',
660660
enforce: 'pre',
661661
async transform(code, fileId, opts) {
662-
const mode = opts?.ssr ? 'server' : 'client';
662+
const mode = getEnvironmentConsumer(this.environment, opts);
663663
const [id] = fileId.split('?');
664664
if (!filter(id)) {
665665
return null;

src/ssr/index.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ import {
5151
type PreviewServer,
5252
type ViteDevServer,
5353
} from 'vite';
54-
import { isRunnableEnvironment } from '../environment.js';
54+
import { getEnvironmentConsumer, isRunnableEnvironment } from '../environment.js';
5555
import {
5656
collectDevStyles,
5757
collectDevStyleSources,
@@ -1035,8 +1035,9 @@ export function startServe(
10351035
return null;
10361036
},
10371037
async load(id, opts) {
1038+
const consumer = getEnvironmentConsumer(this.environment, opts);
10381039
if (id === HANDLER_ID) {
1039-
if (!opts?.ssr) {
1040+
if (consumer !== 'server') {
10401041
this.error(`${HANDLER_ID} is server-only; import it from server code (SSR build).`);
10411042
}
10421043
const externalDev =
@@ -1046,7 +1047,7 @@ export function startServe(
10461047
return handlerModuleCode(externalDev);
10471048
}
10481049
if (id === RESOLVED_DEV_STYLES_ID) {
1049-
if (!opts?.ssr || this.environment.mode !== 'dev') {
1050+
if (consumer !== 'server' || this.environment.mode !== 'dev') {
10501051
this.error(`${DEV_STYLES_ID} is only available to the development server handler.`);
10511052
}
10521053
return devStylesModuleCode(this.environment, (file) => this.addWatchFile(file));

0 commit comments

Comments
 (0)