-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
macro.js
39 lines (34 loc) · 1.33 KB
/
macro.js
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
const { parseExpression } = require('@babel/parser')
const { createMacro, MacroError } = require('babel-plugin-macros')
const fs = require('fs')
const path = require('path')
const YAML = require('yaml')
module.exports = createMacro(yamlMacro)
function yamlMacro({ references, state }) {
for (const { parentPath } of references.default) {
if (parentPath.type !== 'CallExpression')
throw new MacroError('yaml.macro only supports usage as a function call')
let argPath, argOptions
try {
const args = parentPath.get('arguments')
argPath = args[0].evaluate().value
if (args.length > 1) argOptions = args[1].evaluate().value
} catch (error) {
error.message = `yaml.macro argument evaluation failed: ${error.message}`
throw error
}
/* istanbul ignore if */
if (!argPath) throw new MacroError('yaml.macro argument evaluation failed')
const dirname = path.dirname(state.file.opts.filename)
const fullPath = require.resolve(argPath, { paths: [dirname] })
const fileContent = fs.readFileSync(fullPath, { encoding: 'utf-8' })
const options = Object.assign({}, argOptions, {
intAsBigInt: false,
json: true,
mapAsMap: false
})
const res = YAML.parse(fileContent, options)
const exp = parseExpression(JSON.stringify(res))
parentPath.replaceWith(exp)
}
}