Features.mjs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import _ from 'lodash'
  2. import Settings from '@overleaf/settings'
  3. const supportModuleAvailable =
  4. Settings.moduleImportSequence?.includes('support')
  5. const symbolPaletteModuleAvailable =
  6. Settings.moduleImportSequence?.includes('symbol-palette')
  7. const trackChangesModuleAvailable =
  8. Settings.moduleImportSequence?.includes('track-changes')
  9. /**
  10. * @typedef {Object} Settings
  11. * @property {Object | undefined} apis
  12. * @property {Object | undefined} apis.linkedUrlProxy
  13. * @property {string | undefined} apis.linkedUrlProxy.url
  14. * @property {boolean | undefined} enableGithubSync
  15. * @property {boolean | undefined} enableGitBridge
  16. * @property {boolean | undefined} enableHomepage
  17. * @property {boolean | undefined} enableSaml
  18. * @property {boolean | undefined} ldap
  19. * @property {boolean | undefined} oauth
  20. * @property {Object | undefined} overleaf
  21. * @property {Object | undefined} overleaf.oauth
  22. * @property {boolean | undefined} saml
  23. */
  24. const Features = {
  25. /**
  26. * @returns {boolean}
  27. */
  28. externalAuthenticationSystemUsed() {
  29. return (
  30. (Boolean(Settings.ldap) && Boolean(Settings.ldap.enable)) ||
  31. (Boolean(Settings.saml) && Boolean(Settings.saml.enable)) ||
  32. Boolean(Settings.overleaf)
  33. )
  34. },
  35. /**
  36. * Whether a feature is enabled in the appliation's configuration
  37. *
  38. * @param {string} feature
  39. * @returns {boolean}
  40. */
  41. hasFeature(feature) {
  42. switch (feature) {
  43. case 'saas':
  44. return Boolean(Settings.overleaf)
  45. case 'homepage':
  46. return Boolean(Settings.enableHomepage)
  47. case 'registration-page':
  48. return (
  49. !Features.externalAuthenticationSystemUsed() ||
  50. Boolean(Settings.overleaf)
  51. )
  52. case 'registration':
  53. return Boolean(Settings.overleaf)
  54. case 'chat':
  55. return Boolean(Settings.disableChat) === false
  56. case 'link-sharing':
  57. return Boolean(Settings.disableLinkSharing) === false
  58. case 'github-sync':
  59. return Boolean(Settings.enableGithubSync)
  60. case 'git-bridge':
  61. return Boolean(Settings.enableGitBridge)
  62. case 'oauth':
  63. return Boolean(Settings.oauth)
  64. case 'templates-server-pro':
  65. return Boolean(Settings.templates?.user_id)
  66. case 'affiliations':
  67. case 'analytics':
  68. return Boolean(_.get(Settings, ['apis', 'v1', 'url']))
  69. case 'references':
  70. return Boolean(_.get(Settings, ['apis', 'references', 'url']))
  71. case 'saml':
  72. return Boolean(Settings.enableSaml)
  73. case 'linked-project-file':
  74. return Boolean(Settings.enabledLinkedFileTypes.includes('project_file'))
  75. case 'linked-project-output-file':
  76. return Boolean(
  77. Settings.enabledLinkedFileTypes.includes('project_output_file')
  78. )
  79. case 'link-url':
  80. return Boolean(
  81. _.get(Settings, ['apis', 'linkedUrlProxy', 'url']) &&
  82. Settings.enabledLinkedFileTypes.includes('url')
  83. )
  84. case 'support':
  85. return supportModuleAvailable
  86. case 'symbol-palette':
  87. return symbolPaletteModuleAvailable
  88. case 'track-changes':
  89. return trackChangesModuleAvailable
  90. default:
  91. throw new Error(`unknown feature: ${feature}`)
  92. }
  93. },
  94. }
  95. export default Features