2020-02-24 08:24:36 +00:00
|
|
|
import * as yaml from 'js-yaml'
|
2020-07-06 08:06:47 +00:00
|
|
|
import * as fs from '@ccms/common/dist/fs'
|
|
|
|
import { plugin } from '@ccms/api'
|
|
|
|
import { getPluginConfigMetadata } from './utils'
|
2020-02-24 08:24:36 +00:00
|
|
|
|
|
|
|
export interface PluginConfigLoader {
|
2020-07-06 08:06:47 +00:00
|
|
|
load(content: string): any
|
|
|
|
dump(variable: any): string
|
2020-02-24 08:24:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
export class YamlPluginConfig implements PluginConfigLoader {
|
|
|
|
load(content: string) {
|
2020-07-06 08:06:47 +00:00
|
|
|
return yaml.safeLoad(content)
|
2020-02-24 08:24:36 +00:00
|
|
|
}
|
|
|
|
dump(variable: any): string {
|
2020-07-06 08:06:47 +00:00
|
|
|
return yaml.safeDump(variable, { skipInvalid: true })
|
2020-02-24 08:24:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export class JsonPluginConfig implements PluginConfigLoader {
|
|
|
|
load(content: string) {
|
2020-07-06 08:06:47 +00:00
|
|
|
return JSON.parse(content)
|
2020-02-24 08:24:36 +00:00
|
|
|
}
|
|
|
|
dump(variable: any): string {
|
2020-07-06 08:06:47 +00:00
|
|
|
return JSON.stringify(variable)
|
2020-02-24 08:24:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-06 08:06:47 +00:00
|
|
|
const configLoaderMap = new Map<string, PluginConfigLoader>()
|
2020-02-24 08:24:36 +00:00
|
|
|
|
|
|
|
export function getConfigLoader(format: string) {
|
|
|
|
if (!configLoaderMap.has(format)) { throw new Error(`Unsupport config format ${format} !`) }
|
2020-07-06 08:06:47 +00:00
|
|
|
return configLoaderMap.get(format)
|
|
|
|
}
|
|
|
|
|
|
|
|
function loadConfig(plugin: plugin.Plugin) {
|
|
|
|
let configs = getPluginConfigMetadata(plugin)
|
|
|
|
for (let [_, config] of configs) {
|
|
|
|
try {
|
|
|
|
let configFile = fs.concat(fs.file(plugin.description.loadMetadata.file).parent, plugin.description.name, config.name + '.' + config.format)
|
|
|
|
let configFactory = getConfigLoader(config.format)
|
|
|
|
if (!fs.exists(configFile)) {
|
|
|
|
base.save(configFile, configFactory.dump(plugin[config.variable]))
|
|
|
|
console.i18n("ms.plugin.manager.config.save.default", { plugin: plugin.description.name, name: config.name, format: config.format })
|
|
|
|
} else {
|
2020-08-14 08:05:44 +00:00
|
|
|
Object.defineProperty(plugin, config.variable, { value: configFactory.load(base.read(configFile)) })
|
2020-07-06 08:06:47 +00:00
|
|
|
plugin[config.variable].save = () => {
|
|
|
|
let result = configFactory.dump(plugin[config.variable])
|
|
|
|
base.save(configFile, result)
|
|
|
|
console.debug(`[${plugin.description.name}] Save Config ${config.variable} to file ${configFile} result ${result}`)
|
|
|
|
}
|
|
|
|
console.debug(`[${plugin.description.name}] Load Config ${config.variable} from file ${configFile} result ${JSON.stringify(plugin[config.variable])}`)
|
|
|
|
}
|
|
|
|
} catch (error) {
|
|
|
|
console.i18n("ms.plugin.manager.config.load.error", { plugin: plugin.description.name, name: config.name, format: config.format, error })
|
|
|
|
console.ex(error)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function saveConfig(plugin: plugin.Plugin) {
|
|
|
|
let configs = getPluginConfigMetadata(plugin)
|
|
|
|
for (let [_, config] of configs) {
|
|
|
|
try {
|
|
|
|
let configFile = fs.concat(fs.file(plugin.description.loadMetadata.file).parent, plugin.description.name, config.name + '.' + config.format)
|
|
|
|
let configFactory = getConfigLoader(config.format)
|
|
|
|
if (!config.readonly) { base.save(configFile, configFactory.dump(plugin[config.variable])) }
|
|
|
|
} catch (error) {
|
|
|
|
console.i18n("ms.plugin.manager.config.save.error", { plugin: plugin.description.name, name: config.name, format: config.format, error })
|
|
|
|
console.ex(error)
|
|
|
|
}
|
|
|
|
}
|
2020-02-24 08:24:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function init() {
|
|
|
|
configLoaderMap.set("json", new JsonPluginConfig())
|
|
|
|
let yaml = new YamlPluginConfig()
|
|
|
|
configLoaderMap.set("yml", yaml)
|
|
|
|
configLoaderMap.set("yaml", yaml)
|
2020-07-06 08:06:47 +00:00
|
|
|
process.on('plugin.before.load', loadConfig)
|
|
|
|
process.on('plugin.after.load', saveConfig)
|
2020-02-24 08:24:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
init()
|