vite.config.mjs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. // Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/
  2. /* eslint-disable security/detect-non-literal-fs-filename */
  3. import { createRequire } from 'module'
  4. import { defineConfig } from 'vite'
  5. import VuePlugin from '@vitejs/plugin-vue'
  6. import { VitePWA } from 'vite-plugin-pwa'
  7. import { resolve, dirname } from 'node:path'
  8. import { readFileSync } from 'node:fs'
  9. import { fileURLToPath } from 'node:url'
  10. import { homedir } from 'os'
  11. import svgIconsPlugin from './app/frontend/build/iconsPlugin.mjs'
  12. import tsconfig from './tsconfig.base.json' assert { type: 'json' }
  13. const dir = dirname(fileURLToPath(import.meta.url))
  14. const SSL_PATH = resolve(homedir(), '.localhost')
  15. // eslint-disable-next-line sonarjs/cognitive-complexity
  16. export default defineConfig(({ mode, command }) => {
  17. const isStory = Boolean(process.env.HISTOIRE)
  18. const isTesting = ['test', 'cypress'].includes(mode) || isStory
  19. const isBuild = command === 'build' && !isStory
  20. const require = createRequire(import.meta.url)
  21. const plugins = [
  22. VuePlugin({
  23. template: {
  24. compilerOptions: {
  25. nodeTransforms:
  26. isTesting || !!process.env.VITE_TEST_MODE
  27. ? []
  28. : [require('./app/frontend/build/transforms/transformTestId.js')],
  29. },
  30. },
  31. }),
  32. svgIconsPlugin(),
  33. ]
  34. // Ruby plugin is not needed inside of the vitest context and has some side effects.
  35. if (!isTesting || isBuild) {
  36. const { default: RubyPlugin } = require('vite-plugin-ruby')
  37. const ManualChunks = require('./app/frontend/build/manualChunks.js')
  38. plugins.push(RubyPlugin())
  39. plugins.push(
  40. ...VitePWA({
  41. // should be generated on ruby side
  42. manifest: false,
  43. registerType: 'prompt',
  44. srcDir: 'apps/mobile/sw',
  45. filename: 'sw.ts',
  46. includeManifestIcons: false,
  47. injectRegister: null,
  48. strategies: 'injectManifest',
  49. }),
  50. )
  51. plugins.push(ManualChunks())
  52. }
  53. let https = false
  54. // vite-ruby controlls this variable, it's either "true" or "false"
  55. if (process.env.VITE_RUBY_HTTPS === 'true') {
  56. const SSL_CERT = readFileSync(resolve(SSL_PATH, 'localhost.crt'))
  57. const SSL_KEY = readFileSync(resolve(SSL_PATH, 'localhost.key'))
  58. https = {
  59. cert: SSL_CERT,
  60. key: SSL_KEY,
  61. }
  62. }
  63. let publicDir
  64. if (!isBuild) {
  65. publicDir = resolve(dir, 'public')
  66. } else if (isStory) {
  67. publicDir = resolve(dir, 'app/frontend/public-build')
  68. }
  69. return {
  70. publicDir,
  71. esbuild: {
  72. target: isTesting ? 'esnext' : tsconfig.compilerOptions.target,
  73. },
  74. resolve: {
  75. alias: {
  76. '^vue-easy-lightbox$':
  77. 'vue-easy-lightbox/dist/external-css/vue-easy-lightbox.esm.min.js',
  78. },
  79. },
  80. server: {
  81. https,
  82. watch: {
  83. ignored: isTesting
  84. ? []
  85. : [
  86. '**/*.spec.*',
  87. '**/__tests__/**/*',
  88. (path) =>
  89. !path.includes('app/frontend') ||
  90. path.includes('frontend/tests'),
  91. ],
  92. },
  93. },
  94. define: {
  95. VITE_TEST_MODE: !!process.env.VITEST || !!process.env.VITE_TEST_MODE,
  96. },
  97. test: {
  98. globals: true,
  99. // narrowing down test folder speeds up fast-glob in Vitest
  100. dir: 'app/frontend',
  101. setupFiles: ['app/frontend/tests/vitest.setup.ts'],
  102. environment: 'jsdom',
  103. clearMocks: true,
  104. css: false,
  105. testTimeout: process.env.CI ? 30_000 : 5_000,
  106. unstubGlobals: true,
  107. deps: {
  108. // TODO remove after https://github.com/ueberdosis/tiptap/pull/3521 is merged
  109. inline: ['@tiptap/extension-mention'],
  110. },
  111. onConsoleLog(log) {
  112. if (log.includes('Not implemented: navigation')) return false
  113. },
  114. },
  115. plugins,
  116. }
  117. })