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.
Files changed (152) hide show
  1. package/android/gradle.properties +6 -0
  2. package/android/rnuc.yaml +1 -0
  3. package/lib/commonjs/NativeUltimateConfig.js +20 -0
  4. package/lib/commonjs/NativeUltimateConfig.js.map +1 -0
  5. package/lib/commonjs/bin.spec.js +50 -0
  6. package/lib/commonjs/bin.spec.js.map +1 -0
  7. package/lib/commonjs/cli.js +143 -0
  8. package/lib/commonjs/cli.js.map +1 -0
  9. package/lib/commonjs/cli.spec.js +190 -0
  10. package/lib/commonjs/cli.spec.js.map +1 -0
  11. package/lib/commonjs/flatten.js +23 -0
  12. package/lib/commonjs/flatten.js.map +1 -0
  13. package/lib/commonjs/flatten.spec.js +32 -0
  14. package/lib/commonjs/flatten.spec.js.map +1 -0
  15. package/lib/commonjs/index.js +34 -0
  16. package/lib/commonjs/index.js.map +1 -0
  17. package/lib/commonjs/load-env.js +86 -0
  18. package/lib/commonjs/load-env.js.map +1 -0
  19. package/lib/commonjs/load-env.spec.js +257 -0
  20. package/lib/commonjs/load-env.spec.js.map +1 -0
  21. package/lib/commonjs/main.js +36 -0
  22. package/lib/commonjs/main.js.map +1 -0
  23. package/lib/commonjs/main.spec.js +228 -0
  24. package/lib/commonjs/main.spec.js.map +1 -0
  25. package/lib/commonjs/package.json +1 -0
  26. package/lib/commonjs/render-env.js +90 -0
  27. package/lib/commonjs/render-env.js.map +1 -0
  28. package/lib/commonjs/render-env.spec.js +397 -0
  29. package/lib/commonjs/render-env.spec.js.map +1 -0
  30. package/lib/commonjs/resolve-env.js +30 -0
  31. package/lib/commonjs/resolve-env.js.map +1 -0
  32. package/lib/commonjs/resolve-env.spec.js +31 -0
  33. package/lib/commonjs/resolve-env.spec.js.map +1 -0
  34. package/lib/commonjs/templates/ConfigValues.h.handlebars +24 -0
  35. package/lib/commonjs/templates/index.d.ts.handlebars +18 -0
  36. package/lib/commonjs/templates/index.web.js.handlebars +1 -0
  37. package/lib/commonjs/templates/override.js.handlebars +16 -0
  38. package/lib/commonjs/templates/rncu.xcconfig.handlebars +4 -0
  39. package/lib/commonjs/templates/rncu.yaml.handlebars +7 -0
  40. package/lib/commonjs/validate-env.js +63 -0
  41. package/lib/commonjs/validate-env.js.map +1 -0
  42. package/lib/commonjs/validate-env.spec.js +325 -0
  43. package/lib/commonjs/validate-env.spec.js.map +1 -0
  44. package/lib/commonjs/write-env.js +80 -0
  45. package/lib/commonjs/write-env.js.map +1 -0
  46. package/lib/commonjs/write-env.spec.js +115 -0
  47. package/lib/commonjs/write-env.spec.js.map +1 -0
  48. package/lib/module/NativeUltimateConfig.js +16 -0
  49. package/lib/module/NativeUltimateConfig.js.map +1 -0
  50. package/lib/module/bin.spec.js +49 -0
  51. package/lib/module/bin.spec.js.map +1 -0
  52. package/lib/module/cli.js +136 -0
  53. package/lib/module/cli.js.map +1 -0
  54. package/lib/module/cli.spec.js +190 -0
  55. package/lib/module/cli.spec.js.map +1 -0
  56. package/lib/module/flatten.js +18 -0
  57. package/lib/module/flatten.js.map +1 -0
  58. package/lib/module/flatten.spec.js +31 -0
  59. package/lib/module/flatten.spec.js.map +1 -0
  60. package/lib/module/index.js +30 -0
  61. package/lib/module/index.js.map +1 -0
  62. package/lib/module/load-env.js +81 -0
  63. package/lib/module/load-env.js.map +1 -0
  64. package/lib/module/load-env.spec.js +257 -0
  65. package/lib/module/load-env.spec.js.map +1 -0
  66. package/lib/module/main.js +31 -0
  67. package/lib/module/main.js.map +1 -0
  68. package/lib/module/main.spec.js +224 -0
  69. package/lib/module/main.spec.js.map +1 -0
  70. package/lib/module/render-env.js +84 -0
  71. package/lib/module/render-env.js.map +1 -0
  72. package/lib/module/render-env.spec.js +396 -0
  73. package/lib/module/render-env.spec.js.map +1 -0
  74. package/lib/module/resolve-env.js +26 -0
  75. package/lib/module/resolve-env.js.map +1 -0
  76. package/lib/module/resolve-env.spec.js +30 -0
  77. package/lib/module/resolve-env.spec.js.map +1 -0
  78. package/lib/module/templates/ConfigValues.h.handlebars +24 -0
  79. package/lib/module/templates/index.d.ts.handlebars +18 -0
  80. package/lib/module/templates/index.web.js.handlebars +1 -0
  81. package/lib/module/templates/override.js.handlebars +16 -0
  82. package/lib/module/templates/rncu.xcconfig.handlebars +4 -0
  83. package/lib/module/templates/rncu.yaml.handlebars +7 -0
  84. package/lib/module/validate-env.js +59 -0
  85. package/lib/module/validate-env.js.map +1 -0
  86. package/lib/module/validate-env.spec.js +325 -0
  87. package/lib/module/validate-env.spec.js.map +1 -0
  88. package/lib/module/write-env.js +75 -0
  89. package/lib/module/write-env.js.map +1 -0
  90. package/lib/module/write-env.spec.js +115 -0
  91. package/lib/module/write-env.spec.js.map +1 -0
  92. package/lib/typescript/src/NativeUltimateConfig.d.ts +18 -0
  93. package/lib/typescript/src/NativeUltimateConfig.d.ts.map +1 -0
  94. package/lib/typescript/src/bin.spec.d.ts +2 -0
  95. package/lib/typescript/src/bin.spec.d.ts.map +1 -0
  96. package/lib/typescript/src/cli.d.ts +2 -0
  97. package/lib/typescript/src/cli.d.ts.map +1 -0
  98. package/lib/typescript/src/cli.spec.d.ts +14 -0
  99. package/lib/typescript/src/cli.spec.d.ts.map +1 -0
  100. package/lib/typescript/src/flatten.d.ts +8 -0
  101. package/lib/typescript/src/flatten.d.ts.map +1 -0
  102. package/lib/typescript/src/flatten.spec.d.ts +2 -0
  103. package/lib/typescript/src/flatten.spec.d.ts.map +1 -0
  104. package/lib/typescript/src/index.d.ts +6 -0
  105. package/lib/typescript/src/index.d.ts.map +1 -0
  106. package/lib/typescript/src/load-env.d.ts +23 -0
  107. package/lib/typescript/src/load-env.d.ts.map +1 -0
  108. package/lib/typescript/src/load-env.spec.d.ts +6 -0
  109. package/lib/typescript/src/load-env.spec.d.ts.map +1 -0
  110. package/lib/typescript/src/main.d.ts +12 -0
  111. package/lib/typescript/src/main.d.ts.map +1 -0
  112. package/lib/typescript/src/main.spec.d.ts +2 -0
  113. package/lib/typescript/src/main.spec.d.ts.map +1 -0
  114. package/lib/typescript/src/render-env.d.ts +11 -0
  115. package/lib/typescript/src/render-env.d.ts.map +1 -0
  116. package/lib/typescript/src/render-env.spec.d.ts +2 -0
  117. package/lib/typescript/src/render-env.spec.d.ts.map +1 -0
  118. package/lib/typescript/src/resolve-env.d.ts +35 -0
  119. package/lib/typescript/src/resolve-env.d.ts.map +1 -0
  120. package/lib/typescript/src/resolve-env.spec.d.ts +2 -0
  121. package/lib/typescript/src/resolve-env.spec.d.ts.map +1 -0
  122. package/lib/typescript/src/validate-env.d.ts +10 -0
  123. package/lib/typescript/src/validate-env.d.ts.map +1 -0
  124. package/lib/typescript/src/validate-env.spec.d.ts +2 -0
  125. package/lib/typescript/src/validate-env.spec.d.ts.map +1 -0
  126. package/lib/typescript/src/write-env.d.ts +13 -0
  127. package/lib/typescript/src/write-env.d.ts.map +1 -0
  128. package/lib/typescript/src/write-env.spec.d.ts +9 -0
  129. package/lib/typescript/src/write-env.spec.d.ts.map +1 -0
  130. package/package.json +84 -52
  131. package/src/NativeUltimateConfig.ts +1 -2
  132. package/src/cli.ts +158 -0
  133. package/src/flatten.ts +26 -0
  134. package/src/index.ts +37 -0
  135. package/src/load-env.ts +81 -0
  136. package/src/main.ts +39 -0
  137. package/src/render-env.ts +111 -0
  138. package/src/resolve-env.ts +45 -0
  139. package/src/validate-env.ts +71 -0
  140. package/src/write-env.ts +74 -0
  141. package/bin.js +0 -5
  142. package/index.js +0 -28
  143. package/override.js +0 -1
  144. package/src/NativeUltimateConfig.js +0 -4
  145. package/src/cli.js +0 -176
  146. package/src/flatten.js +0 -22
  147. package/src/load-env.js +0 -107
  148. package/src/main.js +0 -34
  149. package/src/render-env.js +0 -113
  150. package/src/resolve-env.js +0 -12
  151. package/src/validate-env.js +0 -59
  152. package/src/write-env.js +0 -102
