react-native-config-ultimate 0.1.0 → 0.2.1

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 (112) hide show
  1. package/README.md +476 -121
  2. package/android/build.gradle +1 -1
  3. package/android/rncu.gradle +19 -15
  4. package/android/src/main/java/com/reactnativeultimateconfig/UltimateConfigHelper.java +87 -0
  5. package/android/src/main/java/com/reactnativeultimateconfig/UltimateConfigPackage.java +1 -1
  6. package/android/src/newarch/java/com/reactnativeultimateconfig/UltimateConfigModule.java +3 -50
  7. package/android/src/oldarch/java/com/reactnativeultimateconfig/UltimateConfigModule.java +3 -54
  8. package/ios/UltimateConfig.mm +2 -1
  9. package/lib/commonjs/cli.js +11 -2
  10. package/lib/commonjs/cli.js.map +1 -1
  11. package/lib/commonjs/flatten.js +6 -1
  12. package/lib/commonjs/flatten.js.map +1 -1
  13. package/lib/commonjs/load-env.js +14 -0
  14. package/lib/commonjs/load-env.js.map +1 -1
  15. package/lib/commonjs/main.js +5 -1
  16. package/lib/commonjs/main.js.map +1 -1
  17. package/lib/commonjs/render-env.js +1 -1
  18. package/lib/commonjs/render-env.js.map +1 -1
  19. package/lib/commonjs/resolve-env.js +5 -1
  20. package/lib/commonjs/resolve-env.js.map +1 -1
  21. package/lib/commonjs/templates/override.js.handlebars +1 -10
  22. package/lib/commonjs/validate-env.js +20 -7
  23. package/lib/commonjs/validate-env.js.map +1 -1
  24. package/lib/module/cli.js +11 -2
  25. package/lib/module/cli.js.map +1 -1
  26. package/lib/module/flatten.js +6 -1
  27. package/lib/module/flatten.js.map +1 -1
  28. package/lib/module/load-env.js +14 -0
  29. package/lib/module/load-env.js.map +1 -1
  30. package/lib/module/main.js +6 -2
  31. package/lib/module/main.js.map +1 -1
  32. package/lib/module/render-env.js +1 -1
  33. package/lib/module/render-env.js.map +1 -1
  34. package/lib/module/resolve-env.js +5 -1
  35. package/lib/module/resolve-env.js.map +1 -1
  36. package/lib/module/templates/override.js.handlebars +1 -10
  37. package/lib/module/validate-env.js +19 -7
  38. package/lib/module/validate-env.js.map +1 -1
  39. package/lib/typescript/src/cli.d.ts.map +1 -1
  40. package/lib/typescript/src/flatten.d.ts.map +1 -1
  41. package/lib/typescript/src/load-env.d.ts.map +1 -1
  42. package/lib/typescript/src/main.d.ts +1 -1
  43. package/lib/typescript/src/main.d.ts.map +1 -1
  44. package/lib/typescript/src/render-env.d.ts.map +1 -1
  45. package/lib/typescript/src/resolve-env.d.ts +8 -1
  46. package/lib/typescript/src/resolve-env.d.ts.map +1 -1
  47. package/lib/typescript/src/validate-env.d.ts +8 -0
  48. package/lib/typescript/src/validate-env.d.ts.map +1 -1
  49. package/package.json +4 -2
  50. package/src/cli.ts +12 -2
  51. package/src/flatten.ts +6 -1
  52. package/src/load-env.ts +18 -0
  53. package/src/main.ts +6 -2
  54. package/src/render-env.ts +4 -1
  55. package/src/resolve-env.ts +16 -2
  56. package/src/templates/override.js.handlebars +1 -10
  57. package/src/validate-env.ts +23 -7
  58. package/android/rnuc.yaml +0 -1
  59. package/lib/commonjs/bin.spec.js +0 -50
  60. package/lib/commonjs/bin.spec.js.map +0 -1
  61. package/lib/commonjs/cli.spec.js +0 -190
  62. package/lib/commonjs/cli.spec.js.map +0 -1
  63. package/lib/commonjs/flatten.spec.js +0 -32
  64. package/lib/commonjs/flatten.spec.js.map +0 -1
  65. package/lib/commonjs/load-env.spec.js +0 -257
  66. package/lib/commonjs/load-env.spec.js.map +0 -1
  67. package/lib/commonjs/main.spec.js +0 -228
  68. package/lib/commonjs/main.spec.js.map +0 -1
  69. package/lib/commonjs/render-env.spec.js +0 -397
  70. package/lib/commonjs/render-env.spec.js.map +0 -1
  71. package/lib/commonjs/resolve-env.spec.js +0 -31
  72. package/lib/commonjs/resolve-env.spec.js.map +0 -1
  73. package/lib/commonjs/validate-env.spec.js +0 -325
  74. package/lib/commonjs/validate-env.spec.js.map +0 -1
  75. package/lib/commonjs/write-env.spec.js +0 -115
  76. package/lib/commonjs/write-env.spec.js.map +0 -1
  77. package/lib/module/bin.spec.js +0 -49
  78. package/lib/module/bin.spec.js.map +0 -1
  79. package/lib/module/cli.spec.js +0 -190
  80. package/lib/module/cli.spec.js.map +0 -1
  81. package/lib/module/flatten.spec.js +0 -31
  82. package/lib/module/flatten.spec.js.map +0 -1
  83. package/lib/module/load-env.spec.js +0 -257
  84. package/lib/module/load-env.spec.js.map +0 -1
  85. package/lib/module/main.spec.js +0 -224
  86. package/lib/module/main.spec.js.map +0 -1
  87. package/lib/module/render-env.spec.js +0 -396
  88. package/lib/module/render-env.spec.js.map +0 -1
  89. package/lib/module/resolve-env.spec.js +0 -30
  90. package/lib/module/resolve-env.spec.js.map +0 -1
  91. package/lib/module/validate-env.spec.js +0 -325
  92. package/lib/module/validate-env.spec.js.map +0 -1
  93. package/lib/module/write-env.spec.js +0 -115
  94. package/lib/module/write-env.spec.js.map +0 -1
  95. package/lib/typescript/src/bin.spec.d.ts +0 -2
  96. package/lib/typescript/src/bin.spec.d.ts.map +0 -1
  97. package/lib/typescript/src/cli.spec.d.ts +0 -14
  98. package/lib/typescript/src/cli.spec.d.ts.map +0 -1
  99. package/lib/typescript/src/flatten.spec.d.ts +0 -2
  100. package/lib/typescript/src/flatten.spec.d.ts.map +0 -1
  101. package/lib/typescript/src/load-env.spec.d.ts +0 -6
  102. package/lib/typescript/src/load-env.spec.d.ts.map +0 -1
  103. package/lib/typescript/src/main.spec.d.ts +0 -2
  104. package/lib/typescript/src/main.spec.d.ts.map +0 -1
  105. package/lib/typescript/src/render-env.spec.d.ts +0 -2
  106. package/lib/typescript/src/render-env.spec.d.ts.map +0 -1
  107. package/lib/typescript/src/resolve-env.spec.d.ts +0 -2
  108. package/lib/typescript/src/resolve-env.spec.d.ts.map +0 -1
  109. package/lib/typescript/src/validate-env.spec.d.ts +0 -2
  110. package/lib/typescript/src/validate-env.spec.d.ts.map +0 -1
  111. package/lib/typescript/src/write-env.spec.d.ts +0 -9
  112. package/lib/typescript/src/write-env.spec.d.ts.map +0 -1
