11open Node
22
33module P = ClackPrompts
4+ module StringPrototype = {
5+ @send external replaceAll : (string , string , string ) => string = "replaceAll"
6+ }
47
58let packageNameRegExp = /^ [a - z0 - 9 - ]+ $/
9+ let resxTemplatePlaceholderName = "resx-template"
610
711let validateProjectName = projectName =>
812 if projectName -> String .trim -> String .length === 0 {
@@ -109,6 +113,72 @@ let promptTemplateName = async () => {
109113 }
110114}
111115
116+ let rec replaceFileContents = async (remainingFilePaths , ~replaceValue , ~withValue ) =>
117+ switch remainingFilePaths {
118+ | list {} => ()
119+ | list {filePath , ... remainingFilePaths } =>
120+ let fileContents = await Fs .Promises .readFile (filePath )
121+ let updatedFileContents = fileContents -> StringPrototype .replaceAll (replaceValue , withValue )
122+
123+ await Fs .Promises .writeFile (filePath , updatedFileContents )
124+ await replaceFileContents (remainingFilePaths , ~replaceValue , ~withValue )
125+ }
126+
127+ let synchronizeResxTemplateFiles = async (~projectName ) =>
128+ await replaceFileContents (
129+ list {
130+ "package.json" ,
131+ "rescript.json" ,
132+ "README.md" ,
133+ "Dockerfile" ,
134+ "bun.lock" ,
135+ Path .join (["scripts" , "build-sfe.mjs" ]),
136+ Path .join (["src" , "data" , "TemplateContent.res" ]),
137+ },
138+ ~replaceValue = resxTemplatePlaceholderName ,
139+ ~withValue = projectName ,
140+ )
141+
142+ let getPackageManagerName = (packageManager : PackageManagers .packageManager ) =>
143+ switch packageManager {
144+ | Npm => "npm"
145+ | Yarn1 | YarnBerry => "yarn"
146+ | Pnpm => "pnpm"
147+ | Bun => "bun"
148+ }
149+
150+ let showGetStartedNote = async (~templateName , ~projectName ) => {
151+ if templateName === Templates .resXTemplateName {
152+ let packageManagerInfo = await PackageManagers .getPackageManagerInfo ()
153+
154+ switch packageManagerInfo .packageManager {
155+ | Bun =>
156+ P .note (
157+ ~title = "Get started" ,
158+ ~message = ` cd ${projectName}
159+
160+ bun run dev` ,
161+ )
162+ | packageManager =>
163+ P .note (
164+ ~title = "Bun recommended" ,
165+ ~message = ` This ResX template is Bun-centric. You created it with ${packageManager-> getPackageManagerName}, but the generated project should use Bun.
166+
167+ cd ${projectName}
168+ bun install
169+ bun run dev` ,
170+ )
171+ }
172+ } else {
173+ P .note (
174+ ~title = "Get started" ,
175+ ~message = ` cd ${projectName}
176+
177+ # See the project's README.md for more information.` ,
178+ )
179+ }
180+ }
181+
112182let createProject = async (~templateName , ~projectName , ~versions ) => {
113183 let templatePath = CraPaths .getTemplatePath (~templateName )
114184 let projectPath = Path .join2 (Process .cwd (), projectName )
@@ -127,19 +197,18 @@ let createProject = async (~templateName, ~projectName, ~versions) => {
127197 await updateRescriptJson (~projectName , ~versions )
128198 await updateViteConfig ()
129199
200+ if templateName === Templates .resXTemplateName {
201+ await synchronizeResxTemplateFiles (~projectName )
202+ }
203+
130204 await RescriptVersions .installVersions (versions )
131205 let _ = await Promisified .ChildProcess .exec ("git init" )
132206
133207 if ! CI .isRunningInCI {
134208 s -> P .Spinner .stop ("Project created." )
135209 }
136210
137- P .note (
138- ~title = "Get started" ,
139- ~message = ` cd ${projectName}
140-
141- # See the project's README.md for more information.` ,
142- )
211+ await showGetStartedNote (~templateName , ~projectName )
143212}
144213
145214let createNewProject = async () => {
@@ -153,7 +222,10 @@ let createNewProject = async () => {
153222 ~versions = {rescriptVersion : "11.1.1" , rescriptCoreVersion : Some ("1.5.0" )},
154223 )
155224 } else {
156- let commandLineArguments = CommandLineArguments .fromProcessArgv (Process .argv )-> Result .getOrThrow
225+ let commandLineArguments = switch CommandLineArguments .fromProcessArgv (Process .argv ) {
226+ | Ok (commandLineArguments ) => commandLineArguments
227+ | Error (message ) => JsError .throwWithMessage (message )
228+ }
157229 let useDefaultVersions = Option .isSome (commandLineArguments .templateName )
158230
159231 let projectName = switch commandLineArguments .projectName {
0 commit comments