UNPKG

@jsenv/core

Version:

Tool to develop, test and build js projects

66 lines (64 loc) 1.88 kB
import { injectJsenvScript, parseHtml, stringifyHtmlAst } from "@jsenv/ast"; import { URL_META } from "@jsenv/url-meta"; import { asUrlWithoutSearch } from "@jsenv/urls"; export const jsenvPluginRibbon = ({ rootDirectoryUrl, htmlInclude = "/**/*.html", }) => { const ribbonClientFileUrl = import.meta.resolve("./client/ribbon.js"); const associations = URL_META.resolveAssociations( { ribbon: { [htmlInclude]: true, }, }, rootDirectoryUrl, ); return { name: "jsenv:ribbon", appliesDuring: "dev", transformUrlContent: { html: (urlInfo) => { const jsenvToolbarHtmlClientFileUrl = urlInfo.context.getPluginMeta( "jsenvToolbarHtmlClientFileUrl", ); if ( jsenvToolbarHtmlClientFileUrl && // startsWith to ignore search params urlInfo.url.startsWith(jsenvToolbarHtmlClientFileUrl) ) { return null; } const { ribbon } = URL_META.applyAssociations({ url: asUrlWithoutSearch(urlInfo.url), associations, }); if (!ribbon) { return null; } const htmlAst = parseHtml({ html: urlInfo.content, url: urlInfo.url, }); const ribbonClientFileReference = urlInfo.dependencies.inject({ type: "script", subtype: "js_module", expectedType: "js_module", specifier: ribbonClientFileUrl, }); injectJsenvScript(htmlAst, { type: "module", src: ribbonClientFileReference.generatedSpecifier, initCall: { callee: "injectRibbon", params: { text: urlInfo.context.dev ? "DEV" : "BUILD", }, }, pluginName: "jsenv:ribbon", }); return stringifyHtmlAst(htmlAst); }, }, }; };