storipress/karbon

View on GitHub
packages/karbon/src/cli/checkFile/index.ts

Summary

Maintainability
A
25 mins
Test Coverage
import process from 'node:process'
import consola from 'consola'
import fs from 'fs-extra'
import { fileTypeFromBuffer } from 'file-type'
import type { Tblock, Tlayout } from '../bundle/types'
import { extErrorMsg, karbonMsg, safeExt } from './setting'

interface TJson {
  layouts: Tlayout[]
  blocks: Tblock[]
}

let fileName = ''

function jsonSafe() {
  const data = fs.readFileSync(karbonMsg.jsonPosition, { encoding: 'utf-8' })
  const result = JSON.parse(data) as TJson
  const layoutExist = result.layouts.every((item) => fs.existsSync(`.storipress/${item.file}`))
  const blockExist = result.blocks.every(
    (item) =>
      (!item.ssr && fs.existsSync(`.storipress/${item.file}`)) ||
      (item.ssr && fs.existsSync(`.storipress/${item.file}`)),
  )

  if (!layoutExist) {
    consola.error(karbonMsg.layoutsPosError)
    throw new Error(karbonMsg.uploadError)
  }
  if (!blockExist) {
    consola.error(karbonMsg.blocksPosError)
    throw new Error(karbonMsg.uploadError)
  }
  return layoutExist && blockExist
}

async function typeSafe() {
  const result = await fileTypeFromBuffer(await fs.readFile(fileName))
  if (result?.ext !== safeExt) {
    consola.error(extErrorMsg)
    throw new Error(karbonMsg.uploadError)
  }
}

export function versionSafe() {
  const version = process.version
  const major = Number(version.split('.')[0].replace('v', ''))
  const minor = Number(version.split('.')[1])
  if ((major === 16 && minor < 17) || major < 16) {
    consola.warn(karbonMsg.versionWarning)
  }
}

export async function checkFile(siteTemplateName: string) {
  fileName = siteTemplateName
  versionSafe()
  await typeSafe()
  jsonSafe()
}