Settings.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /* eslint-disable no-console */
  2. const fs = require('node:fs')
  3. const Path = require('node:path')
  4. const { createRequire } = require('node:module')
  5. const { merge } = require('./merge')
  6. const CWD = process.cwd()
  7. const ENTRY_POINT_DIR = process.argv[1]
  8. ? Path.dirname(process.argv[1])
  9. : undefined
  10. const NODE_ENV = (process.env.NODE_ENV || 'development').toLowerCase()
  11. const SHARELATEX_CONFIG = process.env.SHARELATEX_CONFIG
  12. const OVERLEAF_CONFIG = process.env.OVERLEAF_CONFIG || SHARELATEX_CONFIG
  13. if (SHARELATEX_CONFIG && SHARELATEX_CONFIG !== OVERLEAF_CONFIG) {
  14. throw new Error(
  15. 'found mismatching SHARELATEX_CONFIG, rename to OVERLEAF_CONFIG'
  16. )
  17. }
  18. // Under Yarn PnP, require() resolves dependencies based on the issuer package.
  19. // Config files live in the consuming service (e.g. web), not in @overleaf/settings,
  20. // so we create a require function anchored at each config file's location to ensure
  21. // dependencies resolve from the service's PnP scope rather than this library's.
  22. function requireFromFile(filePath) {
  23. const absPath = Path.resolve(filePath)
  24. return createRequire(absPath)(absPath)
  25. }
  26. let settings
  27. let settingsExist = false
  28. const defaultsPath =
  29. pathIfExists(Path.join(CWD, 'config/settings.defaults.cjs')) ||
  30. pathIfExists(Path.join(CWD, 'config/settings.defaults.js')) ||
  31. pathIfExists(Path.join(ENTRY_POINT_DIR, 'config/settings.defaults.cjs')) ||
  32. pathIfExists(Path.join(ENTRY_POINT_DIR, 'config/settings.defaults.js'))
  33. if (defaultsPath) {
  34. console.log(`Using default settings from ${defaultsPath}`)
  35. settings = requireFromFile(defaultsPath)
  36. settingsExist = true
  37. } else {
  38. settings = {}
  39. }
  40. const overridesPath =
  41. pathIfExists(OVERLEAF_CONFIG) ||
  42. pathIfExists(Path.join(CWD, `config/settings.${NODE_ENV}.cjs`)) ||
  43. pathIfExists(Path.join(CWD, `config/settings.${NODE_ENV}.js`))
  44. if (overridesPath) {
  45. console.log(`Using settings from ${overridesPath}`)
  46. settings = merge(requireFromFile(overridesPath), settings)
  47. settingsExist = true
  48. }
  49. if (!settingsExist) {
  50. console.warn("No settings or defaults found. I'm flying blind.")
  51. }
  52. module.exports = /** @type {any} */ (settings)
  53. function pathIfExists(path) {
  54. if (path && fs.existsSync(path)) {
  55. return path
  56. }
  57. return null
  58. }