vite-plugin-ui-config.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { AdminUiConfig, VendureConfig } from '@vendure/core';
  2. import path from 'path';
  3. import { Plugin } from 'vite';
  4. import { getAdminUiConfig } from './ui-config.js';
  5. import { ConfigLoaderApi, getConfigLoaderApi } from './vite-plugin-config-loader.js';
  6. const virtualModuleId = 'virtual:vendure-ui-config';
  7. const resolvedVirtualModuleId = `\0${virtualModuleId}`;
  8. export type UiConfigPluginOptions = {
  9. /**
  10. * @description
  11. * The admin UI config to be passed to the Vendure Dashboard.
  12. */
  13. adminUiConfig?: Partial<AdminUiConfig>;
  14. };
  15. /**
  16. * This Vite plugin scans the configured plugins for any dashboard extensions and dynamically
  17. * generates an import statement for each one, wrapped up in a `runDashboardExtensions()`
  18. * function which can then be imported and executed in the Dashboard app.
  19. */
  20. export function uiConfigPlugin({ adminUiConfig }: UiConfigPluginOptions): Plugin {
  21. let configLoaderApi: ConfigLoaderApi;
  22. let vendureConfig: VendureConfig;
  23. return {
  24. name: 'vendure:dashboard-ui-config',
  25. configResolved({ plugins }) {
  26. configLoaderApi = getConfigLoaderApi(plugins);
  27. },
  28. resolveId(id) {
  29. if (id === virtualModuleId) {
  30. return resolvedVirtualModuleId;
  31. }
  32. },
  33. async load(id) {
  34. if (id === resolvedVirtualModuleId) {
  35. if (!vendureConfig) {
  36. vendureConfig = await configLoaderApi.getVendureConfig();
  37. }
  38. const config = getAdminUiConfig(vendureConfig, adminUiConfig);
  39. return `
  40. export const uiConfig = ${JSON.stringify(config)}
  41. `;
  42. }
  43. },
  44. };
  45. }
  46. /**
  47. * Converts an import path to a normalized path relative to the rootDir.
  48. */
  49. function normalizeImportPath(rootDir: string, importPath: string): string {
  50. const relativePath = path.relative(rootDir, importPath).replace(/\\/g, '/');
  51. return relativePath.replace(/\.tsx?$/, '.js');
  52. }