- Delete old Vite+Svelte frontend - Initialize new SvelteKit project with TypeScript - Configure Tailwind CSS v4 + DaisyUI - Implement JWT authentication with auto-refresh - Create login page with form validation (Zod) - Add protected route guards - Update Docker configuration for single-stage build - Add E2E tests with Playwright (6/11 passing) - Fix Svelte 5 reactivity with $state() runes Known issues: - 5 E2E tests failing (timing/async issues) - Token refresh implementation needs debugging - Validation error display timing
203 lines
5.0 KiB
JavaScript
203 lines
5.0 KiB
JavaScript
// src/utils.ts
|
|
function S(e, t) {
|
|
if (!e)
|
|
throw new Error(t);
|
|
}
|
|
function f(e, t) {
|
|
return typeof t === e;
|
|
}
|
|
function w(e) {
|
|
return e instanceof Promise;
|
|
}
|
|
function u(e, t, r) {
|
|
Object.defineProperty(e, t, r);
|
|
}
|
|
function l(e, t, r) {
|
|
u(e, t, { value: r, configurable: !0, writable: !0 });
|
|
}
|
|
|
|
// src/constants.ts
|
|
var y = Symbol.for("tinyspy:spy");
|
|
|
|
// src/internal.ts
|
|
var x = /* @__PURE__ */ new Set(), h = (e) => {
|
|
e.called = !1, e.callCount = 0, e.calls = [], e.results = [], e.resolves = [], e.next = [];
|
|
}, k = (e) => (u(e, y, {
|
|
value: { reset: () => h(e[y]) }
|
|
}), e[y]), T = (e) => e[y] || k(e);
|
|
function R(e) {
|
|
S(
|
|
f("function", e) || f("undefined", e),
|
|
"cannot spy on a non-function value"
|
|
);
|
|
let t = function(...s) {
|
|
let n = T(t);
|
|
n.called = !0, n.callCount++, n.calls.push(s);
|
|
let d = n.next.shift();
|
|
if (d) {
|
|
n.results.push(d);
|
|
let [a, i] = d;
|
|
if (a === "ok")
|
|
return i;
|
|
throw i;
|
|
}
|
|
let o, c = "ok", p = n.results.length;
|
|
if (n.impl)
|
|
try {
|
|
new.target ? o = Reflect.construct(n.impl, s, new.target) : o = n.impl.apply(this, s), c = "ok";
|
|
} catch (a) {
|
|
throw o = a, c = "error", n.results.push([c, a]), a;
|
|
}
|
|
let g = [c, o];
|
|
return w(o) && o.then(
|
|
(a) => n.resolves[p] = ["ok", a],
|
|
(a) => n.resolves[p] = ["error", a]
|
|
), n.results.push(g), o;
|
|
};
|
|
l(t, "_isMockFunction", !0), l(t, "length", e ? e.length : 0), l(t, "name", e && e.name || "spy");
|
|
let r = T(t);
|
|
return r.reset(), r.impl = e, t;
|
|
}
|
|
function v(e) {
|
|
return !!e && e._isMockFunction === !0;
|
|
}
|
|
function A(e) {
|
|
let t = T(e);
|
|
"returns" in e || (u(e, "returns", {
|
|
get: () => t.results.map(([, r]) => r)
|
|
}), [
|
|
"called",
|
|
"callCount",
|
|
"results",
|
|
"resolves",
|
|
"calls",
|
|
"reset",
|
|
"impl"
|
|
].forEach(
|
|
(r) => u(e, r, { get: () => t[r], set: (s) => t[r] = s })
|
|
), l(e, "nextError", (r) => (t.next.push(["error", r]), t)), l(e, "nextResult", (r) => (t.next.push(["ok", r]), t)));
|
|
}
|
|
|
|
// src/spy.ts
|
|
function Y(e) {
|
|
let t = R(e);
|
|
return A(t), t;
|
|
}
|
|
|
|
// src/spyOn.ts
|
|
var b = (e, t) => {
|
|
let r = Object.getOwnPropertyDescriptor(e, t);
|
|
if (r)
|
|
return [e, r];
|
|
let s = Object.getPrototypeOf(e);
|
|
for (; s !== null; ) {
|
|
let n = Object.getOwnPropertyDescriptor(s, t);
|
|
if (n)
|
|
return [s, n];
|
|
s = Object.getPrototypeOf(s);
|
|
}
|
|
}, P = (e, t) => {
|
|
t != null && typeof t == "function" && t.prototype != null && Object.setPrototypeOf(e.prototype, t.prototype);
|
|
};
|
|
function M(e, t, r) {
|
|
S(
|
|
!f("undefined", e),
|
|
"spyOn could not find an object to spy upon"
|
|
), S(
|
|
f("object", e) || f("function", e),
|
|
"cannot spyOn on a primitive value"
|
|
);
|
|
let [s, n] = (() => {
|
|
if (!f("object", t))
|
|
return [t, "value"];
|
|
if ("getter" in t && "setter" in t)
|
|
throw new Error("cannot spy on both getter and setter");
|
|
if ("getter" in t)
|
|
return [t.getter, "get"];
|
|
if ("setter" in t)
|
|
return [t.setter, "set"];
|
|
throw new Error("specify getter or setter to spy on");
|
|
})(), [d, o] = b(e, s) || [];
|
|
S(
|
|
o || s in e,
|
|
`${String(s)} does not exist`
|
|
);
|
|
let c = !1;
|
|
n === "value" && o && !o.value && o.get && (n = "get", c = !0, r = o.get());
|
|
let p;
|
|
o ? p = o[n] : n !== "value" ? p = () => e[s] : p = e[s], p && j(p) && (p = p[y].getOriginal());
|
|
let g = (I) => {
|
|
let { value: F, ...O } = o || {
|
|
configurable: !0,
|
|
writable: !0
|
|
};
|
|
n !== "value" && delete O.writable, O[n] = I, u(e, s, O);
|
|
}, a = () => {
|
|
d !== e ? Reflect.deleteProperty(e, s) : o && !p ? u(e, s, o) : g(p);
|
|
};
|
|
r || (r = p);
|
|
let i = E(R(r), r);
|
|
n === "value" && P(i, p);
|
|
let m = i[y];
|
|
return l(m, "restore", a), l(m, "getOriginal", () => c ? p() : p), l(m, "willCall", (I) => (m.impl = I, i)), g(
|
|
c ? () => (P(i, r), i) : i
|
|
), x.add(i), i;
|
|
}
|
|
var K = /* @__PURE__ */ new Set([
|
|
"length",
|
|
"name",
|
|
"prototype"
|
|
]);
|
|
function D(e) {
|
|
let t = /* @__PURE__ */ new Set(), r = {};
|
|
for (; e && e !== Object.prototype && e !== Function.prototype; ) {
|
|
let s = [
|
|
...Object.getOwnPropertyNames(e),
|
|
...Object.getOwnPropertySymbols(e)
|
|
];
|
|
for (let n of s)
|
|
r[n] || K.has(n) || (t.add(n), r[n] = Object.getOwnPropertyDescriptor(e, n));
|
|
e = Object.getPrototypeOf(e);
|
|
}
|
|
return {
|
|
properties: t,
|
|
descriptors: r
|
|
};
|
|
}
|
|
function E(e, t) {
|
|
if (!t || // the original is already a spy, so it has all the properties
|
|
y in t)
|
|
return e;
|
|
let { properties: r, descriptors: s } = D(t);
|
|
for (let n of r) {
|
|
let d = s[n];
|
|
b(e, n) || u(e, n, d);
|
|
}
|
|
return e;
|
|
}
|
|
function Z(e, t, r) {
|
|
let s = M(e, t, r);
|
|
return A(s), ["restore", "getOriginal", "willCall"].forEach((n) => {
|
|
l(s, n, s[y][n]);
|
|
}), s;
|
|
}
|
|
function j(e) {
|
|
return v(e) && "getOriginal" in e[y];
|
|
}
|
|
|
|
// src/restoreAll.ts
|
|
function te() {
|
|
for (let e of x)
|
|
e.restore();
|
|
x.clear();
|
|
}
|
|
export {
|
|
R as createInternalSpy,
|
|
T as getInternalState,
|
|
M as internalSpyOn,
|
|
te as restoreAll,
|
|
x as spies,
|
|
Y as spy,
|
|
Z as spyOn
|
|
};
|