waibu-mpa
Version:
MPA support for Waibu Framework
49 lines (46 loc) • 1.77 kB
JavaScript
import injectCss from './inject-elements/css.js'
import injectMeta from './inject-elements/meta.js'
import injectScript from './inject-elements/script.js'
import injectLink from './inject-elements/link.js'
async function injectElements (options) {
const { $, req, cmp, reply } = options ?? {}
const { isClass } = this.app.lib.aneka
const { runHook } = this.app.bajo
const { get, isString, isFunction, isEmpty } = this.app.lib._
$('html').attr('lang', req.lang)
if (req.darkMode) $('body').attr('data-bs-theme', 'dark')
const rsc = {}
for (const tag of reply.ctags ?? []) {
let Builder = get(cmp, `widget.${tag}`)
if (!isFunction(Builder)) continue
if (!isClass(Builder)) Builder = await Builder.call(cmp)
for (const key of ['links', 'scripts', 'css']) {
let item = Builder[key] ?? []
if (isString(item)) item = [item]
if (isFunction(item)) item = await item.call(cmp, Builder)
if (item.length > 0) {
rsc[key] = rsc[key] ?? []
rsc[key].push(...item)
}
}
for (const key of ['inlineScript', 'inlineCss']) {
let item = Builder[key] ?? ''
if (isFunction(item)) item = await item.call(cmp, Builder)
if (!isEmpty(item)) {
rsc[key] = rsc[key] ?? []
rsc[key].push(item)
}
}
}
for (const key of ['links', 'scripts', 'css']) {
options[key] = rsc[key] ?? []
}
options.inlineScript = rsc.inlineScript
options.inlineCss = rsc.inlineCss
await runHook(`${this.ns}.injectElement:beforeBuildPage`, options)
await injectMeta.call(this, options)
await injectLink.call(this, options)
await injectCss.call(this, options)
await injectScript.call(this, options)
}
export default injectElements