All files / src/loader load-milirc.ts

83.33% Statements 25/30
68.75% Branches 11/16
100% Functions 2/2
95.83% Lines 23/24

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 425x 5x 5x 5x 5x 5x 5x       5x 5x   5x   16x 16x   16x 16x   14x 14x   14x   14x   14x   14x   14x     14x       14x    
import fs from 'fs-extra'
import cosmiconfig from 'cosmiconfig'
import semver from 'semver'
import { join } from 'path'
import Ajv from 'ajv'
import { relativePath, isRelativePath } from '@/utils'
import { MilircSchema } from '@/schema'
import { Milirc } from '@/class'
 
 
const ajv = new Ajv({ useDefaults: true, nullable: true })
const validate = ajv.compile(MilircSchema)
 
const explorer = cosmiconfig('mili')
 
export default async(cwd: string): Promise<Milirc | null> => {
  let config: Milirc | null = null
 
  const filepath = join(cwd, '.milirc.yml')
  if (!await fs.pathExists(filepath)) return config
 
  const result = await explorer.load(filepath)
  Iif (!result || !result.config) return config
 
  config = JSON.parse(JSON.stringify(result.config))
 
  Iif (!config) throw new Error('Cannot load .milirc.yml')
 
  Iif (config.mili && semver.lt(config.mili.version, '2.0.0')) throw new Error('Never support auto upgrade from mili@1')
 
  const valid = validate(config)
 
  Iif (!valid) throw new Error(ajv.errorsText(validate.errors, { dataVar: 'milirc' }))
 
  /** The relative template path saved in .milirc is relative to the dir of .milirc */
  Iif (isRelativePath(config.template.repository)) {
    config.template.repository = relativePath(process.cwd(), join(cwd, config.template.repository))
  }
 
  return config
}