42 lines
1.4 KiB
TypeScript
42 lines
1.4 KiB
TypeScript
import { Plugin } from 'vite';
|
|
import { ResolvedConfig } from '~/types';
|
|
import { normalizePath } from '~/core/utils/paths';
|
|
import {
|
|
VirtualModuleId,
|
|
virtualModuleNames,
|
|
} from '~/core/utils/virtual-modules';
|
|
import fs from 'fs-extra';
|
|
import { resolve } from 'path';
|
|
|
|
/**
|
|
* Resolve all the virtual modules to the `node_modules/wxt/dist/virtual` directory.
|
|
*/
|
|
export function resolveVirtualModules(config: ResolvedConfig): Plugin[] {
|
|
return virtualModuleNames.map((name) => {
|
|
const virtualId: `${VirtualModuleId}?` = `virtual:wxt-${name}?`;
|
|
const resolvedVirtualId = '\0' + virtualId;
|
|
return {
|
|
name: `wxt:resolve-virtual-${name}`,
|
|
resolveId(id) {
|
|
// Id doesn't start with prefix, it looks like this:
|
|
// /path/to/project/virtual:wxt-background?/path/to/project/entrypoints/background.ts
|
|
const index = id.indexOf(virtualId);
|
|
if (index === -1) return;
|
|
|
|
const inputPath = normalizePath(id.substring(index + virtualId.length));
|
|
return resolvedVirtualId + inputPath;
|
|
},
|
|
async load(id) {
|
|
if (!id.startsWith(resolvedVirtualId)) return;
|
|
|
|
const inputPath = id.replace(resolvedVirtualId, '');
|
|
const template = await fs.readFile(
|
|
resolve(config.wxtModuleDir, `dist/virtual/${name}.js`),
|
|
'utf-8',
|
|
);
|
|
return template.replace(`virtual:user-${name}`, inputPath);
|
|
},
|
|
};
|
|
});
|
|
}
|