nitor-mock.ts 2.4 KB

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