react-native-config-ultimate 0.0.7 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/gradle.properties +6 -0
- package/android/rnuc.yaml +1 -0
- package/lib/commonjs/NativeUltimateConfig.js +20 -0
- package/lib/commonjs/NativeUltimateConfig.js.map +1 -0
- package/lib/commonjs/bin.spec.js +50 -0
- package/lib/commonjs/bin.spec.js.map +1 -0
- package/lib/commonjs/cli.js +143 -0
- package/lib/commonjs/cli.js.map +1 -0
- package/lib/commonjs/cli.spec.js +190 -0
- package/lib/commonjs/cli.spec.js.map +1 -0
- package/lib/commonjs/flatten.js +23 -0
- package/lib/commonjs/flatten.js.map +1 -0
- package/lib/commonjs/flatten.spec.js +32 -0
- package/lib/commonjs/flatten.spec.js.map +1 -0
- package/lib/commonjs/index.js +34 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/load-env.js +86 -0
- package/lib/commonjs/load-env.js.map +1 -0
- package/lib/commonjs/load-env.spec.js +257 -0
- package/lib/commonjs/load-env.spec.js.map +1 -0
- package/lib/commonjs/main.js +36 -0
- package/lib/commonjs/main.js.map +1 -0
- package/lib/commonjs/main.spec.js +228 -0
- package/lib/commonjs/main.spec.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/render-env.js +90 -0
- package/lib/commonjs/render-env.js.map +1 -0
- package/lib/commonjs/render-env.spec.js +397 -0
- package/lib/commonjs/render-env.spec.js.map +1 -0
- package/lib/commonjs/resolve-env.js +30 -0
- package/lib/commonjs/resolve-env.js.map +1 -0
- package/lib/commonjs/resolve-env.spec.js +31 -0
- package/lib/commonjs/resolve-env.spec.js.map +1 -0
- package/lib/commonjs/templates/ConfigValues.h.handlebars +24 -0
- package/lib/commonjs/templates/index.d.ts.handlebars +18 -0
- package/lib/commonjs/templates/index.web.js.handlebars +1 -0
- package/lib/commonjs/templates/override.js.handlebars +16 -0
- package/lib/commonjs/templates/rncu.xcconfig.handlebars +4 -0
- package/lib/commonjs/templates/rncu.yaml.handlebars +7 -0
- package/lib/commonjs/validate-env.js +63 -0
- package/lib/commonjs/validate-env.js.map +1 -0
- package/lib/commonjs/validate-env.spec.js +325 -0
- package/lib/commonjs/validate-env.spec.js.map +1 -0
- package/lib/commonjs/write-env.js +80 -0
- package/lib/commonjs/write-env.js.map +1 -0
- package/lib/commonjs/write-env.spec.js +115 -0
- package/lib/commonjs/write-env.spec.js.map +1 -0
- package/lib/module/NativeUltimateConfig.js +16 -0
- package/lib/module/NativeUltimateConfig.js.map +1 -0
- package/lib/module/bin.spec.js +49 -0
- package/lib/module/bin.spec.js.map +1 -0
- package/lib/module/cli.js +136 -0
- package/lib/module/cli.js.map +1 -0
- package/lib/module/cli.spec.js +190 -0
- package/lib/module/cli.spec.js.map +1 -0
- package/lib/module/flatten.js +18 -0
- package/lib/module/flatten.js.map +1 -0
- package/lib/module/flatten.spec.js +31 -0
- package/lib/module/flatten.spec.js.map +1 -0
- package/lib/module/index.js +30 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/load-env.js +81 -0
- package/lib/module/load-env.js.map +1 -0
- package/lib/module/load-env.spec.js +257 -0
- package/lib/module/load-env.spec.js.map +1 -0
- package/lib/module/main.js +31 -0
- package/lib/module/main.js.map +1 -0
- package/lib/module/main.spec.js +224 -0
- package/lib/module/main.spec.js.map +1 -0
- package/lib/module/render-env.js +84 -0
- package/lib/module/render-env.js.map +1 -0
- package/lib/module/render-env.spec.js +396 -0
- package/lib/module/render-env.spec.js.map +1 -0
- package/lib/module/resolve-env.js +26 -0
- package/lib/module/resolve-env.js.map +1 -0
- package/lib/module/resolve-env.spec.js +30 -0
- package/lib/module/resolve-env.spec.js.map +1 -0
- package/lib/module/templates/ConfigValues.h.handlebars +24 -0
- package/lib/module/templates/index.d.ts.handlebars +18 -0
- package/lib/module/templates/index.web.js.handlebars +1 -0
- package/lib/module/templates/override.js.handlebars +16 -0
- package/lib/module/templates/rncu.xcconfig.handlebars +4 -0
- package/lib/module/templates/rncu.yaml.handlebars +7 -0
- package/lib/module/validate-env.js +59 -0
- package/lib/module/validate-env.js.map +1 -0
- package/lib/module/validate-env.spec.js +325 -0
- package/lib/module/validate-env.spec.js.map +1 -0
- package/lib/module/write-env.js +75 -0
- package/lib/module/write-env.js.map +1 -0
- package/lib/module/write-env.spec.js +115 -0
- package/lib/module/write-env.spec.js.map +1 -0
- package/lib/typescript/src/NativeUltimateConfig.d.ts +18 -0
- package/lib/typescript/src/NativeUltimateConfig.d.ts.map +1 -0
- package/lib/typescript/src/bin.spec.d.ts +2 -0
- package/lib/typescript/src/bin.spec.d.ts.map +1 -0
- package/lib/typescript/src/cli.d.ts +2 -0
- package/lib/typescript/src/cli.d.ts.map +1 -0
- package/lib/typescript/src/cli.spec.d.ts +14 -0
- package/lib/typescript/src/cli.spec.d.ts.map +1 -0
- package/lib/typescript/src/flatten.d.ts +8 -0
- package/lib/typescript/src/flatten.d.ts.map +1 -0
- package/lib/typescript/src/flatten.spec.d.ts +2 -0
- package/lib/typescript/src/flatten.spec.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +6 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/load-env.d.ts +23 -0
- package/lib/typescript/src/load-env.d.ts.map +1 -0
- package/lib/typescript/src/load-env.spec.d.ts +6 -0
- package/lib/typescript/src/load-env.spec.d.ts.map +1 -0
- package/lib/typescript/src/main.d.ts +12 -0
- package/lib/typescript/src/main.d.ts.map +1 -0
- package/lib/typescript/src/main.spec.d.ts +2 -0
- package/lib/typescript/src/main.spec.d.ts.map +1 -0
- package/lib/typescript/src/render-env.d.ts +11 -0
- package/lib/typescript/src/render-env.d.ts.map +1 -0
- package/lib/typescript/src/render-env.spec.d.ts +2 -0
- package/lib/typescript/src/render-env.spec.d.ts.map +1 -0
- package/lib/typescript/src/resolve-env.d.ts +35 -0
- package/lib/typescript/src/resolve-env.d.ts.map +1 -0
- package/lib/typescript/src/resolve-env.spec.d.ts +2 -0
- package/lib/typescript/src/resolve-env.spec.d.ts.map +1 -0
- package/lib/typescript/src/validate-env.d.ts +10 -0
- package/lib/typescript/src/validate-env.d.ts.map +1 -0
- package/lib/typescript/src/validate-env.spec.d.ts +2 -0
- package/lib/typescript/src/validate-env.spec.d.ts.map +1 -0
- package/lib/typescript/src/write-env.d.ts +13 -0
- package/lib/typescript/src/write-env.d.ts.map +1 -0
- package/lib/typescript/src/write-env.spec.d.ts +9 -0
- package/lib/typescript/src/write-env.spec.d.ts.map +1 -0
- package/package.json +84 -52
- package/src/NativeUltimateConfig.ts +1 -2
- package/src/cli.ts +158 -0
- package/src/flatten.ts +26 -0
- package/src/index.ts +37 -0
- package/src/load-env.ts +81 -0
- package/src/main.ts +39 -0
- package/src/render-env.ts +111 -0
- package/src/resolve-env.ts +45 -0
- package/src/validate-env.ts +71 -0
- package/src/write-env.ts +74 -0
- package/bin.js +0 -5
- package/index.js +0 -28
- package/override.js +0 -1
- package/src/NativeUltimateConfig.js +0 -4
- package/src/cli.js +0 -176
- package/src/flatten.js +0 -22
- package/src/load-env.js +0 -107
- package/src/main.js +0 -34
- package/src/render-env.js +0 -113
- package/src/resolve-env.js +0 -12
- package/src/validate-env.js +0 -59
- package/src/write-env.js +0 -102
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import render_env from './render-env';
|
|
6
|
+
|
|
7
|
+
// We need to mock fs for some tests, but test helpers with real handlebars
|
|
8
|
+
jest.mock('fs', () => ({
|
|
9
|
+
...jest.requireActual('fs'),
|
|
10
|
+
existsSync: jest.fn(),
|
|
11
|
+
readFileSync: jest.fn()
|
|
12
|
+
}));
|
|
13
|
+
const mock_exists_sync = fs.existsSync;
|
|
14
|
+
const mock_read_file_sync = fs.readFileSync;
|
|
15
|
+
describe('render-env', () => {
|
|
16
|
+
const project_root = '/project';
|
|
17
|
+
const lib_root = '/project/node_modules/react-native-config-ultimate';
|
|
18
|
+
const sample_env = {
|
|
19
|
+
ios: {
|
|
20
|
+
API_URL: 'https://api.com',
|
|
21
|
+
DEBUG: true,
|
|
22
|
+
PORT: 3000
|
|
23
|
+
},
|
|
24
|
+
android: {
|
|
25
|
+
API_URL: 'https://api.com',
|
|
26
|
+
DEBUG: true,
|
|
27
|
+
PORT: 3000
|
|
28
|
+
},
|
|
29
|
+
web: {
|
|
30
|
+
API_URL: 'https://api.com',
|
|
31
|
+
DEBUG: true,
|
|
32
|
+
PORT: 3000
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
beforeEach(() => {
|
|
36
|
+
mock_exists_sync.mockReset();
|
|
37
|
+
mock_read_file_sync.mockReset();
|
|
38
|
+
|
|
39
|
+
// Default: ios folder exists
|
|
40
|
+
mock_exists_sync.mockImplementation(p => {
|
|
41
|
+
const path_str = p.toString();
|
|
42
|
+
// ios folder exists
|
|
43
|
+
if (path_str === path.join(project_root, 'ios')) return true;
|
|
44
|
+
// template files exist (use real fs for templates)
|
|
45
|
+
if (path_str.includes('templates')) {
|
|
46
|
+
return jest.requireActual('fs').existsSync(p);
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// For templates, use real fs
|
|
52
|
+
mock_read_file_sync.mockImplementation((p, options) => {
|
|
53
|
+
const path_str = p.toString();
|
|
54
|
+
if (path_str.includes('templates')) {
|
|
55
|
+
return jest.requireActual('fs').readFileSync(p, options);
|
|
56
|
+
}
|
|
57
|
+
return 'mocked content';
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe('file generation', () => {
|
|
61
|
+
it('generates index.d.ts in lib root', () => {
|
|
62
|
+
const result = render_env(project_root, lib_root, sample_env);
|
|
63
|
+
const expected_path = path.join(lib_root, 'index.d.ts');
|
|
64
|
+
expect(result[expected_path]).toBeDefined();
|
|
65
|
+
});
|
|
66
|
+
it('generates index.web.js in lib root', () => {
|
|
67
|
+
const result = render_env(project_root, lib_root, sample_env);
|
|
68
|
+
const expected_path = path.join(lib_root, 'index.web.js');
|
|
69
|
+
expect(result[expected_path]).toBeDefined();
|
|
70
|
+
});
|
|
71
|
+
it('generates ConfigValues.h in ios folder', () => {
|
|
72
|
+
const result = render_env(project_root, lib_root, sample_env);
|
|
73
|
+
const expected_path = path.join(lib_root, 'ios', 'ConfigValues.h');
|
|
74
|
+
expect(result[expected_path]).toBeDefined();
|
|
75
|
+
});
|
|
76
|
+
it('generates rncu.yaml in android folder', () => {
|
|
77
|
+
const result = render_env(project_root, lib_root, sample_env);
|
|
78
|
+
const expected_path = path.join(lib_root, 'android', 'rncu.yaml');
|
|
79
|
+
expect(result[expected_path]).toBeDefined();
|
|
80
|
+
});
|
|
81
|
+
it('generates rncu.xcconfig in project ios folder when it exists', () => {
|
|
82
|
+
const result = render_env(project_root, lib_root, sample_env);
|
|
83
|
+
const expected_path = path.join(project_root, 'ios', 'rncu.xcconfig');
|
|
84
|
+
expect(result[expected_path]).toBeDefined();
|
|
85
|
+
});
|
|
86
|
+
it('does NOT generate rncu.xcconfig when project has no ios folder', () => {
|
|
87
|
+
mock_exists_sync.mockImplementation(p => {
|
|
88
|
+
const path_str = p.toString();
|
|
89
|
+
// ios folder does NOT exist
|
|
90
|
+
if (path_str === path.join(project_root, 'ios')) return false;
|
|
91
|
+
// template files exist (use real fs for templates)
|
|
92
|
+
if (path_str.includes('templates')) {
|
|
93
|
+
return jest.requireActual('fs').existsSync(p);
|
|
94
|
+
}
|
|
95
|
+
return false;
|
|
96
|
+
});
|
|
97
|
+
const result = render_env(project_root, lib_root, sample_env);
|
|
98
|
+
const xcconfig_path = path.join(project_root, 'ios', 'rncu.xcconfig');
|
|
99
|
+
expect(result[xcconfig_path]).toBeUndefined();
|
|
100
|
+
});
|
|
101
|
+
it('generates override.js in lib root', () => {
|
|
102
|
+
const result = render_env(project_root, lib_root, sample_env);
|
|
103
|
+
const expected_path = path.join(lib_root, 'override.js');
|
|
104
|
+
expect(result[expected_path]).toBeDefined();
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
describe('js_override RC option', () => {
|
|
108
|
+
it('passes empty objects to override.js when js_override is false', () => {
|
|
109
|
+
const result = render_env(project_root, lib_root, sample_env, {
|
|
110
|
+
js_override: false
|
|
111
|
+
});
|
|
112
|
+
const override_path = path.join(lib_root, 'override.js');
|
|
113
|
+
const content = result[override_path];
|
|
114
|
+
|
|
115
|
+
// The override.js template uses IOS_DATA and ANDROID_DATA variables
|
|
116
|
+
expect(content).toContain('IOS_DATA = {}');
|
|
117
|
+
expect(content).toContain('ANDROID_DATA = {}');
|
|
118
|
+
});
|
|
119
|
+
it('passes empty objects to override.js when js_override is undefined', () => {
|
|
120
|
+
const result = render_env(project_root, lib_root, sample_env, undefined);
|
|
121
|
+
const override_path = path.join(lib_root, 'override.js');
|
|
122
|
+
const content = result[override_path];
|
|
123
|
+
expect(content).toContain('IOS_DATA = {}');
|
|
124
|
+
expect(content).toContain('ANDROID_DATA = {}');
|
|
125
|
+
});
|
|
126
|
+
it('passes full env to override.js when js_override is true', () => {
|
|
127
|
+
const result = render_env(project_root, lib_root, sample_env, {
|
|
128
|
+
js_override: true
|
|
129
|
+
});
|
|
130
|
+
const override_path = path.join(lib_root, 'override.js');
|
|
131
|
+
const content = result[override_path];
|
|
132
|
+
|
|
133
|
+
// Should contain actual env values
|
|
134
|
+
expect(content).toContain('API_URL');
|
|
135
|
+
expect(content).toContain('https://api.com');
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
describe('template content', () => {
|
|
139
|
+
it('index.d.ts contains type declarations for ios env keys', () => {
|
|
140
|
+
const result = render_env(project_root, lib_root, sample_env);
|
|
141
|
+
const content = result[path.join(lib_root, 'index.d.ts')];
|
|
142
|
+
expect(content).toContain('API_URL');
|
|
143
|
+
expect(content).toContain('DEBUG');
|
|
144
|
+
expect(content).toContain('PORT');
|
|
145
|
+
});
|
|
146
|
+
it('index.web.js contains web env values', () => {
|
|
147
|
+
const result = render_env(project_root, lib_root, sample_env);
|
|
148
|
+
const content = result[path.join(lib_root, 'index.web.js')];
|
|
149
|
+
expect(content).toContain('API_URL');
|
|
150
|
+
expect(content).toContain('https://api.com');
|
|
151
|
+
});
|
|
152
|
+
it('rncu.yaml contains android env values', () => {
|
|
153
|
+
const result = render_env(project_root, lib_root, sample_env);
|
|
154
|
+
const content = result[path.join(lib_root, 'android', 'rncu.yaml')];
|
|
155
|
+
expect(content).toContain('API_URL');
|
|
156
|
+
});
|
|
157
|
+
it('rncu.xcconfig contains ios env values with xcconfig escaping', () => {
|
|
158
|
+
const result = render_env(project_root, lib_root, sample_env);
|
|
159
|
+
const content = result[path.join(project_root, 'ios', 'rncu.xcconfig')];
|
|
160
|
+
|
|
161
|
+
// xcconfig escapes // to /$()/
|
|
162
|
+
expect(content).toContain('API_URL');
|
|
163
|
+
expect(content).toContain('/$()/'); // https:// becomes https:/$()/
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
describe('handlebars helpers (via template output)', () => {
|
|
168
|
+
// Test helpers indirectly through actual rendered output
|
|
169
|
+
const project_root = '/project';
|
|
170
|
+
const lib_root = '/project/node_modules/react-native-config-ultimate';
|
|
171
|
+
beforeEach(() => {
|
|
172
|
+
mock_exists_sync.mockImplementation(p => {
|
|
173
|
+
const path_str = p.toString();
|
|
174
|
+
if (path_str === path.join(project_root, 'ios')) return true;
|
|
175
|
+
if (path_str.includes('templates')) {
|
|
176
|
+
return jest.requireActual('fs').existsSync(p);
|
|
177
|
+
}
|
|
178
|
+
return false;
|
|
179
|
+
});
|
|
180
|
+
mock_read_file_sync.mockImplementation((p, options) => {
|
|
181
|
+
const path_str = p.toString();
|
|
182
|
+
if (path_str.includes('templates')) {
|
|
183
|
+
return jest.requireActual('fs').readFileSync(p, options);
|
|
184
|
+
}
|
|
185
|
+
return 'mocked content';
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
describe('escape helper', () => {
|
|
189
|
+
it('escapes backslashes in string values', () => {
|
|
190
|
+
const env = {
|
|
191
|
+
ios: {
|
|
192
|
+
PATH: 'C:\\Users\\test'
|
|
193
|
+
},
|
|
194
|
+
android: {
|
|
195
|
+
PATH: 'C:\\Users\\test'
|
|
196
|
+
},
|
|
197
|
+
web: {
|
|
198
|
+
PATH: 'C:\\Users\\test'
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
const result = render_env(project_root, lib_root, env);
|
|
202
|
+
const content = result[path.join(lib_root, 'index.web.js')];
|
|
203
|
+
|
|
204
|
+
// Backslashes should be escaped
|
|
205
|
+
expect(content).toContain('\\\\');
|
|
206
|
+
});
|
|
207
|
+
it('escapes double quotes in string values', () => {
|
|
208
|
+
const env = {
|
|
209
|
+
ios: {
|
|
210
|
+
MSG: 'say "hello"'
|
|
211
|
+
},
|
|
212
|
+
android: {
|
|
213
|
+
MSG: 'say "hello"'
|
|
214
|
+
},
|
|
215
|
+
web: {
|
|
216
|
+
MSG: 'say "hello"'
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
const result = render_env(project_root, lib_root, env);
|
|
220
|
+
const content = result[path.join(lib_root, 'index.web.js')];
|
|
221
|
+
|
|
222
|
+
// Quotes should be escaped
|
|
223
|
+
expect(content).toContain('\\"');
|
|
224
|
+
});
|
|
225
|
+
it('escapes newlines in string values', () => {
|
|
226
|
+
const env = {
|
|
227
|
+
ios: {
|
|
228
|
+
MSG: 'line1\nline2'
|
|
229
|
+
},
|
|
230
|
+
android: {
|
|
231
|
+
MSG: 'line1\nline2'
|
|
232
|
+
},
|
|
233
|
+
web: {
|
|
234
|
+
MSG: 'line1\nline2'
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
const result = render_env(project_root, lib_root, env);
|
|
238
|
+
const content = result[path.join(lib_root, 'index.web.js')];
|
|
239
|
+
|
|
240
|
+
// Newlines should be escaped as \\n
|
|
241
|
+
expect(content).toContain('\\n');
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
describe('xcconfig_format helper', () => {
|
|
245
|
+
it('escapes // in URLs for xcconfig compatibility', () => {
|
|
246
|
+
const env = {
|
|
247
|
+
ios: {
|
|
248
|
+
URL: 'https://example.com/path//double'
|
|
249
|
+
},
|
|
250
|
+
android: {
|
|
251
|
+
URL: 'https://example.com'
|
|
252
|
+
},
|
|
253
|
+
web: {
|
|
254
|
+
URL: 'https://example.com'
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
const result = render_env(project_root, lib_root, env);
|
|
258
|
+
const content = result[path.join(project_root, 'ios', 'rncu.xcconfig')];
|
|
259
|
+
|
|
260
|
+
// // should become /$()/ in xcconfig
|
|
261
|
+
expect(content).toContain('/$()');
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
describe('type helpers', () => {
|
|
265
|
+
it('handles boolean values correctly', () => {
|
|
266
|
+
const env = {
|
|
267
|
+
ios: {
|
|
268
|
+
ENABLED: true,
|
|
269
|
+
DISABLED: false
|
|
270
|
+
},
|
|
271
|
+
android: {
|
|
272
|
+
ENABLED: true,
|
|
273
|
+
DISABLED: false
|
|
274
|
+
},
|
|
275
|
+
web: {
|
|
276
|
+
ENABLED: true,
|
|
277
|
+
DISABLED: false
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
const result = render_env(project_root, lib_root, env);
|
|
281
|
+
const content = result[path.join(lib_root, 'index.web.js')];
|
|
282
|
+
|
|
283
|
+
// Booleans should be rendered as true/false not "true"/"false"
|
|
284
|
+
expect(content).toMatch(/ENABLED.*true/);
|
|
285
|
+
expect(content).toMatch(/DISABLED.*false/);
|
|
286
|
+
});
|
|
287
|
+
it('handles number values correctly', () => {
|
|
288
|
+
const env = {
|
|
289
|
+
ios: {
|
|
290
|
+
PORT: 3000,
|
|
291
|
+
FLOAT: 3.14
|
|
292
|
+
},
|
|
293
|
+
android: {
|
|
294
|
+
PORT: 3000,
|
|
295
|
+
FLOAT: 3.14
|
|
296
|
+
},
|
|
297
|
+
web: {
|
|
298
|
+
PORT: 3000,
|
|
299
|
+
FLOAT: 3.14
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
const result = render_env(project_root, lib_root, env);
|
|
303
|
+
const content = result[path.join(lib_root, 'index.web.js')];
|
|
304
|
+
|
|
305
|
+
// Numbers should be rendered as numbers not strings
|
|
306
|
+
expect(content).toMatch(/PORT.*3000/);
|
|
307
|
+
expect(content).toMatch(/FLOAT.*3\.14/);
|
|
308
|
+
});
|
|
309
|
+
it('handles string values correctly', () => {
|
|
310
|
+
const env = {
|
|
311
|
+
ios: {
|
|
312
|
+
NAME: 'test-app'
|
|
313
|
+
},
|
|
314
|
+
android: {
|
|
315
|
+
NAME: 'test-app'
|
|
316
|
+
},
|
|
317
|
+
web: {
|
|
318
|
+
NAME: 'test-app'
|
|
319
|
+
}
|
|
320
|
+
};
|
|
321
|
+
const result = render_env(project_root, lib_root, env);
|
|
322
|
+
const content = result[path.join(lib_root, 'index.web.js')];
|
|
323
|
+
|
|
324
|
+
// Strings should be quoted
|
|
325
|
+
expect(content).toContain('"test-app"');
|
|
326
|
+
});
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
describe('template caching', () => {
|
|
330
|
+
const project_root = '/project';
|
|
331
|
+
const lib_root = '/project/node_modules/react-native-config-ultimate';
|
|
332
|
+
const sample_env = {
|
|
333
|
+
ios: {
|
|
334
|
+
KEY: 'value'
|
|
335
|
+
},
|
|
336
|
+
android: {
|
|
337
|
+
KEY: 'value'
|
|
338
|
+
},
|
|
339
|
+
web: {
|
|
340
|
+
KEY: 'value'
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
beforeEach(() => {
|
|
344
|
+
mock_exists_sync.mockImplementation(p => {
|
|
345
|
+
const path_str = p.toString();
|
|
346
|
+
if (path_str === path.join(project_root, 'ios')) return true;
|
|
347
|
+
if (path_str.includes('templates')) {
|
|
348
|
+
return jest.requireActual('fs').existsSync(p);
|
|
349
|
+
}
|
|
350
|
+
return false;
|
|
351
|
+
});
|
|
352
|
+
mock_read_file_sync.mockImplementation((p, options) => {
|
|
353
|
+
const path_str = p.toString();
|
|
354
|
+
if (path_str.includes('templates')) {
|
|
355
|
+
return jest.requireActual('fs').readFileSync(p, options);
|
|
356
|
+
}
|
|
357
|
+
return 'mocked content';
|
|
358
|
+
});
|
|
359
|
+
});
|
|
360
|
+
it('produces consistent output across multiple calls', () => {
|
|
361
|
+
const result1 = render_env(project_root, lib_root, sample_env);
|
|
362
|
+
const result2 = render_env(project_root, lib_root, sample_env);
|
|
363
|
+
|
|
364
|
+
// Same input should produce same output
|
|
365
|
+
expect(result1).toEqual(result2);
|
|
366
|
+
});
|
|
367
|
+
it('produces different output for different env values', () => {
|
|
368
|
+
const env1 = {
|
|
369
|
+
ios: {
|
|
370
|
+
A: 1
|
|
371
|
+
},
|
|
372
|
+
android: {
|
|
373
|
+
A: 1
|
|
374
|
+
},
|
|
375
|
+
web: {
|
|
376
|
+
A: 1
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
const env2 = {
|
|
380
|
+
ios: {
|
|
381
|
+
B: 2
|
|
382
|
+
},
|
|
383
|
+
android: {
|
|
384
|
+
B: 2
|
|
385
|
+
},
|
|
386
|
+
web: {
|
|
387
|
+
B: 2
|
|
388
|
+
}
|
|
389
|
+
};
|
|
390
|
+
const result1 = render_env(project_root, lib_root, env1);
|
|
391
|
+
const result2 = render_env(project_root, lib_root, env2);
|
|
392
|
+
const key = path.join(lib_root, 'index.d.ts');
|
|
393
|
+
expect(result1[key]).not.toEqual(result2[key]);
|
|
394
|
+
});
|
|
395
|
+
});
|
|
396
|
+
//# sourceMappingURL=render-env.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["path","fs","render_env","jest","mock","requireActual","existsSync","fn","readFileSync","mock_exists_sync","mock_read_file_sync","describe","project_root","lib_root","sample_env","ios","API_URL","DEBUG","PORT","android","web","beforeEach","mockReset","mockImplementation","p","path_str","toString","join","includes","options","it","result","expected_path","expect","toBeDefined","xcconfig_path","toBeUndefined","js_override","override_path","content","toContain","undefined","env","PATH","MSG","URL","ENABLED","DISABLED","toMatch","FLOAT","NAME","KEY","result1","result2","toEqual","env1","A","env2","B","key","not"],"sourceRoot":"../../src","sources":["render-env.spec.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Schema definition for a single environment variable.
|
|
5
|
+
* Used in `.rncurc.js` to validate env vars at build time.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* module.exports = {
|
|
9
|
+
* schema: {
|
|
10
|
+
* API_URL: { type: 'string', required: true },
|
|
11
|
+
* TIMEOUT_MS: { type: 'number', required: true },
|
|
12
|
+
* DEBUG: { type: 'boolean', required: false },
|
|
13
|
+
* ENV_NAME: { type: 'string', required: true, pattern: '^(dev|staging|prod)$' },
|
|
14
|
+
* }
|
|
15
|
+
* };
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export default async function resolve_env(env, rc) {
|
|
19
|
+
if (rc && rc.on_env) {
|
|
20
|
+
const patched_env = await rc.on_env(env);
|
|
21
|
+
return typeof patched_env === 'undefined' ? env : patched_env;
|
|
22
|
+
} else {
|
|
23
|
+
return env;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=resolve-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["resolve_env","env","rc","on_env","patched_env"],"sourceRoot":"../../src","sources":["resolve-env.ts"],"mappings":";;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAsBA,eAAe,eAAeA,WAAWA,CAACC,GAAY,EAAEC,EAAO,EAAoB;EACjF,IAAIA,EAAE,IAAIA,EAAE,CAACC,MAAM,EAAE;IACnB,MAAMC,WAAW,GAAG,MAAMF,EAAE,CAACC,MAAM,CAACF,GAAG,CAAC;IACxC,OAAO,OAAOG,WAAW,KAAK,WAAW,GAAGH,GAAG,GAAIG,WAAuB;EAC5E,CAAC,MAAM;IACL,OAAOH,GAAG;EACZ;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import resolve_env from './resolve-env';
|
|
4
|
+
describe('resolve_env', () => {
|
|
5
|
+
const original = {
|
|
6
|
+
original: 'data'
|
|
7
|
+
};
|
|
8
|
+
it.each`
|
|
9
|
+
on_env_result | expected
|
|
10
|
+
${1} | ${1}
|
|
11
|
+
${''} | ${''}
|
|
12
|
+
${'hello'} | ${'hello'}
|
|
13
|
+
${0} | ${0}
|
|
14
|
+
${1} | ${1}
|
|
15
|
+
${false} | ${false}
|
|
16
|
+
${true} | ${true}
|
|
17
|
+
${null} | ${null}
|
|
18
|
+
${undefined} | ${original}
|
|
19
|
+
`("when hook returns '$on_env_result' env is resolved to '$expected'", async ({
|
|
20
|
+
on_env_result,
|
|
21
|
+
expected
|
|
22
|
+
}) => {
|
|
23
|
+
const on_env = jest.fn();
|
|
24
|
+
on_env.mockReturnValueOnce(on_env_result);
|
|
25
|
+
expect(await resolve_env(original, {
|
|
26
|
+
on_env
|
|
27
|
+
})).toEqual(expected);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=resolve-env.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["resolve_env","describe","original","it","each","undefined","on_env_result","expected","on_env","jest","fn","mockReturnValueOnce","expect","toEqual"],"sourceRoot":"../../src","sources":["resolve-env.spec.ts"],"mappings":";;AAAA,OAAOA,WAAW,MAAM,eAAe;AAGvCC,QAAQ,CAAC,aAAa,EAAE,MAAM;EAC5B,MAAMC,QAAiB,GAAG;IAAEA,QAAQ,EAAE;EAAO,CAAC;EAC9CC,EAAE,CAACC,IAAI;AACT;AACA,MAAM,CAAC,eAAe,CAAC;AACvB,MAAM,EAAE,cAAc,EAAE;AACxB,MAAM,OAAO,SAAS,OAAO;AAC7B,MAAM,CAAC,eAAe,CAAC;AACvB,MAAM,CAAC,eAAe,CAAC;AACvB,MAAM,KAAK,WAAW,KAAK;AAC3B,MAAM,IAAI,YAAY,IAAI;AAC1B,MAAM,IAAI,YAAY,IAAI;AAC1B,MAAMC,SAAS,OAAOH,QAAQ;AAC9B,GAAG,CACC,mEAAmE,EACnE,OAAO;IAAEI,aAAa;IAAEC;EAAwD,CAAC,KAAK;IACpF,MAAMC,MAAM,GAAGC,IAAI,CAACC,EAAE,CAAC,CAAC;IACxBF,MAAM,CAACG,mBAAmB,CAACL,aAAa,CAAC;IACzCM,MAAM,CAAC,MAAMZ,WAAW,CAACE,QAAQ,EAAE;MAAEM;IAAO,CAAC,CAAC,CAAC,CAACK,OAAO,CAACN,QAAQ,CAAC;EACnE,CACF,CAAC;AACH,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// DO NOT COMMIT OR EDIT THIS FILE
|
|
2
|
+
{{#each @root}}
|
|
3
|
+
{{#if (isString this)}}
|
|
4
|
+
#define {{@key}} @"{{{escape this}}}"
|
|
5
|
+
{{/if}}
|
|
6
|
+
{{#if (isBoolean this)}}
|
|
7
|
+
{{#if this}}
|
|
8
|
+
#define {{@key}} @(YES)
|
|
9
|
+
{{else}}
|
|
10
|
+
#define {{@key}} @(NO)
|
|
11
|
+
{{/if}}
|
|
12
|
+
{{/if}}
|
|
13
|
+
{{#if (isNumber this)}}
|
|
14
|
+
#define {{@key}} @({{{this}}})
|
|
15
|
+
{{/if}}
|
|
16
|
+
{{/each}}
|
|
17
|
+
|
|
18
|
+
static NSDictionary *getValues() {
|
|
19
|
+
return @{
|
|
20
|
+
{{#each @root}}
|
|
21
|
+
@"{{@key}}": {{@key}},
|
|
22
|
+
{{/each}}
|
|
23
|
+
};
|
|
24
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// DO NOT COMMIT OR EDIT THIS FILE
|
|
2
|
+
export interface ConfigVariables {
|
|
3
|
+
{{#each @root}}
|
|
4
|
+
{{#if (isString this)}}
|
|
5
|
+
{{@key}}: string;
|
|
6
|
+
{{/if}}
|
|
7
|
+
{{#if (isBoolean this)}}
|
|
8
|
+
{{@key}}: boolean;
|
|
9
|
+
{{/if}}
|
|
10
|
+
{{#if (isNumber this)}}
|
|
11
|
+
{{@key}}: number;
|
|
12
|
+
{{/if}}
|
|
13
|
+
{{/each}}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
declare const UltimateConfig: ConfigVariables;
|
|
17
|
+
|
|
18
|
+
export default UltimateConfig;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = {{{toJSON @root}}}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const RN = require("react-native");
|
|
2
|
+
|
|
3
|
+
const IOS_DATA = {{{toJSON @root.ios}}}
|
|
4
|
+
|
|
5
|
+
const ANDROID_DATA = {{{toJSON @root.android}}}
|
|
6
|
+
|
|
7
|
+
module.exports = {
|
|
8
|
+
{{#each @root.ios}}
|
|
9
|
+
get {{{@key}}}() {
|
|
10
|
+
return RN.Platform.select({
|
|
11
|
+
ios: IOS_DATA["{{{@key}}}"],
|
|
12
|
+
android: ANDROID_DATA["{{{@key}}}"],
|
|
13
|
+
});
|
|
14
|
+
},
|
|
15
|
+
{{/each}}
|
|
16
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const VALID_KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Validate env data against a schema defined in `.rncurc.js`.
|
|
7
|
+
* Called after `on_env` so the hook can add/transform vars before validation.
|
|
8
|
+
*
|
|
9
|
+
* Throws with a human-readable error listing ALL failures at once
|
|
10
|
+
* (not just the first one), so users can fix everything in one pass.
|
|
11
|
+
*/
|
|
12
|
+
export function validate_env(env, schema) {
|
|
13
|
+
const errors = [];
|
|
14
|
+
|
|
15
|
+
// Validate all env key names are valid identifiers
|
|
16
|
+
for (const key of Object.keys(env)) {
|
|
17
|
+
if (!VALID_KEY_PATTERN.test(key)) {
|
|
18
|
+
errors.push(`Invalid env key name: "${key}". Keys must start with a letter or underscore and contain only letters, numbers, and underscores.`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Pre-compile all regex patterns once, before iterating over env values.
|
|
23
|
+
// This avoids re-compiling the same pattern for every validated key.
|
|
24
|
+
const compiled_patterns = new Map();
|
|
25
|
+
for (const [key, field] of Object.entries(schema)) {
|
|
26
|
+
if (field.pattern) {
|
|
27
|
+
try {
|
|
28
|
+
compiled_patterns.set(key, new RegExp(field.pattern));
|
|
29
|
+
} catch {
|
|
30
|
+
errors.push(`${key}: invalid regex pattern /${field.pattern}/`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
for (const [key, field] of Object.entries(schema)) {
|
|
35
|
+
const raw = env[key];
|
|
36
|
+
const missing = raw === undefined || raw === null || String(raw).trim() === '';
|
|
37
|
+
if (field.required && missing) {
|
|
38
|
+
errors.push(`Missing required env var: ${key}`);
|
|
39
|
+
continue; // can't type-check a missing value
|
|
40
|
+
}
|
|
41
|
+
if (missing) continue; // optional and not present → OK
|
|
42
|
+
|
|
43
|
+
const value = String(raw);
|
|
44
|
+
if (field.type === 'number' && isNaN(Number(value))) {
|
|
45
|
+
errors.push(`${key} must be a number, got "${value}"`);
|
|
46
|
+
}
|
|
47
|
+
if (field.type === 'boolean' && !['true', 'false', '1', '0'].includes(value.toLowerCase())) {
|
|
48
|
+
errors.push(`${key} must be a boolean (true/false/1/0), got "${value}"`);
|
|
49
|
+
}
|
|
50
|
+
const pattern = compiled_patterns.get(key);
|
|
51
|
+
if (pattern && !pattern.test(value)) {
|
|
52
|
+
errors.push(`${key} does not match pattern /${field.pattern}/, got "${value}"`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (errors.length > 0) {
|
|
56
|
+
throw new Error(`\n\n❌ react-native-config-ultimate: env validation failed:\n` + errors.map(e => ` • ${e}`).join('\n') + '\n');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=validate-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["VALID_KEY_PATTERN","validate_env","env","schema","errors","key","Object","keys","test","push","compiled_patterns","Map","field","entries","pattern","set","RegExp","raw","missing","undefined","String","trim","required","value","type","isNaN","Number","includes","toLowerCase","get","length","Error","map","e","join"],"sourceRoot":"../../src","sources":["validate-env.ts"],"mappings":";;AAEA,MAAMA,iBAAiB,GAAG,0BAA0B;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAACC,GAAY,EAAEC,MAAc,EAAQ;EAC/D,MAAMC,MAAgB,GAAG,EAAE;;EAE3B;EACA,KAAK,MAAMC,GAAG,IAAIC,MAAM,CAACC,IAAI,CAACL,GAAG,CAAC,EAAE;IAClC,IAAI,CAACF,iBAAiB,CAACQ,IAAI,CAACH,GAAG,CAAC,EAAE;MAChCD,MAAM,CAACK,IAAI,CACT,0BAA0BJ,GAAG,oGAC/B,CAAC;IACH;EACF;;EAEA;EACA;EACA,MAAMK,iBAAiB,GAAG,IAAIC,GAAG,CAAiB,CAAC;EACnD,KAAK,MAAM,CAACN,GAAG,EAAEO,KAAK,CAAC,IAAIN,MAAM,CAACO,OAAO,CAACV,MAAM,CAAC,EAAE;IACjD,IAAIS,KAAK,CAACE,OAAO,EAAE;MACjB,IAAI;QACFJ,iBAAiB,CAACK,GAAG,CAACV,GAAG,EAAE,IAAIW,MAAM,CAACJ,KAAK,CAACE,OAAO,CAAC,CAAC;MACvD,CAAC,CAAC,MAAM;QACNV,MAAM,CAACK,IAAI,CAAC,GAAGJ,GAAG,4BAA4BO,KAAK,CAACE,OAAO,GAAG,CAAC;MACjE;IACF;EACF;EAEA,KAAK,MAAM,CAACT,GAAG,EAAEO,KAAK,CAAC,IAAIN,MAAM,CAACO,OAAO,CAACV,MAAM,CAAC,EAAE;IACjD,MAAMc,GAAG,GAAGf,GAAG,CAACG,GAAG,CAAC;IACpB,MAAMa,OAAO,GAAGD,GAAG,KAAKE,SAAS,IAAIF,GAAG,KAAK,IAAI,IAAIG,MAAM,CAACH,GAAG,CAAC,CAACI,IAAI,CAAC,CAAC,KAAK,EAAE;IAE9E,IAAIT,KAAK,CAACU,QAAQ,IAAIJ,OAAO,EAAE;MAC7Bd,MAAM,CAACK,IAAI,CAAC,6BAA6BJ,GAAG,EAAE,CAAC;MAC/C,SAAS,CAAC;IACZ;IAEA,IAAIa,OAAO,EAAE,SAAS,CAAC;;IAEvB,MAAMK,KAAK,GAAGH,MAAM,CAACH,GAAG,CAAC;IAEzB,IAAIL,KAAK,CAACY,IAAI,KAAK,QAAQ,IAAIC,KAAK,CAACC,MAAM,CAACH,KAAK,CAAC,CAAC,EAAE;MACnDnB,MAAM,CAACK,IAAI,CAAC,GAAGJ,GAAG,2BAA2BkB,KAAK,GAAG,CAAC;IACxD;IAEA,IAAIX,KAAK,CAACY,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAACG,QAAQ,CAACJ,KAAK,CAACK,WAAW,CAAC,CAAC,CAAC,EAAE;MAC1FxB,MAAM,CAACK,IAAI,CAAC,GAAGJ,GAAG,6CAA6CkB,KAAK,GAAG,CAAC;IAC1E;IAEA,MAAMT,OAAO,GAAGJ,iBAAiB,CAACmB,GAAG,CAACxB,GAAG,CAAC;IAC1C,IAAIS,OAAO,IAAI,CAACA,OAAO,CAACN,IAAI,CAACe,KAAK,CAAC,EAAE;MACnCnB,MAAM,CAACK,IAAI,CAAC,GAAGJ,GAAG,4BAA4BO,KAAK,CAACE,OAAO,WAAWS,KAAK,GAAG,CAAC;IACjF;EACF;EAEA,IAAInB,MAAM,CAAC0B,MAAM,GAAG,CAAC,EAAE;IACrB,MAAM,IAAIC,KAAK,CACb,8DAA8D,GAC5D3B,MAAM,CAAC4B,GAAG,CAAEC,CAAC,IAAK,OAAOA,CAAC,EAAE,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC,GACxC,IACJ,CAAC;EACH;AACF","ignoreList":[]}
|