@westacks/vortex
Version:
Server-based routing for SPAs
76 lines (75 loc) • 2.58 kB
JavaScript
;
const page = require("./page-DiCE-s9S.cjs");
const http = require("axios");
exports.axios = void 0;
const popstate = (event) => {
if (!event.state) return;
page.setPage(event.state.page);
};
function install(...extensions) {
if (!exports.axios) throw new Error("Router not initialized!");
const uninstall = extensions.reduce((acc, x) => {
const extension = x(exports.axios.interceptors);
if ((extension == null ? void 0 : extension.name) && typeof window !== "undefined") {
window.dispatchEvent(new CustomEvent(`vortex:extension-installed`, { detail: extension.name }));
}
acc.request = [...acc.request, ...(extension == null ? void 0 : extension.request) ? [extension.request] : []];
acc.response = [...acc.response, ...(extension == null ? void 0 : extension.response) ? [extension.response] : []];
return acc;
}, { request: [], response: [] });
return () => {
uninstall.request.forEach((x) => {
var _a;
return (_a = exports.axios) == null ? void 0 : _a.interceptors.request.eject(x);
});
uninstall.response.forEach((x) => {
var _a;
return (_a = exports.axios) == null ? void 0 : _a.interceptors.response.eject(x);
});
};
}
function createRouter() {
var _a;
exports.axios = http.create();
exports.axios.reload = function(config) {
var _a2;
return this({ url: (_a2 = page.getPage()) == null ? void 0 : _a2.url, ...config });
};
window.history.replaceState({ page: page.getPage() }, "", (_a = page.getPage()) == null ? void 0 : _a.url);
window.addEventListener("popstate", popstate);
exports.axios.defaults.withCredentials = true;
exports.axios.defaults.vortex = true;
}
function destroyRouter() {
window.removeEventListener("popstate", popstate);
exports.axios = void 0;
}
function link(node, options = {}) {
function mergeOptions(options2) {
options2.method = options2.method || "get";
options2.url = options2.url || node.href || "";
options2.data = options2.data || {};
if (node instanceof HTMLAnchorElement) {
node.href = options2.url;
}
return options2;
}
function navigate(event) {
event.preventDefault();
exports.axios(options);
}
options = mergeOptions(options);
node.addEventListener("click", navigate);
return {
update(newOptions) {
options = mergeOptions(newOptions);
},
destroy() {
node.removeEventListener("click", navigate);
}
};
}
exports.createRouter = createRouter;
exports.destroyRouter = destroyRouter;
exports.install = install;
exports.link = link;