vite-plugin-ui-config.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { AdminUiConfig, VendureConfig } from '@vendure/core';
  2. import path from 'path';
  3. import { Plugin } from 'vite';
  4. import { getAdminUiConfig } from './utils/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. const result = await configLoaderApi.getVendureConfig();
  37. vendureConfig = result.vendureConfig;
  38. }
  39. const config = getAdminUiConfig(vendureConfig, adminUiConfig);
  40. return `
  41. export const uiConfig = ${JSON.stringify(config)}
  42. `;
  43. }
  44. },
  45. };
  46. }
  47. /**
  48. * Converts an import path to a normalized path relative to the rootDir.
  49. */
  50. function normalizeImportPath(rootDir: string, importPath: string): string {
  51. const relativePath = path.relative(rootDir, importPath).replace(/\\/g, '/');
  52. return relativePath.replace(/\.tsx?$/, '.js');
  53. }