You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

rollup.config.js 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import pkg from '../package.json' assert { type: 'json' }
  2. import babel from '@rollup/plugin-babel'
  3. import resolve from '@rollup/plugin-node-resolve'
  4. import commonjs from '@rollup/plugin-commonjs'
  5. import filesize from 'rollup-plugin-filesize'
  6. import terser from '@rollup/plugin-terser'
  7. const buildDate = Date()
  8. const headerLong = `/*!
  9. * ${pkg.name} - ${pkg.description}
  10. * @version ${pkg.version}
  11. * ${pkg.homepage}
  12. *
  13. * @copyright ${pkg.author}
  14. * @license ${pkg.license}
  15. *
  16. * BUILT: ${buildDate}
  17. */;`
  18. const headerShort = `/*! ${pkg.name} v${pkg.version} ${pkg.license}*/;`
  19. const getBabelConfig = (node = false) => {
  20. let targets = pkg.browserslist
  21. const plugins = [
  22. [
  23. '@babel/transform-runtime',
  24. {
  25. version: '^7.14.5',
  26. regenerator: false,
  27. useESModules: true
  28. }
  29. ],
  30. [
  31. 'polyfill-corejs3',
  32. {
  33. method: 'usage-pure'
  34. }
  35. ]
  36. ]
  37. if (node) {
  38. targets = 'maintained node versions'
  39. }
  40. return babel({
  41. include: 'src/**',
  42. babelHelpers: 'runtime',
  43. babelrc: false,
  44. targets: targets,
  45. presets: [
  46. [
  47. '@babel/preset-env',
  48. {
  49. modules: false,
  50. // useBuildins and plugin-transform-runtime are mutually exclusive
  51. // https://github.com/babel/babel/issues/10271#issuecomment-528379505
  52. // use babel-polyfills when released
  53. useBuiltIns: false,
  54. bugfixes: true,
  55. loose: true
  56. }
  57. ]
  58. ],
  59. plugins
  60. })
  61. }
  62. // When few of these get mangled nothing works anymore
  63. // We loose literally nothing by let these unmangled
  64. const classes = [
  65. 'A',
  66. 'ClipPath',
  67. 'Defs',
  68. 'Element',
  69. 'G',
  70. 'Image',
  71. 'Marker',
  72. 'Path',
  73. 'Polygon',
  74. 'Rect',
  75. 'Stop',
  76. 'Svg',
  77. 'Text',
  78. 'Tspan',
  79. 'Circle',
  80. 'Container',
  81. 'Dom',
  82. 'Ellipse',
  83. 'Gradient',
  84. 'Line',
  85. 'Mask',
  86. 'Pattern',
  87. 'Polyline',
  88. 'Shape',
  89. 'Style',
  90. 'Symbol',
  91. 'TextPath',
  92. 'Use'
  93. ]
  94. const config = (node, min, esm = false) => ({
  95. input: node || esm ? './src/main.js' : './src/svg.js',
  96. output: {
  97. file: esm
  98. ? './dist/svg.esm.js'
  99. : node
  100. ? './dist/svg.node.cjs'
  101. : min
  102. ? './dist/svg.min.js'
  103. : './dist/svg.js',
  104. format: esm ? 'esm' : node ? 'cjs' : 'iife',
  105. name: 'SVG',
  106. sourcemap: true,
  107. banner: headerLong,
  108. // remove Object.freeze
  109. freeze: false
  110. },
  111. treeshake: {
  112. // property getter have no sideeffects
  113. propertyReadSideEffects: false
  114. },
  115. plugins: [
  116. resolve({ browser: !node }),
  117. commonjs(),
  118. getBabelConfig(node),
  119. filesize(),
  120. !min
  121. ? {}
  122. : terser({
  123. mangle: {
  124. reserved: classes
  125. },
  126. output: {
  127. preamble: headerShort
  128. }
  129. })
  130. ]
  131. })
  132. // [node, minified, esm]
  133. const modes = [[false], [false, true], [true], [false, false, true]]
  134. export default modes.map((m) => config(...m))