@@ -2,18 +2,20 @@ open Node
22
33module P = ClackPrompts
44
5- let packageNameRegExp = /^ [a - z0 - 9 - ]+ $/
6-
7- let validateProjectName = projectName =>
8- if projectName -> String .trim -> String .length === 0 {
9- Error ("Project name must not be empty." )
10- } else if ! (packageNameRegExp -> RegExp .test (projectName )) {
11- Error ("Project name may only contain lower case letters, numbers and hyphens." )
12- } else if Fs .existsSync (Path .join2 (Process .cwd (), projectName )) {
13- Error (` The folder ${projectName} already exist in the current directory.` )
14- } else {
15- Ok ()
5+ let installGitignore = async () => {
6+ let templateGitignorePath = "_gitignore"
7+ let gitignorePath = ".gitignore"
8+
9+ if Fs .existsSync (templateGitignorePath ) {
10+ if Fs .existsSync (gitignorePath ) {
11+ let templateGitignore = await Fs .Promises .readFile (templateGitignorePath )
12+ await Fs .Promises .appendFile (gitignorePath , ` ${Os.eol}${templateGitignore}` )
13+ await Fs .Promises .rm (templateGitignorePath , ~options = {force : true })
14+ } else {
15+ await Fs .Promises .rename (templateGitignorePath , gitignorePath )
16+ }
1617 }
18+ }
1719
1820let updatePackageJson = async (~projectName , ~versions ) =>
1921 await JsonUtils .updateJsonFile ("package.json" , json =>
@@ -111,20 +113,27 @@ let promptTemplateName = async () => {
111113
112114let createProject = async (~templateName , ~projectName , ~versions ) => {
113115 let templatePath = CraPaths .getTemplatePath (~templateName )
114- let projectPath = Path .join2 (Process .cwd (), projectName )
116+ let packageName = NewProjectLocation .getPackageName (projectName )
117+ let projectPath = NewProjectLocation .getProjectPath (projectName )
118+ let createInCurrentDirectory = NewProjectLocation .isCurrentDirectoryProject (projectName )
115119
116120 let s = P .spinner ()
117121
118122 if ! CI .isRunningInCI {
119123 s -> P .Spinner .start ("Creating project..." )
120124 }
121125
122- await Fs .Promises .cp (templatePath , projectPath , ~options = {recursive : true })
126+ if createInCurrentDirectory {
127+ await Fs .Promises .cp (templatePath , projectPath , ~options = {recursive : true , force : false })
128+ } else {
129+ await Fs .Promises .cp (templatePath , projectPath , ~options = {recursive : true })
130+ }
131+
123132 Process .chdir (projectPath )
124133
125- await Fs . Promises . rename ( "_gitignore" , ".gitignore" )
126- await updatePackageJson (~projectName , ~versions )
127- await updateRescriptJson (~projectName , ~versions )
134+ await installGitignore ( )
135+ await updatePackageJson (~projectName = packageName , ~versions )
136+ await updateRescriptJson (~projectName = packageName , ~versions )
128137 await updateViteConfig ()
129138
130139 await RescriptVersions .installVersions (versions )
@@ -134,12 +143,13 @@ let createProject = async (~templateName, ~projectName, ~versions) => {
134143 s -> P .Spinner .stop ("Project created." )
135144 }
136145
137- P . note (
138- ~ title = "Get started" ,
139- ~ message = ` cd ${projectName}
146+ let getStartedMessage = createInCurrentDirectory
147+ ? "# See the project's README.md for more information."
148+ : ` cd ${projectName}
140149
141- # See the project's README.md for more information.` ,
142- )
150+ # See the project's README.md for more information.`
151+
152+ P .note (~title = "Get started" , ~message = getStartedMessage )
143153}
144154
145155let createNewProject = async () => {
@@ -159,7 +169,7 @@ let createNewProject = async () => {
159169 let projectName = switch commandLineArguments .projectName {
160170 | Some (projectName ) if useDefaultVersions =>
161171 // Note this throws in the some case, which is why we cannot use Option.getOrThrow here.
162- switch validateProjectName (projectName ) {
172+ switch NewProjectLocation . validateProjectName (projectName ) {
163173 | Error (message ) => JsError .throwWithMessage (message )
164174 | Ok () => projectName
165175 }
@@ -170,7 +180,7 @@ let createNewProject = async () => {
170180 placeholder : "my-rescript-app" ,
171181 ?initialValue ,
172182 validate : projectName =>
173- switch validateProjectName (projectName ) {
183+ switch NewProjectLocation . validateProjectName (projectName ) {
174184 | Ok () => None
175185 | Error (error ) => Some (error )
176186 },
0 commit comments