diff --git a/Dockerfile b/Dockerfile index 5f08cfa..af2410a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,21 +1,22 @@ -FROM golang:1.22.2-alpine as build_go +FROM golang:1.23-alpine as build_go +RUN apk add --no-cache curl -COPY go.* /music-server/ -COPY ./cmd/*.go /music-server/cmd/ -COPY ./cmd/swagger /music-server/cmd/swagger -COPY ./cmd/search /music-server/cmd/search -COPY ./pkg /music-server/pkg/ -COPY ./db /music-server/db/ +WORKDIR /app -#WORKDIR /music-server/ -#RUN go mod download +COPY go.mod go.sum ./ +RUN go mod download -WORKDIR /music-server/cmd +COPY . . +RUN go install github.com/a-h/templ/cmd/templ@latest && \ + templ generate && \ + curl -sL https://github.com/tailwindlabs/tailwindcss/releases/latest/download/tailwindcss-linux-x64 -o tailwindcss && \ + chmod +x tailwindcss && \ + ./tailwindcss -i cmd/web/assets/css/input.css -o cmd/web/assets/css/output.css -RUN go build -o /music-server/MusicServer +RUN go build -o main cmd/main.go # Stage 2, distribution container -FROM golang:1.16-alpine +FROM golang:1.23-alpine EXPOSE 8080 VOLUME /sorted VOLUME /frontend @@ -26,7 +27,7 @@ ENV DB_USERNAME "" ENV DB_PASSWORD "" ENV DB_NAME "" -COPY --from=build_go /music-server/MusicServer . +COPY --from=build_go /app/main . COPY ./songs/ ./songs/ -CMD ./MusicServer +CMD ./main diff --git a/cmd/main.go b/cmd/main.go index e853666..ab112ee 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -8,13 +8,10 @@ import ( //go:embed swagger var swagger embed.FS -//go:embed search -var search embed.FS - func main() { conf.SetupDb() - conf.SetupRestServer(swagger, search) + conf.SetupRestServer(swagger) conf.CloseDb() } diff --git a/cmd/web/assets/css/input.css b/cmd/web/assets/css/input.css new file mode 100644 index 0000000..4c719af --- /dev/null +++ b/cmd/web/assets/css/input.css @@ -0,0 +1,20 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +#search-container { + text-align: center; +} + +#search_term { + width: 60vw; + font-size: 2vh; +} + +#clear { + font-size: 2vh; +} + +#games-container{ + font-size: 2vh; +} diff --git a/cmd/web/assets/js/htmx.min.js b/cmd/web/assets/js/htmx.min.js new file mode 100644 index 0000000..c909e02 --- /dev/null +++ b/cmd/web/assets/js/htmx.min.js @@ -0,0 +1,3476 @@ +var htmx = (function () { + "use strict"; + const Q = { + onLoad: null, + process: null, + on: null, + off: null, + trigger: null, + ajax: null, + find: null, + findAll: null, + closest: null, + values: function (e, t) { + const n = cn(e, t || "post"); + return n.values; + }, + remove: null, + addClass: null, + removeClass: null, + toggleClass: null, + takeClass: null, + swap: null, + defineExtension: null, + removeExtension: null, + logAll: null, + logNone: null, + logger: null, + config: { + historyEnabled: true, + historyCacheSize: 10, + refreshOnHistoryMiss: false, + defaultSwapStyle: "innerHTML", + defaultSwapDelay: 0, + defaultSettleDelay: 20, + includeIndicatorStyles: true, + indicatorClass: "htmx-indicator", + requestClass: "htmx-request", + addedClass: "htmx-added", + settlingClass: "htmx-settling", + swappingClass: "htmx-swapping", + allowEval: true, + allowScriptTags: true, + inlineScriptNonce: "", + inlineStyleNonce: "", + attributesToSettle: ["class", "style", "width", "height"], + withCredentials: false, + timeout: 0, + wsReconnectDelay: "full-jitter", + wsBinaryType: "blob", + disableSelector: "[hx-disable], [data-hx-disable]", + scrollBehavior: "instant", + defaultFocusScroll: false, + getCacheBusterParam: false, + globalViewTransitions: false, + methodsThatUseUrlParams: ["get", "delete"], + selfRequestsOnly: true, + ignoreTitle: false, + scrollIntoViewOnBoost: true, + triggerSpecsCache: null, + disableInheritance: false, + responseHandling: [ + { code: "204", swap: false }, + { code: "[23]..", swap: true }, + { code: "[45]..", swap: false, error: true }, + ], + allowNestedOobSwaps: true, + }, + parseInterval: null, + _: null, + version: "2.0.3", + }; + Q.onLoad = j; + Q.process = kt; + Q.on = ye; + Q.off = be; + Q.trigger = de; + Q.ajax = Rn; + Q.find = r; + Q.findAll = x; + Q.closest = g; + Q.remove = z; + Q.addClass = K; + Q.removeClass = G; + Q.toggleClass = W; + Q.takeClass = Z; + Q.swap = $e; + Q.defineExtension = Fn; + Q.removeExtension = Bn; + Q.logAll = V; + Q.logNone = _; + Q.parseInterval = h; + Q._ = e; + const n = { + addTriggerHandler: St, + bodyContains: le, + canAccessLocalStorage: B, + findThisElement: Se, + filterValues: dn, + swap: $e, + hasAttribute: s, + getAttributeValue: te, + getClosestAttributeValue: re, + getClosestMatch: i, + getExpressionVars: En, + getHeaders: fn, + getInputValues: cn, + getInternalData: ie, + getSwapSpecification: gn, + getTriggerSpecs: st, + getTarget: Ee, + makeFragment: P, + mergeObjects: ce, + makeSettleInfo: xn, + oobSwap: He, + querySelectorExt: ae, + settleImmediately: Kt, + shouldCancel: dt, + triggerEvent: de, + triggerErrorEvent: fe, + withExtensions: Ft, + }; + const o = ["get", "post", "put", "delete", "patch"]; + const R = o + .map(function (e) { + return "[hx-" + e + "], [data-hx-" + e + "]"; + }) + .join(", "); + function h(e) { + if (e == undefined) { + return undefined; + } + let t = NaN; + if (e.slice(-2) == "ms") { + t = parseFloat(e.slice(0, -2)); + } else if (e.slice(-1) == "s") { + t = parseFloat(e.slice(0, -1)) * 1e3; + } else if (e.slice(-1) == "m") { + t = parseFloat(e.slice(0, -1)) * 1e3 * 60; + } else { + t = parseFloat(e); + } + return isNaN(t) ? undefined : t; + } + function ee(e, t) { + return e instanceof Element && e.getAttribute(t); + } + function s(e, t) { + return ( + !!e.hasAttribute && (e.hasAttribute(t) || e.hasAttribute("data-" + t)) + ); + } + function te(e, t) { + return ee(e, t) || ee(e, "data-" + t); + } + function c(e) { + const t = e.parentElement; + if (!t && e.parentNode instanceof ShadowRoot) return e.parentNode; + return t; + } + function ne() { + return document; + } + function m(e, t) { + return e.getRootNode ? e.getRootNode({ composed: t }) : ne(); + } + function i(e, t) { + while (e && !t(e)) { + e = c(e); + } + return e || null; + } + function H(e, t, n) { + const r = te(t, n); + const o = te(t, "hx-disinherit"); + var i = te(t, "hx-inherit"); + if (e !== t) { + if (Q.config.disableInheritance) { + if (i && (i === "*" || i.split(" ").indexOf(n) >= 0)) { + return r; + } else { + return null; + } + } + if (o && (o === "*" || o.split(" ").indexOf(n) >= 0)) { + return "unset"; + } + } + return r; + } + function re(t, n) { + let r = null; + i(t, function (e) { + return !!(r = H(t, ue(e), n)); + }); + if (r !== "unset") { + return r; + } + } + function d(e, t) { + const n = + e instanceof Element && + (e.matches || + e.matchesSelector || + e.msMatchesSelector || + e.mozMatchesSelector || + e.webkitMatchesSelector || + e.oMatchesSelector); + return !!n && n.call(e, t); + } + function T(e) { + const t = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i; + const n = t.exec(e); + if (n) { + return n[1].toLowerCase(); + } else { + return ""; + } + } + function q(e) { + const t = new DOMParser(); + return t.parseFromString(e, "text/html"); + } + function L(e, t) { + while (t.childNodes.length > 0) { + e.append(t.childNodes[0]); + } + } + function N(e) { + const t = ne().createElement("script"); + se(e.attributes, function (e) { + t.setAttribute(e.name, e.value); + }); + t.textContent = e.textContent; + t.async = false; + if (Q.config.inlineScriptNonce) { + t.nonce = Q.config.inlineScriptNonce; + } + return t; + } + function A(e) { + return ( + e.matches("script") && + (e.type === "text/javascript" || e.type === "module" || e.type === "") + ); + } + function I(e) { + Array.from(e.querySelectorAll("script")).forEach((e) => { + if (A(e)) { + const t = N(e); + const n = e.parentNode; + try { + n.insertBefore(t, e); + } catch (e) { + C(e); + } finally { + e.remove(); + } + } + }); + } + function P(e) { + const t = e.replace(/]*)?>[\s\S]*?<\/head>/i, ""); + const n = T(t); + let r; + if (n === "html") { + r = new DocumentFragment(); + const i = q(e); + L(r, i.body); + r.title = i.title; + } else if (n === "body") { + r = new DocumentFragment(); + const i = q(t); + L(r, i.body); + r.title = i.title; + } else { + const i = q( + '", + ); + r = i.querySelector("template").content; + r.title = i.title; + var o = r.querySelector("title"); + if (o && o.parentNode === r) { + o.remove(); + r.title = o.innerText; + } + } + if (r) { + if (Q.config.allowScriptTags) { + I(r); + } else { + r.querySelectorAll("script").forEach((e) => e.remove()); + } + } + return r; + } + function oe(e) { + if (e) { + e(); + } + } + function t(e, t) { + return Object.prototype.toString.call(e) === "[object " + t + "]"; + } + function k(e) { + return typeof e === "function"; + } + function D(e) { + return t(e, "Object"); + } + function ie(e) { + const t = "htmx-internal-data"; + let n = e[t]; + if (!n) { + n = e[t] = {}; + } + return n; + } + function M(t) { + const n = []; + if (t) { + for (let e = 0; e < t.length; e++) { + n.push(t[e]); + } + } + return n; + } + function se(t, n) { + if (t) { + for (let e = 0; e < t.length; e++) { + n(t[e]); + } + } + } + function X(e) { + const t = e.getBoundingClientRect(); + const n = t.top; + const r = t.bottom; + return n < window.innerHeight && r >= 0; + } + function le(e) { + const t = e.getRootNode && e.getRootNode(); + if (t && t instanceof window.ShadowRoot) { + return ne().body.contains(t.host); + } else { + return ne().body.contains(e); + } + } + function F(e) { + return e.trim().split(/\s+/); + } + function ce(e, t) { + for (const n in t) { + if (t.hasOwnProperty(n)) { + e[n] = t[n]; + } + } + return e; + } + function S(e) { + try { + return JSON.parse(e); + } catch (e) { + C(e); + return null; + } + } + function B() { + const e = "htmx:localStorageTest"; + try { + localStorage.setItem(e, e); + localStorage.removeItem(e); + return true; + } catch (e) { + return false; + } + } + function U(t) { + try { + const e = new URL(t); + if (e) { + t = e.pathname + e.search; + } + if (!/^\/$/.test(t)) { + t = t.replace(/\/+$/, ""); + } + return t; + } catch (e) { + return t; + } + } + function e(e) { + return vn(ne().body, function () { + return eval(e); + }); + } + function j(t) { + const e = Q.on("htmx:load", function (e) { + t(e.detail.elt); + }); + return e; + } + function V() { + Q.logger = function (e, t, n) { + if (console) { + console.log(t, e, n); + } + }; + } + function _() { + Q.logger = null; + } + function r(e, t) { + if (typeof e !== "string") { + return e.querySelector(t); + } else { + return r(ne(), e); + } + } + function x(e, t) { + if (typeof e !== "string") { + return e.querySelectorAll(t); + } else { + return x(ne(), e); + } + } + function E() { + return window; + } + function z(e, t) { + e = y(e); + if (t) { + E().setTimeout(function () { + z(e); + e = null; + }, t); + } else { + c(e).removeChild(e); + } + } + function ue(e) { + return e instanceof Element ? e : null; + } + function $(e) { + return e instanceof HTMLElement ? e : null; + } + function J(e) { + return typeof e === "string" ? e : null; + } + function f(e) { + return e instanceof Element || + e instanceof Document || + e instanceof DocumentFragment + ? e + : null; + } + function K(e, t, n) { + e = ue(y(e)); + if (!e) { + return; + } + if (n) { + E().setTimeout(function () { + K(e, t); + e = null; + }, n); + } else { + e.classList && e.classList.add(t); + } + } + function G(e, t, n) { + let r = ue(y(e)); + if (!r) { + return; + } + if (n) { + E().setTimeout(function () { + G(r, t); + r = null; + }, n); + } else { + if (r.classList) { + r.classList.remove(t); + if (r.classList.length === 0) { + r.removeAttribute("class"); + } + } + } + } + function W(e, t) { + e = y(e); + e.classList.toggle(t); + } + function Z(e, t) { + e = y(e); + se(e.parentElement.children, function (e) { + G(e, t); + }); + K(ue(e), t); + } + function g(e, t) { + e = ue(y(e)); + if (e && e.closest) { + return e.closest(t); + } else { + do { + if (e == null || d(e, t)) { + return e; + } + } while ((e = e && ue(c(e)))); + return null; + } + } + function l(e, t) { + return e.substring(0, t.length) === t; + } + function Y(e, t) { + return e.substring(e.length - t.length) === t; + } + function ge(e) { + const t = e.trim(); + if (l(t, "<") && Y(t, "/>")) { + return t.substring(1, t.length - 2); + } else { + return t; + } + } + function p(e, t, n) { + e = y(e); + if (t.indexOf("closest ") === 0) { + return [g(ue(e), ge(t.substr(8)))]; + } else if (t.indexOf("find ") === 0) { + return [r(f(e), ge(t.substr(5)))]; + } else if (t === "next") { + return [ue(e).nextElementSibling]; + } else if (t.indexOf("next ") === 0) { + return [pe(e, ge(t.substr(5)), !!n)]; + } else if (t === "previous") { + return [ue(e).previousElementSibling]; + } else if (t.indexOf("previous ") === 0) { + return [me(e, ge(t.substr(9)), !!n)]; + } else if (t === "document") { + return [document]; + } else if (t === "window") { + return [window]; + } else if (t === "body") { + return [document.body]; + } else if (t === "root") { + return [m(e, !!n)]; + } else if (t === "host") { + return [e.getRootNode().host]; + } else if (t.indexOf("global ") === 0) { + return p(e, t.slice(7), true); + } else { + return M(f(m(e, !!n)).querySelectorAll(ge(t))); + } + } + var pe = function (t, e, n) { + const r = f(m(t, n)).querySelectorAll(e); + for (let e = 0; e < r.length; e++) { + const o = r[e]; + if (o.compareDocumentPosition(t) === Node.DOCUMENT_POSITION_PRECEDING) { + return o; + } + } + }; + var me = function (t, e, n) { + const r = f(m(t, n)).querySelectorAll(e); + for (let e = r.length - 1; e >= 0; e--) { + const o = r[e]; + if (o.compareDocumentPosition(t) === Node.DOCUMENT_POSITION_FOLLOWING) { + return o; + } + } + }; + function ae(e, t) { + if (typeof e !== "string") { + return p(e, t)[0]; + } else { + return p(ne().body, e)[0]; + } + } + function y(e, t) { + if (typeof e === "string") { + return r(f(t) || document, e); + } else { + return e; + } + } + function xe(e, t, n, r) { + if (k(t)) { + return { target: ne().body, event: J(e), listener: t, options: n }; + } else { + return { target: y(e), event: J(t), listener: n, options: r }; + } + } + function ye(t, n, r, o) { + Vn(function () { + const e = xe(t, n, r, o); + e.target.addEventListener(e.event, e.listener, e.options); + }); + const e = k(n); + return e ? n : r; + } + function be(t, n, r) { + Vn(function () { + const e = xe(t, n, r); + e.target.removeEventListener(e.event, e.listener); + }); + return k(n) ? n : r; + } + const ve = ne().createElement("output"); + function we(e, t) { + const n = re(e, t); + if (n) { + if (n === "this") { + return [Se(e, t)]; + } else { + const r = p(e, n); + if (r.length === 0) { + C('The selector "' + n + '" on ' + t + " returned no matches!"); + return [ve]; + } else { + return r; + } + } + } + } + function Se(e, t) { + return ue( + i(e, function (e) { + return te(ue(e), t) != null; + }), + ); + } + function Ee(e) { + const t = re(e, "hx-target"); + if (t) { + if (t === "this") { + return Se(e, "hx-target"); + } else { + return ae(e, t); + } + } else { + const n = ie(e); + if (n.boosted) { + return ne().body; + } else { + return e; + } + } + } + function Ce(t) { + const n = Q.config.attributesToSettle; + for (let e = 0; e < n.length; e++) { + if (t === n[e]) { + return true; + } + } + return false; + } + function Oe(t, n) { + se(t.attributes, function (e) { + if (!n.hasAttribute(e.name) && Ce(e.name)) { + t.removeAttribute(e.name); + } + }); + se(n.attributes, function (e) { + if (Ce(e.name)) { + t.setAttribute(e.name, e.value); + } + }); + } + function Re(t, e) { + const n = Un(e); + for (let e = 0; e < n.length; e++) { + const r = n[e]; + try { + if (r.isInlineSwap(t)) { + return true; + } + } catch (e) { + C(e); + } + } + return t === "outerHTML"; + } + function He(e, o, i, t) { + t = t || ne(); + let n = "#" + ee(o, "id"); + let s = "outerHTML"; + if (e === "true") { + } else if (e.indexOf(":") > 0) { + s = e.substr(0, e.indexOf(":")); + n = e.substr(e.indexOf(":") + 1, e.length); + } else { + s = e; + } + o.removeAttribute("hx-swap-oob"); + o.removeAttribute("data-hx-swap-oob"); + const r = p(t, n, false); + if (r) { + se(r, function (e) { + let t; + const n = o.cloneNode(true); + t = ne().createDocumentFragment(); + t.appendChild(n); + if (!Re(s, e)) { + t = f(n); + } + const r = { shouldSwap: true, target: e, fragment: t }; + if (!de(e, "htmx:oobBeforeSwap", r)) return; + e = r.target; + if (r.shouldSwap) { + qe(t); + _e(s, e, e, t, i); + Te(); + } + se(i.elts, function (e) { + de(e, "htmx:oobAfterSwap", r); + }); + }); + o.parentNode.removeChild(o); + } else { + o.parentNode.removeChild(o); + fe(ne().body, "htmx:oobErrorNoTarget", { content: o }); + } + return e; + } + function Te() { + const e = r("#--htmx-preserve-pantry--"); + if (e) { + for (const t of [...e.children]) { + const n = r("#" + t.id); + n.parentNode.moveBefore(t, n); + n.remove(); + } + e.remove(); + } + } + function qe(e) { + se(x(e, "[hx-preserve], [data-hx-preserve]"), function (e) { + const t = te(e, "id"); + const n = ne().getElementById(t); + if (n != null) { + if (e.moveBefore) { + let e = r("#--htmx-preserve-pantry--"); + if (e == null) { + ne().body.insertAdjacentHTML( + "afterend", + "
", + ); + e = r("#--htmx-preserve-pantry--"); + } + e.moveBefore(n, null); + } else { + e.parentNode.replaceChild(n, e); + } + } + }); + } + function Le(l, e, c) { + se(e.querySelectorAll("[id]"), function (t) { + const n = ee(t, "id"); + if (n && n.length > 0) { + const r = n.replace("'", "\\'"); + const o = t.tagName.replace(":", "\\:"); + const e = f(l); + const i = e && e.querySelector(o + "[id='" + r + "']"); + if (i && i !== e) { + const s = t.cloneNode(); + Oe(t, i); + c.tasks.push(function () { + Oe(t, s); + }); + } + } + }); + } + function Ne(e) { + return function () { + G(e, Q.config.addedClass); + kt(ue(e)); + Ae(f(e)); + de(e, "htmx:load"); + }; + } + function Ae(e) { + const t = "[autofocus]"; + const n = $(d(e, t) ? e : e.querySelector(t)); + if (n != null) { + n.focus(); + } + } + function u(e, t, n, r) { + Le(e, n, r); + while (n.childNodes.length > 0) { + const o = n.firstChild; + K(ue(o), Q.config.addedClass); + e.insertBefore(o, t); + if (o.nodeType !== Node.TEXT_NODE && o.nodeType !== Node.COMMENT_NODE) { + r.tasks.push(Ne(o)); + } + } + } + function Ie(e, t) { + let n = 0; + while (n < e.length) { + t = ((t << 5) - t + e.charCodeAt(n++)) | 0; + } + return t; + } + function Pe(t) { + let n = 0; + if (t.attributes) { + for (let e = 0; e < t.attributes.length; e++) { + const r = t.attributes[e]; + if (r.value) { + n = Ie(r.name, n); + n = Ie(r.value, n); + } + } + } + return n; + } + function ke(t) { + const n = ie(t); + if (n.onHandlers) { + for (let e = 0; e < n.onHandlers.length; e++) { + const r = n.onHandlers[e]; + be(t, r.event, r.listener); + } + delete n.onHandlers; + } + } + function De(e) { + const t = ie(e); + if (t.timeout) { + clearTimeout(t.timeout); + } + if (t.listenerInfos) { + se(t.listenerInfos, function (e) { + if (e.on) { + be(e.on, e.trigger, e.listener); + } + }); + } + ke(e); + se(Object.keys(t), function (e) { + delete t[e]; + }); + } + function a(e) { + de(e, "htmx:beforeCleanupElement"); + De(e); + if (e.children) { + se(e.children, function (e) { + a(e); + }); + } + } + function Me(t, e, n) { + if (t instanceof Element && t.tagName === "BODY") { + return Ve(t, e, n); + } + let r; + const o = t.previousSibling; + const i = c(t); + if (!i) { + return; + } + u(i, t, e, n); + if (o == null) { + r = i.firstChild; + } else { + r = o.nextSibling; + } + n.elts = n.elts.filter(function (e) { + return e !== t; + }); + while (r && r !== t) { + if (r instanceof Element) { + n.elts.push(r); + } + r = r.nextSibling; + } + a(t); + if (t instanceof Element) { + t.remove(); + } else { + t.parentNode.removeChild(t); + } + } + function Xe(e, t, n) { + return u(e, e.firstChild, t, n); + } + function Fe(e, t, n) { + return u(c(e), e, t, n); + } + function Be(e, t, n) { + return u(e, null, t, n); + } + function Ue(e, t, n) { + return u(c(e), e.nextSibling, t, n); + } + function je(e) { + a(e); + const t = c(e); + if (t) { + return t.removeChild(e); + } + } + function Ve(e, t, n) { + const r = e.firstChild; + u(e, r, t, n); + if (r) { + while (r.nextSibling) { + a(r.nextSibling); + e.removeChild(r.nextSibling); + } + a(r); + e.removeChild(r); + } + } + function _e(t, e, n, r, o) { + switch (t) { + case "none": + return; + case "outerHTML": + Me(n, r, o); + return; + case "afterbegin": + Xe(n, r, o); + return; + case "beforebegin": + Fe(n, r, o); + return; + case "beforeend": + Be(n, r, o); + return; + case "afterend": + Ue(n, r, o); + return; + case "delete": + je(n); + return; + default: + var i = Un(e); + for (let e = 0; e < i.length; e++) { + const s = i[e]; + try { + const l = s.handleSwap(t, n, r, o); + if (l) { + if (Array.isArray(l)) { + for (let e = 0; e < l.length; e++) { + const c = l[e]; + if ( + c.nodeType !== Node.TEXT_NODE && + c.nodeType !== Node.COMMENT_NODE + ) { + o.tasks.push(Ne(c)); + } + } + } + return; + } + } catch (e) { + C(e); + } + } + if (t === "innerHTML") { + Ve(n, r, o); + } else { + _e(Q.config.defaultSwapStyle, e, n, r, o); + } + } + } + function ze(e, n, r) { + var t = x(e, "[hx-swap-oob], [data-hx-swap-oob]"); + se(t, function (e) { + if (Q.config.allowNestedOobSwaps || e.parentElement === null) { + const t = te(e, "hx-swap-oob"); + if (t != null) { + He(t, e, n, r); + } + } else { + e.removeAttribute("hx-swap-oob"); + e.removeAttribute("data-hx-swap-oob"); + } + }); + return t.length > 0; + } + function $e(e, t, r, o) { + if (!o) { + o = {}; + } + e = y(e); + const i = o.contextElement ? m(o.contextElement, false) : ne(); + const n = document.activeElement; + let s = {}; + try { + s = { + elt: n, + start: n ? n.selectionStart : null, + end: n ? n.selectionEnd : null, + }; + } catch (e) {} + const l = xn(e); + if (r.swapStyle === "textContent") { + e.textContent = t; + } else { + let n = P(t); + l.title = n.title; + if (o.selectOOB) { + const u = o.selectOOB.split(","); + for (let t = 0; t < u.length; t++) { + const a = u[t].split(":", 2); + let e = a[0].trim(); + if (e.indexOf("#") === 0) { + e = e.substring(1); + } + const f = a[1] || "true"; + const d = n.querySelector("#" + e); + if (d) { + He(f, d, l, i); + } + } + } + ze(n, l, i); + se(x(n, "template"), function (e) { + if (ze(e.content, l, i)) { + e.remove(); + } + }); + if (o.select) { + const h = ne().createDocumentFragment(); + se(n.querySelectorAll(o.select), function (e) { + h.appendChild(e); + }); + n = h; + } + qe(n); + _e(r.swapStyle, o.contextElement, e, n, l); + Te(); + } + if (s.elt && !le(s.elt) && ee(s.elt, "id")) { + const g = document.getElementById(ee(s.elt, "id")); + const p = { + preventScroll: + r.focusScroll !== undefined + ? !r.focusScroll + : !Q.config.defaultFocusScroll, + }; + if (g) { + if (s.start && g.setSelectionRange) { + try { + g.setSelectionRange(s.start, s.end); + } catch (e) {} + } + g.focus(p); + } + } + e.classList.remove(Q.config.swappingClass); + se(l.elts, function (e) { + if (e.classList) { + e.classList.add(Q.config.settlingClass); + } + de(e, "htmx:afterSwap", o.eventInfo); + }); + if (o.afterSwapCallback) { + o.afterSwapCallback(); + } + if (!r.ignoreTitle) { + kn(l.title); + } + const c = function () { + se(l.tasks, function (e) { + e.call(); + }); + se(l.elts, function (e) { + if (e.classList) { + e.classList.remove(Q.config.settlingClass); + } + de(e, "htmx:afterSettle", o.eventInfo); + }); + if (o.anchor) { + const e = ue(y("#" + o.anchor)); + if (e) { + e.scrollIntoView({ block: "start", behavior: "auto" }); + } + } + yn(l.elts, r); + if (o.afterSettleCallback) { + o.afterSettleCallback(); + } + }; + if (r.settleDelay > 0) { + E().setTimeout(c, r.settleDelay); + } else { + c(); + } + } + function Je(e, t, n) { + const r = e.getResponseHeader(t); + if (r.indexOf("{") === 0) { + const o = S(r); + for (const i in o) { + if (o.hasOwnProperty(i)) { + let e = o[i]; + if (D(e)) { + n = e.target !== undefined ? e.target : n; + } else { + e = { value: e }; + } + de(n, i, e); + } + } + } else { + const s = r.split(","); + for (let e = 0; e < s.length; e++) { + de(n, s[e].trim(), []); + } + } + } + const Ke = /\s/; + const b = /[\s,]/; + const Ge = /[_$a-zA-Z]/; + const We = /[_$a-zA-Z0-9]/; + const Ze = ['"', "'", "/"]; + const v = /[^\s]/; + const Ye = /[{(]/; + const Qe = /[})]/; + function et(e) { + const t = []; + let n = 0; + while (n < e.length) { + if (Ge.exec(e.charAt(n))) { + var r = n; + while (We.exec(e.charAt(n + 1))) { + n++; + } + t.push(e.substr(r, n - r + 1)); + } else if (Ze.indexOf(e.charAt(n)) !== -1) { + const o = e.charAt(n); + var r = n; + n++; + while (n < e.length && e.charAt(n) !== o) { + if (e.charAt(n) === "\\") { + n++; + } + n++; + } + t.push(e.substr(r, n - r + 1)); + } else { + const i = e.charAt(n); + t.push(i); + } + n++; + } + return t; + } + function tt(e, t, n) { + return ( + Ge.exec(e.charAt(0)) && + e !== "true" && + e !== "false" && + e !== "this" && + e !== n && + t !== "." + ); + } + function nt(r, o, i) { + if (o[0] === "[") { + o.shift(); + let e = 1; + let t = " return (function(" + i + "){ return ("; + let n = null; + while (o.length > 0) { + const s = o[0]; + if (s === "]") { + e--; + if (e === 0) { + if (n === null) { + t = t + "true"; + } + o.shift(); + t += ")})"; + try { + const l = vn( + r, + function () { + return Function(t)(); + }, + function () { + return true; + }, + ); + l.source = t; + return l; + } catch (e) { + fe(ne().body, "htmx:syntax:error", { error: e, source: t }); + return null; + } + } + } else if (s === "[") { + e++; + } + if (tt(s, n, i)) { + t += + "((" + + i + + "." + + s + + ") ? (" + + i + + "." + + s + + ") : (window." + + s + + "))"; + } else { + t = t + s; + } + n = o.shift(); + } + } + } + function w(e, t) { + let n = ""; + while (e.length > 0 && !t.test(e[0])) { + n += e.shift(); + } + return n; + } + function rt(e) { + let t; + if (e.length > 0 && Ye.test(e[0])) { + e.shift(); + t = w(e, Qe).trim(); + e.shift(); + } else { + t = w(e, b); + } + return t; + } + const ot = "input, textarea, select"; + function it(e, t, n) { + const r = []; + const o = et(t); + do { + w(o, v); + const l = o.length; + const c = w(o, /[,\[\s]/); + if (c !== "") { + if (c === "every") { + const u = { trigger: "every" }; + w(o, v); + u.pollInterval = h(w(o, /[,\[\s]/)); + w(o, v); + var i = nt(e, o, "event"); + if (i) { + u.eventFilter = i; + } + r.push(u); + } else { + const a = { trigger: c }; + var i = nt(e, o, "event"); + if (i) { + a.eventFilter = i; + } + w(o, v); + while (o.length > 0 && o[0] !== ",") { + const f = o.shift(); + if (f === "changed") { + a.changed = true; + } else if (f === "once") { + a.once = true; + } else if (f === "consume") { + a.consume = true; + } else if (f === "delay" && o[0] === ":") { + o.shift(); + a.delay = h(w(o, b)); + } else if (f === "from" && o[0] === ":") { + o.shift(); + if (Ye.test(o[0])) { + var s = rt(o); + } else { + var s = w(o, b); + if ( + s === "closest" || + s === "find" || + s === "next" || + s === "previous" + ) { + o.shift(); + const d = rt(o); + if (d.length > 0) { + s += " " + d; + } + } + } + a.from = s; + } else if (f === "target" && o[0] === ":") { + o.shift(); + a.target = rt(o); + } else if (f === "throttle" && o[0] === ":") { + o.shift(); + a.throttle = h(w(o, b)); + } else if (f === "queue" && o[0] === ":") { + o.shift(); + a.queue = w(o, b); + } else if (f === "root" && o[0] === ":") { + o.shift(); + a[f] = rt(o); + } else if (f === "threshold" && o[0] === ":") { + o.shift(); + a[f] = w(o, b); + } else { + fe(e, "htmx:syntax:error", { token: o.shift() }); + } + w(o, v); + } + r.push(a); + } + } + if (o.length === l) { + fe(e, "htmx:syntax:error", { token: o.shift() }); + } + w(o, v); + } while (o[0] === "," && o.shift()); + if (n) { + n[t] = r; + } + return r; + } + function st(e) { + const t = te(e, "hx-trigger"); + let n = []; + if (t) { + const r = Q.config.triggerSpecsCache; + n = (r && r[t]) || it(e, t, r); + } + if (n.length > 0) { + return n; + } else if (d(e, "form")) { + return [{ trigger: "submit" }]; + } else if (d(e, 'input[type="button"], input[type="submit"]')) { + return [{ trigger: "click" }]; + } else if (d(e, ot)) { + return [{ trigger: "change" }]; + } else { + return [{ trigger: "click" }]; + } + } + function lt(e) { + ie(e).cancelled = true; + } + function ct(e, t, n) { + const r = ie(e); + r.timeout = E().setTimeout(function () { + if (le(e) && r.cancelled !== true) { + if (!gt(n, e, Mt("hx:poll:trigger", { triggerSpec: n, target: e }))) { + t(e); + } + ct(e, t, n); + } + }, n.pollInterval); + } + function ut(e) { + return ( + location.hostname === e.hostname && + ee(e, "href") && + ee(e, "href").indexOf("#") !== 0 + ); + } + function at(e) { + return g(e, Q.config.disableSelector); + } + function ft(t, n, e) { + if ( + (t instanceof HTMLAnchorElement && + ut(t) && + (t.target === "" || t.target === "_self")) || + (t.tagName === "FORM" && + String(ee(t, "method")).toLowerCase() !== "dialog") + ) { + n.boosted = true; + let r, o; + if (t.tagName === "A") { + r = "get"; + o = ee(t, "href"); + } else { + const i = ee(t, "method"); + r = i ? i.toLowerCase() : "get"; + o = ee(t, "action"); + if (r === "get" && o.includes("?")) { + o = o.replace(/\?[^#]+/, ""); + } + } + e.forEach(function (e) { + pt( + t, + function (e, t) { + const n = ue(e); + if (at(n)) { + a(n); + return; + } + he(r, o, n, t); + }, + n, + e, + true, + ); + }); + } + } + function dt(e, t) { + const n = ue(t); + if (!n) { + return false; + } + if (e.type === "submit" || e.type === "click") { + if (n.tagName === "FORM") { + return true; + } + if (d(n, 'input[type="submit"], button') && g(n, "form") !== null) { + return true; + } + if ( + n instanceof HTMLAnchorElement && + n.href && + (n.getAttribute("href") === "#" || + n.getAttribute("href").indexOf("#") !== 0) + ) { + return true; + } + } + return false; + } + function ht(e, t) { + return ( + ie(e).boosted && + e instanceof HTMLAnchorElement && + t.type === "click" && + (t.ctrlKey || t.metaKey) + ); + } + function gt(e, t, n) { + const r = e.eventFilter; + if (r) { + try { + return r.call(t, n) !== true; + } catch (e) { + const o = r.source; + fe(ne().body, "htmx:eventFilter:error", { error: e, source: o }); + return true; + } + } + return false; + } + function pt(l, c, e, u, a) { + const f = ie(l); + let t; + if (u.from) { + t = p(l, u.from); + } else { + t = [l]; + } + if (u.changed) { + if (!("lastValue" in f)) { + f.lastValue = new WeakMap(); + } + t.forEach(function (e) { + if (!f.lastValue.has(u)) { + f.lastValue.set(u, new WeakMap()); + } + f.lastValue.get(u).set(e, e.value); + }); + } + se(t, function (i) { + const s = function (e) { + if (!le(l)) { + i.removeEventListener(u.trigger, s); + return; + } + if (ht(l, e)) { + return; + } + if (a || dt(e, l)) { + e.preventDefault(); + } + if (gt(u, l, e)) { + return; + } + const t = ie(e); + t.triggerSpec = u; + if (t.handledFor == null) { + t.handledFor = []; + } + if (t.handledFor.indexOf(l) < 0) { + t.handledFor.push(l); + if (u.consume) { + e.stopPropagation(); + } + if (u.target && e.target) { + if (!d(ue(e.target), u.target)) { + return; + } + } + if (u.once) { + if (f.triggeredOnce) { + return; + } else { + f.triggeredOnce = true; + } + } + if (u.changed) { + const n = event.target; + const r = n.value; + const o = f.lastValue.get(u); + if (o.has(n) && o.get(n) === r) { + return; + } + o.set(n, r); + } + if (f.delayed) { + clearTimeout(f.delayed); + } + if (f.throttle) { + return; + } + if (u.throttle > 0) { + if (!f.throttle) { + de(l, "htmx:trigger"); + c(l, e); + f.throttle = E().setTimeout(function () { + f.throttle = null; + }, u.throttle); + } + } else if (u.delay > 0) { + f.delayed = E().setTimeout(function () { + de(l, "htmx:trigger"); + c(l, e); + }, u.delay); + } else { + de(l, "htmx:trigger"); + c(l, e); + } + } + }; + if (e.listenerInfos == null) { + e.listenerInfos = []; + } + e.listenerInfos.push({ trigger: u.trigger, listener: s, on: i }); + i.addEventListener(u.trigger, s); + }); + } + let mt = false; + let xt = null; + function yt() { + if (!xt) { + xt = function () { + mt = true; + }; + window.addEventListener("scroll", xt); + window.addEventListener("resize", xt); + setInterval(function () { + if (mt) { + mt = false; + se( + ne().querySelectorAll( + "[hx-trigger*='revealed'],[data-hx-trigger*='revealed']", + ), + function (e) { + bt(e); + }, + ); + } + }, 200); + } + } + function bt(e) { + if (!s(e, "data-hx-revealed") && X(e)) { + e.setAttribute("data-hx-revealed", "true"); + const t = ie(e); + if (t.initHash) { + de(e, "revealed"); + } else { + e.addEventListener( + "htmx:afterProcessNode", + function () { + de(e, "revealed"); + }, + { once: true }, + ); + } + } + } + function vt(e, t, n, r) { + const o = function () { + if (!n.loaded) { + n.loaded = true; + t(e); + } + }; + if (r > 0) { + E().setTimeout(o, r); + } else { + o(); + } + } + function wt(t, n, e) { + let i = false; + se(o, function (r) { + if (s(t, "hx-" + r)) { + const o = te(t, "hx-" + r); + i = true; + n.path = o; + n.verb = r; + e.forEach(function (e) { + St(t, e, n, function (e, t) { + const n = ue(e); + if (g(n, Q.config.disableSelector)) { + a(n); + return; + } + he(r, o, n, t); + }); + }); + } + }); + return i; + } + function St(r, e, t, n) { + if (e.trigger === "revealed") { + yt(); + pt(r, n, t, e); + bt(ue(r)); + } else if (e.trigger === "intersect") { + const o = {}; + if (e.root) { + o.root = ae(r, e.root); + } + if (e.threshold) { + o.threshold = parseFloat(e.threshold); + } + const i = new IntersectionObserver(function (t) { + for (let e = 0; e < t.length; e++) { + const n = t[e]; + if (n.isIntersecting) { + de(r, "intersect"); + break; + } + } + }, o); + i.observe(ue(r)); + pt(ue(r), n, t, e); + } else if (e.trigger === "load") { + if (!gt(e, r, Mt("load", { elt: r }))) { + vt(ue(r), n, t, e.delay); + } + } else if (e.pollInterval > 0) { + t.polling = true; + ct(ue(r), n, e); + } else { + pt(r, n, t, e); + } + } + function Et(e) { + const t = ue(e); + if (!t) { + return false; + } + const n = t.attributes; + for (let e = 0; e < n.length; e++) { + const r = n[e].name; + if ( + l(r, "hx-on:") || + l(r, "data-hx-on:") || + l(r, "hx-on-") || + l(r, "data-hx-on-") + ) { + return true; + } + } + return false; + } + const Ct = new XPathEvaluator().createExpression( + './/*[@*[ starts-with(name(), "hx-on:") or starts-with(name(), "data-hx-on:") or' + + ' starts-with(name(), "hx-on-") or starts-with(name(), "data-hx-on-") ]]', + ); + function Ot(e, t) { + if (Et(e)) { + t.push(ue(e)); + } + const n = Ct.evaluate(e); + let r = null; + while ((r = n.iterateNext())) t.push(ue(r)); + } + function Rt(e) { + const t = []; + if (e instanceof DocumentFragment) { + for (const n of e.childNodes) { + Ot(n, t); + } + } else { + Ot(e, t); + } + return t; + } + function Ht(e) { + if (e.querySelectorAll) { + const n = + ", [hx-boost] a, [data-hx-boost] a, a[hx-boost], a[data-hx-boost]"; + const r = []; + for (const i in Mn) { + const s = Mn[i]; + if (s.getSelectors) { + var t = s.getSelectors(); + if (t) { + r.push(t); + } + } + } + const o = e.querySelectorAll( + R + + n + + ", form, [type='submit']," + + " [hx-ext], [data-hx-ext], [hx-trigger], [data-hx-trigger]" + + r + .flat() + .map((e) => ", " + e) + .join(""), + ); + return o; + } else { + return []; + } + } + function Tt(e) { + const t = g(ue(e.target), "button, input[type='submit']"); + const n = Lt(e); + if (n) { + n.lastButtonClicked = t; + } + } + function qt(e) { + const t = Lt(e); + if (t) { + t.lastButtonClicked = null; + } + } + function Lt(e) { + const t = g(ue(e.target), "button, input[type='submit']"); + if (!t) { + return; + } + const n = y("#" + ee(t, "form"), t.getRootNode()) || g(t, "form"); + if (!n) { + return; + } + return ie(n); + } + function Nt(e) { + e.addEventListener("click", Tt); + e.addEventListener("focusin", Tt); + e.addEventListener("focusout", qt); + } + function At(t, e, n) { + const r = ie(t); + if (!Array.isArray(r.onHandlers)) { + r.onHandlers = []; + } + let o; + const i = function (e) { + vn(t, function () { + if (at(t)) { + return; + } + if (!o) { + o = new Function("event", n); + } + o.call(t, e); + }); + }; + t.addEventListener(e, i); + r.onHandlers.push({ event: e, listener: i }); + } + function It(t) { + ke(t); + for (let e = 0; e < t.attributes.length; e++) { + const n = t.attributes[e].name; + const r = t.attributes[e].value; + if (l(n, "hx-on") || l(n, "data-hx-on")) { + const o = n.indexOf("-on") + 3; + const i = n.slice(o, o + 1); + if (i === "-" || i === ":") { + let e = n.slice(o + 1); + if (l(e, ":")) { + e = "htmx" + e; + } else if (l(e, "-")) { + e = "htmx:" + e.slice(1); + } else if (l(e, "htmx-")) { + e = "htmx:" + e.slice(5); + } + At(t, e, r); + } + } + } + } + function Pt(t) { + if (g(t, Q.config.disableSelector)) { + a(t); + return; + } + const n = ie(t); + if (n.initHash !== Pe(t)) { + De(t); + n.initHash = Pe(t); + de(t, "htmx:beforeProcessNode"); + const e = st(t); + const r = wt(t, n, e); + if (!r) { + if (re(t, "hx-boost") === "true") { + ft(t, n, e); + } else if (s(t, "hx-trigger")) { + e.forEach(function (e) { + St(t, e, n, function () {}); + }); + } + } + if ( + t.tagName === "FORM" || + (ee(t, "type") === "submit" && s(t, "form")) + ) { + Nt(t); + } + de(t, "htmx:afterProcessNode"); + } + } + function kt(e) { + e = y(e); + if (g(e, Q.config.disableSelector)) { + a(e); + return; + } + Pt(e); + se(Ht(e), function (e) { + Pt(e); + }); + se(Rt(e), It); + } + function Dt(e) { + return e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(); + } + function Mt(e, t) { + let n; + if (window.CustomEvent && typeof window.CustomEvent === "function") { + n = new CustomEvent(e, { + bubbles: true, + cancelable: true, + composed: true, + detail: t, + }); + } else { + n = ne().createEvent("CustomEvent"); + n.initCustomEvent(e, true, true, t); + } + return n; + } + function fe(e, t, n) { + de(e, t, ce({ error: t }, n)); + } + function Xt(e) { + return e === "htmx:afterProcessNode"; + } + function Ft(e, t) { + se(Un(e), function (e) { + try { + t(e); + } catch (e) { + C(e); + } + }); + } + function C(e) { + if (console.error) { + console.error(e); + } else if (console.log) { + console.log("ERROR: ", e); + } + } + function de(e, t, n) { + e = y(e); + if (n == null) { + n = {}; + } + n.elt = e; + const r = Mt(t, n); + if (Q.logger && !Xt(t)) { + Q.logger(e, t, n); + } + if (n.error) { + C(n.error); + de(e, "htmx:error", { errorInfo: n }); + } + let o = e.dispatchEvent(r); + const i = Dt(t); + if (o && i !== t) { + const s = Mt(i, r.detail); + o = o && e.dispatchEvent(s); + } + Ft(ue(e), function (e) { + o = o && e.onEvent(t, r) !== false && !r.defaultPrevented; + }); + return o; + } + let Bt = location.pathname + location.search; + function Ut() { + const e = ne().querySelector("[hx-history-elt],[data-hx-history-elt]"); + return e || ne().body; + } + function jt(t, e) { + if (!B()) { + return; + } + const n = _t(e); + const r = ne().title; + const o = window.scrollY; + if (Q.config.historyCacheSize <= 0) { + localStorage.removeItem("htmx-history-cache"); + return; + } + t = U(t); + const i = S(localStorage.getItem("htmx-history-cache")) || []; + for (let e = 0; e < i.length; e++) { + if (i[e].url === t) { + i.splice(e, 1); + break; + } + } + const s = { url: t, content: n, title: r, scroll: o }; + de(ne().body, "htmx:historyItemCreated", { item: s, cache: i }); + i.push(s); + while (i.length > Q.config.historyCacheSize) { + i.shift(); + } + while (i.length > 0) { + try { + localStorage.setItem("htmx-history-cache", JSON.stringify(i)); + break; + } catch (e) { + fe(ne().body, "htmx:historyCacheError", { cause: e, cache: i }); + i.shift(); + } + } + } + function Vt(t) { + if (!B()) { + return null; + } + t = U(t); + const n = S(localStorage.getItem("htmx-history-cache")) || []; + for (let e = 0; e < n.length; e++) { + if (n[e].url === t) { + return n[e]; + } + } + return null; + } + function _t(e) { + const t = Q.config.requestClass; + const n = e.cloneNode(true); + se(x(n, "." + t), function (e) { + G(e, t); + }); + se(x(n, "[data-disabled-by-htmx]"), function (e) { + e.removeAttribute("disabled"); + }); + return n.innerHTML; + } + function zt() { + const e = Ut(); + const t = Bt || location.pathname + location.search; + let n; + try { + n = ne().querySelector( + '[hx-history="false" i],[data-hx-history="false" i]', + ); + } catch (e) { + n = ne().querySelector('[hx-history="false"],[data-hx-history="false"]'); + } + if (!n) { + de(ne().body, "htmx:beforeHistorySave", { path: t, historyElt: e }); + jt(t, e); + } + if (Q.config.historyEnabled) + history.replaceState({ htmx: true }, ne().title, window.location.href); + } + function $t(e) { + if (Q.config.getCacheBusterParam) { + e = e.replace(/org\.htmx\.cache-buster=[^&]*&?/, ""); + if (Y(e, "&") || Y(e, "?")) { + e = e.slice(0, -1); + } + } + if (Q.config.historyEnabled) { + history.pushState({ htmx: true }, "", e); + } + Bt = e; + } + function Jt(e) { + if (Q.config.historyEnabled) history.replaceState({ htmx: true }, "", e); + Bt = e; + } + function Kt(e) { + se(e, function (e) { + e.call(undefined); + }); + } + function Gt(o) { + const e = new XMLHttpRequest(); + const i = { path: o, xhr: e }; + de(ne().body, "htmx:historyCacheMiss", i); + e.open("GET", o, true); + e.setRequestHeader("HX-Request", "true"); + e.setRequestHeader("HX-History-Restore-Request", "true"); + e.setRequestHeader("HX-Current-URL", ne().location.href); + e.onload = function () { + if (this.status >= 200 && this.status < 400) { + de(ne().body, "htmx:historyCacheMissLoad", i); + const e = P(this.response); + const t = + e.querySelector("[hx-history-elt],[data-hx-history-elt]") || e; + const n = Ut(); + const r = xn(n); + kn(e.title); + qe(e); + Ve(n, t, r); + Te(); + Kt(r.tasks); + Bt = o; + de(ne().body, "htmx:historyRestore", { + path: o, + cacheMiss: true, + serverResponse: this.response, + }); + } else { + fe(ne().body, "htmx:historyCacheMissLoadError", i); + } + }; + e.send(); + } + function Wt(e) { + zt(); + e = e || location.pathname + location.search; + const t = Vt(e); + if (t) { + const n = P(t.content); + const r = Ut(); + const o = xn(r); + kn(t.title); + qe(n); + Ve(r, n, o); + Te(); + Kt(o.tasks); + E().setTimeout(function () { + window.scrollTo(0, t.scroll); + }, 0); + Bt = e; + de(ne().body, "htmx:historyRestore", { path: e, item: t }); + } else { + if (Q.config.refreshOnHistoryMiss) { + window.location.reload(true); + } else { + Gt(e); + } + } + } + function Zt(e) { + let t = we(e, "hx-indicator"); + if (t == null) { + t = [e]; + } + se(t, function (e) { + const t = ie(e); + t.requestCount = (t.requestCount || 0) + 1; + e.classList.add.call(e.classList, Q.config.requestClass); + }); + return t; + } + function Yt(e) { + let t = we(e, "hx-disabled-elt"); + if (t == null) { + t = []; + } + se(t, function (e) { + const t = ie(e); + t.requestCount = (t.requestCount || 0) + 1; + e.setAttribute("disabled", ""); + e.setAttribute("data-disabled-by-htmx", ""); + }); + return t; + } + function Qt(e, t) { + se(e.concat(t), function (e) { + const t = ie(e); + t.requestCount = (t.requestCount || 1) - 1; + }); + se(e, function (e) { + const t = ie(e); + if (t.requestCount === 0) { + e.classList.remove.call(e.classList, Q.config.requestClass); + } + }); + se(t, function (e) { + const t = ie(e); + if (t.requestCount === 0) { + e.removeAttribute("disabled"); + e.removeAttribute("data-disabled-by-htmx"); + } + }); + } + function en(t, n) { + for (let e = 0; e < t.length; e++) { + const r = t[e]; + if (r.isSameNode(n)) { + return true; + } + } + return false; + } + function tn(e) { + const t = e; + if ( + t.name === "" || + t.name == null || + t.disabled || + g(t, "fieldset[disabled]") + ) { + return false; + } + if ( + t.type === "button" || + t.type === "submit" || + t.tagName === "image" || + t.tagName === "reset" || + t.tagName === "file" + ) { + return false; + } + if (t.type === "checkbox" || t.type === "radio") { + return t.checked; + } + return true; + } + function nn(t, e, n) { + if (t != null && e != null) { + if (Array.isArray(e)) { + e.forEach(function (e) { + n.append(t, e); + }); + } else { + n.append(t, e); + } + } + } + function rn(t, n, r) { + if (t != null && n != null) { + let e = r.getAll(t); + if (Array.isArray(n)) { + e = e.filter((e) => n.indexOf(e) < 0); + } else { + e = e.filter((e) => e !== n); + } + r.delete(t); + se(e, (e) => r.append(t, e)); + } + } + function on(t, n, r, o, i) { + if (o == null || en(t, o)) { + return; + } else { + t.push(o); + } + if (tn(o)) { + const s = ee(o, "name"); + let e = o.value; + if (o instanceof HTMLSelectElement && o.multiple) { + e = M(o.querySelectorAll("option:checked")).map(function (e) { + return e.value; + }); + } + if (o instanceof HTMLInputElement && o.files) { + e = M(o.files); + } + nn(s, e, n); + if (i) { + sn(o, r); + } + } + if (o instanceof HTMLFormElement) { + se(o.elements, function (e) { + if (t.indexOf(e) >= 0) { + rn(e.name, e.value, n); + } else { + t.push(e); + } + if (i) { + sn(e, r); + } + }); + new FormData(o).forEach(function (e, t) { + if (e instanceof File && e.name === "") { + return; + } + nn(t, e, n); + }); + } + } + function sn(e, t) { + const n = e; + if (n.willValidate) { + de(n, "htmx:validation:validate"); + if (!n.checkValidity()) { + t.push({ elt: n, message: n.validationMessage, validity: n.validity }); + de(n, "htmx:validation:failed", { + message: n.validationMessage, + validity: n.validity, + }); + } + } + } + function ln(n, e) { + for (const t of e.keys()) { + n.delete(t); + } + e.forEach(function (e, t) { + n.append(t, e); + }); + return n; + } + function cn(e, t) { + const n = []; + const r = new FormData(); + const o = new FormData(); + const i = []; + const s = ie(e); + if (s.lastButtonClicked && !le(s.lastButtonClicked)) { + s.lastButtonClicked = null; + } + let l = + (e instanceof HTMLFormElement && e.noValidate !== true) || + te(e, "hx-validate") === "true"; + if (s.lastButtonClicked) { + l = l && s.lastButtonClicked.formNoValidate !== true; + } + if (t !== "get") { + on(n, o, i, g(e, "form"), l); + } + on(n, r, i, e, l); + if ( + s.lastButtonClicked || + e.tagName === "BUTTON" || + (e.tagName === "INPUT" && ee(e, "type") === "submit") + ) { + const u = s.lastButtonClicked || e; + const a = ee(u, "name"); + nn(a, u.value, o); + } + const c = we(e, "hx-include"); + se(c, function (e) { + on(n, r, i, ue(e), l); + if (!d(e, "form")) { + se(f(e).querySelectorAll(ot), function (e) { + on(n, r, i, e, l); + }); + } + }); + ln(r, o); + return { errors: i, formData: r, values: Nn(r) }; + } + function un(e, t, n) { + if (e !== "") { + e += "&"; + } + if (String(n) === "[object Object]") { + n = JSON.stringify(n); + } + const r = encodeURIComponent(n); + e += encodeURIComponent(t) + "=" + r; + return e; + } + function an(e) { + e = qn(e); + let n = ""; + e.forEach(function (e, t) { + n = un(n, t, e); + }); + return n; + } + function fn(e, t, n) { + const r = { + "HX-Request": "true", + "HX-Trigger": ee(e, "id"), + "HX-Trigger-Name": ee(e, "name"), + "HX-Target": te(t, "id"), + "HX-Current-URL": ne().location.href, + }; + bn(e, "hx-headers", false, r); + if (n !== undefined) { + r["HX-Prompt"] = n; + } + if (ie(e).boosted) { + r["HX-Boosted"] = "true"; + } + return r; + } + function dn(n, e) { + const t = re(e, "hx-params"); + if (t) { + if (t === "none") { + return new FormData(); + } else if (t === "*") { + return n; + } else if (t.indexOf("not ") === 0) { + se(t.substr(4).split(","), function (e) { + e = e.trim(); + n.delete(e); + }); + return n; + } else { + const r = new FormData(); + se(t.split(","), function (t) { + t = t.trim(); + if (n.has(t)) { + n.getAll(t).forEach(function (e) { + r.append(t, e); + }); + } + }); + return r; + } + } else { + return n; + } + } + function hn(e) { + return !!ee(e, "href") && ee(e, "href").indexOf("#") >= 0; + } + function gn(e, t) { + const n = t || re(e, "hx-swap"); + const r = { + swapStyle: ie(e).boosted ? "innerHTML" : Q.config.defaultSwapStyle, + swapDelay: Q.config.defaultSwapDelay, + settleDelay: Q.config.defaultSettleDelay, + }; + if (Q.config.scrollIntoViewOnBoost && ie(e).boosted && !hn(e)) { + r.show = "top"; + } + if (n) { + const s = F(n); + if (s.length > 0) { + for (let e = 0; e < s.length; e++) { + const l = s[e]; + if (l.indexOf("swap:") === 0) { + r.swapDelay = h(l.substr(5)); + } else if (l.indexOf("settle:") === 0) { + r.settleDelay = h(l.substr(7)); + } else if (l.indexOf("transition:") === 0) { + r.transition = l.substr(11) === "true"; + } else if (l.indexOf("ignoreTitle:") === 0) { + r.ignoreTitle = l.substr(12) === "true"; + } else if (l.indexOf("scroll:") === 0) { + const c = l.substr(7); + var o = c.split(":"); + const u = o.pop(); + var i = o.length > 0 ? o.join(":") : null; + r.scroll = u; + r.scrollTarget = i; + } else if (l.indexOf("show:") === 0) { + const a = l.substr(5); + var o = a.split(":"); + const f = o.pop(); + var i = o.length > 0 ? o.join(":") : null; + r.show = f; + r.showTarget = i; + } else if (l.indexOf("focus-scroll:") === 0) { + const d = l.substr("focus-scroll:".length); + r.focusScroll = d == "true"; + } else if (e == 0) { + r.swapStyle = l; + } else { + C("Unknown modifier in hx-swap: " + l); + } + } + } + } + return r; + } + function pn(e) { + return ( + re(e, "hx-encoding") === "multipart/form-data" || + (d(e, "form") && ee(e, "enctype") === "multipart/form-data") + ); + } + function mn(t, n, r) { + let o = null; + Ft(n, function (e) { + if (o == null) { + o = e.encodeParameters(t, r, n); + } + }); + if (o != null) { + return o; + } else { + if (pn(n)) { + return ln(new FormData(), qn(r)); + } else { + return an(r); + } + } + } + function xn(e) { + return { tasks: [], elts: [e] }; + } + function yn(e, t) { + const n = e[0]; + const r = e[e.length - 1]; + if (t.scroll) { + var o = null; + if (t.scrollTarget) { + o = ue(ae(n, t.scrollTarget)); + } + if (t.scroll === "top" && (n || o)) { + o = o || n; + o.scrollTop = 0; + } + if (t.scroll === "bottom" && (r || o)) { + o = o || r; + o.scrollTop = o.scrollHeight; + } + } + if (t.show) { + var o = null; + if (t.showTarget) { + let e = t.showTarget; + if (t.showTarget === "window") { + e = "body"; + } + o = ue(ae(n, e)); + } + if (t.show === "top" && (n || o)) { + o = o || n; + o.scrollIntoView({ block: "start", behavior: Q.config.scrollBehavior }); + } + if (t.show === "bottom" && (r || o)) { + o = o || r; + o.scrollIntoView({ block: "end", behavior: Q.config.scrollBehavior }); + } + } + } + function bn(r, e, o, i) { + if (i == null) { + i = {}; + } + if (r == null) { + return i; + } + const s = te(r, e); + if (s) { + let e = s.trim(); + let t = o; + if (e === "unset") { + return null; + } + if (e.indexOf("javascript:") === 0) { + e = e.substr(11); + t = true; + } else if (e.indexOf("js:") === 0) { + e = e.substr(3); + t = true; + } + if (e.indexOf("{") !== 0) { + e = "{" + e + "}"; + } + let n; + if (t) { + n = vn( + r, + function () { + return Function("return (" + e + ")")(); + }, + {}, + ); + } else { + n = S(e); + } + for (const l in n) { + if (n.hasOwnProperty(l)) { + if (i[l] == null) { + i[l] = n[l]; + } + } + } + } + return bn(ue(c(r)), e, o, i); + } + function vn(e, t, n) { + if (Q.config.allowEval) { + return t(); + } else { + fe(e, "htmx:evalDisallowedError"); + return n; + } + } + function wn(e, t) { + return bn(e, "hx-vars", true, t); + } + function Sn(e, t) { + return bn(e, "hx-vals", false, t); + } + function En(e) { + return ce(wn(e), Sn(e)); + } + function Cn(t, n, r) { + if (r !== null) { + try { + t.setRequestHeader(n, r); + } catch (e) { + t.setRequestHeader(n, encodeURIComponent(r)); + t.setRequestHeader(n + "-URI-AutoEncoded", "true"); + } + } + } + function On(t) { + if (t.responseURL && typeof URL !== "undefined") { + try { + const e = new URL(t.responseURL); + return e.pathname + e.search; + } catch (e) { + fe(ne().body, "htmx:badResponseUrl", { url: t.responseURL }); + } + } + } + function O(e, t) { + return t.test(e.getAllResponseHeaders()); + } + function Rn(t, n, r) { + t = t.toLowerCase(); + if (r) { + if (r instanceof Element || typeof r === "string") { + return he(t, n, null, null, { + targetOverride: y(r) || ve, + returnPromise: true, + }); + } else { + let e = y(r.target); + if ((r.target && !e) || (!e && !y(r.source))) { + e = ve; + } + return he(t, n, y(r.source), r.event, { + handler: r.handler, + headers: r.headers, + values: r.values, + targetOverride: e, + swapOverride: r.swap, + select: r.select, + returnPromise: true, + }); + } + } else { + return he(t, n, null, null, { returnPromise: true }); + } + } + function Hn(e) { + const t = []; + while (e) { + t.push(e); + e = e.parentElement; + } + return t; + } + function Tn(e, t, n) { + let r; + let o; + if (typeof URL === "function") { + o = new URL(t, document.location.href); + const i = document.location.origin; + r = i === o.origin; + } else { + o = t; + r = l(t, document.location.origin); + } + if (Q.config.selfRequestsOnly) { + if (!r) { + return false; + } + } + return de(e, "htmx:validateUrl", ce({ url: o, sameHost: r }, n)); + } + function qn(e) { + if (e instanceof FormData) return e; + const t = new FormData(); + for (const n in e) { + if (e.hasOwnProperty(n)) { + if (e[n] && typeof e[n].forEach === "function") { + e[n].forEach(function (e) { + t.append(n, e); + }); + } else if (typeof e[n] === "object" && !(e[n] instanceof Blob)) { + t.append(n, JSON.stringify(e[n])); + } else { + t.append(n, e[n]); + } + } + } + return t; + } + function Ln(r, o, e) { + return new Proxy(e, { + get: function (t, e) { + if (typeof e === "number") return t[e]; + if (e === "length") return t.length; + if (e === "push") { + return function (e) { + t.push(e); + r.append(o, e); + }; + } + if (typeof t[e] === "function") { + return function () { + t[e].apply(t, arguments); + r.delete(o); + t.forEach(function (e) { + r.append(o, e); + }); + }; + } + if (t[e] && t[e].length === 1) { + return t[e][0]; + } else { + return t[e]; + } + }, + set: function (e, t, n) { + e[t] = n; + r.delete(o); + e.forEach(function (e) { + r.append(o, e); + }); + return true; + }, + }); + } + function Nn(r) { + return new Proxy(r, { + get: function (e, t) { + if (typeof t === "symbol") { + return Reflect.get(e, t); + } + if (t === "toJSON") { + return () => Object.fromEntries(r); + } + if (t in e) { + if (typeof e[t] === "function") { + return function () { + return r[t].apply(r, arguments); + }; + } else { + return e[t]; + } + } + const n = r.getAll(t); + if (n.length === 0) { + return undefined; + } else if (n.length === 1) { + return n[0]; + } else { + return Ln(e, t, n); + } + }, + set: function (t, n, e) { + if (typeof n !== "string") { + return false; + } + t.delete(n); + if (e && typeof e.forEach === "function") { + e.forEach(function (e) { + t.append(n, e); + }); + } else if (typeof e === "object" && !(e instanceof Blob)) { + t.append(n, JSON.stringify(e)); + } else { + t.append(n, e); + } + return true; + }, + deleteProperty: function (e, t) { + if (typeof t === "string") { + e.delete(t); + } + return true; + }, + ownKeys: function (e) { + return Reflect.ownKeys(Object.fromEntries(e)); + }, + getOwnPropertyDescriptor: function (e, t) { + return Reflect.getOwnPropertyDescriptor(Object.fromEntries(e), t); + }, + }); + } + function he(t, n, r, o, i, D) { + let s = null; + let l = null; + i = i != null ? i : {}; + if (i.returnPromise && typeof Promise !== "undefined") { + var e = new Promise(function (e, t) { + s = e; + l = t; + }); + } + if (r == null) { + r = ne().body; + } + const M = i.handler || Dn; + const X = i.select || null; + if (!le(r)) { + oe(s); + return e; + } + const c = i.targetOverride || ue(Ee(r)); + if (c == null || c == ve) { + fe(r, "htmx:targetError", { target: te(r, "hx-target") }); + oe(l); + return e; + } + let u = ie(r); + const a = u.lastButtonClicked; + if (a) { + const L = ee(a, "formaction"); + if (L != null) { + n = L; + } + const N = ee(a, "formmethod"); + if (N != null) { + if (N.toLowerCase() !== "dialog") { + t = N; + } + } + } + const f = re(r, "hx-confirm"); + if (D === undefined) { + const K = function (e) { + return he(t, n, r, o, i, !!e); + }; + const G = { + target: c, + elt: r, + path: n, + verb: t, + triggeringEvent: o, + etc: i, + issueRequest: K, + question: f, + }; + if (de(r, "htmx:confirm", G) === false) { + oe(s); + return e; + } + } + let d = r; + let h = re(r, "hx-sync"); + let g = null; + let F = false; + if (h) { + const A = h.split(":"); + const I = A[0].trim(); + if (I === "this") { + d = Se(r, "hx-sync"); + } else { + d = ue(ae(r, I)); + } + h = (A[1] || "drop").trim(); + u = ie(d); + if (h === "drop" && u.xhr && u.abortable !== true) { + oe(s); + return e; + } else if (h === "abort") { + if (u.xhr) { + oe(s); + return e; + } else { + F = true; + } + } else if (h === "replace") { + de(d, "htmx:abort"); + } else if (h.indexOf("queue") === 0) { + const W = h.split(" "); + g = (W[1] || "last").trim(); + } + } + if (u.xhr) { + if (u.abortable) { + de(d, "htmx:abort"); + } else { + if (g == null) { + if (o) { + const P = ie(o); + if (P && P.triggerSpec && P.triggerSpec.queue) { + g = P.triggerSpec.queue; + } + } + if (g == null) { + g = "last"; + } + } + if (u.queuedRequests == null) { + u.queuedRequests = []; + } + if (g === "first" && u.queuedRequests.length === 0) { + u.queuedRequests.push(function () { + he(t, n, r, o, i); + }); + } else if (g === "all") { + u.queuedRequests.push(function () { + he(t, n, r, o, i); + }); + } else if (g === "last") { + u.queuedRequests = []; + u.queuedRequests.push(function () { + he(t, n, r, o, i); + }); + } + oe(s); + return e; + } + } + const p = new XMLHttpRequest(); + u.xhr = p; + u.abortable = F; + const m = function () { + u.xhr = null; + u.abortable = false; + if (u.queuedRequests != null && u.queuedRequests.length > 0) { + const e = u.queuedRequests.shift(); + e(); + } + }; + const B = re(r, "hx-prompt"); + if (B) { + var x = prompt(B); + if (x === null || !de(r, "htmx:prompt", { prompt: x, target: c })) { + oe(s); + m(); + return e; + } + } + if (f && !D) { + if (!confirm(f)) { + oe(s); + m(); + return e; + } + } + let y = fn(r, c, x); + if (t !== "get" && !pn(r)) { + y["Content-Type"] = "application/x-www-form-urlencoded"; + } + if (i.headers) { + y = ce(y, i.headers); + } + const U = cn(r, t); + let b = U.errors; + const j = U.formData; + if (i.values) { + ln(j, qn(i.values)); + } + const V = qn(En(r)); + const v = ln(j, V); + let w = dn(v, r); + if (Q.config.getCacheBusterParam && t === "get") { + w.set("org.htmx.cache-buster", ee(c, "id") || "true"); + } + if (n == null || n === "") { + n = ne().location.href; + } + const S = bn(r, "hx-request"); + const _ = ie(r).boosted; + let E = Q.config.methodsThatUseUrlParams.indexOf(t) >= 0; + const C = { + boosted: _, + useUrlParams: E, + formData: w, + parameters: Nn(w), + unfilteredFormData: v, + unfilteredParameters: Nn(v), + headers: y, + target: c, + verb: t, + errors: b, + withCredentials: + i.credentials || S.credentials || Q.config.withCredentials, + timeout: i.timeout || S.timeout || Q.config.timeout, + path: n, + triggeringEvent: o, + }; + if (!de(r, "htmx:configRequest", C)) { + oe(s); + m(); + return e; + } + n = C.path; + t = C.verb; + y = C.headers; + w = qn(C.parameters); + b = C.errors; + E = C.useUrlParams; + if (b && b.length > 0) { + de(r, "htmx:validation:halted", C); + oe(s); + m(); + return e; + } + const z = n.split("#"); + const $ = z[0]; + const O = z[1]; + let R = n; + if (E) { + R = $; + const Z = !w.keys().next().done; + if (Z) { + if (R.indexOf("?") < 0) { + R += "?"; + } else { + R += "&"; + } + R += an(w); + if (O) { + R += "#" + O; + } + } + } + if (!Tn(r, R, C)) { + fe(r, "htmx:invalidPath", C); + oe(l); + return e; + } + p.open(t.toUpperCase(), R, true); + p.overrideMimeType("text/html"); + p.withCredentials = C.withCredentials; + p.timeout = C.timeout; + if (S.noHeaders) { + } else { + for (const k in y) { + if (y.hasOwnProperty(k)) { + const Y = y[k]; + Cn(p, k, Y); + } + } + } + const H = { + xhr: p, + target: c, + requestConfig: C, + etc: i, + boosted: _, + select: X, + pathInfo: { + requestPath: n, + finalRequestPath: R, + responsePath: null, + anchor: O, + }, + }; + p.onload = function () { + try { + const t = Hn(r); + H.pathInfo.responsePath = On(p); + M(r, H); + if (H.keepIndicators !== true) { + Qt(T, q); + } + de(r, "htmx:afterRequest", H); + de(r, "htmx:afterOnLoad", H); + if (!le(r)) { + let e = null; + while (t.length > 0 && e == null) { + const n = t.shift(); + if (le(n)) { + e = n; + } + } + if (e) { + de(e, "htmx:afterRequest", H); + de(e, "htmx:afterOnLoad", H); + } + } + oe(s); + m(); + } catch (e) { + fe(r, "htmx:onLoadError", ce({ error: e }, H)); + throw e; + } + }; + p.onerror = function () { + Qt(T, q); + fe(r, "htmx:afterRequest", H); + fe(r, "htmx:sendError", H); + oe(l); + m(); + }; + p.onabort = function () { + Qt(T, q); + fe(r, "htmx:afterRequest", H); + fe(r, "htmx:sendAbort", H); + oe(l); + m(); + }; + p.ontimeout = function () { + Qt(T, q); + fe(r, "htmx:afterRequest", H); + fe(r, "htmx:timeout", H); + oe(l); + m(); + }; + if (!de(r, "htmx:beforeRequest", H)) { + oe(s); + m(); + return e; + } + var T = Zt(r); + var q = Yt(r); + se(["loadstart", "loadend", "progress", "abort"], function (t) { + se([p, p.upload], function (e) { + e.addEventListener(t, function (e) { + de(r, "htmx:xhr:" + t, { + lengthComputable: e.lengthComputable, + loaded: e.loaded, + total: e.total, + }); + }); + }); + }); + de(r, "htmx:beforeSend", H); + const J = E ? null : mn(p, r, w); + p.send(J); + return e; + } + function An(e, t) { + const n = t.xhr; + let r = null; + let o = null; + if (O(n, /HX-Push:/i)) { + r = n.getResponseHeader("HX-Push"); + o = "push"; + } else if (O(n, /HX-Push-Url:/i)) { + r = n.getResponseHeader("HX-Push-Url"); + o = "push"; + } else if (O(n, /HX-Replace-Url:/i)) { + r = n.getResponseHeader("HX-Replace-Url"); + o = "replace"; + } + if (r) { + if (r === "false") { + return {}; + } else { + return { type: o, path: r }; + } + } + const i = t.pathInfo.finalRequestPath; + const s = t.pathInfo.responsePath; + const l = re(e, "hx-push-url"); + const c = re(e, "hx-replace-url"); + const u = ie(e).boosted; + let a = null; + let f = null; + if (l) { + a = "push"; + f = l; + } else if (c) { + a = "replace"; + f = c; + } else if (u) { + a = "push"; + f = s || i; + } + if (f) { + if (f === "false") { + return {}; + } + if (f === "true") { + f = s || i; + } + if (t.pathInfo.anchor && f.indexOf("#") === -1) { + f = f + "#" + t.pathInfo.anchor; + } + return { type: a, path: f }; + } else { + return {}; + } + } + function In(e, t) { + var n = new RegExp(e.code); + return n.test(t.toString(10)); + } + function Pn(e) { + for (var t = 0; t < Q.config.responseHandling.length; t++) { + var n = Q.config.responseHandling[t]; + if (In(n, e.status)) { + return n; + } + } + return { swap: false }; + } + function kn(e) { + if (e) { + const t = r("title"); + if (t) { + t.innerHTML = e; + } else { + window.document.title = e; + } + } + } + function Dn(o, i) { + const s = i.xhr; + let l = i.target; + const e = i.etc; + const c = i.select; + if (!de(o, "htmx:beforeOnLoad", i)) return; + if (O(s, /HX-Trigger:/i)) { + Je(s, "HX-Trigger", o); + } + if (O(s, /HX-Location:/i)) { + zt(); + let e = s.getResponseHeader("HX-Location"); + var t; + if (e.indexOf("{") === 0) { + t = S(e); + e = t.path; + delete t.path; + } + Rn("get", e, t).then(function () { + $t(e); + }); + return; + } + const n = + O(s, /HX-Refresh:/i) && s.getResponseHeader("HX-Refresh") === "true"; + if (O(s, /HX-Redirect:/i)) { + i.keepIndicators = true; + location.href = s.getResponseHeader("HX-Redirect"); + n && location.reload(); + return; + } + if (n) { + i.keepIndicators = true; + location.reload(); + return; + } + if (O(s, /HX-Retarget:/i)) { + if (s.getResponseHeader("HX-Retarget") === "this") { + i.target = o; + } else { + i.target = ue(ae(o, s.getResponseHeader("HX-Retarget"))); + } + } + const u = An(o, i); + const r = Pn(s); + const a = r.swap; + let f = !!r.error; + let d = Q.config.ignoreTitle || r.ignoreTitle; + let h = r.select; + if (r.target) { + i.target = ue(ae(o, r.target)); + } + var g = e.swapOverride; + if (g == null && r.swapOverride) { + g = r.swapOverride; + } + if (O(s, /HX-Retarget:/i)) { + if (s.getResponseHeader("HX-Retarget") === "this") { + i.target = o; + } else { + i.target = ue(ae(o, s.getResponseHeader("HX-Retarget"))); + } + } + if (O(s, /HX-Reswap:/i)) { + g = s.getResponseHeader("HX-Reswap"); + } + var p = s.response; + var m = ce( + { + shouldSwap: a, + serverResponse: p, + isError: f, + ignoreTitle: d, + selectOverride: h, + swapOverride: g, + }, + i, + ); + if (r.event && !de(l, r.event, m)) return; + if (!de(l, "htmx:beforeSwap", m)) return; + l = m.target; + p = m.serverResponse; + f = m.isError; + d = m.ignoreTitle; + h = m.selectOverride; + g = m.swapOverride; + i.target = l; + i.failed = f; + i.successful = !f; + if (m.shouldSwap) { + if (s.status === 286) { + lt(o); + } + Ft(o, function (e) { + p = e.transformResponse(p, s, o); + }); + if (u.type) { + zt(); + } + var x = gn(o, g); + if (!x.hasOwnProperty("ignoreTitle")) { + x.ignoreTitle = d; + } + l.classList.add(Q.config.swappingClass); + let n = null; + let r = null; + if (c) { + h = c; + } + if (O(s, /HX-Reselect:/i)) { + h = s.getResponseHeader("HX-Reselect"); + } + const y = re(o, "hx-select-oob"); + const b = re(o, "hx-select"); + let e = function () { + try { + if (u.type) { + de(ne().body, "htmx:beforeHistoryUpdate", ce({ history: u }, i)); + if (u.type === "push") { + $t(u.path); + de(ne().body, "htmx:pushedIntoHistory", { path: u.path }); + } else { + Jt(u.path); + de(ne().body, "htmx:replacedInHistory", { path: u.path }); + } + } + $e(l, p, x, { + select: h || b, + selectOOB: y, + eventInfo: i, + anchor: i.pathInfo.anchor, + contextElement: o, + afterSwapCallback: function () { + if (O(s, /HX-Trigger-After-Swap:/i)) { + let e = o; + if (!le(o)) { + e = ne().body; + } + Je(s, "HX-Trigger-After-Swap", e); + } + }, + afterSettleCallback: function () { + if (O(s, /HX-Trigger-After-Settle:/i)) { + let e = o; + if (!le(o)) { + e = ne().body; + } + Je(s, "HX-Trigger-After-Settle", e); + } + oe(n); + }, + }); + } catch (e) { + fe(o, "htmx:swapError", i); + oe(r); + throw e; + } + }; + let t = Q.config.globalViewTransitions; + if (x.hasOwnProperty("transition")) { + t = x.transition; + } + if ( + t && + de(o, "htmx:beforeTransition", i) && + typeof Promise !== "undefined" && + document.startViewTransition + ) { + const v = new Promise(function (e, t) { + n = e; + r = t; + }); + const w = e; + e = function () { + document.startViewTransition(function () { + w(); + return v; + }); + }; + } + if (x.swapDelay > 0) { + E().setTimeout(e, x.swapDelay); + } else { + e(); + } + } + if (f) { + fe( + o, + "htmx:responseError", + ce( + { + error: + "Response Status Error Code " + + s.status + + " from " + + i.pathInfo.requestPath, + }, + i, + ), + ); + } + } + const Mn = {}; + function Xn() { + return { + init: function (e) { + return null; + }, + getSelectors: function () { + return null; + }, + onEvent: function (e, t) { + return true; + }, + transformResponse: function (e, t, n) { + return e; + }, + isInlineSwap: function (e) { + return false; + }, + handleSwap: function (e, t, n, r) { + return false; + }, + encodeParameters: function (e, t, n) { + return null; + }, + }; + } + function Fn(e, t) { + if (t.init) { + t.init(n); + } + Mn[e] = ce(Xn(), t); + } + function Bn(e) { + delete Mn[e]; + } + function Un(e, n, r) { + if (n == undefined) { + n = []; + } + if (e == undefined) { + return n; + } + if (r == undefined) { + r = []; + } + const t = te(e, "hx-ext"); + if (t) { + se(t.split(","), function (e) { + e = e.replace(/ /g, ""); + if (e.slice(0, 7) == "ignore:") { + r.push(e.slice(7)); + return; + } + if (r.indexOf(e) < 0) { + const t = Mn[e]; + if (t && n.indexOf(t) < 0) { + n.push(t); + } + } + }); + } + return Un(ue(c(e)), n, r); + } + var jn = false; + ne().addEventListener("DOMContentLoaded", function () { + jn = true; + }); + function Vn(e) { + if (jn || ne().readyState === "complete") { + e(); + } else { + ne().addEventListener("DOMContentLoaded", e); + } + } + function _n() { + if (Q.config.includeIndicatorStyles !== false) { + const e = Q.config.inlineStyleNonce + ? ` nonce="${Q.config.inlineStyleNonce}"` + : ""; + ne().head.insertAdjacentHTML( + "beforeend", + " ." + + Q.config.indicatorClass + + "{opacity:0} ." + + Q.config.requestClass + + " ." + + Q.config.indicatorClass + + "{opacity:1; transition: opacity 200ms ease-in;} ." + + Q.config.requestClass + + "." + + Q.config.indicatorClass + + "{opacity:1; transition: opacity 200ms ease-in;} ", + ); + } + } + function zn() { + const e = ne().querySelector('meta[name="htmx-config"]'); + if (e) { + return S(e.content); + } else { + return null; + } + } + function $n() { + const e = zn(); + if (e) { + Q.config = ce(Q.config, e); + } + } + Vn(function () { + $n(); + _n(); + let e = ne().body; + kt(e); + const t = ne().querySelectorAll( + "[hx-trigger='restored'],[data-hx-trigger='restored']", + ); + e.addEventListener("htmx:abort", function (e) { + const t = e.target; + const n = ie(t); + if (n && n.xhr) { + n.xhr.abort(); + } + }); + const n = window.onpopstate ? window.onpopstate.bind(window) : null; + window.onpopstate = function (e) { + if (e.state && e.state.htmx) { + Wt(); + se(t, function (e) { + de(e, "htmx:restored", { document: ne(), triggerEvent: de }); + }); + } else { + if (n) { + n(e); + } + } + }; + E().setTimeout(function () { + de(e, "htmx:load", {}); + e = null; + }, 0); + }); + return Q; +})(); diff --git a/cmd/web/base.templ b/cmd/web/base.templ new file mode 100644 index 0000000..77bfb94 --- /dev/null +++ b/cmd/web/base.templ @@ -0,0 +1,18 @@ +package web + +templ Base() { + + + + + Music Search + + + + +
+ { children... } +
+ + +} diff --git a/cmd/web/efs.go b/cmd/web/efs.go new file mode 100644 index 0000000..57b9761 --- /dev/null +++ b/cmd/web/efs.go @@ -0,0 +1,6 @@ +package web + +import "embed" + +//go:embed "assets" +var Files embed.FS diff --git a/cmd/web/hello.go b/cmd/web/hello.go new file mode 100644 index 0000000..0b86604 --- /dev/null +++ b/cmd/web/hello.go @@ -0,0 +1,117 @@ +package web + +import ( + "log" + "music-server/pkg/server" + "net/http" + "regexp" + "strings" +) + +var games_added []string + +func FindGameWebHandler(w http.ResponseWriter, r *http.Request) { + err := r.ParseForm() + if err != nil { + http.Error(w, "Bad Request", http.StatusBadRequest) + } + + search_term := r.FormValue("search_term") + + search(search_term) + + component := FoundGames(games_added) + err = component.Render(r.Context(), w) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + log.Fatalf("Error rendering in FindGameWebHandler: %e", err) + } +} + +func search(searchText string) { + games_added = nil + games := server.GetAllGames() + for _, game := range games { + if is_match_exact(searchText, game) { + add_game(game) + } + } + for _, game := range games { + if is_match_contains(clean_term(searchText), clean_term(game)) { + add_game(game) + } + } + for _, game := range games { + if is_match_regex(clean_term(searchText), clean_term(game)) { + add_game(game) + } + } +} + +func is_match_exact(search_term string, game_name string) bool { + search_term = strings.ToLower(search_term) + game_name = strings.ToLower(game_name) + + if search_term == "" { + return true + } else if strings.Contains(game_name, search_term) { + return true + } else { + return false + } +} + +func is_match_contains(search_term string, game_name string) bool { + if search_term == "" { + return true + } else if strings.Contains(game_name, search_term) { + return true + } else { + return false + } +} + +func is_match_regex(search_term string, game_name string) bool { + if search_term == "" { + return true + } else if compile_regex(search_term).MatchString(game_name) { + return true + } else { + return false + } +} + +func add_game(game string) { + if !check_if_game_exists(game) { + games_added = append(games_added, game) + } +} + +func check_if_game_exists(gameName string) bool { + game_exists := false + for _, child := range games_added { + if child == gameName { + game_exists = true + } + } + return game_exists +} + +func compile_regex(search_term string) *regexp.Regexp { + regText := ".*" + for _, letter := range search_term { + regText += string(letter) + ".*" + } + r, _ := regexp.Compile(regText) + + return r +} + +func clean_term(term string) string { + term = strings.ReplaceAll(term, " ", "") + term = strings.ReplaceAll(term, "é", "e") + term = strings.ReplaceAll(term, "+", "plus") + term = strings.ReplaceAll(term, "&", "and") + term = strings.ReplaceAll(term, "'n", "and") + return strings.ToLower(term) +} diff --git a/cmd/web/hello.templ b/cmd/web/hello.templ new file mode 100644 index 0000000..87849b6 --- /dev/null +++ b/cmd/web/hello.templ @@ -0,0 +1,32 @@ +package web + +templ HelloForm() { + @Base() { +
+ + +
+
+ + } +} + +templ FoundGames(games []string) { + for _, game := range games { +
+

{ game }

+
+ } +} diff --git a/db/efs.go b/db/efs.go new file mode 100644 index 0000000..1e7bc2d --- /dev/null +++ b/db/efs.go @@ -0,0 +1,6 @@ +package newDb + +import "embed" + +//go:embed "migrations/*.sql" +var MigrationsFs embed.FS diff --git a/go.mod b/go.mod index 1471426..cc03e5b 100644 --- a/go.mod +++ b/go.mod @@ -4,12 +4,13 @@ go 1.22.2 require ( github.com/MShekow/directory-checksum v1.4.6 + github.com/a-h/templ v0.2.793 github.com/gin-contrib/static v1.1.2 github.com/gin-gonic/gin v1.10.0 - github.com/golang-migrate/migrate v3.5.4+incompatible + github.com/golang-migrate/migrate/v4 v4.18.1 github.com/jackc/pgtype v1.14.3 github.com/jackc/pgx/v5 v5.5.5 - github.com/lib/pq v1.10.2 + github.com/lib/pq v1.10.9 github.com/spf13/afero v1.11.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -19,10 +20,7 @@ require ( github.com/bytedance/sonic/loader v0.1.1 // indirect github.com/cloudwego/base64x v0.1.4 // indirect github.com/cloudwego/iasm v0.2.0 // indirect - github.com/distribution/reference v0.6.0 // indirect github.com/docker/docker v27.3.1+incompatible // indirect - github.com/docker/go-connections v0.5.0 // indirect - github.com/docker/go-units v0.5.0 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-errors/errors v1.5.1 // indirect @@ -30,8 +28,8 @@ require ( github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.20.0 // indirect github.com/goccy/go-json v0.10.2 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/go-cmp v0.6.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect @@ -40,21 +38,19 @@ require ( github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/moby/docker-image-spec v1.3.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 // indirect go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.uber.org/atomic v1.7.0 // indirect golang.org/x/arch v0.8.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/crypto v0.27.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sync v0.8.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect + google.golang.org/protobuf v1.34.2 // indirect ) diff --git a/go.sum b/go.sum index 8146602..736f63e 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,13 @@ +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/MShekow/directory-checksum v1.4.6 h1:2fhlCYbpjEN1iH9S0tdmEM0p1wvNT9x5x0rIchGI7nE= github.com/MShekow/directory-checksum v1.4.6/go.mod h1:bMfFBkaIlNk7O9VgEi8D2X7Q2Jfk3c7d67z3t6cpIi4= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/a-h/templ v0.2.793 h1:Io+/ocnfGWYO4VHdR0zBbf39PQlnzVCVVD+wEEs6/qY= +github.com/a-h/templ v0.2.793/go.mod h1:lq48JXoUvuQrU0VThrK31yFwdRjTCnIE5bcPCM9IP1w= github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= @@ -19,6 +23,8 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dhui/dktest v0.4.3 h1:wquqUxAFdcUgabAVLvSCOKOlag5cIZuaOjYIBOWdsR0= +github.com/dhui/dktest v0.4.3/go.mod h1:zNK8IwktWzQRm6I/l2Wjp7MakiyaFWv4G1hjmodmMTs= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/docker/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI= @@ -59,12 +65,17 @@ github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MG github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-migrate/migrate v3.5.4+incompatible h1:R7OzwvCJTCgwapPCiX6DyBiu2czIUMDCB118gFTKTUA= -github.com/golang-migrate/migrate v3.5.4+incompatible/go.mod h1:IsVUlFN5puWOmXrqjgGUfIRIbU7mr8oNBE2tyERd9Wk= +github.com/golang-migrate/migrate/v4 v4.18.1 h1:JML/k+t4tpHCpQTCAD62Nu43NUFzHY4CV3uAuvHGC+Y= +github.com/golang-migrate/migrate/v4 v4.18.1/go.mod h1:HAX6m3sQgcdO81tdjn5exv20+3Kb13cmGli1hrD6hks= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= @@ -122,7 +133,6 @@ github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= @@ -135,15 +145,17 @@ github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -153,24 +165,29 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= @@ -202,8 +219,6 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 h1:DheMAlT6POBP+gh8RUH19EOTnQIor5QE0uSRPtzCpSw= @@ -218,6 +233,8 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= @@ -240,35 +257,29 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= +golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -279,7 +290,6 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -288,8 +298,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -305,8 +315,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -316,18 +326,15 @@ golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/pkg/conf/conf.go b/pkg/conf/conf.go index 9fd35ea..40d00f1 100644 --- a/pkg/conf/conf.go +++ b/pkg/conf/conf.go @@ -3,14 +3,18 @@ package conf import ( "embed" "fmt" + "io/fs" "log" + "music-server/cmd/web" "music-server/pkg/api" "music-server/pkg/db" "music-server/pkg/helpers" "music-server/pkg/server" + "net/http" "os" "strconv" + "github.com/a-h/templ" "github.com/gin-contrib/static" "github.com/gin-gonic/gin" ) @@ -77,7 +81,7 @@ func CloseDb() { defer db.CloseDb() } -func SetupRestServer(swagger embed.FS, search embed.FS) { +func SetupRestServer(swagger embed.FS) { router := gin.Default() router.Use(helpers.SetCorsAndNoCacheHeaders()) @@ -114,12 +118,20 @@ func SetupRestServer(swagger embed.FS, search embed.FS) { index := api.NewIndex() router.GET("/version", index.GetVersion) - router.GET("/test", index.GetDBTest) + router.GET("/health", index.GetDBTest) router.StaticFS("/swagger", helpers.EmbedFolder(swagger, "swagger", false)) - router.StaticFS("/search", helpers.EmbedFolder(search, "search", true)) router.Use(static.Serve("/", static.LocalFile("/frontend", true))) router.Use(static.Serve("/new", static.LocalFile("/newFrontend", true))) - //router.Use(static.Serve("/search", static.LocalFile("/search", true))) + + staticFiles, _ := fs.Sub(web.Files, "assets") + router.StaticFS("/assets", http.FS(staticFiles)) + router.GET("/search", func(c *gin.Context) { + templ.Handler(web.HelloForm()).ServeHTTP(c.Writer, c.Request) + }) + + router.POST("/find", func(c *gin.Context) { + web.FindGameWebHandler(c.Writer, c.Request) + }) port := os.Getenv("PORT") if port == "" { diff --git a/pkg/db/dbHelper.go b/pkg/db/dbHelper.go index b6038c6..37accd8 100644 --- a/pkg/db/dbHelper.go +++ b/pkg/db/dbHelper.go @@ -5,12 +5,14 @@ import ( "database/sql" "fmt" "log" + newDb "music-server/db" "os" - "github.com/golang-migrate/migrate" - "github.com/golang-migrate/migrate/database/postgres" - _ "github.com/golang-migrate/migrate/database/postgres" - _ "github.com/golang-migrate/migrate/source/file" + "github.com/golang-migrate/migrate/v4" + "github.com/golang-migrate/migrate/v4/database/postgres" + _ "github.com/golang-migrate/migrate/v4/database/postgres" + _ "github.com/golang-migrate/migrate/v4/source/file" + "github.com/golang-migrate/migrate/v4/source/iofs" "github.com/jackc/pgx/v5/pgxpool" _ "github.com/lib/pq" ) @@ -84,12 +86,20 @@ func Migrate_db(host string, port int, user string, password string, dbname stri if err != nil { log.Println(err) } - m, err := migrate.NewWithDatabaseInstance( + files, err := iofs.New(newDb.MigrationsFs, "migrations") + if err != nil { + log.Fatal(err) + } + m, err := migrate.NewWithInstance("iofs", files, "postgres", driver) + if err != nil { + log.Fatal(err) + } + /*m, err := migrate.NewWithDatabaseInstance( "file://./db/migrations/", "postgres", driver) if err != nil { log.Println(err) - } + }*/ version, _, err := m.Version() if err != nil { diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..4ec3451 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,11 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./cmd/web/**/*.html", "./cmd/web/**/*.templ", + ], + theme: { + extend: {}, + }, + plugins: [], +} +