-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
Recoil_RecoilEnv.js
95 lines (78 loc) · 2.33 KB
/
Recoil_RecoilEnv.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
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict
* @format
* @oncall recoil
*/
'use strict';
const err = require('./Recoil_err');
export type RecoilEnv = {
RECOIL_DUPLICATE_ATOM_KEY_CHECKING_ENABLED: boolean,
RECOIL_GKS_ENABLED: Set<string>,
};
const env: RecoilEnv = {
RECOIL_DUPLICATE_ATOM_KEY_CHECKING_ENABLED: true,
// Note: RECOIL_GKS_ENABLED settings will only be honored in OSS builds of Recoil
RECOIL_GKS_ENABLED: new Set([
'recoil_hamt_2020',
'recoil_sync_external_store',
'recoil_suppress_rerender_in_callback',
'recoil_memory_managament_2020',
]),
};
function readProcessEnvBooleanFlag(name: string, set: boolean => void) {
const sanitizedValue = process.env[name]?.toLowerCase()?.trim();
if (sanitizedValue == null || sanitizedValue === '') {
return;
}
const allowedValues = ['true', 'false'];
if (!allowedValues.includes(sanitizedValue)) {
throw err(
`process.env.${name} value must be 'true', 'false', or empty: ${sanitizedValue}`,
);
}
set(sanitizedValue === 'true');
}
function readProcessEnvStringArrayFlag(
name: string,
set: (Array<string>) => void,
) {
const sanitizedValue = process.env[name]?.trim();
if (sanitizedValue == null || sanitizedValue === '') {
return;
}
set(sanitizedValue.split(/\s*,\s*|\s+/));
}
/**
* Allow NodeJS/NextJS/etc to set the initial state through process.env variable
* Note: we don't assume 'process' is available in all runtime environments
*
* @see https://github.com/facebookexperimental/Recoil/issues/733
*/
function applyProcessEnvFlagOverrides() {
// note: this check is needed in addition to the check below, runtime error will occur without it!
// eslint-disable-next-line fb-www/typeof-undefined
if (typeof process === 'undefined') {
return;
}
if (process?.env == null) {
return;
}
readProcessEnvBooleanFlag(
'RECOIL_DUPLICATE_ATOM_KEY_CHECKING_ENABLED',
value => {
env.RECOIL_DUPLICATE_ATOM_KEY_CHECKING_ENABLED = value;
},
);
readProcessEnvStringArrayFlag('RECOIL_GKS_ENABLED', value => {
value.forEach(gk => {
env.RECOIL_GKS_ENABLED.add(gk);
});
});
}
applyProcessEnvFlagOverrides();
module.exports = env;