1 | #!/usr/bin/env node
|
2 |
|
3 |
|
4 | const fs = require('fs-extra');
|
5 | const path = require('path');
|
6 | const program = require('commander');
|
7 | const chalk = require('chalk');
|
8 |
|
9 | const before = require('./_before');
|
10 |
|
11 | const {
|
12 | keyConfigQuiet,
|
13 | filenameBuilding
|
14 | } = require('../defaults/before-build');
|
15 |
|
16 | const __ = require('../utils/translate');
|
17 | const sleep = require('../utils/sleep');
|
18 | const setEnvFromCommand = require('../utils/set-env-from-command');
|
19 | const getAppType = require('../utils/get-app-type');
|
20 | const validateConfig = require('../libs/validate-config');
|
21 | const validateConfigDist = require('../libs/validate-config-dist');
|
22 | const spinner = require('../utils/spinner');
|
23 | const initNodeEnv = require('../utils/init-node-env');
|
24 |
|
25 | const getDirTemp = require('../libs/get-dir-tmp');
|
26 |
|
27 | const kootWebpackBuild = require('koot-webpack/build');
|
28 |
|
29 | program
|
30 | .version(require('../package').version, '-v, --version')
|
31 | .usage('[options]')
|
32 | .option('-c, --client', 'Set STAGE to CLIENT')
|
33 | .option('-s, --server', 'Set STAGE to SERVER')
|
34 | .option('--stage <stage>', 'Set STAGE')
|
35 | .option('--env <env>', 'Set ENV')
|
36 | .option('--dest <destination-path>', 'Set destination directory')
|
37 | .option('--config <config-file-path>', 'Set config file pathname')
|
38 | .option('--type <project-type>', 'Set project type')
|
39 | .option('--koot-dev', 'Koot dev env')
|
40 | .option('--koot-test', 'Koot test mode')
|
41 | .option('--koot-development', 'Koot development mode')
|
42 | .parse(process.argv);
|
43 |
|
44 |
|
45 |
|
46 |
|
47 | const isFromCommandStart = () =>
|
48 | process.env.KOOT_COMMAND_START &&
|
49 | JSON.parse(process.env.KOOT_COMMAND_START);
|
50 |
|
51 |
|
52 | let result;
|
53 |
|
54 |
|
55 |
|
56 |
|
57 | const run = async () => {
|
58 | const {
|
59 | client,
|
60 | server,
|
61 | stage: _stage,
|
62 | env = 'prod',
|
63 | config,
|
64 | type,
|
65 | dest,
|
66 | kootDev = false,
|
67 | kootTest = false,
|
68 | kootDevelopment = false
|
69 | } = program;
|
70 |
|
71 | initNodeEnv();
|
72 |
|
73 |
|
74 |
|
75 | const fromCommandStart = isFromCommandStart();
|
76 | const fromOtherCommand = kootDev || fromCommandStart;
|
77 | if (!fromOtherCommand)
|
78 |
|
79 | process.stdout.write('\x1B[2J\x1B[0f');
|
80 |
|
81 | setEnvFromCommand(
|
82 | {
|
83 | config,
|
84 | type
|
85 | },
|
86 | fromOtherCommand
|
87 | );
|
88 |
|
89 | process.env.KOOT_TEST_MODE = JSON.stringify(kootTest);
|
90 | process.env.KOOT_DEVELOPMENT_MODE = JSON.stringify(kootDevelopment);
|
91 |
|
92 | const stage = (() => {
|
93 | if (_stage) return _stage;
|
94 | if (client) return 'client';
|
95 | if (server) return 'server';
|
96 | return false;
|
97 | })();
|
98 |
|
99 |
|
100 | process.env.WEBPACK_BUILD_STAGE = stage || 'client';
|
101 | process.env.WEBPACK_BUILD_ENV = env;
|
102 |
|
103 |
|
104 | await before(program);
|
105 |
|
106 |
|
107 | const kootConfig = await validateConfig();
|
108 | await getAppType();
|
109 | if (dest) kootConfig.dist = validateConfigDist(dest);
|
110 |
|
111 |
|
112 | if (fromCommandStart) {
|
113 |
|
114 | kootConfig[keyConfigQuiet] = true;
|
115 | }
|
116 |
|
117 |
|
118 |
|
119 |
|
120 |
|
121 | if (process.env.WEBPACK_BUILD_TYPE === 'spa' || stage) {
|
122 |
|
123 |
|
124 |
|
125 | result = await kootWebpackBuild(kootConfig);
|
126 | await after(kootConfig);
|
127 | if (!fromCommandStart) console.log(' ');
|
128 | return;
|
129 | }
|
130 |
|
131 |
|
132 | result = await kootWebpackBuild({ ...kootConfig });
|
133 | await sleep(100);
|
134 |
|
135 | if (!fromCommandStart) console.log('\n' + ''.padEnd(60, '=') + '\n');
|
136 | process.env.WEBPACK_BUILD_STAGE = 'server';
|
137 | result = await kootWebpackBuild({ ...kootConfig });
|
138 | await sleep(100);
|
139 |
|
140 | if (!fromCommandStart) console.log('\n' + ''.padEnd(60, '=') + '\n');
|
141 | if (!fromCommandStart)
|
142 | console.log(
|
143 | chalk.green('√ ') +
|
144 | chalk.yellowBright('[koot/build] ') +
|
145 | __('build.complete', {
|
146 | time: new Date().toLocaleString()
|
147 | })
|
148 | );
|
149 |
|
150 | await after(kootConfig);
|
151 | if (!fromCommandStart) console.log(' ');
|
152 |
|
153 |
|
154 | };
|
155 |
|
156 | const after = async (config = {}) => {
|
157 | const ENV = process.env.WEBPACK_BUILD_ENV;
|
158 |
|
159 | const { dist } = config;
|
160 |
|
161 | if (ENV === 'prod') {
|
162 |
|
163 | await fs.remove(getDirTemp());
|
164 |
|
165 |
|
166 | }
|
167 |
|
168 |
|
169 | const fileBuilding = path.resolve(dist, filenameBuilding);
|
170 |
|
171 | if (fs.existsSync(fileBuilding)) await fs.remove(fileBuilding);
|
172 | };
|
173 |
|
174 | run().catch(err => {
|
175 | if (!isFromCommandStart())
|
176 | spinner(chalk.yellowBright('[koot/build] ')).fail();
|
177 |
|
178 | if (Array.isArray(result.errors) && result.errors.length) {
|
179 | result.errors.forEach(e => console.error(e));
|
180 | } else {
|
181 | console.error(err);
|
182 | }
|
183 |
|
184 | process.exit();
|
185 | });
|