xref: /expo/packages/@expo/config/src/Serialize.ts (revision feefc930)
1082815dcSEvan Baconimport { ConfigError } from './Errors';
2082815dcSEvan Bacon
3082815dcSEvan Baconexport function serializeAndEvaluate(val: any): any {
4082815dcSEvan Bacon  if (['undefined', 'string', 'boolean', 'number', 'bigint'].includes(typeof val)) {
5082815dcSEvan Bacon    return val;
6082815dcSEvan Bacon  } else if (typeof val === 'function') {
7082815dcSEvan Bacon    // TODO: Bacon: Should we support async methods?
8082815dcSEvan Bacon    return val();
9082815dcSEvan Bacon  } else if (Array.isArray(val)) {
10082815dcSEvan Bacon    return val.map(serializeAndEvaluate);
11082815dcSEvan Bacon  } else if (typeof val === 'object') {
12082815dcSEvan Bacon    const output: { [key: string]: any } = {};
13082815dcSEvan Bacon    for (const property in val) {
14082815dcSEvan Bacon      if (val.hasOwnProperty(property)) {
15082815dcSEvan Bacon        output[property] = serializeAndEvaluate(val[property]);
16082815dcSEvan Bacon      }
17082815dcSEvan Bacon    }
18082815dcSEvan Bacon    return output;
19082815dcSEvan Bacon  }
20082815dcSEvan Bacon  // symbol
21082815dcSEvan Bacon  throw new ConfigError(`Expo config doesn't support \`Symbols\`: ${val}`, 'INVALID_CONFIG');
22082815dcSEvan Bacon}
23082815dcSEvan Bacon
24082815dcSEvan Baconexport function serializeSkippingMods(val: any): any {
25082815dcSEvan Bacon  if (typeof val === 'object' && !Array.isArray(val)) {
26082815dcSEvan Bacon    const output: { [key: string]: any } = {};
27082815dcSEvan Bacon    for (const property in val) {
28082815dcSEvan Bacon      if (val.hasOwnProperty(property)) {
29082815dcSEvan Bacon        if (property === 'mods' || property === 'plugins') {
30082815dcSEvan Bacon          // Don't serialize mods or plugins
31082815dcSEvan Bacon          output[property] = val[property];
32082815dcSEvan Bacon        } else {
33082815dcSEvan Bacon          output[property] = serializeAndEvaluate(val[property]);
34082815dcSEvan Bacon        }
35082815dcSEvan Bacon      }
36082815dcSEvan Bacon    }
37082815dcSEvan Bacon    return output;
38082815dcSEvan Bacon  }
39082815dcSEvan Bacon  return serializeAndEvaluate(val);
40082815dcSEvan Bacon}
41082815dcSEvan Bacon
42082815dcSEvan Baconfunction serializeAndEvaluatePlugin(val: any): any {
43082815dcSEvan Bacon  if (['undefined', 'string', 'boolean', 'number', 'bigint'].includes(typeof val)) {
44082815dcSEvan Bacon    return val;
45082815dcSEvan Bacon  } else if (typeof val === 'function') {
46*feefc930SKudo Chien    return val.name || 'withAnonymous';
47082815dcSEvan Bacon  } else if (Array.isArray(val)) {
48082815dcSEvan Bacon    return val.map(serializeAndEvaluatePlugin);
49082815dcSEvan Bacon  } else if (typeof val === 'object') {
50082815dcSEvan Bacon    const output: { [key: string]: any } = {};
51082815dcSEvan Bacon    for (const property in val) {
52082815dcSEvan Bacon      if (val.hasOwnProperty(property)) {
53082815dcSEvan Bacon        output[property] = serializeAndEvaluatePlugin(val[property]);
54082815dcSEvan Bacon      }
55082815dcSEvan Bacon    }
56082815dcSEvan Bacon    return output;
57082815dcSEvan Bacon  }
58082815dcSEvan Bacon  // symbol
59082815dcSEvan Bacon  throw new ConfigError(`Expo config doesn't support \`Symbols\`: ${val}`, 'INVALID_CONFIG');
60082815dcSEvan Bacon}
61082815dcSEvan Bacon
62082815dcSEvan Baconexport function serializeAfterStaticPlugins(val: any): any {
63082815dcSEvan Bacon  if (typeof val === 'object' && !Array.isArray(val)) {
64082815dcSEvan Bacon    const output: { [key: string]: any } = {};
65082815dcSEvan Bacon    for (const property in val) {
66082815dcSEvan Bacon      if (val.hasOwnProperty(property)) {
67082815dcSEvan Bacon        if (property === 'mods') {
68082815dcSEvan Bacon          // Don't serialize mods
69082815dcSEvan Bacon          output[property] = val[property];
70082815dcSEvan Bacon        } else if (property === 'plugins' && Array.isArray(val[property])) {
71082815dcSEvan Bacon          // Serialize the mods by removing any config plugins
72082815dcSEvan Bacon          output[property] = val[property].map(serializeAndEvaluatePlugin);
73082815dcSEvan Bacon        } else {
74082815dcSEvan Bacon          output[property] = serializeAndEvaluate(val[property]);
75082815dcSEvan Bacon        }
76082815dcSEvan Bacon      }
77082815dcSEvan Bacon    }
78082815dcSEvan Bacon    return output;
79082815dcSEvan Bacon  }
80082815dcSEvan Bacon  return serializeAndEvaluate(val);
81082815dcSEvan Bacon}
82