getBuildConfig.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { env } from 'node:process';
  2. import browsersListToEsBuild from 'browserslist-to-esbuild';
  3. import path from 'path';
  4. import { Format, Options as TsupConfig } from 'tsup';
  5. type Platform = 'browser' | 'node' | 'react-native';
  6. type BuildOptions = {
  7. format: Format;
  8. platform: Platform;
  9. };
  10. const BROWSERSLIST_TARGETS = browsersListToEsBuild();
  11. export function getPackageBuildConfig(): TsupConfig[] {
  12. return [
  13. getBuildConfig({ format: 'cjs', platform: 'node' }),
  14. getBuildConfig({ format: 'esm', platform: 'node' }),
  15. getBuildConfig({ format: 'cjs', platform: 'browser' }),
  16. getBuildConfig({ format: 'esm', platform: 'browser' }),
  17. getBuildConfig({ format: 'esm', platform: 'react-native' }),
  18. ];
  19. }
  20. export function getBuildConfig(options: BuildOptions): TsupConfig {
  21. const { format, platform } = options;
  22. return {
  23. define: {
  24. __BROWSER__: `${platform === 'browser'}`,
  25. __NODEJS__: `${platform === 'node'}`,
  26. __REACTNATIVE__: `${platform === 'react-native'}`,
  27. __VERSION__: `"${env.npm_package_version}"`,
  28. },
  29. entry: [`./src/index.ts`],
  30. esbuildOptions(options, context) {
  31. options.inject = [path.resolve(__dirname, 'env-shim.ts')];
  32. if (context.format === 'iife') {
  33. options.define = { ...options.define, __DEV__: `false` };
  34. options.target = BROWSERSLIST_TARGETS;
  35. options.minify = true;
  36. }
  37. },
  38. format,
  39. globalName: 'globalThis.kinobi',
  40. name: platform,
  41. // Inline private, non-published packages.
  42. // WARNING: This inlines packages recursively. Make sure these don't have deep dep trees.
  43. noExternal: [
  44. // @noble/hashes/sha256 is an ESM-only module, so we have to inline it in CJS builds.
  45. ...(format === 'cjs' ? ['@noble/hashes/sha256'] : []),
  46. ],
  47. outExtension({ format }) {
  48. const extension =
  49. format === 'iife' ? `.production.min.js` : `.${platform}.${format === 'cjs' ? 'cjs' : 'js'}`;
  50. return { js: extension };
  51. },
  52. platform: platform === 'node' ? 'node' : 'browser',
  53. pure: ['process'],
  54. sourcemap: format !== 'iife',
  55. treeshake: true,
  56. };
  57. }
  58. export function getTestsBuildConfig(options: BuildOptions): TsupConfig[] {
  59. const { format, platform } = options;
  60. function outExtension() {
  61. return { js: `.${format === 'cjs' ? 'cjs' : 'js'}` };
  62. }
  63. return [
  64. {
  65. ...getBuildConfig(options),
  66. outDir: `./dist/tests-${platform}-${format}/src`,
  67. outExtension,
  68. },
  69. {
  70. ...getBuildConfig(options),
  71. bundle: false,
  72. entry: ['./test/**/*.ts'],
  73. outDir: `./dist/tests-${platform}-${format}/test`,
  74. outExtension,
  75. },
  76. ];
  77. }