@@ -4,24 +4,37 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.validate_env = validate_env;
7
+ exports.validate_keys = validate_keys;
7
8
  const VALID_KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
8
9
 
9
10
  /**
10
- * Validate env data against a schema defined in `.rncurc.js`.
11
- * Called after `on_env` so the hook can add/transform vars before validation.
11
+ * Validate that all env key names are valid C/Java/JS identifiers.
12
+ * This runs UNCONDITIONALLY (even without a schema) to prevent template
13
+ * injection in generated native files (ConfigValues.h, xcconfig, override.js).
12
14
  *
13
- * Throws with a human-readable error listing ALL failures at once
14
- * (not just the first one), so users can fix everything in one pass.
15
+ * Throws with a human-readable error listing ALL invalid keys at once.
15
16
  */
16
- function validate_env(env, schema) {
17
+ function validate_keys(env) {
17
18
  const errors = [];
18
-
19
- // Validate all env key names are valid identifiers
20
19
  for (const key of Object.keys(env)) {
21
20
  if (!VALID_KEY_PATTERN.test(key)) {
22
21
  errors.push(`Invalid env key name: "${key}". Keys must start with a letter or underscore and contain only letters, numbers, and underscores.`);
23
22
  }
24
23
  }
24
+ if (errors.length > 0) {
25
+ throw new Error(`\n\n❌ react-native-config-ultimate: invalid key names:\n` + errors.map(e => ` • ${e}`).join('\n') + '\n');
26
+ }
27
+ }
28
+
29
+ /**
30
+ * Validate env data against a schema defined in `.rncurc.js`.
31
+ * Called after `on_env` so the hook can add/transform vars before validation.
32
+ *
33
+ * Throws with a human-readable error listing ALL failures at once
34
+ * (not just the first one), so users can fix everything in one pass.
35
+ */
36
+ function validate_env(env, schema) {
37
+ const errors = [];
25
38
 
26
39
  // Pre-compile all regex patterns once, before iterating over env values.
27
40
  // This avoids re-compiling the same pattern for every validated key.
@@ -1 +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;AACO,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":[]}
1
+ {"version":3,"names":["VALID_KEY_PATTERN","validate_keys","env","errors","key","Object","keys","test","push","length","Error","map","e","join","validate_env","schema","compiled_patterns","Map","field","entries","pattern","set","RegExp","raw","missing","undefined","String","trim","required","value","type","isNaN","Number","includes","toLowerCase","get"],"sourceRoot":"../../src","sources":["validate-env.ts"],"mappings":"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","ignoreList":[]}
package/lib/module/cli.js CHANGED
@@ -35,7 +35,7 @@ export default async function cli() {
35
35
  default: false,
36
36
  description: 'Watch env file(s) for changes and regenerate automatically. ' + 'Note: changes to native vars (iOS xcconfig, Android BuildConfig) ' + 'still require a full native rebuild.'
37
37
  }).usage('Usage: $0 <env-file> [env-file2 ...] [options]').help().parseAsync();
38
- const project_root = argv.projectRoot;
38
+ const project_root = path.resolve(argv.projectRoot);
39
39
 
40
40
  /**
41
41
  * Resolve the library root directory.
@@ -50,7 +50,7 @@ export default async function cli() {
50
50
  * (write-env.ts will create the directories on first run).
51
51
  */
52
52
  const lib_root = (() => {
53
- if (argv.libRoot) return argv.libRoot;
53
+ if (argv.libRoot) return path.resolve(argv.libRoot);
54
54
  const conventional = path.join(project_root, 'node_modules', 'react-native-config-ultimate');
55
55
 
56
56
  // If the directory already exists at the conventional location, use it.
@@ -72,6 +72,10 @@ export default async function cli() {
72
72
  // Accept one or more positional env file paths.
73
73
  // Multiple files are merged left-to-right (last file wins for conflicting keys).
74
74
  const env_files = argv._.map(String);
75
+ if (env_files.length === 0) {
76
+ log_err('No env file specified. Usage: rncu <env-file> [env-file2 ...]');
77
+ process.exit(1);
78
+ }
75
79
 
76
80
  // Validate env files exist before running anything.
77
81
  const missing_files = env_files.filter(f => !fs.existsSync(f));
@@ -133,4 +137,9 @@ export default async function cli() {
133
137
  void watcher.close().then(() => process.exit(0));
134
138
  });
135
139
  }
140
+
141
+ // Auto-invoke when run as CLI script (not when required by tests)
142
+ if (require.main === module) {
143
+ cli();
144
+ }
136
145
  //# sourceMappingURL=cli.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["yargs","path","fs","watch","main","load_rc","rc_file","existsSync","undefined","require","cache","resolve","log","msg","process","stdout","write","log_err","stderr","cli","argv","slice","option","type","default","cwd","description","alias","usage","help","parseAsync","project_root","projectRoot","lib_root","libRoot","conventional","join","pkg_json","paths","dirname","env_files","_","map","String","missing_files","filter","f","length","exit","run","changed_path","start","Date","now","rc","err","Error","message","files_to_watch","watcher","ignoreInitial","persistent","on","p","stdin","resume","close","then"],"sourceRoot":"../../src","sources":["cli.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["yargs","path","fs","watch","main","load_rc","rc_file","existsSync","undefined","require","cache","resolve","log","msg","process","stdout","write","log_err","stderr","cli","argv","slice","option","type","default","cwd","description","alias","usage","help","parseAsync","project_root","projectRoot","lib_root","libRoot","conventional","join","pkg_json","paths","dirname","env_files","_","map","String","length","exit","missing_files","filter","f","run","changed_path","start","Date","now","rc","err","Error","message","files_to_watch","watcher","ignoreInitial","persistent","on","p","stdin","resume","close","then","module"],"sourceRoot":"../../src","sources":["cli.ts"],"mappings":"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","ignoreList":[]}
@@ -8,7 +8,12 @@ export default function flatten(config, platform) {
8
8
  const result = {};
9
9
  for (const [key, value] of Object.entries(config)) {
10
10
  if (value && typeof value === 'object') {
11
- result[key] = value[platform];
11
+ const resolved = value[platform];
12
+ // Only include the key if this platform has a value defined.
13
+ // Omitting undefined prevents broken output in native templates.
14
+ if (resolved !== undefined) {
15
+ result[key] = resolved;
16
+ }
12
17
  } else {
13
18
  result[key] = value;
14
19
  }
@@ -1 +1 @@
1
- {"version":3,"names":["assert","VALID_PLATFORMS","flatten","config","platform","includes","join","result","key","value","Object","entries"],"sourceRoot":"../../src","sources":["flatten.ts"],"mappings":";;AAAA,OAAOA,MAAM,MAAM,QAAQ;AAQ3B,MAAMC,eAA2B,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC;AAE7D,eAAe,SAASC,OAAOA,CAACC,MAAiB,EAAEC,QAAkB,EAAc;EACjFJ,MAAM,CAACG,MAAM,IAAI,OAAOA,MAAM,KAAK,QAAQ,EAAE,kCAAkC,CAAC;EAChFH,MAAM,CACJC,eAAe,CAACI,QAAQ,CAACD,QAAQ,CAAC,EAClC,4BAA4B,GAAGH,eAAe,CAACK,IAAI,CAAC,IAAI,CAC1D,CAAC;EACD,MAAMC,MAAkB,GAAG,CAAC,CAAC;EAC7B,KAAK,MAAM,CAACC,GAAG,EAAEC,KAAK,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACR,MAAM,CAAC,EAAE;IACjD,IAAIM,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;MACtCF,MAAM,CAACC,GAAG,CAAC,GAAIC,KAAK,CAAsBL,QAAQ,CAAC;IACrD,CAAC,MAAM;MACLG,MAAM,CAACC,GAAG,CAAC,GAAGC,KAAoB;IACpC;EACF;EACA,OAAOF,MAAM;AACf","ignoreList":[]}
1
+ {"version":3,"names":["assert","VALID_PLATFORMS","flatten","config","platform","includes","join","result","key","value","Object","entries","resolved","undefined"],"sourceRoot":"../../src","sources":["flatten.ts"],"mappings":";;AAAA,OAAOA,MAAM,MAAM,QAAQ;AAQ3B,MAAMC,eAA2B,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC;AAE7D,eAAe,SAASC,OAAOA,CAACC,MAAiB,EAAEC,QAAkB,EAAc;EACjFJ,MAAM,CAACG,MAAM,IAAI,OAAOA,MAAM,KAAK,QAAQ,EAAE,kCAAkC,CAAC;EAChFH,MAAM,CACJC,eAAe,CAACI,QAAQ,CAACD,QAAQ,CAAC,EAClC,4BAA4B,GAAGH,eAAe,CAACK,IAAI,CAAC,IAAI,CAC1D,CAAC;EACD,MAAMC,MAAkB,GAAG,CAAC,CAAC;EAC7B,KAAK,MAAM,CAACC,GAAG,EAAEC,KAAK,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACR,MAAM,CAAC,EAAE;IACjD,IAAIM,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;MACtC,MAAMG,QAAQ,GAAIH,KAAK,CAAsBL,QAAQ,CAAC;MACtD;MACA;MACA,IAAIQ,QAAQ,KAAKC,SAAS,EAAE;QAC1BN,MAAM,CAACC,GAAG,CAAC,GAAGI,QAAQ;MACxB;IACF,CAAC,MAAM;MACLL,MAAM,CAACC,GAAG,CAAC,GAAGC,KAAoB;IACpC;EACF;EACA,OAAOF,MAAM;AACf","ignoreList":[]}
@@ -16,6 +16,20 @@ function read_yaml(config_path) {
16
16
  if (typeof data === 'undefined' || data === null || typeof data !== 'object') {
17
17
  throw new Error(`Expected to read object from ${config_path}, but got '${data}'`);
18
18
  }
19
+
20
+ // Reject unsupported YAML types that would silently break template rendering.
21
+ // js-yaml parses unquoted dates (e.g. 2024-01-01) as Date objects.
22
+ const errors = [];
23
+ for (const [key, value] of Object.entries(data)) {
24
+ if (value instanceof Date) {
25
+ errors.push(`${key}: YAML parsed as Date. Quote the value to treat it as a string: "${key}: \\"${String(value)}\\""`);
26
+ } else if (Array.isArray(value)) {
27
+ errors.push(`${key}: arrays are not supported. Use per-platform objects or scalar values.`);
28
+ }
29
+ }
30
+ if (errors.length > 0) {
31
+ throw new Error(`[rncu] Unsupported value types in ${config_path}:\n` + errors.map(e => ` • ${e}`).join('\n'));
32
+ }
19
33
  return data;
20
34
  }
21
35
 
@@ -1 +1 @@
1
- {"version":3,"names":["dotenv","expand","yaml","path","fs","detect_format","config_path","ext","parse","read_yaml","data","load","readFileSync","toString","Error","load_env","config_paths","paths","Array","isArray","length","formats","map","allDotenv","every","f","raw","p","content","Object","assign","result","parsed","merged","i","expanded"],"sourceRoot":"../../src","sources":["load-env.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["dotenv","expand","yaml","path","fs","detect_format","config_path","ext","parse","read_yaml","data","load","readFileSync","toString","Error","errors","key","value","Object","entries","Date","push","String","Array","isArray","length","map","e","join","load_env","config_paths","paths","formats","allDotenv","every","f","raw","p","content","assign","result","parsed","merged","i","expanded"],"sourceRoot":"../../src","sources":["load-env.ts"],"mappings":"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","ignoreList":[]}
@@ -5,10 +5,10 @@ import render_env from './render-env';
5
5
  import write_env from './write-env';
6
6
  import flatten from './flatten';
7
7
  import resolve_env from './resolve-env';
8
- import { validate_env } from './validate-env';
8
+ import { validate_env, validate_keys } from './validate-env';
9
9
  /**
10
10
  * Main build-time pipeline:
11
- * load → resolve (on_env hook) → validate (schema) → flatten → render → write
11
+ * load → resolve (on_env hook) → validate keys → validate schema → flatten → render → write
12
12
  *
13
13
  * @param project_root Root of the React Native project
14
14
  * @param lib_root Root of the react-native-config-ultimate install
@@ -17,6 +17,10 @@ import { validate_env } from './validate-env';
17
17
  */
18
18
  export default async function main(project_root, lib_root, env_file, rc) {
19
19
  const env = await resolve_env(load_env(env_file), rc);
20
+
21
+ // Always validate key names — prevents template injection in generated
22
+ // native files regardless of whether the user has defined a schema.
23
+ validate_keys(env);
20
24
  if (rc?.schema) {
21
25
  validate_env(env, rc.schema);
22
26
  }
@@ -1 +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":[]}
1
+ {"version":3,"names":["load_env","render_env","write_env","flatten","resolve_env","validate_env","validate_keys","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,EAAEC,aAAa,QAAQ,gBAAgB;AAK5D;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,MAAMR,WAAW,CAACJ,QAAQ,CAACU,QAAQ,CAAC,EAAEC,EAAE,CAAC;;EAE9D;EACA;EACAL,aAAa,CAACM,GAAG,CAAC;EAElB,IAAID,EAAE,EAAEE,MAAM,EAAE;IACdR,YAAY,CAACO,GAAG,EAAED,EAAE,CAACE,MAAM,CAAC;EAC9B;EAEA,MAAMC,IAAI,GAAG;IACXC,GAAG,EAAEZ,OAAO,CAACS,GAAG,EAAe,KAAK,CAAC;IACrCI,OAAO,EAAEb,OAAO,CAACS,GAAG,EAAe,SAAS,CAAC;IAC7CK,GAAG,EAAEd,OAAO,CAACS,GAAG,EAAe,KAAK;EACtC,CAAC;EACD,MAAMM,cAAc,GAAGjB,UAAU,CAACO,YAAY,EAAEC,QAAQ,EAAEK,IAAI,EAAEH,EAAE,CAAC;EACnET,SAAS,CAACgB,cAAc,CAAC;AAC3B","ignoreList":[]}
@@ -25,7 +25,7 @@ function escape(value) {
25
25
  }
26
26
  function xcconfig_format(value) {
27
27
  if (is_string(value)) {
28
- return value.replace(/\/\//gm, '/$()/');
28
+ return value.replace(/\n/gm, '').replace(/\r/gm, '').replace(/\/\//gm, '/$()/');
29
29
  }
30
30
  return value;
31
31
  }
@@ -1 +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":[]}
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":[]}
@@ -18,7 +18,11 @@
18
18
  export default async function resolve_env(env, rc) {
19
19
  if (rc && rc.on_env) {
20
20
  const patched_env = await rc.on_env(env);
21
- return typeof patched_env === 'undefined' ? env : patched_env;
21
+ if (typeof patched_env === 'undefined') return env;
22
+ if (!patched_env || typeof patched_env !== 'object' || Array.isArray(patched_env)) {
23
+ throw new Error(`[rncu] on_env hook must return an object (or undefined to keep the original), ` + `but got ${typeof patched_env}: ${String(patched_env)}`);
24
+ }
25
+ return patched_env;
22
26
  } else {
23
27
  return env;
24
28
  }
@@ -1 +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":[]}
1
+ {"version":3,"names":["resolve_env","env","rc","on_env","patched_env","Array","isArray","Error","String"],"sourceRoot":"../../src","sources":["resolve-env.ts"],"mappings":";;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AA6BA,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,IAAI,OAAOG,WAAW,KAAK,WAAW,EAAE,OAAOH,GAAG;IAClD,IAAI,CAACG,WAAW,IAAI,OAAOA,WAAW,KAAK,QAAQ,IAAIC,KAAK,CAACC,OAAO,CAACF,WAAW,CAAC,EAAE;MACjF,MAAM,IAAIG,KAAK,CACb,gFAAgF,GAC9E,WAAW,OAAOH,WAAW,KAAKI,MAAM,CAACJ,WAAW,CAAC,EACzD,CAAC;IACH;IACA,OAAOA,WAAW;EACpB,CAAC,MAAM;IACL,OAAOH,GAAG;EACZ;AACF","ignoreList":[]}
@@ -4,13 +4,4 @@ const IOS_DATA = {{{toJSON @root.ios}}}
4
4
 
5
5
  const ANDROID_DATA = {{{toJSON @root.android}}}
6
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
- }
7
+ module.exports = RN.Platform.select({ ios: IOS_DATA, android: ANDROID_DATA }) || {};
@@ -3,21 +3,33 @@
3
3
  const VALID_KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
4
4
 
5
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.
6
+ * Validate that all env key names are valid C/Java/JS identifiers.
7
+ * This runs UNCONDITIONALLY (even without a schema) to prevent template
8
+ * injection in generated native files (ConfigValues.h, xcconfig, override.js).
8
9
  *
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.
10
+ * Throws with a human-readable error listing ALL invalid keys at once.
11
11
  */
12
- export function validate_env(env, schema) {
12
+ export function validate_keys(env) {
13
13
  const errors = [];
14
-
15
- // Validate all env key names are valid identifiers
16
14
  for (const key of Object.keys(env)) {
17
15
  if (!VALID_KEY_PATTERN.test(key)) {
18
16
  errors.push(`Invalid env key name: "${key}". Keys must start with a letter or underscore and contain only letters, numbers, and underscores.`);
19
17
  }
20
18
  }
19
+ if (errors.length > 0) {
20
+ throw new Error(`\n\n❌ react-native-config-ultimate: invalid key names:\n` + errors.map(e => ` • ${e}`).join('\n') + '\n');
21
+ }
22
+ }
23
+
24
+ /**
25
+ * Validate env data against a schema defined in `.rncurc.js`.
26
+ * Called after `on_env` so the hook can add/transform vars before validation.
27
+ *
28
+ * Throws with a human-readable error listing ALL failures at once
29
+ * (not just the first one), so users can fix everything in one pass.
30
+ */
31
+ export function validate_env(env, schema) {
32
+ const errors = [];
21
33
 
22
34
  // Pre-compile all regex patterns once, before iterating over env values.
23
35
  // This avoids re-compiling the same pattern for every validated key.
@@ -1 +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":[]}
1
+ {"version":3,"names":["VALID_KEY_PATTERN","validate_keys","env","errors","key","Object","keys","test","push","length","Error","map","e","join","validate_env","schema","compiled_patterns","Map","field","entries","pattern","set","RegExp","raw","missing","undefined","String","trim","required","value","type","isNaN","Number","includes","toLowerCase","get"],"sourceRoot":"../../src","sources":["validate-env.ts"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/cli.ts"],"names":[],"mappings":"AA0BA,wBAA8B,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAmIjD"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/cli.ts"],"names":[],"mappings":"AA0BA,wBAA8B,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAwIjD"}
@@ -1 +1 @@
1
- {"version":3,"file":"flatten.d.ts","sourceRoot":"","sources":["../../../src/flatten.ts"],"names":[],"mappings":"AAEA,KAAK,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC;AAC1C,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AACpD,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;AACtE,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,CAAC,CAAC;AACvE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC,CAAC;AAIjE,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,GAAG,UAAU,CAejF"}
1
+ {"version":3,"file":"flatten.d.ts","sourceRoot":"","sources":["../../../src/flatten.ts"],"names":[],"mappings":"AAEA,KAAK,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC;AAC1C,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AACpD,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;AACtE,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,CAAC,CAAC;AACvE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC,CAAC;AAIjE,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,GAAG,UAAU,CAoBjF"}
@@ -1 +1 @@
1
- {"version":3,"file":"load-env.d.ts","sourceRoot":"","sources":["../../../src/load-env.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAiB7C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAqCzE"}
1
+ {"version":3,"file":"load-env.d.ts","sourceRoot":"","sources":["../../../src/load-env.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAmC7C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAqCzE"}
@@ -1,7 +1,7 @@
1
1
  import type { RC } from './resolve-env';
2
2
  /**
3
3
  * Main build-time pipeline:
4
- * load → resolve (on_env hook) → validate (schema) → flatten → render → write
4
+ * load → resolve (on_env hook) → validate keys → validate schema → flatten → render → write
5
5
  *
6
6
  * @param project_root Root of the React Native project
7
7
  * @param lib_root Root of the react-native-config-ultimate install
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../src/main.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,EAAE,EAAW,MAAM,eAAe,CAAC;AAGjD;;;;;;;;GAQG;AACH,wBAA8B,IAAI,CAChC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAC3B,EAAE,CAAC,EAAE,EAAE,GACN,OAAO,CAAC,IAAI,CAAC,CAcf"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../src/main.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,EAAE,EAAW,MAAM,eAAe,CAAC;AAGjD;;;;;;;;GAQG;AACH,wBAA8B,IAAI,CAChC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAC3B,EAAE,CAAC,EAAE,EAAE,GACN,OAAO,CAAC,IAAI,CAAC,CAkBf"}
@@ -1 +1 @@
1
- {"version":3,"file":"render-env.d.ts","sourceRoot":"","sources":["../../../src/render-env.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAoE3C,UAAU,WAAW;IACnB,GAAG,EAAE,UAAU,CAAC;IAChB,OAAO,EAAE,UAAU,CAAC;IACpB,GAAG,EAAE,UAAU,CAAC;CACjB;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,CAChC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,WAAW,EAChB,EAAE,CAAC,EAAE,EAAE,GACN,OAAO,CAyBT"}
1
+ {"version":3,"file":"render-env.d.ts","sourceRoot":"","sources":["../../../src/render-env.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAuE3C,UAAU,WAAW;IACnB,GAAG,EAAE,UAAU,CAAC;IAChB,OAAO,EAAE,UAAU,CAAC;IACpB,GAAG,EAAE,UAAU,CAAC;CACjB;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,CAChC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,WAAW,EAChB,EAAE,CAAC,EAAE,EAAE,GACN,OAAO,CAyBT"}
@@ -23,7 +23,14 @@ export interface SchemaField {
23
23
  }
24
24
  export type Schema = Record<string, SchemaField>;
25
25
  export interface RC {
26
- on_env?: (env: EnvData) => unknown;
26
+ /**
27
+ * Hook to transform env data before validation and rendering.
28
+ * Return the modified env object, or `undefined`/`void` to keep the original.
29
+ *
30
+ * **Important:** if you mutate `env` in place without returning it, the
31
+ * mutations are ignored. Always return the modified object.
32
+ */
33
+ on_env?: (env: EnvData) => EnvData | undefined | void | Promise<EnvData | undefined | void>;
27
34
  js_override?: boolean;
28
35
  /**
29
36
  * Optional schema for build-time validation of env vars.
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-env.d.ts","sourceRoot":"","sources":["../../../src/resolve-env.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE9C;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,WAAW;IAC1B,6FAA6F;IAC7F,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACtC,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sFAAsF;IACtF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAEjD,MAAM,WAAW,EAAE;IACjB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAA8B,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAOjF"}
1
+ {"version":3,"file":"resolve-env.d.ts","sourceRoot":"","sources":["../../../src/resolve-env.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE9C;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,WAAW;IAC1B,6FAA6F;IAC7F,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACtC,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sFAAsF;IACtF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAEjD,MAAM,WAAW,EAAE;IACjB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;IAC5F,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAA8B,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAcjF"}
@@ -1,4 +1,12 @@
1
1
  import type { EnvData, Schema } from './resolve-env';
2
+ /**
3
+ * Validate that all env key names are valid C/Java/JS identifiers.
4
+ * This runs UNCONDITIONALLY (even without a schema) to prevent template
5
+ * injection in generated native files (ConfigValues.h, xcconfig, override.js).
6
+ *
7
+ * Throws with a human-readable error listing ALL invalid keys at once.
8
+ */
9
+ export declare function validate_keys(env: EnvData): void;
2
10
  /**
3
11
  * Validate env data against a schema defined in `.rncurc.js`.
4
12
  * Called after `on_env` so the hook can add/transform vars before validation.
@@ -1 +1 @@
1
- {"version":3,"file":"validate-env.d.ts","sourceRoot":"","sources":["../../../src/validate-env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAIrD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA2D/D"}
1
+ {"version":3,"file":"validate-env.d.ts","sourceRoot":"","sources":["../../../src/validate-env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAIrD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAgBhD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAkD/D"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "react-native-config-ultimate",
3
3
  "title": "React Native Config Ultimate",
4
- "version": "0.1.0",
4
+ "version": "0.2.1",
5
5
  "description": "Config that works. A community-maintained fork of react-native-ultimate-config.",
6
6
  "main": "./lib/commonjs/index.js",
7
7
  "module": "./lib/module/index.js",
@@ -13,6 +13,7 @@
13
13
  "react-native": "./src/index.ts",
14
14
  "source": "./src/index.ts",
15
15
  "types": "./lib/typescript/src/index.d.ts",
16
+ "browser": "./index.web.js",
16
17
  "default": "./lib/module/index.js"
17
18
  },
18
19
  "./package.json": "./package.json"
@@ -24,6 +25,7 @@
24
25
  "ios",
25
26
  "*.podspec",
26
27
  "!src/**/*.spec.ts",
28
+ "!lib/**/*.spec.*",
27
29
  "!src/test_outputs",
28
30
  "!ios/build",
29
31
  "!android/build",
@@ -109,6 +111,7 @@
109
111
  "eslint-config-prettier": "^10.1.8",
110
112
  "eslint-plugin-prettier": "^5.5.4",
111
113
  "jest": "^29.7.0",
114
+ "jest-environment-node": "^29.7.0",
112
115
  "prettier": "^3.4.2",
113
116
  "react": "19.2.0",
114
117
  "react-native": "0.83.0",
@@ -132,7 +135,6 @@
132
135
  "workspaces": [
133
136
  "example"
134
137
  ],
135
- "packageManager": "yarn@4.11.0",
136
138
  "react-native-builder-bob": {
137
139
  "source": "src",
138
140
  "output": "lib",
package/src/cli.ts CHANGED
@@ -50,7 +50,7 @@ export default async function cli(): Promise<void> {
50
50
  .help()
51
51
  .parseAsync();
52
52
 
53
- const project_root = argv.projectRoot;
53
+ const project_root = path.resolve(argv.projectRoot);
54
54
 
55
55
  /**
56
56
  * Resolve the library root directory.
@@ -65,7 +65,7 @@ export default async function cli(): Promise<void> {
65
65
  * (write-env.ts will create the directories on first run).
66
66
  */
67
67
  const lib_root: string = (() => {
68
- if (argv.libRoot) return argv.libRoot;
68
+ if (argv.libRoot) return path.resolve(argv.libRoot);
69
69
 
70
70
  const conventional = path.join(project_root, 'node_modules', 'react-native-config-ultimate');
71
71
 
@@ -89,6 +89,11 @@ export default async function cli(): Promise<void> {
89
89
  // Multiple files are merged left-to-right (last file wins for conflicting keys).
90
90
  const env_files = argv._.map(String);
91
91
 
92
+ if (env_files.length === 0) {
93
+ log_err('No env file specified. Usage: rncu <env-file> [env-file2 ...]');
94
+ process.exit(1);
95
+ }
96
+
92
97
  // Validate env files exist before running anything.
93
98
  const missing_files = env_files.filter((f) => !fs.existsSync(f));
94
99
  if (missing_files.length > 0) {
@@ -156,3 +161,8 @@ export default async function cli(): Promise<void> {
156
161
  void watcher.close().then(() => process.exit(0));
157
162
  });
158
163
  }
164
+
165
+ // Auto-invoke when run as CLI script (not when required by tests)
166
+ if (require.main === module) {
167
+ cli();
168
+ }
package/src/flatten.ts CHANGED
@@ -17,7 +17,12 @@ export default function flatten(config: EnvConfig, platform: Platform): FlatConf
17
17
  const result: FlatConfig = {};
18
18
  for (const [key, value] of Object.entries(config)) {
19
19
  if (value && typeof value === 'object') {
20
- result[key] = (value as PerPlatformValue)[platform];
20
+ const resolved = (value as PerPlatformValue)[platform];
21
+ // Only include the key if this platform has a value defined.
22
+ // Omitting undefined prevents broken output in native templates.
23
+ if (resolved !== undefined) {
24
+ result[key] = resolved;
25
+ }
21
26
  } else {
22
27
  result[key] = value as ConfigValue;
23
28
  }
package/src/load-env.ts CHANGED
@@ -18,6 +18,24 @@ function read_yaml(config_path: string): EnvData {
18
18
  if (typeof data === 'undefined' || data === null || typeof data !== 'object') {
19
19
  throw new Error(`Expected to read object from ${config_path}, but got '${data}'`);
20
20
  }
21
+
22
+ // Reject unsupported YAML types that would silently break template rendering.
23
+ // js-yaml parses unquoted dates (e.g. 2024-01-01) as Date objects.
24
+ const errors: string[] = [];
25
+ for (const [key, value] of Object.entries(data as Record<string, unknown>)) {
26
+ if (value instanceof Date) {
27
+ errors.push(`${key}: YAML parsed as Date. Quote the value to treat it as a string: "${key}: \\"${String(value)}\\""`);
28
+ } else if (Array.isArray(value)) {
29
+ errors.push(`${key}: arrays are not supported. Use per-platform objects or scalar values.`);
30
+ }
31
+ }
32
+ if (errors.length > 0) {
33
+ throw new Error(
34
+ `[rncu] Unsupported value types in ${config_path}:\n` +
35
+ errors.map((e) => ` • ${e}`).join('\n')
36
+ );
37
+ }
38
+
21
39
  return data as EnvData;
22
40
  }
23
41
 
package/src/main.ts CHANGED
@@ -3,14 +3,14 @@ import render_env from './render-env';
3
3
  import write_env from './write-env';
4
4
  import flatten from './flatten';
5
5
  import resolve_env from './resolve-env';
6
- import { validate_env } from './validate-env';
6
+ import { validate_env, validate_keys } from './validate-env';
7
7
 
8
8
  import type { RC, EnvData } from './resolve-env';
9
9
  import type { EnvConfig } from './flatten';
10
10
 
11
11
  /**
12
12
  * Main build-time pipeline:
13
- * load → resolve (on_env hook) → validate (schema) → flatten → render → write
13
+ * load → resolve (on_env hook) → validate keys → validate schema → flatten → render → write
14
14
  *
15
15
  * @param project_root Root of the React Native project
16
16
  * @param lib_root Root of the react-native-config-ultimate install
@@ -25,6 +25,10 @@ export default async function main(
25
25
  ): Promise<void> {
26
26
  const env: EnvData = await resolve_env(load_env(env_file), rc);
27
27
 
28
+ // Always validate key names — prevents template injection in generated
29
+ // native files regardless of whether the user has defined a schema.
30
+ validate_keys(env);
31
+
28
32
  if (rc?.schema) {
29
33
  validate_env(env, rc.schema);
30
34
  }
package/src/render-env.ts CHANGED
@@ -36,7 +36,10 @@ function escape(value: unknown): unknown {
36
36
 
37
37
  function xcconfig_format(value: unknown): unknown {
38
38
  if (is_string(value)) {
39
- return (value as string).replace(/\/\//gm, '/$()/');
39
+ return (value as string)
40
+ .replace(/\n/gm, '')
41
+ .replace(/\r/gm, '')
42
+ .replace(/\/\//gm, '/$()/');
40
43
  }
41
44
  return value;
42
45
  }