UNPKG

5.13 kBJavaScriptView Raw
1#! /usr/bin/env node
2'use strict'
3
4const log = require('@rola/log')
5
6/**
7 * fresh console
8 */
9console.clear()
10
11log({ actions: [ 'initializing' ] })
12
13const fs = require('fs-extra')
14const path = require('path')
15const exit = require('exit')
16const onExit = require('exit-hook')
17const React = require('react')
18
19const rolaCompiler = require('@rola/compiler')
20const rolaStatic = require('@rola/static')
21const { getModule } = require('@rola/util')
22
23const pkg = require('./package.json')
24const createServer = require('./util/createServer.js')
25const createConfig = require('./util/createConfig.js')
26
27const PORT = process.env.PORT || 3000
28const cwd = process.cwd()
29const prog = require('commander')
30 .version(pkg.version)
31
32let clientEntry
33let serverEntry
34
35try {
36 clientEntry = require.resolve(path.join(cwd, 'client.js'))
37} catch (e) {}
38
39try {
40 serverEntry = require.resolve(path.join(cwd, 'server.js'))
41} catch (e) {}
42
43let server
44
45function serve () {
46 if (!server) {
47 server = createServer({
48 file: path.join(cwd, '/build/server.js'),
49 port: PORT
50 })
51
52 server.init()
53
54 log({ server: [ PORT ] })
55
56 onExit(() => {
57 server && server.close()
58 })
59 }
60}
61
62function createGenerator (config, plugins) {
63 const generator = rolaStatic({
64 env: config.env,
65 alias: config.alias,
66 presets: config.presets,
67 plugins
68 })
69
70 generator.on('rendered', pages => {
71 log({ static: pages })
72 })
73 generator.on('warn', e => {
74 log(state => ({
75 warn: state.warn.concat(e)
76 }))
77 })
78 generator.on('error', e => {
79 log(state => ({
80 error: state.error.concat(e)
81 }))
82 })
83
84 return generator
85}
86
87prog
88 .command('build')
89 .action(async () => {
90 log({ actions: [ 'build' ] })
91
92 const config = await getModule(path.join(cwd, 'rola.config.js'), path.join(cwd, '.cache'))
93 const plugins = await getModule(path.join(cwd, 'rola.plugins.js'), path.join(cwd, '.cache')).default
94
95 const configs = []
96
97 if (clientEntry) configs.push(createConfig({
98 entry: clientEntry,
99 env: config.env,
100 alias: config.alias,
101 presets: config.presets
102 }))
103
104 if (serverEntry) configs.push(createConfig({
105 entry: serverEntry,
106 env: config.env,
107 alias: config.alias,
108 presets: config.presets
109 }))
110
111 let allstats = []
112
113 // TODO break this out so that compiler can emit errors
114 ;(configs.length ? rolaCompiler(configs).build() : Promise.resolve(null))
115 .then(async stats => {
116 stats.map(_stats => {
117 const server = _stats.assets.reduce((bool, asset) => {
118 if (/server/.test(asset.name)) bool = true
119 return bool
120 }, false)
121
122 if (server) {
123 allstats[1] = _stats
124 } else {
125 allstats[0] = _stats
126 }
127 })
128
129 log({
130 actions: [],
131 stats: allstats
132 })
133
134 if (serverEntry) serve()
135
136 await createGenerator(config, plugins).render('/static', '/build')
137
138 exit()
139 })
140 .catch(e => {
141 log(state => ({
142 error: state.error.concat(e)
143 }))
144 })
145 })
146
147prog
148 .command('watch')
149 .action(async () => {
150 log({ actions: [ 'watch' ] })
151
152 const config = await getModule(path.join(cwd, 'rola.config.js'), path.join(cwd, '.cache'))
153 const plugins = await getModule(path.join(cwd, 'rola.plugins.js'), path.join(cwd, '.cache')).default
154
155 let compiled = false
156 const configs = []
157
158 if (clientEntry) configs.push(createConfig({
159 entry: clientEntry,
160 env: config.env,
161 alias: config.alias,
162 banner: require('./util/clientReloader.js')(PORT),
163 presets: config.presets
164 }))
165
166 if (serverEntry) configs.push(createConfig({
167 entry: serverEntry,
168 env: config.env,
169 alias: config.alias,
170 presets: config.presets
171 }))
172
173 let allstats = []
174
175 if (configs.length) {
176 const compiler = rolaCompiler(configs)
177
178 compiler.on('error', e => {
179 log(state => ({
180 error: state.error.concat(e)
181 }))
182 })
183
184 compiler.on('warn', e => {
185 log(state => ({
186 warn: state.warn.concat(e)
187 }))
188 })
189
190 compiler.on('stats', stats => {
191 stats.map(_stats => {
192 const isServer = _stats.assets.reduce((bool, asset) => {
193 if (/server/.test(asset.name)) bool = true
194 return bool
195 }, false)
196
197 if (isServer) {
198 allstats[1] = _stats
199 } else {
200 allstats[0] = _stats
201 }
202 })
203
204 log({
205 actions: [],
206 // error: [],
207 // warn: [],
208 // log: [],
209 stats: allstats
210 })
211
212 server && server.update()
213
214 serve()
215
216 if (!compiled) {
217 createGenerator(config, plugins).watch('/static', '/build')
218
219 compiled = true
220 }
221 })
222
223 compiler.watch()
224 } else {
225 serve()
226 createGenerator(config, plugins).watch('/static', '/build')
227 }
228 })
229
230if (!process.argv.slice(2).length) {
231 prog.outputHelp(txt => {
232 console.log(txt)
233 exit()
234 })
235} else {
236 prog.parse(process.argv)
237}
238
239