'use strict'

const moduleList = require('@electron/internal/common/api/module-list')

exports.handleESModule = (loader) => () => {
  const value = loader()
  if (value.__esModule && value.default) return value.default
  return value
}

exports.memoizedGetter = (getter) => {
  /*
   * It's ok to leak this value as it would be leaked by the global
   * node module cache anyway at `Module._cache`.  This memoization
   * is dramatically faster than relying on nodes module cache however
   */
  let memoizedValue = null

  return () => {
    if (memoizedValue === null) {
      memoizedValue = getter()
    }
    return memoizedValue
  }
}

// Attaches properties to |targetExports|.
exports.defineProperties = function (targetExports) {
  const descriptors = {}
  for (const module of moduleList) {
    descriptors[module.name] = {
      enumerable: !module.private,
      get: exports.handleESModule(module.loader)
    }
  }
  return Object.defineProperties(targetExports, descriptors)
}
