cityssm/node-green-button-parser

View on GitHub
utilities.ts

Summary

Maintainability
A
0 mins
Test Coverage
import type { AtomJsonLink } from './types/atomTypes.js'
import type { GreenButtonLinks } from './types/entryTypes.js'

const numberRegExp = /^-?(?:\d*\.)?\d+$/

// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function cleanContentJson(contentJson: any): void {
  delete contentJson.$

  if (Object.keys(contentJson).length === 1 && contentJson._ !== undefined) {
    contentJson = contentJson._
  }

  for (const key of Object.keys(contentJson)) {
    if (
      Array.isArray(contentJson[key]) &&
      contentJson[key].length === 1 &&
      key !== 'IntervalBlock'
    ) {
      contentJson[key] = contentJson[key][0]
    }

    if (
      typeof contentJson[key] === 'string' &&
      contentJson[key].length > 0 &&
      numberRegExp.test(contentJson[key])
    ) {
      contentJson[key] = Number(contentJson[key])
    } else if (typeof contentJson[key] === 'object') {
      cleanContentJson(contentJson[key])
    }
  }
}

export function atomLinksToGreenButtonLinks(
  atomLinks: AtomJsonLink[],
  includeSelfUid: boolean
): GreenButtonLinks {
  const linksJson: GreenButtonLinks = {
    related: []
  }

  for (const atomLink of atomLinks ?? []) {
    if (atomLink.$.rel === 'related') {
      linksJson.related?.push(atomLink.$.href)
    } else {
      linksJson[atomLink.$.rel] = atomLink.$.href
    }
  }

  if (includeSelfUid && linksJson.self !== undefined) {
    linksJson.selfUid = linksJson.self.slice(linksJson.self.lastIndexOf('/') + 1)
  }

  if (linksJson.related?.length === 0) {
    delete linksJson.related
  }

  return linksJson
}

type XmlProperty = string[] | Array<{ _: string }>

export function getFirstXmlString(xmlProperty?: XmlProperty): string {
  if (xmlProperty === undefined || xmlProperty.length === 0) {
    return ''
  }

  const first = xmlProperty[0]

  if (typeof first === 'string') {
    return first
  }

  return first._
}

// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function ensureArray(object: any, objectKey: string): void {
  if (object[objectKey] !== undefined && !Array.isArray(object[objectKey])) {
    object[objectKey] = [object[objectKey]]
  }
}