Blame view

Yi.Vben5.Vue3/internal/vite-config/src/plugins/nitro-mock.ts 2.55 KB
515fceeb   “wangming”   框架初始化
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
  import type { PluginOption } from 'vite';
  
  import type { NitroMockPluginOptions } from '../typing';
  
  import { colors, consola, getPackage } from '@vben/node-utils';
  
  import getPort from 'get-port';
  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 availablePort = await getPort({ port });
        if (availablePort !== port) {
          return;
        }
  
        const pkg = await getPackage(mockServerPackage);
        if (!pkg) {
          consola.log(
            `Package ${mockServerPackage} not found. Skip mock server.`,
          );
          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();
  }