@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.
Files changed (75) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/CREDENTIALS.md +79 -0
  3. package/LICENSE +21 -0
  4. package/README.md +112 -0
  5. package/SECURITY.md +44 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +326 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/config.d.ts +27 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +229 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/credentials.d.ts +27 -0
  15. package/dist/credentials.d.ts.map +1 -0
  16. package/dist/credentials.js +317 -0
  17. package/dist/credentials.js.map +1 -0
  18. package/dist/detect.d.ts +7 -0
  19. package/dist/detect.d.ts.map +1 -0
  20. package/dist/detect.js +326 -0
  21. package/dist/detect.js.map +1 -0
  22. package/dist/fs.d.ts +15 -0
  23. package/dist/fs.d.ts.map +1 -0
  24. package/dist/fs.js +79 -0
  25. package/dist/fs.js.map +1 -0
  26. package/dist/index.d.ts +7 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +6 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/install.d.ts +5 -0
  31. package/dist/install.d.ts.map +1 -0
  32. package/dist/install.js +338 -0
  33. package/dist/install.js.map +1 -0
  34. package/dist/logging.d.ts +15 -0
  35. package/dist/logging.d.ts.map +1 -0
  36. package/dist/logging.js +84 -0
  37. package/dist/logging.js.map +1 -0
  38. package/dist/patch.d.ts +39 -0
  39. package/dist/patch.d.ts.map +1 -0
  40. package/dist/patch.js +352 -0
  41. package/dist/patch.js.map +1 -0
  42. package/dist/paths.d.ts +14 -0
  43. package/dist/paths.d.ts.map +1 -0
  44. package/dist/paths.js +65 -0
  45. package/dist/paths.js.map +1 -0
  46. package/dist/process.d.ts +26 -0
  47. package/dist/process.d.ts.map +1 -0
  48. package/dist/process.js +43 -0
  49. package/dist/process.js.map +1 -0
  50. package/dist/prompt.d.ts +9 -0
  51. package/dist/prompt.d.ts.map +1 -0
  52. package/dist/prompt.js +70 -0
  53. package/dist/prompt.js.map +1 -0
  54. package/dist/types.d.ts +153 -0
  55. package/dist/types.d.ts.map +1 -0
  56. package/dist/types.js +2 -0
  57. package/dist/types.js.map +1 -0
  58. package/docs/ARCHITECTURE.md +25 -0
  59. package/docs/MIGRATION.md +28 -0
  60. package/docs/PUBLISHING.md +128 -0
  61. package/docs/SUPPORT.md +17 -0
  62. package/install.mjs +6 -0
  63. package/package.json +73 -0
  64. package/schema/release.config.schema.json +209 -0
  65. package/template/android/keystore.properties.example +7 -0
  66. package/template/android/proguard-rules.rn-local-release.pro +28 -0
  67. package/template/docs/LOCAL_RELEASE.md +85 -0
  68. package/template/fastlane/.env.example +20 -0
  69. package/template/fastlane/Appfile +10 -0
  70. package/template/fastlane/Fastfile +203 -0
  71. package/template/fastlane/lib/rn_local_release.rb +700 -0
  72. package/template/ios/exportOptions.plist +18 -0
  73. package/template/scripts/print-android-signing-fingerprints.sh +62 -0
  74. package/template/secrets/.gitignore +3 -0
  75. package/template/secrets/README.md +12 -0
