vite.config.js 4.4 KB

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