build-iife.mjs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { existsSync } from 'node:fs'
  2. import { mkdir } from 'node:fs/promises'
  3. import { dirname, join, resolve } from 'node:path'
  4. import { fileURLToPath } from 'node:url'
  5. import { build } from 'vite'
  6. const packageDir = resolve(dirname(fileURLToPath(import.meta.url)), '..')
  7. const entry = join(packageDir, 'src', 'global.ts')
  8. const excalidrawStub = join(packageDir, 'scripts', 'excalidraw-iife-stub.ts')
  9. const outDir = join(packageDir, 'dist')
  10. const fileName = 'flyfish-file-viewer-web.iife.js'
  11. if (!existsSync(entry)) {
  12. throw new Error(`Missing web global entry: ${entry}`)
  13. }
  14. await mkdir(outDir, { recursive: true })
  15. await build({
  16. configFile: false,
  17. publicDir: false,
  18. logLevel: 'warn',
  19. define: {
  20. 'process.env.NODE_ENV': JSON.stringify('production'),
  21. 'process.env': JSON.stringify({ NODE_ENV: 'production' })
  22. },
  23. resolve: {
  24. alias: {
  25. // The script-tag/IIFE bundle must stay framework-free. The official
  26. // Excalidraw export package pulls React peer dependencies, so the IIFE
  27. // build intentionally falls back to core's built-in rough.js renderer.
  28. '@excalidraw/excalidraw': excalidrawStub
  29. },
  30. dedupe: ['@file-viewer/core']
  31. },
  32. build: {
  33. emptyOutDir: false,
  34. minify: 'esbuild',
  35. sourcemap: false,
  36. target: 'es2019',
  37. lib: {
  38. entry,
  39. name: 'FlyfishFileViewerWeb',
  40. formats: ['iife'],
  41. fileName: () => fileName
  42. },
  43. rollupOptions: {
  44. output: {
  45. exports: 'named',
  46. extend: true
  47. }
  48. }
  49. }
  50. })
  51. console.log(`[web-iife] Built ${join(outDir, fileName)}`)