-
Notifications
You must be signed in to change notification settings - Fork 47
/
ProjectSettings.js
119 lines (103 loc) · 3.14 KB
/
ProjectSettings.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
118
119
/**
* @flow
*/
import _ from 'lodash';
import JsonFile from '@expo/json-file';
import fs from 'fs';
import mkdirp from 'mkdirp';
import path from 'path';
let projectSettingsFile = 'settings.json';
let projectSettingsDefaults = {
hostType: 'lan',
lanType: 'ip',
dev: true,
minify: false,
urlRandomness: null,
};
let packagerInfoFile = 'packager-info.json';
function projectSettingsJsonFile(projectRoot: string, filename: string) {
return new JsonFile(path.join(dotExpoProjectDirectory(projectRoot), filename));
}
export async function readAsync(projectRoot: string) {
let projectSettings;
try {
projectSettings = await projectSettingsJsonFile(projectRoot, projectSettingsFile).readAsync();
} catch (e) {
projectSettings = await projectSettingsJsonFile(projectRoot, projectSettingsFile).writeAsync(
projectSettingsDefaults
);
}
if (projectSettings.hostType === 'ngrok') {
// 'ngrok' is deprecated
projectSettings.hostType = 'tunnel';
}
if (projectSettings.urlType) {
// urlType is deprecated as a project setting
delete projectSettings.urlType;
}
if ('strict' in projectSettings) {
// strict mode is not supported at the moment
delete projectSettings.strict;
}
// Set defaults for any missing fields
_.defaults(projectSettings, projectSettingsDefaults);
return projectSettings;
}
export async function setAsync(projectRoot: string, json: any) {
try {
return await projectSettingsJsonFile(projectRoot, projectSettingsFile).mergeAsync(json, {
cantReadFileDefault: projectSettingsDefaults,
});
} catch (e) {
return await projectSettingsJsonFile(projectRoot, projectSettingsFile).writeAsync(
_.defaults(json, projectSettingsDefaults)
);
}
}
export async function readPackagerInfoAsync(projectRoot: string) {
try {
return await projectSettingsJsonFile(projectRoot, packagerInfoFile).readAsync({
cantReadFileDefault: {},
});
} catch (e) {
return await projectSettingsJsonFile(projectRoot, packagerInfoFile).writeAsync({});
}
}
export async function setPackagerInfoAsync(projectRoot: string, json: any) {
try {
return await projectSettingsJsonFile(projectRoot, packagerInfoFile).mergeAsync(json, {
cantReadFileDefault: {},
});
} catch (e) {
return await projectSettingsJsonFile(projectRoot, packagerInfoFile).writeAsync(json);
}
}
export function dotExpoProjectDirectory(projectRoot: string) {
let dirPath = path.join(projectRoot, '.expo');
try {
// move .exponent to .expo
let oldDirPath = path.join(projectRoot, '.exponent');
if (fs.statSync(oldDirPath).isDirectory()) {
fs.renameSync(oldDirPath, dirPath);
}
} catch (e) {
// no old directory, continue
}
mkdirp.sync(dirPath);
return dirPath;
}
export function dotExpoProjectDirectoryExists(projectRoot: string) {
let dirPath = path.join(projectRoot, '.expo');
try {
if (fs.statSync(dirPath).isDirectory()) {
return true;
}
} catch (e) {
// file doesn't exist
}
return false;
}
export async function getPackagerOptsAsync(projectRoot: string) {
let projectSettings = await readAsync(projectRoot);
return projectSettings;
}