xpine 0.0.4 → 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.
@@ -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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xpine",
3
- "version": "0.0.4",
3
+ "version": "0.0.5",
4
4
  "main": "dist/index.js",
5
5
  "dependencies": {
6
6
  "@tailwindcss/postcss": "^4.0.8",