vite.config.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. /**
  2. * CONFIG: https://vite.dev/config/
  3. */
  4. import { resolve } from "node:path";
  5. import { defineConfig } from "vite";
  6. import stylelint from "vite-plugin-stylelint";
  7. import { viteStaticCopy } from "vite-plugin-static-copy";
  8. import { plg_svg2png } from "./tools/plg.js";
  9. import { plg_svg2svg } from "./tools/plg.js";
  10. const ROOT = "../.."; // root of the git reposetory
  11. const PATH = {
  12. dist: resolve(ROOT, "searx/static/themes/simple"),
  13. // dist: resolve(ROOT, "client/simple/dist"),
  14. src: "src",
  15. modules: "node_modules",
  16. brand: "src/brand",
  17. static: resolve(ROOT, "client/simple/static"),
  18. leaflet: resolve(ROOT, "client/simple/node_modules/leaflet/dist"),
  19. templates: resolve(ROOT, "searx/templates/simple"),
  20. };
  21. const svg2svg_opts = {
  22. plugins: [
  23. { name: "preset-default" },
  24. "sortAttrs",
  25. "convertStyleToAttrs",
  26. ]
  27. };
  28. const svg2svg_favicon_opts = {
  29. plugins: [
  30. { name: "preset-default" },
  31. "sortAttrs",
  32. ]
  33. };
  34. export default defineConfig({
  35. root: PATH.src,
  36. mode: "production",
  37. // mode: "development",
  38. // FIXME: missing CCS sourcemaps!!
  39. // see: https://github.com/vitejs/vite/discussions/13845#discussioncomment-11992084
  40. //
  41. // what I have tried so far (see config below):
  42. //
  43. // - build.sourcemap
  44. // - esbuild.sourcemap
  45. // - css.preprocessorOptions.less.sourceMap
  46. css: {
  47. devSourcemap: true,
  48. preprocessorOptions: {
  49. less: {
  50. // FIXME: missing CCS sourcemaps!!
  51. sourceMap: {
  52. outputSourceFiles: true,
  53. sourceMapURL: (name) => { const s = name.split('/'); return s[s.length - 1] + '.map'; },
  54. },
  55. // env: 'development',
  56. // relativeUrls: true,
  57. // javascriptEnabled: true,
  58. },
  59. },
  60. }, // end: css
  61. esbuild : {
  62. // FIXME: missing CCS sourcemaps!!
  63. sourcemap: true
  64. },
  65. build: {
  66. manifest: "manifest.json",
  67. emptyOutDir: true,
  68. assetsDir: "",
  69. outDir: PATH.dist,
  70. // FIXME: missing CCS sourcemaps!!
  71. sourcemap: true,
  72. // https://vite.dev/config/build-options.html#build-cssminify
  73. cssMinify: true,
  74. // cssMinify: "esbuild",
  75. minify: "esbuild",
  76. rollupOptions: {
  77. input: {
  78. // build CSS files
  79. "css/searxng.min.css": PATH.src + "/less/style-ltr.less",
  80. "css/searxng-rtl.min.css": PATH.src + "/less/style-rtl.less",
  81. "css/rss.min.css": PATH.src + "/less/rss.less",
  82. // build JS files
  83. "js/searxng.head.min": PATH.src + "/js/searxng.head.js",
  84. "js/searxng.min": PATH.src + "/js/searxng.js",
  85. },
  86. // file naming conventions / pathnames are relative to outDir (PATH.dist)
  87. output: {
  88. entryFileNames: "[name].js",
  89. chunkFileNames: "[name].js",
  90. assetFileNames: "[name].[ext]",
  91. // Vite does not support "rollupOptions.output.sourcemap".
  92. // Please use "build.sourcemap" instead.
  93. // sourcemap: true,
  94. },
  95. },
  96. }, // end: build
  97. plugins: [
  98. stylelint({
  99. build: true,
  100. emitWarningAsError: true,
  101. fix: true,
  102. }),
  103. // Leaflet
  104. viteStaticCopy({
  105. targets: [
  106. { src: PATH.leaflet + "/leaflet.{js,js.map}", dest: PATH.dist + "/js" },
  107. { src: PATH.leaflet + "/images/*.png", dest: PATH.dist + "/css/images/" },
  108. { src: PATH.leaflet + "/*.{css,css.map}", dest: PATH.dist + "/css" },
  109. { src: PATH.static + "/**/*", dest: PATH.dist },
  110. ]
  111. }),
  112. // -- svg images
  113. plg_svg2svg(
  114. [
  115. { src: PATH.src + "/svg/empty_favicon.svg", dest: PATH.dist + "/img/empty_favicon.svg" },
  116. { src: PATH.src + "/svg/select-dark.svg", dest: PATH.dist + "/img/select-dark.svg" },
  117. { src: PATH.src + "/svg/select-light.svg", dest: PATH.dist + "/img/select-light.svg" },
  118. ],
  119. svg2svg_opts,
  120. ),
  121. // SearXNG brand (static)
  122. plg_svg2png(
  123. [
  124. { src: PATH.brand + "/searxng-wordmark.svg", dest: PATH.dist + "/img/favicon.png" },
  125. { src: PATH.brand + "/searxng.svg", dest: PATH.dist + "/img/searxng.png" },
  126. ],
  127. ),
  128. // -- svg
  129. plg_svg2svg(
  130. [
  131. { src: PATH.brand + "/searxng.svg", dest: PATH.dist + "/img/searxng.svg" },
  132. { src: PATH.brand + "/img_load_error.svg", dest: PATH.dist + "/img/img_load_error.svg" },
  133. ],
  134. svg2svg_opts,
  135. ),
  136. // -- favicon
  137. plg_svg2svg(
  138. [ { src: PATH.brand + "/searxng-wordmark.svg", dest: PATH.dist + "/img/favicon.svg" } ],
  139. svg2svg_favicon_opts,
  140. ),
  141. // -- simple templates
  142. plg_svg2svg(
  143. [
  144. { src: PATH.brand + "/searxng-wordmark.svg", dest: PATH.templates + "/searxng-wordmark.min.svg" },
  145. ],
  146. svg2svg_opts
  147. ),
  148. ] // end: plugins
  149. });