vite-plugin-vanjs
Version:
A mini meta-framework for VanJS powered by Vite
57 lines (48 loc) • 1.37 kB
JavaScript
// router/a.mjs
import van from "vanjs-core";
import setup from "../setup/index.mjs";
import { matchRoute } from "./routes.mjs";
import { executeLifecycle, isCurrentPage, navigate } from "./helpers.mjs";
/** @typedef {typeof import("./types").A} A */
/**
* @type {A}
*/
export const A = (
/* istanbul ignore next */ { href, children, ...rest } = {},
...otherChildren
) => {
/* istanbul ignore next - try again later */
const props = Object.fromEntries(
Object.entries(rest || {}).filter(([_, val]) => val !== undefined),
);
const newProps = {
href,
...props,
};
van.derive(() => {
if (isCurrentPage(href)) {
newProps["aria-current"] = "page";
}
});
const anchor = van.tags.a(newProps, [...(children || []), ...otherChildren]);
/* istanbul ignore else */
if (!setup.isServer) {
anchor.addEventListener("click", async (e) => {
e.preventDefault();
/* istanbul ignore next */
if (isCurrentPage(href)) return;
const route = matchRoute(href);
const module = await route.component();
await executeLifecycle(module, route.params);
navigate(href);
});
anchor.addEventListener("mouseenter", () => {
const route = matchRoute(href);
/* istanbul ignore else */
if (route?.component) {
route.component();
}
});
}
return anchor;
};