@@ -0,0 +1,338 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { assertValidReleaseConfig, deepMergeConfig, jsonPretty, migrateConfig, validateProjectPaths, } from './config.js';
5
+ import { buildReleaseConfig, detectProject } from './detect.js';
6
+ import { defaultCredentialProvider, setupCredentialsInteractively, } from './credentials.js';
7
+ import { askYesNo, createReadline } from './prompt.js';
8
+ import { applyPlan, ensureRubyVersion, mergeGemfile, mergeGitignore, mergePackageScripts, patchAndroidBuildGradle, patchGradleProperties, releaseScripts, renderTemplate, } from './patch.js';
9
+ import { ensureDir, ensureSecretDir, exists, readText, sha256OfText, writeText, } from './fs.js';
10
+ import { assertTeamId, assertBundleId } from './paths.js';
11
+ import { writeCrashLog } from './logging.js';
12
+ import { createRequire } from 'node:module';
13
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
14
+ const PACKAGE_ROOT = path.join(__dirname, '..');
15
+ const TEMPLATE_ROOT = path.join(PACKAGE_ROOT, 'template');
16
+ function kitVersion() {
17
+ try {
18
+ const require = createRequire(import.meta.url);
19
+ const pkg = require('../package.json');
20
+ return pkg.version;
21
+ }
22
+ catch {
23
+ return '2.0.0';
24
+ }
25
+ }
26
+ function listTemplateFiles(relativeDir) {
27
+ const sourceDir = path.join(TEMPLATE_ROOT, relativeDir);
28
+ if (!exists(sourceDir))
29
+ return [];
30
+ const out = [];
31
+ const stack = [sourceDir];
32
+ while (stack.length > 0) {
33
+ const current = stack.pop();
34
+ for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
35
+ const full = path.join(current, entry.name);
36
+ if (entry.isDirectory())
37
+ stack.push(full);
38
+ else
39
+ out.push(path.relative(TEMPLATE_ROOT, full).split(path.sep).join('/'));
40
+ }
41
+ }
42
+ return out;
43
+ }
44
+ function xmlEscape(value) {
45
+ return value
46
+ .replace(/&/g, '&')
47
+ .replace(/</g, '&lt;')
48
+ .replace(/>/g, '&gt;')
49
+ .replace(/"/g, '&quot;');
50
+ }
51
+ export async function runInstall(options) {
52
+ const projectRoot = path.resolve(options.project);
53
+ if (!exists(projectRoot)) {
54
+ throw new Error(`Project path does not exist: ${projectRoot}`);
55
+ }
56
+ const rl = options.nonInteractive ? null : createReadline();
57
+ try {
58
+ if (options.credentialsOnly) {
59
+ if (!rl) {
60
+ throw new Error('--credentials-only requires an interactive terminal');
61
+ }
62
+ ensureSecretDir(path.join(projectRoot, 'secrets'));
63
+ const gitignorePath = path.join(projectRoot, '.gitignore');
64
+ const mergedIgnore = mergeGitignore(exists(gitignorePath) ? readText(gitignorePath) : '');
65
+ if (!options.dryRun)
66
+ writeText(gitignorePath, mergedIgnore);
67
+ await setupCredentialsInteractively(rl, projectRoot, {
68
+ dryRun: options.dryRun,
69
+ provider: defaultCredentialProvider(),
70
+ });
71
+ return;
72
+ }
73
+ const detection = detectProject(projectRoot, options);
74
+ if (!detection.android.supported) {
75
+ throw new Error(detection.android.reason || 'Unsupported Android layout');
76
+ }
77
+ if (!detection.ios.supported) {
78
+ throw new Error(detection.ios.reason || 'Unsupported iOS layout');
79
+ }
80
+ let teamId = options.teamId || detection.ios.teamId || '';
81
+ if (!teamId) {
82
+ if (!rl) {
83
+ throw new Error('Missing --team-id and none detected');
84
+ }
85
+ const answer = (await rl.question(`Apple Team ID [${detection.ios.teamId || 'required'}]: `)).trim();
86
+ teamId = answer || detection.ios.teamId || '';
87
+ }
88
+ if (!teamId)
89
+ throw new Error('Apple Team ID is required');
90
+ assertTeamId(teamId);
91
+ let packageName = options.packageName || detection.android.applicationId || '';
92
+ if (!packageName && rl) {
93
+ packageName = (await rl.question('Android/Play package name: ')).trim();
94
+ }
95
+ if (!packageName)
96
+ throw new Error('Android package name is required');
97
+ assertBundleId(packageName);
98
+ let storeUploadedVersions = options.storeUploadedVersions;
99
+ if (storeUploadedVersions == null && rl && !options.nonInteractive) {
100
+ storeUploadedVersions = await askYesNo(rl, 'Store a local copy of each uploaded IPA/AAB under versions/ ?', false);
101
+ }
102
+ let detectedConfig = buildReleaseConfig(detection, {
103
+ ...options,
104
+ teamId,
105
+ packageName,
106
+ storeUploadedVersions: storeUploadedVersions === true,
107
+ credentialProvider: defaultCredentialProvider(),
108
+ });
109
+ const existingConfigPath = path.join(projectRoot, 'fastlane', 'release.config.json');
110
+ if (exists(existingConfigPath) && !options.force) {
111
+ const existing = migrateConfig(JSON.parse(readText(existingConfigPath)));
112
+ detectedConfig = deepMergeConfig(detectedConfig, existing);
113
+ }
114
+ assertValidReleaseConfig(detectedConfig);
115
+ const actions = [];
116
+ const alwaysRefresh = new Set([
117
+ 'fastlane/Fastfile',
118
+ 'fastlane/lib/rn_local_release.rb',
119
+ 'fastlane/.env.example',
120
+ 'docs/LOCAL_RELEASE.md',
121
+ 'android/keystore.properties.example',
122
+ 'scripts/print-android-signing-fingerprints.sh',
123
+ 'secrets/.gitignore',
124
+ 'secrets/README.md',
125
+ ]);
126
+ for (const rootName of ['fastlane', 'docs', 'android', 'ios', 'scripts', 'secrets']) {
127
+ for (const rel of listTemplateFiles(rootName)) {
128
+ const dest = path.join(projectRoot, rel);
129
+ if (exists(dest) && !options.force && !alwaysRefresh.has(rel)) {
130
+ continue;
131
+ }
132
+ actions.push({
133
+ type: 'copy',
134
+ from: path.join(TEMPLATE_ROOT, rel),
135
+ to: rel,
136
+ mode: rel.endsWith('.sh') ? 0o755 : 0o644,
137
+ });
138
+ }
139
+ }
140
+ // CREDENTIALS doc
141
+ const credSrc = path.join(PACKAGE_ROOT, 'CREDENTIALS.md');
142
+ if (exists(credSrc)) {
143
+ actions.push({
144
+ type: 'write',
145
+ path: 'docs/RELEASE_CREDENTIALS.md',
146
+ contents: readText(credSrc),
147
+ });
148
+ }
149
+ const appfileTemplate = readText(path.join(TEMPLATE_ROOT, 'fastlane', 'Appfile'));
150
+ const exportTemplate = readText(path.join(TEMPLATE_ROOT, 'ios', 'exportOptions.plist'));
151
+ const appfile = renderTemplate(appfileTemplate, {
152
+ bundleIdentifier: detectedConfig.app.bundleIdentifier,
153
+ packageName: detectedConfig.app.packageName,
154
+ teamId: detectedConfig.ios.teamId,
155
+ });
156
+ const exportOptions = renderTemplate(exportTemplate, {
157
+ exportMethod: detectedConfig.ios.exportMethod,
158
+ teamId: xmlEscape(detectedConfig.ios.teamId),
159
+ });
160
+ actions.push({
161
+ type: 'write',
162
+ path: 'fastlane/release.config.json',
163
+ contents: jsonPretty(detectedConfig),
164
+ });
165
+ actions.push({ type: 'write', path: 'fastlane/Appfile', contents: appfile });
166
+ actions.push({
167
+ type: 'write',
168
+ path: detectedConfig.ios.exportOptionsPath,
169
+ contents: exportOptions,
170
+ });
171
+ const packageJsonPath = path.join(projectRoot, 'package.json');
172
+ const packageJson = JSON.parse(readText(packageJsonPath));
173
+ const mergedPackage = mergePackageScripts(packageJson, releaseScripts());
174
+ // Pin toolkit as exact optional note via script comment not needed; add setup script
175
+ const scripts = mergedPackage.scripts;
176
+ scripts['release:setup'] =
177
+ `npx --yes @ahmedsamirelsaka/react-native-local-release@${kitVersion()} install --project .`;
178
+ actions.push({
179
+ type: 'write',
180
+ path: 'package.json',
181
+ contents: `${JSON.stringify(mergedPackage, null, 2)}\n`,
182
+ });
183
+ const gemfilePath = path.join(projectRoot, 'Gemfile');
184
+ if (exists(gemfilePath)) {
185
+ actions.push({
186
+ type: 'write',
187
+ path: 'Gemfile',
188
+ contents: mergeGemfile(readText(gemfilePath)),
189
+ });
190
+ }
191
+ else {
192
+ actions.push({
193
+ type: 'write',
194
+ path: 'Gemfile',
195
+ contents: `source 'https://rubygems.org'\nruby ">= 2.6.10", "< 4.0"\ngem 'fastlane', '~> 2.234'\n`,
196
+ });
197
+ }
198
+ const gitignorePath = path.join(projectRoot, '.gitignore');
199
+ actions.push({
200
+ type: 'write',
201
+ path: '.gitignore',
202
+ contents: mergeGitignore(exists(gitignorePath) ? readText(gitignorePath) : ''),
203
+ });
204
+ const gradlePath = path.join(projectRoot, detectedConfig.android.buildGradlePath);
205
+ if (exists(gradlePath)) {
206
+ actions.push({
207
+ type: 'write',
208
+ path: detectedConfig.android.buildGradlePath,
209
+ contents: patchAndroidBuildGradle(readText(gradlePath), detectedConfig.android.dsl),
210
+ });
211
+ }
212
+ const propsPath = path.join(projectRoot, 'android', 'gradle.properties');
213
+ if (exists(propsPath)) {
214
+ actions.push({
215
+ type: 'write',
216
+ path: 'android/gradle.properties',
217
+ contents: patchGradleProperties(readText(propsPath)),
218
+ });
219
+ }
220
+ console.log(`Install plan: ${actions.length} actions`);
221
+ for (const action of actions.slice(0, 20)) {
222
+ if (action.type === 'write' || action.type === 'copy') {
223
+ console.log(` - ${action.type} ${action.type === 'write' ? action.path : action.to}`);
224
+ }
225
+ }
226
+ if (actions.length > 20)
227
+ console.log(` ... +${actions.length - 20} more`);
228
+ const managed = applyPlan(projectRoot, actions, options.dryRun);
229
+ if (!options.dryRun) {
230
+ ensureRubyVersion(projectRoot, detectedConfig.ruby.version || '3.2.2');
231
+ ensureDir(path.join(projectRoot, '.rn-local-release'));
232
+ const manifest = {
233
+ kitVersion: kitVersion(),
234
+ installedAt: new Date().toISOString(),
235
+ projectRoot,
236
+ managedPaths: managed,
237
+ configHash: sha256OfText(jsonPretty(detectedConfig)),
238
+ };
239
+ writeText(path.join(projectRoot, '.rn-local-release', 'manifest.json'), jsonPretty(manifest));
240
+ }
241
+ const missing = validateProjectPaths(projectRoot, detectedConfig).filter((item) => item !== detectedConfig.ios.exportOptionsPath || !options.dryRun);
242
+ console.log(`Installed react-native-local-release ${kitVersion()} into ${projectRoot}`);
243
+ console.log(`Package: ${detectedConfig.app.packageName}`);
244
+ console.log(`iOS: ${detectedConfig.ios.scheme} / team ${detectedConfig.ios.teamId} / ${JSON.stringify(detectedConfig.ios.buildNumberStrategy)}`);
245
+ console.log(`Android DSL: ${detectedConfig.android.dsl}`);
246
+ console.log(`Credential provider: ${detectedConfig.credentials.provider}`);
247
+ console.log(`Archive uploaded versions: ${detectedConfig.archives.storeUploadedVersions}`);
248
+ if (missing.length && !options.dryRun) {
249
+ console.warn('Warning: missing paths:');
250
+ for (const item of missing)
251
+ console.warn(` - ${item}`);
252
+ }
253
+ if (options.dryRun) {
254
+ console.log('Dry run only — no files were written.');
255
+ return;
256
+ }
257
+ if (options.setupCredentials === false || options.nonInteractive) {
258
+ console.log('Skipped credential setup.');
259
+ console.log('Next: rn-local-release configure --project .');
260
+ return;
261
+ }
262
+ const shouldSetup = options.setupCredentials === true ||
263
+ (rl
264
+ ? await askYesNo(rl, 'Configure Apple / Play / keystore credentials now?', true)
265
+ : false);
266
+ if (shouldSetup && rl) {
267
+ await setupCredentialsInteractively(rl, projectRoot, {
268
+ provider: detectedConfig.credentials.provider,
269
+ });
270
+ }
271
+ else {
272
+ console.log('Skipped credential setup. Run: rn-local-release configure --project .');
273
+ }
274
+ console.log('Next: bundle install && yarn release:doctor && yarn release:credentials');
275
+ }
276
+ catch (error) {
277
+ const logFile = writeCrashLog(projectRoot, error);
278
+ console.error(error.message || error);
279
+ console.error(`Details written to ${logFile}`);
280
+ throw error;
281
+ }
282
+ finally {
283
+ rl?.close();
284
+ }
285
+ }
286
+ export async function runUninstall(options) {
287
+ const projectRoot = path.resolve(options.project);
288
+ const manifestPath = path.join(projectRoot, '.rn-local-release', 'manifest.json');
289
+ if (!exists(manifestPath)) {
290
+ throw new Error('No .rn-local-release/manifest.json found. Nothing to uninstall.');
291
+ }
292
+ const manifest = JSON.parse(readText(manifestPath));
293
+ const rl = options.nonInteractive ? null : createReadline();
294
+ try {
295
+ if (!options.yes && rl) {
296
+ const ok = await askYesNo(rl, `Uninstall managed release files (${manifest.managedPaths.length} paths)?`, false);
297
+ if (!ok) {
298
+ console.log('Cancelled.');
299
+ return;
300
+ }
301
+ }
302
+ else if (!options.yes) {
303
+ throw new Error('Pass --yes for non-interactive uninstall');
304
+ }
305
+ for (const item of [...manifest.managedPaths].reverse()) {
306
+ const absolute = path.join(projectRoot, item.path);
307
+ const backup = `${absolute}.rn-local-release.bak`;
308
+ if (!exists(absolute))
309
+ continue;
310
+ // Only restore/remove if hash unchanged from install
311
+ const current = exists(absolute)
312
+ ? (await import('./fs.js')).sha256OfFile(absolute)
313
+ : null;
314
+ if (current && current !== item.installedHash && !options.force) {
315
+ console.warn(`Skipping modified file: ${item.path}`);
316
+ continue;
317
+ }
318
+ if (exists(backup)) {
319
+ writeText(absolute, readText(backup));
320
+ fs.unlinkSync(backup);
321
+ }
322
+ else if (item.kind === 'created') {
323
+ fs.unlinkSync(absolute);
324
+ }
325
+ }
326
+ fs.rmSync(path.join(projectRoot, '.rn-local-release'), { recursive: true, force: true });
327
+ console.log('Uninstall complete.');
328
+ if (options.purgeCredentials) {
329
+ const { purgeCredentials } = await import('./credentials.js');
330
+ purgeCredentials(projectRoot);
331
+ console.log('Credentials purged.');
332
+ }
333
+ }
334
+ finally {
335
+ rl?.close();
336
+ }
337
+ }
338
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare function redact(text: string): string;
2
+ export declare class ProjectLogger {
3
+ private readonly projectRoot;
4
+ private readonly enabled;
5
+ private readonly directory;
6
+ constructor(projectRoot: string, enabled: boolean, directory?: string);
7
+ private logPath;
8
+ private ensure;
9
+ write(level: 'info' | 'warn' | 'error', message: string, error?: unknown): string | null;
10
+ info(message: string): void;
11
+ warn(message: string): void;
12
+ error(message: string, error?: unknown): string | null;
13
+ }
14
+ export declare function writeCrashLog(projectRoot: string, error: unknown, directory?: string): string;
15
+ //# sourceMappingURL=logging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AAgBA,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM3C;AAED,qBAAa,aAAa;IAEtB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAFT,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,EAChB,SAAS,SAAS;IAGrC,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,MAAM;IASd,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;IAoBxF,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;CAGvD;AAED,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,EACd,SAAS,SAAS,GACjB,MAAM,CAcR"}
@@ -0,0 +1,84 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { ensureDir, writeText } from './fs.js';
4
+ const SECRET_PATTERNS = [
5
+ /password/i,
6
+ /passwd/i,
7
+ /secret/i,
8
+ /token/i,
9
+ /api[_-]?key/i,
10
+ /private[_-]?key/i,
11
+ /BEGIN (RSA |EC |OPENSSH )?PRIVATE KEY/,
12
+ /ASC_KEY_ID=\S+/,
13
+ /MYAPP_UPLOAD_(STORE|KEY)_PASSWORD=\S+/i,
14
+ ];
15
+ export function redact(text) {
16
+ let next = text;
17
+ for (const pattern of SECRET_PATTERNS) {
18
+ next = next.replace(pattern, '[REDACTED]');
19
+ }
20
+ return next;
21
+ }
22
+ export class ProjectLogger {
23
+ projectRoot;
24
+ enabled;
25
+ directory;
26
+ constructor(projectRoot, enabled, directory = 'logs') {
27
+ this.projectRoot = projectRoot;
28
+ this.enabled = enabled;
29
+ this.directory = directory;
30
+ }
31
+ logPath() {
32
+ const stamp = new Date().toISOString().replace(/[:.]/g, '-');
33
+ return path.join(this.projectRoot, this.directory, `rn-local-release-${stamp}.log`);
34
+ }
35
+ ensure() {
36
+ if (!this.enabled) {
37
+ return null;
38
+ }
39
+ const dir = path.join(this.projectRoot, this.directory);
40
+ ensureDir(dir, 0o700);
41
+ return this.logPath();
42
+ }
43
+ write(level, message, error) {
44
+ const file = this.ensure();
45
+ const line = `[${new Date().toISOString()}] ${level.toUpperCase()} ${redact(message)}`;
46
+ let details = '';
47
+ if (error instanceof Error) {
48
+ details = `\n${redact(error.stack || error.message)}`;
49
+ }
50
+ else if (error !== undefined) {
51
+ details = `\n${redact(String(error))}`;
52
+ }
53
+ if (file) {
54
+ fs.appendFileSync(file, `${line}${details}\n`, { encoding: 'utf8', mode: 0o600 });
55
+ try {
56
+ fs.chmodSync(file, 0o600);
57
+ }
58
+ catch {
59
+ // ignore
60
+ }
61
+ }
62
+ return file;
63
+ }
64
+ info(message) {
65
+ this.write('info', message);
66
+ }
67
+ warn(message) {
68
+ this.write('warn', message);
69
+ }
70
+ error(message, error) {
71
+ return this.write('error', message, error);
72
+ }
73
+ }
74
+ export function writeCrashLog(projectRoot, error, directory = 'logs') {
75
+ const logger = new ProjectLogger(projectRoot, true, directory);
76
+ const file = logger.error(error instanceof Error ? error.message : String(error), error) ||
77
+ path.join(projectRoot, directory, 'rn-local-release-crash.log');
78
+ if (!fs.existsSync(file)) {
79
+ ensureDir(path.dirname(file), 0o700);
80
+ writeText(file, redact(error instanceof Error ? error.stack || error.message : String(error)), 0o600);
81
+ }
82
+ return file;
83
+ }
84
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { InstallManifest } from './types.js';
2
+ export declare const BEGIN = "# >>> rn-local-release";
3
+ export declare const END = "# <<< rn-local-release";
4
+ export declare function upsertMarkedBlock(content: string, block: string, begin?: string, end?: string): string;
5
+ export declare function removeMarkedBlock(content: string, begin?: string, end?: string): string;
6
+ export declare const DEFAULT_GITIGNORE_ENTRIES: string[];
7
+ export declare function mergeGitignore(content: string): string;
8
+ export declare function mergePackageScripts(packageJson: Record<string, unknown>, scripts: Record<string, string>): Record<string, unknown>;
9
+ export declare function mergeGemfile(content: string): string;
10
+ export declare function ensureRubyVersion(root: string, version: string, { dryRun }?: {
11
+ dryRun?: boolean | undefined;
12
+ }): {
13
+ path: string;
14
+ wrote: boolean;
15
+ dryRun?: boolean;
16
+ };
17
+ export declare function patchAndroidBuildGradleGroovy(content: string): string;
18
+ export declare function patchAndroidBuildGradleKts(content: string): string;
19
+ export declare function patchAndroidBuildGradle(content: string, dsl: 'groovy' | 'kotlin'): string;
20
+ export declare function patchGradleProperties(content: string): string;
21
+ export type PlannedAction = {
22
+ type: 'write';
23
+ path: string;
24
+ contents: string;
25
+ mode?: number;
26
+ } | {
27
+ type: 'copy';
28
+ from: string;
29
+ to: string;
30
+ mode?: number;
31
+ } | {
32
+ type: 'skip';
33
+ path: string;
34
+ reason: string;
35
+ };
36
+ export declare function applyPlan(projectRoot: string, actions: PlannedAction[], dryRun: boolean): InstallManifest['managedPaths'];
37
+ export declare function releaseScripts(): Record<string, string>;
38
+ export declare function renderTemplate(template: string, values: Record<string, string>): string;
39
+ //# sourceMappingURL=patch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../src/patch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,YAAY,CAAC;AAEjE,eAAO,MAAM,KAAK,2BAA2B,CAAC;AAC9C,eAAO,MAAM,GAAG,2BAA2B,CAAC;AAE5C,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,KAAK,SAAQ,EACb,GAAG,SAAM,GACR,MAAM,CAaR;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAQ,EAAE,GAAG,SAAM,GAAG,MAAM,CASnF;AAED,eAAO,MAAM,yBAAyB,UAkCrC,CAAC;AAEF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAazB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,EAAE,MAAc,EAAE;;CAAK,GACtB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAMpD;AAiED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA+CrE;AAwDD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAalE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAIzF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAW7D;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD,wBAAgB,SAAS,CACvB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,aAAa,EAAE,EACxB,MAAM,EAAE,OAAO,GACd,eAAe,CAAC,cAAc,CAAC,CAgDjC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBvD;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAOvF"}