-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuild.js
More file actions
163 lines (134 loc) · 5.21 KB
/
Copy pathbuild.js
File metadata and controls
163 lines (134 loc) · 5.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
const util = require('util')
const { exec } = require('child_process')
const path = require('path')
const { processFatalError } = require('./utilities/error_handling')
const { createFile, copyFile } = require('./utilities/file_utilities')
const { renderMustache } = require('./utilities/mustache_utiltities')
const { generateChallengeConfig } = require('./utilities/data_maker')
/* Functions ************************************************/
/**
* Create challenge instructions and output to the outputDir/README.md
* @param {object} config - configuration for this challenge
*/
const createInstructions = (config) => {
const { paths, data } = config
const partials = {
'part-1': paths.readme.src.p1Template,
'part-2': paths.readme.src.p2Template,
'part-3': paths.readme.src.p3Template,
}
const templateData = Object.assign(data, {
outputDir: paths.common.dest.rootDir,
drivePath: paths.common.dest.drivePath,
dbType: config.dbConfig.dbType,
dbName: config.dbConfig.dbName,
})
const readmeContents = renderMustache(paths.readme.src.readmeTemplate, templateData, partials)
createFile(paths.readme.dest.readmeFile, readmeContents)
// copy ERD over
copyFile(paths.readme.src.erdFile, paths.readme.dest.erdFile)
}
/**
* Copy over package.json files for the project
* @param {object} config - configuration for this challenge
*/
const createPackageJSON = (config) => {
const { paths } = config
Array(1, 2, 3).forEach ((partNum) => {
copyFile(paths[`p${partNum}`].src.packageFile, paths[`p${partNum}`].dest.packageFile)
})
}
/**
* Create setup directory with the appropriate db data
* @param {object} config - configuration for this challenge
*/
const createSetup = (config) => {
const { dbConfig, paths } = config
const { dbName } = dbConfig
// render schema from template
const tables = Object.keys(dbConfig.tables).map(key => dbConfig.tables[key])
// account for commas that need to be all but the last item >_<
tables.forEach((table) => {
table.columns[table.columns.length - 1].last = true
})
const schema = renderMustache(paths.setup.src.schemaFile, { dbName, tables }, {})
createFile(paths.setup.dest.schemaFile, schema)
// too much work to create seed file from yaml.
// for now, just copy over
copyFile(paths.setup.src.seedFile, paths.setup.dest.seedFile)
// finally, package.json, customized with db name
const package = renderMustache(paths.setup.src.packageTemplate, { dbName }, { })
createFile(paths.setup.dest.setupPackageFile, package)
}
/**
* Create part-1 directory with the appropriate data
* @param {object} config - configuration for this particular challenge
*/
const createPart1 = (config) => {
const { dbConfig, paths } = config
const dbjsContent = renderMustache(paths.dbJs.src.dbJsConnectionTemplate, { dbName: dbConfig.dbName }, { })
createFile(path.join(paths.p1.dest.dbJsDir, 'db.js'), dbjsContent)
}
/**
* Create files for part-2 and part-3 with the appropriate data
* @param {object} config - configuration for this particular challenge
*/
const createParts2and3 = (config) => {
// gather data
const { dbConfig, paths, data } = config
const mainTableName = dbConfig.tables.main.tablename
const joinTableName = dbConfig.tables.join.tablename
const dbName = config.dbConfig.dbName
// all the partials
const partials = {
dbConnection: paths.dbJs.src.dbJsConnectionTemplate,
appStart: paths.appJs.src.appStartTemplate,
defineAppAndView: paths.appJs.src.defineAppAndViewTemplate,
}
// make files for each part
Array(2, 3).forEach(partNum => {
const partData = data[`p${partNum}`]
const partPaths = paths[`p${partNum}`]
// db.js
partials.jsDoc = partPaths.src.jsDocTemplate
const templateData = Object.assign(partData, { mainTableName, joinTableName, dbName })
const dbjsContent = renderMustache(partPaths.src.dbJsTemplate, templateData, partials)
createFile(path.join(partPaths.dest.dbJsDir, 'db.js'), dbjsContent)
// app.js
const appJsContent = renderMustache(partPaths.src.appJsTemplate, partData, partials)
createFile(partPaths.dest.appJsFile, appJsContent)
// views (*.pug and *.ejs)
Array('pug', 'ejs').forEach(viewType => {
const viewContent = renderMustache(partPaths.src[`${viewType}Template`], partData, {})
createFile(partPaths.dest[`${viewType}File`], viewContent)
})
// public
if (partNum > 2) {
Array('js', 'css').forEach(staticType => {
const staticContent = renderMustache(partPaths.src[`${staticType}Template`], partData, {})
createFile(partPaths.dest[`${staticType}File`], staticContent)
})
}
})
}
/**
* Create the challenge using other functions
*/
const createChallenge = (learnerName) => {
const challengeData = generateChallengeConfig(learnerName)
createInstructions(challengeData)
createSetup(challengeData)
createPackageJSON(challengeData)
createPart1(challengeData)
createParts2and3(challengeData)
}
/* Main ******************************************************************/
/* Argument gathering */
if (process.argv.length < 3) {
console.log(`
USAGE: node build.js <learner_name>
`)
process.exit(1)
}
const learnerName = process.argv.slice(2).join('_')
createChallenge(learnerName)