@@ -3,6 +3,7 @@ open Node
33module P = ClackPrompts
44
55let packageNameRegExp = /^ [a - z0 - 9 - ]+ $/
6+ let resxTemplatePlaceholderName = "resx-template"
67
78let validateProjectName = projectName =>
89 if projectName -> String .trim -> String .length === 0 {
@@ -109,6 +110,72 @@ let promptTemplateName = async () => {
109110 }
110111}
111112
113+ let rec replaceFileContents = async (remainingFilePaths , ~replaceValue , ~withValue ) =>
114+ switch remainingFilePaths {
115+ | list {} => ()
116+ | list {filePath , ... remainingFilePaths } =>
117+ let fileContents = await Fs .Promises .readFile (filePath )
118+ let updatedFileContents = fileContents -> String .replaceAll (replaceValue , withValue )
119+
120+ await Fs .Promises .writeFile (filePath , updatedFileContents )
121+ await replaceFileContents (remainingFilePaths , ~replaceValue , ~withValue )
122+ }
123+
124+ let synchronizeResxTemplateFiles = async (~projectName ) =>
125+ await replaceFileContents (
126+ list {
127+ "package.json" ,
128+ "rescript.json" ,
129+ "README.md" ,
130+ "Dockerfile" ,
131+ "bun.lock" ,
132+ Path .join (["scripts" , "build-sfe.mjs" ]),
133+ Path .join (["src" , "data" , "TemplateContent.res" ]),
134+ },
135+ ~replaceValue = resxTemplatePlaceholderName ,
136+ ~withValue = projectName ,
137+ )
138+
139+ let getPackageManagerName = (packageManager : PackageManagers .packageManager ) =>
140+ switch packageManager {
141+ | Npm => "npm"
142+ | Yarn1 | YarnBerry => "yarn"
143+ | Pnpm => "pnpm"
144+ | Bun => "bun"
145+ }
146+
147+ let showGetStartedNote = async (~templateName , ~projectName ) => {
148+ if templateName === Templates .resXTemplateName {
149+ let packageManagerInfo = await PackageManagers .getPackageManagerInfo ()
150+
151+ switch packageManagerInfo .packageManager {
152+ | Bun =>
153+ P .note (
154+ ~title = "Get started" ,
155+ ~message = ` cd ${projectName}
156+
157+ bun run dev` ,
158+ )
159+ | packageManager =>
160+ P .note (
161+ ~title = "Bun recommended" ,
162+ ~message = ` This ResX template is Bun-centric. You created it with ${packageManager-> getPackageManagerName}, but the generated project should use Bun.
163+
164+ cd ${projectName}
165+ bun install
166+ bun run dev` ,
167+ )
168+ }
169+ } else {
170+ P .note (
171+ ~title = "Get started" ,
172+ ~message = ` cd ${projectName}
173+
174+ # See the project's README.md for more information.` ,
175+ )
176+ }
177+ }
178+
112179let createProject = async (~templateName , ~projectName , ~versions ) => {
113180 let templatePath = CraPaths .getTemplatePath (~templateName )
114181 let projectPath = Path .join2 (Process .cwd (), projectName )
@@ -127,19 +194,18 @@ let createProject = async (~templateName, ~projectName, ~versions) => {
127194 await updateRescriptJson (~projectName , ~versions )
128195 await updateViteConfig ()
129196
197+ if templateName === Templates .resXTemplateName {
198+ await synchronizeResxTemplateFiles (~projectName )
199+ }
200+
130201 await RescriptVersions .installVersions (versions )
131202 let _ = await Promisified .ChildProcess .exec ("git init" )
132203
133204 if ! CI .isRunningInCI {
134205 s -> P .Spinner .stop ("Project created." )
135206 }
136207
137- P .note (
138- ~title = "Get started" ,
139- ~message = ` cd ${projectName}
140-
141- # See the project's README.md for more information.` ,
142- )
208+ await showGetStartedNote (~templateName , ~projectName )
143209}
144210
145211let createNewProject = async () => {
@@ -153,7 +219,10 @@ let createNewProject = async () => {
153219 ~versions = {rescriptVersion : "11.1.1" , rescriptCoreVersion : Some ("1.5.0" )},
154220 )
155221 } else {
156- let commandLineArguments = CommandLineArguments .fromProcessArgv (Process .argv )-> Result .getOrThrow
222+ let commandLineArguments = switch CommandLineArguments .fromProcessArgv (Process .argv ) {
223+ | Ok (commandLineArguments ) => commandLineArguments
224+ | Error (message ) => JsError .throwWithMessage (message )
225+ }
157226 let useDefaultVersions = Option .isSome (commandLineArguments .templateName )
158227
159228 let projectName = switch commandLineArguments .projectName {
0 commit comments