-
Notifications
You must be signed in to change notification settings - Fork 509
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
chore: migrate to node:fs/promises #8310
Changes from all commits
d59abd2
407abc3
ddd0184
4270003
28d0d73
52849b0
716a733
2457e35
5069d6d
4d9afa3
58bc739
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,12 +1,13 @@ | ||||||||||||||||||||||||
#!/usr/bin/env node | ||||||||||||||||||||||||
import crypto from "node:crypto"; | ||||||||||||||||||||||||
import fs from "node:fs"; | ||||||||||||||||||||||||
import fs from "node:fs/promises"; | ||||||||||||||||||||||||
import path from "node:path"; | ||||||||||||||||||||||||
import zlib from "node:zlib"; | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
import chalk from "chalk"; | ||||||||||||||||||||||||
import cliProgress from "cli-progress"; | ||||||||||||||||||||||||
import caporal from "@caporal/core"; | ||||||||||||||||||||||||
import fse from "fs-extra"; | ||||||||||||||||||||||||
import inquirer from "inquirer"; | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
import { Document, slugToFolder, translationsOf } from "../content/index.js"; | ||||||||||||||||||||||||
|
@@ -181,24 +182,24 @@ async function buildDocuments( | |||||||||||||||||||||||
} = result; | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
const outPath = path.join(BUILD_OUT_ROOT, slugToFolder(document.url)); | ||||||||||||||||||||||||
fs.mkdirSync(outPath, { recursive: true }); | ||||||||||||||||||||||||
await fs.mkdir(outPath, { recursive: true }); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
if (builtDocument.flaws) { | ||||||||||||||||||||||||
appendTotalFlaws(builtDocument.flaws); | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
if (!noHTML) { | ||||||||||||||||||||||||
fs.writeFileSync( | ||||||||||||||||||||||||
await fs.writeFile( | ||||||||||||||||||||||||
path.join(outPath, "index.html"), | ||||||||||||||||||||||||
renderHTML(document.url, { doc: builtDocument }) | ||||||||||||||||||||||||
await renderHTML(document.url, { doc: builtDocument }) | ||||||||||||||||||||||||
); | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
// This is exploiting the fact that renderHTML has the side-effect of | ||||||||||||||||||||||||
// mutating the built document which makes this not great and refactor-worthy. | ||||||||||||||||||||||||
const docString = JSON.stringify({ doc: builtDocument }); | ||||||||||||||||||||||||
fs.writeFileSync(path.join(outPath, "index.json"), docString); | ||||||||||||||||||||||||
fs.writeFileSync( | ||||||||||||||||||||||||
await fs.writeFile(path.join(outPath, "index.json"), docString); | ||||||||||||||||||||||||
await fs.writeFile( | ||||||||||||||||||||||||
path.join(outPath, "contributors.txt"), | ||||||||||||||||||||||||
renderContributorsTxt( | ||||||||||||||||||||||||
document.metadata.contributors, | ||||||||||||||||||||||||
|
@@ -208,13 +209,13 @@ async function buildDocuments( | |||||||||||||||||||||||
|
||||||||||||||||||||||||
for (const { id, html } of liveSamples) { | ||||||||||||||||||||||||
const liveSamplePath = path.join(outPath, `_sample_.${id}.html`); | ||||||||||||||||||||||||
fs.writeFileSync(liveSamplePath, html); | ||||||||||||||||||||||||
await fs.writeFile(liveSamplePath, html); | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
for (const filePath of fileAttachments) { | ||||||||||||||||||||||||
// We *could* use symlinks instead. But, there's no point :) | ||||||||||||||||||||||||
// Yes, a symlink is less disk I/O but it's nominal. | ||||||||||||||||||||||||
fs.copyFileSync(filePath, path.join(outPath, path.basename(filePath))); | ||||||||||||||||||||||||
await fs.copyFile(filePath, path.join(outPath, path.basename(filePath))); | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
// Collect active documents' slugs to be used in sitemap building and | ||||||||||||||||||||||||
|
@@ -242,10 +243,7 @@ async function buildDocuments( | |||||||||||||||||||||||
} = builtDocument; | ||||||||||||||||||||||||
builtMetadata.hash = hash; | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
fs.writeFileSync( | ||||||||||||||||||||||||
path.join(outPath, "metadata.json"), | ||||||||||||||||||||||||
JSON.stringify(builtMetadata) | ||||||||||||||||||||||||
); | ||||||||||||||||||||||||
await fse.writeJson(path.join(outPath, "metadata.json"), builtMetadata); | ||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Keep the prior |
||||||||||||||||||||||||
if (metadata[document.metadata.locale]) { | ||||||||||||||||||||||||
metadata[document.metadata.locale].push(builtMetadata); | ||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||
|
@@ -273,26 +271,26 @@ async function buildDocuments( | |||||||||||||||||||||||
"sitemaps", | ||||||||||||||||||||||||
locale.toLowerCase() | ||||||||||||||||||||||||
); | ||||||||||||||||||||||||
fs.mkdirSync(sitemapDir, { recursive: true }); | ||||||||||||||||||||||||
await fs.mkdir(sitemapDir, { recursive: true }); | ||||||||||||||||||||||||
const sitemapFilePath = path.join(sitemapDir, "sitemap.xml.gz"); | ||||||||||||||||||||||||
fs.writeFileSync( | ||||||||||||||||||||||||
await fs.writeFile( | ||||||||||||||||||||||||
sitemapFilePath, | ||||||||||||||||||||||||
zlib.gzipSync(makeSitemapXML(locale, docs)) | ||||||||||||||||||||||||
); | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
searchIndex.sort(); | ||||||||||||||||||||||||
for (const [locale, items] of Object.entries(searchIndex.getItems())) { | ||||||||||||||||||||||||
fs.writeFileSync( | ||||||||||||||||||||||||
await fse.writeJson( | ||||||||||||||||||||||||
path.join(BUILD_OUT_ROOT, locale.toLowerCase(), "search-index.json"), | ||||||||||||||||||||||||
JSON.stringify(items) | ||||||||||||||||||||||||
items | ||||||||||||||||||||||||
); | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
for (const [locale, meta] of Object.entries(metadata)) { | ||||||||||||||||||||||||
fs.writeFileSync( | ||||||||||||||||||||||||
await fse.writeJson( | ||||||||||||||||||||||||
path.join(BUILD_OUT_ROOT, locale.toLowerCase(), "metadata.json"), | ||||||||||||||||||||||||
JSON.stringify(meta) | ||||||||||||||||||||||||
meta | ||||||||||||||||||||||||
); | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
|
@@ -302,7 +300,7 @@ async function buildDocuments( | |||||||||||||||||||||||
doc.browserCompat?.forEach((query) => allBrowserCompat.add(query)) | ||||||||||||||||||||||||
) | ||||||||||||||||||||||||
); | ||||||||||||||||||||||||
fs.writeFileSync( | ||||||||||||||||||||||||
await fs.writeFile( | ||||||||||||||||||||||||
path.join(BUILD_OUT_ROOT, "allBrowserCompat.txt"), | ||||||||||||||||||||||||
[...allBrowserCompat].join(" ") | ||||||||||||||||||||||||
); | ||||||||||||||||||||||||
|
@@ -390,14 +388,14 @@ program | |||||||||||||||||||||||
locale, | ||||||||||||||||||||||||
"sitemap.xml.gz" | ||||||||||||||||||||||||
); | ||||||||||||||||||||||||
if (fs.existsSync(sitemapFilePath)) { | ||||||||||||||||||||||||
if (await fse.pathExists(sitemapFilePath)) { | ||||||||||||||||||||||||
sitemapsBuilt.push(sitemapFilePath); | ||||||||||||||||||||||||
locales.push(locale); | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
Comment on lines
+391
to
394
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
} | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
const sitemapIndexFilePath = path.join(BUILD_OUT_ROOT, "sitemap.xml"); | ||||||||||||||||||||||||
fs.writeFileSync( | ||||||||||||||||||||||||
await fs.writeFile( | ||||||||||||||||||||||||
sitemapIndexFilePath, | ||||||||||||||||||||||||
makeSitemapIndexXML( | ||||||||||||||||||||||||
sitemapsBuilt.map((fp) => fp.replace(BUILD_OUT_ROOT, "")) | ||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -1,15 +1,17 @@ | ||||||
import fs from "node:fs"; | ||||||
import fs from "node:fs/promises"; | ||||||
import path from "node:path"; | ||||||
|
||||||
import fse from "fs-extra"; | ||||||
|
||||||
import { execGit } from "../content/index.js"; | ||||||
import { CONTENT_ROOT } from "../libs/env/index.js"; | ||||||
|
||||||
function getFromGit(contentRoot = CONTENT_ROOT) { | ||||||
async function getFromGit(contentRoot = CONTENT_ROOT) { | ||||||
// If `contentRoot` was a symlink, the `repoRoot` won't be. That'll make it | ||||||
// impossible to compute the relative path for files within when we get | ||||||
// output back from `git log ...`. | ||||||
// So, always normalize to the real path. | ||||||
const realContentRoot = fs.realpathSync(contentRoot); | ||||||
const realContentRoot = await fs.realpath(contentRoot); | ||||||
|
||||||
const repoRoot = execGit(["rev-parse", "--show-toplevel"], { | ||||||
cwd: realContentRoot, | ||||||
|
@@ -64,17 +66,17 @@ function getFromGit(contentRoot = CONTENT_ROOT) { | |||||
return [map, parents]; | ||||||
} | ||||||
|
||||||
export function gather(contentRoots, previousFile = null) { | ||||||
export async function gather(contentRoots, previousFile = null) { | ||||||
const map = new Map(); | ||||||
if (previousFile) { | ||||||
const previous = JSON.parse(fs.readFileSync(previousFile, "utf-8")); | ||||||
const previous = await fse.readJson(previousFile, "utf-8"); | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Keep
Suggested change
|
||||||
for (const [key, value] of Object.entries(previous)) { | ||||||
map.set(key, value); | ||||||
} | ||||||
} | ||||||
// Every key in this map is a path, relative to root. | ||||||
for (const contentRoot of contentRoots) { | ||||||
const [commits, parents] = getFromGit(contentRoot); | ||||||
const [commits, parents] = await getFromGit(contentRoot); | ||||||
for (const [key, value] of commits) { | ||||||
// Because CONTENT_*_ROOT isn't necessarily the same as the path relative to | ||||||
// the git root. For example "../README.md" and since those aren't documents | ||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not a fan of using an extra library here (I see we already use it in
main
, we should remove it from there too) - the inbuilt node lib should be sufficient.