From 7f0c611e20c0555b2a5ca9dead744b68b9b9a09a Mon Sep 17 00:00:00 2001
From: Stanislav Lashmanov <slashmanov@gitlab.com>
Date: Tue, 16 Jul 2024 10:48:05 +0400
Subject: [PATCH] Add support for GitLab UI icons in Vite

---
 config/helpers/vite_plugin_icons.mjs | 27 +++++++++++++++++++++++++++
 vite.config.js                       |  2 ++
 2 files changed, 29 insertions(+)
 create mode 100644 config/helpers/vite_plugin_icons.mjs

diff --git a/config/helpers/vite_plugin_icons.mjs b/config/helpers/vite_plugin_icons.mjs
new file mode 100644
index 0000000000000..6d7159bb87b1c
--- /dev/null
+++ b/config/helpers/vite_plugin_icons.mjs
@@ -0,0 +1,27 @@
+import path from 'node:path';
+import { readdir } from 'node:fs/promises';
+
+const GITLAB_SVG_PATH = '@gitlab/svgs/dist';
+
+export async function IconsPlugin() {
+  return {
+    name: 'vite-plugin-gitlab-icons',
+    async config() {
+      const iconsPath = path.resolve(__dirname, '../..', 'node_modules', GITLAB_SVG_PATH);
+      const files = await readdir(iconsPath, { withFileTypes: true });
+      const alias = files
+        .filter(file => file.isDirectory() || path.extname(file.name) === '.svg')
+        .map((file) => {
+          return {
+            find: file.name,
+            replacement: `${iconsPath}/${file.name}`,
+          }
+        });
+      return {
+        resolve: {
+          alias,
+        }
+      }
+    }
+  };
+}
diff --git a/vite.config.js b/vite.config.js
index 5da94f07a617e..73d1d6e7038d2 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -20,6 +20,7 @@ import { AutoStopPlugin } from './config/helpers/vite_plugin_auto_stop.mjs';
 import { PageEntrypointsPlugin } from './config/helpers/vite_plugin_page_entrypoints.mjs';
 import { FixedRubyPlugin } from './config/helpers/vite_plugin_ruby_fixed.mjs';
 import { StylePlugin } from './config/helpers/vite_plugin_style.mjs';
+import { IconsPlugin } from './config/helpers/vite_plugin_icons.mjs';
 /* eslint-enable import/extensions */
 
 let viteGDKConfig;
@@ -84,6 +85,7 @@ export default defineConfig({
   },
   plugins: [
     PageEntrypointsPlugin(),
+    IconsPlugin(),
     StylePlugin({ shouldWatch: viteGDKConfig.hmr !== null }),
     viteTailwindCompilerPlugin({ shouldWatch: viteGDKConfig.hmr !== null }),
     CopyPlugin({
-- 
GitLab