UNPKG

10.9 kBJavaScriptView Raw
1'use strict'
2
3const {remote} = require('electron')
4const {app, dialog, shell} = remote
5const async = require('async')
6const chokidar = require('chokidar')
7const fs = require('fs')
8const git = require('simple-git')
9const lodash = require('lodash')
10const path = require('path')
11
12const renderer = require('../renderer.js')
13
14
15var confFile = localStorage.getItem('confFile')
16var render
17var gitRepo = ''
18var gitRemote = ''
19var gitBranch = ''
20var appConf = {}
21var serverStarted = false
22var serverUrl = ''
23var errors = {}
24var watcher
25
26
27document.getElementById('version').innerHTML = app.getVersion()
28
29
30var openConf = () => {
31 render = new renderer(confFile)
32
33 if(!render.sourceDir || !render.buildDir) {
34 localStorage.removeItem('confFile')
35 remote.getCurrentWindow().reload()
36 }
37
38 async.waterfall([
39 (callback) => {
40 git(path.dirname(confFile)).revparse(['--show-toplevel'], callback)
41 },
42 (repo, callback) => {
43 gitRepo = repo.trim()
44 git(gitRepo).raw(['config', '--get', 'remote.origin.url'], callback)
45 },
46 (remote, callback) => {
47 gitRemote = remote.trim()
48 git(gitRepo).branchLocal(callback)
49 },
50 (branches, callback) => {
51 gitBranch = branches.current
52
53 let select = []
54 for (let i = 0; i < branches.all.length; i++) {
55 select.push(`<option value="${branches.all[i]}" ${(branches.all[i] === branches.current ? 'selected' : '')}>${branches.all[i]}</option>`)
56 }
57 document.getElementById('branch').innerHTML = select.join('')
58
59 // git(gitRepo).log({splitter: 'commit', '--max-count': '30'}, callback)
60 // },
61 // (log, callback) => {
62 // for (let i = 0; i < log.all.length; i++) {
63 // let dt = new Date(log.all[i].date)
64 //
65 // document.getElementById('log-table').innerHTML = document.getElementById('log-table').innerHTML + `
66 // <tr class="log">
67 // <td>${log.all[i].message}</td>
68 // <td class="nowrap">${log.all[i].author_name}</td>
69 // <td class="nowrap" style="text-align:right;">${dt.toLocaleDateString('de-DE', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' })}</td>
70 // </tr>
71 // `
72 // }
73 //
74 // git(gitRepo).show({'--name-only': null, '0da5fc637ea889d8ca5c3ca9b4fcaed78d077458': null}, callback)
75 // },
76 // (diff, callback) => {
77 callback(null)
78 }
79 ], err => {
80 if (err) {
81 dialog.showMessageBox({
82 type: 'error',
83 message: err.toString(),
84 buttons: ['OK']
85 }, () => {
86 confFile = null
87 openConfFile()
88 })
89 } else {
90 document.getElementById('remote').innerHTML = gitRemote.replace('http://', '').replace('https://', '')
91 document.getElementById('remote').setAttribute('title', gitRemote)
92
93 document.getElementById('repo').innerHTML = gitRepo.replace(app.getPath('home'), '~')
94 document.getElementById('repo').setAttribute('title', gitRepo)
95
96 document.getElementById('conf').innerHTML = confFile.replace(gitRepo, '.')
97 document.getElementById('conf').setAttribute('title', confFile)
98
99 document.getElementById('source').innerHTML = render.sourceDir.replace(gitRepo, '.')
100 document.getElementById('source').setAttribute('title', render.sourceDir)
101
102 document.getElementById('build').innerHTML = render.buildDir.replace(gitRepo, '.')
103 document.getElementById('build').setAttribute('title', render.buildDir)
104
105 document.getElementById('log').style.left = document.getElementById('tools').offsetWidth + 'px'
106
107 if (fs.existsSync(render.buildDir)) {
108 // startRendering('add change unlink')
109 startRendering('all')
110 } else {
111 startRendering('all')
112 }
113
114 startServer()
115 }
116 })
117}
118
119
120var openConfFile = () => {
121 var files = dialog.showOpenDialog({
122 properties: ['openFile'],
123 filters: [
124 { name: 'Yaml files', extensions: ['yaml'] }
125 ]
126 })
127 if (!files && !confFile) { app.quit() }
128 if (!files) { return }
129
130 confFile = files[0]
131 localStorage.setItem('confFile', confFile)
132
133 openConf()
134}
135
136
137var setBranch = () => {
138 clearLog()
139
140 let e = document.getElementById('branch')
141 gitBranch = e.options[e.selectedIndex].value
142
143 git(gitRepo).checkout(gitBranch).fetch().status(function (err, data) {
144 if (err) { console.error(err) }
145
146 openConf()
147 })
148}
149
150
151var startRendering = (type) => {
152 try {
153 watcher.close()
154 } catch (e) {
155 // No active watchers
156 }
157
158 watcher = chokidar.watch(render.sourceDir).on(type, (et, filename) => {
159 const dirName = path.dirname(filename)
160 const fileName = path.basename(filename)
161 const eventType = et
162
163 if (fileName.startsWith('_')) { return }
164 if (!fileName.endsWith('.pug') && !fileName.endsWith('.js') && !fileName.endsWith('.styl')) { return }
165
166 if (render.paths.length) {
167 var ignore = true
168 for (let i = 0; i < render.paths.length; i++) {
169 if (render.paths[i] && item.path.startsWith(path.join(render.sourceDir, render.paths[i]))) {
170 ignore = false
171 break
172 }
173 }
174 if (ignore) { return }
175 }
176
177 if (fileName.startsWith('index.') && fileName.endsWith('.pug')) {
178 render.makeHTML(dirName, (err, files) => {
179 if (err) {
180 // console.error(err)
181
182 if (Array.isArray(err)) {
183 var error = `${err[1]}\n${err[0].message || err[0].stack || err[0]}`
184 } else {
185 var error = `${err.message || err.stack || err}`
186 }
187
188 addLogError(
189 eventType.toUpperCase(),
190 filename.replace(render.sourceDir, '.'),
191 `javascript:shell.showItemInFolder('${filename}')`,
192 error.trim(),
193 false
194 )
195 } else if (files && files.length) {
196 addLog(
197 eventType.toUpperCase(),
198 filename,
199 files
200 )
201 }
202 })
203 }
204 // if (fileName.endsWith('.js')) {
205 // sourceJsFiles.push(item.path)
206 // }
207 // if (fileName.endsWith('.styl')) {
208 // sourceStylusFiles.push(item.path)
209 // }
210
211 })
212
213
214 // renderer.openConfFile(confFile, (err, conf) => {
215 // if (err) {
216 // dialog.showMessageBox({
217 // type: 'error',
218 // message: err.toString(),
219 // buttons: ['OK']
220 // }, () => {
221 // confFile = null
222 // openConfFile()
223 // return
224 // })
225 // } else {
226 // appConf = conf
227 //
228 // clearLog()
229 //
230 // renderer.watchFiles((err, data) => {
231 // if (err) {
232 // badge(err.source, true)
233 // addLogError(
234 // err.event,
235 // err.source,
236 // `javascript:shell.showItemInFolder('${appConf.source + err.source}')`,
237 // err.error.toString().trim(),
238 // true
239 // )
240 // } else {
241 // if (data.build.length > 0) {
242 // badge(data.source, false)
243 // addLog(
244 // data.event,
245 // data.source,
246 // data.build
247 // )
248 // }
249 // }
250 // })
251 // }
252 // })
253}
254
255
256var startServer = () => {
257 render.serve((err) => {
258 serverUrl = `http://localhost:${render.serverPort}`
259 document.getElementById('preview').innerHTML = serverUrl
260 document.getElementById('preview').setAttribute('href', `javascript:shell.openExternal('${serverUrl}');`)
261
262 if (err) {
263 addLogError(
264 err.event,
265 err.source,
266 `javascript:shell.openExternal('${serverUrl + err.source}')`,
267 err.error.toString().trim(),
268 false
269 )
270 } else {
271 serverStarted = true
272
273 let myNotification = new Notification('Server started', { body: serverUrl })
274
275 myNotification.onclick = () => {
276 shell.openExternal(serverUrl)
277 }
278 }
279 })
280}
281
282
283var clearLog = () => {
284 document.getElementById('log-table').innerHTML = ''
285}
286
287
288var addLogError = (event, source, sourceLink, error, notify) => {
289 if (notify) {
290 let myNotification = new Notification('Error in file', { body: source })
291 }
292
293 document.getElementById('log-table').innerHTML = document.getElementById('log-table').innerHTML + `
294 <tr class="error">
295 <td style="width:5%">${event}</td>
296 <td style="width:95%" colspan="2">
297 <a href="${sourceLink}">${source}</a><br>
298 <pre>${error}</pre>
299 </td>
300 </tr>
301 `
302 document.getElementById('log').scrollTop = document.getElementById('log').scrollHeight
303}
304
305
306var addLog = (event, source, build) => {
307 let links = []
308 for (let i = 0; i < build.length; i++) {
309 let buildUrl = build[i].build.replace(render.buildDir, '').replace(/\\/g, '/').replace('/index.html', '')
310 links.push(`<a class="${build[i].alias ? 'alias' : ''}" href="javascript:shell.openExternal('${serverUrl + buildUrl}')">${buildUrl || '/'}</a>`)
311 }
312 links.sort()
313 document.getElementById('log-table').innerHTML = document.getElementById('log-table').innerHTML + `
314 <tr class="log">
315 <td style="width:5%">${event}</td>
316 <td style="width:5%"><a href="javascript:shell.showItemInFolder('${source}')">${source.replace(render.sourceDir ,'.')}</a></td>
317 <td style="width:90%">${links.join('<br>')}</td>
318 </tr>
319 `
320
321 document.getElementById('log').scrollTop = document.getElementById('log').scrollHeight
322}
323
324
325var badge = (source, add) => {
326 if (add) {
327 errors[source] = true
328 } else {
329 delete errors[source]
330 }
331
332 app.setBadgeCount(Object.keys(errors).length)
333}
334
335
336if (confFile) {
337 openConf()
338} else {
339 openConfFile()
340}