diff --git a/src/generators/legacy-html/index.mjs b/src/generators/legacy-html/index.mjs
index c100967b..639d864a 100644
--- a/src/generators/legacy-html/index.mjs
+++ b/src/generators/legacy-html/index.mjs
@@ -1,13 +1,12 @@
'use strict';
-import { readFile, rm, writeFile, mkdir } from 'node:fs/promises';
+import { cp, readFile, rm, writeFile } from 'node:fs/promises';
import { join } from 'node:path';
import HTMLMinifier from '@minify-html/node';
import buildContent from './utils/buildContent.mjs';
import dropdowns from './utils/buildDropdowns.mjs';
-import { safeCopy } from './utils/safeCopy.mjs';
import tableOfContents from './utils/tableOfContents.mjs';
import { groupNodesByModule } from '../../utils/generators.mjs';
import { getRemarkRehype } from '../../utils/remark.mjs';
@@ -170,22 +169,31 @@ export default {
}
if (output) {
- // Define the source folder for API docs assets
- const srcAssets = join(baseDir, 'assets');
-
- // Define the output folder for API docs assets
- const assetsFolder = join(output, 'assets');
-
- // Removes the current assets directory to copy the new assets
- // and prevent stale assets from existing in the output directory
- // If the path does not exists, it will simply ignore and continue
- await rm(assetsFolder, { recursive: true, force: true, maxRetries: 10 });
-
- // Creates the assets folder if it does not exist
- await mkdir(assetsFolder, { recursive: true });
-
- // Copy all files from assets folder to output, skipping unchanged files
- await safeCopy(srcAssets, assetsFolder);
+ try {
+ // Define the output folder for API docs assets
+ const assetsFolder = join(output, 'assets');
+
+ // Removes the current assets directory to copy the new assets
+ // and prevent stale assets from existing in the output directory
+ // If the path does not exists, it will simply ignore and continue
+ await rm(assetsFolder, {
+ recursive: true,
+ force: true,
+ maxRetries: 10,
+ });
+
+ // We copy all the other assets to the output folder at the end of the process
+ // to ensure that all latest changes on the styles are applied to the output
+ // Note.: This is not meant to be used for DX/developer purposes.
+ await cp(join(baseDir, 'assets'), assetsFolder, {
+ recursive: true,
+ force: true,
+ });
+ } catch {
+ // There's a chance that this step will fail when being run in parallel, since
+ // the generators will all attempt to modify the same files at the same time.
+ // In that scenario, we just want to ignore the potential failure.
+ }
}
return generatedValues;
diff --git a/src/generators/legacy-html/utils/safeCopy.mjs b/src/generators/legacy-html/utils/safeCopy.mjs
deleted file mode 100644
index e96b62ed..00000000
--- a/src/generators/legacy-html/utils/safeCopy.mjs
+++ /dev/null
@@ -1,38 +0,0 @@
-'use strict';
-
-import { readFile, writeFile, stat, readdir } from 'node:fs/promises';
-import { join } from 'node:path';
-
-/**
- * Safely copies files from source to target directory, skipping files that haven't changed
- * based on file stats (size and modification time)
- *
- * @param {string} srcDir - Source directory path
- * @param {string} targetDir - Target directory path
- */
-export async function safeCopy(srcDir, targetDir) {
- const files = await readdir(srcDir);
-
- for (const file of files) {
- const sourcePath = join(srcDir, file);
- const targetPath = join(targetDir, file);
-
- const [sStat, tStat] = await Promise.allSettled([
- stat(sourcePath),
- stat(targetPath),
- ]);
-
- const shouldWrite =
- tStat.status === 'rejected' ||
- sStat.value.size !== tStat.value.size ||
- sStat.value.mtimeMs > tStat.value.mtimeMs;
-
- if (!shouldWrite) {
- continue;
- }
-
- const fileContent = await readFile(sourcePath);
-
- await writeFile(targetPath, fileContent);
- }
-}