From 3ccb31f9339ead07b4b420cd361dfdd6cc5bad5e Mon Sep 17 00:00:00 2001 From: Tommy Nguyen <4123478+tido64@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:02:24 +0100 Subject: [PATCH 1/2] refactor: add utility function for writing JSON files --- android/autolink.mjs | 9 ++++----- ios/assetsCatalog.mjs | 9 +++++++-- scripts/internal/prepare-viewfinder.mts | 4 ++-- scripts/internal/set-react-version.mts | 23 ++++++++--------------- scripts/utils/filesystem.mjs | 11 +++++++++++ 5 files changed, 32 insertions(+), 24 deletions(-) diff --git a/android/autolink.mjs b/android/autolink.mjs index f39d9d1f7..0a4d97949 100644 --- a/android/autolink.mjs +++ b/android/autolink.mjs @@ -9,7 +9,7 @@ import { readTextFile, writeTextFile, } from "../scripts/helpers.js"; -import { mkdir_p } from "../scripts/utils/filesystem.mjs"; +import { mkdir_p, writeJSONFile } from "../scripts/utils/filesystem.mjs"; /** * @typedef {import("@react-native-community/cli-types").Config} Config @@ -97,7 +97,7 @@ async function loadConfig(json, projectRoot) { const prunedConfig = pruneDependencies(config); ensureDirForFile(json); - writeTextFile(json, JSON.stringify(prunedConfig, undefined, 2) + "\n"); + writeJSONFile(json, prunedConfig); writeTextFile(stateFile, state); return prunedConfig; } @@ -117,12 +117,11 @@ async function main(projectRoot, output) { ); const dependencies = pickAndroidDependencies(config); - const json = JSON.stringify(dependencies, undefined, 2); if (!output) { - console.log(json); + console.log(JSON.stringify(dependencies, undefined, 2)); } else { ensureDirForFile(output); - writeTextFile(output, json + "\n"); + writeJSONFile(output, dependencies); } } diff --git a/ios/assetsCatalog.mjs b/ios/assetsCatalog.mjs index 7e9b37c9d..31e4471d3 100644 --- a/ios/assetsCatalog.mjs +++ b/ios/assetsCatalog.mjs @@ -4,7 +4,12 @@ import * as nodefs from "node:fs"; import * as path from "node:path"; import { sourceForAppConfig } from "../scripts/appConfig.mjs"; import { readJSONFile } from "../scripts/helpers.js"; -import { cp_r, mkdir_p, rm_r } from "../scripts/utils/filesystem.mjs"; +import { + cp_r, + mkdir_p, + rm_r, + writeJSONFile, +} from "../scripts/utils/filesystem.mjs"; import { isObject, projectPath } from "./utils.mjs"; /** @@ -146,6 +151,6 @@ export function generateAssetsCatalogs( const contents = { images, info: template["info"] }; const dest = path.join(appIconSet, "Contents.json"); - fs.writeFileSync(dest, JSON.stringify(contents, undefined, 2)); + writeJSONFile(dest, contents); } } diff --git a/scripts/internal/prepare-viewfinder.mts b/scripts/internal/prepare-viewfinder.mts index 67d7611b3..bc6db53b1 100755 --- a/scripts/internal/prepare-viewfinder.mts +++ b/scripts/internal/prepare-viewfinder.mts @@ -1,10 +1,10 @@ #!/usr/bin/env -S node --experimental-transform-types --no-warnings import { spawnSync } from "node:child_process"; -import * as fs from "node:fs"; import * as path from "node:path"; import { URL, fileURLToPath } from "node:url"; import { readJSONFile } from "../helpers.js"; +import { writeJSONFile } from "../utils/filesystem.mjs"; const APP_IDENTIFIER = "com.microsoft.ReactNativeViewfinder"; const PACKAGE_MANAGER = "yarn"; @@ -34,7 +34,7 @@ function configureAppManifest() { }, }; - fs.writeFileSync(APP_MANIFEST, JSON.stringify(manifest, null, 2) + "\n"); + writeJSONFile(APP_MANIFEST, manifest); } /** diff --git a/scripts/internal/set-react-version.mts b/scripts/internal/set-react-version.mts index f27a80fff..8ae6c0419 100644 --- a/scripts/internal/set-react-version.mts +++ b/scripts/internal/set-react-version.mts @@ -2,8 +2,7 @@ * Reminder that this script is meant to be runnable without installing * dependencies. It can therefore not rely on any external libraries. */ -import { promises as fs } from "node:fs"; -import * as os from "node:os"; +import * as fs from "node:fs"; import * as path from "node:path"; import * as util from "node:util"; import { @@ -14,6 +13,7 @@ import { v, } from "../helpers.js"; import type { Manifest } from "../types.js"; +import { writeJSONFile } from "../utils/filesystem.mjs"; import { fetchPackageMetadata, npmRegistryBaseURL } from "../utils/npm.mjs"; const VALID_TAGS = ["canary-macos", "canary-windows", "nightly"]; @@ -36,12 +36,12 @@ function searchReplaceInFile( filename: string, searchValue: string | RegExp, replaceValue: string -): Promise { +): void { const current = readTextFile(filename); const updated = current.replace(searchValue, replaceValue); - return updated === current - ? Promise.resolve() - : fs.writeFile(filename, updated); + if (updated !== current) { + fs.writeFileSync(filename, updated); + } } /** @@ -331,7 +331,6 @@ export async function setReactVersion( coreOnly: boolean, overrides: Record = {} ): Promise { - let fd: fs.FileHandle | undefined; try { const profile = { ...(await getProfile(version, coreOnly)), ...overrides }; console.dir(profile, { depth: null }); @@ -363,18 +362,12 @@ export async function setReactVersion( } const tmpFile = manifestPath + ".tmp"; - fd = await fs.open(tmpFile, "w", 0o644); - await fd.write(JSON.stringify(manifest, undefined, 2)); - await fd.write(os.EOL); - await fd.close(); - fd = undefined; - await fs.rename(tmpFile, manifestPath); + writeJSONFile(tmpFile, manifest); + fs.renameSync(tmpFile, manifestPath); } } catch (e) { console.error(e); process.exitCode = 1; - } finally { - fd?.close(); } } diff --git a/scripts/utils/filesystem.mjs b/scripts/utils/filesystem.mjs index e9f73000a..d057d8f98 100644 --- a/scripts/utils/filesystem.mjs +++ b/scripts/utils/filesystem.mjs @@ -26,3 +26,14 @@ export function mkdir_p(p, fs = nodefs) { export function rm_r(p, fs = nodefs) { fs.rmSync(p, RM_R_OPTIONS); } + +/** + * @param {string} path + * @param {unknown} obj + */ +export function writeJSONFile(path, obj, fs = nodefs) { + const fd = fs.openSync(path, "w", 0o644); + fs.writeSync(fd, JSON.stringify(obj, undefined, 2)); + fs.writeSync(fd, "\n"); + fs.closeSync(fd); +} From 7b6bd9d814f8bdf67830a8585e24883278937283 Mon Sep 17 00:00:00 2001 From: Tommy Nguyen <4123478+tido64@users.noreply.github.com> Date: Wed, 7 May 2025 19:00:11 +0200 Subject: [PATCH 2/2] forward mock --- ios/assetsCatalog.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/assetsCatalog.mjs b/ios/assetsCatalog.mjs index 31e4471d3..f3ec93fbd 100644 --- a/ios/assetsCatalog.mjs +++ b/ios/assetsCatalog.mjs @@ -151,6 +151,6 @@ export function generateAssetsCatalogs( const contents = { images, info: template["info"] }; const dest = path.join(appIconSet, "Contents.json"); - writeJSONFile(dest, contents); + writeJSONFile(dest, contents, fs); } }