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 {
@@ -86,6 +90,72 @@ let getTemplateOptions = () =>
8690 hint : shortDescription ,
8791 })
8892
93+ let rec replaceFileContents = async (remainingFilePaths , ~replaceValue , ~withValue ) =>
94+ switch remainingFilePaths {
95+ | list {} => ()
96+ | list {filePath , ... remainingFilePaths } =>
97+ let fileContents = await Fs .Promises .readFile (filePath )
98+ let updatedFileContents = fileContents -> StringPrototype .replaceAll (replaceValue , withValue )
99+
100+ await Fs .Promises .writeFile (filePath , updatedFileContents )
101+ await replaceFileContents (remainingFilePaths , ~replaceValue , ~withValue )
102+ }
103+
104+ let synchronizeResxTemplateFiles = async (~projectName ) =>
105+ await replaceFileContents (
106+ list {
107+ "package.json" ,
108+ "rescript.json" ,
109+ "README.md" ,
110+ "Dockerfile" ,
111+ "bun.lock" ,
112+ Path .join (["scripts" , "build-sfe.mjs" ]),
113+ Path .join (["src" , "data" , "TemplateContent.res" ]),
114+ },
115+ ~replaceValue = resxTemplatePlaceholderName ,
116+ ~withValue = projectName ,
117+ )
118+
119+ let getPackageManagerName = (packageManager : PackageManagers .packageManager ) =>
120+ switch packageManager {
121+ | Npm => "npm"
122+ | Yarn1 | YarnBerry => "yarn"
123+ | Pnpm => "pnpm"
124+ | Bun => "bun"
125+ }
126+
127+ let showGetStartedNote = async (~templateName , ~projectName ) => {
128+ if templateName === Templates .resXTemplateName {
129+ let packageManagerInfo = await PackageManagers .getPackageManagerInfo ()
130+
131+ switch packageManagerInfo .packageManager {
132+ | Bun =>
133+ P .note (
134+ ~title = "Get started" ,
135+ ~message = ` cd ${projectName}
136+
137+ bun run dev` ,
138+ )
139+ | packageManager =>
140+ P .note (
141+ ~title = "Bun recommended" ,
142+ ~message = ` This ResX template is Bun-centric. You created it with ${packageManager-> getPackageManagerName}, but the generated project should use Bun.
143+
144+ cd ${projectName}
145+ bun install
146+ bun run dev` ,
147+ )
148+ }
149+ } else {
150+ P .note (
151+ ~title = "Get started" ,
152+ ~message = ` cd ${projectName}
153+
154+ # See the project's README.md for more information.` ,
155+ )
156+ }
157+ }
158+
89159let createProject = async (~templateName , ~projectName , ~versions ) => {
90160 let templatePath = CraPaths .getTemplatePath (~templateName )
91161 let projectPath = Path .join2 (Process .cwd (), projectName )
@@ -104,19 +174,18 @@ let createProject = async (~templateName, ~projectName, ~versions) => {
104174 await updateRescriptJson (~projectName , ~versions )
105175 await updateViteConfig ()
106176
177+ if templateName === Templates .resXTemplateName {
178+ await synchronizeResxTemplateFiles (~projectName )
179+ }
180+
107181 await RescriptVersions .installVersions (versions )
108182 let _ = await Promisified .ChildProcess .exec ("git init" )
109183
110184 if ! CI .isRunningInCI {
111185 s -> P .Spinner .stop ("Project created." )
112186 }
113187
114- P .note (
115- ~title = "Get started" ,
116- ~message = ` cd ${projectName}
117-
118- # See the project's README.md for more information.` ,
119- )
188+ await showGetStartedNote (~templateName , ~projectName )
120189}
121190
122191let createNewProject = async () => {
@@ -130,7 +199,10 @@ let createNewProject = async () => {
130199 ~versions = {rescriptVersion : "11.1.1" , rescriptCoreVersion : Some ("1.5.0" )},
131200 )
132201 } else {
133- let commandLineArguments = CommandLineArguments .fromProcessArgv (Process .argv )-> Result .getOrThrow
202+ let commandLineArguments = switch CommandLineArguments .fromProcessArgv (Process .argv ) {
203+ | Ok (commandLineArguments ) => commandLineArguments
204+ | Error (message ) => JsError .throwWithMessage (message )
205+ }
134206 let useDefaultVersions = Option .isSome (commandLineArguments .templateName )
135207
136208 let projectName = switch commandLineArguments .projectName {
0 commit comments