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 4115x 15x 15x 15x 15x 15x 15x     15x 15x   15x   16x 16x   16x 16x   14x 14x   14x   14x   14x   14x   14x     14x       14x    
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, Effect } from '@/internal'
 
 
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 Effect.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
}