generate-export.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import { Analyzed } from './analyze'
  2. export interface ExportsRuntime {
  3. polyfill: string
  4. exportDeclaration: string
  5. }
  6. export function generateExport(analyzed: Analyzed): ExportsRuntime | null {
  7. if (!analyzed.exports.length) {
  8. return null
  9. }
  10. const memberDefault = analyzed.exports
  11. // Find `module.exports` or `exports.default`
  12. .find(exp => exp.token.left === 'module' || exp.token.right === 'default')
  13. let members = analyzed.exports
  14. // Exclude `module.exports` and `exports.default`
  15. .filter(exp => exp.token.left !== 'module' && exp.token.right !== 'default')
  16. .map(exp => exp.token.right)
  17. // Remove duplicate export
  18. members = [...new Set(members)]
  19. const membersDeclaration = members.map(
  20. m => `const __CJS__export_${m}__ = (module.exports == null ? {} : module.exports).${m}`,
  21. )
  22. const membersExport = members.map(m => `__CJS__export_${m}__ as ${m}`)
  23. if (memberDefault) {
  24. membersDeclaration.unshift(`const __CJS__export_default__ = (module.exports == null ? {} : module.exports).default || module.exports`)
  25. membersExport.unshift('__CJS__export_default__ as default')
  26. }
  27. return {
  28. polyfill: 'const module = { exports: {} }; const exports = module.exports;',
  29. exportDeclaration: `
  30. ${membersDeclaration.join(';\n')};
  31. export {
  32. ${membersExport.join(',\n ')},
  33. }
  34. `.trim(),
  35. }
  36. }