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.6KB

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