@puzzmo/sdk 1.0.7 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -34
- package/dist/{createSimulator-Ctg-fdCI.cjs → createSimulator-BmeD2jIP.cjs} +31 -31
- package/dist/createSimulator-BmeD2jIP.cjs.map +1 -0
- package/dist/{createSimulator-BZYymqOG.js → createSimulator-D-ln1AMv.js} +237 -240
- package/dist/createSimulator-D-ln1AMv.js.map +1 -0
- package/dist/{workshop.d.ts → editor.d.ts} +16 -3
- package/dist/editor.d.ts.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -11
- package/dist/index.js.map +1 -1
- package/dist/objectSpread2-C4RR_HMd.cjs +1 -0
- package/dist/objectSpread2-CJo2CZQ6.js +76 -0
- package/dist/sdk.d.ts.map +1 -1
- package/dist/simulator/createSimulator.d.ts +11 -7
- package/dist/simulator/createSimulator.d.ts.map +1 -1
- package/dist/simulator/index.cjs +1 -1
- package/dist/simulator/index.js +1 -1
- package/dist/simulator/standalone.cjs +1 -1
- package/dist/simulator/standalone.cjs.map +1 -1
- package/dist/simulator/standalone.js +4 -4
- package/dist/simulator/standalone.js.map +1 -1
- package/dist/simulator/types.d.ts +0 -2
- package/dist/simulator/types.d.ts.map +1 -1
- package/dist/types.d.ts +49 -29
- package/dist/types.d.ts.map +1 -1
- package/dist/vite.cjs +3 -3
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.d.ts +18 -2
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +79 -23
- package/dist/vite.js.map +1 -1
- package/package.json +1 -1
- package/dist/asyncToGenerator-BlxRHn40.cjs +0 -1
- package/dist/asyncToGenerator-CPSNHDFw.js +0 -25
- package/dist/createSimulator-BZYymqOG.js.map +0 -1
- package/dist/createSimulator-Ctg-fdCI.cjs.map +0 -1
- package/dist/objectSpread2-B6tAAMuy.cjs +0 -1
- package/dist/objectSpread2-vLYiAtaU.js +0 -52
- package/dist/workshop.d.ts.map +0 -1
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t } from "./objectSpread2-vLYiAtaU.js";
|
|
1
|
+
import { n as e, t } from "./objectSpread2-CJo2CZQ6.js";
|
|
3
2
|
const n = [
|
|
4
3
|
{
|
|
5
4
|
name: "Puzzmo (light)",
|
|
@@ -541,7 +540,7 @@ var S = "simulator-saved-states";
|
|
|
541
540
|
/**
|
|
542
541
|
* Find thumbnail function on globalThis (looks for functions ending in "Thumbnail")
|
|
543
542
|
*/
|
|
544
|
-
function
|
|
543
|
+
function C() {
|
|
545
544
|
let e = globalThis;
|
|
546
545
|
for (let t of Object.keys(e)) if (t.endsWith("Thumbnail") && typeof e[t] == "function") return {
|
|
547
546
|
name: t,
|
|
@@ -552,8 +551,8 @@ function ie() {
|
|
|
552
551
|
/**
|
|
553
552
|
* Generate a small thumbnail SVG for a given input string
|
|
554
553
|
*/
|
|
555
|
-
function
|
|
556
|
-
let n =
|
|
554
|
+
function w(e, t) {
|
|
555
|
+
let n = C();
|
|
557
556
|
if (!n) return "";
|
|
558
557
|
try {
|
|
559
558
|
let r = e.state.puzzleData ? JSON.stringify(e.state.puzzleData) : "", i = {
|
|
@@ -567,14 +566,14 @@ function C(e, t) {
|
|
|
567
566
|
return "";
|
|
568
567
|
}
|
|
569
568
|
}
|
|
570
|
-
var
|
|
571
|
-
function
|
|
569
|
+
var T = [];
|
|
570
|
+
function E(e, t = 8) {
|
|
572
571
|
let n = 14 * t + 8 + 4;
|
|
573
572
|
e.style.height = "auto";
|
|
574
573
|
let r = Math.min(Math.max(e.scrollHeight, 40), n);
|
|
575
574
|
e.style.height = `${r}px`;
|
|
576
575
|
}
|
|
577
|
-
function
|
|
576
|
+
function ie() {
|
|
578
577
|
let e = "", t = "";
|
|
579
578
|
return {
|
|
580
579
|
id: "data",
|
|
@@ -592,22 +591,22 @@ function ae() {
|
|
|
592
591
|
let i = n.getElement(".data-view-container");
|
|
593
592
|
i == null || i.querySelectorAll(".data-subtab-content").forEach((e) => {
|
|
594
593
|
e.classList.toggle("active", e.id === `data-subtab-${t}`);
|
|
595
|
-
}), t === "edit" ?
|
|
594
|
+
}), t === "edit" ? j(n) : t === "history" ? O(n) : t === "saves" && k(n);
|
|
596
595
|
});
|
|
597
596
|
});
|
|
598
597
|
let i = n.getElement("#simulator-puzzle"), a = n.getElement("#simulator-input"), o = n.getElement("#simulator-puzzle-reset"), s = n.getElement("#simulator-puzzle-apply"), c = n.getElement("#simulator-input-reset"), l = n.getElement("#simulator-input-apply"), u = n.getElement("#simulator-start"), d = n.getElement("#simulator-pause");
|
|
599
598
|
setTimeout(() => {
|
|
600
|
-
i && n.state.originalPuzzle && (i.value = n.state.originalPuzzle, e = n.state.originalPuzzle,
|
|
599
|
+
i && n.state.originalPuzzle && (i.value = n.state.originalPuzzle, e = n.state.originalPuzzle, E(i)), a && n.state.currentInputStr && (a.value = n.state.currentInputStr, t = n.state.currentInputStr, E(a));
|
|
601
600
|
}, 0), i == null || i.addEventListener("input", () => {
|
|
602
|
-
|
|
601
|
+
E(i);
|
|
603
602
|
let t = i.value !== e;
|
|
604
603
|
s && (s.disabled = !t);
|
|
605
604
|
}), a == null || a.addEventListener("input", () => {
|
|
606
|
-
|
|
605
|
+
E(a);
|
|
607
606
|
let e = a.value !== t;
|
|
608
607
|
l && (l.disabled = !e);
|
|
609
608
|
}), o == null || o.addEventListener("click", () => {
|
|
610
|
-
i && (i.value = n.state.originalPuzzle, e = n.state.originalPuzzle,
|
|
609
|
+
i && (i.value = n.state.originalPuzzle, e = n.state.originalPuzzle, E(i), s && (s.disabled = !0));
|
|
611
610
|
}), s == null || s.addEventListener("click", () => {
|
|
612
611
|
if (i) try {
|
|
613
612
|
let t = JSON.parse(i.value);
|
|
@@ -616,47 +615,47 @@ function ae() {
|
|
|
616
615
|
console.error("Simulator: Invalid puzzle JSON", e), n.updateStatus("Invalid JSON", "paused");
|
|
617
616
|
}
|
|
618
617
|
}), c == null || c.addEventListener("click", () => {
|
|
619
|
-
a && (a.value = t,
|
|
618
|
+
a && (a.value = t, E(a), l && (l.disabled = !0));
|
|
620
619
|
}), l == null || l.addEventListener("click", () => {
|
|
621
620
|
a && (n.state.currentInputStr = a.value, t = a.value, console.log("Simulator: Input string updated (game restart required to apply)"), n.updateStatus("Input stored", "ready"), l.disabled = !0);
|
|
622
621
|
});
|
|
623
622
|
let f = n.getElement("#simulator-history-clear");
|
|
624
623
|
f == null || f.addEventListener("click", () => {
|
|
625
|
-
|
|
624
|
+
T = [], O(n);
|
|
626
625
|
});
|
|
627
626
|
let p = n.getElement("#simulator-save-name"), m = n.getElement("#simulator-save-btn");
|
|
628
627
|
m == null || m.addEventListener("click", () => {
|
|
629
628
|
if (!p || !p.value.trim()) return;
|
|
630
|
-
let e =
|
|
629
|
+
let e = D(), t = {
|
|
631
630
|
name: p.value.trim(),
|
|
632
631
|
puzzleStr: n.state.originalPuzzle,
|
|
633
632
|
inputStr: n.state.currentInputStr,
|
|
634
633
|
timestamp: Date.now()
|
|
635
634
|
};
|
|
636
|
-
e.push(t), localStorage.setItem(S, JSON.stringify(e)), p.value = "",
|
|
637
|
-
}),
|
|
635
|
+
e.push(t), localStorage.setItem(S, JSON.stringify(e)), p.value = "", k(n);
|
|
636
|
+
}), k(n);
|
|
638
637
|
},
|
|
639
638
|
onActivate(n) {
|
|
640
|
-
e = n.state.originalPuzzle, t = n.state.currentInputStr,
|
|
639
|
+
e = n.state.originalPuzzle, t = n.state.currentInputStr, j(n), O(n);
|
|
641
640
|
},
|
|
642
641
|
onMessage(e, n, r) {
|
|
643
642
|
var i, a;
|
|
644
643
|
let o = r.getElement("#simulator-input"), s = r.getElement("#simulator-input-apply"), c = (i = n == null || (a = n.input) == null ? void 0 : a.boardState) == null ? n == null ? void 0 : n.boardState : i;
|
|
645
644
|
if (e === "UPLOAD_NEW_GAME_STATE" && c) {
|
|
646
|
-
if (r.state.currentInputStr = c,
|
|
647
|
-
|
|
645
|
+
if (r.state.currentInputStr = c, T.length === 0 || T[T.length - 1].value !== c) {
|
|
646
|
+
T.push({
|
|
648
647
|
value: c,
|
|
649
648
|
timestamp: Date.now()
|
|
650
|
-
}),
|
|
649
|
+
}), T.length > 100 && (T = T.slice(-100));
|
|
651
650
|
let e = r.getElement("#data-subtab-history");
|
|
652
|
-
e != null && e.classList.contains("active") &&
|
|
651
|
+
e != null && e.classList.contains("active") && O(r);
|
|
653
652
|
}
|
|
654
|
-
o && (o.value = r.state.currentInputStr, t = r.state.currentInputStr,
|
|
653
|
+
o && (o.value = r.state.currentInputStr, t = r.state.currentInputStr, E(o), s && (s.disabled = !0));
|
|
655
654
|
}
|
|
656
655
|
}
|
|
657
656
|
};
|
|
658
657
|
}
|
|
659
|
-
function
|
|
658
|
+
function D() {
|
|
660
659
|
try {
|
|
661
660
|
let e = localStorage.getItem(S);
|
|
662
661
|
return e ? JSON.parse(e) : [];
|
|
@@ -664,35 +663,35 @@ function E() {
|
|
|
664
663
|
return [];
|
|
665
664
|
}
|
|
666
665
|
}
|
|
667
|
-
function
|
|
666
|
+
function O(e) {
|
|
668
667
|
let t = e.getElement("#simulator-history-list");
|
|
669
668
|
if (t) {
|
|
670
|
-
if (t.style.setProperty("--history-thumb-bg", e.state.selectedTheme.a_bg),
|
|
669
|
+
if (t.style.setProperty("--history-thumb-bg", e.state.selectedTheme.a_bg), T.length === 0) {
|
|
671
670
|
t.innerHTML = "<div class=\"simulator-empty\">No history yet</div>";
|
|
672
671
|
return;
|
|
673
672
|
}
|
|
674
|
-
t.innerHTML = [...
|
|
675
|
-
let r =
|
|
673
|
+
t.innerHTML = [...T].reverse().map((t, n) => {
|
|
674
|
+
let r = T.length - 1 - n, i = new Date(t.timestamp).toLocaleTimeString(), a = t.value.length > 60 ? t.value.slice(0, 60) + "..." : t.value;
|
|
676
675
|
return `
|
|
677
676
|
<div class="history-item" data-history-idx="${r}">
|
|
678
|
-
<div class="history-item-thumb">${
|
|
677
|
+
<div class="history-item-thumb">${w(e, t.value)}</div>
|
|
679
678
|
<div class="history-item-content">
|
|
680
679
|
<div class="history-item-header">
|
|
681
680
|
<span class="history-item-num">#${r + 1}</span>
|
|
682
681
|
<span class="history-item-time">${i}</span>
|
|
683
682
|
<button class="simulator-btn tiny history-restore-btn" data-history-idx="${r}">Restore</button>
|
|
684
683
|
</div>
|
|
685
|
-
<div class="history-item-preview">${
|
|
684
|
+
<div class="history-item-preview">${A(a)}</div>
|
|
686
685
|
</div>
|
|
687
686
|
</div>
|
|
688
687
|
`;
|
|
689
688
|
}).join(""), t.querySelectorAll(".history-restore-btn").forEach((t) => {
|
|
690
689
|
t.addEventListener("click", (t) => {
|
|
691
|
-
let n = parseInt(t.target.getAttribute("data-history-idx") || "0"), r =
|
|
690
|
+
let n = parseInt(t.target.getAttribute("data-history-idx") || "0"), r = T[n];
|
|
692
691
|
if (r) {
|
|
693
692
|
e.state.currentInputStr = r.value;
|
|
694
693
|
let t = e.getElement("#simulator-input");
|
|
695
|
-
t && (t.value = r.value,
|
|
694
|
+
t && (t.value = r.value, E(t)), e.updateStatus("Input restored from history", "ready");
|
|
696
695
|
let n = e.getElement(".data-subtab[data-subtab=\"edit\"]");
|
|
697
696
|
n == null || n.click();
|
|
698
697
|
}
|
|
@@ -700,10 +699,10 @@ function D(e) {
|
|
|
700
699
|
});
|
|
701
700
|
}
|
|
702
701
|
}
|
|
703
|
-
function
|
|
702
|
+
function k(e) {
|
|
704
703
|
let t = e.getElement("#simulator-saves-list");
|
|
705
704
|
if (!t) return;
|
|
706
|
-
let n =
|
|
705
|
+
let n = D();
|
|
707
706
|
if (n.length === 0) {
|
|
708
707
|
t.innerHTML = "<div class=\"simulator-empty\">No saved states</div>";
|
|
709
708
|
return;
|
|
@@ -713,7 +712,7 @@ function O(e) {
|
|
|
713
712
|
return `
|
|
714
713
|
<div class="save-item">
|
|
715
714
|
<div class="save-item-header">
|
|
716
|
-
<span class="save-item-name">${
|
|
715
|
+
<span class="save-item-name">${A(e.name)}</span>
|
|
717
716
|
<span class="save-item-time">${i} ${a}</span>
|
|
718
717
|
</div>
|
|
719
718
|
<div class="save-item-actions">
|
|
@@ -733,7 +732,7 @@ function O(e) {
|
|
|
733
732
|
}
|
|
734
733
|
e.state.currentInputStr = r.inputStr;
|
|
735
734
|
let t = e.getElement("#simulator-puzzle"), n = e.getElement("#simulator-input");
|
|
736
|
-
t && (t.value = r.puzzleStr,
|
|
735
|
+
t && (t.value = r.puzzleStr, E(t)), n && (n.value = r.inputStr, E(n)), e.updateStatus(`Loaded: ${r.name}`, "ready");
|
|
737
736
|
let i = e.getElement(".data-subtab[data-subtab=\"edit\"]");
|
|
738
737
|
i == null || i.click();
|
|
739
738
|
}
|
|
@@ -741,21 +740,21 @@ function O(e) {
|
|
|
741
740
|
}), t.querySelectorAll(".save-delete-btn").forEach((t) => {
|
|
742
741
|
t.addEventListener("click", (t) => {
|
|
743
742
|
let r = parseInt(t.target.getAttribute("data-save-idx") || "0"), i = n.filter((e, t) => t !== r);
|
|
744
|
-
localStorage.setItem(S, JSON.stringify(i)),
|
|
743
|
+
localStorage.setItem(S, JSON.stringify(i)), k(e);
|
|
745
744
|
});
|
|
746
745
|
});
|
|
747
746
|
}
|
|
748
|
-
function
|
|
747
|
+
function A(e) {
|
|
749
748
|
return e.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
750
749
|
}
|
|
751
|
-
function
|
|
750
|
+
function j(e) {
|
|
752
751
|
let t = e.getElement("#simulator-puzzle"), n = e.getElement("#simulator-input"), r = e.getElement("#simulator-puzzle-apply"), i = e.getElement("#simulator-input-apply");
|
|
753
|
-
t && e.state.originalPuzzle && (t.value = e.state.originalPuzzle,
|
|
752
|
+
t && e.state.originalPuzzle && (t.value = e.state.originalPuzzle, E(t), r && (r.disabled = !0)), n && (n.value = e.state.currentInputStr, E(n), i && (i.disabled = !0));
|
|
754
753
|
}
|
|
755
|
-
function
|
|
754
|
+
function M(e) {
|
|
756
755
|
return e.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
757
756
|
}
|
|
758
|
-
function
|
|
757
|
+
function ae() {
|
|
759
758
|
let e = 0;
|
|
760
759
|
return {
|
|
761
760
|
id: "msgs",
|
|
@@ -782,7 +781,7 @@ function oe() {
|
|
|
782
781
|
<span class="simulator-msg-type">${t.direction === "out" ? "→" : "←"} ${t.type}</span>
|
|
783
782
|
<span class="simulator-msg-time">${t.time}</span>
|
|
784
783
|
</div>
|
|
785
|
-
${a ? `<div class="simulator-msg-data">${
|
|
784
|
+
${a ? `<div class="simulator-msg-data">${M(a)}</div>` : ""}
|
|
786
785
|
`;
|
|
787
786
|
let o = i.querySelector(".simulator-msg-data");
|
|
788
787
|
for (o && o.addEventListener("click", () => {
|
|
@@ -793,7 +792,7 @@ function oe() {
|
|
|
793
792
|
}
|
|
794
793
|
};
|
|
795
794
|
}
|
|
796
|
-
function
|
|
795
|
+
function oe() {
|
|
797
796
|
return {
|
|
798
797
|
id: "done",
|
|
799
798
|
label: "Done",
|
|
@@ -826,7 +825,7 @@ function se() {
|
|
|
826
825
|
}
|
|
827
826
|
};
|
|
828
827
|
}
|
|
829
|
-
function
|
|
828
|
+
function se() {
|
|
830
829
|
let e = [], t = () => (/* @__PURE__ */ new Date()).toLocaleTimeString("en-US", { hour12: !1 }), n = (e) => {
|
|
831
830
|
let { checkpointName: t, augConfig: n, time: r } = e, i = n == null ? void 0 : n.deeds;
|
|
832
831
|
return `
|
|
@@ -879,7 +878,7 @@ function ce() {
|
|
|
879
878
|
/**
|
|
880
879
|
* Find thumbnail function on globalThis (looks for functions ending in "Thumbnail")
|
|
881
880
|
*/
|
|
882
|
-
function
|
|
881
|
+
function N() {
|
|
883
882
|
let e = globalThis;
|
|
884
883
|
for (let t of Object.keys(e)) if (t.endsWith("Thumbnail") && typeof e[t] == "function") return {
|
|
885
884
|
name: t,
|
|
@@ -887,7 +886,7 @@ function M() {
|
|
|
887
886
|
};
|
|
888
887
|
return null;
|
|
889
888
|
}
|
|
890
|
-
function
|
|
889
|
+
function ce() {
|
|
891
890
|
return {
|
|
892
891
|
id: "thumb",
|
|
893
892
|
label: "Thumb",
|
|
@@ -912,7 +911,7 @@ function le() {
|
|
|
912
911
|
updatePreview: (e) => {
|
|
913
912
|
let t = e.getElement("#simulator-thumb-preview"), n = e.getElement("#simulator-thumb-fn");
|
|
914
913
|
t == null || t.style.setProperty("--sim-thumb-bg", e.state.selectedTheme.g_bg);
|
|
915
|
-
let r =
|
|
914
|
+
let r = N();
|
|
916
915
|
if (!r) {
|
|
917
916
|
t && (t.innerHTML = "<span class=\"simulator-empty\">No thumbnail function found</span>"), n && (n.textContent = "");
|
|
918
917
|
return;
|
|
@@ -936,7 +935,7 @@ function le() {
|
|
|
936
935
|
/**
|
|
937
936
|
* Generate theme preview HTML showing key colors
|
|
938
937
|
*/
|
|
939
|
-
function
|
|
938
|
+
function P(e) {
|
|
940
939
|
let t = [
|
|
941
940
|
e.key,
|
|
942
941
|
e.subBrand,
|
|
@@ -947,7 +946,7 @@ function N(e) {
|
|
|
947
946
|
].map((e) => `<div class="simulator-theme-preview-cell" style="background: ${e}"></div>`).join("");
|
|
948
947
|
return `<div class="simulator-theme-preview" style="background: ${e.g_bg}">${t}</div>`;
|
|
949
948
|
}
|
|
950
|
-
function
|
|
949
|
+
function le() {
|
|
951
950
|
return {
|
|
952
951
|
id: "theme",
|
|
953
952
|
label: "Theme",
|
|
@@ -959,7 +958,7 @@ function ue() {
|
|
|
959
958
|
t && n.forEach((n) => {
|
|
960
959
|
let r = document.createElement("div");
|
|
961
960
|
r.className = `simulator-theme-item${n.name === e.state.selectedTheme.name ? " selected" : ""}`, r.innerHTML = `
|
|
962
|
-
${
|
|
961
|
+
${P(n)}
|
|
963
962
|
<div class="simulator-theme-name">${n.name}</div>
|
|
964
963
|
<div class="simulator-theme-type">${n.type}</div>
|
|
965
964
|
`, r.addEventListener("click", () => {
|
|
@@ -969,42 +968,42 @@ function ue() {
|
|
|
969
968
|
}
|
|
970
969
|
};
|
|
971
970
|
}
|
|
972
|
-
var
|
|
973
|
-
localStorage.setItem(
|
|
974
|
-
},
|
|
971
|
+
var F = "puzzmo_sim_api_mode", I = "http://localhost:8911", L = "https://api.puzzmo.com", R = () => localStorage.getItem(F) === "dev" ? "dev" : "prod", z = (e) => {
|
|
972
|
+
localStorage.setItem(F, e);
|
|
973
|
+
}, B = null, V = function() {
|
|
975
974
|
var t = e(function* () {
|
|
976
|
-
if (
|
|
975
|
+
if (B !== null) return B;
|
|
977
976
|
try {
|
|
978
|
-
let e = new AbortController(), t = setTimeout(() => e.abort(), 1e3), n = yield fetch(`${
|
|
979
|
-
return clearTimeout(t),
|
|
977
|
+
let e = new AbortController(), t = setTimeout(() => e.abort(), 1e3), n = yield fetch(`${I}/healthz`, { signal: e.signal });
|
|
978
|
+
return clearTimeout(t), B = n.ok, B;
|
|
980
979
|
} catch (e) {
|
|
981
|
-
return
|
|
980
|
+
return B = !1, !1;
|
|
982
981
|
}
|
|
983
982
|
});
|
|
984
983
|
return function() {
|
|
985
984
|
return t.apply(this, arguments);
|
|
986
985
|
};
|
|
987
|
-
}(),
|
|
988
|
-
apiURL:
|
|
986
|
+
}(), H = () => ({
|
|
987
|
+
apiURL: R() === "dev" ? I : L,
|
|
989
988
|
clientID: "protosdk:oauthclient",
|
|
990
989
|
redirectUri: `${window.location.origin}/oauth/callback`
|
|
991
|
-
}),
|
|
990
|
+
}), U = () => {
|
|
992
991
|
let e = new Uint8Array(32);
|
|
993
992
|
return crypto.getRandomValues(e), Array.from(e, (e) => e.toString(16).padStart(2, "0")).join("");
|
|
994
|
-
},
|
|
995
|
-
let e = localStorage.getItem(
|
|
993
|
+
}, W = "puzzmo_sim_oauth_token", G = "puzzmo_sim_oauth_refresh_token", K = (e) => localStorage.setItem(W, e), ue = (e) => localStorage.setItem(G, e), q = () => {
|
|
994
|
+
let e = localStorage.getItem(W);
|
|
996
995
|
return console.log("[AuthView] getAccessToken:", {
|
|
997
|
-
TOKEN_KEY:
|
|
996
|
+
TOKEN_KEY: W,
|
|
998
997
|
token: e ? `${e.substring(0, 20)}...` : null
|
|
999
998
|
}), e;
|
|
1000
|
-
},
|
|
1001
|
-
localStorage.removeItem(
|
|
1002
|
-
},
|
|
1003
|
-
let e =
|
|
999
|
+
}, J = () => localStorage.getItem(G), Y = () => {
|
|
1000
|
+
localStorage.removeItem(W), localStorage.removeItem(G);
|
|
1001
|
+
}, de = () => {
|
|
1002
|
+
let e = H(), t = U();
|
|
1004
1003
|
sessionStorage.setItem("oauth_state", t), sessionStorage.setItem("oauth_return_url", window.location.href);
|
|
1005
1004
|
let n = new URL(`${e.apiURL}/oauth/auth`);
|
|
1006
1005
|
n.searchParams.set("client_id", e.clientID), n.searchParams.set("response_type", "code"), n.searchParams.set("redirect_uri", e.redirectUri), n.searchParams.set("state", t), window.location.href = n.toString();
|
|
1007
|
-
},
|
|
1006
|
+
}, fe = (e) => {
|
|
1008
1007
|
try {
|
|
1009
1008
|
let t = e.split(".");
|
|
1010
1009
|
if (t.length !== 3) return !0;
|
|
@@ -1013,11 +1012,11 @@ var P = "puzzmo_sim_api_mode", F = "http://localhost:8911", I = "https://api.puz
|
|
|
1013
1012
|
} catch (e) {
|
|
1014
1013
|
return !0;
|
|
1015
1014
|
}
|
|
1016
|
-
},
|
|
1015
|
+
}, pe = function() {
|
|
1017
1016
|
var t = e(function* () {
|
|
1018
|
-
let e =
|
|
1017
|
+
let e = J();
|
|
1019
1018
|
if (!e) return console.log("[AuthView] No refresh token available"), !1;
|
|
1020
|
-
let t =
|
|
1019
|
+
let t = H();
|
|
1021
1020
|
try {
|
|
1022
1021
|
let n = new URLSearchParams({
|
|
1023
1022
|
grant_type: "refresh_token",
|
|
@@ -1031,9 +1030,9 @@ var P = "puzzmo_sim_api_mode", F = "http://localhost:8911", I = "https://api.puz
|
|
|
1031
1030
|
if (!r.ok) return console.error("[AuthView] Failed to refresh token:", r.statusText), !1;
|
|
1032
1031
|
let i = yield r.json(), a = i.access_token || i.accessToken;
|
|
1033
1032
|
if (!a) return console.error("[AuthView] No access token in refresh response"), !1;
|
|
1034
|
-
|
|
1033
|
+
K(a);
|
|
1035
1034
|
let o = i.refresh_token || i.refreshToken;
|
|
1036
|
-
return o &&
|
|
1035
|
+
return o && ue(o), console.log("[AuthView] Successfully refreshed access token"), !0;
|
|
1037
1036
|
} catch (e) {
|
|
1038
1037
|
return console.error("[AuthView] Error refreshing token:", e), !1;
|
|
1039
1038
|
}
|
|
@@ -1041,9 +1040,9 @@ var P = "puzzmo_sim_api_mode", F = "http://localhost:8911", I = "https://api.puz
|
|
|
1041
1040
|
return function() {
|
|
1042
1041
|
return t.apply(this, arguments);
|
|
1043
1042
|
};
|
|
1044
|
-
}(),
|
|
1043
|
+
}(), me = function() {
|
|
1045
1044
|
var t = e(function* (e, t) {
|
|
1046
|
-
let n =
|
|
1045
|
+
let n = H(), r = sessionStorage.getItem("oauth_state");
|
|
1047
1046
|
if (!r || r !== t) return console.error("OAuth state mismatch - possible CSRF attack"), null;
|
|
1048
1047
|
sessionStorage.removeItem("oauth_state");
|
|
1049
1048
|
try {
|
|
@@ -1065,13 +1064,13 @@ var P = "puzzmo_sim_api_mode", F = "http://localhost:8911", I = "https://api.puz
|
|
|
1065
1064
|
return function(e, n) {
|
|
1066
1065
|
return t.apply(this, arguments);
|
|
1067
1066
|
};
|
|
1068
|
-
}(),
|
|
1067
|
+
}(), he = function() {
|
|
1069
1068
|
var t = e(function* (e, t = {}) {
|
|
1070
|
-
let n =
|
|
1069
|
+
let n = H(), r = q();
|
|
1071
1070
|
if (!r) throw Error("Not authenticated");
|
|
1072
|
-
if (
|
|
1073
|
-
if (r =
|
|
1074
|
-
} else throw
|
|
1071
|
+
if (fe(r)) if (console.log("[AuthView] Access token expired, attempting refresh..."), yield pe()) {
|
|
1072
|
+
if (r = q(), !r) throw Error("Token refresh succeeded but no token available");
|
|
1073
|
+
} else throw Y(), Error("Session expired. Please log in again.");
|
|
1075
1074
|
let i = yield fetch(`${n.apiURL}/graphql`, {
|
|
1076
1075
|
method: "POST",
|
|
1077
1076
|
headers: {
|
|
@@ -1090,7 +1089,7 @@ var P = "puzzmo_sim_api_mode", F = "http://localhost:8911", I = "https://api.puz
|
|
|
1090
1089
|
return function(e) {
|
|
1091
1090
|
return t.apply(this, arguments);
|
|
1092
1091
|
};
|
|
1093
|
-
}(),
|
|
1092
|
+
}(), ge = (e) => {
|
|
1094
1093
|
try {
|
|
1095
1094
|
console.log("[AuthView] decodeJWT input:", e);
|
|
1096
1095
|
let t = e.split(".");
|
|
@@ -1101,15 +1100,15 @@ var P = "puzzmo_sim_api_mode", F = "http://localhost:8911", I = "https://api.puz
|
|
|
1101
1100
|
return console.error("[AuthView] decodeJWT error:", e), null;
|
|
1102
1101
|
}
|
|
1103
1102
|
};
|
|
1104
|
-
function
|
|
1103
|
+
function _e() {
|
|
1105
1104
|
let t = !1;
|
|
1106
1105
|
return {
|
|
1107
1106
|
id: "auth",
|
|
1108
1107
|
label: "Auth",
|
|
1109
1108
|
render() {
|
|
1110
|
-
let e =
|
|
1109
|
+
let e = q(), t = !!e, n = R(), r = n === "dev" ? I : L, i = `<button class="simulator-btn tiny" id="auth-dev-toggle" style="display: none;">${n === "dev" ? "Using Dev" : "Dev"}</button>`;
|
|
1111
1110
|
if (t) {
|
|
1112
|
-
let t =
|
|
1111
|
+
let t = ge(e), n = t != null && t.exp ? (/* @__PURE__ */ new Date(t.exp * 1e3)).toLocaleString() : "Unknown", a = !!J(), o = a ? ge(J()) : null, s = o != null && o.exp ? (/* @__PURE__ */ new Date(o.exp * 1e3)).toLocaleString() : null;
|
|
1113
1112
|
return console.log({ decoded: t }), `
|
|
1114
1113
|
<div class="simulator-section">
|
|
1115
1114
|
<div class="simulator-section-title auth-title-row">
|
|
@@ -1150,7 +1149,7 @@ function ve() {
|
|
|
1150
1149
|
</div>
|
|
1151
1150
|
<p class="auth-description">
|
|
1152
1151
|
Login with your Puzzmo account to make authenticated API requests.
|
|
1153
|
-
${n === "dev" ? `<br><strong>Using local dev server:</strong> ${
|
|
1152
|
+
${n === "dev" ? `<br><strong>Using local dev server:</strong> ${I}` : ""}
|
|
1154
1153
|
</p>
|
|
1155
1154
|
<div class="simulator-row">
|
|
1156
1155
|
<button class="simulator-btn primary" id="auth-login">Login with Puzzmo</button>
|
|
@@ -1161,21 +1160,21 @@ function ve() {
|
|
|
1161
1160
|
},
|
|
1162
1161
|
bind(n) {
|
|
1163
1162
|
let r = n.getElement("#auth-login"), i = n.getElement("#auth-logout"), a = n.getElement("#auth-refresh"), o = n.getElement("#auth-test-api"), s = n.getElement("#auth-api-result"), c = n.getElement("#auth-dev-toggle");
|
|
1164
|
-
t ?
|
|
1165
|
-
e && c && (c.style.display = "",
|
|
1163
|
+
t ? B && c && (c.style.display = "", R() === "dev" && c.classList.add("active")) : (t = !0, V().then((e) => {
|
|
1164
|
+
e && c && (c.style.display = "", R() === "dev" && c.classList.add("active"));
|
|
1166
1165
|
})), c == null || c.addEventListener("click", () => {
|
|
1167
|
-
R(
|
|
1166
|
+
z(R() === "dev" ? "prod" : "dev"), Y(), window.location.reload();
|
|
1168
1167
|
}), r == null || r.addEventListener("click", () => {
|
|
1169
|
-
|
|
1168
|
+
de();
|
|
1170
1169
|
}), i == null || i.addEventListener("click", () => {
|
|
1171
|
-
|
|
1170
|
+
Y(), window.location.reload();
|
|
1172
1171
|
}), a == null || a.addEventListener("click", e(function* () {
|
|
1173
|
-
a.disabled = !0, a.textContent = "Refreshing...", (yield
|
|
1172
|
+
a.disabled = !0, a.textContent = "Refreshing...", (yield pe()) ? window.location.reload() : (a.textContent = "Refresh Failed", a.disabled = !1);
|
|
1174
1173
|
})), o == null || o.addEventListener("click", e(function* () {
|
|
1175
1174
|
if (s) {
|
|
1176
1175
|
s.innerHTML = "<div class=\"loading\">Loading...</div>";
|
|
1177
1176
|
try {
|
|
1178
|
-
let t = yield
|
|
1177
|
+
let t = yield he("\n query {\n currentUser {\n id\n username\n usernameID\n name\n }\n }\n ");
|
|
1179
1178
|
if (t.errors) {
|
|
1180
1179
|
var e;
|
|
1181
1180
|
s.innerHTML = `<div class="error">Error: ${((e = t.errors[0]) == null ? void 0 : e.message) || "Unknown error"}</div>`;
|
|
@@ -1197,13 +1196,13 @@ function ve() {
|
|
|
1197
1196
|
if (n && r) {
|
|
1198
1197
|
let e = t.getElement("#auth-status");
|
|
1199
1198
|
e && (e.innerHTML = "<span class=\"indicator waiting\"></span><span>Exchanging code...</span>");
|
|
1200
|
-
let i = yield
|
|
1199
|
+
let i = yield me(n, r);
|
|
1201
1200
|
if (window.history.replaceState({}, "", window.location.pathname), i) {
|
|
1202
1201
|
let e = i.access_token || i.accessToken;
|
|
1203
1202
|
if (e) {
|
|
1204
|
-
|
|
1203
|
+
K(e);
|
|
1205
1204
|
let t = i.refresh_token || i.refreshToken;
|
|
1206
|
-
t &&
|
|
1205
|
+
t && ue(t);
|
|
1207
1206
|
}
|
|
1208
1207
|
window.location.reload();
|
|
1209
1208
|
} else {
|
|
@@ -1215,9 +1214,9 @@ function ve() {
|
|
|
1215
1214
|
}
|
|
1216
1215
|
};
|
|
1217
1216
|
}
|
|
1218
|
-
var
|
|
1219
|
-
localStorage.removeItem(
|
|
1220
|
-
},
|
|
1217
|
+
var ve = "puzzmo_sim_api_mode", ye = "http://localhost:8911", be = "https://api.puzzmo.com", X = "puzzmo_sim_oauth_token", Z = "puzzmo_sim_oauth_refresh_token", xe = () => localStorage.getItem(ve) === "dev" ? "dev" : "prod", Q = () => localStorage.getItem(X), Se = () => localStorage.getItem(Z), Ce = (e) => localStorage.setItem(X, e), we = (e) => localStorage.setItem(Z, e), Te = () => {
|
|
1218
|
+
localStorage.removeItem(X), localStorage.removeItem(Z);
|
|
1219
|
+
}, Ee = (e) => {
|
|
1221
1220
|
try {
|
|
1222
1221
|
let t = e.split(".");
|
|
1223
1222
|
if (t.length !== 3) return !0;
|
|
@@ -1226,11 +1225,11 @@ var ye = "puzzmo_sim_api_mode", be = "http://localhost:8911", xe = "https://api.
|
|
|
1226
1225
|
} catch (e) {
|
|
1227
1226
|
return !0;
|
|
1228
1227
|
}
|
|
1229
|
-
},
|
|
1228
|
+
}, De = function() {
|
|
1230
1229
|
var t = e(function* () {
|
|
1231
|
-
let e =
|
|
1230
|
+
let e = Se();
|
|
1232
1231
|
if (!e) return !1;
|
|
1233
|
-
let t =
|
|
1232
|
+
let t = xe() === "dev" ? ye : be;
|
|
1234
1233
|
try {
|
|
1235
1234
|
let n = new URLSearchParams({
|
|
1236
1235
|
grant_type: "refresh_token",
|
|
@@ -1244,9 +1243,9 @@ var ye = "puzzmo_sim_api_mode", be = "http://localhost:8911", xe = "https://api.
|
|
|
1244
1243
|
if (!r.ok) return !1;
|
|
1245
1244
|
let i = yield r.json(), a = i.access_token || i.accessToken;
|
|
1246
1245
|
if (!a) return !1;
|
|
1247
|
-
|
|
1246
|
+
Ce(a);
|
|
1248
1247
|
let o = i.refresh_token || i.refreshToken;
|
|
1249
|
-
return o &&
|
|
1248
|
+
return o && we(o), !0;
|
|
1250
1249
|
} catch (e) {
|
|
1251
1250
|
return !1;
|
|
1252
1251
|
}
|
|
@@ -1254,13 +1253,13 @@ var ye = "puzzmo_sim_api_mode", be = "http://localhost:8911", xe = "https://api.
|
|
|
1254
1253
|
return function() {
|
|
1255
1254
|
return t.apply(this, arguments);
|
|
1256
1255
|
};
|
|
1257
|
-
}(),
|
|
1256
|
+
}(), Oe = function() {
|
|
1258
1257
|
var t = e(function* (e, t = {}) {
|
|
1259
|
-
let n =
|
|
1258
|
+
let n = xe() === "dev" ? ye : be, r = Q();
|
|
1260
1259
|
if (!r) throw Error("Not authenticated");
|
|
1261
|
-
if (
|
|
1262
|
-
if (r =
|
|
1263
|
-
} else throw
|
|
1260
|
+
if (Ee(r)) if (yield De()) {
|
|
1261
|
+
if (r = Q(), !r) throw Error("Token refresh succeeded but no token available");
|
|
1262
|
+
} else throw Te(), Error("Session expired. Please log in again.");
|
|
1264
1263
|
let i = yield fetch(`${n}/graphql`, {
|
|
1265
1264
|
method: "POST",
|
|
1266
1265
|
headers: {
|
|
@@ -1279,19 +1278,19 @@ var ye = "puzzmo_sim_api_mode", be = "http://localhost:8911", xe = "https://api.
|
|
|
1279
1278
|
return function(e) {
|
|
1280
1279
|
return t.apply(this, arguments);
|
|
1281
1280
|
};
|
|
1282
|
-
}(),
|
|
1281
|
+
}(), ke = "\n query GameFeaturesQuery($slug: ID!) {\n game(id: $slug) {\n id\n slug\n displayName\n featuresArr\n gameFeatures {\n slug\n title\n features {\n featureID\n title\n isEnabled\n }\n }\n }\n }\n", Ae = "\n mutation ToggleFeatureMutation($gameSlug: ID!, $input: UpdateGameInput!) {\n updateGame(id: $gameSlug, input: $input) {\n id\n featuresArr\n gameFeatures {\n slug\n title\n features {\n featureID\n title\n isEnabled\n }\n }\n }\n }\n", je = (e, t) => {
|
|
1283
1282
|
let n = t - 1, r = Math.floor(n / 31), i = n % 31, a = [...e];
|
|
1284
1283
|
for (; a.length <= r;) a.push(0);
|
|
1285
1284
|
return a[r] = a[r] ^ 1 << i, a;
|
|
1286
1285
|
};
|
|
1287
|
-
const
|
|
1286
|
+
const Me = () => !!Q();
|
|
1288
1287
|
function Ne() {
|
|
1289
1288
|
let n = null, r = !1, i = null, a = function() {
|
|
1290
1289
|
var t = e(function* (e) {
|
|
1291
1290
|
r = !0, i = null;
|
|
1292
1291
|
try {
|
|
1293
1292
|
var t;
|
|
1294
|
-
let r = yield ke
|
|
1293
|
+
let r = yield Oe(ke, { slug: e });
|
|
1295
1294
|
if (r.errors) {
|
|
1296
1295
|
var a;
|
|
1297
1296
|
i = ((a = r.errors[0]) == null ? void 0 : a.message) || "Unknown error", n = null;
|
|
@@ -1308,10 +1307,10 @@ function Ne() {
|
|
|
1308
1307
|
}(), o = function() {
|
|
1309
1308
|
var r = e(function* (e) {
|
|
1310
1309
|
if (!n) return;
|
|
1311
|
-
let r =
|
|
1310
|
+
let r = je(n.featuresArr, e);
|
|
1312
1311
|
try {
|
|
1313
1312
|
var i;
|
|
1314
|
-
let e = yield
|
|
1313
|
+
let e = yield Oe(Ae, {
|
|
1315
1314
|
gameSlug: n.slug,
|
|
1316
1315
|
input: { featuresArr: r }
|
|
1317
1316
|
});
|
|
@@ -1359,7 +1358,7 @@ function Ne() {
|
|
|
1359
1358
|
id: "features",
|
|
1360
1359
|
label: "Features",
|
|
1361
1360
|
render() {
|
|
1362
|
-
return
|
|
1361
|
+
return Me() ? `
|
|
1363
1362
|
<div class="features-view-container">
|
|
1364
1363
|
<div class="simulator-section">
|
|
1365
1364
|
<div class="simulator-section-title">Game Features</div>
|
|
@@ -1400,7 +1399,7 @@ function Ne() {
|
|
|
1400
1399
|
e && (yield d(e));
|
|
1401
1400
|
})), i == null || i.addEventListener("keypress", (e) => {
|
|
1402
1401
|
e.key === "Enter" && (r == null || r.click());
|
|
1403
|
-
}), console.log("[FeaturesView] bind called, ctx.gameSlug:", t.gameSlug, "slugInput:", i), t.gameSlug && i && (i.value = t.gameSlug,
|
|
1402
|
+
}), console.log("[FeaturesView] bind called, ctx.gameSlug:", t.gameSlug, "slugInput:", i), t.gameSlug && i && (i.value = t.gameSlug, Me() && !n && d(t.gameSlug)), u();
|
|
1404
1403
|
},
|
|
1405
1404
|
onActivate(e) {
|
|
1406
1405
|
let t = e.getElement("#simulator-tab-features");
|
|
@@ -1408,36 +1407,36 @@ function Ne() {
|
|
|
1408
1407
|
}
|
|
1409
1408
|
};
|
|
1410
1409
|
}
|
|
1411
|
-
var
|
|
1410
|
+
var $ = null;
|
|
1412
1411
|
/**
|
|
1413
1412
|
* Creates the Simulator UI and message handling.
|
|
1414
1413
|
* If called multiple times, updates the existing instance with new settings (e.g., fixtures).
|
|
1415
1414
|
*/
|
|
1416
|
-
function
|
|
1417
|
-
var n, r
|
|
1415
|
+
function Pe(t = {}) {
|
|
1416
|
+
var n, r;
|
|
1418
1417
|
if (console.log("[Simulator] createSimulator called with config:", {
|
|
1419
1418
|
slug: t.slug,
|
|
1420
1419
|
hasFixtures: !!t.fixtures
|
|
1421
1420
|
}), $) return t.fixtures && (console.log("[Simulator] Instance already exists, updating fixtures"), $.updateFixtures(t.fixtures)), $;
|
|
1422
|
-
let
|
|
1421
|
+
let i = (n = t.autoStart) == null ? !0 : n, a = t.fixtures ? v(t.fixtures) : null, o = a ? Array.from(a.keys()).sort() : [], s = ae(), c = ce(), f = [
|
|
1423
1422
|
re(),
|
|
1424
|
-
|
|
1425
|
-
|
|
1423
|
+
ie(),
|
|
1424
|
+
s,
|
|
1425
|
+
oe(),
|
|
1426
1426
|
se(),
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
ve(),
|
|
1427
|
+
c,
|
|
1428
|
+
le(),
|
|
1429
|
+
_e(),
|
|
1431
1430
|
Ne()
|
|
1432
|
-
],
|
|
1431
|
+
], p = f.map((e) => e.id), m = l(t, o, p), h = {
|
|
1433
1432
|
pause: "<svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\"><rect x=\"1\" y=\"1\" width=\"3\" height=\"8\"/><rect x=\"6\" y=\"1\" width=\"3\" height=\"8\"/></svg>",
|
|
1434
1433
|
play: "<svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\"><polygon points=\"2,1 9,5 2,9\"/></svg>",
|
|
1435
1434
|
retry: "<svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\"><path d=\"M5 1C2.8 1 1 2.8 1 5s1.8 4 4 4c1.8 0 3.3-1.2 3.8-2.8H7.5c-.4.9-1.3 1.5-2.5 1.5-1.5 0-2.7-1.2-2.7-2.7S3.5 2.3 5 2.3c.7 0 1.4.3 1.9.8L5.5 4.5H9V1L7.6 2.4C6.9 1.5 5.9 1 5 1z\"/></svg>",
|
|
1436
1435
|
cog: "<svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\"><path d=\"M9.5 5.8l-.8-.5c0-.2.1-.5.1-.8s0-.5-.1-.8l.8-.5c.1-.1.2-.2.1-.4l-.8-1.4c-.1-.1-.2-.2-.4-.1l-1 .3c-.3-.3-.7-.5-1.1-.6L6.1.2C6.1.1 6 0 5.8 0H4.2c-.2 0-.3.1-.3.2l-.2 1c-.4.1-.7.3-1.1.6l-1-.3c-.2 0-.3 0-.4.1l-.8 1.4c-.1.2 0 .3.1.4l.8.5c0 .2-.1.5-.1.8s0 .5.1.8l-.8.5c-.1.1-.2.2-.1.4l.8 1.4c.1.1.2.2.4.1l1-.3c.3.3.7.5 1.1.6l.2 1c0 .1.1.2.3.2h1.6c.2 0 .3-.1.3-.2l.2-1c.4-.1.7-.3 1.1-.6l1 .3c.2 0 .3 0 .4-.1l.8-1.4c.1-.2 0-.3-.1-.4zM5 6.5c-.8 0-1.5-.7-1.5-1.5S4.2 3.5 5 3.5 6.5 4.2 6.5 5 5.8 6.5 5 6.5z\"/></svg>",
|
|
1437
1436
|
minimize: "<svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\"><rect x=\"1\" y=\"4\" width=\"8\" height=\"2\"/></svg>",
|
|
1438
1437
|
expand: "<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"currentColor\"><polygon points=\"1,1 7,4 1,7\"/></svg>"
|
|
1439
|
-
},
|
|
1440
|
-
|
|
1438
|
+
}, g = document.createElement("div");
|
|
1439
|
+
g.id = "simulator", g.innerHTML = `
|
|
1441
1440
|
<style>
|
|
1442
1441
|
:root {
|
|
1443
1442
|
--sim-bg: #1a1a2e;
|
|
@@ -2512,15 +2511,15 @@ function Fe(t = {}) {
|
|
|
2512
2511
|
font-size: 9px;
|
|
2513
2512
|
}
|
|
2514
2513
|
</style>
|
|
2515
|
-
<div id="simulator-panel" class="${
|
|
2514
|
+
<div id="simulator-panel" class="${m.isCollapsed ? "collapsed" : ""}">
|
|
2516
2515
|
<div id="simulator-header">
|
|
2517
2516
|
<span id="simulator-title">PUZZMO SIMULATOR</span>
|
|
2518
2517
|
<span class="header-sep">|</span>
|
|
2519
2518
|
<div id="simulator-timer">--:--</div>
|
|
2520
2519
|
<span class="header-sep">|</span>
|
|
2521
2520
|
<div id="simulator-header-controls">
|
|
2522
|
-
<button id="simulator-header-pause" class="header-icon-btn" title="Pause" disabled>${
|
|
2523
|
-
<button id="simulator-header-retry" class="header-icon-btn" title="Retry" disabled>${
|
|
2521
|
+
<button id="simulator-header-pause" class="header-icon-btn" title="Pause" disabled>${h.pause}</button>
|
|
2522
|
+
<button id="simulator-header-retry" class="header-icon-btn" title="Retry" disabled>${h.retry}</button>
|
|
2524
2523
|
</div>
|
|
2525
2524
|
<span class="header-sep">|</span>
|
|
2526
2525
|
<div id="simulator-header-status">
|
|
@@ -2528,101 +2527,104 @@ function Fe(t = {}) {
|
|
|
2528
2527
|
<span id="simulator-header-status-text">Waiting...</span>
|
|
2529
2528
|
</div>
|
|
2530
2529
|
<span class="header-spacer"></span>
|
|
2531
|
-
<button id="simulator-header-settings" class="header-icon-btn" title="Settings">${
|
|
2532
|
-
<button id="simulator-toggle" class="header-icon-btn" title="Minimize">${
|
|
2530
|
+
<button id="simulator-header-settings" class="header-icon-btn" title="Settings">${h.cog}</button>
|
|
2531
|
+
<button id="simulator-toggle" class="header-icon-btn" title="Minimize">${h.minimize}</button>
|
|
2533
2532
|
</div>
|
|
2534
2533
|
<div id="simulator-body">
|
|
2535
2534
|
<div id="simulator-tabs">
|
|
2536
|
-
${
|
|
2535
|
+
${f.filter((e) => e.id !== "auth").map((e) => `<button class="simulator-tab" data-tab="${e.id}">${e.label}<span class="simulator-tab-badge" data-badge="${e.id}"></span></button>`).join("")}
|
|
2537
2536
|
</div>
|
|
2538
2537
|
<div id="simulator-content" class="hidden">
|
|
2539
|
-
${
|
|
2538
|
+
${f.map((e) => `<div id="simulator-tab-${e.id}" class="simulator-tab-content">${e.render()}</div>`).join("")}
|
|
2540
2539
|
</div>
|
|
2541
2540
|
</div>
|
|
2542
2541
|
</div>
|
|
2543
|
-
`, document.body.appendChild(
|
|
2544
|
-
let
|
|
2545
|
-
|
|
2542
|
+
`, document.body.appendChild(g);
|
|
2543
|
+
let _ = g.querySelector("#simulator-panel"), y = g.querySelector("#simulator-header"), b = g.querySelector("#simulator-header-indicator"), x = g.querySelector("#simulator-header-status-text"), S = g.querySelector("#simulator-header-pause"), C = g.querySelector("#simulator-header-retry"), w = g.querySelector("#simulator-header-settings"), T = g.querySelector("#simulator-toggle"), E = g.querySelector("#simulator-timer"), D = g.querySelector("#simulator-tabs"), O = g.querySelector("#simulator-content"), k = (e) => g.querySelector(e), A = (e) => {
|
|
2544
|
+
S.innerHTML = e ? h.play : h.pause, S.title = e ? "Resume" : "Pause";
|
|
2545
|
+
}, j = (e, t) => {
|
|
2546
|
+
let n = k("#simulator-status .text"), r = k("#simulator-status .indicator");
|
|
2547
|
+
n && (n.textContent = e), r && (r.className = `indicator ${t}`), b.className = t, x.textContent = e;
|
|
2546
2548
|
}, M = (e, t) => {
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
}, N = (e, t) => {
|
|
2550
|
-
t && t !== "0" ? D.innerHTML = `${e}<span class="penalty">+${t}</span>` : D.textContent = e;
|
|
2551
|
-
}, P = (e) => {
|
|
2549
|
+
t && t !== "0" ? E.innerHTML = `${e}<span class="penalty">+${t}</span>` : E.textContent = e;
|
|
2550
|
+
}, N = (e) => {
|
|
2552
2551
|
var t;
|
|
2553
|
-
|
|
2552
|
+
m.activeTab = e, O.classList.remove("hidden"), d(e), D.querySelectorAll(".simulator-tab").forEach((t) => {
|
|
2554
2553
|
t.classList.toggle("active", t.getAttribute("data-tab") === e);
|
|
2555
|
-
}),
|
|
2554
|
+
}), g.querySelectorAll(".simulator-tab-content").forEach((t) => {
|
|
2556
2555
|
t.classList.toggle("active", t.id === `simulator-tab-${e}`);
|
|
2557
|
-
}),
|
|
2558
|
-
let n =
|
|
2559
|
-
n == null || (t = n.onActivate) == null || t.call(n,
|
|
2560
|
-
},
|
|
2561
|
-
|
|
2562
|
-
},
|
|
2563
|
-
|
|
2564
|
-
},
|
|
2556
|
+
}), w.classList.toggle("active", e === "auth");
|
|
2557
|
+
let n = f.find((t) => t.id === e);
|
|
2558
|
+
n == null || (t = n.onActivate) == null || t.call(n, B);
|
|
2559
|
+
}, P = (e) => {
|
|
2560
|
+
m.isCollapsed = e, _.classList.toggle("collapsed", e), u(e), e ? (O.classList.add("hidden"), D.querySelectorAll(".simulator-tab").forEach((e) => e.classList.remove("active"))) : N(m.activeTab);
|
|
2561
|
+
}, F = () => {
|
|
2562
|
+
c.updatePreview(B);
|
|
2563
|
+
}, I = function() {
|
|
2565
2564
|
var t = e(function* () {
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
|
|
2574
|
-
|
|
2575
|
-
|
|
2565
|
+
var e, t;
|
|
2566
|
+
if (m.puzzleData) return m.puzzleData;
|
|
2567
|
+
if (!a || a.size === 0) throw Error("No fixtures configured. Add puzzle JSON files to a fixtures directory and pass fixturesGlob to the simulator.");
|
|
2568
|
+
let n = (e = m.selectedCategory) == null ? o[0] : e, r = n ? a.get(n) : void 0;
|
|
2569
|
+
if (!r || r.size === 0) throw Error(`No puzzles found in fixture category "${n}"`);
|
|
2570
|
+
let i = (t = m.selectedPuzzle) == null ? r.keys().next().value : t, s = i ? r.get(i) : void 0;
|
|
2571
|
+
if (!s) throw Error(`Puzzle "${i}" not found in category "${n}"`);
|
|
2572
|
+
m.puzzleData = s, console.log("Simulator: Puzzle loaded from fixtures", {
|
|
2573
|
+
category: n,
|
|
2574
|
+
puzzle: i
|
|
2575
|
+
}), m.originalPuzzle = JSON.stringify(m.puzzleData, null, 2);
|
|
2576
|
+
let c = k("#simulator-puzzle");
|
|
2577
|
+
return c && (c.value = m.originalPuzzle), m.activeTab === "thumb" && F(), m.puzzleData;
|
|
2576
2578
|
});
|
|
2577
2579
|
return function() {
|
|
2578
2580
|
return t.apply(this, arguments);
|
|
2579
2581
|
};
|
|
2580
|
-
}(),
|
|
2581
|
-
|
|
2582
|
-
}),
|
|
2583
|
-
te(e, t,
|
|
2584
|
-
},
|
|
2585
|
-
let n =
|
|
2582
|
+
}(), L = ee((e) => {
|
|
2583
|
+
s.addLogEntry(e, B);
|
|
2584
|
+
}), R = (e, t) => {
|
|
2585
|
+
te(e, t, L);
|
|
2586
|
+
}, z = (e, t) => {
|
|
2587
|
+
let n = g.querySelector(`[data-badge="${e}"]`);
|
|
2586
2588
|
n && (n.textContent = t && t > 0 ? String(t) : "");
|
|
2587
|
-
},
|
|
2588
|
-
state:
|
|
2589
|
-
getElement:
|
|
2590
|
-
sendToGame:
|
|
2591
|
-
logMessage:
|
|
2592
|
-
loadPuzzle:
|
|
2593
|
-
updateStatus:
|
|
2594
|
-
updateTimer:
|
|
2595
|
-
setCollapsed:
|
|
2596
|
-
switchTab:
|
|
2597
|
-
updateThumbnail:
|
|
2598
|
-
updateBadge:
|
|
2599
|
-
fixtures:
|
|
2600
|
-
fixtureCategories:
|
|
2601
|
-
gameSlug: (
|
|
2589
|
+
}, B = {
|
|
2590
|
+
state: m,
|
|
2591
|
+
getElement: k,
|
|
2592
|
+
sendToGame: R,
|
|
2593
|
+
logMessage: L.log,
|
|
2594
|
+
loadPuzzle: I,
|
|
2595
|
+
updateStatus: j,
|
|
2596
|
+
updateTimer: M,
|
|
2597
|
+
setCollapsed: P,
|
|
2598
|
+
switchTab: N,
|
|
2599
|
+
updateThumbnail: F,
|
|
2600
|
+
updateBadge: z,
|
|
2601
|
+
fixtures: a,
|
|
2602
|
+
fixtureCategories: o,
|
|
2603
|
+
gameSlug: (r = t.slug) == null ? null : r
|
|
2602
2604
|
};
|
|
2603
|
-
console.log("[Simulator] Context created with gameSlug:",
|
|
2605
|
+
console.log("[Simulator] Context created with gameSlug:", B.gameSlug), f.forEach((e) => e.bind(B)), D.querySelectorAll(".simulator-tab").forEach((e) => {
|
|
2604
2606
|
e.addEventListener("click", () => {
|
|
2605
2607
|
let t = e.getAttribute("data-tab");
|
|
2606
|
-
|
|
2608
|
+
N(t), z(t, 0);
|
|
2607
2609
|
});
|
|
2608
|
-
}),
|
|
2609
|
-
e.stopPropagation(),
|
|
2610
|
+
}), T.addEventListener("click", (e) => {
|
|
2611
|
+
e.stopPropagation(), P(!0);
|
|
2612
|
+
}), S.addEventListener("click", (e) => {
|
|
2613
|
+
e.stopPropagation(), m.isPaused ? (R("RESUME_GAME", {}), m.isPaused = !1, A(!1), j("Running", "ready")) : (R("PAUSE_GAME", {}), m.isPaused = !0, A(!0), j("Paused", "paused"));
|
|
2614
|
+
let t = k("#simulator-pause");
|
|
2615
|
+
t && (t.textContent = m.isPaused ? "Resume" : "Pause");
|
|
2610
2616
|
}), C.addEventListener("click", (e) => {
|
|
2611
|
-
e.stopPropagation(),
|
|
2612
|
-
let t =
|
|
2613
|
-
t && (t.textContent = g.isPaused ? "Resume" : "Pause");
|
|
2614
|
-
}), w.addEventListener("click", (e) => {
|
|
2615
|
-
e.stopPropagation(), z("RETRY_PUZZLE", {}), g.hasStarted = !1, g.isPaused = !1, j(!1), C.disabled = !0, M("Ready to retry", "ready");
|
|
2616
|
-
let t = A("#simulator-pause"), n = A("#simulator-start");
|
|
2617
|
+
e.stopPropagation(), R("RETRY_PUZZLE", {}), m.hasStarted = !1, m.isPaused = !1, A(!1), S.disabled = !0, j("Ready to retry", "ready");
|
|
2618
|
+
let t = k("#simulator-pause"), n = k("#simulator-start");
|
|
2617
2619
|
t && (t.disabled = !0, t.textContent = "Pause"), n && (n.textContent = "Start");
|
|
2618
|
-
}),
|
|
2619
|
-
e.stopPropagation(),
|
|
2620
|
-
}),
|
|
2621
|
-
|
|
2622
|
-
}),
|
|
2623
|
-
let
|
|
2624
|
-
(
|
|
2625
|
-
let
|
|
2620
|
+
}), w.addEventListener("click", (e) => {
|
|
2621
|
+
e.stopPropagation(), m.isCollapsed && P(!1), N("auth");
|
|
2622
|
+
}), y.addEventListener("click", (e) => {
|
|
2623
|
+
m.isCollapsed && e.target !== T && P(!1);
|
|
2624
|
+
}), m.isCollapsed || N(m.activeTab);
|
|
2625
|
+
let V = new URLSearchParams(window.location.search);
|
|
2626
|
+
(V.has("code") || V.has("error")) && (P(!1), N("auth"));
|
|
2627
|
+
let H = (e) => ({
|
|
2626
2628
|
userState: {
|
|
2627
2629
|
gameSettings: {},
|
|
2628
2630
|
id: "simulator-user",
|
|
@@ -2632,7 +2634,7 @@ function Fe(t = {}) {
|
|
|
2632
2634
|
currentUser: null,
|
|
2633
2635
|
startOrFindGameplay: { gamePlayed: {
|
|
2634
2636
|
additionalTimeAddedSecs: 0,
|
|
2635
|
-
boardState:
|
|
2637
|
+
boardState: m.currentInputStr,
|
|
2636
2638
|
cheatsUsed: 0,
|
|
2637
2639
|
combinedTimeSecs: 0,
|
|
2638
2640
|
completed: !1,
|
|
@@ -2640,11 +2642,6 @@ function Fe(t = {}) {
|
|
|
2640
2642
|
elapsedTimeSecs: 0,
|
|
2641
2643
|
hintsUsed: 0,
|
|
2642
2644
|
id: `simulator-gameplay-${Date.now()}`,
|
|
2643
|
-
metric1: 0,
|
|
2644
|
-
metric2: 0,
|
|
2645
|
-
metric3: 0,
|
|
2646
|
-
metric4: 0,
|
|
2647
|
-
metricStrings: [],
|
|
2648
2645
|
ownerID: "simulator-owner",
|
|
2649
2646
|
pointsAwarded: 0,
|
|
2650
2647
|
resetsUsed: 0,
|
|
@@ -2665,36 +2662,36 @@ function Fe(t = {}) {
|
|
|
2665
2662
|
}
|
|
2666
2663
|
}
|
|
2667
2664
|
} },
|
|
2668
|
-
theme:
|
|
2665
|
+
theme: m.selectedTheme,
|
|
2669
2666
|
hostFlags: [],
|
|
2670
2667
|
hostContext: [],
|
|
2671
2668
|
appRuntimeContract: "1.0"
|
|
2672
|
-
}),
|
|
2669
|
+
}), U = function() {
|
|
2673
2670
|
var t = e(function* () {
|
|
2674
|
-
|
|
2671
|
+
j("Loading puzzle...", "waiting");
|
|
2675
2672
|
try {
|
|
2676
|
-
let e =
|
|
2677
|
-
|
|
2673
|
+
let e = H(yield I());
|
|
2674
|
+
j("Sending READY_DATA...", "waiting"), R("READY_DATA", e), j("Waiting for game to load...", "waiting");
|
|
2678
2675
|
} catch (e) {
|
|
2679
|
-
|
|
2676
|
+
j(`Error: ${e}`, "paused");
|
|
2680
2677
|
}
|
|
2681
2678
|
});
|
|
2682
2679
|
return function() {
|
|
2683
2680
|
return t.apply(this, arguments);
|
|
2684
2681
|
};
|
|
2685
|
-
}(),
|
|
2686
|
-
console.log("Simulator: Game loaded, ready to start"),
|
|
2682
|
+
}(), W = () => {
|
|
2683
|
+
console.log("Simulator: Game loaded, ready to start"), C.disabled = !1, f.forEach((e) => {
|
|
2687
2684
|
var t;
|
|
2688
|
-
return (t = e.onMessage) == null ? void 0 : t.call(e, "READY_GAME_LOADED", void 0,
|
|
2689
|
-
}),
|
|
2690
|
-
let e =
|
|
2691
|
-
e == null || e.click(),
|
|
2685
|
+
return (t = e.onMessage) == null ? void 0 : t.call(e, "READY_GAME_LOADED", void 0, B);
|
|
2686
|
+
}), i && !m.hasStarted && setTimeout(() => {
|
|
2687
|
+
let e = k("#simulator-start");
|
|
2688
|
+
e == null || e.click(), S.disabled = !1, m.hasStarted = !0, j("Running", "ready");
|
|
2692
2689
|
}, 100);
|
|
2693
2690
|
};
|
|
2694
2691
|
return ne((e, t) => {
|
|
2695
2692
|
var n, r;
|
|
2696
2693
|
if (e === "READY") {
|
|
2697
|
-
console.log("Simulator: Received READY from game"),
|
|
2694
|
+
console.log("Simulator: Received READY from game"), U();
|
|
2698
2695
|
return;
|
|
2699
2696
|
}
|
|
2700
2697
|
if (e === "INITIALIZE_SETTINGS") {
|
|
@@ -2702,13 +2699,13 @@ function Fe(t = {}) {
|
|
|
2702
2699
|
return;
|
|
2703
2700
|
}
|
|
2704
2701
|
if (e === "READY_GAME_LOADED") {
|
|
2705
|
-
|
|
2702
|
+
W();
|
|
2706
2703
|
return;
|
|
2707
2704
|
}
|
|
2708
2705
|
if (e === "TIMER_TICK") {
|
|
2709
2706
|
if (t != null && t.display) {
|
|
2710
2707
|
let [e, n] = t.display;
|
|
2711
|
-
|
|
2708
|
+
M(e, n);
|
|
2712
2709
|
}
|
|
2713
2710
|
return;
|
|
2714
2711
|
}
|
|
@@ -2721,30 +2718,30 @@ function Fe(t = {}) {
|
|
|
2721
2718
|
console.log("Simulator: Sidebar update", t);
|
|
2722
2719
|
return;
|
|
2723
2720
|
}
|
|
2724
|
-
|
|
2721
|
+
f.forEach((n) => {
|
|
2725
2722
|
var r;
|
|
2726
|
-
return (r = n.onMessage) == null ? void 0 : r.call(n, e, t,
|
|
2723
|
+
return (r = n.onMessage) == null ? void 0 : r.call(n, e, t, B);
|
|
2727
2724
|
});
|
|
2728
2725
|
let i = (n = t == null || (r = t.input) == null ? void 0 : r.boardState) == null ? t == null ? void 0 : t.boardState : n;
|
|
2729
|
-
e === "UPLOAD_NEW_GAME_STATE" && i && (
|
|
2730
|
-
},
|
|
2726
|
+
e === "UPLOAD_NEW_GAME_STATE" && i && (m.currentInputStr = i, m.activeTab === "thumb" && F(), console.log("Simulator: Game state uploaded", t)), e === "GAME_COMPLETED" && (console.log("Simulator: Game completed!", t), S.disabled = !0, m.hasStarted = !1, j("Completed!", "ready"));
|
|
2727
|
+
}, L), console.log("Simulator initialized"), $ = {
|
|
2731
2728
|
updateFixtures: (e) => {
|
|
2732
|
-
|
|
2729
|
+
a = v(e), o = Array.from(a.keys()).sort(), B.fixtures = a, B.fixtureCategories = o;
|
|
2733
2730
|
let t = localStorage.getItem("simulator-fixture-category");
|
|
2734
|
-
if (!
|
|
2731
|
+
if (!m.selectedCategory || !o.includes(m.selectedCategory)) {
|
|
2735
2732
|
var n;
|
|
2736
|
-
|
|
2733
|
+
m.selectedCategory = t && o.includes(t) ? t : (n = o[0]) == null ? null : n;
|
|
2737
2734
|
}
|
|
2738
|
-
let r =
|
|
2739
|
-
r == null || r.bind(
|
|
2740
|
-
categories:
|
|
2741
|
-
selectedCategory:
|
|
2735
|
+
let r = f.find((e) => e.id === "ctrl");
|
|
2736
|
+
r == null || r.bind(B), console.log("Simulator: Fixtures updated", {
|
|
2737
|
+
categories: o,
|
|
2738
|
+
selectedCategory: m.selectedCategory
|
|
2742
2739
|
});
|
|
2743
2740
|
},
|
|
2744
|
-
sendToGame:
|
|
2745
|
-
loadPuzzle:
|
|
2741
|
+
sendToGame: R,
|
|
2742
|
+
loadPuzzle: I
|
|
2746
2743
|
}, $;
|
|
2747
2744
|
}
|
|
2748
|
-
export {
|
|
2745
|
+
export { Pe as t };
|
|
2749
2746
|
|
|
2750
|
-
//# sourceMappingURL=createSimulator-
|
|
2747
|
+
//# sourceMappingURL=createSimulator-D-ln1AMv.js.map
|