Source: PackageJson.js

const fs = require('fs')

/**
 * @module PackageJson
 */

/**
 * This function reads and returns as a JSON object the package.json from a specific
 * path in a sync way.
 * @param {string} pathName
 */
exports.readSync = function (pathName = './') {
  let packageJson = JSON.parse(fs.readFileSync(`${pathName}/package.json`, 'utf8'))
  return packageJson
}

/**
 * This function writes a package.json inside a specific path in a sync way.
 * @param {object} packageContent
 * @param {string} pathName
 */
exports.writeSync = function (packageContent, pathName = './') {
  let fileData = JSON.stringify(packageContent, null, 2)
  fs.writeFileSync(`${pathName}/package.json`, fileData, 'utf8')
}

/**
 * This function adds a script on a package.json file from a specific
 * path in a sync way.
 * @param {string} scriptName
 * @param {string} scriptContent
 * @param {string} pathName
 */
exports.addScriptSync = function (scriptName, scriptContent, pathName = './') {
  let packageJson = this.readSync(pathName)
  packageJson.scripts[scriptName] = scriptContent
  this.writeSync(packageJson, pathName)
}

/**
 * This functions adds a main on a package.json file in a sync way.
 * @param {string} main
 * @param {string} pathName
 */
exports.addMainSync = function (main, pathName = './') {
  let packageJson = this.readSync(pathName)
  packageJson.main = main
  this.writeSync(packageJson, pathName)
}

/**
 * This functions adds a description on a package.json file in a sync way.
 * @param {string} description
 * @param {string} pathName
 */
exports.addDescriptionSync = function (description, pathName = './') {
  let packageJson = this.readSync(pathName)
  packageJson.description = description
  this.writeSync(packageJson, pathName)
}

/**
 * This functions adds repository fields on a package.json file in a sync way.
 * @param {string} type
 * @param {string} url
 * @param {string} pathName
 */
exports.addRepositoryFieldsSync = function (type, url, pathName = './') {
  let packageJson = this.readSync(pathName)
  if (!packageJson.repository) {
    packageJson.repository = {}
  }

  packageJson.repository.type = type
  packageJson.repository.url = url
  this.writeSync(packageJson, pathName)
}

/**
 * This functions adds a license on a package.json file in a sync way.
 * @param {string} license
 * @param {string} pathName
 */
exports.addLicenseSync = function (license, pathName = './') {
  let packageJson = this.readSync(pathName)
  packageJson.license = license
  this.writeSync(packageJson, pathName)
}

/**
 * This function adds a engine information on a package.json file in a sync way.
 * @param {string} engineName
 * @param {string} engineValue
 * @param {string} pathName
 */
exports.addEngineSync = function (engineName, engineValue, pathName = './') {
  let packageJson = this.readSync(pathName)
  if (!packageJson.engines) {
    packageJson.engines = {}
  }

  packageJson.engines[engineName] = engineValue
  this.writeSync(packageJson, pathName)
}

/**
 * This functions adds a babel preset on a package.json file in a sync way.
 * @param {string} preset
 * @param {string} pathName
 */
exports.addBabelPresetSync = function (preset, pathName = './') {
  let packageJson = this.readSync(pathName)
  if (!packageJson.babel) {
    packageJson.babel = {}
  }
  if (!packageJson.babel.presets) {
    packageJson.babel.presets = []
  }

  packageJson.babel.presets.push(preset)
  this.writeSync(packageJson, pathName)
}