From 22fdc14cb8c143b54798624927d50705a2dc78df Mon Sep 17 00:00:00 2001 From: nojaf Date: Thu, 28 Nov 2024 15:19:01 +0100 Subject: [PATCH 1/6] Detect v12 and make rescript core optional --- src/NewProject.res | 2 +- src/RescriptVersions.res | 21 ++++++++++++++++----- src/RescriptVersions.resi | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/NewProject.res b/src/NewProject.res index f76211b..3ded265 100644 --- a/src/NewProject.res +++ b/src/NewProject.res @@ -84,7 +84,7 @@ let createNewProject = async () => { await createProject( ~templateName="rescript-template-basic", ~projectName="test", - ~versions={rescriptVersion: "11.1.1", rescriptCoreVersion: "1.5.0"}, + ~versions={rescriptVersion: "11.1.1", rescriptCoreVersion: Some("1.5.0")}, ) } else { let projectName = await P.text({ diff --git a/src/RescriptVersions.res b/src/RescriptVersions.res index 225c1b2..90136d0 100644 --- a/src/RescriptVersions.res +++ b/src/RescriptVersions.res @@ -1,9 +1,10 @@ module P = ClackPrompts -let rescriptVersionRange = "11.x.x" +let rescript12VersionRange = "12.0.0-alpha.x" +let rescriptVersionRange = `11.x.x || ${rescript12VersionRange}` let rescriptCoreVersionRange = ">=1.0.0" -type versions = {rescriptVersion: string, rescriptCoreVersion: string} +type versions = {rescriptVersion: string, rescriptCoreVersion: option} let getCompatibleRescriptCoreVersions = (~rescriptVersion, ~rescriptCoreVersions) => if CompareVersions.compareVersions(rescriptVersion, "11.1.0")->Ordering.isLess { @@ -51,13 +52,17 @@ let promptVersions = async () => { ~rescriptCoreVersions, ) + let isRescript12 = CompareVersions.satisfies(rescriptVersion, rescript12VersionRange) + let rescriptCoreVersion = switch rescriptCoreVersions { - | [version] => version + | _ if isRescript12 => None + | [version] => Some(version) | _ => - await P.select({ + let version = await P.select({ message: "ReScript Core version?", options: rescriptCoreVersions->Array.map(v => {P.value: v}), })->P.resultOrRaise + Some(version) } {rescriptVersion, rescriptCoreVersion} @@ -65,7 +70,13 @@ let promptVersions = async () => { let installVersions = async ({rescriptVersion, rescriptCoreVersion}) => { let packageManager = PackageManagers.getActivePackageManager() - let packages = [`rescript@${rescriptVersion}`, `@rescript/core@${rescriptCoreVersion}`] + let packages = switch rescriptCoreVersion { + | Some(rescriptCoreVersion) => [ + `rescript@${rescriptVersion}`, + `@rescript/core@${rescriptCoreVersion}`, + ] + | None => [`rescript@${rescriptVersion}`] + } // #58: Windows: packageManager may be something like // "C:\Program Files\nodejs\node_modules\npm\bin\npm-cli.js". diff --git a/src/RescriptVersions.resi b/src/RescriptVersions.resi index 42d894d..2e53c4f 100644 --- a/src/RescriptVersions.resi +++ b/src/RescriptVersions.resi @@ -1,4 +1,4 @@ -type versions = {rescriptVersion: string, rescriptCoreVersion: string} +type versions = {rescriptVersion: string, rescriptCoreVersion: option} let promptVersions: unit => promise From 22dea390292834a345b670f48b8325714122b118 Mon Sep 17 00:00:00 2001 From: nojaf Date: Fri, 29 Nov 2024 08:12:53 +0100 Subject: [PATCH 2/6] Remove rescript packages from templates --- templates/rescript-template-basic/package.json | 5 +---- templates/rescript-template-nextjs/package.json | 4 +--- templates/rescript-template-vite/package.json | 4 +--- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/templates/rescript-template-basic/package.json b/templates/rescript-template-basic/package.json index fc86171..d494346 100644 --- a/templates/rescript-template-basic/package.json +++ b/templates/rescript-template-basic/package.json @@ -11,8 +11,5 @@ ], "author": "", "license": "MIT", - "dependencies": { - "@rescript/core": "^1.3.0", - "rescript": "^11.1.0" - } + "dependencies": {} } diff --git a/templates/rescript-template-nextjs/package.json b/templates/rescript-template-nextjs/package.json index 781ad3d..e1fb9e2 100644 --- a/templates/rescript-template-nextjs/package.json +++ b/templates/rescript-template-nextjs/package.json @@ -4,12 +4,10 @@ "author": "Patrick Ecker ", "license": "Apache-2.0", "dependencies": { - "@rescript/core": "^1.3.0", "@rescript/react": "^0.12.1", "next": "^14.0.4", "react": "^18.2.0", - "react-dom": "^18.2.0", - "rescript": "^11.1.0" + "react-dom": "^18.2.0" }, "repository": "https://github.com/rescript-lang/create-rescript-app", "scripts": { diff --git a/templates/rescript-template-vite/package.json b/templates/rescript-template-vite/package.json index d5b9ea2..5c6dd86 100644 --- a/templates/rescript-template-vite/package.json +++ b/templates/rescript-template-vite/package.json @@ -12,11 +12,9 @@ "preview": "vite preview" }, "dependencies": { - "@rescript/core": "^1.3.0", "@rescript/react": "^0.12.1", "react": "^18.2.0", - "react-dom": "^18.2.0", - "rescript": "^11.1.0" + "react-dom": "^18.2.0" }, "devDependencies": { "@vitejs/plugin-react": "^4.2.1", From 73dad936022a8516891d7892c400e30e67aa5d18 Mon Sep 17 00:00:00 2001 From: nojaf Date: Fri, 29 Nov 2024 08:28:05 +0100 Subject: [PATCH 3/6] Update rescript.json --- src/ExistingJsProject.res | 8 ++++++-- src/NewProject.res | 4 ++++ src/RescriptJsonUtils.res | 29 +++++++++++++++++++++++++++++ src/RescriptVersions.res | 2 +- 4 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 src/RescriptJsonUtils.res diff --git a/src/ExistingJsProject.res b/src/ExistingJsProject.res index fb94207..f65e764 100644 --- a/src/ExistingJsProject.res +++ b/src/ExistingJsProject.res @@ -20,7 +20,7 @@ let updatePackageJson = async () => } ) -let updateRescriptJson = async (~projectName, ~sourceDir, ~moduleSystem, ~suffix) => +let updateRescriptJson = async (~projectName, ~sourceDir, ~moduleSystem, ~suffix, ~versions) => await JsonUtils.updateJsonFile("rescript.json", json => switch json { | Object(config) => @@ -34,6 +34,10 @@ let updateRescriptJson = async (~projectName, ~sourceDir, ~moduleSystem, ~suffix | Some(Object(sources)) => sources->Dict.set("module", String(moduleSystem)) | _ => () } + + if Option.isNone(versions.RescriptVersions.rescriptCoreVersion) { + RescriptJsonUtils.removeRescriptCore(config) + } | _ => () } ) @@ -98,7 +102,7 @@ let addToExistingProject = async (~projectName) => { } await updatePackageJson() - await updateRescriptJson(~projectName, ~sourceDir, ~moduleSystem, ~suffix) + await updateRescriptJson(~projectName, ~sourceDir, ~moduleSystem, ~suffix, ~versions) if !Fs.existsSync(sourceDirPath) { await Fs.Promises.mkdir(sourceDirPath) diff --git a/src/NewProject.res b/src/NewProject.res index 3ded265..90a1611 100644 --- a/src/NewProject.res +++ b/src/NewProject.res @@ -37,6 +37,10 @@ let updateRescriptJson = async (~projectName, ~versions) => config->Dict.set("suffix", String(suffix)) | _ => () } + + if Option.isNone(versions.rescriptCoreVersion) { + RescriptJsonUtils.removeRescriptCore(config) + } | _ => () } ) diff --git a/src/RescriptJsonUtils.res b/src/RescriptJsonUtils.res new file mode 100644 index 0000000..d8190b2 --- /dev/null +++ b/src/RescriptJsonUtils.res @@ -0,0 +1,29 @@ +let removeRescriptCore = (config: Dict.t) => { + // Remove @rescript/core from bs-dependencies if the version is not set. + switch config->Dict.get("bs-dependencies") { + | Some(Array(dependencies)) => { + let newDependencies = dependencies->Array.filter(dependency => + switch dependency { + | String("@rescript/core") => false + | _ => true + } + ) + config->Dict.set("bs-dependencies", Array(newDependencies)) + } + | _ => () + } + + // Remove "-open RescriptCore" from bsc-flags if the version is not set. + switch config->Dict.get("bsc-flags") { + | Some(Array(flags)) => { + let newFlags = flags->Array.filter(flag => + switch flag { + | String("-open RescriptCore") => false + | _ => true + } + ) + config->Dict.set("bsc-flags", Array(newFlags)) + } + | _ => () + } +} diff --git a/src/RescriptVersions.res b/src/RescriptVersions.res index 90136d0..3db1ae4 100644 --- a/src/RescriptVersions.res +++ b/src/RescriptVersions.res @@ -1,6 +1,6 @@ module P = ClackPrompts -let rescript12VersionRange = "12.0.0-alpha.x" +let rescript12VersionRange = ">=12.0.0-alpha.5" let rescriptVersionRange = `11.x.x || ${rescript12VersionRange}` let rescriptCoreVersionRange = ">=1.0.0" From f48b87cf66ef0b6e1750142a7fe2602843519dc0 Mon Sep 17 00:00:00 2001 From: nojaf Date: Fri, 29 Nov 2024 18:02:26 +0100 Subject: [PATCH 4/6] Select v11 by default --- src/RescriptVersions.res | 16 ++++++++++++---- src/bindings/ClackPrompts.res | 1 + 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/RescriptVersions.res b/src/RescriptVersions.res index 3db1ae4..e61249b 100644 --- a/src/RescriptVersions.res +++ b/src/RescriptVersions.res @@ -35,10 +35,18 @@ let promptVersions = async () => { let rescriptVersion = switch rescriptVersionsResult { | Ok([version]) => version | Ok(rescriptVersions) => - await P.select({ - message: "ReScript version?", - options: rescriptVersions->Array.map(v => {P.value: v}), - })->P.resultOrRaise + let options = rescriptVersions->Array.map(v => {P.value: v}) + + let initialValue = + options->Array.find(o => o.value->String.startsWith("11.")) + + let selectOptions = + switch initialValue { + | None => { ClackPrompts.message: "ReScript version?", options} + | Some(initialValue) => {message: "ReScript version?", options, initialValue} + } + + await P.select(selectOptions)->P.resultOrRaise | Error(error) => error->NpmRegistry.getFetchErrorMessage->Error.make->Error.raise } diff --git a/src/bindings/ClackPrompts.res b/src/bindings/ClackPrompts.res index a149af3..10793e7 100644 --- a/src/bindings/ClackPrompts.res +++ b/src/bindings/ClackPrompts.res @@ -38,6 +38,7 @@ type selectOption = { type selectOptions = { message: string, options: array, + initialValue?: selectOption, } @module("@clack/prompts") From ee29ebc0a0853c1a060acdc2e2ed2ae9195b29af Mon Sep 17 00:00:00 2001 From: nojaf Date: Fri, 29 Nov 2024 18:12:50 +0100 Subject: [PATCH 5/6] Fix prompt binding --- src/RescriptVersions.res | 2 +- src/bindings/ClackPrompts.res | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/RescriptVersions.res b/src/RescriptVersions.res index e61249b..93c9be0 100644 --- a/src/RescriptVersions.res +++ b/src/RescriptVersions.res @@ -38,7 +38,7 @@ let promptVersions = async () => { let options = rescriptVersions->Array.map(v => {P.value: v}) let initialValue = - options->Array.find(o => o.value->String.startsWith("11.")) + options->Array.find(o => o.value->String.startsWith("11."))->Option.map(o => o.value) let selectOptions = switch initialValue { diff --git a/src/bindings/ClackPrompts.res b/src/bindings/ClackPrompts.res index 10793e7..da5a8c8 100644 --- a/src/bindings/ClackPrompts.res +++ b/src/bindings/ClackPrompts.res @@ -38,7 +38,7 @@ type selectOption = { type selectOptions = { message: string, options: array, - initialValue?: selectOption, + initialValue?: string, } @module("@clack/prompts") From a2c780bbd4c279a76f4a1de266e1815a03624714 Mon Sep 17 00:00:00 2001 From: nojaf Date: Sat, 30 Nov 2024 09:50:33 +0100 Subject: [PATCH 6/6] Remove switch --- src/RescriptVersions.res | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/RescriptVersions.res b/src/RescriptVersions.res index 93c9be0..3a6afd0 100644 --- a/src/RescriptVersions.res +++ b/src/RescriptVersions.res @@ -40,11 +40,7 @@ let promptVersions = async () => { let initialValue = options->Array.find(o => o.value->String.startsWith("11."))->Option.map(o => o.value) - let selectOptions = - switch initialValue { - | None => { ClackPrompts.message: "ReScript version?", options} - | Some(initialValue) => {message: "ReScript version?", options, initialValue} - } + let selectOptions = {ClackPrompts.message: "ReScript version?", options, ?initialValue} await P.select(selectOptions)->P.resultOrRaise | Error(error) => error->NpmRegistry.getFetchErrorMessage->Error.make->Error.raise