vite.config.js 4.4 KB

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