-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
117 lines (93 loc) · 3.26 KB
/
index.js
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
// @flow
/**
* @module framework-config
*
* Version for internal tools (cli, builders).
*
* DO NOT use in client or server bundle.
*/
import fs from 'fs';
import path from 'path';
import mkdirp from 'mkdirp';
import { get, set } from 'lodash';
import Joi from '@hapi/joi';
import argv from '../../internals/rjs-argv';
import { resolveProject } from '../../internals/util/resolve-util';
import logger from '../../shared/logger';
import { FrameworkConfigStruct } from './framework-config-type';
const isCustomConfigFile = Boolean(argv.reworkrc);
const frameworkConfigFile = (argv.reworkrc && path.resolve(argv.reworkrc)) || resolveProject('.reworkrc');
/**
* Loads the .framework-config file and returns the config merged with defaults.
*/
function getUserConfig() {
if (!fs.existsSync(frameworkConfigFile)) {
if (isCustomConfigFile) {
logger.warn(`Configuration File ${frameworkConfigFile} does not exist`);
}
return {};
}
return JSON.parse(fs.readFileSync(frameworkConfigFile).toString());
}
function normalizeConfig(config: Object) {
const schema = Joi.object().keys({
routingType: Joi.string().valid('browser', 'hash').default('browser'),
routes: Joi.string().default('src/**/*.route.js'),
'entry-react': Joi.string().allow(null).default(null),
'render-html': Joi.string().allow(null).default(null),
'pre-init': Joi.string().allow(null).default(null),
'service-worker': Joi.string().allow(null).default(null),
directories: Joi.object().keys({
logs: Joi.string().default(Joi.ref('build')),
build: Joi.string().default('./.build'),
resources: Joi.string().default('./src/public'),
translations: Joi.string().default('./src/translations'),
}).default(),
hooks: Joi.object({
client: Joi.string().allow(null).default(null),
server: Joi.string().allow(null).default(null),
}).default(),
plugins: Joi.object().unknown(true).default(),
}).default();
const normalizedConfig = Joi.attempt(config, schema, `${frameworkConfigFile} is invalid`);
const fileEntries = [
'entry-react',
'render-html',
'pre-init',
'service-worker',
'directories.logs',
'directories.build',
'directories.resources',
'directories.translations',
];
const configDir = path.dirname(frameworkConfigFile);
for (const pathEntry of fileEntries) {
const val = get(normalizedConfig, pathEntry);
if (val == null) {
continue;
}
set(normalizedConfig, pathEntry, path.resolve(configDir, val));
}
ensureDirectories(normalizedConfig);
return normalizedConfig;
}
function ensureDirectories(config: FrameworkConfigStruct) {
for (const directoryName of Object.getOwnPropertyNames(config.directories)) {
const directory = config.directories[directoryName];
if (!isDirectory(directory)) {
logger.debug(`framework configuration: directories.${directoryName} value ${JSON.stringify(directory)} is not a directory. Creating it.`);
mkdirp.sync(config.directories[directoryName]);
}
}
}
function isDirectory(dir) {
try {
const stat = fs.statSync(dir);
return stat.isDirectory();
} catch (e) {
return false;
}
}
const config: FrameworkConfigStruct = normalizeConfig(getUserConfig());
config.filePath = frameworkConfigFile;
export default config;