dobo
Version:
Database ORM/ODM for Bajo Framework
82 lines (77 loc) • 3.11 kB
JavaScript
import path from 'path'
import sanitizeSchema from './sanitize-schema.js'
async function handler ({ file, alias, ns }) {
const { readConfig, eachPlugins } = this.app.bajo
const { pascalCase } = this.lib.aneka
const { get, isPlainObject, each, find, has, isArray, forOwn, isString, merge } = this.lib._
const { fastGlob } = this.lib
const base = path.basename(file, path.extname(file))
const defName = pascalCase(`${alias} ${base}`)
const mod = await readConfig(file, { ns, ignoreError: true })
if (!isPlainObject(mod)) this.fatal('invalidSchema%s', defName)
const forcedConn = get(this, `app.${ns}.config.dobo.schemaConnection.${base}`)
if (forcedConn) mod.connection = forcedConn
if (!mod.connection) mod.connection = 'default'
mod.name = mod.name ?? defName
mod.file = file
mod.ns = ns
mod.attachment = mod.attachment ?? true
mod.feature = mod.feature ?? []
mod.buildLevel = mod.buildLevel ?? 999
const feats = []
if (isArray(mod.feature)) {
each(mod.feature, f => {
if (isString(f)) feats.push({ name: f })
else if (isPlainObject(f)) feats.push(f)
})
} else if (isPlainObject(mod.feature)) {
forOwn(mod.feature, (v, k) => {
feats.push(merge({}, v, { name: k }))
})
}
mod.feature = feats
mod.properties = mod.properties ?? []
// if ((mod.properties ?? []).length === 0) this.fatal('noPropsFoundOnSchema%s', mod.name)
// schema extender
await eachPlugins(async function (opts) {
const glob = `${opts.dir}/dobo/extend/${mod.ns}/schema/${base}.*`
const files = await fastGlob(glob)
for (const file of files) {
const extender = await readConfig(file, { ns: opts.ns, ignoreError: true })
if (!isPlainObject(extender)) return undefined
each(extender.properties ?? [], p => {
if (isString(p) && mod.properties.includes(p)) return undefined
else if (find(mod.properties, { name: p.name })) return undefined
mod.properties.push(p)
})
const feats = []
if (isArray(extender.feature)) {
each(extender.feature, f => {
if (isString(f)) feats.push({ name: f })
else if (isPlainObject(f)) feats.push(f)
})
} else if (isPlainObject(extender.feature)) {
forOwn(extender.feature, (v, k) => {
feats.push(merge({}, v, { name: k }))
})
}
if (feats.length > 0) mod.feature.push(...feats)
if (opts.plugin === this.app.bajo.mainNs) {
each(['connection', 'name'], i => {
if (has(extender, i)) mod[i] = extender[i]
})
}
mod.extender = mod.extender ?? []
mod.extender.push(opts.plugin)
}
})
return mod
}
async function collectSchemas () {
const { eachPlugins } = this.app.bajo
const { isEmpty } = this.lib._
const result = await eachPlugins(handler, { glob: 'schema/*.*', prefix: this.name })
if (isEmpty(result)) this.log.warn('notFound%s', this.print.write('schema'))
else await sanitizeSchema.call(this, result)
}
export default collectSchemas