rollup.config.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /* eslint-disable no-process-env */
  2. import { builtinModules } from 'module';
  3. import { readFileSync } from 'fs';
  4. import alias from '@rollup/plugin-alias';
  5. import resolve from '@rollup/plugin-node-resolve';
  6. import commonjs from '@rollup/plugin-commonjs';
  7. import replace from '@rollup/plugin-replace';
  8. import terser from '@rollup/plugin-terser';
  9. import { wasm } from '@rollup/plugin-wasm';
  10. // ESlint does not support JSON module imports yet, see https://github.com/eslint/eslint/discussions/15305
  11. // import pkg from './package.json' assert { type: 'json' };
  12. const pkg = JSON.parse(readFileSync('./package.json'));
  13. const nodeDependencies = Object.keys(pkg.dependencies || {});
  14. const nodeBuiltinModules = builtinModules.concat(['module']);
  15. const wasmOptions = {
  16. node: { targetEnv: 'node' },
  17. browser: { targetEnv: 'browser', maxFileSize: undefined } // always inlline (our wasm files are small)
  18. };
  19. const getChunkFileName = (chunkInfo, extension) => {
  20. // index files result in chunks named simply 'index', so we rename them to include the package name
  21. if (chunkInfo.name === 'index') {
  22. const packageName = chunkInfo.facadeModuleId.split('/').at(-2); // assume index file is under the root folder
  23. return `${packageName}.${extension}`;
  24. }
  25. return `[name].${extension}`;
  26. };
  27. const banner =
  28. `/*! OpenPGP.js v${pkg.version} - ` +
  29. `${new Date().toISOString().split('T')[0]} - ` +
  30. `this is LGPL licensed code, see LICENSE/our website ${pkg.homepage} for more information. */`;
  31. const intro = "const globalThis = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};";
  32. const terserOptions = {
  33. ecma: 2017,
  34. compress: {
  35. unsafe: true
  36. },
  37. output: {
  38. comments: '/^(?:!|#__)/',
  39. preserve_annotations: true
  40. }
  41. };
  42. export default Object.assign([
  43. {
  44. input: 'src/index.js',
  45. external: nodeBuiltinModules.concat(nodeDependencies),
  46. output: [
  47. { file: 'dist/openpgp.js', format: 'iife', name: pkg.name, banner, intro },
  48. { file: 'dist/openpgp.min.js', format: 'iife', name: pkg.name, banner, intro, plugins: [terser(terserOptions)], sourcemap: true },
  49. { file: 'dist/openpgp.mjs', format: 'es', banner, intro },
  50. { file: 'dist/openpgp.min.mjs', format: 'es', banner, intro, plugins: [terser(terserOptions)], sourcemap: true }
  51. ].map(options => ({ ...options, inlineDynamicImports: true })),
  52. plugins: [
  53. resolve({
  54. browser: true
  55. }),
  56. commonjs({
  57. ignore: nodeBuiltinModules.concat(nodeDependencies)
  58. }),
  59. replace({
  60. 'OpenPGP.js VERSION': `OpenPGP.js ${pkg.version}`,
  61. "import { createRequire } from 'module';": 'const createRequire = () => () => {}',
  62. delimiters: ['', '']
  63. }),
  64. wasm(wasmOptions.browser)
  65. ]
  66. },
  67. {
  68. input: 'src/index.js',
  69. external: nodeBuiltinModules.concat(nodeDependencies),
  70. output: [
  71. { file: 'dist/node/openpgp.cjs', format: 'cjs', name: pkg.name, banner, intro },
  72. { file: 'dist/node/openpgp.min.cjs', format: 'cjs', name: pkg.name, banner, intro, plugins: [terser(terserOptions)], sourcemap: true },
  73. { file: 'dist/node/openpgp.mjs', format: 'es', banner, intro },
  74. { file: 'dist/node/openpgp.min.mjs', format: 'es', banner, intro, plugins: [terser(terserOptions)], sourcemap: true }
  75. ].map(options => ({ ...options, inlineDynamicImports: true })),
  76. plugins: [
  77. resolve(),
  78. commonjs(),
  79. replace({
  80. 'OpenPGP.js VERSION': `OpenPGP.js ${pkg.version}`
  81. }),
  82. wasm(wasmOptions.node)
  83. ]
  84. },
  85. {
  86. input: 'src/index.js',
  87. external: nodeBuiltinModules.concat(nodeDependencies),
  88. output: [
  89. { dir: 'dist/lightweight', entryFileNames: 'openpgp.mjs', chunkFileNames: chunkInfo => getChunkFileName(chunkInfo, 'mjs'), format: 'es', banner, intro },
  90. { dir: 'dist/lightweight', entryFileNames: 'openpgp.min.mjs', chunkFileNames: chunkInfo => getChunkFileName(chunkInfo, 'min.mjs'), format: 'es', banner, intro, plugins: [terser(terserOptions)], sourcemap: true }
  91. ],
  92. preserveEntrySignatures: 'exports-only',
  93. plugins: [
  94. resolve({
  95. browser: true
  96. }),
  97. commonjs({
  98. ignore: nodeBuiltinModules.concat(nodeDependencies)
  99. }),
  100. replace({
  101. 'OpenPGP.js VERSION': `OpenPGP.js ${pkg.version}`,
  102. "import { createRequire } from 'module';": 'const createRequire = () => () => {}',
  103. delimiters: ['', '']
  104. }),
  105. wasm(wasmOptions.browser)
  106. ]
  107. },
  108. {
  109. input: 'test/unittests.js',
  110. output: [
  111. { file: 'test/lib/unittests-bundle.js', format: 'es', intro, sourcemap: true, inlineDynamicImports: true }
  112. ],
  113. external: nodeBuiltinModules.concat(nodeDependencies),
  114. plugins: [
  115. alias({
  116. entries: {
  117. openpgp: `./dist/${process.env.npm_config_lightweight ? 'lightweight/' : ''}openpgp.mjs`
  118. }
  119. }),
  120. resolve({
  121. browser: true
  122. }),
  123. commonjs({
  124. ignore: nodeBuiltinModules.concat(nodeDependencies),
  125. requireReturnsDefault: 'preferred'
  126. }),
  127. replace({
  128. "import { createRequire } from 'module';": 'const createRequire = () => () => {}',
  129. delimiters: ['', '']
  130. }),
  131. wasm(wasmOptions.browser)
  132. ]
  133. }
  134. ].filter(config => {
  135. config.output = config.output.filter(output => {
  136. return (output.file || output.dir + '/' + output.entryFileNames).includes(
  137. process.env.npm_config_build_only || // E.g. `npm install --build-only=lightweight`.
  138. 'dist' // Don't build test bundle by default.
  139. );
  140. });
  141. return config.output.length;
  142. }), {
  143. allow_empty: true // Fake option to trick rollup into accepting empty config array when filtered above.
  144. });