xpine 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +659 -0
- package/dist/src/scripts/xpine-build.js +421 -0
- package/dist/src/scripts/xpine-dev.js +482 -0
- package/dist/src/static/dev-server.js +10 -0
- package/dist/src/static/spa.js +152 -0
- package/index.ts +5 -5
- package/package.json +3 -2
- package/src/runDevServer.ts +2 -2
- package/src/scripts/build-module.ts +1 -1
- package/src/scripts/build.ts +1 -1
- package/src/scripts/xpine-build.ts +1 -1
- package/src/scripts/xpine-dev.ts +1 -1
- package/src/util/get-config.ts +1 -1
- package/src/util/require.ts +1 -1
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// src/static/spa.mjs
|
|
2
|
+
async function replaceDocumentContentsWithLinkResponse() {
|
|
3
|
+
const links = [...document.querySelectorAll("[data-spa]")];
|
|
4
|
+
for (const link of links) {
|
|
5
|
+
link.addEventListener("click", updatePageOnLinkClick);
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
async function updatePageOnLinkClick(e) {
|
|
9
|
+
const targetHref = e?.target?.getAttribute("href");
|
|
10
|
+
if (!targetHref) return;
|
|
11
|
+
if (isExternalURL(targetHref) && !e?.target?.getAttribute("data-spa-crossorigin")) return;
|
|
12
|
+
e.preventDefault();
|
|
13
|
+
try {
|
|
14
|
+
await getNewPageContent(targetHref);
|
|
15
|
+
if (targetHref === window.location.pathname) return;
|
|
16
|
+
window.history.pushState(
|
|
17
|
+
{
|
|
18
|
+
type: "link-click",
|
|
19
|
+
targetHref
|
|
20
|
+
},
|
|
21
|
+
"",
|
|
22
|
+
targetHref
|
|
23
|
+
);
|
|
24
|
+
const event = new CustomEvent("spa:updatePageURL", {
|
|
25
|
+
detail: {
|
|
26
|
+
href: targetHref
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
window.dispatchEvent(event);
|
|
30
|
+
} catch (err) {
|
|
31
|
+
console.error(err);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function getNewPageContent(href) {
|
|
35
|
+
try {
|
|
36
|
+
const res = await fetch(href);
|
|
37
|
+
const text = await res.text();
|
|
38
|
+
const parser = new DOMParser();
|
|
39
|
+
const dom = parser.parseFromString(text, "text/html");
|
|
40
|
+
diffHead(dom);
|
|
41
|
+
const newScripts = removeBodyScripts(dom);
|
|
42
|
+
const clonedPersistentNodes = getPersistentNodesFromDocument(dom);
|
|
43
|
+
const body = dom.body.innerHTML;
|
|
44
|
+
document.body.innerHTML = body;
|
|
45
|
+
for (const clonedNode of clonedPersistentNodes) {
|
|
46
|
+
const newNode = document.body.querySelector(`[data-persistent="${clonedNode?.getAttribute("data-persistent")}"]`);
|
|
47
|
+
newNode.replaceWith(clonedNode);
|
|
48
|
+
}
|
|
49
|
+
replaceAttributesOnDocumentBody(dom);
|
|
50
|
+
replaceDocumentContentsWithLinkResponse();
|
|
51
|
+
for (const script of newScripts) document.body.appendChild(script);
|
|
52
|
+
const event = new CustomEvent("spa:updatePageContent", {
|
|
53
|
+
detail: {
|
|
54
|
+
href
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
window.dispatchEvent(event);
|
|
58
|
+
} catch (err) {
|
|
59
|
+
console.error(err);
|
|
60
|
+
console.error("Error getting link", href);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function diffHead(dom) {
|
|
64
|
+
const domHeadChildren = [...dom.head.children];
|
|
65
|
+
const currentHeadChildren = [...document.head.children];
|
|
66
|
+
const result = {
|
|
67
|
+
childrenToAdd: [],
|
|
68
|
+
childrenToRemove: []
|
|
69
|
+
};
|
|
70
|
+
for (const domChild of domHeadChildren) {
|
|
71
|
+
const foundInCurrentChildren = currentHeadChildren.find((child) => child.outerHTML === domChild.outerHTML);
|
|
72
|
+
if (!foundInCurrentChildren) result.childrenToAdd.push(domChild);
|
|
73
|
+
}
|
|
74
|
+
for (const currentChild of currentHeadChildren) {
|
|
75
|
+
const foundInDomChildren = domHeadChildren.find((child) => child.outerHTML === currentChild.outerHTML);
|
|
76
|
+
if (!foundInDomChildren) result.childrenToRemove.push(currentChild);
|
|
77
|
+
}
|
|
78
|
+
applyHeadDiffsToDocument(result);
|
|
79
|
+
}
|
|
80
|
+
function applyHeadDiffsToDocument(diff) {
|
|
81
|
+
for (const child of diff.childrenToRemove) {
|
|
82
|
+
document.head.removeChild(child);
|
|
83
|
+
}
|
|
84
|
+
for (const child of diff.childrenToAdd) {
|
|
85
|
+
if (child?.nodeName?.toLowerCase() == "script") {
|
|
86
|
+
const scriptElement = document.createElement("script");
|
|
87
|
+
portAttributesToElement(child, scriptElement);
|
|
88
|
+
scriptElement.innerHTML = child.innerHTML;
|
|
89
|
+
document.head.appendChild(scriptElement);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
document.head.appendChild(child);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function removeBodyScripts(dom) {
|
|
96
|
+
const scripts = [...dom.body.querySelectorAll("script")];
|
|
97
|
+
const newElements = [];
|
|
98
|
+
for (const script of scripts) {
|
|
99
|
+
const element = document.createElement("script");
|
|
100
|
+
portAttributesToElement(script, element);
|
|
101
|
+
element.innerHTML = script.innerHTML;
|
|
102
|
+
dom.body.removeChild(script);
|
|
103
|
+
newElements.push(element);
|
|
104
|
+
}
|
|
105
|
+
return newElements;
|
|
106
|
+
}
|
|
107
|
+
function portAttributesToElement(oldEl, newEl) {
|
|
108
|
+
for (const attribute of oldEl.attributes) {
|
|
109
|
+
newEl.setAttribute(attribute.name, attribute.nodeValue);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function getPersistentNodesFromDocument(dom) {
|
|
113
|
+
const persistentNodesFromDom = [...dom.querySelectorAll("[data-persistent]")].map((el) => el.getAttribute("data-persistent"));
|
|
114
|
+
const persistentNodesFromBody = [...document.body.querySelectorAll("[data-persistent]")];
|
|
115
|
+
const validPersistentNodes = persistentNodesFromBody.filter((el) => {
|
|
116
|
+
return persistentNodesFromDom.includes(el.getAttribute("data-persistent"));
|
|
117
|
+
});
|
|
118
|
+
return validPersistentNodes.map((el) => el.cloneNode(true));
|
|
119
|
+
}
|
|
120
|
+
function replaceAttributesOnDocumentBody(dom) {
|
|
121
|
+
while (document.body.attributes.length > 0) {
|
|
122
|
+
document.body.removeAttribute(document.body.attributes[0].name);
|
|
123
|
+
}
|
|
124
|
+
for (const attribute of dom.body.attributes) {
|
|
125
|
+
document.body.setAttribute(attribute.name, attribute.nodeValue);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async function handleBackButton() {
|
|
129
|
+
await getNewPageContent(window.history.state?.targetHref || window.location.href);
|
|
130
|
+
}
|
|
131
|
+
function isRelativeURL(url) {
|
|
132
|
+
if (typeof url !== "string") return false;
|
|
133
|
+
try {
|
|
134
|
+
new URL(url);
|
|
135
|
+
return false;
|
|
136
|
+
} catch (err) {
|
|
137
|
+
if (url?.startsWith("//")) return false;
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function isExternalURL(url) {
|
|
142
|
+
if (isRelativeURL(url)) return false;
|
|
143
|
+
try {
|
|
144
|
+
const computedURL = new URL(url);
|
|
145
|
+
return computedURL?.origin !== window.location?.origin;
|
|
146
|
+
} catch {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
window.addEventListener("DOMContentLoaded", replaceDocumentContentsWithLinkResponse);
|
|
151
|
+
window.addEventListener("popstate", handleBackButton);
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3N0YXRpYy9zcGEubWpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBFbmFibGVzIFNQQSBsaWtlIGJlaGF2aW9yIGZvciBsaW5rc1xuXG5hc3luYyBmdW5jdGlvbiByZXBsYWNlRG9jdW1lbnRDb250ZW50c1dpdGhMaW5rUmVzcG9uc2UoKSB7XG4gIGNvbnN0IGxpbmtzID0gWy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXNwYV0nKV07XG4gIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB1cGRhdGVQYWdlT25MaW5rQ2xpY2spO1xuICB9XG5cbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUGFnZU9uTGlua0NsaWNrKGUpIHtcbiAgY29uc3QgdGFyZ2V0SHJlZiA9IGU/LnRhcmdldD8uZ2V0QXR0cmlidXRlKCdocmVmJyk7XG4gIGlmICghdGFyZ2V0SHJlZikgcmV0dXJuO1xuICBpZiAoaXNFeHRlcm5hbFVSTCh0YXJnZXRIcmVmKSAmJiAhZT8udGFyZ2V0Py5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3BhLWNyb3Nzb3JpZ2luJykpIHJldHVybjtcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB0cnkge1xuICAgIGF3YWl0IGdldE5ld1BhZ2VDb250ZW50KHRhcmdldEhyZWYpO1xuICAgIGlmICh0YXJnZXRIcmVmID09PSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpIHJldHVybjtcbiAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdsaW5rLWNsaWNrJyxcbiAgICAgICAgdGFyZ2V0SHJlZixcbiAgICAgIH0sXG4gICAgICAnJyxcbiAgICAgIHRhcmdldEhyZWZcbiAgICApO1xuICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdzcGE6dXBkYXRlUGFnZVVSTCcsIHtcbiAgICAgIGRldGFpbDoge1xuICAgICAgICBocmVmOiB0YXJnZXRIcmVmLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXROZXdQYWdlQ29udGVudChocmVmKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goaHJlZik7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgIGNvbnN0IGRvbSA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcodGV4dCwgJ3RleHQvaHRtbCcpO1xuICAgIGRpZmZIZWFkKGRvbSk7XG4gICAgY29uc3QgbmV3U2NyaXB0cyA9IHJlbW92ZUJvZHlTY3JpcHRzKGRvbSk7XG4gICAgY29uc3QgY2xvbmVkUGVyc2lzdGVudE5vZGVzID0gZ2V0UGVyc2lzdGVudE5vZGVzRnJvbURvY3VtZW50KGRvbSk7XG4gICAgY29uc3QgYm9keSA9IGRvbS5ib2R5LmlubmVySFRNTDtcbiAgICBkb2N1bWVudC5ib2R5LmlubmVySFRNTCA9IGJvZHk7XG4gICAgZm9yIChjb25zdCBjbG9uZWROb2RlIG9mIGNsb25lZFBlcnNpc3RlbnROb2Rlcykge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgY29uc3QgbmV3Tm9kZSA9IGRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcihgW2RhdGEtcGVyc2lzdGVudD1cIiR7Y2xvbmVkTm9kZT8uZ2V0QXR0cmlidXRlKCdkYXRhLXBlcnNpc3RlbnQnKX1cIl1gKTtcbiAgICAgIG5ld05vZGUucmVwbGFjZVdpdGgoY2xvbmVkTm9kZSk7XG4gICAgfVxuICAgIHJlcGxhY2VBdHRyaWJ1dGVzT25Eb2N1bWVudEJvZHkoZG9tKTtcbiAgICByZXBsYWNlRG9jdW1lbnRDb250ZW50c1dpdGhMaW5rUmVzcG9uc2UoKTtcbiAgICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBuZXdTY3JpcHRzKSBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgLy8gU2VuZCBhbiBldmVudFxuICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdzcGE6dXBkYXRlUGFnZUNvbnRlbnQnLCB7XG4gICAgICBkZXRhaWw6IHtcbiAgICAgICAgaHJlZixcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgd2luZG93LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2V0dGluZyBsaW5rJywgaHJlZik7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlmZkhlYWQoZG9tKSB7XG4gIGNvbnN0IGRvbUhlYWRDaGlsZHJlbiA9IFsuLi5kb20uaGVhZC5jaGlsZHJlbl07XG4gIGNvbnN0IGN1cnJlbnRIZWFkQ2hpbGRyZW4gPSBbLi4uZG9jdW1lbnQuaGVhZC5jaGlsZHJlbl07XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBjaGlsZHJlblRvQWRkOiBbXSxcbiAgICBjaGlsZHJlblRvUmVtb3ZlOiBbXSxcbiAgfTtcbiAgZm9yIChjb25zdCBkb21DaGlsZCBvZiBkb21IZWFkQ2hpbGRyZW4pIHtcbiAgICBjb25zdCBmb3VuZEluQ3VycmVudENoaWxkcmVuID0gY3VycmVudEhlYWRDaGlsZHJlbi5maW5kKGNoaWxkID0+IGNoaWxkLm91dGVySFRNTCA9PT0gZG9tQ2hpbGQub3V0ZXJIVE1MKTtcbiAgICBpZiAoIWZvdW5kSW5DdXJyZW50Q2hpbGRyZW4pIHJlc3VsdC5jaGlsZHJlblRvQWRkLnB1c2goZG9tQ2hpbGQpO1xuICB9XG4gIGZvciAoY29uc3QgY3VycmVudENoaWxkIG9mIGN1cnJlbnRIZWFkQ2hpbGRyZW4pIHtcbiAgICBjb25zdCBmb3VuZEluRG9tQ2hpbGRyZW4gPSBkb21IZWFkQ2hpbGRyZW4uZmluZChjaGlsZCA9PiBjaGlsZC5vdXRlckhUTUwgPT09IGN1cnJlbnRDaGlsZC5vdXRlckhUTUwpO1xuICAgIGlmICghZm91bmRJbkRvbUNoaWxkcmVuKSByZXN1bHQuY2hpbGRyZW5Ub1JlbW92ZS5wdXNoKGN1cnJlbnRDaGlsZCk7XG4gIH1cbiAgYXBwbHlIZWFkRGlmZnNUb0RvY3VtZW50KHJlc3VsdCk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5SGVhZERpZmZzVG9Eb2N1bWVudChkaWZmKSB7XG4gIGZvciAoY29uc3QgY2hpbGQgb2YgZGlmZi5jaGlsZHJlblRvUmVtb3ZlKSB7XG4gICAgLy8gUmVtb3ZlIGZyb20gaGVhZFxuICAgIGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICB9XG4gIGZvciAoY29uc3QgY2hpbGQgb2YgZGlmZi5jaGlsZHJlblRvQWRkKSB7XG4gICAgLy8gSGFuZGxlIHNjcmlwdCB0YWdzXG4gICAgaWYgKGNoaWxkPy5ub2RlTmFtZT8udG9Mb3dlckNhc2UoKSA9PSAnc2NyaXB0Jykge1xuICAgICAgY29uc3Qgc2NyaXB0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgcG9ydEF0dHJpYnV0ZXNUb0VsZW1lbnQoY2hpbGQsIHNjcmlwdEVsZW1lbnQpO1xuICAgICAgc2NyaXB0RWxlbWVudC5pbm5lckhUTUwgPSBjaGlsZC5pbm5lckhUTUw7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdEVsZW1lbnQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIEFkZCB0byB0aGUgaGVhZFxuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUJvZHlTY3JpcHRzKGRvbSkge1xuICBjb25zdCBzY3JpcHRzID0gWy4uLmRvbS5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpXTtcbiAgY29uc3QgbmV3RWxlbWVudHMgPSBbXTtcbiAgZm9yIChjb25zdCBzY3JpcHQgb2Ygc2NyaXB0cykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBwb3J0QXR0cmlidXRlc1RvRWxlbWVudChzY3JpcHQsIGVsZW1lbnQpO1xuICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gc2NyaXB0LmlubmVySFRNTDtcbiAgICBkb20uYm9keS5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgIG5ld0VsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gIH1cbiAgcmV0dXJuIG5ld0VsZW1lbnRzO1xufVxuXG5mdW5jdGlvbiBwb3J0QXR0cmlidXRlc1RvRWxlbWVudChvbGRFbCwgbmV3RWwpIHtcbiAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2Ygb2xkRWwuYXR0cmlidXRlcykge1xuICAgIG5ld0VsLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUubmFtZSwgYXR0cmlidXRlLm5vZGVWYWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UGVyc2lzdGVudE5vZGVzRnJvbURvY3VtZW50KGRvbSkge1xuICAvLyBGaW5kIHBlcnNpc3RlbnQgbm9kZXNcbiAgY29uc3QgcGVyc2lzdGVudE5vZGVzRnJvbURvbSA9IFsuLi5kb20ucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcGVyc2lzdGVudF0nKV0ubWFwKGVsID0+IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1wZXJzaXN0ZW50JykpO1xuICBjb25zdCBwZXJzaXN0ZW50Tm9kZXNGcm9tQm9keSA9IFsuLi5kb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXBlcnNpc3RlbnRdJyldO1xuICAvLyBDcm9zcyBtYXRjaCB0aGUgcGVyc2lzdGVudCBub2RlcyBiZXR3ZWVuIGN1cnJlbnQgcGFnZSBhbmQgbmV3IHBhZ2UgdG8gZmluZCB2YWxpZCBvbmVzXG4gIGNvbnN0IHZhbGlkUGVyc2lzdGVudE5vZGVzID0gcGVyc2lzdGVudE5vZGVzRnJvbUJvZHkuZmlsdGVyKGVsID0+IHtcbiAgICByZXR1cm4gcGVyc2lzdGVudE5vZGVzRnJvbURvbS5pbmNsdWRlcyhlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcGVyc2lzdGVudCcpKTtcbiAgfSk7XG4gIC8vIENsb25lXG4gIHJldHVybiB2YWxpZFBlcnNpc3RlbnROb2Rlcy5tYXAoZWwgPT4gZWwuY2xvbmVOb2RlKHRydWUpKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUF0dHJpYnV0ZXNPbkRvY3VtZW50Qm9keShkb20pIHtcbiAgd2hpbGUgKGRvY3VtZW50LmJvZHkuYXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVBdHRyaWJ1dGUoZG9jdW1lbnQuYm9keS5hdHRyaWJ1dGVzWzBdLm5hbWUpO1xuICB9XG4gIC8vIFNldCBhdHRyaWJ1dGVzIG9uIHRoZSBib2R5XG4gIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGRvbS5ib2R5LmF0dHJpYnV0ZXMpIHtcbiAgICBkb2N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUubmFtZSwgYXR0cmlidXRlLm5vZGVWYWx1ZSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlQmFja0J1dHRvbigpIHtcbiAgYXdhaXQgZ2V0TmV3UGFnZUNvbnRlbnQod2luZG93Lmhpc3Rvcnkuc3RhdGU/LnRhcmdldEhyZWYgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xufVxuXG5mdW5jdGlvbiBpc1JlbGF0aXZlVVJMKHVybCkge1xuICBpZiAodHlwZW9mIHVybCAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBuZXcgVVJMKHVybCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAodXJsPy5zdGFydHNXaXRoKCcvLycpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNFeHRlcm5hbFVSTCh1cmwpIHtcbiAgaWYgKGlzUmVsYXRpdmVVUkwodXJsKSkgcmV0dXJuIGZhbHNlO1xuICB0cnkge1xuICAgIGNvbnN0IGNvbXB1dGVkVVJMID0gbmV3IFVSTCh1cmwpO1xuICAgIHJldHVybiBjb21wdXRlZFVSTD8ub3JpZ2luICE9PSB3aW5kb3cubG9jYXRpb24/Lm9yaWdpbjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlOyAvLyBOb3QgYSBVUkxcbiAgfVxufVxuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHJlcGxhY2VEb2N1bWVudENvbnRlbnRzV2l0aExpbmtSZXNwb25zZSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCBoYW5kbGVCYWNrQnV0dG9uKTtcblxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVBLGVBQWUsMENBQTBDO0FBQ3ZELFFBQU0sUUFBUSxDQUFDLEdBQUcsU0FBUyxpQkFBaUIsWUFBWSxDQUFDO0FBQ3pELGFBQVcsUUFBUSxPQUFPO0FBQ3hCLFNBQUssaUJBQWlCLFNBQVMscUJBQXFCO0FBQUEsRUFDdEQ7QUFFRjtBQUVBLGVBQWUsc0JBQXNCLEdBQUc7QUFDdEMsUUFBTSxhQUFhLEdBQUcsUUFBUSxhQUFhLE1BQU07QUFDakQsTUFBSSxDQUFDLFdBQVk7QUFDakIsTUFBSSxjQUFjLFVBQVUsS0FBSyxDQUFDLEdBQUcsUUFBUSxhQUFhLHNCQUFzQixFQUFHO0FBQ25GLElBQUUsZUFBZTtBQUNqQixNQUFJO0FBQ0YsVUFBTSxrQkFBa0IsVUFBVTtBQUNsQyxRQUFJLGVBQWUsT0FBTyxTQUFTLFNBQVU7QUFDN0MsV0FBTyxRQUFRO0FBQUEsTUFDYjtBQUFBLFFBQ0UsTUFBTTtBQUFBLFFBQ047QUFBQSxNQUNGO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQ0EsVUFBTSxRQUFRLElBQUksWUFBWSxxQkFBcUI7QUFBQSxNQUNqRCxRQUFRO0FBQUEsUUFDTixNQUFNO0FBQUEsTUFDUjtBQUFBLElBQ0Ys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TyxPQUFPO0FBQzdDLGFBQVcsYUFBYSxNQUFNLFlBQVk7QUFDeEMsVUFBTSxhQUFhLFVBQVUsTUFBTSxVQUFVLFNBQVM7QUFBQSxFQUN4RDtBQUNGO0FBRUEsU0FBUywrQkFBK0IsS0FBSztBQUUzQyxRQUFNLHlCQUF5QixDQUFDLEdBQUcsSUFBSSxpQkFBaUIsbUJBQW1CLENBQUMsRUFBRSxJQUFJLFFBQU0sR0FBRyxhQUFhLGlCQUFpQixDQUFDO0FBQzFILFFBQU0sMEJBQTBCLENBQUMsR0FBRyxTQUFTLEtBQUssaUJBQWlCLG1CQUFtQixDQUFDO0FBRXZGLFFBQU0sdUJBQXVCLHdCQUF3QixPQUFPLFFBQU07QUFDaEUsV0FBTyx1QkFBdUIsU0FBUyxHQUFHLGFBQWEsaUJBQWlCLENBQUM7QUFBQSxFQUMzRSxDQUFDO0FBRUQsU0FBTyxxQkFBcUIsSUFBSSxRQUFNLEdBQUcsVUFBVSxJQUFJLENBQUM7QUFDMUQ7QUFFQSxTQUFTLGdDQUFnQyxLQUFLO0FBQzVDLFNBQU8sU0FBUyxLQUFLLFdBQVcsU0FBUyxHQUFHO0FBQzFDLGFBQVMsS0FBSyxnQkFBZ0IsU0FBUyxLQUFLLFdBQVcsQ0FBQyxFQUFFLElBQUk7QUFBQSxFQUNoRTtBQUVBLGFBQVcsYUFBYSxJQUFJLEtBQUssWUFBWTtBQUMzQyxhQUFTLEtBQUssYUFBYSxVQUFVLE1BQU0sVUFBVSxTQUFTO0FBQUEsRUFDaEU7QUFDRjtBQUVBLGVBQWUsbUJBQW1CO0FBQ2hDLFFBQU0sa0JBQWtCLE9BQU8sUUFBUSxPQUFPLGNBQWMsT0FBTyxTQUFTLElBQUk7QUFDbEY7QUFFQSxTQUFTLGNBQWMsS0FBSztBQUMxQixNQUFJLE9BQU8sUUFBUSxTQUFVLFFBQU87QUFDcEMsTUFBSTtBQUNGLFFBQUksSUFBSSxHQUFHO0FBQ1gsV0FBTztBQUFBLEVBQ1QsU0FBUyxLQUFLO0FBQ1osUUFBSSxLQUFLLFdBQVcsSUFBSSxFQUFHLFFBQU87QUFDbEMsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQUVBLFNBQVMsY0FBYyxLQUFLO0FBQzFCLE1BQUksY0FBYyxHQUFHLEVBQUcsUUFBTztBQUMvQixNQUFJO0FBQ0YsVUFBTSxjQUFjLElBQUksSUFBSSxHQUFHO0FBQy9CLFdBQU8sYUFBYSxXQUFXLE9BQU8sVUFBVTtBQUFBLEVBQ2xELFFBQVE7QUFDTixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBRUEsT0FBTyxpQkFBaUIsb0JBQW9CLHVDQUF1QztBQUNuRixPQUFPLGlCQUFpQixZQUFZLGdCQUFnQjsiLAogICJuYW1lcyI6IFtdCn0K
|
package/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export * from './src/runDevServer
|
|
2
|
-
export * from './src/express
|
|
3
|
-
export * from './src/util/env
|
|
1
|
+
export * from './src/runDevServer';
|
|
2
|
+
export * from './src/express';
|
|
3
|
+
export * from './src/util/env';
|
|
4
4
|
export * from './src/util/get-config';
|
|
5
|
-
export * from './src/scripts/build
|
|
5
|
+
export * from './src/scripts/build';
|
|
6
6
|
export * from './src/auth.ts';
|
|
7
|
-
export * from './src/util/html
|
|
7
|
+
export * from './src/util/html';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xpine",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@tailwindcss/postcss": "^4.0.8",
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
"type": "module",
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@types/express": "^5.0.0",
|
|
32
|
-
"@types/node": "^22.13.5"
|
|
32
|
+
"@types/node": "^22.13.5",
|
|
33
|
+
"@types/request-ip": "^0.0.41"
|
|
33
34
|
}
|
|
34
35
|
}
|
package/src/runDevServer.ts
CHANGED
|
@@ -3,10 +3,10 @@ import http from 'http';
|
|
|
3
3
|
import express from 'express';
|
|
4
4
|
import EventEmitter from 'events';
|
|
5
5
|
import chokidar from 'chokidar';
|
|
6
|
-
import { buildApp } from './scripts/build
|
|
6
|
+
import { buildApp } from './scripts/build';
|
|
7
7
|
import path from 'path';
|
|
8
8
|
import { config } from './util/get-config';
|
|
9
|
-
import { setupEnv } from './util/env
|
|
9
|
+
import { setupEnv } from './util/env';
|
|
10
10
|
|
|
11
11
|
setupEnv();
|
|
12
12
|
|
package/src/scripts/build.ts
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
convertEntryPointsToSingleFile,
|
|
8
8
|
findDataAttributesAndFunctions,
|
|
9
9
|
removeClientScriptInTSXFile
|
|
10
|
-
} from '../build/typescript-builder
|
|
10
|
+
} from '../build/typescript-builder';
|
|
11
11
|
import { globSync } from 'glob';
|
|
12
12
|
import postcss from 'postcss';
|
|
13
13
|
// @ts-ignore
|
package/src/scripts/xpine-dev.ts
CHANGED
package/src/util/get-config.ts
CHANGED
package/src/util/require.ts
CHANGED