123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- import type { PluginOption } from 'vite';
- import type { NitroMockPluginOptions } from '../typing';
- import { colors, consola, getPackage } from '@vben/node-utils';
- import { build, createDevServer, createNitro, prepare } from 'nitropack';
- const hmrKeyRe = /^runtimeConfig\.|routeRules\./;
- export const viteNitroMockPlugin = ({
- mockServerPackage = '@vben/backend-mock',
- port = 5320,
- verbose = true,
- }: NitroMockPluginOptions = {}): PluginOption => {
- return {
- async configureServer(server) {
- const pkg = await getPackage(mockServerPackage);
- if (!pkg) {
- consola.error(`Package ${mockServerPackage} not found.`);
- return;
- }
- runNitroServer(pkg.dir, port, verbose);
- const _printUrls = server.printUrls;
- server.printUrls = () => {
- _printUrls();
- consola.log(
- ` ${colors.green('➜')} ${colors.bold('Nitro Mock Server')}: ${colors.cyan(`http://localhost:${port}/api`)}`,
- );
- };
- },
- enforce: 'pre',
- name: 'vite:mock-server',
- };
- };
- async function runNitroServer(rootDir: string, port: number, verbose: boolean) {
- let nitro: any;
- const reload = async () => {
- if (nitro) {
- consola.info('Restarting dev server...');
- if ('unwatch' in nitro.options._c12) {
- await nitro.options._c12.unwatch();
- }
- await nitro.close();
- }
- nitro = await createNitro(
- {
- dev: true,
- preset: 'nitro-dev',
- rootDir,
- },
- {
- c12: {
- async onUpdate({ getDiff, newConfig }) {
- const diff = getDiff();
- if (diff.length === 0) {
- return;
- }
- verbose &&
- consola.info(
- `Nitro config updated:\n${diff
- .map((entry) => ` ${entry.toString()}`)
- .join('\n')}`,
- );
- await (diff.every((e) => hmrKeyRe.test(e.key))
- ? nitro.updateConfig(newConfig.config)
- : reload());
- },
- },
- watch: true,
- },
- );
- nitro.hooks.hookOnce('restart', reload);
- const server = createDevServer(nitro);
- await server.listen(port, { showURL: false });
- await prepare(nitro);
- await build(nitro);
- if (verbose) {
- console.log('');
- consola.success(colors.bold(colors.green('Nitro Mock Server started.')));
- }
- };
- return await reload();
- }
|