nitor-mock.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import type { PluginOption } from 'vite';
  2. import type { NitroMockPluginOptions } from '../typing';
  3. import { colors, consola, getPackage } from '@vben/node-utils';
  4. import getPort from 'get-port';
  5. import { build, createDevServer, createNitro, prepare } from 'nitropack';
  6. const hmrKeyRe = /^runtimeConfig\.|routeRules\./;
  7. export const viteNitroMockPlugin = ({
  8. mockServerPackage = '@vben/backend-mock',
  9. port = 5320,
  10. verbose = true,
  11. }: NitroMockPluginOptions = {}): PluginOption => {
  12. return {
  13. async configureServer(server) {
  14. const availablePort = await getPort({ port });
  15. if (availablePort !== port) {
  16. return;
  17. }
  18. const pkg = await getPackage(mockServerPackage);
  19. if (!pkg) {
  20. consola.error(`Package ${mockServerPackage} not found.`);
  21. return;
  22. }
  23. runNitroServer(pkg.dir, port, verbose);
  24. const _printUrls = server.printUrls;
  25. server.printUrls = () => {
  26. _printUrls();
  27. consola.log(
  28. ` ${colors.green('➜')} ${colors.bold('Nitro Mock Server')}: ${colors.cyan(`http://localhost:${port}/api`)}`,
  29. );
  30. };
  31. },
  32. enforce: 'pre',
  33. name: 'vite:mock-server',
  34. };
  35. };
  36. async function runNitroServer(rootDir: string, port: number, verbose: boolean) {
  37. let nitro: any;
  38. const reload = async () => {
  39. if (nitro) {
  40. consola.info('Restarting dev server...');
  41. if ('unwatch' in nitro.options._c12) {
  42. await nitro.options._c12.unwatch();
  43. }
  44. await nitro.close();
  45. }
  46. nitro = await createNitro(
  47. {
  48. dev: true,
  49. preset: 'nitro-dev',
  50. rootDir,
  51. },
  52. {
  53. c12: {
  54. async onUpdate({ getDiff, newConfig }) {
  55. const diff = getDiff();
  56. if (diff.length === 0) {
  57. return;
  58. }
  59. verbose &&
  60. consola.info(
  61. `Nitro config updated:\n${diff
  62. .map((entry) => ` ${entry.toString()}`)
  63. .join('\n')}`,
  64. );
  65. await (diff.every((e) => hmrKeyRe.test(e.key))
  66. ? nitro.updateConfig(newConfig.config)
  67. : reload());
  68. },
  69. },
  70. watch: true,
  71. },
  72. );
  73. nitro.hooks.hookOnce('restart', reload);
  74. const server = createDevServer(nitro);
  75. await server.listen(port, { showURL: false });
  76. await prepare(nitro);
  77. await build(nitro);
  78. if (verbose) {
  79. console.log('');
  80. consola.success(colors.bold(colors.green('Nitro Mock Server started.')));
  81. }
  82. };
  83. return await reload();
  84. }