@ahmedsamirelsaka/react-native-local-release 2.0.0-rc.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.
- package/CHANGELOG.md +33 -0
- package/CREDENTIALS.md +79 -0
- package/LICENSE +21 -0
- package/README.md +112 -0
- package/SECURITY.md +44 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +326 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +27 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +229 -0
- package/dist/config.js.map +1 -0
- package/dist/credentials.d.ts +27 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +317 -0
- package/dist/credentials.js.map +1 -0
- package/dist/detect.d.ts +7 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +326 -0
- package/dist/detect.js.map +1 -0
- package/dist/fs.d.ts +15 -0
- package/dist/fs.d.ts.map +1 -0
- package/dist/fs.js +79 -0
- package/dist/fs.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +5 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +338 -0
- package/dist/install.js.map +1 -0
- package/dist/logging.d.ts +15 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +84 -0
- package/dist/logging.js.map +1 -0
- package/dist/patch.d.ts +39 -0
- package/dist/patch.d.ts.map +1 -0
- package/dist/patch.js +352 -0
- package/dist/patch.js.map +1 -0
- package/dist/paths.d.ts +14 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +65 -0
- package/dist/paths.js.map +1 -0
- package/dist/process.d.ts +26 -0
- package/dist/process.d.ts.map +1 -0
- package/dist/process.js +43 -0
- package/dist/process.js.map +1 -0
- package/dist/prompt.d.ts +9 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +70 -0
- package/dist/prompt.js.map +1 -0
- package/dist/types.d.ts +153 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/docs/ARCHITECTURE.md +25 -0
- package/docs/MIGRATION.md +28 -0
- package/docs/PUBLISHING.md +128 -0
- package/docs/SUPPORT.md +17 -0
- package/install.mjs +6 -0
- package/package.json +73 -0
- package/schema/release.config.schema.json +209 -0
- package/template/android/keystore.properties.example +7 -0
- package/template/android/proguard-rules.rn-local-release.pro +28 -0
- package/template/docs/LOCAL_RELEASE.md +85 -0
- package/template/fastlane/.env.example +20 -0
- package/template/fastlane/Appfile +10 -0
- package/template/fastlane/Fastfile +203 -0
- package/template/fastlane/lib/rn_local_release.rb +700 -0
- package/template/ios/exportOptions.plist +18 -0
- package/template/scripts/print-android-signing-fingerprints.sh +62 -0
- package/template/secrets/.gitignore +3 -0
- package/template/secrets/README.md +12 -0
package/dist/config.js
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { exists, readText } from './fs.js';
|
|
4
|
+
import { assertSafeRelativePath, assertSemver, assertTeamId, assertBundleId } from './paths.js';
|
|
5
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
export const SCHEMA_VERSION = 2;
|
|
7
|
+
function typeOf(value) {
|
|
8
|
+
if (value === null)
|
|
9
|
+
return 'null';
|
|
10
|
+
if (Array.isArray(value))
|
|
11
|
+
return 'array';
|
|
12
|
+
if (typeof value === 'number' && Number.isInteger(value))
|
|
13
|
+
return 'integer';
|
|
14
|
+
return typeof value;
|
|
15
|
+
}
|
|
16
|
+
function matchesType(actual, allowed) {
|
|
17
|
+
if (allowed.includes(actual))
|
|
18
|
+
return true;
|
|
19
|
+
if (actual === 'integer' && allowed.includes('number'))
|
|
20
|
+
return true;
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
function validateAgainstSchema(value, schema, pathLabel = '$') {
|
|
24
|
+
const errors = [];
|
|
25
|
+
if (schema.type) {
|
|
26
|
+
const allowed = Array.isArray(schema.type) ? schema.type : [schema.type];
|
|
27
|
+
const actual = typeOf(value);
|
|
28
|
+
if (!matchesType(actual, allowed) &&
|
|
29
|
+
!(actual === 'number' && allowed.includes('integer') && Number.isInteger(value))) {
|
|
30
|
+
errors.push(`${pathLabel}: expected ${allowed.join('|')}, got ${actual}`);
|
|
31
|
+
return errors;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (schema.enum && !schema.enum.includes(value)) {
|
|
35
|
+
errors.push(`${pathLabel}: value must be one of ${schema.enum.join(', ')}`);
|
|
36
|
+
}
|
|
37
|
+
if (schema.minLength != null && typeof value === 'string' && value.length < schema.minLength) {
|
|
38
|
+
errors.push(`${pathLabel}: string too short`);
|
|
39
|
+
}
|
|
40
|
+
if (schema.minimum != null && typeof value === 'number' && value < schema.minimum) {
|
|
41
|
+
errors.push(`${pathLabel}: number below minimum ${schema.minimum}`);
|
|
42
|
+
}
|
|
43
|
+
if (schema.minItems != null && Array.isArray(value) && value.length < schema.minItems) {
|
|
44
|
+
errors.push(`${pathLabel}: array too short`);
|
|
45
|
+
}
|
|
46
|
+
if (schema.type === 'object' && value && typeof value === 'object') {
|
|
47
|
+
const obj = value;
|
|
48
|
+
for (const key of schema.required || []) {
|
|
49
|
+
if (!(key in obj))
|
|
50
|
+
errors.push(`${pathLabel}: missing required property "${key}"`);
|
|
51
|
+
}
|
|
52
|
+
if (schema.additionalProperties === false) {
|
|
53
|
+
for (const key of Object.keys(obj)) {
|
|
54
|
+
if (!schema.properties || !(key in schema.properties)) {
|
|
55
|
+
errors.push(`${pathLabel}: unexpected property "${key}"`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
for (const [key, childSchema] of Object.entries(schema.properties || {})) {
|
|
60
|
+
if (key in obj) {
|
|
61
|
+
errors.push(...validateAgainstSchema(obj[key], childSchema, `${pathLabel}.${key}`));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (schema.type === 'array' && Array.isArray(value) && schema.items) {
|
|
66
|
+
value.forEach((item, index) => {
|
|
67
|
+
errors.push(...validateAgainstSchema(item, schema.items, `${pathLabel}[${index}]`));
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
return errors;
|
|
71
|
+
}
|
|
72
|
+
export function loadSchema() {
|
|
73
|
+
const schemaPath = path.join(__dirname, '..', 'schema', 'release.config.schema.json');
|
|
74
|
+
return JSON.parse(readText(schemaPath));
|
|
75
|
+
}
|
|
76
|
+
export function validateReleaseConfig(config) {
|
|
77
|
+
const errors = validateAgainstSchema(config, loadSchema());
|
|
78
|
+
if (!config || typeof config !== 'object') {
|
|
79
|
+
return errors;
|
|
80
|
+
}
|
|
81
|
+
const cfg = config;
|
|
82
|
+
if (cfg.ios?.buildNumberStrategy?.mode === 'fixed') {
|
|
83
|
+
if (!('value' in cfg.ios.buildNumberStrategy) || !cfg.ios.buildNumberStrategy.value) {
|
|
84
|
+
errors.push('$.ios.buildNumberStrategy: fixed mode requires value >= 1');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
if (cfg.ios?.teamId)
|
|
89
|
+
assertTeamId(cfg.ios.teamId);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
errors.push(`$.ios.teamId: ${error.message}`);
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
if (cfg.app?.packageName)
|
|
96
|
+
assertBundleId(cfg.app.packageName);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
errors.push(`$.app.packageName: ${error.message}`);
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
if (cfg.app?.bundleIdentifier)
|
|
103
|
+
assertBundleId(cfg.app.bundleIdentifier);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
errors.push(`$.app.bundleIdentifier: ${error.message}`);
|
|
107
|
+
}
|
|
108
|
+
for (const source of cfg.version?.sources || []) {
|
|
109
|
+
try {
|
|
110
|
+
assertSafeRelativePath(source.path);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
errors.push(`version.source ${source.path}: ${error.message}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return errors;
|
|
117
|
+
}
|
|
118
|
+
export function assertValidReleaseConfig(config) {
|
|
119
|
+
const errors = validateReleaseConfig(config);
|
|
120
|
+
if (errors.length > 0) {
|
|
121
|
+
throw new Error(`Invalid release.config.json:\n- ${errors.join('\n- ')}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export function loadReleaseConfig(root) {
|
|
125
|
+
const configPath = path.join(root, 'fastlane', 'release.config.json');
|
|
126
|
+
if (!exists(configPath)) {
|
|
127
|
+
throw new Error(`Missing ${configPath}`);
|
|
128
|
+
}
|
|
129
|
+
const config = JSON.parse(readText(configPath));
|
|
130
|
+
const migrated = migrateConfig(config);
|
|
131
|
+
assertValidReleaseConfig(migrated);
|
|
132
|
+
return { config: migrated, configPath };
|
|
133
|
+
}
|
|
134
|
+
export function migrateConfig(raw) {
|
|
135
|
+
if (!raw || typeof raw !== 'object') {
|
|
136
|
+
throw new Error('Config must be an object');
|
|
137
|
+
}
|
|
138
|
+
const input = raw;
|
|
139
|
+
const schemaVersion = Number(input.schemaVersion || 1);
|
|
140
|
+
let next = { ...input };
|
|
141
|
+
if (schemaVersion < 2) {
|
|
142
|
+
const ios = (next.ios || {});
|
|
143
|
+
const android = (next.android || {});
|
|
144
|
+
next = {
|
|
145
|
+
...next,
|
|
146
|
+
schemaVersion: SCHEMA_VERSION,
|
|
147
|
+
ios: {
|
|
148
|
+
enabled: true,
|
|
149
|
+
exportOptionsPath: 'ios/exportOptions.plist',
|
|
150
|
+
...ios,
|
|
151
|
+
},
|
|
152
|
+
android: {
|
|
153
|
+
enabled: true,
|
|
154
|
+
dsl: String(android.buildGradlePath || '').endsWith('.kts') ? 'kotlin' : 'groovy',
|
|
155
|
+
...android,
|
|
156
|
+
},
|
|
157
|
+
credentials: next.credentials || {
|
|
158
|
+
provider: process.platform === 'darwin' ? 'keychain' : 'file',
|
|
159
|
+
},
|
|
160
|
+
logging: next.logging || { enabled: true, directory: 'logs' },
|
|
161
|
+
archives: next.archives || {
|
|
162
|
+
storeUploadedVersions: false,
|
|
163
|
+
directory: 'versions',
|
|
164
|
+
},
|
|
165
|
+
version: {
|
|
166
|
+
extraFiles: [],
|
|
167
|
+
...(next.version || {}),
|
|
168
|
+
},
|
|
169
|
+
gates: {
|
|
170
|
+
requireCompileBeforeUpload: true,
|
|
171
|
+
...(next.gates || {}),
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
return next;
|
|
176
|
+
}
|
|
177
|
+
export function deepMergeConfig(detected, existing) {
|
|
178
|
+
return {
|
|
179
|
+
...detected,
|
|
180
|
+
...existing,
|
|
181
|
+
schemaVersion: SCHEMA_VERSION,
|
|
182
|
+
app: { ...detected.app, ...existing.app },
|
|
183
|
+
ios: { ...detected.ios, ...existing.ios },
|
|
184
|
+
android: { ...detected.android, ...existing.android },
|
|
185
|
+
version: {
|
|
186
|
+
...detected.version,
|
|
187
|
+
...existing.version,
|
|
188
|
+
sources: existing.version.sources?.length
|
|
189
|
+
? existing.version.sources
|
|
190
|
+
: detected.version.sources,
|
|
191
|
+
extraFiles: existing.version.extraFiles ?? detected.version.extraFiles,
|
|
192
|
+
},
|
|
193
|
+
verify: { ...detected.verify, ...existing.verify },
|
|
194
|
+
build: { ...detected.build, ...existing.build },
|
|
195
|
+
gates: { ...detected.gates, ...existing.gates },
|
|
196
|
+
credentials: { ...detected.credentials, ...existing.credentials },
|
|
197
|
+
logging: { ...detected.logging, ...existing.logging },
|
|
198
|
+
archives: { ...detected.archives, ...existing.archives },
|
|
199
|
+
ruby: { ...detected.ruby, ...existing.ruby },
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
export function validateProjectPaths(root, config) {
|
|
203
|
+
const missing = [];
|
|
204
|
+
const requiredPaths = [];
|
|
205
|
+
if (config.ios.enabled) {
|
|
206
|
+
requiredPaths.push(config.ios.workspace, config.ios.project, path.posix.join(config.ios.project, 'project.pbxproj'), config.ios.exportOptionsPath);
|
|
207
|
+
}
|
|
208
|
+
if (config.android.enabled) {
|
|
209
|
+
requiredPaths.push(config.android.buildGradlePath);
|
|
210
|
+
}
|
|
211
|
+
for (const relative of requiredPaths) {
|
|
212
|
+
if (!exists(path.join(root, relative)))
|
|
213
|
+
missing.push(relative);
|
|
214
|
+
}
|
|
215
|
+
for (const source of config.version.sources || []) {
|
|
216
|
+
if (!exists(path.join(root, source.path)))
|
|
217
|
+
missing.push(source.path);
|
|
218
|
+
}
|
|
219
|
+
for (const extra of config.version.extraFiles || []) {
|
|
220
|
+
if (!exists(path.join(root, extra.path)))
|
|
221
|
+
missing.push(extra.path);
|
|
222
|
+
}
|
|
223
|
+
return missing;
|
|
224
|
+
}
|
|
225
|
+
export function jsonPretty(value) {
|
|
226
|
+
return `${JSON.stringify(value, null, 2)}\n`;
|
|
227
|
+
}
|
|
228
|
+
export { assertSemver };
|
|
229
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { CredentialProviderKind } from './types.js';
|
|
2
|
+
import type readline from 'node:readline/promises';
|
|
3
|
+
export type CredentialValues = {
|
|
4
|
+
ASC_KEY_ID: string;
|
|
5
|
+
ASC_ISSUER_ID: string;
|
|
6
|
+
ASC_KEY_FILEPATH: string;
|
|
7
|
+
APPLE_ID: string;
|
|
8
|
+
PLAY_JSON_KEY_PATH: string;
|
|
9
|
+
MYAPP_UPLOAD_STORE_FILE: string;
|
|
10
|
+
MYAPP_UPLOAD_KEY_ALIAS: string;
|
|
11
|
+
MYAPP_UPLOAD_STORE_PASSWORD: string;
|
|
12
|
+
MYAPP_UPLOAD_KEY_PASSWORD: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function defaultCredentialProvider(): CredentialProviderKind;
|
|
15
|
+
export declare function setupCredentialsInteractively(rl: readline.Interface, projectRoot: string, options?: {
|
|
16
|
+
dryRun?: boolean;
|
|
17
|
+
provider?: CredentialProviderKind;
|
|
18
|
+
allowExternalPaths?: boolean;
|
|
19
|
+
/** Test/CI hook — never used for production prompts by default. */
|
|
20
|
+
readSecret?: (question: string) => Promise<string>;
|
|
21
|
+
}): Promise<{
|
|
22
|
+
configured: boolean;
|
|
23
|
+
provider: CredentialProviderKind;
|
|
24
|
+
}>;
|
|
25
|
+
export declare function materializeKeychainPasswords(projectRoot: string): void;
|
|
26
|
+
export declare function purgeCredentials(projectRoot: string): void;
|
|
27
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AAEnD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,uBAAuB,EAAE,MAAM,CAAC;IAChC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,2BAA2B,EAAE,MAAM,CAAC;IACpC,yBAAyB,EAAE,MAAM,CAAC;CACnC,CAAC;AA0HF,wBAAgB,yBAAyB,IAAI,sBAAsB,CAElE;AAED,wBAAsB,6BAA6B,CACjD,EAAE,EAAE,QAAQ,CAAC,SAAS,EACtB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,mEAAmE;IACnE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/C,GACL,OAAO,CAAC;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,sBAAsB,CAAA;CAAE,CAAC,CA2LpE;AAED,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAatE;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAe1D"}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { spawnSync } from 'node:child_process';
|
|
5
|
+
import { assertOwnerOnlyReadable, copyFileSecure, ensureSecretDir, exists, isSymlink, writeSecretText, } from './fs.js';
|
|
6
|
+
import { rejectControlChars, resolveWithinRoot, toPosixRelative } from './paths.js';
|
|
7
|
+
import { ask, askSecret, askYesNo } from './prompt.js';
|
|
8
|
+
function escapeEnvValue(value) {
|
|
9
|
+
rejectControlChars(value, 'credential value');
|
|
10
|
+
return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
|
|
11
|
+
}
|
|
12
|
+
function writeEnvFile(filePath, values) {
|
|
13
|
+
const lines = [
|
|
14
|
+
'# Generated by react-native-local-release. Never commit.',
|
|
15
|
+
`ASC_KEY_ID=${escapeEnvValue(values.ASC_KEY_ID)}`,
|
|
16
|
+
`ASC_ISSUER_ID=${escapeEnvValue(values.ASC_ISSUER_ID)}`,
|
|
17
|
+
`ASC_KEY_FILEPATH=${escapeEnvValue(values.ASC_KEY_FILEPATH)}`,
|
|
18
|
+
values.APPLE_ID ? `APPLE_ID=${escapeEnvValue(values.APPLE_ID)}` : '# APPLE_ID=',
|
|
19
|
+
`PLAY_JSON_KEY_PATH=${escapeEnvValue(values.PLAY_JSON_KEY_PATH)}`,
|
|
20
|
+
`MYAPP_UPLOAD_STORE_FILE=${escapeEnvValue(values.MYAPP_UPLOAD_STORE_FILE)}`,
|
|
21
|
+
`MYAPP_UPLOAD_KEY_ALIAS=${escapeEnvValue(values.MYAPP_UPLOAD_KEY_ALIAS)}`,
|
|
22
|
+
`MYAPP_UPLOAD_STORE_PASSWORD=${escapeEnvValue(values.MYAPP_UPLOAD_STORE_PASSWORD)}`,
|
|
23
|
+
`MYAPP_UPLOAD_KEY_PASSWORD=${escapeEnvValue(values.MYAPP_UPLOAD_KEY_PASSWORD)}`,
|
|
24
|
+
'',
|
|
25
|
+
];
|
|
26
|
+
writeSecretText(filePath, lines.join('\n'));
|
|
27
|
+
}
|
|
28
|
+
function writeKeystoreProperties(filePath, values) {
|
|
29
|
+
const lines = [
|
|
30
|
+
'# Generated by react-native-local-release. Never commit.',
|
|
31
|
+
`MYAPP_UPLOAD_STORE_FILE=${values.MYAPP_UPLOAD_STORE_FILE}`,
|
|
32
|
+
`MYAPP_UPLOAD_KEY_ALIAS=${values.MYAPP_UPLOAD_KEY_ALIAS}`,
|
|
33
|
+
`MYAPP_UPLOAD_STORE_PASSWORD=${values.MYAPP_UPLOAD_STORE_PASSWORD}`,
|
|
34
|
+
`MYAPP_UPLOAD_KEY_PASSWORD=${values.MYAPP_UPLOAD_KEY_PASSWORD}`,
|
|
35
|
+
'',
|
|
36
|
+
];
|
|
37
|
+
for (const value of Object.values(values)) {
|
|
38
|
+
rejectControlChars(value, 'keystore property');
|
|
39
|
+
}
|
|
40
|
+
writeSecretText(filePath, lines.join('\n'));
|
|
41
|
+
}
|
|
42
|
+
function vaultRoot() {
|
|
43
|
+
return path.join(os.homedir(), '.rn-local-release', 'vault');
|
|
44
|
+
}
|
|
45
|
+
function projectVaultDir(projectRoot) {
|
|
46
|
+
const slug = path.basename(path.resolve(projectRoot)).replace(/[^\w.-]+/g, '_');
|
|
47
|
+
return path.join(vaultRoot(), slug);
|
|
48
|
+
}
|
|
49
|
+
function keychainAvailable() {
|
|
50
|
+
if (process.platform !== 'darwin')
|
|
51
|
+
return false;
|
|
52
|
+
const result = spawnSync('security', ['help'], { encoding: 'utf8' });
|
|
53
|
+
return result.status === 0;
|
|
54
|
+
}
|
|
55
|
+
function keychainSet(service, account, secret) {
|
|
56
|
+
spawnSync('security', ['add-generic-password', '-U', '-s', service, '-a', account, '-w', secret], { encoding: 'utf8', stdio: 'ignore' });
|
|
57
|
+
}
|
|
58
|
+
function keychainGet(service, account) {
|
|
59
|
+
const result = spawnSync('security', ['find-generic-password', '-s', service, '-a', account, '-w'], { encoding: 'utf8' });
|
|
60
|
+
if (result.status !== 0)
|
|
61
|
+
return null;
|
|
62
|
+
return (result.stdout || '').trim() || null;
|
|
63
|
+
}
|
|
64
|
+
function keychainDelete(service, account) {
|
|
65
|
+
spawnSync('security', ['delete-generic-password', '-s', service, '-a', account], {
|
|
66
|
+
stdio: 'ignore',
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function assertCredentialSource(projectRoot, sourcePath, allowExternal) {
|
|
70
|
+
if (isSymlink(sourcePath) || (exists(sourcePath) && isSymlink(sourcePath))) {
|
|
71
|
+
throw new Error(`Refusing symlink credential source: ${sourcePath}`);
|
|
72
|
+
}
|
|
73
|
+
const absolute = path.isAbsolute(sourcePath)
|
|
74
|
+
? path.resolve(sourcePath)
|
|
75
|
+
: path.resolve(projectRoot, sourcePath);
|
|
76
|
+
if (!exists(absolute)) {
|
|
77
|
+
throw new Error(`Credential file not found: ${absolute}`);
|
|
78
|
+
}
|
|
79
|
+
if (!allowExternal) {
|
|
80
|
+
return resolveWithinRoot(projectRoot, sourcePath);
|
|
81
|
+
}
|
|
82
|
+
return fs.realpathSync(absolute);
|
|
83
|
+
}
|
|
84
|
+
function assertNotGitTracked(projectRoot, relativePath) {
|
|
85
|
+
const checkIgnore = spawnSync('git', ['check-ignore', '-q', relativePath], {
|
|
86
|
+
cwd: projectRoot,
|
|
87
|
+
encoding: 'utf8',
|
|
88
|
+
});
|
|
89
|
+
const lsFiles = spawnSync('git', ['ls-files', '--error-unmatch', relativePath], {
|
|
90
|
+
cwd: projectRoot,
|
|
91
|
+
encoding: 'utf8',
|
|
92
|
+
});
|
|
93
|
+
if (lsFiles.status === 0) {
|
|
94
|
+
throw new Error(`Refusing to write credentials: ${relativePath} is tracked by git. Untrack it first.`);
|
|
95
|
+
}
|
|
96
|
+
// If git repo and path is not ignored, warn by failing closed for secret dirs.
|
|
97
|
+
if (exists(path.join(projectRoot, '.git')) &&
|
|
98
|
+
checkIgnore.status !== 0 &&
|
|
99
|
+
(relativePath.startsWith('secrets/') ||
|
|
100
|
+
relativePath.includes('keystore.properties') ||
|
|
101
|
+
relativePath.includes('fastlane/.env'))) {
|
|
102
|
+
throw new Error(`Refusing to write credentials: ${relativePath} is not gitignored. Update .gitignore first.`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export function defaultCredentialProvider() {
|
|
106
|
+
return keychainAvailable() ? 'keychain' : 'file';
|
|
107
|
+
}
|
|
108
|
+
export async function setupCredentialsInteractively(rl, projectRoot, options = {}) {
|
|
109
|
+
const readSecret = options.readSecret || askSecret;
|
|
110
|
+
const provider = options.provider || defaultCredentialProvider();
|
|
111
|
+
const allowExternal = options.allowExternalPaths === true;
|
|
112
|
+
console.log('');
|
|
113
|
+
console.log('Credential setup');
|
|
114
|
+
console.log('----------------');
|
|
115
|
+
console.log(`Provider: ${provider}`);
|
|
116
|
+
console.log('Passwords are hidden. Secrets are never printed after entry.');
|
|
117
|
+
console.log('');
|
|
118
|
+
const wantApple = await askYesNo(rl, 'Configure Apple App Store Connect API credentials?', true);
|
|
119
|
+
let apple = null;
|
|
120
|
+
if (wantApple) {
|
|
121
|
+
const keyId = await ask(rl, 'ASC Key ID');
|
|
122
|
+
const issuerId = await ask(rl, 'ASC Issuer ID');
|
|
123
|
+
const keyPath = await ask(rl, 'Path to AuthKey_XXXXXX.p8');
|
|
124
|
+
const appleId = await ask(rl, 'Optional Apple ID email (Enter to skip)', '');
|
|
125
|
+
if (!keyId || !issuerId || !keyPath) {
|
|
126
|
+
throw new Error('ASC_KEY_ID, ASC_ISSUER_ID, and .p8 path are required.');
|
|
127
|
+
}
|
|
128
|
+
apple = { keyId, issuerId, keyPath, appleId };
|
|
129
|
+
}
|
|
130
|
+
const wantPlay = await askYesNo(rl, 'Configure Google Play service-account credentials?', true);
|
|
131
|
+
let play = null;
|
|
132
|
+
if (wantPlay) {
|
|
133
|
+
const jsonPath = await ask(rl, 'Path to Play service-account JSON');
|
|
134
|
+
if (!jsonPath)
|
|
135
|
+
throw new Error('Play JSON path is required.');
|
|
136
|
+
play = { jsonPath };
|
|
137
|
+
}
|
|
138
|
+
const wantAndroid = await askYesNo(rl, 'Configure Android upload keystore?', true);
|
|
139
|
+
let android = null;
|
|
140
|
+
if (wantAndroid) {
|
|
141
|
+
const storeFile = await ask(rl, 'Path to upload keystore', 'android/app/keystore.jks');
|
|
142
|
+
const alias = await ask(rl, 'Key alias', 'key0');
|
|
143
|
+
const storePassword = await readSecret('Keystore password');
|
|
144
|
+
const keyPasswordRaw = await readSecret('Key password (Enter to reuse keystore password)');
|
|
145
|
+
const keyPassword = keyPasswordRaw || storePassword;
|
|
146
|
+
if (!storeFile || !alias || !storePassword || !keyPassword) {
|
|
147
|
+
throw new Error('Keystore path, alias, and passwords are required.');
|
|
148
|
+
}
|
|
149
|
+
android = { storeFile, alias, storePassword, keyPassword };
|
|
150
|
+
}
|
|
151
|
+
if (!apple && !play && !android) {
|
|
152
|
+
console.log('Skipped credential setup.');
|
|
153
|
+
return { configured: false, provider };
|
|
154
|
+
}
|
|
155
|
+
if (options.dryRun) {
|
|
156
|
+
console.log('Dry run: would write credentials via selected provider.');
|
|
157
|
+
return { configured: true, provider };
|
|
158
|
+
}
|
|
159
|
+
const previousUmask = process.umask(0o077);
|
|
160
|
+
try {
|
|
161
|
+
ensureSecretDir(path.join(projectRoot, 'secrets'));
|
|
162
|
+
ensureSecretDir(path.join(projectRoot, 'fastlane'));
|
|
163
|
+
ensureSecretDir(path.join(projectRoot, 'android'));
|
|
164
|
+
ensureSecretDir(projectVaultDir(projectRoot));
|
|
165
|
+
const values = {
|
|
166
|
+
ASC_KEY_ID: '',
|
|
167
|
+
ASC_ISSUER_ID: '',
|
|
168
|
+
ASC_KEY_FILEPATH: '',
|
|
169
|
+
APPLE_ID: '',
|
|
170
|
+
PLAY_JSON_KEY_PATH: '',
|
|
171
|
+
MYAPP_UPLOAD_STORE_FILE: 'keystore.jks',
|
|
172
|
+
MYAPP_UPLOAD_KEY_ALIAS: 'key0',
|
|
173
|
+
MYAPP_UPLOAD_STORE_PASSWORD: '',
|
|
174
|
+
MYAPP_UPLOAD_KEY_PASSWORD: '',
|
|
175
|
+
};
|
|
176
|
+
if (apple) {
|
|
177
|
+
const source = assertCredentialSource(projectRoot, apple.keyPath, allowExternal);
|
|
178
|
+
const destName = `AuthKey_${apple.keyId}.p8`;
|
|
179
|
+
const vaultDest = path.join(projectVaultDir(projectRoot), destName);
|
|
180
|
+
copyFileSecure(source, vaultDest, 0o600);
|
|
181
|
+
if (provider === 'file') {
|
|
182
|
+
const projectDest = path.join(projectRoot, 'secrets', destName);
|
|
183
|
+
assertNotGitTracked(projectRoot, `secrets/${destName}`);
|
|
184
|
+
copyFileSecure(source, projectDest, 0o600);
|
|
185
|
+
values.ASC_KEY_FILEPATH = `secrets/${destName}`;
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
values.ASC_KEY_FILEPATH = vaultDest;
|
|
189
|
+
keychainSet(`rn-local-release:${path.basename(projectRoot)}`, 'ASC_KEY_ID', apple.keyId);
|
|
190
|
+
keychainSet(`rn-local-release:${path.basename(projectRoot)}`, 'ASC_ISSUER_ID', apple.issuerId);
|
|
191
|
+
}
|
|
192
|
+
values.ASC_KEY_ID = apple.keyId;
|
|
193
|
+
values.ASC_ISSUER_ID = apple.issuerId;
|
|
194
|
+
values.APPLE_ID = apple.appleId;
|
|
195
|
+
}
|
|
196
|
+
if (play) {
|
|
197
|
+
const source = assertCredentialSource(projectRoot, play.jsonPath, allowExternal);
|
|
198
|
+
const destName = 'play-store-service-account.json';
|
|
199
|
+
const vaultDest = path.join(projectVaultDir(projectRoot), destName);
|
|
200
|
+
copyFileSecure(source, vaultDest, 0o600);
|
|
201
|
+
if (provider === 'file') {
|
|
202
|
+
const projectDest = path.join(projectRoot, 'secrets', destName);
|
|
203
|
+
assertNotGitTracked(projectRoot, `secrets/${destName}`);
|
|
204
|
+
copyFileSecure(source, projectDest, 0o600);
|
|
205
|
+
values.PLAY_JSON_KEY_PATH = `secrets/${destName}`;
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
values.PLAY_JSON_KEY_PATH = vaultDest;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (android) {
|
|
212
|
+
const source = assertCredentialSource(projectRoot, android.storeFile, allowExternal);
|
|
213
|
+
const base = path.basename(source);
|
|
214
|
+
const appDest = path.join(projectRoot, 'android', 'app', base);
|
|
215
|
+
if (path.resolve(source) !== path.resolve(appDest)) {
|
|
216
|
+
copyFileSecure(source, appDest, 0o600);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
// Already in place — harden mode instead of failing on default umask 0644.
|
|
220
|
+
fs.chmodSync(appDest, 0o600);
|
|
221
|
+
assertOwnerOnlyReadable(appDest);
|
|
222
|
+
}
|
|
223
|
+
values.MYAPP_UPLOAD_STORE_FILE = base;
|
|
224
|
+
values.MYAPP_UPLOAD_KEY_ALIAS = android.alias;
|
|
225
|
+
values.MYAPP_UPLOAD_STORE_PASSWORD = android.storePassword;
|
|
226
|
+
values.MYAPP_UPLOAD_KEY_PASSWORD = android.keyPassword;
|
|
227
|
+
if (provider === 'keychain') {
|
|
228
|
+
const service = `rn-local-release:${path.basename(projectRoot)}`;
|
|
229
|
+
keychainSet(service, 'MYAPP_UPLOAD_STORE_PASSWORD', android.storePassword);
|
|
230
|
+
keychainSet(service, 'MYAPP_UPLOAD_KEY_PASSWORD', android.keyPassword);
|
|
231
|
+
keychainSet(service, 'MYAPP_UPLOAD_KEY_ALIAS', android.alias);
|
|
232
|
+
// Still write keystore.properties without passwords for Gradle filename/alias only.
|
|
233
|
+
writeKeystoreProperties(path.join(projectRoot, 'android', 'keystore.properties'), {
|
|
234
|
+
...values,
|
|
235
|
+
MYAPP_UPLOAD_STORE_PASSWORD: '',
|
|
236
|
+
MYAPP_UPLOAD_KEY_PASSWORD: '',
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
assertNotGitTracked(projectRoot, 'android/keystore.properties');
|
|
241
|
+
writeKeystoreProperties(path.join(projectRoot, 'android', 'keystore.properties'), values);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// Always write a non-secret reference env for Fastlane paths; passwords only for file provider.
|
|
245
|
+
assertNotGitTracked(projectRoot, 'fastlane/.env');
|
|
246
|
+
if (provider === 'file') {
|
|
247
|
+
writeEnvFile(path.join(projectRoot, 'fastlane', '.env'), values);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
writeEnvFile(path.join(projectRoot, 'fastlane', '.env'), {
|
|
251
|
+
...values,
|
|
252
|
+
MYAPP_UPLOAD_STORE_PASSWORD: '',
|
|
253
|
+
MYAPP_UPLOAD_KEY_PASSWORD: '',
|
|
254
|
+
});
|
|
255
|
+
// Materialize passwords into env from keychain at runtime via doctor/release helpers.
|
|
256
|
+
if (android) {
|
|
257
|
+
const service = `rn-local-release:${path.basename(projectRoot)}`;
|
|
258
|
+
// Ensure we can read them back
|
|
259
|
+
keychainGet(service, 'MYAPP_UPLOAD_STORE_PASSWORD');
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
console.log('');
|
|
263
|
+
console.log('Credentials configured.');
|
|
264
|
+
console.log(` provider: ${provider}`);
|
|
265
|
+
if (provider === 'file') {
|
|
266
|
+
console.log(' - fastlane/.env');
|
|
267
|
+
console.log(' - android/keystore.properties (if Android configured)');
|
|
268
|
+
console.log(' - secrets/ (copied key files)');
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
console.log(` - vault: ${toPosixRelative(os.homedir(), projectVaultDir(projectRoot))}`);
|
|
272
|
+
console.log(' - macOS Keychain entries for scalar secrets');
|
|
273
|
+
console.log(' - fastlane/.env contains non-secret path references only');
|
|
274
|
+
}
|
|
275
|
+
return { configured: true, provider };
|
|
276
|
+
}
|
|
277
|
+
finally {
|
|
278
|
+
process.umask(previousUmask);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
export function materializeKeychainPasswords(projectRoot) {
|
|
282
|
+
if (!keychainAvailable())
|
|
283
|
+
return;
|
|
284
|
+
const service = `rn-local-release:${path.basename(projectRoot)}`;
|
|
285
|
+
const storePassword = keychainGet(service, 'MYAPP_UPLOAD_STORE_PASSWORD');
|
|
286
|
+
const keyPassword = keychainGet(service, 'MYAPP_UPLOAD_KEY_PASSWORD');
|
|
287
|
+
const alias = keychainGet(service, 'MYAPP_UPLOAD_KEY_ALIAS');
|
|
288
|
+
if (storePassword)
|
|
289
|
+
process.env.MYAPP_UPLOAD_STORE_PASSWORD = storePassword;
|
|
290
|
+
if (keyPassword)
|
|
291
|
+
process.env.MYAPP_UPLOAD_KEY_PASSWORD = keyPassword;
|
|
292
|
+
if (alias)
|
|
293
|
+
process.env.MYAPP_UPLOAD_KEY_ALIAS = alias;
|
|
294
|
+
const ascKey = keychainGet(service, 'ASC_KEY_ID');
|
|
295
|
+
const ascIssuer = keychainGet(service, 'ASC_ISSUER_ID');
|
|
296
|
+
if (ascKey)
|
|
297
|
+
process.env.ASC_KEY_ID = ascKey;
|
|
298
|
+
if (ascIssuer)
|
|
299
|
+
process.env.ASC_ISSUER_ID = ascIssuer;
|
|
300
|
+
}
|
|
301
|
+
export function purgeCredentials(projectRoot) {
|
|
302
|
+
const service = `rn-local-release:${path.basename(projectRoot)}`;
|
|
303
|
+
for (const account of [
|
|
304
|
+
'ASC_KEY_ID',
|
|
305
|
+
'ASC_ISSUER_ID',
|
|
306
|
+
'MYAPP_UPLOAD_STORE_PASSWORD',
|
|
307
|
+
'MYAPP_UPLOAD_KEY_PASSWORD',
|
|
308
|
+
'MYAPP_UPLOAD_KEY_ALIAS',
|
|
309
|
+
]) {
|
|
310
|
+
keychainDelete(service, account);
|
|
311
|
+
}
|
|
312
|
+
const vault = projectVaultDir(projectRoot);
|
|
313
|
+
if (exists(vault)) {
|
|
314
|
+
fs.rmSync(vault, { recursive: true, force: true });
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
|
package/dist/detect.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CliOptions, DetectionResult, ReleaseConfig } from './types.js';
|
|
2
|
+
export declare function detectProject(root: string, options?: Partial<CliOptions>): DetectionResult;
|
|
3
|
+
export declare function buildReleaseConfig(detection: DetectionResult, overrides?: Partial<CliOptions> & {
|
|
4
|
+
storeUploadedVersions?: boolean | null;
|
|
5
|
+
credentialProvider?: 'keychain' | 'file' | 'env';
|
|
6
|
+
}): ReleaseConfig;
|
|
7
|
+
//# sourceMappingURL=detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA0K7E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,eAAe,CAuD9F;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,eAAe,EAC1B,SAAS,GAAE,OAAO,CAAC,UAAU,CAAC,GAAG;IAC/B,qBAAqB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,kBAAkB,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,KAAK,CAAC;CAC7C,GACL,aAAa,CAuIf"}
|