From 200009008b92691eed2f7a83ac88d04df17ea029 Mon Sep 17 00:00:00 2001 From: Joshua Chen Date: Sun, 17 Apr 2022 12:50:09 +0800 Subject: [PATCH] refactor: prefer fs.readJSON over readFile.then(JSON.parse) (#7186) * refactor: prefer fs.readJSON over readFile.then(JSON.parse) * refactor: use promises --- __tests__/validate-package-json.test.ts | 6 +--- admin/scripts/generateExamples.mjs | 4 +-- packages/create-docusaurus/src/index.ts | 3 +- packages/docusaurus-migrate/src/index.ts | 6 ++-- .../locales/__tests__/locales.test.ts | 30 ++++++++++--------- .../src/index.ts | 3 +- .../docusaurus-theme-translations/update.mjs | 2 +- .../docusaurus/src/client/serverEntry.tsx | 4 +-- .../src/server/translations/translations.ts | 2 +- 9 files changed, 27 insertions(+), 33 deletions(-) diff --git a/__tests__/validate-package-json.test.ts b/__tests__/validate-package-json.test.ts index 5f3d605d5a..8598d7b892 100644 --- a/__tests__/validate-package-json.test.ts +++ b/__tests__/validate-package-json.test.ts @@ -27,12 +27,8 @@ type PackageJsonFile = { async function getPackagesJsonFiles(): Promise { const files = await Globby('packages/*/package.json'); - return Promise.all( - files.map(async (file) => ({ - file, - content: JSON.parse(await fs.readFile(file, 'utf8')), - })), + files.map((file) => fs.readJSON(file).then((content) => ({file, content}))), ); } diff --git a/admin/scripts/generateExamples.mjs b/admin/scripts/generateExamples.mjs index 748640ae0d..edf56f4b42 100644 --- a/admin/scripts/generateExamples.mjs +++ b/admin/scripts/generateExamples.mjs @@ -37,8 +37,8 @@ async function generateTemplateExample(template) { ); // read the content of the package.json - const templatePackageJson = JSON.parse( - await fs.readFile(`examples/${template}/package.json`, 'utf8'), + const templatePackageJson = await fs.readJSON( + `examples/${template}/package.json`, ); // attach the dev script which would be used in code sandbox by default diff --git a/packages/create-docusaurus/src/index.ts b/packages/create-docusaurus/src/index.ts index 4358ee0203..e913de7ef3 100755 --- a/packages/create-docusaurus/src/index.ts +++ b/packages/create-docusaurus/src/index.ts @@ -103,8 +103,7 @@ function isValidGitRepoUrl(gitRepoUrl: string) { } async function updatePkg(pkgPath: string, obj: {[key: string]: unknown}) { - const content = await fs.readFile(pkgPath, 'utf-8'); - const pkg = JSON.parse(content); + const pkg = await fs.readJSON(pkgPath); const newPkg = Object.assign(pkg, obj); await fs.outputFile(pkgPath, `${JSON.stringify(newPkg, null, 2)}\n`); diff --git a/packages/docusaurus-migrate/src/index.ts b/packages/docusaurus-migrate/src/index.ts index 764718fc54..b4798285a6 100644 --- a/packages/docusaurus-migrate/src/index.ts +++ b/packages/docusaurus-migrate/src/index.ts @@ -443,8 +443,8 @@ async function migrateBlogFiles(context: MigrationContext) { async function handleVersioning(context: MigrationContext) { const {siteDir, newDir} = context; if (await fs.pathExists(path.join(siteDir, 'versions.json'))) { - const loadedVersions: string[] = JSON.parse( - await fs.readFile(path.join(siteDir, 'versions.json'), 'utf-8'), + const loadedVersions: string[] = await fs.readJSON( + path.join(siteDir, 'versions.json'), ); await fs.copyFile( path.join(siteDir, 'versions.json'), @@ -542,7 +542,7 @@ async function migrateVersionedSidebar( `version-${version}-sidebars.json`, ); try { - sidebarEntries = JSON.parse(await fs.readFile(sidebarPath, 'utf-8')); + sidebarEntries = await fs.readJSON(sidebarPath); } catch { sidebars.push({version, entries: sidebars[i - 1]!.entries}); return; diff --git a/packages/docusaurus-theme-translations/locales/__tests__/locales.test.ts b/packages/docusaurus-theme-translations/locales/__tests__/locales.test.ts index 0dc8db2597..7bf0bf22a4 100644 --- a/packages/docusaurus-theme-translations/locales/__tests__/locales.test.ts +++ b/packages/docusaurus-theme-translations/locales/__tests__/locales.test.ts @@ -17,22 +17,24 @@ jest.setTimeout(15000); describe('theme translations', () => { it('has base messages files contain EXACTLY all the translations extracted from the theme. Please run "yarn workspace @docusaurus/theme-translations update" to keep base messages files up-to-date', async () => { const baseMessagesDirPath = path.join(__dirname, '../base'); - const baseMessages = Object.fromEntries( - await Promise.all( - ( - await fs.readdir(baseMessagesDirPath) - ).map(async (baseMessagesFile) => - Object.entries( - (await fs.readJSON( - path.join(baseMessagesDirPath, baseMessagesFile), - 'utf-8', - )) as {[key: string]: string}, + const baseMessages = await fs + .readdir(baseMessagesDirPath) + .then((files) => + Promise.all( + files.map( + (baseMessagesFile): Promise<{[key: string]: string}> => + fs.readJSON(path.join(baseMessagesDirPath, baseMessagesFile)), ), ), - ).then((translations) => - translations.flat().filter(([key]) => !key.endsWith('___DESCRIPTION')), - ), - ); + ) + .then((translations) => + Object.fromEntries( + translations + .map(Object.entries) + .flat() + .filter(([key]) => !key.endsWith('___DESCRIPTION')), + ), + ); const codeMessages = _.mapValues( await extractThemeCodeMessages(), (translation) => translation.message, diff --git a/packages/docusaurus-theme-translations/src/index.ts b/packages/docusaurus-theme-translations/src/index.ts index 3f75c3d22e..068e5be464 100644 --- a/packages/docusaurus-theme-translations/src/index.ts +++ b/packages/docusaurus-theme-translations/src/index.ts @@ -50,8 +50,7 @@ export async function readDefaultCodeTranslationMessages({ const filePath = path.resolve(dirPath, localeToTry, `${name}.json`); if (await fs.pathExists(filePath)) { - const fileContent = await fs.readFile(filePath, 'utf8'); - return JSON.parse(fileContent); + return fs.readJSON(filePath); } } diff --git a/packages/docusaurus-theme-translations/update.mjs b/packages/docusaurus-theme-translations/update.mjs index de7a0960ad..85736bf696 100644 --- a/packages/docusaurus-theme-translations/update.mjs +++ b/packages/docusaurus-theme-translations/update.mjs @@ -55,7 +55,7 @@ async function readMessagesFile(filePath) { logger.info`File path=${filePath} not found. Creating new translation base file.`; await fs.outputFile(filePath, '{}\n'); } - return JSON.parse((await fs.readFile(filePath)).toString()); + return fs.readJSON(filePath); } /** diff --git a/packages/docusaurus/src/client/serverEntry.tsx b/packages/docusaurus/src/client/serverEntry.tsx index c2c57e9348..4ff192881b 100644 --- a/packages/docusaurus/src/client/serverEntry.tsx +++ b/packages/docusaurus/src/client/serverEntry.tsx @@ -111,9 +111,7 @@ async function doRender(locals: Locals & {path: string}) { const {generatedFilesDir} = locals; const manifestPath = path.join(generatedFilesDir, 'client-manifest.json'); - const manifest: Manifest = JSON.parse( - await fs.readFile(manifestPath, 'utf8'), - ); + const manifest: Manifest = await fs.readJSON(manifestPath); // Get all required assets for this particular page based on client // manifest information. diff --git a/packages/docusaurus/src/server/translations/translations.ts b/packages/docusaurus/src/server/translations/translations.ts index 4d0bcb2474..160e9a6bd0 100644 --- a/packages/docusaurus/src/server/translations/translations.ts +++ b/packages/docusaurus/src/server/translations/translations.ts @@ -58,7 +58,7 @@ async function readTranslationFileContent( ): Promise { if (await fs.pathExists(filePath)) { try { - const content = JSON.parse(await fs.readFile(filePath, 'utf8')); + const content = await fs.readJSON(filePath); ensureTranslationFileContent(content); return content; } catch (err) {