prasi-bun/pkgs/web-utils/src/define-window.ts

98 lines
2.4 KiB
TypeScript

import { css, extractCss } from "goober";
import { waitUntil } from "web-utils";
export const defineWindow = async (awaitServerUrl = true) => {
let w = typeof window === "object" ? window : (globalThis as any);
if (awaitServerUrl) await waitUntil(() => w.__SRV_URL__);
w.prasiContext = {
global: {},
render() {},
};
const location = window["location"];
const host =
0 === location.protocol.indexOf("http") ? location.hostname : "localhost",
scheme =
"https:" != location.protocol || /localhost|127.0.0.1|0.0.0.0/.test(host)
? "http"
: "https";
if (w.__SRV_URL__) {
w.serverurl = w.__SRV_URL__;
const serverURL = new URL(w.serverurl);
if (
serverURL.hostname === "localhost" ||
serverURL.hostname === "127.0.0.1"
) {
serverURL.hostname = location.hostname;
serverURL.pathname = serverURL.pathname === "/" ? "" : serverURL.pathname;
w.serverurl = serverURL.toString();
if (w.serverurl.endsWith("/")) {
w.serverurl = w.serverurl.substring(0, w.serverurl.length - 1);
}
}
}
const port = location.port;
w.baseurl = scheme + "://" + host + (port ? ":" + port : "") + "/";
w.basepath = "/";
w.css = css;
w.extractCss = extractCss;
w.pathname = location.pathname;
w.cx = (...classNames: any[]) => {
const result: string[] = [];
classNames
.filter((e) => {
if (e) {
if (typeof e === "string" && e.trim()) return true;
else return true;
}
return false;
})
.forEach((e) => {
if (Array.isArray(e)) {
for (const f of e) {
if (typeof f === "string" && f.trim()) {
result.push(f.trim());
}
}
} else result.push(e.trim());
});
return result.join(" ");
};
w.navigate = (href: string) => {
let _href = href;
if (typeof w.navigateOverride === "function") {
_href = w.navigateOverride(href);
if (!_href) return null;
}
history.pushState({}, "", _href);
w.pathname = href;
if (w.prasiContext && w.prasiContext.render) {
w.prasiContext.render();
}
};
if (typeof window === "object") {
window.addEventListener("popstate", () => {
if (w.preventPopRender) {
w.preventPopRender = false;
return;
}
if (w.rootRender) {
w.pathname = location.pathname;
w.rootRender();
}
});
}
};