keycloak_theme/src/tools/headInsert.ts

88 lines
2.5 KiB
TypeScript
Raw Normal View History

2021-10-22 18:10:32 +02:00
import "./HTMLElement.prototype.prepend";
2021-03-04 13:56:51 +01:00
import { Deferred } from "evt/tools/Deferred";
2021-10-22 18:10:32 +02:00
export function headInsert(
params:
| {
type: "css";
href: string;
2021-10-22 18:10:32 +02:00
position: "append" | "prepend";
}
| {
type: "javascript";
isModule: boolean;
source:
| {
type: "url";
src: string;
}
| {
type: "inline";
code: string;
};
}
): { remove: () => void; prLoaded: Promise<void> } {
2021-03-04 13:56:51 +01:00
const htmlElement = document.createElement(
(() => {
switch (params.type) {
case "css":
return "link";
case "javascript":
return "script";
2021-03-04 13:56:51 +01:00
}
})()
2021-03-04 13:56:51 +01:00
);
const dLoaded = new Deferred<void>();
htmlElement.addEventListener("load", () => dLoaded.resolve());
Object.assign(
htmlElement,
(() => {
switch (params.type) {
case "css":
return {
"href": params.href,
"rel": "stylesheet"
};
case "javascript":
return {
...(() => {
switch (params.source.type) {
case "inline":
return { "textContent": params.source.code };
case "url":
return { "src": params.source.src };
}
})(),
"type": params.isModule ? "module" : "text/javascript"
};
2021-03-04 13:56:51 +01:00
}
})()
2021-03-04 13:56:51 +01:00
);
2021-10-22 18:10:32 +02:00
document.getElementsByTagName("head")[0][
(() => {
switch (params.type) {
case "javascript":
return "appendChild";
case "css":
return (() => {
switch (params.position) {
case "append":
return "appendChild";
case "prepend":
return "prepend";
}
})();
}
})()
](htmlElement);
2021-03-04 13:56:51 +01:00
return {
"prLoaded": dLoaded.pr,
"remove": () => htmlElement.remove()
};
}