Skip to content

Commit 8626255

Browse files
WIP
1 parent 5f4b1f5 commit 8626255

6 files changed

Lines changed: 152 additions & 18 deletions

File tree

deno.lock

Lines changed: 63 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/plugin-vite/demo/islands/tests/Mime.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
import * as mime from "mime-db";
1+
import mime from "mime-db";
22
import { useEffect, useState } from "preact/hooks";
33

44
export function MimeIsland() {
5-
// deno-lint-ignore no-console
6-
console.log(mime);
7-
85
const [ready, setReady] = useState(false);
96
useEffect(() => {
7+
// deno-lint-ignore no-console
8+
console.log(mime.default);
109
setReady(true);
1110
}, []);
1211

packages/plugin-vite/deno.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
},
2121
"imports": {
2222
"@babel/core": "npm:@babel/core@^7.28.0",
23+
"@babel/preset-react": "npm:@babel/preset-react@^7.27.1",
2324
"@deno/loader": "jsr:@deno/loader@^0.3.2",
2425
"@prefresh/vite": "npm:@prefresh/vite@^2.4.8",
2526
"@types/babel__core": "npm:@types/babel__core@^7.20.5",

packages/plugin-vite/src/mod.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,6 @@ export function fresh(config?: FreshViteConfig): Plugin[] {
4242
optimizeDeps: {
4343
include: [
4444
"preact",
45-
"preact/compat",
46-
"preact/debug",
47-
"preact/devtools",
48-
"preact/hooks",
49-
"preact/jsx-runtime",
50-
"preact/jsx-dev-runtime",
5145
"@preact/signals",
5246
"@preact/signals-core",
5347
],

packages/plugin-vite/src/plugins/deno.ts

Lines changed: 66 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,38 @@ import {
88
import * as path from "@std/path";
99
import * as babel from "@babel/core";
1010
import { npmWorkaround } from "./patches/npm_workaround.ts";
11+
import babelReact from "@babel/preset-react";
1112

1213
interface DenoState {
1314
type: RequestedModuleType;
1415
}
1516

1617
export function deno(): Plugin {
17-
let loader: Loader;
18+
let ssrLoader: Loader;
19+
let browserLoader: Loader;
20+
21+
let isDev = false;
22+
23+
let optimizeDeps: string[] | undefined;
1824

1925
return {
2026
name: "deno",
21-
async configResolved() {
27+
config(_, env) {
28+
isDev = env.command === "serve";
29+
},
30+
async configResolved(cfg) {
31+
optimizeDeps = cfg.optimizeDeps.include;
2232
// TODO: Pass conditions
23-
loader = await new Workspace({}).createLoader();
33+
ssrLoader = await new Workspace({}).createLoader();
34+
browserLoader = await new Workspace({ preserveJsx: true })
35+
.createLoader();
2436
},
2537
applyToEnvironment() {
2638
return true;
2739
},
2840
async resolveId(id, importer, options) {
41+
const loader = options?.ssr ? ssrLoader : browserLoader;
42+
2943
// Workaround until upstream PR is merged and released,
3044
// see: https://github.com/vitejs/vite/pull/20558
3145
if (id.startsWith("deno-npm:")) {
@@ -36,6 +50,18 @@ export function deno(): Plugin {
3650
? parseDenoSpecifier(importer).specifier
3751
: importer;
3852

53+
if (optimizeDeps) {
54+
const match = id.match(/^npm:(@[^/]+\/[^/@]+|[^/@]+)/);
55+
if (match !== null) {
56+
if (optimizeDeps.includes(match[1])) {
57+
return await this.resolve(match[1], importer, options);
58+
}
59+
}
60+
}
61+
if (id.includes("@preact/signals")) {
62+
return this.resolve(`@preact/signals`, importer, options);
63+
}
64+
3965
try {
4066
// Ensure we're passing a valid importer that Deno understands
4167
const denoImporter = importer && !importer.startsWith("\0")
@@ -78,7 +104,9 @@ export function deno(): Plugin {
78104
// ignore
79105
}
80106
},
81-
async load(id) {
107+
async load(id, options) {
108+
const loader = options?.ssr ? ssrLoader : browserLoader;
109+
82110
if (isDenoSpecifier(id)) {
83111
const { type, specifier } = parseDenoSpecifier(id);
84112

@@ -110,8 +138,36 @@ export function deno(): Plugin {
110138
return null;
111139
}
112140

141+
const code = new TextDecoder().decode(result.code);
142+
143+
if (!options?.ssr) {
144+
if (url.pathname.endsWith(".jsx") || url.pathname.endsWith(".tsx")) {
145+
const result = babel.transform(code, {
146+
sourceMaps: "inline",
147+
filename: id,
148+
presets: [
149+
[
150+
babelReact,
151+
{
152+
runtime: "automatic",
153+
importSource: "preact",
154+
development: isDev,
155+
},
156+
],
157+
],
158+
});
159+
160+
if (result !== null && result.code) {
161+
return {
162+
code: result.code,
163+
map: result.map,
164+
};
165+
}
166+
}
167+
}
168+
113169
return {
114-
code: new TextDecoder().decode(result.code),
170+
code,
115171
};
116172
},
117173
async transform(_, id, options) {
@@ -130,12 +186,15 @@ export function deno(): Plugin {
130186
actualId = path.toFileUrl(actualId).href;
131187
}
132188

133-
const resolved = await loader.resolve(
189+
const resolved = await ssrLoader.resolve(
134190
actualId,
135191
undefined,
136192
ResolutionMode.Import,
137193
);
138-
const result = await loader.load(resolved, RequestedModuleType.Default);
194+
const result = await ssrLoader.load(
195+
resolved,
196+
RequestedModuleType.Default,
197+
);
139198
if (result.kind === "external") {
140199
return;
141200
}

packages/plugin-vite/src/plugins/patches.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,36 @@ import * as babel from "@babel/core";
33
import { npmWorkaround } from "./patches/npm_workaround.ts";
44
import { cjsPlugin } from "./patches/commonjs.ts";
55
import { jsxComments } from "./patches/jsx_comment.ts";
6+
import babelReact from "@babel/preset-react";
67

78
export function patches(): Plugin {
9+
let isDev = false;
10+
811
return {
912
name: "fresh:patches",
13+
config(_, env) {
14+
isDev = env.command === "serve";
15+
},
1016
applyToEnvironment() {
1117
return true;
1218
},
13-
transform(code, id) {
19+
transform(code, id, options) {
20+
if (code.includes("__commonJS")) return;
21+
22+
const presets = [];
23+
if (!options?.ssr) {
24+
presets.push([babelReact, {
25+
runtime: "automatic",
26+
importSource: "preact",
27+
development: isDev,
28+
}]);
29+
}
30+
1431
const res = babel.transformSync(code, {
1532
filename: id,
1633
babelrc: false,
1734
plugins: [npmWorkaround, cjsPlugin, jsxComments],
35+
presets,
1836
});
1937

2038
if (res?.code) {

0 commit comments

Comments
 (0)