Files
wxt/src/core/vite-plugins/multipageMove.ts
T

68 lines
2.4 KiB
TypeScript

import * as vite from 'vite';
import { Entrypoint, InternalConfig } from '../types';
import { dirname, extname, resolve } from 'node:path';
import { getEntrypointBundlePath } from '../utils/entrypoints';
import fs, { ensureDir } from 'fs-extra';
/**
* Ensures the HTML files output by a multipage build are in the correct location. This does two
* things:
*
* 1. Moves the HMTL files to their final location at `<outDir>/<entrypoint.name>.html`.
* 2. Updates the bundle so it summarizes the files correctly in the returned build output.
*
* Assets (JS and CSS) are output to the `<outDir>/assets` directory, and don't need to be modified.
* HTML files access them via absolute URLs, so we don't need to update any import paths in the HTML
* files either.
*/
export function multipageMove(
entrypoints: Entrypoint[],
config: InternalConfig,
): vite.Plugin {
return {
name: 'wxt:multipage-move',
async writeBundle(_, bundle) {
for (const oldBundlePath in bundle) {
// oldBundlePath = 'entrypoints/popup.html' or 'entrypoints/o ptions/index.html'
// Find a matching entrypoint - oldBundlePath is the same as end end of the input path.
const entrypoint = entrypoints.find(
(entry) => !!entry.inputPath.endsWith(oldBundlePath),
);
if (entrypoint == null) {
config.logger.debug('No entrypoint found for', oldBundlePath);
continue;
}
// Get the new bundle path
const newBundlePath = getEntrypointBundlePath(
entrypoint,
config.outDir,
extname(oldBundlePath),
);
if (newBundlePath === oldBundlePath) {
config.logger.debug(
'HTML file is already in the correct location',
oldBundlePath,
);
continue;
}
// Move file and update bundle
// Do this inside a mutex lock so it only runs one at a time for concurrent multipage builds
const oldAbsPath = resolve(config.outDir, oldBundlePath);
const newAbsPath = resolve(config.outDir, newBundlePath);
await ensureDir(dirname(newAbsPath));
await fs.move(oldAbsPath, newAbsPath, { overwrite: true });
const renamedChunk = {
...bundle[oldBundlePath],
fileName: newBundlePath,
};
delete bundle[oldBundlePath];
bundle[newBundlePath] = renamedChunk;
}
},
};
}