1
- const fs = require ( 'fs' ) ;
1
+ const fs = require ( 'fs-extra ' ) ;
2
2
const path = require ( 'path' ) ;
3
3
4
4
const chalk = require ( 'chalk' ) ;
@@ -7,18 +7,19 @@ const { prompt } = require('inquirer');
7
7
const Spinnies = require ( 'spinnies' ) ;
8
8
const { logger } = require ( '@hubspot/cli-lib/logger' ) ;
9
9
const { getEnv } = require ( '@hubspot/cli-lib/lib/config' ) ;
10
+ const { createProject } = require ( '@hubspot/cli-lib/projects' ) ;
10
11
const { getHubSpotWebsiteOrigin } = require ( '@hubspot/cli-lib/lib/urls' ) ;
11
12
const {
12
13
ENVIRONMENTS ,
13
14
POLLING_DELAY ,
15
+ PROJECT_TEMPLATE_REPO ,
14
16
PROJECT_OVERALL_STATUS ,
15
17
PROJECT_TEXT ,
16
18
} = require ( '@hubspot/cli-lib/lib/constants' ) ;
17
19
const {
18
20
getBuildStatus,
19
21
getDeployStatus,
20
22
fetchProject,
21
- createProject,
22
23
} = require ( '@hubspot/cli-lib/api/dfs' ) ;
23
24
const {
24
25
logApiErrorInstance,
@@ -53,6 +54,7 @@ const isTaskComplete = task => {
53
54
54
55
const writeProjectConfig = ( configPath , config ) => {
55
56
try {
57
+ fs . ensureFileSync ( configPath ) ;
56
58
fs . writeFileSync ( configPath , JSON . stringify ( config , null , 2 ) ) ;
57
59
logger . debug ( `Wrote project config at ${ configPath } ` ) ;
58
60
} catch ( e ) {
@@ -78,14 +80,25 @@ const getProjectConfig = async projectPath => {
78
80
}
79
81
} ;
80
82
81
- const getOrCreateProjectConfig = async projectPath => {
83
+ const createProjectConfig = async ( projectPath , projectName ) => {
82
84
const projectConfig = await getProjectConfig ( projectPath ) ;
85
+ const projectConfigPath = path . join ( projectPath , 'hsproject.json' ) ;
83
86
84
- if ( ! projectConfig ) {
85
- const { name, srcDir } = await prompt ( [
87
+ if ( projectConfig ) {
88
+ logger . log (
89
+ `Found an existing project config in this folder (${ chalk . bold (
90
+ projectConfig . name
91
+ ) } )`
92
+ ) ;
93
+ } else {
94
+ logger . log (
95
+ `Creating project in ${ projectPath ? projectPath : 'the current folder' } `
96
+ ) ;
97
+ const { name, template, srcDir } = await prompt ( [
86
98
{
87
99
name : 'name' ,
88
100
message : 'Please enter a project name:' ,
101
+ when : ! projectName ,
89
102
validate : input => {
90
103
if ( ! input ) {
91
104
return 'A project name is required' ;
@@ -94,20 +107,43 @@ const getOrCreateProjectConfig = async projectPath => {
94
107
} ,
95
108
} ,
96
109
{
97
- name : 'srcDir' ,
98
- message : 'Which directory contains your project files?' ,
99
- validate : input => {
100
- if ( ! input ) {
101
- return 'A source directory is required' ;
102
- }
103
- return true ;
104
- } ,
110
+ name : 'template' ,
111
+ message : 'Start from a template?' ,
112
+ type : 'rawlist' ,
113
+ choices : [
114
+ {
115
+ name : 'No template' ,
116
+ value : 'none' ,
117
+ } ,
118
+ {
119
+ name : 'Getting Started Project' ,
120
+ value : 'getting-started' ,
121
+ } ,
122
+ ] ,
105
123
} ,
106
124
] ) ;
107
- writeProjectConfig ( path . join ( projectPath , 'hsproject.json' ) , {
108
- name,
109
- srcDir,
110
- } ) ;
125
+
126
+ if ( template === 'none' ) {
127
+ fs . ensureDirSync ( path . join ( projectPath , 'src' ) ) ;
128
+
129
+ writeProjectConfig ( projectConfigPath , {
130
+ name : projectName || name ,
131
+ srcDir : 'src' ,
132
+ } ) ;
133
+ } else {
134
+ await createProject (
135
+ projectPath ,
136
+ 'project' ,
137
+ PROJECT_TEMPLATE_REPO [ template ] ,
138
+ ''
139
+ ) ;
140
+ const _config = JSON . parse ( fs . readFileSync ( projectConfigPath ) ) ;
141
+ writeProjectConfig ( projectConfigPath , {
142
+ ..._config ,
143
+ name : projectName || name ,
144
+ } ) ;
145
+ }
146
+
111
147
return { name, srcDir } ;
112
148
}
113
149
@@ -178,31 +214,24 @@ const getProjectDetailUrl = (projectName, accountId) => {
178
214
return `${ baseUrl } /developer-projects/${ accountId } /project/${ projectName } ` ;
179
215
} ;
180
216
181
- const showWelcomeMessage = ( projectName , accountId ) => {
182
- const projectDetailUrl = getProjectDetailUrl ( projectName , accountId ) ;
183
-
217
+ const showWelcomeMessage = ( ) => {
184
218
logger . log ( '' ) ;
185
- logger . log ( chalk . bold ( '> Welcome to HubSpot Developer Projects!' ) ) ;
219
+ logger . log ( chalk . bold ( 'Welcome to HubSpot Developer Projects!' ) ) ;
186
220
logger . log (
187
221
'\n-------------------------------------------------------------\n'
188
222
) ;
189
- if ( projectDetailUrl ) {
190
- logger . log ( chalk . italic ( `View this project at: ${ projectDetailUrl } ` ) ) ;
191
- }
192
- logger . log ( '' ) ;
193
- logger . log ( chalk . bold ( 'Getting Started' ) ) ;
194
- logger . log ( '' ) ;
195
- logger . log ( '1. hs project upload' ) ;
223
+ logger . log ( chalk . bold ( "What's next?\n" ) ) ;
224
+ logger . log ( '🎨 Add deployables to your project with `hs create`.\n' ) ;
196
225
logger . log (
197
- ' Upload your project files to HubSpot. Upload action adds your files to a build.'
226
+ `🏗 Run \`hs project upload\` to upload your files to HubSpot and trigger builds.\n`
198
227
) ;
199
- logger . log ( ) ;
200
- logger . log ( '2. View your changes on the preview build url' ) ;
201
- logger . log ( ) ;
202
- logger . log ( 'Use `hs project --help` to learn more about the command.' ) ;
203
228
logger . log (
204
- '\n-------------------------------------------------------------\n'
229
+ `🚀 Ready to take your project live? Run \`hs project deploy\`.\n`
230
+ ) ;
231
+ logger . log (
232
+ `🔗 Use \`hs project --help\` to learn more about available commands.\n`
205
233
) ;
234
+ logger . log ( '-------------------------------------------------------------' ) ;
206
235
} ;
207
236
208
237
const makeGetTaskStatus = taskType => {
@@ -311,9 +340,10 @@ const makeGetTaskStatus = taskType => {
311
340
module . exports = {
312
341
writeProjectConfig,
313
342
getProjectConfig,
314
- getOrCreateProjectConfig ,
343
+ createProjectConfig ,
315
344
validateProjectConfig,
316
345
showWelcomeMessage,
346
+ getProjectDetailUrl,
317
347
pollBuildStatus : makeGetTaskStatus ( 'build' ) ,
318
348
pollDeployStatus : makeGetTaskStatus ( 'deploy' ) ,
319
349
ensureProjectExists,
0 commit comments