Skip to content

Commit 0d1876d

Browse files
Use JSX preserve mode to support fast refresh
1 parent c2878d5 commit 0d1876d

12 files changed

Lines changed: 1487 additions & 31 deletions

‎package-lock.json‎

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

‎package.json‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,10 @@
4141
"@rollup/plugin-commonjs": "^29.0.0",
4242
"@rollup/plugin-node-resolve": "^16.0.3",
4343
"@rollup/plugin-terser": "^0.4.4",
44+
"@vitejs/plugin-react": "^5.0.2",
4445
"compare-versions": "^6.1.0",
4546
"rescript": "^12.0.0",
46-
"rollup": "^4.53.3"
47+
"rollup": "^4.53.3",
48+
"vite": "^7.1.0"
4749
}
4850
}

‎src/ExistingJsProject.res‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ let getModuleSystemOptions = () => [
6161
]
6262

6363
let addToExistingProject = async (~projectName) => {
64-
let versions = await RescriptVersions.promptVersions()
64+
let versions = await RescriptVersions.promptVersions(
65+
~versionRange=RescriptVersions.rescriptVersionRange,
66+
)
6567

6668
let sourceDir = await P.text({
6769
message: "Where will you put your ReScript source files?",

‎src/NewProject.res‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,11 @@ let createNewProject = async () => {
146146
})->P.resultOrRaise
147147
}
148148

149+
let versionRange = Templates.getRescriptVersionRange(templateName)
150+
149151
let versions = useDefaultVersions
150-
? await RescriptVersions.getDefaultVersions()
151-
: await RescriptVersions.promptVersions()
152+
? await RescriptVersions.getDefaultVersions(~versionRange)
153+
: await RescriptVersions.promptVersions(~versionRange)
152154

153155
await createProject(~templateName, ~projectName, ~versions)
154156
}

‎src/RescriptVersions.res‎

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ open Node
33
module P = ClackPrompts
44

55
let rescriptVersionRange = `11.1.4 || 12.x.x`
6+
let jsxPreserveVersionRange = `12.x.x`
67
let finalRescriptCoreVersion = "1.6.1"
78
let includesRewatchVersionRange = ">=12.0.0-alpha.15"
89
let includesStdlibVersionRange = ">=12.0.0-beta.1"
@@ -18,15 +19,12 @@ let makeVersions = rescriptVersion => {
1819
{rescriptVersion, rescriptCoreVersion}
1920
}
2021

21-
let getDefaultVersions = async () => {
22+
let getDefaultVersions = async (~versionRange) => {
2223
let s = P.spinner()
2324

2425
s->P.Spinner.start(spinnerMessage)
2526

26-
let rescriptVersionsResult = await NpmRegistry.getPackageVersions(
27-
"rescript",
28-
rescriptVersionRange,
29-
)
27+
let rescriptVersionsResult = await NpmRegistry.getPackageVersions("rescript", versionRange)
3028

3129
switch rescriptVersionsResult {
3230
| Ok(_) => s->P.Spinner.stop("Versions loaded.")
@@ -47,15 +45,12 @@ let getDefaultVersions = async () => {
4745
makeVersions(rescriptVersion)
4846
}
4947

50-
let promptVersions = async () => {
48+
let promptVersions = async (~versionRange) => {
5149
let s = P.spinner()
5250

5351
s->P.Spinner.start(spinnerMessage)
5452

55-
let rescriptVersionsResult = await NpmRegistry.getPackageVersions(
56-
"rescript",
57-
rescriptVersionRange,
58-
)
53+
let rescriptVersionsResult = await NpmRegistry.getPackageVersions("rescript", versionRange)
5954

6055
switch rescriptVersionsResult {
6156
| Ok(_) => s->P.Spinner.stop("Versions loaded.")

‎src/RescriptVersions.resi‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
type versions = {rescriptVersion: string, rescriptCoreVersion: option<string>}
22

3-
let getDefaultVersions: unit => promise<versions>
3+
let rescriptVersionRange: string
44

5-
let promptVersions: unit => promise<versions>
5+
let jsxPreserveVersionRange: string
6+
7+
let getDefaultVersions: (~versionRange: string) => promise<versions>
8+
9+
let promptVersions: (~versionRange: string) => promise<versions>
610

711
let installVersions: versions => promise<unit>
812

‎src/Templates.res‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ let getTemplateName = templateName => {
1919
->Option.map(_ => `${templateNamePrefix}${templateName}`)
2020
}
2121

22+
let getRescriptVersionRange = templateName =>
23+
switch templateName {
24+
| templateName if templateName === viteTemplateName => RescriptVersions.jsxPreserveVersionRange
25+
| _ => RescriptVersions.rescriptVersionRange
26+
}
27+
2228
let templates = [
2329
{
2430
name: viteTemplateName,

‎src/bindings/Node.res‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
module Fs = {
22
@module("node:fs") external existsSync: string => bool = "existsSync"
33

4+
@module("node:fs")
5+
external readFileSync: (string, @as(json`"utf8"`) _) => string = "readFileSync"
6+
47
module Promises = {
58
@module("node:fs") @scope("promises")
69
external readFile: (string, @as(json`"utf8"`) _) => promise<string> = "readFile"
@@ -77,6 +80,9 @@ module Test = {
7780

7881
@module("node:test")
7982
external test: (string, unit => unit) => unit = "test"
83+
84+
@module("node:test")
85+
external testAsync: (string, unit => promise<unit>) => unit = "test"
8086
}
8187

8288
module Url = {

‎templates/rescript-template-vite/README.md‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44

55
This is a Vite-based template with following setup:
66

7-
- [ReScript](https://rescript-lang.org) 11.0 with @rescript/react, [Core](https://github.com/rescript-association/rescript-core) and JSX v4
7+
- [ReScript](https://rescript-lang.org) 12 with [@rescript/react](https://github.com/rescript-lang/rescript-react) and JSX v4 preserve mode
88
- ES6 modules (ReScript code compiled to `.res.mjs` files)
9-
- Vite 6 with React Plugin (Fast Refresh)
10-
- Tailwind 4
9+
- [React](https://react.dev) 19 with React DOM
10+
- [Vite](https://vite.dev) 7 with [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react) 5
11+
- [Tailwind CSS](https://tailwindcss.com) 4 with [@tailwindcss/vite](https://tailwindcss.com/docs/installation/using-vite)
1112

1213
## Development
1314

@@ -27,6 +28,8 @@ npm run dev
2728

2829
### Fast Refresh & ReScript
2930

31+
This template enables ReScript JSX preserve mode so Vite's React plugin can process the generated `.res.mjs` files and keep React Fast Refresh working.
32+
3033
Make sure to create interface files (`.resi`) for each `*.res` file.
3134

3235
Fast Refresh requires you to **only export React components**, and it's easy to unintenionally export other values that will disable Fast Refresh (you will see a message in the browser console whenever this happens).

‎templates/rescript-template-vite/rescript.json‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@
1313
}
1414
],
1515
"suffix": ".res.mjs",
16-
"bs-dependencies": ["@rescript/core", "@rescript/react"],
17-
"bsc-flags": ["-open RescriptCore"],
16+
"dependencies": ["@rescript/core", "@rescript/react"],
17+
"compiler-flags": ["-open RescriptCore"],
1818
"jsx": {
19-
"version": 4
19+
"version": 4,
20+
"preserve": true
2021
}
2122
}

0 commit comments

Comments
 (0)