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 @@
|
|
|
1
|
+
HELLO: "world"
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _reactNative = require("react-native");
|
|
8
|
+
/**
|
|
9
|
+
* TurboModule spec for react-native-config-ultimate
|
|
10
|
+
* This file is read by React Native Codegen to generate native bindings.
|
|
11
|
+
* Do not rename or move this file - Codegen relies on the "Native" prefix.
|
|
12
|
+
*
|
|
13
|
+
* NOTE: We use getAll(): string instead of getConstants(): {} because:
|
|
14
|
+
* - Codegen requires getConstants() to have a concrete return type with named fields
|
|
15
|
+
* - Config keys are dynamic (generated from .env at build time), so a fixed type is impossible
|
|
16
|
+
* - getAll() returns all config values as a JSON-encoded string, which Codegen handles perfectly
|
|
17
|
+
* - This gives us a working TurboModule binding for New Architecture
|
|
18
|
+
*/
|
|
19
|
+
var _default = exports.default = _reactNative.TurboModuleRegistry.get('UltimateConfig');
|
|
20
|
+
//# sourceMappingURL=NativeUltimateConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","get"],"sourceRoot":"../../src","sources":["NativeUltimateConfig.ts"],"mappings":";;;;;;AAWA,IAAAA,YAAA,GAAAC,OAAA;AAXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAVA,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAmBeC,gCAAmB,CAACC,GAAG,CAAO,gBAAgB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _child_process = _interopRequireDefault(require("child_process"));
|
|
4
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
5
|
+
var _path = _interopRequireDefault(require("path"));
|
|
6
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
8
|
+
const {
|
|
9
|
+
files_to_assert
|
|
10
|
+
} = require('./main.spec');
|
|
11
|
+
|
|
12
|
+
// TODO: Re-enable after fixing integration test paths for bob build output
|
|
13
|
+
describe.skip.each`
|
|
14
|
+
extension | env_test_content
|
|
15
|
+
${''} | ${'hello=world'}
|
|
16
|
+
${'.yaml'} | ${'hello: world'}
|
|
17
|
+
${'.yml'} | ${'hello: world'}
|
|
18
|
+
`('test codegen', ({
|
|
19
|
+
extension,
|
|
20
|
+
env_test_content
|
|
21
|
+
}) => {
|
|
22
|
+
let project_root;
|
|
23
|
+
beforeAll(() => {
|
|
24
|
+
project_root = _path.default.join(process.cwd(), _fs.default.mkdtempSync('rncu-jest'));
|
|
25
|
+
for (const file_path of files_to_assert) {
|
|
26
|
+
const {
|
|
27
|
+
dir
|
|
28
|
+
} = _path.default.parse(file_path);
|
|
29
|
+
const folder = _path.default.join(project_root, dir);
|
|
30
|
+
_fs.default.mkdirSync(folder, {
|
|
31
|
+
recursive: true
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
afterAll(() => {
|
|
36
|
+
_fs.default.rmSync(project_root, {
|
|
37
|
+
recursive: true,
|
|
38
|
+
force: true
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
it.each(files_to_assert.map(k => [k]))('creates file at path %s', file_path => {
|
|
42
|
+
const env_file_path = _path.default.join(project_root, `.env${extension}`);
|
|
43
|
+
_fs.default.writeFileSync(env_file_path, env_test_content);
|
|
44
|
+
_child_process.default.execFileSync('node', [_path.default.join(process.cwd(), 'lib/commonjs/cli.js'), env_file_path], {
|
|
45
|
+
cwd: project_root
|
|
46
|
+
});
|
|
47
|
+
expect(_fs.default.existsSync(_path.default.join(project_root, file_path))).toEqual(true);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=bin.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_child_process","_interopRequireDefault","require","_fs","_path","e","__esModule","default","files_to_assert","describe","skip","each","extension","env_test_content","project_root","beforeAll","path","join","process","cwd","fs","mkdtempSync","file_path","dir","parse","folder","mkdirSync","recursive","afterAll","rmSync","force","it","map","k","env_file_path","writeFileSync","cp","execFileSync","expect","existsSync","toEqual"],"sourceRoot":"../../src","sources":["bin.spec.ts"],"mappings":";;AAAA,IAAAA,cAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,GAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,KAAA,GAAAH,sBAAA,CAAAC,OAAA;AAAwB,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AACxB;AACA,MAAM;EAAEG;AAAgB,CAAC,GAAGN,OAAO,CAAC,aAAa,CAAkC;;AAEnF;AACAO,QAAQ,CAACC,IAAI,CAACC,IAAI;AAClB;AACA,IAAI,EAAE,WAAW,aAAa;AAC9B,IAAI,OAAO,MAAM,cAAc;AAC/B,IAAI,MAAM,OAAO,cAAc;AAC/B,CAAC,CACC,cAAc,EACd,CAAC;EAAEC,SAAS;EAAEC;AAAkE,CAAC,KAAK;EACpF,IAAIC,YAAoB;EACxBC,SAAS,CAAC,MAAM;IACdD,YAAY,GAAGE,aAAI,CAACC,IAAI,CAACC,OAAO,CAACC,GAAG,CAAC,CAAC,EAAEC,WAAE,CAACC,WAAW,CAAC,WAAW,CAAC,CAAC;IACpE,KAAK,MAAMC,SAAS,IAAId,eAAe,EAAE;MACvC,MAAM;QAAEe;MAAI,CAAC,GAAGP,aAAI,CAACQ,KAAK,CAACF,SAAS,CAAC;MACrC,MAAMG,MAAM,GAAGT,aAAI,CAACC,IAAI,CAACH,YAAY,EAAES,GAAG,CAAC;MAC3CH,WAAE,CAACM,SAAS,CAACD,MAAM,EAAE;QAAEE,SAAS,EAAE;MAAK,CAAC,CAAC;IAC3C;EACF,CAAC,CAAC;EACFC,QAAQ,CAAC,MAAM;IACbR,WAAE,CAACS,MAAM,CAACf,YAAY,EAAE;MAAEa,SAAS,EAAE,IAAI;MAAEG,KAAK,EAAE;IAAK,CAAC,CAAC;EAC3D,CAAC,CAAC;EACFC,EAAE,CAACpB,IAAI,CAACH,eAAe,CAACwB,GAAG,CAAEC,CAAC,IAAK,CAACA,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB,EAAGX,SAAS,IAAK;IACjF,MAAMY,aAAa,GAAGlB,aAAI,CAACC,IAAI,CAACH,YAAY,EAAE,OAAOF,SAAS,EAAE,CAAC;IACjEQ,WAAE,CAACe,aAAa,CAACD,aAAa,EAAErB,gBAAgB,CAAC;IACjDuB,sBAAE,CAACC,YAAY,CAAC,MAAM,EAAE,CAACrB,aAAI,CAACC,IAAI,CAACC,OAAO,CAACC,GAAG,CAAC,CAAC,EAAE,qBAAqB,CAAC,EAAEe,aAAa,CAAC,EAAE;MACxFf,GAAG,EAAEL;IACP,CAAC,CAAC;IACFwB,MAAM,CAAClB,WAAE,CAACmB,UAAU,CAACvB,aAAI,CAACC,IAAI,CAACH,YAAY,EAAEQ,SAAmB,CAAC,CAAC,CAAC,CAACkB,OAAO,CAAC,IAAI,CAAC;EACnF,CAAC,CAAC;AACJ,CACF,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = cli;
|
|
8
|
+
var _yargs = _interopRequireDefault(require("yargs"));
|
|
9
|
+
var path = _interopRequireWildcard(require("path"));
|
|
10
|
+
var fs = _interopRequireWildcard(require("fs"));
|
|
11
|
+
var _chokidar = require("chokidar");
|
|
12
|
+
var _main = _interopRequireDefault(require("./main"));
|
|
13
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
14
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
|
+
/**
|
|
16
|
+
* Load the RC file fresh on every call (clears require cache so
|
|
17
|
+
* changes to .rncurc.js are picked up during --watch mode).
|
|
18
|
+
*/
|
|
19
|
+
function load_rc(rc_file) {
|
|
20
|
+
if (!fs.existsSync(rc_file)) return undefined;
|
|
21
|
+
delete require.cache[require.resolve(rc_file)];
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports
|
|
23
|
+
return require(rc_file);
|
|
24
|
+
}
|
|
25
|
+
function log(msg) {
|
|
26
|
+
process.stdout.write(`[rncu] ${msg}\n`);
|
|
27
|
+
}
|
|
28
|
+
function log_err(msg) {
|
|
29
|
+
process.stderr.write(`[rncu] ✗ ${msg}\n`);
|
|
30
|
+
}
|
|
31
|
+
async function cli() {
|
|
32
|
+
const argv = await (0, _yargs.default)(process.argv.slice(2)).option('projectRoot', {
|
|
33
|
+
type: 'string',
|
|
34
|
+
default: process.cwd(),
|
|
35
|
+
description: 'Root directory of the React Native project'
|
|
36
|
+
}).option('libRoot', {
|
|
37
|
+
type: 'string',
|
|
38
|
+
description: 'Root directory of react-native-config-ultimate ' + '(defaults to <projectRoot>/node_modules/react-native-config-ultimate)'
|
|
39
|
+
}).option('watch', {
|
|
40
|
+
alias: 'w',
|
|
41
|
+
type: 'boolean',
|
|
42
|
+
default: false,
|
|
43
|
+
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.'
|
|
44
|
+
}).usage('Usage: $0 <env-file> [env-file2 ...] [options]').help().parseAsync();
|
|
45
|
+
const project_root = argv.projectRoot;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Resolve the library root directory.
|
|
49
|
+
*
|
|
50
|
+
* Priority:
|
|
51
|
+
* 1. --libRoot flag (explicit override)
|
|
52
|
+
* 2. Conventional path <projectRoot>/node_modules/react-native-config-ultimate
|
|
53
|
+
* — used when the directory exists (standard install, or bin.spec.ts integration test).
|
|
54
|
+
* 3. require.resolve() — handles npm workspaces hoisting, pnpm, Yarn PnP,
|
|
55
|
+
* and any layout where the package is hoisted above projectRoot.
|
|
56
|
+
* 4. Fall back to conventional path even if it doesn't exist yet
|
|
57
|
+
* (write-env.ts will create the directories on first run).
|
|
58
|
+
*/
|
|
59
|
+
const lib_root = (() => {
|
|
60
|
+
if (argv.libRoot) return argv.libRoot;
|
|
61
|
+
const conventional = path.join(project_root, 'node_modules', 'react-native-config-ultimate');
|
|
62
|
+
|
|
63
|
+
// If the directory already exists at the conventional location, use it.
|
|
64
|
+
// This handles standard installs and the integration test temp-dir setup.
|
|
65
|
+
if (fs.existsSync(conventional)) return conventional;
|
|
66
|
+
|
|
67
|
+
// Otherwise, try require.resolve to handle hoisted workspaces.
|
|
68
|
+
try {
|
|
69
|
+
const pkg_json = require.resolve('react-native-config-ultimate/package.json', {
|
|
70
|
+
paths: [project_root]
|
|
71
|
+
});
|
|
72
|
+
return path.dirname(pkg_json);
|
|
73
|
+
} catch {
|
|
74
|
+
// Last resort: return the conventional path and let write-env create it.
|
|
75
|
+
return conventional;
|
|
76
|
+
}
|
|
77
|
+
})();
|
|
78
|
+
|
|
79
|
+
// Accept one or more positional env file paths.
|
|
80
|
+
// Multiple files are merged left-to-right (last file wins for conflicting keys).
|
|
81
|
+
const env_files = argv._.map(String);
|
|
82
|
+
|
|
83
|
+
// Validate env files exist before running anything.
|
|
84
|
+
const missing_files = env_files.filter(f => !fs.existsSync(f));
|
|
85
|
+
if (missing_files.length > 0) {
|
|
86
|
+
for (const f of missing_files) {
|
|
87
|
+
log_err(`env file not found: ${f}`);
|
|
88
|
+
}
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
const rc_file = path.resolve(project_root, '.rncurc.js');
|
|
92
|
+
|
|
93
|
+
// Helper: run the full pipeline once, returning duration in ms.
|
|
94
|
+
// Never throws — errors are caught and logged so watch mode stays alive.
|
|
95
|
+
async function run(changed_path) {
|
|
96
|
+
if (changed_path) {
|
|
97
|
+
log(`${changed_path} changed → regenerating...`);
|
|
98
|
+
}
|
|
99
|
+
const start = Date.now();
|
|
100
|
+
try {
|
|
101
|
+
const rc = load_rc(rc_file);
|
|
102
|
+
await (0, _main.default)(project_root, lib_root, env_files, rc);
|
|
103
|
+
if (changed_path) {
|
|
104
|
+
log(`✓ done in ${Date.now() - start}ms`);
|
|
105
|
+
}
|
|
106
|
+
} catch (err) {
|
|
107
|
+
log_err(err instanceof Error ? err.message : String(err));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Initial run (always runs, throws on error in non-watch mode).
|
|
112
|
+
if (!argv.watch) {
|
|
113
|
+
const rc = load_rc(rc_file);
|
|
114
|
+
await (0, _main.default)(project_root, lib_root, env_files, rc);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// --watch mode ────────────────────────────────────────────────────────────
|
|
119
|
+
// Initial run (errors are caught — we still want to start watching).
|
|
120
|
+
await run();
|
|
121
|
+
|
|
122
|
+
// Files to watch: env files + RC file (if it exists).
|
|
123
|
+
const files_to_watch = [...env_files, ...(fs.existsSync(rc_file) ? [rc_file] : [])];
|
|
124
|
+
const watcher = (0, _chokidar.watch)(files_to_watch, {
|
|
125
|
+
ignoreInitial: true,
|
|
126
|
+
persistent: true
|
|
127
|
+
});
|
|
128
|
+
log(`watching: ${files_to_watch.join(', ')}\n` + `[rncu] ⚠ native vars (xcconfig/BuildConfig) require a full rebuild to take effect`);
|
|
129
|
+
watcher.on('change', p => void run(p));
|
|
130
|
+
watcher.on('add', p => void run(p));
|
|
131
|
+
|
|
132
|
+
// Keep the process alive (chokidar persistent:true already does this,
|
|
133
|
+
// but stdin.resume makes it explicit and survives edge cases).
|
|
134
|
+
process.stdin.resume();
|
|
135
|
+
|
|
136
|
+
// Graceful shutdown on Ctrl+C.
|
|
137
|
+
process.on('SIGINT', () => {
|
|
138
|
+
process.stdout.write('\n');
|
|
139
|
+
log('stopping...');
|
|
140
|
+
void watcher.close().then(() => process.exit(0));
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_yargs","_interopRequireDefault","require","path","_interopRequireWildcard","fs","_chokidar","_main","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","load_rc","rc_file","existsSync","undefined","cache","resolve","log","msg","process","stdout","write","log_err","stderr","cli","argv","yargs","slice","option","type","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","length","exit","run","changed_path","start","Date","now","rc","main","err","Error","message","watch","files_to_watch","watcher","ignoreInitial","persistent","on","p","stdin","resume","close","then"],"sourceRoot":"../../src","sources":["cli.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// All mocks must be declared before the module is required.
|
|
4
|
+
const mock_main = jest.fn();
|
|
5
|
+
jest.doMock('./main', () => ({
|
|
6
|
+
__esModule: true,
|
|
7
|
+
default: mock_main
|
|
8
|
+
}));
|
|
9
|
+
const mock_exists_sync = jest.fn();
|
|
10
|
+
jest.doMock('fs', () => ({
|
|
11
|
+
existsSync: mock_exists_sync
|
|
12
|
+
}));
|
|
13
|
+
|
|
14
|
+
// Mock watcher returned by chokidar.watch()
|
|
15
|
+
const mock_watcher_on = jest.fn();
|
|
16
|
+
const mock_watcher_close = jest.fn().mockResolvedValue(undefined);
|
|
17
|
+
const mock_watcher = {
|
|
18
|
+
on: mock_watcher_on.mockReturnThis(),
|
|
19
|
+
close: mock_watcher_close
|
|
20
|
+
};
|
|
21
|
+
const mock_chokidar_watch = jest.fn().mockReturnValue(mock_watcher);
|
|
22
|
+
jest.doMock('chokidar', () => ({
|
|
23
|
+
watch: mock_chokidar_watch
|
|
24
|
+
}));
|
|
25
|
+
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
27
|
+
const cli = require('./cli').default;
|
|
28
|
+
|
|
29
|
+
// ─── helpers ────────────────────────────────────────────────────────────────
|
|
30
|
+
|
|
31
|
+
function set_argv(...args) {
|
|
32
|
+
process.argv = ['node', 'rncu', ...args];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Grab the handler registered for a given chokidar event. */
|
|
36
|
+
function get_watcher_handler(event) {
|
|
37
|
+
const call = mock_watcher_on.mock.calls.find(([ev]) => ev === event);
|
|
38
|
+
return call?.[1];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// ─── test suite ──────────────────────────────────────────────────────────────
|
|
42
|
+
|
|
43
|
+
describe('cli', () => {
|
|
44
|
+
const original_argv = process.argv;
|
|
45
|
+
const stdin_resume_spy = jest.spyOn(process.stdin, 'resume').mockImplementation(() => process.stdin);
|
|
46
|
+
const process_on_spy = jest.spyOn(process, 'on').mockImplementation(() => process);
|
|
47
|
+
beforeEach(() => {
|
|
48
|
+
mock_main.mockReset().mockResolvedValue(undefined);
|
|
49
|
+
// Default: env files exist, RC file does NOT exist.
|
|
50
|
+
// This mimics the real-world baseline: user passes a valid .env file,
|
|
51
|
+
// but hasn't created a .rncurc.js config yet.
|
|
52
|
+
mock_exists_sync.mockReset().mockImplementation(p => !p.endsWith('.rncurc.js'));
|
|
53
|
+
mock_chokidar_watch.mockReset().mockReturnValue(mock_watcher);
|
|
54
|
+
mock_watcher_on.mockReset().mockReturnThis();
|
|
55
|
+
mock_watcher_close.mockReset().mockResolvedValue(undefined);
|
|
56
|
+
stdin_resume_spy.mockClear();
|
|
57
|
+
process_on_spy.mockClear();
|
|
58
|
+
});
|
|
59
|
+
afterAll(() => {
|
|
60
|
+
process.argv = original_argv;
|
|
61
|
+
stdin_resume_spy.mockRestore();
|
|
62
|
+
process_on_spy.mockRestore();
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
// ── normal (non-watch) mode ─────────────────────────────────────────────
|
|
66
|
+
|
|
67
|
+
describe('normal mode', () => {
|
|
68
|
+
it('runs main once with the env file and exits', async () => {
|
|
69
|
+
set_argv('.env');
|
|
70
|
+
await cli();
|
|
71
|
+
expect(mock_main).toHaveBeenCalledTimes(1);
|
|
72
|
+
expect(mock_main).toHaveBeenCalledWith(expect.any(String), expect.any(String), ['.env'], undefined);
|
|
73
|
+
expect(mock_chokidar_watch).not.toHaveBeenCalled();
|
|
74
|
+
});
|
|
75
|
+
it('passes multiple env files to main', async () => {
|
|
76
|
+
set_argv('.env.base', '.env.staging');
|
|
77
|
+
await cli();
|
|
78
|
+
expect(mock_main).toHaveBeenCalledWith(expect.any(String), expect.any(String), ['.env.base', '.env.staging'], undefined);
|
|
79
|
+
});
|
|
80
|
+
it('loads and passes RC file when it exists', async () => {
|
|
81
|
+
set_argv('.env');
|
|
82
|
+
// All files exist (env file + RC file). The RC file can't actually be
|
|
83
|
+
// resolved via require() in test env, so cli() is expected to throw.
|
|
84
|
+
mock_exists_sync.mockReturnValue(true);
|
|
85
|
+
await expect(cli()).rejects.toThrow();
|
|
86
|
+
});
|
|
87
|
+
it('propagates errors from main in non-watch mode', async () => {
|
|
88
|
+
set_argv('.env');
|
|
89
|
+
mock_main.mockRejectedValueOnce(new Error('missing var'));
|
|
90
|
+
await expect(cli()).rejects.toThrow('missing var');
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
// ── watch mode ──────────────────────────────────────────────────────────
|
|
95
|
+
|
|
96
|
+
describe('--watch mode', () => {
|
|
97
|
+
it('starts chokidar watcher on the env files', async () => {
|
|
98
|
+
set_argv('.env', '--watch');
|
|
99
|
+
await cli();
|
|
100
|
+
expect(mock_chokidar_watch).toHaveBeenCalledWith(['.env'], expect.objectContaining({
|
|
101
|
+
ignoreInitial: true,
|
|
102
|
+
persistent: true
|
|
103
|
+
}));
|
|
104
|
+
});
|
|
105
|
+
it('also watches .rncurc.js when it exists', async () => {
|
|
106
|
+
set_argv('.env', '--watch');
|
|
107
|
+
// All files exist (env + RC). We suppress the require() error below
|
|
108
|
+
// so the test can verify that .rncurc.js is added to the watcher list.
|
|
109
|
+
mock_exists_sync.mockReturnValue(true);
|
|
110
|
+
// Suppress require() failure for missing rc file in initial run
|
|
111
|
+
mock_main.mockResolvedValue(undefined);
|
|
112
|
+
try {
|
|
113
|
+
await cli();
|
|
114
|
+
} catch {
|
|
115
|
+
// ignore require error for non-existent RC in test env
|
|
116
|
+
}
|
|
117
|
+
const watched_files = mock_chokidar_watch.mock.calls[0]?.[0];
|
|
118
|
+
expect(watched_files.some(f => f.endsWith('.rncurc.js'))).toBe(true);
|
|
119
|
+
});
|
|
120
|
+
it('runs main once immediately on start', async () => {
|
|
121
|
+
set_argv('.env', '--watch');
|
|
122
|
+
await cli();
|
|
123
|
+
expect(mock_main).toHaveBeenCalledTimes(1);
|
|
124
|
+
});
|
|
125
|
+
it('registers change and add event handlers', async () => {
|
|
126
|
+
set_argv('.env', '--watch');
|
|
127
|
+
await cli();
|
|
128
|
+
const events = mock_watcher_on.mock.calls.map(([ev]) => ev);
|
|
129
|
+
expect(events).toContain('change');
|
|
130
|
+
expect(events).toContain('add');
|
|
131
|
+
});
|
|
132
|
+
it('re-runs main when a file changes', async () => {
|
|
133
|
+
set_argv('.env', '--watch');
|
|
134
|
+
await cli();
|
|
135
|
+
expect(mock_main).toHaveBeenCalledTimes(1);
|
|
136
|
+
const on_change = get_watcher_handler('change');
|
|
137
|
+
expect(on_change).toBeDefined();
|
|
138
|
+
await on_change?.('.env');
|
|
139
|
+
expect(mock_main).toHaveBeenCalledTimes(2);
|
|
140
|
+
});
|
|
141
|
+
it('re-runs main when a file is added', async () => {
|
|
142
|
+
set_argv('.env', '--watch');
|
|
143
|
+
await cli();
|
|
144
|
+
const on_add = get_watcher_handler('add');
|
|
145
|
+
await on_add?.('.env.local');
|
|
146
|
+
expect(mock_main).toHaveBeenCalledTimes(2);
|
|
147
|
+
});
|
|
148
|
+
it('catches errors on re-run and keeps watching (does not throw)', async () => {
|
|
149
|
+
set_argv('.env', '--watch');
|
|
150
|
+
await cli();
|
|
151
|
+
mock_main.mockRejectedValueOnce(new Error('validation failed'));
|
|
152
|
+
const on_change = get_watcher_handler('change');
|
|
153
|
+
expect(on_change).toBeDefined();
|
|
154
|
+
|
|
155
|
+
// The handler uses `void run(p)` so it returns undefined synchronously
|
|
156
|
+
// and swallows errors inside run()'s try/catch. We trigger it and then
|
|
157
|
+
// drain the microtask queue to let the async error handling complete.
|
|
158
|
+
expect(() => on_change('.env')).not.toThrow();
|
|
159
|
+
await new Promise(resolve => setImmediate(resolve));
|
|
160
|
+
|
|
161
|
+
// main was called twice: initial run + change handler
|
|
162
|
+
expect(mock_main).toHaveBeenCalledTimes(2);
|
|
163
|
+
});
|
|
164
|
+
it('catches initial run errors and still starts the watcher', async () => {
|
|
165
|
+
set_argv('.env', '--watch');
|
|
166
|
+
mock_main.mockRejectedValueOnce(new Error('initial run failed'));
|
|
167
|
+
|
|
168
|
+
// Should not throw even though initial run fails
|
|
169
|
+
await expect(cli()).resolves.toBeUndefined();
|
|
170
|
+
expect(mock_chokidar_watch).toHaveBeenCalled();
|
|
171
|
+
});
|
|
172
|
+
it('keeps process alive via process.stdin.resume()', async () => {
|
|
173
|
+
set_argv('.env', '--watch');
|
|
174
|
+
await cli();
|
|
175
|
+
expect(stdin_resume_spy).toHaveBeenCalled();
|
|
176
|
+
});
|
|
177
|
+
it('registers a SIGINT handler for graceful shutdown', async () => {
|
|
178
|
+
set_argv('.env', '--watch');
|
|
179
|
+
await cli();
|
|
180
|
+
const sigint_call = process_on_spy.mock.calls.find(([event]) => event === 'SIGINT');
|
|
181
|
+
expect(sigint_call).toBeDefined();
|
|
182
|
+
});
|
|
183
|
+
it('uses -w as alias for --watch', async () => {
|
|
184
|
+
set_argv('.env', '-w');
|
|
185
|
+
await cli();
|
|
186
|
+
expect(mock_chokidar_watch).toHaveBeenCalled();
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
//# sourceMappingURL=cli.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["mock_main","jest","fn","doMock","__esModule","default","mock_exists_sync","existsSync","mock_watcher_on","mock_watcher_close","mockResolvedValue","undefined","mock_watcher","on","mockReturnThis","close","mock_chokidar_watch","mockReturnValue","watch","cli","require","set_argv","args","process","argv","get_watcher_handler","event","call","mock","calls","find","ev","describe","original_argv","stdin_resume_spy","spyOn","stdin","mockImplementation","process_on_spy","beforeEach","mockReset","p","endsWith","mockClear","afterAll","mockRestore","it","expect","toHaveBeenCalledTimes","toHaveBeenCalledWith","any","String","not","toHaveBeenCalled","rejects","toThrow","mockRejectedValueOnce","Error","objectContaining","ignoreInitial","persistent","watched_files","some","f","toBe","events","map","toContain","on_change","toBeDefined","on_add","Promise","resolve","setImmediate","resolves","toBeUndefined","sigint_call"],"sourceRoot":"../../src","sources":["cli.spec.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = flatten;
|
|
7
|
+
var _assert = _interopRequireDefault(require("assert"));
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
const VALID_PLATFORMS = ['ios', 'android', 'web'];
|
|
10
|
+
function flatten(config, platform) {
|
|
11
|
+
(0, _assert.default)(config && typeof config === 'object', 'Config should be non-null object');
|
|
12
|
+
(0, _assert.default)(VALID_PLATFORMS.includes(platform), '`platform` should one of: ' + VALID_PLATFORMS.join(', '));
|
|
13
|
+
const result = {};
|
|
14
|
+
for (const [key, value] of Object.entries(config)) {
|
|
15
|
+
if (value && typeof value === 'object') {
|
|
16
|
+
result[key] = value[platform];
|
|
17
|
+
} else {
|
|
18
|
+
result[key] = value;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=flatten.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_assert","_interopRequireDefault","require","e","__esModule","default","VALID_PLATFORMS","flatten","config","platform","assert","includes","join","result","key","value","Object","entries"],"sourceRoot":"../../src","sources":["flatten.ts"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA4B,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAQ5B,MAAMG,eAA2B,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC;AAE9C,SAASC,OAAOA,CAACC,MAAiB,EAAEC,QAAkB,EAAc;EACjF,IAAAC,eAAM,EAACF,MAAM,IAAI,OAAOA,MAAM,KAAK,QAAQ,EAAE,kCAAkC,CAAC;EAChF,IAAAE,eAAM,EACJJ,eAAe,CAACK,QAAQ,CAACF,QAAQ,CAAC,EAClC,4BAA4B,GAAGH,eAAe,CAACM,IAAI,CAAC,IAAI,CAC1D,CAAC;EACD,MAAMC,MAAkB,GAAG,CAAC,CAAC;EAC7B,KAAK,MAAM,CAACC,GAAG,EAAEC,KAAK,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACT,MAAM,CAAC,EAAE;IACjD,IAAIO,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;MACtCF,MAAM,CAACC,GAAG,CAAC,GAAIC,KAAK,CAAsBN,QAAQ,CAAC;IACrD,CAAC,MAAM;MACLI,MAAM,CAACC,GAAG,CAAC,GAAGC,KAAoB;IACpC;EACF;EACA,OAAOF,MAAM;AACf","ignoreList":[]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _flatten = _interopRequireDefault(require("./flatten"));
|
|
4
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
5
|
+
describe('flatten', () => {
|
|
6
|
+
it('flattens config per platform', () => {
|
|
7
|
+
const config = {
|
|
8
|
+
value1: 'abc',
|
|
9
|
+
value2: {
|
|
10
|
+
ios: 'def',
|
|
11
|
+
android: 'xyz',
|
|
12
|
+
web: '123'
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const flat_ios = (0, _flatten.default)(config, 'ios');
|
|
16
|
+
expect(flat_ios).toEqual({
|
|
17
|
+
value1: 'abc',
|
|
18
|
+
value2: 'def'
|
|
19
|
+
});
|
|
20
|
+
const flat_android = (0, _flatten.default)(config, 'android');
|
|
21
|
+
expect(flat_android).toEqual({
|
|
22
|
+
value1: 'abc',
|
|
23
|
+
value2: 'xyz'
|
|
24
|
+
});
|
|
25
|
+
const flat_web = (0, _flatten.default)(config, 'web');
|
|
26
|
+
expect(flat_web).toEqual({
|
|
27
|
+
value1: 'abc',
|
|
28
|
+
value2: '123'
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=flatten.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_flatten","_interopRequireDefault","require","e","__esModule","default","describe","it","config","value1","value2","ios","android","web","flat_ios","flatten","expect","toEqual","flat_android","flat_web"],"sourceRoot":"../../src","sources":["flatten.spec.ts"],"mappings":";;AAAA,IAAAA,QAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAgC,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEhCG,QAAQ,CAAC,SAAS,EAAE,MAAM;EACxBC,EAAE,CAAC,8BAA8B,EAAE,MAAM;IACvC,MAAMC,MAAM,GAAG;MACbC,MAAM,EAAE,KAAK;MACbC,MAAM,EAAE;QAAEC,GAAG,EAAE,KAAK;QAAEC,OAAO,EAAE,KAAK;QAAEC,GAAG,EAAE;MAAM;IACnD,CAAC;IACD,MAAMC,QAAQ,GAAG,IAAAC,gBAAO,EAACP,MAAM,EAAE,KAAK,CAAC;IACvCQ,MAAM,CAACF,QAAQ,CAAC,CAACG,OAAO,CAAC;MAAER,MAAM,EAAE,KAAK;MAAEC,MAAM,EAAE;IAAM,CAAC,CAAC;IAC1D,MAAMQ,YAAY,GAAG,IAAAH,gBAAO,EAACP,MAAM,EAAE,SAAS,CAAC;IAC/CQ,MAAM,CAACE,YAAY,CAAC,CAACD,OAAO,CAAC;MAAER,MAAM,EAAE,KAAK;MAAEC,MAAM,EAAE;IAAM,CAAC,CAAC;IAC9D,MAAMS,QAAQ,GAAG,IAAAJ,gBAAO,EAACP,MAAM,EAAE,KAAK,CAAC;IACvCQ,MAAM,CAACG,QAAQ,CAAC,CAACF,OAAO,CAAC;MAAER,MAAM,EAAE,KAAK;MAAEC,MAAM,EAAE;IAAM,CAAC,CAAC;EAC5D,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _reactNative = require("react-native");
|
|
8
|
+
// override.js is dynamically generated by the rncu CLI at the package root.
|
|
9
|
+
// It contains platform-specific overrides. Do not commit override.js to git.
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
|
|
11
|
+
const override = require('../override');
|
|
12
|
+
|
|
13
|
+
// New Architecture: TurboModules are accessed via TurboModuleRegistry.
|
|
14
|
+
// The spec exposes getAll(): string — returns config values as JSON.
|
|
15
|
+
// Old Architecture: constants are exposed directly on NativeModules via constantsToExport.
|
|
16
|
+
const turboModule = _reactNative.TurboModuleRegistry.get('UltimateConfig');
|
|
17
|
+
let nativeConstants;
|
|
18
|
+
if (turboModule != null && typeof turboModule.getAll === 'function') {
|
|
19
|
+
// New Arch: call getAll() and parse JSON
|
|
20
|
+
try {
|
|
21
|
+
const raw = turboModule.getAll();
|
|
22
|
+
nativeConstants = JSON.parse(raw);
|
|
23
|
+
} catch {
|
|
24
|
+
nativeConstants = {};
|
|
25
|
+
}
|
|
26
|
+
} else {
|
|
27
|
+
// Old Arch / interop bridge: constants are properties on NativeModules.UltimateConfig
|
|
28
|
+
nativeConstants = _reactNative.NativeModules.UltimateConfig ?? {};
|
|
29
|
+
}
|
|
30
|
+
var _default = exports.default = {
|
|
31
|
+
...nativeConstants,
|
|
32
|
+
...override
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNative","require","override","turboModule","TurboModuleRegistry","get","nativeConstants","getAll","raw","JSON","parse","NativeModules","UltimateConfig","_default","exports","default"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAQA;AACA;AACA;AACA,MAAMC,QAAgB,GAAGD,OAAO,CAAC,aAAa,CAAC;;AAE/C;AACA;AACA;AACA,MAAME,WAAW,GAAGC,gCAAmB,CAACC,GAAG,CAAO,gBAAgB,CAAC;AAEnE,IAAIC,eAAuB;AAE3B,IAAIH,WAAW,IAAI,IAAI,IAAI,OAAOA,WAAW,CAACI,MAAM,KAAK,UAAU,EAAE;EACnE;EACA,IAAI;IACF,MAAMC,GAAG,GAAGL,WAAW,CAACI,MAAM,CAAC,CAAC;IAChCD,eAAe,GAAGG,IAAI,CAACC,KAAK,CAACF,GAAG,CAAW;EAC7C,CAAC,CAAC,MAAM;IACNF,eAAe,GAAG,CAAC,CAAC;EACtB;AACF,CAAC,MAAM;EACL;EACAA,eAAe,GAAIK,0BAAa,CAACC,cAAc,IAA2B,CAAC,CAAC;AAC9E;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEc;EACb,GAAGT,eAAe;EAClB,GAAGJ;AACL,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = load_env;
|
|
7
|
+
var dotenv = _interopRequireWildcard(require("dotenv"));
|
|
8
|
+
var _dotenvExpand = require("dotenv-expand");
|
|
9
|
+
var yaml = _interopRequireWildcard(require("js-yaml"));
|
|
10
|
+
var path = _interopRequireWildcard(require("path"));
|
|
11
|
+
var fs = _interopRequireWildcard(require("fs"));
|
|
12
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
13
|
+
function detect_format(config_path) {
|
|
14
|
+
const {
|
|
15
|
+
ext
|
|
16
|
+
} = path.parse(config_path);
|
|
17
|
+
return ext === '.yml' || ext === '.yaml' ? 'yaml' : 'dotenv';
|
|
18
|
+
}
|
|
19
|
+
function read_yaml(config_path) {
|
|
20
|
+
const data = yaml.load(fs.readFileSync(config_path).toString());
|
|
21
|
+
if (typeof data === 'undefined' || data === null || typeof data !== 'object') {
|
|
22
|
+
throw new Error(`Expected to read object from ${config_path}, but got '${data}'`);
|
|
23
|
+
}
|
|
24
|
+
return data;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Load one or more env files and merge them (last file wins for conflicting keys).
|
|
29
|
+
*
|
|
30
|
+
* Dotenv files (.env, .env.staging, etc.):
|
|
31
|
+
* - All files are merged first, then variable expansion runs once.
|
|
32
|
+
* - This means cross-file `$VAR` references work:
|
|
33
|
+
* .env.base: BASE_URL=https://api.example.com
|
|
34
|
+
* .env.staging: API_URL=$BASE_URL/v1 → https://api.example.com/v1
|
|
35
|
+
*
|
|
36
|
+
* YAML files (.yml, .yaml):
|
|
37
|
+
* - Each file is loaded and shallow-merged (last wins for top-level keys).
|
|
38
|
+
* - No variable expansion is applied (use YAML anchors instead).
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* // Single file (backward-compatible):
|
|
42
|
+
* load_env('.env')
|
|
43
|
+
*
|
|
44
|
+
* // Multi-file merge:
|
|
45
|
+
* load_env(['.env.base', '.env.staging'])
|
|
46
|
+
*/
|
|
47
|
+
function load_env(config_paths) {
|
|
48
|
+
const paths = Array.isArray(config_paths) ? config_paths : [config_paths];
|
|
49
|
+
if (paths.length === 0) {
|
|
50
|
+
throw new Error('No env file specified. Usage: rncu <env-file> [env-file2 ...]');
|
|
51
|
+
}
|
|
52
|
+
const formats = paths.map(detect_format);
|
|
53
|
+
const allDotenv = formats.every(f => f === 'dotenv');
|
|
54
|
+
if (allDotenv) {
|
|
55
|
+
// Merge raw parsed content first, then expand once —
|
|
56
|
+
// so cross-file $VAR references resolve correctly.
|
|
57
|
+
const raw = {};
|
|
58
|
+
for (const p of paths) {
|
|
59
|
+
const content = fs.readFileSync(p, 'utf8');
|
|
60
|
+
Object.assign(raw, dotenv.parse(content));
|
|
61
|
+
}
|
|
62
|
+
const result = (0, _dotenvExpand.expand)({
|
|
63
|
+
parsed: raw
|
|
64
|
+
});
|
|
65
|
+
return result.parsed ?? raw;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// YAML or mixed: load each file individually and shallow-merge.
|
|
69
|
+
const merged = {};
|
|
70
|
+
for (let i = 0; i < paths.length; i++) {
|
|
71
|
+
const p = paths[i];
|
|
72
|
+
if (!p) continue;
|
|
73
|
+
if (formats[i] === 'yaml') {
|
|
74
|
+
Object.assign(merged, read_yaml(p));
|
|
75
|
+
} else {
|
|
76
|
+
const content = fs.readFileSync(p, 'utf8');
|
|
77
|
+
const parsed = dotenv.parse(content);
|
|
78
|
+
const expanded = (0, _dotenvExpand.expand)({
|
|
79
|
+
parsed
|
|
80
|
+
});
|
|
81
|
+
Object.assign(merged, expanded.parsed ?? parsed);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return merged;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=load-env.js.map
|