vincent-ledu/vscode-adr-tools-extension

View on GitHub
reports/graph.js

Summary

Maintainability
A
1 hr
Test Coverage
const fs = require('fs')
const path = require('path')
const logger = require('../common/logger')
const graphFile = '.adr-persist.json'

const flowChartFileName = 'flowChart.md'

function createNode (adrDir, index, filename, title, date, status) {
  let g = getGraph(adrDir)

  let node = {
    'index': '' + index + '',
    'filename': '' + filename + '',
    'title': '' + title + '',
    'statuses': [
      { 'date': '' + date + '', 'status': '' + status + '' }
    ]
  }
  g.nodes.push(node)
  writeGraph(adrDir, g)
  return node
}

function addLink (adrDir, indexSrc, indexDst, link, date) {
  let g = getGraph(adrDir)
  let linkObj = {
    'src': '' + indexSrc + '',
    'dst': '' + indexDst + '',
    'link': '' + link + '',
    'createdDate': '' + date + ''
  }
  g.links.push(linkObj)
  writeGraph(adrDir, g)
  return linkObj
}

function addStatus (adrDir, index, status, date) {
  let g = getGraph(adrDir)
  let node = g.nodes.find(function (element) {
    return element.index === index
  })
  if (node === undefined) {
    logger.vsLog('node not found: ' + index)
    // TODO: handle error
    return undefined
  }
  node.statuses.push({ 'date': '' + date + '', 'status': '' + status + '' })
  writeGraph(adrDir, g)
  return node
}

function writeGraph (adrDir, graph) {
  try {
    fs.writeFileSync(path.join(adrDir, graphFile), JSON.stringify(graph), 'utf8')
  } catch (err) {
    logger.vsLog('An error occured while writing graph Object to File.')
    return logger.vsLog(err)
  }
  logger.vsLog('Graph file has been saved.')
}

function getGraph (adrDir) {
  let data
  try {
    data = fs.readFileSync(path.join(adrDir, graphFile))
  } catch (err) {
    if (err.code === 'ENOENT') {
      data = '{}'
    } else {
      throw err
    }
  }
  let g = JSON.parse(data)
  if (g === undefined) {
    g = {}
  }
  if (g.nodes === undefined) {
    g.nodes = []
  }
  if (g.links === undefined) {
    g.links = []
  }

  return g
}

function deleteGraph (adrDir) {
  try {
    fs.unlinkSync(path.join(adrDir, graphFile))
  } catch (err) {
    if (err.code === 'ENOENT') {
      logger.vsLog('While trying to delete file ' + path.join(adrDir, graphFile) + ', the file was not found')
      return
    }
    throw err
  }
}

function graphToFlowChart (adrDir) {
  let g = getGraph(adrDir)
  logger.vsLog('g: ' + g)
  logger.vsLog('g.nodes.length: ' + g.nodes.length)
  logger.vsLog('g.links.length: ' + g.links.length)
  let output = ''
  output += '```mermaid\n'
  output += 'graph LR\n'
  g.nodes.forEach(node => {
    output += node.index + '[' + node.title.trim() + ']\n'
    output += 'click ' + node.index + ' "' + node.filename + '"\n'
  })
  g.links.forEach(link => {
    output += link.src + ' --> |' + link.link + '|' + link.dst + '\n'
  })
  output += '```\n'
  let fd = fs.openSync(path.join(adrDir, flowChartFileName), 'w')
  fs.writeFileSync(fd, output, 'utf8')
  fs.closeSync(fd)
}

module.exports.createNode = createNode
module.exports.addStatus = addStatus
module.exports.addLink = addLink
module.exports.writeGraph = writeGraph
module.exports.getGraph = getGraph
module.exports.deleteGraph = deleteGraph
module.exports.graphToFlowChart = graphToFlowChart