@@ -0,0 +1,257 @@
1
+ "use strict";
2
+
3
+ const mockReadFileSync = jest.fn();
4
+ jest.doMock('fs', () => ({
5
+ readFileSync: mockReadFileSync
6
+ }));
7
+ const mockParse = jest.fn();
8
+ jest.doMock('dotenv', () => ({
9
+ parse: mockParse
10
+ }));
11
+ const mockExpand = jest.fn();
12
+ jest.doMock('dotenv-expand', () => ({
13
+ expand: mockExpand
14
+ }));
15
+ const mockYaml = jest.fn();
16
+ jest.doMock('js-yaml', () => ({
17
+ load: mockYaml
18
+ }));
19
+
20
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
21
+ const load_env = require('./load-env').default;
22
+ describe('load-env', () => {
23
+ beforeEach(() => {
24
+ mockReadFileSync.mockReset();
25
+ mockParse.mockReset();
26
+ mockExpand.mockReset();
27
+ mockYaml.mockReset();
28
+ // Default expand: return parsed as-is (no expansion side effects)
29
+ mockExpand.mockImplementation(input => input);
30
+ });
31
+ describe('dotenv format', () => {
32
+ it('reads a single dotenv file (backward-compatible string arg)', () => {
33
+ mockReadFileSync.mockReturnValueOnce('hello=world');
34
+ mockParse.mockReturnValueOnce({
35
+ hello: 'world'
36
+ });
37
+ const result = load_env('hello');
38
+ expect(mockReadFileSync).toHaveBeenCalledWith('hello', 'utf8');
39
+ expect(mockParse).toHaveBeenCalledWith('hello=world');
40
+ expect(result).toEqual({
41
+ hello: 'world'
42
+ });
43
+ });
44
+ it('reads a single dotenv file when passed as an array', () => {
45
+ mockReadFileSync.mockReturnValueOnce('hello=world');
46
+ mockParse.mockReturnValueOnce({
47
+ hello: 'world'
48
+ });
49
+ const result = load_env(['hello']);
50
+ expect(mockReadFileSync).toHaveBeenCalledWith('hello', 'utf8');
51
+ expect(result).toEqual({
52
+ hello: 'world'
53
+ });
54
+ });
55
+ it('merges multiple dotenv files, last file wins for conflicts', () => {
56
+ mockReadFileSync.mockReturnValueOnce('A=base\nB=base').mockReturnValueOnce('B=override\nC=new');
57
+ mockParse.mockReturnValueOnce({
58
+ A: 'base',
59
+ B: 'base'
60
+ }).mockReturnValueOnce({
61
+ B: 'override',
62
+ C: 'new'
63
+ });
64
+ const result = load_env(['.env.base', '.env.staging']);
65
+ expect(mockReadFileSync).toHaveBeenCalledTimes(2);
66
+ // expand is called once with the merged raw object
67
+ expect(mockExpand).toHaveBeenCalledWith({
68
+ parsed: {
69
+ A: 'base',
70
+ B: 'override',
71
+ C: 'new'
72
+ }
73
+ });
74
+ expect(result).toEqual({
75
+ A: 'base',
76
+ B: 'override',
77
+ C: 'new'
78
+ });
79
+ });
80
+ it('expands $VAR references using dotenv-expand', () => {
81
+ mockReadFileSync.mockReturnValueOnce('BASE=https://api.com\nURL=$BASE/v1');
82
+ mockParse.mockReturnValueOnce({
83
+ BASE: 'https://api.com',
84
+ URL: '$BASE/v1'
85
+ });
86
+ mockExpand.mockReturnValueOnce({
87
+ parsed: {
88
+ BASE: 'https://api.com',
89
+ URL: 'https://api.com/v1'
90
+ }
91
+ });
92
+ const result = load_env('.env');
93
+ expect(result).toEqual({
94
+ BASE: 'https://api.com',
95
+ URL: 'https://api.com/v1'
96
+ });
97
+ });
98
+ it('expands cross-file $VAR references when merging multiple files', () => {
99
+ mockReadFileSync.mockReturnValueOnce('BASE_URL=https://api.com').mockReturnValueOnce('API_URL=$BASE_URL/v1');
100
+ mockParse.mockReturnValueOnce({
101
+ BASE_URL: 'https://api.com'
102
+ }).mockReturnValueOnce({
103
+ API_URL: '$BASE_URL/v1'
104
+ });
105
+ // Expand is called with merged raw — so cross-file reference resolves
106
+ mockExpand.mockReturnValueOnce({
107
+ parsed: {
108
+ BASE_URL: 'https://api.com',
109
+ API_URL: 'https://api.com/v1'
110
+ }
111
+ });
112
+ const result = load_env(['.env.base', '.env.staging']);
113
+ expect(mockExpand).toHaveBeenCalledWith({
114
+ parsed: {
115
+ BASE_URL: 'https://api.com',
116
+ API_URL: '$BASE_URL/v1'
117
+ }
118
+ });
119
+ expect(result).toEqual({
120
+ BASE_URL: 'https://api.com',
121
+ API_URL: 'https://api.com/v1'
122
+ });
123
+ });
124
+ });
125
+ describe('yaml format', () => {
126
+ it.each`
127
+ extension
128
+ ${'yml'}
129
+ ${'yaml'}
130
+ `("reads yaml when extension is '.$extension'", ({
131
+ extension
132
+ }) => {
133
+ mockReadFileSync.mockReturnValueOnce(Buffer.from('data'));
134
+ mockYaml.mockReturnValueOnce({
135
+ hello: 'world'
136
+ });
137
+ const result = load_env(`hello.${extension}`);
138
+ expect(mockReadFileSync).toHaveBeenCalledWith(`hello.${extension}`);
139
+ expect(mockYaml).toHaveBeenCalledWith('data');
140
+ expect(result).toEqual({
141
+ hello: 'world'
142
+ });
143
+ });
144
+ it('merges multiple yaml files, last file wins for conflicts', () => {
145
+ mockReadFileSync.mockReturnValueOnce(Buffer.from('A: base\nB: base')).mockReturnValueOnce(Buffer.from('B: override\nC: new'));
146
+ mockYaml.mockReturnValueOnce({
147
+ A: 'base',
148
+ B: 'base'
149
+ }).mockReturnValueOnce({
150
+ B: 'override',
151
+ C: 'new'
152
+ });
153
+ const result = load_env(['base.yaml', 'staging.yaml']);
154
+ expect(mockReadFileSync).toHaveBeenCalledTimes(2);
155
+ expect(result).toEqual({
156
+ A: 'base',
157
+ B: 'override',
158
+ C: 'new'
159
+ });
160
+ });
161
+ describe.each`
162
+ extension
163
+ ${'yml'}
164
+ ${'yaml'}
165
+ `("throws when yaml is not an object with extension '.$extension'", ({
166
+ extension
167
+ }) => {
168
+ it.each`
169
+ content
170
+ ${'abc:def'}
171
+ ${false}
172
+ ${true}
173
+ ${42}
174
+ ${null}
175
+ ${undefined}
176
+ `("when content is '$content'", ({
177
+ content
178
+ }) => {
179
+ mockReadFileSync.mockReturnValueOnce(Buffer.from('data'));
180
+ mockYaml.mockReturnValueOnce(content);
181
+ expect(() => {
182
+ load_env(`hello.${extension}`);
183
+ }).toThrow();
184
+ });
185
+ });
186
+ });
187
+ describe('edge cases', () => {
188
+ it('throws when no files are provided', () => {
189
+ expect(() => load_env([])).toThrow('No env file specified');
190
+ });
191
+ });
192
+ describe('mixed format (yaml + dotenv)', () => {
193
+ it('merges yaml and dotenv files together', () => {
194
+ // First file is yaml
195
+ mockReadFileSync.mockReturnValueOnce(Buffer.from('YAML_VAR: from_yaml')).mockReturnValueOnce('DOTENV_VAR=from_dotenv');
196
+ mockYaml.mockReturnValueOnce({
197
+ YAML_VAR: 'from_yaml'
198
+ });
199
+ mockParse.mockReturnValueOnce({
200
+ DOTENV_VAR: 'from_dotenv'
201
+ });
202
+ const result = load_env(['config.yaml', '.env']);
203
+ expect(mockYaml).toHaveBeenCalled();
204
+ expect(mockParse).toHaveBeenCalled();
205
+ expect(result).toEqual({
206
+ YAML_VAR: 'from_yaml',
207
+ DOTENV_VAR: 'from_dotenv'
208
+ });
209
+ });
210
+ it('dotenv file in mixed mode still gets expanded', () => {
211
+ mockReadFileSync.mockReturnValueOnce(Buffer.from('BASE: https://api.com')).mockReturnValueOnce('URL=$BASE/v1');
212
+ mockYaml.mockReturnValueOnce({
213
+ BASE: 'https://api.com'
214
+ });
215
+ mockParse.mockReturnValueOnce({
216
+ URL: '$BASE/v1'
217
+ });
218
+ // In mixed mode, expand is called per-dotenv-file
219
+ mockExpand.mockReturnValueOnce({
220
+ parsed: {
221
+ URL: 'https://api.com/v1'
222
+ }
223
+ });
224
+ const result = load_env(['config.yaml', '.env']);
225
+ expect(result).toEqual({
226
+ BASE: 'https://api.com',
227
+ URL: 'https://api.com/v1'
228
+ });
229
+ });
230
+ it('last file wins for conflicting keys in mixed mode', () => {
231
+ mockReadFileSync.mockReturnValueOnce(Buffer.from('SHARED: from_yaml')).mockReturnValueOnce('SHARED=from_dotenv');
232
+ mockYaml.mockReturnValueOnce({
233
+ SHARED: 'from_yaml'
234
+ });
235
+ mockParse.mockReturnValueOnce({
236
+ SHARED: 'from_dotenv'
237
+ });
238
+ const result = load_env(['config.yaml', '.env']);
239
+ expect(result.SHARED).toBe('from_dotenv');
240
+ });
241
+ it('handles dotenv first, then yaml', () => {
242
+ mockReadFileSync.mockReturnValueOnce('DOTENV_VAR=first').mockReturnValueOnce(Buffer.from('YAML_VAR: second'));
243
+ mockParse.mockReturnValueOnce({
244
+ DOTENV_VAR: 'first'
245
+ });
246
+ mockYaml.mockReturnValueOnce({
247
+ YAML_VAR: 'second'
248
+ });
249
+ const result = load_env(['.env', 'config.yml']);
250
+ expect(result).toEqual({
251
+ DOTENV_VAR: 'first',
252
+ YAML_VAR: 'second'
253
+ });
254
+ });
255
+ });
256
+ });
257
+ //# sourceMappingURL=load-env.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["mockReadFileSync","jest","fn","doMock","readFileSync","mockParse","parse","mockExpand","expand","mockYaml","load","load_env","require","default","describe","beforeEach","mockReset","mockImplementation","input","it","mockReturnValueOnce","hello","result","expect","toHaveBeenCalledWith","toEqual","A","B","C","toHaveBeenCalledTimes","parsed","BASE","URL","BASE_URL","API_URL","each","extension","Buffer","from","undefined","content","toThrow","YAML_VAR","DOTENV_VAR","toHaveBeenCalled","SHARED","toBe"],"sourceRoot":"../../src","sources":["load-env.spec.ts"],"mappings":";;AAAA,MAAMA,gBAAgB,GAAGC,IAAI,CAACC,EAAE,CAAC,CAAC;AAClCD,IAAI,CAACE,MAAM,CAAC,IAAI,EAAE,OAAO;EAAEC,YAAY,EAAEJ;AAAiB,CAAC,CAAC,CAAC;AAE7D,MAAMK,SAAS,GAAGJ,IAAI,CAACC,EAAE,CAAC,CAAC;AAC3BD,IAAI,CAACE,MAAM,CAAC,QAAQ,EAAE,OAAO;EAAEG,KAAK,EAAED;AAAU,CAAC,CAAC,CAAC;AAEnD,MAAME,UAAU,GAAGN,IAAI,CAACC,EAAE,CAAC,CAAC;AAC5BD,IAAI,CAACE,MAAM,CAAC,eAAe,EAAE,OAAO;EAAEK,MAAM,EAAED;AAAW,CAAC,CAAC,CAAC;AAE5D,MAAME,QAAQ,GAAGR,IAAI,CAACC,EAAE,CAAC,CAAC;AAC1BD,IAAI,CAACE,MAAM,CAAC,SAAS,EAAE,OAAO;EAAEO,IAAI,EAAED;AAAS,CAAC,CAAC,CAAC;;AAElD;AACA,MAAME,QAA+D,GACnEC,OAAO,CAAC,YAAY,CAAC,CAACC,OAAO;AAE/BC,QAAQ,CAAC,UAAU,EAAE,MAAM;EACzBC,UAAU,CAAC,MAAM;IACff,gBAAgB,CAACgB,SAAS,CAAC,CAAC;IAC5BX,SAAS,CAACW,SAAS,CAAC,CAAC;IACrBT,UAAU,CAACS,SAAS,CAAC,CAAC;IACtBP,QAAQ,CAACO,SAAS,CAAC,CAAC;IACpB;IACAT,UAAU,CAACU,kBAAkB,CAAEC,KAAyC,IAAKA,KAAK,CAAC;EACrF,CAAC,CAAC;EAEFJ,QAAQ,CAAC,eAAe,EAAE,MAAM;IAC9BK,EAAE,CAAC,6DAA6D,EAAE,MAAM;MACtEnB,gBAAgB,CAACoB,mBAAmB,CAAC,aAAa,CAAC;MACnDf,SAAS,CAACe,mBAAmB,CAAC;QAAEC,KAAK,EAAE;MAAQ,CAAC,CAAC;MACjD,MAAMC,MAAM,GAAGX,QAAQ,CAAC,OAAO,CAAC;MAChCY,MAAM,CAACvB,gBAAgB,CAAC,CAACwB,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC;MAC9DD,MAAM,CAAClB,SAAS,CAAC,CAACmB,oBAAoB,CAAC,aAAa,CAAC;MACrDD,MAAM,CAACD,MAAM,CAAC,CAACG,OAAO,CAAC;QAAEJ,KAAK,EAAE;MAAQ,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEFF,EAAE,CAAC,oDAAoD,EAAE,MAAM;MAC7DnB,gBAAgB,CAACoB,mBAAmB,CAAC,aAAa,CAAC;MACnDf,SAAS,CAACe,mBAAmB,CAAC;QAAEC,KAAK,EAAE;MAAQ,CAAC,CAAC;MACjD,MAAMC,MAAM,GAAGX,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC;MAClCY,MAAM,CAACvB,gBAAgB,CAAC,CAACwB,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC;MAC9DD,MAAM,CAACD,MAAM,CAAC,CAACG,OAAO,CAAC;QAAEJ,KAAK,EAAE;MAAQ,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEFF,EAAE,CAAC,4DAA4D,EAAE,MAAM;MACrEnB,gBAAgB,CACboB,mBAAmB,CAAC,gBAAgB,CAAC,CACrCA,mBAAmB,CAAC,mBAAmB,CAAC;MAC3Cf,SAAS,CACNe,mBAAmB,CAAC;QAAEM,CAAC,EAAE,MAAM;QAAEC,CAAC,EAAE;MAAO,CAAC,CAAC,CAC7CP,mBAAmB,CAAC;QAAEO,CAAC,EAAE,UAAU;QAAEC,CAAC,EAAE;MAAM,CAAC,CAAC;MACnD,MAAMN,MAAM,GAAGX,QAAQ,CAAC,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;MACtDY,MAAM,CAACvB,gBAAgB,CAAC,CAAC6B,qBAAqB,CAAC,CAAC,CAAC;MACjD;MACAN,MAAM,CAAChB,UAAU,CAAC,CAACiB,oBAAoB,CAAC;QACtCM,MAAM,EAAE;UAAEJ,CAAC,EAAE,MAAM;UAAEC,CAAC,EAAE,UAAU;UAAEC,CAAC,EAAE;QAAM;MAC/C,CAAC,CAAC;MACFL,MAAM,CAACD,MAAM,CAAC,CAACG,OAAO,CAAC;QAAEC,CAAC,EAAE,MAAM;QAAEC,CAAC,EAAE,UAAU;QAAEC,CAAC,EAAE;MAAM,CAAC,CAAC;IAChE,CAAC,CAAC;IAEFT,EAAE,CAAC,6CAA6C,EAAE,MAAM;MACtDnB,gBAAgB,CAACoB,mBAAmB,CAAC,oCAAoC,CAAC;MAC1Ef,SAAS,CAACe,mBAAmB,CAAC;QAAEW,IAAI,EAAE,iBAAiB;QAAEC,GAAG,EAAE;MAAW,CAAC,CAAC;MAC3EzB,UAAU,CAACa,mBAAmB,CAAC;QAC7BU,MAAM,EAAE;UAAEC,IAAI,EAAE,iBAAiB;UAAEC,GAAG,EAAE;QAAqB;MAC/D,CAAC,CAAC;MACF,MAAMV,MAAM,GAAGX,QAAQ,CAAC,MAAM,CAAC;MAC/BY,MAAM,CAACD,MAAM,CAAC,CAACG,OAAO,CAAC;QACrBM,IAAI,EAAE,iBAAiB;QACvBC,GAAG,EAAE;MACP,CAAC,CAAC;IACJ,CAAC,CAAC;IAEFb,EAAE,CAAC,gEAAgE,EAAE,MAAM;MACzEnB,gBAAgB,CACboB,mBAAmB,CAAC,0BAA0B,CAAC,CAC/CA,mBAAmB,CAAC,sBAAsB,CAAC;MAC9Cf,SAAS,CACNe,mBAAmB,CAAC;QAAEa,QAAQ,EAAE;MAAkB,CAAC,CAAC,CACpDb,mBAAmB,CAAC;QAAEc,OAAO,EAAE;MAAe,CAAC,CAAC;MACnD;MACA3B,UAAU,CAACa,mBAAmB,CAAC;QAC7BU,MAAM,EAAE;UACNG,QAAQ,EAAE,iBAAiB;UAC3BC,OAAO,EAAE;QACX;MACF,CAAC,CAAC;MACF,MAAMZ,MAAM,GAAGX,QAAQ,CAAC,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;MACtDY,MAAM,CAAChB,UAAU,CAAC,CAACiB,oBAAoB,CAAC;QACtCM,MAAM,EAAE;UAAEG,QAAQ,EAAE,iBAAiB;UAAEC,OAAO,EAAE;QAAe;MACjE,CAAC,CAAC;MACFX,MAAM,CAACD,MAAM,CAAC,CAACG,OAAO,CAAC;QACrBQ,QAAQ,EAAE,iBAAiB;QAC3BC,OAAO,EAAE;MACX,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFpB,QAAQ,CAAC,aAAa,EAAE,MAAM;IAC5BK,EAAE,CAACgB,IAAI;AACX;AACA,QAAQ,KAAK;AACb,QAAQ,MAAM;AACd,KAAK,CAAC,4CAA4C,EAAE,CAAC;MAAEC;IAAiC,CAAC,KAAK;MACxFpC,gBAAgB,CAACoB,mBAAmB,CAACiB,MAAM,CAACC,IAAI,CAAC,MAAM,CAAC,CAAC;MACzD7B,QAAQ,CAACW,mBAAmB,CAAC;QAAEC,KAAK,EAAE;MAAQ,CAAC,CAAC;MAChD,MAAMC,MAAM,GAAGX,QAAQ,CAAC,SAASyB,SAAS,EAAE,CAAC;MAC7Cb,MAAM,CAACvB,gBAAgB,CAAC,CAACwB,oBAAoB,CAAC,SAASY,SAAS,EAAE,CAAC;MACnEb,MAAM,CAACd,QAAQ,CAAC,CAACe,oBAAoB,CAAC,MAAM,CAAC;MAC7CD,MAAM,CAACD,MAAM,CAAC,CAACG,OAAO,CAAC;QAAEJ,KAAK,EAAE;MAAQ,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEFF,EAAE,CAAC,0DAA0D,EAAE,MAAM;MACnEnB,gBAAgB,CACboB,mBAAmB,CAACiB,MAAM,CAACC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CACpDlB,mBAAmB,CAACiB,MAAM,CAACC,IAAI,CAAC,qBAAqB,CAAC,CAAC;MAC1D7B,QAAQ,CACLW,mBAAmB,CAAC;QAAEM,CAAC,EAAE,MAAM;QAAEC,CAAC,EAAE;MAAO,CAAC,CAAC,CAC7CP,mBAAmB,CAAC;QAAEO,CAAC,EAAE,UAAU;QAAEC,CAAC,EAAE;MAAM,CAAC,CAAC;MACnD,MAAMN,MAAM,GAAGX,QAAQ,CAAC,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;MACtDY,MAAM,CAACvB,gBAAgB,CAAC,CAAC6B,qBAAqB,CAAC,CAAC,CAAC;MACjDN,MAAM,CAACD,MAAM,CAAC,CAACG,OAAO,CAAC;QAAEC,CAAC,EAAE,MAAM;QAAEC,CAAC,EAAE,UAAU;QAAEC,CAAC,EAAE;MAAM,CAAC,CAAC;IAChE,CAAC,CAAC;IAEFd,QAAQ,CAACqB,IAAI;AACjB;AACA,QAAQ,KAAK;AACb,QAAQ,MAAM;AACd,KAAK,CACC,gEAAgE,EAChE,CAAC;MAAEC;IAAiC,CAAC,KAAK;MACxCjB,EAAE,CAACgB,IAAI;AACf;AACA,YAAY,SAAS;AACrB,YAAY,KAAK;AACjB,YAAY,IAAI;AAChB,YAAY,EAAE;AACd,YAAY,IAAI;AAChB,YAAYI,SAAS;AACrB,SAAS,CAAC,4BAA4B,EAAE,CAAC;QAAEC;MAA8B,CAAC,KAAK;QACrExC,gBAAgB,CAACoB,mBAAmB,CAACiB,MAAM,CAACC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD7B,QAAQ,CAACW,mBAAmB,CAACoB,OAAO,CAAC;QACrCjB,MAAM,CAAC,MAAM;UACXZ,QAAQ,CAAC,SAASyB,SAAS,EAAE,CAAC;QAChC,CAAC,CAAC,CAACK,OAAO,CAAC,CAAC;MACd,CAAC,CAAC;IACJ,CACF,CAAC;EACH,CAAC,CAAC;EAEF3B,QAAQ,CAAC,YAAY,EAAE,MAAM;IAC3BK,EAAE,CAAC,mCAAmC,EAAE,MAAM;MAC5CI,MAAM,CAAC,MAAMZ,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC8B,OAAO,CAAC,uBAAuB,CAAC;IAC7D,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF3B,QAAQ,CAAC,8BAA8B,EAAE,MAAM;IAC7CK,EAAE,CAAC,uCAAuC,EAAE,MAAM;MAChD;MACAnB,gBAAgB,CACboB,mBAAmB,CAACiB,MAAM,CAACC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CACvDlB,mBAAmB,CAAC,wBAAwB,CAAC;MAChDX,QAAQ,CAACW,mBAAmB,CAAC;QAAEsB,QAAQ,EAAE;MAAY,CAAC,CAAC;MACvDrC,SAAS,CAACe,mBAAmB,CAAC;QAAEuB,UAAU,EAAE;MAAc,CAAC,CAAC;MAE5D,MAAMrB,MAAM,GAAGX,QAAQ,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;MAEhDY,MAAM,CAACd,QAAQ,CAAC,CAACmC,gBAAgB,CAAC,CAAC;MACnCrB,MAAM,CAAClB,SAAS,CAAC,CAACuC,gBAAgB,CAAC,CAAC;MACpCrB,MAAM,CAACD,MAAM,CAAC,CAACG,OAAO,CAAC;QACrBiB,QAAQ,EAAE,WAAW;QACrBC,UAAU,EAAE;MACd,CAAC,CAAC;IACJ,CAAC,CAAC;IAEFxB,EAAE,CAAC,+CAA+C,EAAE,MAAM;MACxDnB,gBAAgB,CACboB,mBAAmB,CAACiB,MAAM,CAACC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CACzDlB,mBAAmB,CAAC,cAAc,CAAC;MACtCX,QAAQ,CAACW,mBAAmB,CAAC;QAAEW,IAAI,EAAE;MAAkB,CAAC,CAAC;MACzD1B,SAAS,CAACe,mBAAmB,CAAC;QAAEY,GAAG,EAAE;MAAW,CAAC,CAAC;MAClD;MACAzB,UAAU,CAACa,mBAAmB,CAAC;QAC7BU,MAAM,EAAE;UAAEE,GAAG,EAAE;QAAqB;MACtC,CAAC,CAAC;MAEF,MAAMV,MAAM,GAAGX,QAAQ,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;MAEhDY,MAAM,CAACD,MAAM,CAAC,CAACG,OAAO,CAAC;QACrBM,IAAI,EAAE,iBAAiB;QACvBC,GAAG,EAAE;MACP,CAAC,CAAC;IACJ,CAAC,CAAC;IAEFb,EAAE,CAAC,mDAAmD,EAAE,MAAM;MAC5DnB,gBAAgB,CACboB,mBAAmB,CAACiB,MAAM,CAACC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CACrDlB,mBAAmB,CAAC,oBAAoB,CAAC;MAC5CX,QAAQ,CAACW,mBAAmB,CAAC;QAAEyB,MAAM,EAAE;MAAY,CAAC,CAAC;MACrDxC,SAAS,CAACe,mBAAmB,CAAC;QAAEyB,MAAM,EAAE;MAAc,CAAC,CAAC;MAExD,MAAMvB,MAAM,GAAGX,QAAQ,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;MAEhDY,MAAM,CAACD,MAAM,CAACuB,MAAM,CAAC,CAACC,IAAI,CAAC,aAAa,CAAC;IAC3C,CAAC,CAAC;IAEF3B,EAAE,CAAC,iCAAiC,EAAE,MAAM;MAC1CnB,gBAAgB,CACboB,mBAAmB,CAAC,kBAAkB,CAAC,CACvCA,mBAAmB,CAACiB,MAAM,CAACC,IAAI,CAAC,kBAAkB,CAAC,CAAC;MACvDjC,SAAS,CAACe,mBAAmB,CAAC;QAAEuB,UAAU,EAAE;MAAQ,CAAC,CAAC;MACtDlC,QAAQ,CAACW,mBAAmB,CAAC;QAAEsB,QAAQ,EAAE;MAAS,CAAC,CAAC;MAEpD,MAAMpB,MAAM,GAAGX,QAAQ,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;MAE/CY,MAAM,CAACD,MAAM,CAAC,CAACG,OAAO,CAAC;QACrBkB,UAAU,EAAE,OAAO;QACnBD,QAAQ,EAAE;MACZ,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ import load_env from './load-env';
4
+ import render_env from './render-env';
5
+ import write_env from './write-env';
6
+ import flatten from './flatten';
7
+ import resolve_env from './resolve-env';
8
+ import { validate_env } from './validate-env';
9
+ /**
10
+ * Main build-time pipeline:
11
+ * load → resolve (on_env hook) → validate (schema) → flatten → render → write
12
+ *
13
+ * @param project_root Root of the React Native project
14
+ * @param lib_root Root of the react-native-config-ultimate install
15
+ * @param env_file Path(s) to env file(s). Multiple files are merged (last wins).
16
+ * @param rc Optional RC config from `.rncurc.js`
17
+ */
18
+ export default async function main(project_root, lib_root, env_file, rc) {
19
+ const env = await resolve_env(load_env(env_file), rc);
20
+ if (rc?.schema) {
21
+ validate_env(env, rc.schema);
22
+ }
23
+ const flat = {
24
+ ios: flatten(env, 'ios'),
25
+ android: flatten(env, 'android'),
26
+ web: flatten(env, 'web')
27
+ };
28
+ const files_to_write = render_env(project_root, lib_root, flat, rc);
29
+ write_env(files_to_write);
30
+ }
31
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["load_env","render_env","write_env","flatten","resolve_env","validate_env","main","project_root","lib_root","env_file","rc","env","schema","flat","ios","android","web","files_to_write"],"sourceRoot":"../../src","sources":["main.ts"],"mappings":";;AAAA,OAAOA,QAAQ,MAAM,YAAY;AACjC,OAAOC,UAAU,MAAM,cAAc;AACrC,OAAOC,SAAS,MAAM,aAAa;AACnC,OAAOC,OAAO,MAAM,WAAW;AAC/B,OAAOC,WAAW,MAAM,eAAe;AACvC,SAASC,YAAY,QAAQ,gBAAgB;AAK7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,eAAeC,IAAIA,CAChCC,YAAoB,EACpBC,QAAgB,EAChBC,QAA2B,EAC3BC,EAAO,EACQ;EACf,MAAMC,GAAY,GAAG,MAAMP,WAAW,CAACJ,QAAQ,CAACS,QAAQ,CAAC,EAAEC,EAAE,CAAC;EAE9D,IAAIA,EAAE,EAAEE,MAAM,EAAE;IACdP,YAAY,CAACM,GAAG,EAAED,EAAE,CAACE,MAAM,CAAC;EAC9B;EAEA,MAAMC,IAAI,GAAG;IACXC,GAAG,EAAEX,OAAO,CAACQ,GAAG,EAAe,KAAK,CAAC;IACrCI,OAAO,EAAEZ,OAAO,CAACQ,GAAG,EAAe,SAAS,CAAC;IAC7CK,GAAG,EAAEb,OAAO,CAACQ,GAAG,EAAe,KAAK;EACtC,CAAC;EACD,MAAMM,cAAc,GAAGhB,UAAU,CAACM,YAAY,EAAEC,QAAQ,EAAEK,IAAI,EAAEH,EAAE,CAAC;EACnER,SAAS,CAACe,cAAc,CAAC;AAC3B","ignoreList":[]}
@@ -0,0 +1,224 @@
1
+ "use strict";
2
+
3
+ const mock_load_env = jest.fn();
4
+ jest.doMock('./load-env', () => ({
5
+ __esModule: true,
6
+ default: mock_load_env
7
+ }));
8
+ const mock_render_env = jest.fn();
9
+ jest.doMock('./render-env', () => ({
10
+ __esModule: true,
11
+ default: mock_render_env
12
+ }));
13
+ const mock_write_env = jest.fn();
14
+ jest.doMock('./write-env', () => ({
15
+ __esModule: true,
16
+ default: mock_write_env
17
+ }));
18
+ const mock_flatten = jest.fn();
19
+ jest.doMock('./flatten', () => ({
20
+ __esModule: true,
21
+ default: mock_flatten
22
+ }));
23
+ const mock_validate_env = jest.fn();
24
+ jest.doMock('./validate-env', () => ({
25
+ validate_env: mock_validate_env
26
+ }));
27
+
28
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
29
+ const main = require('./main').default;
30
+ export const files_to_assert = ['ios/rncu.xcconfig', 'node_modules/react-native-config-ultimate/ios/ConfigValues.h', 'node_modules/react-native-config-ultimate/android/rncu.yaml', 'node_modules/react-native-config-ultimate/index.d.ts', 'node_modules/react-native-config-ultimate/index.web.js', 'node_modules/react-native-config-ultimate/override.js'];
31
+ describe('main', () => {
32
+ beforeEach(() => {
33
+ mock_load_env.mockReset();
34
+ mock_render_env.mockReset();
35
+ mock_write_env.mockReset();
36
+ mock_flatten.mockReset();
37
+ mock_validate_env.mockReset();
38
+ });
39
+ it('execute render with paths (string arg — backward-compatible)', async () => {
40
+ mock_load_env.mockReturnValueOnce({
41
+ data: true
42
+ });
43
+ mock_flatten.mockReturnValueOnce({
44
+ data: true,
45
+ ios: true
46
+ });
47
+ mock_flatten.mockReturnValueOnce({
48
+ data: true,
49
+ android: true
50
+ });
51
+ mock_flatten.mockReturnValueOnce({
52
+ data: true,
53
+ web: true
54
+ });
55
+ mock_render_env.mockReturnValueOnce({
56
+ hello: 'world'
57
+ });
58
+ await main('project', 'project/node_modules/react-native-config-ultimate', 'file');
59
+ expect(mock_load_env).toHaveBeenCalledWith('file');
60
+ expect(mock_flatten).toHaveBeenCalledWith({
61
+ data: true
62
+ }, 'ios');
63
+ expect(mock_flatten).toHaveBeenCalledWith({
64
+ data: true
65
+ }, 'android');
66
+ expect(mock_flatten).toHaveBeenCalledWith({
67
+ data: true
68
+ }, 'web');
69
+ expect(mock_render_env).toHaveBeenCalledWith('project', 'project/node_modules/react-native-config-ultimate', {
70
+ ios: {
71
+ data: true,
72
+ ios: true
73
+ },
74
+ android: {
75
+ data: true,
76
+ android: true
77
+ },
78
+ web: {
79
+ data: true,
80
+ web: true
81
+ }
82
+ }, undefined);
83
+ expect(mock_write_env).toHaveBeenCalledWith({
84
+ hello: 'world'
85
+ });
86
+ });
87
+ it('passes array of env files to load_env (multi-file merge)', async () => {
88
+ mock_load_env.mockReturnValueOnce({
89
+ data: true
90
+ });
91
+ mock_flatten.mockReturnValue({});
92
+ mock_render_env.mockReturnValueOnce({});
93
+ await main('project', 'project/node_modules/react-native-config-ultimate', ['.env.base', '.env.staging']);
94
+ expect(mock_load_env).toHaveBeenCalledWith(['.env.base', '.env.staging']);
95
+ });
96
+ describe('rc.on_env', () => {
97
+ it('invoke rc hook with config before flattening', async () => {
98
+ const on_env = jest.fn();
99
+ mock_load_env.mockReturnValueOnce({
100
+ data: true
101
+ });
102
+ await main('project', 'project/node_modules/react-native-config-ultimate', 'file', {
103
+ on_env
104
+ });
105
+ expect(on_env).toHaveBeenCalledWith({
106
+ data: true
107
+ });
108
+ expect(mock_flatten).toHaveBeenCalledWith({
109
+ data: true
110
+ }, 'ios');
111
+ expect(mock_flatten).toHaveBeenCalledWith({
112
+ data: true
113
+ }, 'android');
114
+ expect(mock_flatten).toHaveBeenCalledWith({
115
+ data: true
116
+ }, 'web');
117
+ });
118
+ it('hook can add or remove values', async () => {
119
+ const on_env = jest.fn();
120
+ on_env.mockImplementation(env => {
121
+ const {
122
+ key1,
123
+ ...rest
124
+ } = env;
125
+ void key1;
126
+ return {
127
+ ...rest,
128
+ key2: 'hello'
129
+ };
130
+ });
131
+ mock_load_env.mockReturnValueOnce({
132
+ data: true,
133
+ key1: 'bye'
134
+ });
135
+ await main('project', 'project/node_modules/react-native-config-ultimate', 'file', {
136
+ on_env
137
+ });
138
+ expect(on_env).toHaveBeenCalledWith({
139
+ data: true,
140
+ key1: 'bye'
141
+ });
142
+ expect(mock_flatten).toHaveBeenCalledWith({
143
+ data: true,
144
+ key2: 'hello'
145
+ }, 'ios');
146
+ expect(mock_flatten).toHaveBeenCalledWith({
147
+ data: true,
148
+ key2: 'hello'
149
+ }, 'android');
150
+ expect(mock_flatten).toHaveBeenCalledWith({
151
+ data: true,
152
+ key2: 'hello'
153
+ }, 'web');
154
+ });
155
+ });
156
+ describe('rc.schema', () => {
157
+ it('calls validate_env when schema is provided', async () => {
158
+ const schema = {
159
+ API_KEY: {
160
+ type: 'string',
161
+ required: true
162
+ }
163
+ };
164
+ mock_load_env.mockReturnValueOnce({
165
+ API_KEY: 'secret'
166
+ });
167
+ mock_flatten.mockReturnValue({});
168
+ mock_render_env.mockReturnValueOnce({});
169
+ await main('project', 'project/node_modules/react-native-config-ultimate', 'file', {
170
+ schema
171
+ });
172
+ expect(mock_validate_env).toHaveBeenCalledWith({
173
+ API_KEY: 'secret'
174
+ }, schema);
175
+ });
176
+ it('does not call validate_env when no schema is provided', async () => {
177
+ mock_load_env.mockReturnValueOnce({
178
+ data: true
179
+ });
180
+ mock_flatten.mockReturnValue({});
181
+ mock_render_env.mockReturnValueOnce({});
182
+ await main('project', 'project/node_modules/react-native-config-ultimate', 'file');
183
+ expect(mock_validate_env).not.toHaveBeenCalled();
184
+ });
185
+ it('validates env AFTER on_env hook runs (hook output is validated)', async () => {
186
+ const schema = {
187
+ INJECTED_KEY: {
188
+ type: 'string',
189
+ required: true
190
+ }
191
+ };
192
+ const on_env = jest.fn().mockReturnValue({
193
+ INJECTED_KEY: 'from-hook'
194
+ });
195
+ mock_load_env.mockReturnValueOnce({});
196
+ mock_flatten.mockReturnValue({});
197
+ mock_render_env.mockReturnValueOnce({});
198
+ await main('project', 'project/node_modules/react-native-config-ultimate', 'file', {
199
+ on_env,
200
+ schema
201
+ });
202
+ // validate_env receives the HOOK output, not the raw env
203
+ expect(mock_validate_env).toHaveBeenCalledWith({
204
+ INJECTED_KEY: 'from-hook'
205
+ }, schema);
206
+ });
207
+ it('propagates validation error thrown by validate_env', async () => {
208
+ const schema = {
209
+ API_KEY: {
210
+ type: 'string',
211
+ required: true
212
+ }
213
+ };
214
+ mock_load_env.mockReturnValueOnce({});
215
+ mock_validate_env.mockImplementation(() => {
216
+ throw new Error('❌ validation failed: Missing required env var: API_KEY');
217
+ });
218
+ await expect(main('project', 'project/node_modules/react-native-config-ultimate', 'file', {
219
+ schema
220
+ })).rejects.toThrow('Missing required env var: API_KEY');
221
+ });
222
+ });
223
+ });
224
+ //# sourceMappingURL=main.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["mock_load_env","jest","fn","doMock","__esModule","default","mock_render_env","mock_write_env","mock_flatten","mock_validate_env","validate_env","main","require","files_to_assert","describe","beforeEach","mockReset","it","mockReturnValueOnce","data","ios","android","web","hello","expect","toHaveBeenCalledWith","undefined","mockReturnValue","on_env","mockImplementation","env","key1","rest","key2","schema","API_KEY","type","required","not","toHaveBeenCalled","INJECTED_KEY","Error","rejects","toThrow"],"sourceRoot":"../../src","sources":["main.spec.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+
3
+ import * as path from 'path';
4
+ import * as fs from 'fs';
5
+ import handlebars from 'handlebars';
6
+ const code_file_name = 'ConfigValues';
7
+ const config_file_name = 'rncu';
8
+
9
+ // ─── Handlebars helpers (registered once at module load, not per-call) ────────
10
+
11
+ function is_string(value) {
12
+ return typeof value === 'string';
13
+ }
14
+ function is_number(value) {
15
+ return typeof value === 'number';
16
+ }
17
+ function is_boolean(value) {
18
+ return typeof value === 'boolean';
19
+ }
20
+ function escape(value) {
21
+ if (is_string(value)) {
22
+ return value.replace(/\\/gm, '\\\\').replace(/"/gm, '\\"').replace(/\n/gm, '\\n').replace(/\r/gm, '\\r');
23
+ }
24
+ return value;
25
+ }
26
+ function xcconfig_format(value) {
27
+ if (is_string(value)) {
28
+ return value.replace(/\/\//gm, '/$()/');
29
+ }
30
+ return value;
31
+ }
32
+ function to_json(value) {
33
+ return JSON.stringify(value, null, 2);
34
+ }
35
+ handlebars.registerHelper('isBoolean', is_boolean);
36
+ handlebars.registerHelper('isString', is_string);
37
+ handlebars.registerHelper('isNumber', is_number);
38
+ handlebars.registerHelper('escape', escape);
39
+ handlebars.registerHelper('xcconfigFormat', xcconfig_format);
40
+ handlebars.registerHelper('toJSON', to_json);
41
+
42
+ // ─── Template cache (compiled once per template name, not per build) ──────────
43
+
44
+ const template_cache = new Map();
45
+ function get_compiled_template(template_name) {
46
+ const cached = template_cache.get(template_name);
47
+ if (cached) return cached;
48
+ const template_path = path.join(__dirname, 'templates', `${template_name}.handlebars`);
49
+ const compiled = handlebars.compile(fs.readFileSync(template_path, 'utf8'));
50
+ template_cache.set(template_name, compiled);
51
+ return compiled;
52
+ }
53
+ function render_template(template_name, data) {
54
+ return get_compiled_template(template_name)(data);
55
+ }
56
+
57
+ // ─── Public API ───────────────────────────────────────────────────────────────
58
+
59
+ export default function render_env(project_root, lib_root, env, rc) {
60
+ const {
61
+ ios,
62
+ android,
63
+ web
64
+ } = env;
65
+ const map = {
66
+ [path.join(lib_root, 'index.d.ts')]: render_template('index.d.ts', ios),
67
+ [path.join(lib_root, 'index.web.js')]: render_template('index.web.js', web),
68
+ [path.join(lib_root, 'ios', `${code_file_name}.h`)]: render_template('ConfigValues.h', ios),
69
+ [path.join(lib_root, 'android', 'rncu.yaml')]: render_template('rncu.yaml', android)
70
+ };
71
+
72
+ // Only write xcconfig if the project has an ios folder.
73
+ // All RN apps have it; some react-native-web apps may not.
74
+ if (fs.existsSync(path.join(project_root, 'ios'))) {
75
+ map[path.join(project_root, 'ios', `${config_file_name}.xcconfig`)] = render_template('rncu.xcconfig', ios);
76
+ }
77
+ const js_override = rc && typeof rc.js_override === 'boolean' && rc.js_override;
78
+ map[path.join(lib_root, 'override.js')] = render_template('override.js', {
79
+ ios: js_override ? ios : {},
80
+ android: js_override ? android : {}
81
+ });
82
+ return map;
83
+ }
84
+ //# sourceMappingURL=render-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["path","fs","handlebars","code_file_name","config_file_name","is_string","value","is_number","is_boolean","escape","replace","xcconfig_format","to_json","JSON","stringify","registerHelper","template_cache","Map","get_compiled_template","template_name","cached","get","template_path","join","__dirname","compiled","compile","readFileSync","set","render_template","data","render_env","project_root","lib_root","env","rc","ios","android","web","map","existsSync","js_override"],"sourceRoot":"../../src","sources":["render-env.ts"],"mappings":"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","ignoreList":[]}