All files / repo-tools/src/vite-plugins deduplicate-assets.ts

0% Statements 0/8
0% Branches 0/2
0% Functions 0/4
0% Lines 0/8

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41                                                                                 
import type { Plugin as VitePlugin } from 'vite';
 
type Options = {
  assetFilter: (fileName: string) => boolean;
  expectedCount: number;
};
 
/**
 * Vite plugin that deletes extraneous assets from the bundle.
 *
 * @param options - Options for the plugin
 * @param options.assetFilter - A function that filters the assets to be deleted
 * @param options.expectedCount - The expected number of assets to be deleted
 * @throws If the number of extraneous assets is not equal to the expected count.
 * @returns The Vite plugin.
 */
export function deduplicateAssets({
  assetFilter,
  expectedCount,
}: Options): VitePlugin {
  return {
    name: 'ocap-kernel:deduplicate-assets',
    enforce: 'post',
    generateBundle(_, bundle) {
      const extraneousAssets = Object.values(bundle).filter((assetOrChunk) =>
        assetFilter(assetOrChunk.fileName),
      );
 
      if (extraneousAssets.length !== expectedCount) {
        throw new Error(
          `Expected ${expectedCount} extraneous assets, got ${extraneousAssets.length}: ${extraneousAssets.map((asset) => asset.fileName).join(', ')}`,
        );
      }
 
      for (const asset of extraneousAssets) {
        delete bundle[asset.fileName];
      }
    },
  };
}