71 lines
2.6 KiB
JavaScript
71 lines
2.6 KiB
JavaScript
//Imports
|
|
import fs from "fs/promises"
|
|
import yaml from "js-yaml"
|
|
import fetch from "node-fetch"
|
|
import metadata from "./metadata.mjs"
|
|
|
|
/**Presets parser */
|
|
export default async function presets(list, {log = true, core = null} = {}) {
|
|
//Init
|
|
const {plugins} = await metadata({log:false})
|
|
const {"config.presets":files} = plugins.core.inputs({q:{"config.presets":list}, account:"bypass"})
|
|
const logger = log ? console.debug : () => null
|
|
const allowed = Object.entries(metadata.inputs).filter(([_, {type, preset}]) => (type !== "token")&&(!/^(?:[Ff]alse|[Oo]ff|[Nn]o|0)$/.test(preset))).map(([key]) => key)
|
|
const env = core ? "action" : "web"
|
|
const options = {}
|
|
|
|
//Load presets
|
|
for (const file of files) {
|
|
try {
|
|
//Load and parse preset
|
|
logger(`metrics/presets > loading ${file}`)
|
|
let text = ""
|
|
if (file.startsWith("@")) {
|
|
logger(`metrics/presets > ${file} seems to be predefined preset, fetching`)
|
|
text = await fetch(`https://raw.githubusercontent.com/lowlighter/metrics/presets/${file.substring(1)}/preset.yaml`).then(response => response.text())
|
|
}
|
|
else if (file.startsWith("https://")) {
|
|
logger(`metrics/presets > ${file} seems to be an url, fetching`)
|
|
text = await fetch(file).then(response => response.text())
|
|
}
|
|
else if (env === "action") {
|
|
logger(`metrics/presets > ${file} seems to be a local file, reading`)
|
|
text = `${await fs.readFile(file)}`
|
|
}
|
|
else {
|
|
logger(`metrics/presets > ${file} cannot be loaded in current environment ${env}, skipping`)
|
|
continue
|
|
}
|
|
const {schema, with:inputs} = yaml.load(text)
|
|
logger(`metrics/presets > ${file} preset schema is ${schema}`)
|
|
|
|
//Evaluate preset
|
|
switch (`${schema}`) {
|
|
case "draft":{
|
|
for (let [key, value] of Object.entries(inputs)) {
|
|
if (!allowed.includes(key)) {
|
|
logger(`metrics/presets > ${key} is specified but is not allowed in preset, skipping`)
|
|
continue
|
|
}
|
|
if (env === "web")
|
|
key = metadata.to.query(key)
|
|
if (key in options)
|
|
logger(`metrics/presets > ${key} was already specified by another preset, overwriting`)
|
|
options[key] = value
|
|
}
|
|
break
|
|
}
|
|
default:
|
|
throw new Error(`unsupported preset schema: ${schema}`)
|
|
}
|
|
}
|
|
//Handle errors
|
|
catch (error) {
|
|
if (env === "action")
|
|
console.log(`::warning::skipping preset ${file}: ${error.message}`)
|
|
logger(`metrics/presets > an error occured while loading preset ${file} (${error}), ignoring`)
|
|
}
|
|
}
|
|
return options
|
|
}
|