1 | #! /usr/bin/env node
|
2 | 'use strict'
|
3 |
|
4 | const log = require('@rola/log')
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | console.clear()
|
10 |
|
11 | log({ actions: [ 'initializing' ] })
|
12 |
|
13 | const fs = require('fs-extra')
|
14 | const path = require('path')
|
15 | const exit = require('exit')
|
16 | const onExit = require('exit-hook')
|
17 | const React = require('react')
|
18 |
|
19 | const rolaCompiler = require('@rola/compiler')
|
20 | const rolaStatic = require('@rola/static')
|
21 | const { getModule } = require('@rola/util')
|
22 |
|
23 | const pkg = require('./package.json')
|
24 | const createServer = require('./util/createServer.js')
|
25 | const createConfig = require('./util/createConfig.js')
|
26 |
|
27 | const PORT = process.env.PORT || 3000
|
28 | const cwd = process.cwd()
|
29 | const prog = require('commander')
|
30 | .version(pkg.version)
|
31 |
|
32 | let clientEntry
|
33 | let serverEntry
|
34 |
|
35 | try {
|
36 | clientEntry = require.resolve(path.join(cwd, 'client.js'))
|
37 | } catch (e) {}
|
38 |
|
39 | try {
|
40 | serverEntry = require.resolve(path.join(cwd, 'server.js'))
|
41 | } catch (e) {}
|
42 |
|
43 | let server
|
44 |
|
45 | function 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 |
|
62 | function 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 |
|
87 | prog
|
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 |
|
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 |
|
147 | prog
|
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 |
|
207 |
|
208 |
|
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 |
|
230 | if (!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 |
|