rn-env-setup 1.0.0 → 1.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/README.md +271 -0
- package/dist/android/android-generator.d.ts +3 -0
- package/dist/android/android-generator.d.ts.map +1 -0
- package/dist/android/android-generator.js +154 -0
- package/dist/android/android-generator.js.map +1 -0
- package/dist/android/gradle-parser.d.ts +32 -0
- package/dist/android/gradle-parser.d.ts.map +1 -0
- package/dist/android/gradle-parser.js +107 -0
- package/dist/android/gradle-parser.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +227 -0
- package/dist/cli.js.map +1 -0
- package/dist/generators/ci-generator.d.ts +3 -0
- package/dist/generators/ci-generator.d.ts.map +1 -0
- package/dist/generators/ci-generator.js +130 -0
- package/dist/generators/ci-generator.js.map +1 -0
- package/dist/generators/js-env-generator.d.ts +3 -0
- package/dist/generators/js-env-generator.d.ts.map +1 -0
- package/dist/generators/js-env-generator.js +191 -0
- package/dist/generators/js-env-generator.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/ios/ios-generator.d.ts +3 -0
- package/dist/ios/ios-generator.d.ts.map +1 -0
- package/dist/ios/ios-generator.js +180 -0
- package/dist/ios/ios-generator.js.map +1 -0
- package/dist/ios/xcode-patcher.d.ts +14 -0
- package/dist/ios/xcode-patcher.d.ts.map +1 -0
- package/dist/ios/xcode-patcher.js +76 -0
- package/dist/ios/xcode-patcher.js.map +1 -0
- package/dist/types/index.d.ts +61 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/config-loader.d.ts +16 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +231 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/dist/utils/file-utils.d.ts +29 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +93 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/validator.d.ts +3 -0
- package/dist/utils/validator.d.ts.map +1 -0
- package/dist/utils/validator.js +91 -0
- package/dist/utils/validator.js.map +1 -0
- package/package.json +40 -24
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { BuildCommand } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a timestamped backup of a file before modifying it.
|
|
4
|
+
* Idempotent: won't create duplicate backups within the same second.
|
|
5
|
+
*/
|
|
6
|
+
export declare function backup(filePath: string): Promise<string>;
|
|
7
|
+
/**
|
|
8
|
+
* Restore all backed-up files in the given directories.
|
|
9
|
+
* Called on rollback when generation fails.
|
|
10
|
+
*/
|
|
11
|
+
export declare function rollbackAll(filePaths: string[]): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Log a dry-run action without modifying any files.
|
|
14
|
+
*/
|
|
15
|
+
export declare function logDry(message: string): void;
|
|
16
|
+
/**
|
|
17
|
+
* Normalize an environment name to a valid identifier.
|
|
18
|
+
* "my-env" → "myEnv", "My Env" → "myEnv"
|
|
19
|
+
*/
|
|
20
|
+
export declare function normalizeEnvName(name: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Recursively find the first file in a directory matching a predicate.
|
|
23
|
+
*/
|
|
24
|
+
export declare function findFirst(dir: string, predicate: (filename: string) => boolean): string | null;
|
|
25
|
+
/**
|
|
26
|
+
* Print the summary of generated build commands in a human-friendly table.
|
|
27
|
+
*/
|
|
28
|
+
export declare function printCommandSummary(commands: BuildCommand[]): void;
|
|
29
|
+
//# sourceMappingURL=file-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAIjD;;;GAGG;AACH,wBAAsB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ9D;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQpE;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKrD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,GAAG,IAAI,CAa9F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI,CAuBlE"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// src/utils/file-utils.ts
|
|
2
|
+
// Shared file system utilities: backup, dry-run logging, path helpers.
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
const BACKUP_SUFFIX = '.rn-env-backup';
|
|
7
|
+
/**
|
|
8
|
+
* Create a timestamped backup of a file before modifying it.
|
|
9
|
+
* Idempotent: won't create duplicate backups within the same second.
|
|
10
|
+
*/
|
|
11
|
+
export async function backup(filePath) {
|
|
12
|
+
const backupPath = `${filePath}${BACKUP_SUFFIX}`;
|
|
13
|
+
// Only backup the original — don't overwrite an existing backup
|
|
14
|
+
if (!fs.existsSync(backupPath)) {
|
|
15
|
+
await fs.copy(filePath, backupPath);
|
|
16
|
+
console.log(chalk.gray(` 📦 Backed up ${path.basename(filePath)} → ${path.basename(backupPath)}`));
|
|
17
|
+
}
|
|
18
|
+
return backupPath;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Restore all backed-up files in the given directories.
|
|
22
|
+
* Called on rollback when generation fails.
|
|
23
|
+
*/
|
|
24
|
+
export async function rollbackAll(filePaths) {
|
|
25
|
+
for (const filePath of filePaths) {
|
|
26
|
+
const backupPath = `${filePath}${BACKUP_SUFFIX}`;
|
|
27
|
+
if (fs.existsSync(backupPath)) {
|
|
28
|
+
await fs.move(backupPath, filePath, { overwrite: true });
|
|
29
|
+
console.log(chalk.yellow(` ↩ Rolled back ${path.basename(filePath)}`));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Log a dry-run action without modifying any files.
|
|
35
|
+
*/
|
|
36
|
+
export function logDry(message) {
|
|
37
|
+
console.log(chalk.cyan(' [dry-run] ') + message);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Normalize an environment name to a valid identifier.
|
|
41
|
+
* "my-env" → "myEnv", "My Env" → "myEnv"
|
|
42
|
+
*/
|
|
43
|
+
export function normalizeEnvName(name) {
|
|
44
|
+
return name
|
|
45
|
+
.toLowerCase()
|
|
46
|
+
.replace(/[^a-z0-9]+(.)/g, (_, char) => char.toUpperCase())
|
|
47
|
+
.replace(/[^a-z0-9]/g, '');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Recursively find the first file in a directory matching a predicate.
|
|
51
|
+
*/
|
|
52
|
+
export function findFirst(dir, predicate) {
|
|
53
|
+
if (!fs.existsSync(dir))
|
|
54
|
+
return null;
|
|
55
|
+
const entries = fs.readdirSync(dir);
|
|
56
|
+
for (const entry of entries) {
|
|
57
|
+
const fullPath = path.join(dir, entry);
|
|
58
|
+
if (predicate(entry))
|
|
59
|
+
return fullPath;
|
|
60
|
+
const stat = fs.statSync(fullPath);
|
|
61
|
+
if (stat.isDirectory()) {
|
|
62
|
+
const found = findFirst(fullPath, predicate);
|
|
63
|
+
if (found)
|
|
64
|
+
return found;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Print the summary of generated build commands in a human-friendly table.
|
|
71
|
+
*/
|
|
72
|
+
export function printCommandSummary(commands) {
|
|
73
|
+
if (commands.length === 0)
|
|
74
|
+
return;
|
|
75
|
+
console.log(chalk.bold('\n📋 Generated build commands:\n'));
|
|
76
|
+
const android = commands.filter((c) => c.platform === 'android');
|
|
77
|
+
const ios = commands.filter((c) => c.platform === 'ios');
|
|
78
|
+
if (android.length > 0) {
|
|
79
|
+
console.log(chalk.underline('Android:'));
|
|
80
|
+
for (const cmd of android) {
|
|
81
|
+
console.log(` ${chalk.yellow(cmd.description)}`);
|
|
82
|
+
console.log(` ${chalk.green('$')} ${cmd.command}\n`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (ios.length > 0) {
|
|
86
|
+
console.log(chalk.underline('iOS:'));
|
|
87
|
+
for (const cmd of ios) {
|
|
88
|
+
console.log(` ${chalk.yellow(cmd.description)}`);
|
|
89
|
+
console.log(` ${chalk.green('$')} ${cmd.command}\n`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=file-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,uEAAuE;AAEvE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,aAAa,GAAG,gBAAgB,CAAC;AAEvC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,QAAgB;IAC3C,MAAM,UAAU,GAAG,GAAG,QAAQ,GAAG,aAAa,EAAE,CAAC;IACjD,gEAAgE;IAChE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAmB;IACnD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,GAAG,QAAQ,GAAG,aAAa,EAAE,CAAC;QACjD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,OAAe;IACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;SAClE,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,SAAwC;IAC7E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACvC,IAAI,SAAS,CAAC,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAC;QACtC,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC7C,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAwB;IAC1D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAElC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAE7D,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC;IAEzD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;QACzC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACrC,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAiGrF"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// src/utils/validator.ts
|
|
2
|
+
// Pre-generation validation: detects duplicate bundle IDs, missing files, config errors.
|
|
3
|
+
// Run before any file modifications so we fail fast with clear errors.
|
|
4
|
+
import fs from 'fs-extra';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { normalizeEnvName, findFirst } from './file-utils.js';
|
|
7
|
+
import { parseExistingApplicationIds } from '../android/gradle-parser.js';
|
|
8
|
+
export function validate(config, projectRoot) {
|
|
9
|
+
const errors = [];
|
|
10
|
+
const warnings = [];
|
|
11
|
+
// ── 1. Check React Native project structure ──────────────────────────────
|
|
12
|
+
if (!fs.existsSync(path.join(projectRoot, 'android', 'app', 'build.gradle'))) {
|
|
13
|
+
errors.push('android/app/build.gradle not found. Run this from the root of a React Native project.');
|
|
14
|
+
}
|
|
15
|
+
if (!fs.existsSync(path.join(projectRoot, 'ios'))) {
|
|
16
|
+
errors.push('ios/ directory not found. Run this from the root of a React Native project.');
|
|
17
|
+
}
|
|
18
|
+
// ── 2. Check for duplicate environment names ─────────────────────────────
|
|
19
|
+
const names = config.environments.map((e) => normalizeEnvName(e.name));
|
|
20
|
+
const uniqueNames = new Set(names);
|
|
21
|
+
if (uniqueNames.size !== names.length) {
|
|
22
|
+
errors.push('Duplicate environment names detected. All environment names must be unique.');
|
|
23
|
+
}
|
|
24
|
+
// ── 3. Check for duplicate bundle IDs ────────────────────────────────────
|
|
25
|
+
const bundleIds = config.environments.map((e) => e.bundleId);
|
|
26
|
+
const uniqueIds = new Set(bundleIds);
|
|
27
|
+
if (uniqueIds.size !== bundleIds.length) {
|
|
28
|
+
errors.push(`Duplicate bundle IDs detected: ${bundleIds.filter((id, i) => bundleIds.indexOf(id) !== i).join(', ')}`);
|
|
29
|
+
}
|
|
30
|
+
// ── 4. Validate bundle ID format ─────────────────────────────────────────
|
|
31
|
+
for (const env of config.environments) {
|
|
32
|
+
if (!/^[a-zA-Z][a-zA-Z0-9_]*(\.[a-zA-Z][a-zA-Z0-9_]*)+$/.test(env.bundleId)) {
|
|
33
|
+
errors.push(`Invalid bundle ID for environment "${env.name}": ${env.bundleId}`);
|
|
34
|
+
}
|
|
35
|
+
if (!/^https?:\/\//.test(env.apiUrl)) {
|
|
36
|
+
errors.push(`Invalid API URL for environment "${env.name}": ${env.apiUrl} (must start with http/https)`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// ── 5. Check existing Android applicationIds for conflicts ────────────────
|
|
40
|
+
const gradlePath = path.join(projectRoot, 'android', 'app', 'build.gradle');
|
|
41
|
+
if (fs.existsSync(gradlePath)) {
|
|
42
|
+
const gradleContent = fs.readFileSync(gradlePath, 'utf-8');
|
|
43
|
+
const existingIds = parseExistingApplicationIds(gradleContent);
|
|
44
|
+
for (const env of config.environments) {
|
|
45
|
+
if (existingIds.includes(env.bundleId) && !gradleContent.includes('rn-env-setup')) {
|
|
46
|
+
warnings.push(`Bundle ID "${env.bundleId}" already exists in build.gradle (not from rn-env-setup). It will be overwritten.`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// ── 6. Validate logo paths ────────────────────────────────────────────────
|
|
51
|
+
for (const env of config.environments) {
|
|
52
|
+
if (env.logo) {
|
|
53
|
+
const logoPath = path.join(projectRoot, env.logo);
|
|
54
|
+
if (!fs.existsSync(logoPath)) {
|
|
55
|
+
warnings.push(`Logo file not found for "${env.name}": ${env.logo} (will be skipped)`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
const ext = path.extname(env.logo).toLowerCase();
|
|
59
|
+
if (!['.png', '.jpg', '.jpeg'].includes(ext)) {
|
|
60
|
+
warnings.push(`Logo for "${env.name}" is not a PNG/JPG — Android mipmap may not render correctly.`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// ── 7. Check iOS Xcode project exists ────────────────────────────────────
|
|
66
|
+
const iosDir = path.join(projectRoot, 'ios');
|
|
67
|
+
if (fs.existsSync(iosDir)) {
|
|
68
|
+
const xcodeproj = findFirst(iosDir, (f) => f.endsWith('.xcodeproj'));
|
|
69
|
+
if (!xcodeproj) {
|
|
70
|
+
warnings.push('No .xcodeproj found in ios/ — iOS generation will be skipped.');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// ── 8. Check package.json for React Native ────────────────────────────────
|
|
74
|
+
const pkgPath = path.join(projectRoot, 'package.json');
|
|
75
|
+
if (fs.existsSync(pkgPath)) {
|
|
76
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
77
|
+
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
78
|
+
if (!deps['react-native']) {
|
|
79
|
+
warnings.push('react-native not found in package.json. This tool is designed for React Native projects.');
|
|
80
|
+
}
|
|
81
|
+
if (config.jsEnvStrategy === 'react-native-config' && !deps['react-native-config']) {
|
|
82
|
+
warnings.push('jsEnvStrategy is "react-native-config" but react-native-config is not installed. Run: yarn add react-native-config');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
valid: errors.length === 0,
|
|
87
|
+
errors,
|
|
88
|
+
warnings,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,34 +1,50 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rn-env-setup",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "",
|
|
5
|
-
"
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "CLI to automate Android product flavors and iOS targets/schemes for React Native multi-environment CI",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"rn-env-setup": "dist/cli.js"
|
|
10
|
+
},
|
|
6
11
|
"scripts": {
|
|
7
|
-
"
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"dev": "ts-node src/cli.ts",
|
|
14
|
+
"lint": "eslint src/**/*.ts",
|
|
15
|
+
"test": "jest",
|
|
16
|
+
"prepublishOnly": "npm run build"
|
|
8
17
|
},
|
|
9
|
-
"keywords": [],
|
|
18
|
+
"keywords": ["react-native", "flavors", "iOS", "Android", "CI", "multi-env"],
|
|
10
19
|
"author": "",
|
|
11
|
-
"license": "
|
|
20
|
+
"license": "MIT",
|
|
12
21
|
"dependencies": {
|
|
13
|
-
"chalk": "^5.
|
|
14
|
-
"commander": "^
|
|
15
|
-
"fs-extra": "^11.
|
|
16
|
-
"inquirer": "^
|
|
17
|
-
"js-yaml": "^4.1.
|
|
18
|
-
"ora": "^9.3.0",
|
|
22
|
+
"chalk": "^5.3.0",
|
|
23
|
+
"commander": "^11.0.0",
|
|
24
|
+
"fs-extra": "^11.1.1",
|
|
25
|
+
"inquirer": "^9.2.0",
|
|
26
|
+
"js-yaml": "^4.1.0",
|
|
19
27
|
"plist": "^3.1.0",
|
|
20
|
-
"
|
|
21
|
-
"
|
|
28
|
+
"xcode": "^3.0.1",
|
|
29
|
+
"ora": "^7.0.1",
|
|
30
|
+
"semver": "^7.5.4"
|
|
22
31
|
},
|
|
23
32
|
"devDependencies": {
|
|
24
|
-
"@types/fs-extra": "^11.0.
|
|
25
|
-
"@types/inquirer": "^9.0.
|
|
26
|
-
"@types/
|
|
27
|
-
"@types/
|
|
28
|
-
"@types/
|
|
29
|
-
"
|
|
30
|
-
"jest": "^
|
|
31
|
-
"ts-jest": "^29.
|
|
32
|
-
"
|
|
33
|
-
}
|
|
33
|
+
"@types/fs-extra": "^11.0.1",
|
|
34
|
+
"@types/inquirer": "^9.0.3",
|
|
35
|
+
"@types/js-yaml": "^4.0.5",
|
|
36
|
+
"@types/node": "^20.0.0",
|
|
37
|
+
"@types/plist": "^3.0.2",
|
|
38
|
+
"typescript": "^5.0.0",
|
|
39
|
+
"jest": "^29.0.0",
|
|
40
|
+
"ts-jest": "^29.0.0",
|
|
41
|
+
"@types/jest": "^29.0.0"
|
|
42
|
+
},
|
|
43
|
+
"engines": {
|
|
44
|
+
"node": ">=16.0.0"
|
|
45
|
+
},
|
|
46
|
+
"files": [
|
|
47
|
+
"dist/",
|
|
48
|
+
"README.md"
|
|
49
|
+
]
|
|
34
50
|
}
|