@@ -2,19 +2,22 @@ open Node
22
33module P = ClackPrompts
44
5- let packageNameRegExp = /^ [a - z0 - 9 - ]+ $/
65let resxTemplatePlaceholderName = "resx-template"
76
8- let validateProjectName = projectName =>
9- if projectName -> String .trim -> String .length === 0 {
10- Error ("Project name must not be empty." )
11- } else if ! (packageNameRegExp -> RegExp .test (projectName )) {
12- Error ("Project name may only contain lower case letters, numbers and hyphens." )
13- } else if Fs .existsSync (Path .join2 (Process .cwd (), projectName )) {
14- Error (` The folder ${projectName} already exist in the current directory.` )
15- } else {
16- Ok ()
7+ let installGitignore = async () => {
8+ let templateGitignorePath = "_gitignore"
9+ let gitignorePath = ".gitignore"
10+
11+ if Fs .existsSync (templateGitignorePath ) {
12+ if Fs .existsSync (gitignorePath ) {
13+ let templateGitignore = await Fs .Promises .readFile (templateGitignorePath )
14+ await Fs .Promises .appendFile (gitignorePath , ` ${Os.eol}${templateGitignore}` )
15+ await Fs .Promises .rm (templateGitignorePath , ~options = {force : true })
16+ } else {
17+ await Fs .Promises .rename (templateGitignorePath , gitignorePath )
18+ }
1719 }
20+ }
1821
1922let updatePackageJson = async (~projectName , ~versions ) =>
2023 await JsonUtils .updateJsonFile ("package.json" , json =>
@@ -144,58 +147,62 @@ let getPackageManagerName = (packageManager: PackageManagers.packageManager) =>
144147 | Bun => "bun"
145148 }
146149
147- let showGetStartedNote = async (~templateName , ~projectName ) => {
150+ let showGetStartedNote = async (~templateName , ~projectName , ~createInCurrentDirectory ) => {
151+ let changeDirectoryCommand = createInCurrentDirectory
152+ ? ""
153+ : ` cd ${projectName}
154+
155+ `
156+
148157 if templateName === Templates .resXTemplateName {
149158 let packageManagerInfo = await PackageManagers .getPackageManagerInfo ()
150159
151160 switch packageManagerInfo .packageManager {
152- | Bun =>
153- P .note (
154- ~title = "Get started" ,
155- ~message = ` cd ${projectName}
156-
157- bun run dev` ,
158- )
161+ | Bun => P .note (~title = "Get started" , ~message = ` ${changeDirectoryCommand}bun run dev` )
159162 | packageManager =>
160163 P .note (
161164 ~title = "Bun recommended" ,
162165 ~message = ` This ResX template is Bun-centric. You created it with ${packageManager-> getPackageManagerName}, but the generated project should use Bun.
163166
164- cd ${projectName}
165- bun install
167+ ${changeDirectoryCommand}bun install
166168bun run dev` ,
167169 )
168170 }
169171 } else {
170172 P .note (
171173 ~title = "Get started" ,
172- ~message = ` cd ${projectName}
173-
174- # See the project's README.md for more information.` ,
174+ ~message = ` ${changeDirectoryCommand}# See the project's README.md for more information.` ,
175175 )
176176 }
177177}
178178
179179let createProject = async (~templateName , ~projectName , ~versions ) => {
180180 let templatePath = CraPaths .getTemplatePath (~templateName )
181- let projectPath = Path .join2 (Process .cwd (), projectName )
181+ let packageName = NewProjectLocation .getPackageName (projectName )
182+ let projectPath = NewProjectLocation .getProjectPath (projectName )
183+ let createInCurrentDirectory = NewProjectLocation .isCurrentDirectoryProject (projectName )
182184
183185 let s = P .spinner ()
184186
185187 if ! CI .isRunningInCI {
186188 s -> P .Spinner .start ("Creating project..." )
187189 }
188190
189- await Fs .Promises .cp (templatePath , projectPath , ~options = {recursive : true })
191+ if createInCurrentDirectory {
192+ await Fs .Promises .cp (templatePath , projectPath , ~options = {recursive : true , force : false })
193+ } else {
194+ await Fs .Promises .cp (templatePath , projectPath , ~options = {recursive : true })
195+ }
196+
190197 Process .chdir (projectPath )
191198
192- await Fs . Promises . rename ( "_gitignore" , ".gitignore" )
193- await updatePackageJson (~projectName , ~versions )
194- await updateRescriptJson (~projectName , ~versions )
199+ await installGitignore ( )
200+ await updatePackageJson (~projectName = packageName , ~versions )
201+ await updateRescriptJson (~projectName = packageName , ~versions )
195202 await updateViteConfig ()
196203
197204 if templateName === Templates .resXTemplateName {
198- await synchronizeResxTemplateFiles (~projectName )
205+ await synchronizeResxTemplateFiles (~projectName = packageName )
199206 }
200207
201208 await RescriptVersions .installVersions (versions )
@@ -205,7 +212,7 @@ let createProject = async (~templateName, ~projectName, ~versions) => {
205212 s -> P .Spinner .stop ("Project created." )
206213 }
207214
208- await showGetStartedNote (~templateName , ~projectName )
215+ await showGetStartedNote (~templateName , ~projectName , ~ createInCurrentDirectory )
209216}
210217
211218let createNewProject = async () => {
@@ -228,7 +235,7 @@ let createNewProject = async () => {
228235 let projectName = switch commandLineArguments .projectName {
229236 | Some (projectName ) if useDefaultVersions =>
230237 // Note this throws in the some case, which is why we cannot use Option.getOrThrow here.
231- switch validateProjectName (projectName ) {
238+ switch NewProjectLocation . validateProjectName (projectName ) {
232239 | Error (message ) => JsError .throwWithMessage (message )
233240 | Ok () => projectName
234241 }
@@ -239,7 +246,7 @@ let createNewProject = async () => {
239246 placeholder : "my-rescript-app" ,
240247 ?initialValue ,
241248 validate : projectName =>
242- switch validateProjectName (projectName ) {
249+ switch NewProjectLocation . validateProjectName (projectName ) {
243250 | Ok () => None
244251 | Error (error ) => Some (error )
245252 },
0 commit comments