43 lines
1 KiB
TypeScript
43 lines
1 KiB
TypeScript
|
import { randomUUID } from "crypto"
|
||
|
import { JSX } from "preact/jsx-runtime"
|
||
|
|
||
|
export type JSResource = {
|
||
|
loadTime: "beforeDOMReady" | "afterDOMReady"
|
||
|
moduleType?: "module"
|
||
|
spaPreserve?: boolean
|
||
|
} & (
|
||
|
| {
|
||
|
src: string
|
||
|
contentType: "external"
|
||
|
}
|
||
|
| {
|
||
|
script: string
|
||
|
contentType: "inline"
|
||
|
}
|
||
|
)
|
||
|
|
||
|
export function JSResourceToScriptElement(resource: JSResource, preserve?: boolean): JSX.Element {
|
||
|
const scriptType = resource.moduleType ?? "application/javascript"
|
||
|
const spaPreserve = preserve ?? resource.spaPreserve
|
||
|
if (resource.contentType === "external") {
|
||
|
return (
|
||
|
<script key={resource.src} src={resource.src} type={scriptType} spa-preserve={spaPreserve} />
|
||
|
)
|
||
|
} else {
|
||
|
const content = resource.script
|
||
|
return (
|
||
|
<script
|
||
|
key={randomUUID()}
|
||
|
type={scriptType}
|
||
|
spa-preserve={spaPreserve}
|
||
|
dangerouslySetInnerHTML={{ __html: content }}
|
||
|
></script>
|
||
|
)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export interface StaticResources {
|
||
|
css: string[]
|
||
|
js: JSResource[]
|
||
|
}
|