quiz-mcp 0.0.1
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 +85 -0
- package/bin/quiz +16 -0
- package/bin/quiz-runner +18 -0
- package/bin/quiz-runner-mcp +18 -0
- package/dist/cli.js +805 -0
- package/dist/client/_app/immutable/assets/0.BdUfdP7M.css +1 -0
- package/dist/client/_app/immutable/assets/0.BdUfdP7M.css.br +0 -0
- package/dist/client/_app/immutable/assets/0.BdUfdP7M.css.gz +0 -0
- package/dist/client/_app/immutable/chunks/BBbVH-DX.js +2 -0
- package/dist/client/_app/immutable/chunks/BBbVH-DX.js.br +0 -0
- package/dist/client/_app/immutable/chunks/BBbVH-DX.js.gz +0 -0
- package/dist/client/_app/immutable/chunks/BYAtt_Gu.js +1 -0
- package/dist/client/_app/immutable/chunks/BYAtt_Gu.js.br +0 -0
- package/dist/client/_app/immutable/chunks/BYAtt_Gu.js.gz +0 -0
- package/dist/client/_app/immutable/chunks/C9b1VZtB.js +1 -0
- package/dist/client/_app/immutable/chunks/C9b1VZtB.js.br +0 -0
- package/dist/client/_app/immutable/chunks/C9b1VZtB.js.gz +0 -0
- package/dist/client/_app/immutable/chunks/DnSqigra.js +1 -0
- package/dist/client/_app/immutable/chunks/DnSqigra.js.br +0 -0
- package/dist/client/_app/immutable/chunks/DnSqigra.js.gz +0 -0
- package/dist/client/_app/immutable/chunks/DqHG5Xll.js +3 -0
- package/dist/client/_app/immutable/chunks/DqHG5Xll.js.br +0 -0
- package/dist/client/_app/immutable/chunks/DqHG5Xll.js.gz +0 -0
- package/dist/client/_app/immutable/chunks/fMaWj-vy.js +1 -0
- package/dist/client/_app/immutable/chunks/fMaWj-vy.js.br +0 -0
- package/dist/client/_app/immutable/chunks/fMaWj-vy.js.gz +0 -0
- package/dist/client/_app/immutable/chunks/hqRb622q.js +1 -0
- package/dist/client/_app/immutable/chunks/hqRb622q.js.br +0 -0
- package/dist/client/_app/immutable/chunks/hqRb622q.js.gz +0 -0
- package/dist/client/_app/immutable/chunks/qgn7L4n5.js +1 -0
- package/dist/client/_app/immutable/chunks/qgn7L4n5.js.br +0 -0
- package/dist/client/_app/immutable/chunks/qgn7L4n5.js.gz +0 -0
- package/dist/client/_app/immutable/entry/app.BsKq4Thd.js +2 -0
- package/dist/client/_app/immutable/entry/app.BsKq4Thd.js.br +0 -0
- package/dist/client/_app/immutable/entry/app.BsKq4Thd.js.gz +0 -0
- package/dist/client/_app/immutable/entry/start.CKTlgCvu.js +1 -0
- package/dist/client/_app/immutable/entry/start.CKTlgCvu.js.br +2 -0
- package/dist/client/_app/immutable/entry/start.CKTlgCvu.js.gz +0 -0
- package/dist/client/_app/immutable/nodes/0.R6s8931r.js +9 -0
- package/dist/client/_app/immutable/nodes/0.R6s8931r.js.br +0 -0
- package/dist/client/_app/immutable/nodes/0.R6s8931r.js.gz +0 -0
- package/dist/client/_app/immutable/nodes/1.CBs3iFLr.js +1 -0
- package/dist/client/_app/immutable/nodes/1.CBs3iFLr.js.br +0 -0
- package/dist/client/_app/immutable/nodes/1.CBs3iFLr.js.gz +0 -0
- package/dist/client/_app/immutable/nodes/2.B9MLTE_H.js +2 -0
- package/dist/client/_app/immutable/nodes/2.B9MLTE_H.js.br +0 -0
- package/dist/client/_app/immutable/nodes/2.B9MLTE_H.js.gz +0 -0
- package/dist/client/_app/immutable/nodes/3.w4AbulQF.js +1 -0
- package/dist/client/_app/immutable/nodes/3.w4AbulQF.js.br +0 -0
- package/dist/client/_app/immutable/nodes/3.w4AbulQF.js.gz +0 -0
- package/dist/client/_app/immutable/nodes/4.BAhm-aFq.js +4 -0
- package/dist/client/_app/immutable/nodes/4.BAhm-aFq.js.br +0 -0
- package/dist/client/_app/immutable/nodes/4.BAhm-aFq.js.gz +0 -0
- package/dist/client/_app/version.json +1 -0
- package/dist/client/_app/version.json.br +0 -0
- package/dist/client/_app/version.json.gz +0 -0
- package/dist/client/robots.txt +3 -0
- package/dist/env.js +94 -0
- package/dist/handler.js +1435 -0
- package/dist/index.js +345 -0
- package/dist/server/chunks/0-bFxjafp8.js +44 -0
- package/dist/server/chunks/0-bFxjafp8.js.map +1 -0
- package/dist/server/chunks/1-D1qe0uHb.js +9 -0
- package/dist/server/chunks/1-D1qe0uHb.js.map +1 -0
- package/dist/server/chunks/2-NzZFDUaQ.js +60 -0
- package/dist/server/chunks/2-NzZFDUaQ.js.map +1 -0
- package/dist/server/chunks/3-DJAG62O1.js +37 -0
- package/dist/server/chunks/3-DJAG62O1.js.map +1 -0
- package/dist/server/chunks/4-zigWBLLG.js +37 -0
- package/dist/server/chunks/4-zigWBLLG.js.map +1 -0
- package/dist/server/chunks/_error.svelte-BHNrphys.js +80 -0
- package/dist/server/chunks/_error.svelte-BHNrphys.js.map +1 -0
- package/dist/server/chunks/_layout.svelte-BUJDEr5D.js +104 -0
- package/dist/server/chunks/_layout.svelte-BUJDEr5D.js.map +1 -0
- package/dist/server/chunks/_page.svelte-CRU5jaGZ.js +653 -0
- package/dist/server/chunks/_page.svelte-CRU5jaGZ.js.map +1 -0
- package/dist/server/chunks/_page.svelte-Cm8ocLsi.js +572 -0
- package/dist/server/chunks/_page.svelte-Cm8ocLsi.js.map +1 -0
- package/dist/server/chunks/_page.svelte-Dvh1k6R9.js +71 -0
- package/dist/server/chunks/_page.svelte-Dvh1k6R9.js.map +1 -0
- package/dist/server/chunks/_server.ts-BZp77VsF.js +101 -0
- package/dist/server/chunks/_server.ts-BZp77VsF.js.map +1 -0
- package/dist/server/chunks/_server.ts-C2NKc-VD.js +219 -0
- package/dist/server/chunks/_server.ts-C2NKc-VD.js.map +1 -0
- package/dist/server/chunks/_server.ts-CHyNcOmK.js +39 -0
- package/dist/server/chunks/_server.ts-CHyNcOmK.js.map +1 -0
- package/dist/server/chunks/_server.ts-CakPvrry.js +51 -0
- package/dist/server/chunks/_server.ts-CakPvrry.js.map +1 -0
- package/dist/server/chunks/_server.ts-uSNr19lE.js +35 -0
- package/dist/server/chunks/_server.ts-uSNr19lE.js.map +1 -0
- package/dist/server/chunks/client-Dw0t4rDL.js +25 -0
- package/dist/server/chunks/client-Dw0t4rDL.js.map +1 -0
- package/dist/server/chunks/exports-BNC8dbq3.js +326 -0
- package/dist/server/chunks/exports-BNC8dbq3.js.map +1 -0
- package/dist/server/chunks/hooks.server-B6FrjICA.js +66 -0
- package/dist/server/chunks/hooks.server-B6FrjICA.js.map +1 -0
- package/dist/server/chunks/hooks.universal-B3lncnqn.js +6 -0
- package/dist/server/chunks/hooks.universal-B3lncnqn.js.map +1 -0
- package/dist/server/chunks/html-FW6Ia4bL.js +8 -0
- package/dist/server/chunks/html-FW6Ia4bL.js.map +1 -0
- package/dist/server/chunks/index-Ch5Bqlgz.js +1411 -0
- package/dist/server/chunks/index-Ch5Bqlgz.js.map +1 -0
- package/dist/server/chunks/index-wpIsICWW.js +219 -0
- package/dist/server/chunks/index-wpIsICWW.js.map +1 -0
- package/dist/server/chunks/runtime-Bf5HkYyl.js +318 -0
- package/dist/server/chunks/runtime-Bf5HkYyl.js.map +1 -0
- package/dist/server/chunks/sessions-CEbRx2vt.js +169 -0
- package/dist/server/chunks/sessions-CEbRx2vt.js.map +1 -0
- package/dist/server/index.js +7609 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/manifest.js +97 -0
- package/dist/server/manifest.js.map +1 -0
- package/dist/shims.js +32 -0
- package/package.json +122 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { O as head, Q as escape_html } from './index-Ch5Bqlgz.js';
|
|
2
|
+
import './client-Dw0t4rDL.js';
|
|
3
|
+
import './exports-BNC8dbq3.js';
|
|
4
|
+
|
|
5
|
+
function _page($$renderer, $$props) {
|
|
6
|
+
$$renderer.component(($$renderer2) => {
|
|
7
|
+
let { data } = $$props;
|
|
8
|
+
const quizId = data.quizId;
|
|
9
|
+
const sessionId = data.sessionId;
|
|
10
|
+
const status = data.status;
|
|
11
|
+
const quizTitle = data.quiz?.title || "Quiz";
|
|
12
|
+
let statusMessage = status === "expired" ? "This quiz session has expired and is no longer available." : status === "completed" ? "This quiz has already been completed." : "Quiz session not found.";
|
|
13
|
+
head("9bskx5", $$renderer2, ($$renderer3) => {
|
|
14
|
+
$$renderer3.title(($$renderer4) => {
|
|
15
|
+
$$renderer4.push(`<title>Session ${escape_html(status)} - Quiz MCP</title>`);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
$$renderer2.push(`<div class="flex min-h-screen items-center justify-center bg-base-200 p-4"><div class="card w-full max-w-lg bg-base-100 shadow-xl"><div class="card-body text-center"><div class="mb-6 flex justify-center">`);
|
|
19
|
+
if (status === "expired") {
|
|
20
|
+
$$renderer2.push("<!--[-->");
|
|
21
|
+
$$renderer2.push(`<div class="flex h-24 w-24 items-center justify-center rounded-full bg-warning/20"><svg xmlns="http://www.w3.org/2000/svg" class="h-14 w-14 text-warning" fill="none" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg></div>`);
|
|
22
|
+
} else {
|
|
23
|
+
$$renderer2.push("<!--[!-->");
|
|
24
|
+
if (status === "completed") {
|
|
25
|
+
$$renderer2.push("<!--[-->");
|
|
26
|
+
$$renderer2.push(`<div class="flex h-24 w-24 items-center justify-center rounded-full bg-success/20"><svg xmlns="http://www.w3.org/2000/svg" class="h-14 w-14 text-success" fill="none" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg></div>`);
|
|
27
|
+
} else {
|
|
28
|
+
$$renderer2.push("<!--[!-->");
|
|
29
|
+
$$renderer2.push(`<div class="flex h-24 w-24 items-center justify-center rounded-full bg-error/20"><svg xmlns="http://www.w3.org/2000/svg" class="h-14 w-14 text-error" fill="none" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg></div>`);
|
|
30
|
+
}
|
|
31
|
+
$$renderer2.push(`<!--]-->`);
|
|
32
|
+
}
|
|
33
|
+
$$renderer2.push(`<!--]--></div> <h1 class="text-4xl font-bold">`);
|
|
34
|
+
if (status === "expired") {
|
|
35
|
+
$$renderer2.push("<!--[-->");
|
|
36
|
+
$$renderer2.push(`Session Expired`);
|
|
37
|
+
} else {
|
|
38
|
+
$$renderer2.push("<!--[!-->");
|
|
39
|
+
if (status === "completed") {
|
|
40
|
+
$$renderer2.push("<!--[-->");
|
|
41
|
+
$$renderer2.push(`Already Completed`);
|
|
42
|
+
} else {
|
|
43
|
+
$$renderer2.push("<!--[!-->");
|
|
44
|
+
$$renderer2.push(`Not Found`);
|
|
45
|
+
}
|
|
46
|
+
$$renderer2.push(`<!--]-->`);
|
|
47
|
+
}
|
|
48
|
+
$$renderer2.push(`<!--]--></h1> <h2 class="mt-2 text-xl text-base-content/70">${escape_html(quizTitle)}</h2> <p class="mt-4 text-base-content/70">${escape_html(statusMessage)}</p> <div class="mt-6 rounded-lg bg-base-200 p-4"><div class="grid grid-cols-2 gap-4 text-sm"><div><span class="text-base-content/50">Quiz ID:</span> <code class="ml-2 block font-mono text-xs break-all">${escape_html(quizId)}</code></div> <div><span class="text-base-content/50">Session ID:</span> <code class="ml-2 block font-mono text-xs break-all">${escape_html(sessionId)}</code></div></div></div> <div class="mt-6 card-actions justify-center"><a href="/" class="btn btn-primary"><svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"></path></svg> Go Home</a> <button type="button" class="btn btn-ghost">Go Back</button></div> <p class="mt-4 text-sm text-base-content/50">`);
|
|
49
|
+
if (status === "expired") {
|
|
50
|
+
$$renderer2.push("<!--[-->");
|
|
51
|
+
$$renderer2.push(`The session has expired due to inactivity. Please contact the quiz administrator to
|
|
52
|
+
request a new session.`);
|
|
53
|
+
} else {
|
|
54
|
+
$$renderer2.push("<!--[!-->");
|
|
55
|
+
if (status === "completed") {
|
|
56
|
+
$$renderer2.push("<!--[-->");
|
|
57
|
+
$$renderer2.push(`You have already completed this quiz. If you believe this is an error, please contact the
|
|
58
|
+
quiz administrator.`);
|
|
59
|
+
} else {
|
|
60
|
+
$$renderer2.push("<!--[!-->");
|
|
61
|
+
$$renderer2.push(`The requested quiz session could not be found. It may have been removed or the URL may be
|
|
62
|
+
incorrect.`);
|
|
63
|
+
}
|
|
64
|
+
$$renderer2.push(`<!--]-->`);
|
|
65
|
+
}
|
|
66
|
+
$$renderer2.push(`<!--]--></p></div></div></div>`);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export { _page as default };
|
|
71
|
+
//# sourceMappingURL=_page.svelte-Dvh1k6R9.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_page.svelte-Dvh1k6R9.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/_quizId_/_sessionId_/expired/_page.svelte.js"],"sourcesContent":["import { J as head, z as escape_html } from \"../../../../../chunks/index.js\";\nimport \"../../../../../chunks/client.js\";\nfunction _page($$renderer, $$props) {\n $$renderer.component(($$renderer2) => {\n let { data } = $$props;\n const quizId = data.quizId;\n const sessionId = data.sessionId;\n const status = data.status;\n const quizTitle = data.quiz?.title || \"Quiz\";\n let statusMessage = status === \"expired\" ? \"This quiz session has expired and is no longer available.\" : status === \"completed\" ? \"This quiz has already been completed.\" : \"Quiz session not found.\";\n head(\"9bskx5\", $$renderer2, ($$renderer3) => {\n $$renderer3.title(($$renderer4) => {\n $$renderer4.push(`<title>Session ${escape_html(status)} - Quiz MCP</title>`);\n });\n });\n $$renderer2.push(`<div class=\"flex min-h-screen items-center justify-center bg-base-200 p-4\"><div class=\"card w-full max-w-lg bg-base-100 shadow-xl\"><div class=\"card-body text-center\"><div class=\"mb-6 flex justify-center\">`);\n if (status === \"expired\") {\n $$renderer2.push(\"<!--[-->\");\n $$renderer2.push(`<div class=\"flex h-24 w-24 items-center justify-center rounded-full bg-warning/20\"><svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-14 w-14 text-warning\" fill=\"none\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"></path></svg></div>`);\n } else {\n $$renderer2.push(\"<!--[!-->\");\n if (status === \"completed\") {\n $$renderer2.push(\"<!--[-->\");\n $$renderer2.push(`<div class=\"flex h-24 w-24 items-center justify-center rounded-full bg-success/20\"><svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-14 w-14 text-success\" fill=\"none\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"></path></svg></div>`);\n } else {\n $$renderer2.push(\"<!--[!-->\");\n $$renderer2.push(`<div class=\"flex h-24 w-24 items-center justify-center rounded-full bg-error/20\"><svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-14 w-14 text-error\" fill=\"none\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"></path></svg></div>`);\n }\n $$renderer2.push(`<!--]-->`);\n }\n $$renderer2.push(`<!--]--></div> <h1 class=\"text-4xl font-bold\">`);\n if (status === \"expired\") {\n $$renderer2.push(\"<!--[-->\");\n $$renderer2.push(`Session Expired`);\n } else {\n $$renderer2.push(\"<!--[!-->\");\n if (status === \"completed\") {\n $$renderer2.push(\"<!--[-->\");\n $$renderer2.push(`Already Completed`);\n } else {\n $$renderer2.push(\"<!--[!-->\");\n $$renderer2.push(`Not Found`);\n }\n $$renderer2.push(`<!--]-->`);\n }\n $$renderer2.push(`<!--]--></h1> <h2 class=\"mt-2 text-xl text-base-content/70\">${escape_html(quizTitle)}</h2> <p class=\"mt-4 text-base-content/70\">${escape_html(statusMessage)}</p> <div class=\"mt-6 rounded-lg bg-base-200 p-4\"><div class=\"grid grid-cols-2 gap-4 text-sm\"><div><span class=\"text-base-content/50\">Quiz ID:</span> <code class=\"ml-2 block font-mono text-xs break-all\">${escape_html(quizId)}</code></div> <div><span class=\"text-base-content/50\">Session ID:</span> <code class=\"ml-2 block font-mono text-xs break-all\">${escape_html(sessionId)}</code></div></div></div> <div class=\"mt-6 card-actions justify-center\"><a href=\"/\" class=\"btn btn-primary\"><svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6\"></path></svg> Go Home</a> <button type=\"button\" class=\"btn btn-ghost\">Go Back</button></div> <p class=\"mt-4 text-sm text-base-content/50\">`);\n if (status === \"expired\") {\n $$renderer2.push(\"<!--[-->\");\n $$renderer2.push(`The session has expired due to inactivity. Please contact the quiz administrator to\n\t\t\t\t\trequest a new session.`);\n } else {\n $$renderer2.push(\"<!--[!-->\");\n if (status === \"completed\") {\n $$renderer2.push(\"<!--[-->\");\n $$renderer2.push(`You have already completed this quiz. If you believe this is an error, please contact the\n\t\t\t\t\tquiz administrator.`);\n } else {\n $$renderer2.push(\"<!--[!-->\");\n $$renderer2.push(`The requested quiz session could not be found. It may have been removed or the URL may be\n\t\t\t\t\tincorrect.`);\n }\n $$renderer2.push(`<!--]-->`);\n }\n $$renderer2.push(`<!--]--></p></div></div></div>`);\n });\n}\nexport {\n _page as default\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { j as json } from './index-wpIsICWW.js';
|
|
2
|
+
import { g as getSessionStore } from './sessions-CEbRx2vt.js';
|
|
3
|
+
|
|
4
|
+
const POST = async ({ params, request }) => {
|
|
5
|
+
const { quizId, sessionId } = params;
|
|
6
|
+
const store = getSessionStore();
|
|
7
|
+
const session = store.getSession(quizId, sessionId);
|
|
8
|
+
if (!session) {
|
|
9
|
+
return json(
|
|
10
|
+
{
|
|
11
|
+
ok: false,
|
|
12
|
+
error: "Session not found or expired"
|
|
13
|
+
},
|
|
14
|
+
{ status: 404 }
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
if (session.status !== "active") {
|
|
18
|
+
return json(
|
|
19
|
+
{
|
|
20
|
+
ok: false,
|
|
21
|
+
error: `Session is already ${session.status}`
|
|
22
|
+
},
|
|
23
|
+
{ status: 400 }
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
const body = await request.json();
|
|
28
|
+
const answersRaw = body.answers;
|
|
29
|
+
const answers = answersRaw ? new Map(Object.entries(answersRaw).map(([k, v]) => [k, v])) : void 0;
|
|
30
|
+
if (answers) {
|
|
31
|
+
store.saveAnswers(quizId, sessionId, answers);
|
|
32
|
+
}
|
|
33
|
+
const totalTimeSpent = session.startedAt ? Math.floor((Date.now() - new Date(session.startedAt).getTime()) / 1e3) : 0;
|
|
34
|
+
const questions = session.quiz.questions;
|
|
35
|
+
const answeredCount = answers ? answers.size : 0;
|
|
36
|
+
const requiredQuestions = questions.filter((q) => q.required !== false);
|
|
37
|
+
const requiredAnswered = requiredQuestions.filter((q) => {
|
|
38
|
+
const a = answers?.get(q.id);
|
|
39
|
+
return a && a.value !== "" && (Array.isArray(a.value) ? a.value.length > 0 : true);
|
|
40
|
+
}).length;
|
|
41
|
+
const answersArray = questions.map((q) => {
|
|
42
|
+
const a = answers?.get(q.id);
|
|
43
|
+
return {
|
|
44
|
+
id: q.id,
|
|
45
|
+
type: q.type,
|
|
46
|
+
question: q.question,
|
|
47
|
+
value: a?.value ?? getEmptyAnswer(q.type),
|
|
48
|
+
timestamp: a?.timestamp ?? void 0
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
const results = {
|
|
52
|
+
quizId,
|
|
53
|
+
sessionId,
|
|
54
|
+
version: session.quiz.version ?? "1.0.0",
|
|
55
|
+
metadata: {
|
|
56
|
+
userAgent: request.headers.get("user-agent") ?? void 0,
|
|
57
|
+
timeSpent: totalTimeSpent,
|
|
58
|
+
completedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
59
|
+
},
|
|
60
|
+
answers: answersArray,
|
|
61
|
+
summary: {
|
|
62
|
+
totalQuestions: questions.length,
|
|
63
|
+
answeredQuestions: answeredCount,
|
|
64
|
+
requiredQuestions: requiredQuestions.length,
|
|
65
|
+
requiredAnswered
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
store.completeSession(quizId, sessionId, results);
|
|
69
|
+
return json({
|
|
70
|
+
ok: true,
|
|
71
|
+
results
|
|
72
|
+
});
|
|
73
|
+
} catch (error) {
|
|
74
|
+
console.error("Error submitting quiz:", error);
|
|
75
|
+
return json(
|
|
76
|
+
{
|
|
77
|
+
ok: false,
|
|
78
|
+
error: "Failed to submit quiz"
|
|
79
|
+
},
|
|
80
|
+
{ status: 500 }
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
function getEmptyAnswer(type) {
|
|
85
|
+
switch (type) {
|
|
86
|
+
case "match":
|
|
87
|
+
return [];
|
|
88
|
+
case "text":
|
|
89
|
+
case "single":
|
|
90
|
+
return "";
|
|
91
|
+
case "multiple":
|
|
92
|
+
case "remove-extra":
|
|
93
|
+
case "order":
|
|
94
|
+
return [];
|
|
95
|
+
default:
|
|
96
|
+
return "";
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export { POST };
|
|
101
|
+
//# sourceMappingURL=_server.ts-BZp77VsF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_server.ts-BZp77VsF.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/quiz/_quizId_/session/_sessionId_/submit/_server.ts.js"],"sourcesContent":["import { json } from \"@sveltejs/kit\";\nimport { g as getSessionStore } from \"../../../../../../../../chunks/sessions.js\";\nconst POST = async ({ params, request }) => {\n const { quizId, sessionId } = params;\n const store = getSessionStore();\n const session = store.getSession(quizId, sessionId);\n if (!session) {\n return json(\n {\n ok: false,\n error: \"Session not found or expired\"\n },\n { status: 404 }\n );\n }\n if (session.status !== \"active\") {\n return json(\n {\n ok: false,\n error: `Session is already ${session.status}`\n },\n { status: 400 }\n );\n }\n try {\n const body = await request.json();\n const answersRaw = body.answers;\n const answers = answersRaw ? new Map(Object.entries(answersRaw).map(([k, v]) => [k, v])) : void 0;\n if (answers) {\n store.saveAnswers(quizId, sessionId, answers);\n }\n const totalTimeSpent = session.startedAt ? Math.floor((Date.now() - new Date(session.startedAt).getTime()) / 1e3) : 0;\n const questions = session.quiz.questions;\n const answeredCount = answers ? answers.size : 0;\n const requiredQuestions = questions.filter((q) => q.required !== false);\n const requiredAnswered = requiredQuestions.filter((q) => {\n const a = answers?.get(q.id);\n return a && a.value !== \"\" && (Array.isArray(a.value) ? a.value.length > 0 : true);\n }).length;\n const answersArray = questions.map((q) => {\n const a = answers?.get(q.id);\n return {\n id: q.id,\n type: q.type,\n question: q.question,\n value: a?.value ?? getEmptyAnswer(q.type),\n timestamp: a?.timestamp ?? void 0\n };\n });\n const results = {\n quizId,\n sessionId,\n version: session.quiz.version ?? \"1.0.0\",\n metadata: {\n userAgent: request.headers.get(\"user-agent\") ?? void 0,\n timeSpent: totalTimeSpent,\n completedAt: (/* @__PURE__ */ new Date()).toISOString()\n },\n answers: answersArray,\n summary: {\n totalQuestions: questions.length,\n answeredQuestions: answeredCount,\n requiredQuestions: requiredQuestions.length,\n requiredAnswered\n }\n };\n store.completeSession(quizId, sessionId, results);\n return json({\n ok: true,\n results\n });\n } catch (error) {\n console.error(\"Error submitting quiz:\", error);\n return json(\n {\n ok: false,\n error: \"Failed to submit quiz\"\n },\n { status: 500 }\n );\n }\n};\nfunction getEmptyAnswer(type) {\n switch (type) {\n case \"match\":\n return [];\n case \"text\":\n case \"single\":\n return \"\";\n case \"multiple\":\n case \"remove-extra\":\n case \"order\":\n return [];\n default:\n return \"\";\n }\n}\nexport {\n POST\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { j as json } from './index-wpIsICWW.js';
|
|
2
|
+
import { g as getSessionStore } from './sessions-CEbRx2vt.js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
|
|
5
|
+
const QuestionTypeSchema = z.enum([
|
|
6
|
+
"single",
|
|
7
|
+
"multiple",
|
|
8
|
+
"remove-extra",
|
|
9
|
+
"order",
|
|
10
|
+
"match",
|
|
11
|
+
"text"
|
|
12
|
+
]);
|
|
13
|
+
const MatchOptionsSchema = z.object({
|
|
14
|
+
left: z.array(z.string()),
|
|
15
|
+
right: z.array(z.string())
|
|
16
|
+
});
|
|
17
|
+
const AttachmentSchema = z.object({
|
|
18
|
+
type: z.enum(["audio", "file", "image", "video"]),
|
|
19
|
+
url: z.string(),
|
|
20
|
+
title: z.string().optional(),
|
|
21
|
+
alt: z.string().optional()
|
|
22
|
+
});
|
|
23
|
+
const ValidationRulesSchema = z.object({
|
|
24
|
+
minLength: z.number().optional(),
|
|
25
|
+
maxLength: z.number().optional(),
|
|
26
|
+
minSelections: z.number().optional(),
|
|
27
|
+
maxSelections: z.number().optional(),
|
|
28
|
+
pattern: z.string().optional()
|
|
29
|
+
});
|
|
30
|
+
const QuestionSchema = z.object({
|
|
31
|
+
id: z.string(),
|
|
32
|
+
type: QuestionTypeSchema,
|
|
33
|
+
question: z.string(),
|
|
34
|
+
explanation: z.string().optional(),
|
|
35
|
+
points: z.number().optional(),
|
|
36
|
+
required: z.boolean().optional(),
|
|
37
|
+
options: z.union([z.array(z.string()), MatchOptionsSchema]).optional(),
|
|
38
|
+
attachments: z.array(AttachmentSchema).optional(),
|
|
39
|
+
validation: ValidationRulesSchema.optional()
|
|
40
|
+
});
|
|
41
|
+
const QuizMetadataSchema = z.object({
|
|
42
|
+
author: z.string().optional(),
|
|
43
|
+
difficulty: z.enum(["easy", "medium", "hard"]).optional(),
|
|
44
|
+
estimatedTime: z.number().optional(),
|
|
45
|
+
tags: z.array(z.string()).optional()
|
|
46
|
+
});
|
|
47
|
+
const QuizDataSchema = z.object({
|
|
48
|
+
title: z.string().optional(),
|
|
49
|
+
description: z.string().optional(),
|
|
50
|
+
version: z.string().optional(),
|
|
51
|
+
metadata: QuizMetadataSchema.optional(),
|
|
52
|
+
questions: z.array(QuestionSchema).min(1, "Quiz must have at least one question")
|
|
53
|
+
});
|
|
54
|
+
const AnalyticsConfigSchema = z.object({
|
|
55
|
+
enabled: z.boolean().optional(),
|
|
56
|
+
provider: z.enum(["none", "plausible", "google", "custom"]).optional(),
|
|
57
|
+
trackingId: z.string().optional(),
|
|
58
|
+
anonymizeIp: z.boolean().optional()
|
|
59
|
+
});
|
|
60
|
+
const LayoutConfigSchema = z.object({
|
|
61
|
+
title: z.string().optional(),
|
|
62
|
+
logo: z.string().nullable().optional(),
|
|
63
|
+
favicon: z.string().nullable().optional(),
|
|
64
|
+
css: z.string().nullable().optional(),
|
|
65
|
+
hideThemeSwitcher: z.boolean().optional(),
|
|
66
|
+
hideLanguageSwitcher: z.boolean().optional()
|
|
67
|
+
});
|
|
68
|
+
const QuizConfigSchema = z.object({
|
|
69
|
+
layout: LayoutConfigSchema.optional(),
|
|
70
|
+
theme: z.enum(["light", "dark", "auto"]).optional(),
|
|
71
|
+
css: z.string().nullable().optional(),
|
|
72
|
+
logo: z.string().nullable().optional(),
|
|
73
|
+
favicon: z.string().nullable().optional(),
|
|
74
|
+
localization: z.string().nullable().optional(),
|
|
75
|
+
language: z.string().optional(),
|
|
76
|
+
shuffleQuestions: z.boolean().optional(),
|
|
77
|
+
shuffleOptions: z.boolean().optional(),
|
|
78
|
+
allowBackNavigation: z.boolean().optional(),
|
|
79
|
+
showProgress: z.boolean().optional(),
|
|
80
|
+
showQuestionNumbers: z.boolean().optional(),
|
|
81
|
+
timerEnabled: z.boolean().optional(),
|
|
82
|
+
timerDuration: z.number().optional(),
|
|
83
|
+
webhook: z.string().url().nullable().optional().or(z.literal("")),
|
|
84
|
+
analytics: AnalyticsConfigSchema.nullable().optional(),
|
|
85
|
+
allowedOrigins: z.array(z.string()).optional(),
|
|
86
|
+
requireConsent: z.boolean().optional()
|
|
87
|
+
});
|
|
88
|
+
const StartQuizSchema = z.object({
|
|
89
|
+
quiz: z.union([QuizDataSchema, z.string()]),
|
|
90
|
+
config: QuizConfigSchema.optional(),
|
|
91
|
+
open: z.boolean().optional(),
|
|
92
|
+
sessionId: z.string().optional()
|
|
93
|
+
});
|
|
94
|
+
const POST = async ({ request, url }) => {
|
|
95
|
+
try {
|
|
96
|
+
const body = await request.json();
|
|
97
|
+
const parsed = StartQuizSchema.parse(body);
|
|
98
|
+
let quizData;
|
|
99
|
+
if (typeof parsed.quiz === "string") {
|
|
100
|
+
try {
|
|
101
|
+
quizData = JSON.parse(parsed.quiz);
|
|
102
|
+
} catch {
|
|
103
|
+
return json({ ok: false, error: "Invalid quiz JSON string" }, { status: 400 });
|
|
104
|
+
}
|
|
105
|
+
} else {
|
|
106
|
+
quizData = parsed.quiz;
|
|
107
|
+
}
|
|
108
|
+
const validationResult = QuizDataSchema.safeParse(quizData);
|
|
109
|
+
if (!validationResult.success) {
|
|
110
|
+
return json(
|
|
111
|
+
{ ok: false, error: "Invalid quiz data", details: validationResult.error.format() },
|
|
112
|
+
{ status: 400 }
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
const store = getSessionStore();
|
|
116
|
+
const session = store.createSession(quizData, parsed.config || {}, parsed.sessionId);
|
|
117
|
+
const baseUrl = `${url.protocol}//${url.host}`;
|
|
118
|
+
const quizUrl = `${baseUrl}/${session.quizId}/${session.sessionId}`;
|
|
119
|
+
const adminUrl = `${baseUrl}/admin/session/${session.quizId}/${session.sessionId}`;
|
|
120
|
+
const expiresAt = new Date(session.expiresAt).toISOString();
|
|
121
|
+
return json({
|
|
122
|
+
ok: true,
|
|
123
|
+
quizId: session.quizId,
|
|
124
|
+
sessionId: session.sessionId,
|
|
125
|
+
openUrl: parsed.open !== false ? quizUrl : void 0,
|
|
126
|
+
adminUrl,
|
|
127
|
+
expiresAt
|
|
128
|
+
});
|
|
129
|
+
} catch (error) {
|
|
130
|
+
if (error instanceof z.ZodError) {
|
|
131
|
+
return json(
|
|
132
|
+
{ ok: false, error: "Validation error", details: error.format() },
|
|
133
|
+
{ status: 400 }
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
console.error("Error creating quiz session:", error);
|
|
137
|
+
return json({ ok: false, error: "Internal server error" }, { status: 500 });
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
const GET = async () => {
|
|
141
|
+
return json({
|
|
142
|
+
schema: {
|
|
143
|
+
title: z.string().optional(),
|
|
144
|
+
description: z.string().optional(),
|
|
145
|
+
version: z.string().optional(),
|
|
146
|
+
metadata: z.object({
|
|
147
|
+
author: z.string().optional(),
|
|
148
|
+
difficulty: z.enum(["easy", "medium", "hard"]).optional(),
|
|
149
|
+
estimatedTime: z.number().optional(),
|
|
150
|
+
tags: z.array(z.string()).optional()
|
|
151
|
+
}).optional(),
|
|
152
|
+
questions: z.array(
|
|
153
|
+
z.object({
|
|
154
|
+
id: z.string(),
|
|
155
|
+
type: z.enum(["single", "multiple", "remove-extra", "order", "match", "text"]),
|
|
156
|
+
question: z.string(),
|
|
157
|
+
explanation: z.string().optional(),
|
|
158
|
+
points: z.number().optional(),
|
|
159
|
+
required: z.boolean().optional(),
|
|
160
|
+
options: z.union([
|
|
161
|
+
z.array(z.string()),
|
|
162
|
+
z.object({ left: z.array(z.string()), right: z.array(z.string()) })
|
|
163
|
+
]).optional(),
|
|
164
|
+
attachments: z.array(
|
|
165
|
+
z.object({
|
|
166
|
+
type: z.enum(["audio", "file", "image", "video"]),
|
|
167
|
+
url: z.string(),
|
|
168
|
+
title: z.string().optional(),
|
|
169
|
+
alt: z.string().optional()
|
|
170
|
+
})
|
|
171
|
+
).optional(),
|
|
172
|
+
validation: z.object({
|
|
173
|
+
minLength: z.number().optional(),
|
|
174
|
+
maxLength: z.number().optional(),
|
|
175
|
+
minSelections: z.number().optional(),
|
|
176
|
+
maxSelections: z.number().optional(),
|
|
177
|
+
pattern: z.string().optional()
|
|
178
|
+
}).optional()
|
|
179
|
+
})
|
|
180
|
+
).min(1)
|
|
181
|
+
},
|
|
182
|
+
examples: [
|
|
183
|
+
{
|
|
184
|
+
type: "single",
|
|
185
|
+
description: "Single choice question with radio buttons",
|
|
186
|
+
example: {
|
|
187
|
+
id: "q1",
|
|
188
|
+
type: "single",
|
|
189
|
+
question: "What is the capital of France?",
|
|
190
|
+
options: ["London", "Paris", "Berlin", "Madrid"],
|
|
191
|
+
correctAnswer: "Paris"
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
type: "multiple",
|
|
196
|
+
description: "Multiple choice question with checkboxes",
|
|
197
|
+
example: {
|
|
198
|
+
id: "q2",
|
|
199
|
+
type: "multiple",
|
|
200
|
+
question: "Which are programming languages?",
|
|
201
|
+
options: ["JavaScript", "Python", "HTML", "CSS"]
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
type: "text",
|
|
206
|
+
description: "Free-form text answer",
|
|
207
|
+
example: {
|
|
208
|
+
id: "q3",
|
|
209
|
+
type: "text",
|
|
210
|
+
question: "Explain closure in your own words.",
|
|
211
|
+
validation: { minLength: 50, maxLength: 500 }
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
]
|
|
215
|
+
});
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
export { GET, POST };
|
|
219
|
+
//# sourceMappingURL=_server.ts-C2NKc-VD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_server.ts-C2NKc-VD.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/quiz/_server.ts.js"],"sourcesContent":["import { json } from \"@sveltejs/kit\";\nimport { g as getSessionStore } from \"../../../../chunks/sessions.js\";\nimport { z } from \"zod\";\nconst QuestionTypeSchema = z.enum([\n \"single\",\n \"multiple\",\n \"remove-extra\",\n \"order\",\n \"match\",\n \"text\"\n]);\nconst MatchOptionsSchema = z.object({\n left: z.array(z.string()),\n right: z.array(z.string())\n});\nconst AttachmentSchema = z.object({\n type: z.enum([\"audio\", \"file\", \"image\", \"video\"]),\n url: z.string(),\n title: z.string().optional(),\n alt: z.string().optional()\n});\nconst ValidationRulesSchema = z.object({\n minLength: z.number().optional(),\n maxLength: z.number().optional(),\n minSelections: z.number().optional(),\n maxSelections: z.number().optional(),\n pattern: z.string().optional()\n});\nconst QuestionSchema = z.object({\n id: z.string(),\n type: QuestionTypeSchema,\n question: z.string(),\n explanation: z.string().optional(),\n points: z.number().optional(),\n required: z.boolean().optional(),\n options: z.union([z.array(z.string()), MatchOptionsSchema]).optional(),\n attachments: z.array(AttachmentSchema).optional(),\n validation: ValidationRulesSchema.optional()\n});\nconst QuizMetadataSchema = z.object({\n author: z.string().optional(),\n difficulty: z.enum([\"easy\", \"medium\", \"hard\"]).optional(),\n estimatedTime: z.number().optional(),\n tags: z.array(z.string()).optional()\n});\nconst QuizDataSchema = z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n version: z.string().optional(),\n metadata: QuizMetadataSchema.optional(),\n questions: z.array(QuestionSchema).min(1, \"Quiz must have at least one question\")\n});\nconst AnalyticsConfigSchema = z.object({\n enabled: z.boolean().optional(),\n provider: z.enum([\"none\", \"plausible\", \"google\", \"custom\"]).optional(),\n trackingId: z.string().optional(),\n anonymizeIp: z.boolean().optional()\n});\nconst LayoutConfigSchema = z.object({\n title: z.string().optional(),\n logo: z.string().nullable().optional(),\n favicon: z.string().nullable().optional(),\n css: z.string().nullable().optional(),\n hideThemeSwitcher: z.boolean().optional(),\n hideLanguageSwitcher: z.boolean().optional()\n});\nconst QuizConfigSchema = z.object({\n layout: LayoutConfigSchema.optional(),\n theme: z.enum([\"light\", \"dark\", \"auto\"]).optional(),\n css: z.string().nullable().optional(),\n logo: z.string().nullable().optional(),\n favicon: z.string().nullable().optional(),\n localization: z.string().nullable().optional(),\n language: z.string().optional(),\n shuffleQuestions: z.boolean().optional(),\n shuffleOptions: z.boolean().optional(),\n allowBackNavigation: z.boolean().optional(),\n showProgress: z.boolean().optional(),\n showQuestionNumbers: z.boolean().optional(),\n timerEnabled: z.boolean().optional(),\n timerDuration: z.number().optional(),\n webhook: z.string().url().nullable().optional().or(z.literal(\"\")),\n analytics: AnalyticsConfigSchema.nullable().optional(),\n allowedOrigins: z.array(z.string()).optional(),\n requireConsent: z.boolean().optional()\n});\nconst StartQuizSchema = z.object({\n quiz: z.union([QuizDataSchema, z.string()]),\n config: QuizConfigSchema.optional(),\n open: z.boolean().optional(),\n sessionId: z.string().optional()\n});\nconst POST = async ({ request, url }) => {\n try {\n const body = await request.json();\n const parsed = StartQuizSchema.parse(body);\n let quizData;\n if (typeof parsed.quiz === \"string\") {\n try {\n quizData = JSON.parse(parsed.quiz);\n } catch {\n return json({ ok: false, error: \"Invalid quiz JSON string\" }, { status: 400 });\n }\n } else {\n quizData = parsed.quiz;\n }\n const validationResult = QuizDataSchema.safeParse(quizData);\n if (!validationResult.success) {\n return json(\n { ok: false, error: \"Invalid quiz data\", details: validationResult.error.format() },\n { status: 400 }\n );\n }\n const store = getSessionStore();\n const session = store.createSession(quizData, parsed.config || {}, parsed.sessionId);\n const baseUrl = `${url.protocol}//${url.host}`;\n const quizUrl = `${baseUrl}/${session.quizId}/${session.sessionId}`;\n const adminUrl = `${baseUrl}/admin/session/${session.quizId}/${session.sessionId}`;\n const expiresAt = new Date(session.expiresAt).toISOString();\n return json({\n ok: true,\n quizId: session.quizId,\n sessionId: session.sessionId,\n openUrl: parsed.open !== false ? quizUrl : void 0,\n adminUrl,\n expiresAt\n });\n } catch (error) {\n if (error instanceof z.ZodError) {\n return json(\n { ok: false, error: \"Validation error\", details: error.format() },\n { status: 400 }\n );\n }\n console.error(\"Error creating quiz session:\", error);\n return json({ ok: false, error: \"Internal server error\" }, { status: 500 });\n }\n};\nconst GET = async () => {\n return json({\n schema: {\n title: z.string().optional(),\n description: z.string().optional(),\n version: z.string().optional(),\n metadata: z.object({\n author: z.string().optional(),\n difficulty: z.enum([\"easy\", \"medium\", \"hard\"]).optional(),\n estimatedTime: z.number().optional(),\n tags: z.array(z.string()).optional()\n }).optional(),\n questions: z.array(\n z.object({\n id: z.string(),\n type: z.enum([\"single\", \"multiple\", \"remove-extra\", \"order\", \"match\", \"text\"]),\n question: z.string(),\n explanation: z.string().optional(),\n points: z.number().optional(),\n required: z.boolean().optional(),\n options: z.union([\n z.array(z.string()),\n z.object({ left: z.array(z.string()), right: z.array(z.string()) })\n ]).optional(),\n attachments: z.array(\n z.object({\n type: z.enum([\"audio\", \"file\", \"image\", \"video\"]),\n url: z.string(),\n title: z.string().optional(),\n alt: z.string().optional()\n })\n ).optional(),\n validation: z.object({\n minLength: z.number().optional(),\n maxLength: z.number().optional(),\n minSelections: z.number().optional(),\n maxSelections: z.number().optional(),\n pattern: z.string().optional()\n }).optional()\n })\n ).min(1)\n },\n examples: [\n {\n type: \"single\",\n description: \"Single choice question with radio buttons\",\n example: {\n id: \"q1\",\n type: \"single\",\n question: \"What is the capital of France?\",\n options: [\"London\", \"Paris\", \"Berlin\", \"Madrid\"],\n correctAnswer: \"Paris\"\n }\n },\n {\n type: \"multiple\",\n description: \"Multiple choice question with checkboxes\",\n example: {\n id: \"q2\",\n type: \"multiple\",\n question: \"Which are programming languages?\",\n options: [\"JavaScript\", \"Python\", \"HTML\", \"CSS\"]\n }\n },\n {\n type: \"text\",\n description: \"Free-form text answer\",\n example: {\n id: \"q3\",\n type: \"text\",\n question: \"Explain closure in your own words.\",\n validation: { minLength: 50, maxLength: 500 }\n }\n }\n ]\n });\n};\nexport {\n GET,\n POST\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { j as json } from './index-wpIsICWW.js';
|
|
2
|
+
import { g as getSessionStore } from './sessions-CEbRx2vt.js';
|
|
3
|
+
|
|
4
|
+
const GET = async ({ params, url }) => {
|
|
5
|
+
const { quizId, sessionId } = params;
|
|
6
|
+
const includeAnswers = url.searchParams.get("includeAnswers") === "true";
|
|
7
|
+
const store = getSessionStore();
|
|
8
|
+
const session = store.getSession(quizId, sessionId);
|
|
9
|
+
if (!session) {
|
|
10
|
+
return json(
|
|
11
|
+
{
|
|
12
|
+
status: "not_found",
|
|
13
|
+
startedAt: "",
|
|
14
|
+
error: "Session not found or expired"
|
|
15
|
+
},
|
|
16
|
+
{ status: 404 }
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
const response = {
|
|
20
|
+
status: session.status,
|
|
21
|
+
quizId,
|
|
22
|
+
sessionId,
|
|
23
|
+
startedAt: session.startedAt,
|
|
24
|
+
completedAt: session.completedAt,
|
|
25
|
+
expiresAt: session.expiresAt,
|
|
26
|
+
status_: session.status
|
|
27
|
+
};
|
|
28
|
+
if (includeAnswers) {
|
|
29
|
+
if (session.answers) {
|
|
30
|
+
response.answers = Object.fromEntries(session.answers);
|
|
31
|
+
}
|
|
32
|
+
response.quiz = session.quiz;
|
|
33
|
+
response.results = session.results;
|
|
34
|
+
}
|
|
35
|
+
return json(response);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export { GET };
|
|
39
|
+
//# sourceMappingURL=_server.ts-CHyNcOmK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_server.ts-CHyNcOmK.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/quiz/_quizId_/session/_sessionId_/_server.ts.js"],"sourcesContent":["import { json } from \"@sveltejs/kit\";\nimport { g as getSessionStore } from \"../../../../../../../chunks/sessions.js\";\nconst GET = async ({ params, url }) => {\n const { quizId, sessionId } = params;\n const includeAnswers = url.searchParams.get(\"includeAnswers\") === \"true\";\n const store = getSessionStore();\n const session = store.getSession(quizId, sessionId);\n if (!session) {\n return json(\n {\n status: \"not_found\",\n startedAt: \"\",\n error: \"Session not found or expired\"\n },\n { status: 404 }\n );\n }\n const response = {\n status: session.status,\n quizId,\n sessionId,\n startedAt: session.startedAt,\n completedAt: session.completedAt,\n expiresAt: session.expiresAt,\n status_: session.status\n };\n if (includeAnswers) {\n if (session.answers) {\n response.answers = Object.fromEntries(session.answers);\n }\n response.quiz = session.quiz;\n response.results = session.results;\n }\n return json(response);\n};\nexport {\n GET\n};\n"],"names":[],"mappings":";;;AAEK,MAAC,GAAG,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK;AACvC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM;AACtC,EAAE,MAAM,cAAc,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,MAAM;AAC1E,EAAE,MAAM,KAAK,GAAG,eAAe,EAAE;AACjC,EAAE,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC;AACrD,EAAE,IAAI,CAAC,OAAO,EAAE;AAChB,IAAI,OAAO,IAAI;AACf,MAAM;AACN,QAAQ,MAAM,EAAE,WAAW;AAC3B,QAAQ,SAAS,EAAE,EAAE;AACrB,QAAQ,KAAK,EAAE;AACf,OAAO;AACP,MAAM,EAAE,MAAM,EAAE,GAAG;AACnB,KAAK;AACL,EAAE;AACF,EAAE,MAAM,QAAQ,GAAG;AACnB,IAAI,MAAM,EAAE,OAAO,CAAC,MAAM;AAC1B,IAAI,MAAM;AACV,IAAI,SAAS;AACb,IAAI,SAAS,EAAE,OAAO,CAAC,SAAS;AAChC,IAAI,WAAW,EAAE,OAAO,CAAC,WAAW;AACpC,IAAI,SAAS,EAAE,OAAO,CAAC,SAAS;AAChC,IAAI,OAAO,EAAE,OAAO,CAAC;AACrB,GAAG;AACH,EAAE,IAAI,cAAc,EAAE;AACtB,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE;AACzB,MAAM,QAAQ,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;AAC5D,IAAI;AACJ,IAAI,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;AAChC,IAAI,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO;AACtC,EAAE;AACF,EAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB;;;;"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { j as json } from './index-wpIsICWW.js';
|
|
2
|
+
import { g as getSessionStore } from './sessions-CEbRx2vt.js';
|
|
3
|
+
|
|
4
|
+
const POST = async ({ params, request }) => {
|
|
5
|
+
const { quizId, sessionId } = params;
|
|
6
|
+
const store = getSessionStore();
|
|
7
|
+
const session = store.getSession(quizId, sessionId);
|
|
8
|
+
if (!session) {
|
|
9
|
+
return json(
|
|
10
|
+
{
|
|
11
|
+
ok: false,
|
|
12
|
+
message: "",
|
|
13
|
+
cancelledAt: ""
|
|
14
|
+
},
|
|
15
|
+
{ status: 404 }
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
if (session.status !== "active") {
|
|
19
|
+
return json(
|
|
20
|
+
{
|
|
21
|
+
ok: false,
|
|
22
|
+
message: `Session is already ${session.status}`,
|
|
23
|
+
cancelledAt: ""
|
|
24
|
+
},
|
|
25
|
+
{ status: 400 }
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const body = await request.json();
|
|
30
|
+
const reason = body.reason;
|
|
31
|
+
store.cancelSession(quizId, sessionId, reason);
|
|
32
|
+
return json({
|
|
33
|
+
ok: true,
|
|
34
|
+
message: reason ? `Session cancelled: ${reason}` : "Session cancelled",
|
|
35
|
+
cancelledAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
36
|
+
});
|
|
37
|
+
} catch (error) {
|
|
38
|
+
console.error("Error cancelling quiz:", error);
|
|
39
|
+
return json(
|
|
40
|
+
{
|
|
41
|
+
ok: false,
|
|
42
|
+
message: "Failed to cancel session",
|
|
43
|
+
cancelledAt: ""
|
|
44
|
+
},
|
|
45
|
+
{ status: 500 }
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export { POST };
|
|
51
|
+
//# sourceMappingURL=_server.ts-CakPvrry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_server.ts-CakPvrry.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/quiz/_quizId_/session/_sessionId_/cancel/_server.ts.js"],"sourcesContent":["import { json } from \"@sveltejs/kit\";\nimport { g as getSessionStore } from \"../../../../../../../../chunks/sessions.js\";\nconst POST = async ({ params, request }) => {\n const { quizId, sessionId } = params;\n const store = getSessionStore();\n const session = store.getSession(quizId, sessionId);\n if (!session) {\n return json(\n {\n ok: false,\n message: \"\",\n cancelledAt: \"\"\n },\n { status: 404 }\n );\n }\n if (session.status !== \"active\") {\n return json(\n {\n ok: false,\n message: `Session is already ${session.status}`,\n cancelledAt: \"\"\n },\n { status: 400 }\n );\n }\n try {\n const body = await request.json();\n const reason = body.reason;\n store.cancelSession(quizId, sessionId, reason);\n return json({\n ok: true,\n message: reason ? `Session cancelled: ${reason}` : \"Session cancelled\",\n cancelledAt: (/* @__PURE__ */ new Date()).toISOString()\n });\n } catch (error) {\n console.error(\"Error cancelling quiz:\", error);\n return json(\n {\n ok: false,\n message: \"Failed to cancel session\",\n cancelledAt: \"\"\n },\n { status: 500 }\n );\n }\n};\nexport {\n POST\n};\n"],"names":[],"mappings":";;;AAEK,MAAC,IAAI,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK;AAC5C,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM;AACtC,EAAE,MAAM,KAAK,GAAG,eAAe,EAAE;AACjC,EAAE,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC;AACrD,EAAE,IAAI,CAAC,OAAO,EAAE;AAChB,IAAI,OAAO,IAAI;AACf,MAAM;AACN,QAAQ,EAAE,EAAE,KAAK;AACjB,QAAQ,OAAO,EAAE,EAAE;AACnB,QAAQ,WAAW,EAAE;AACrB,OAAO;AACP,MAAM,EAAE,MAAM,EAAE,GAAG;AACnB,KAAK;AACL,EAAE;AACF,EAAE,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE;AACnC,IAAI,OAAO,IAAI;AACf,MAAM;AACN,QAAQ,EAAE,EAAE,KAAK;AACjB,QAAQ,OAAO,EAAE,CAAC,mBAAmB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;AACvD,QAAQ,WAAW,EAAE;AACrB,OAAO;AACP,MAAM,EAAE,MAAM,EAAE,GAAG;AACnB,KAAK;AACL,EAAE;AACF,EAAE,IAAI;AACN,IAAI,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE;AACrC,IAAI,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAC9B,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;AAClD,IAAI,OAAO,IAAI,CAAC;AAChB,MAAM,EAAE,EAAE,IAAI;AACd,MAAM,OAAO,EAAE,MAAM,GAAG,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,GAAG,mBAAmB;AAC5E,MAAM,WAAW,EAAE,iBAAiB,IAAI,IAAI,EAAE,EAAE,WAAW;AAC3D,KAAK,CAAC;AACN,EAAE,CAAC,CAAC,OAAO,KAAK,EAAE;AAClB,IAAI,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC;AAClD,IAAI,OAAO,IAAI;AACf,MAAM;AACN,QAAQ,EAAE,EAAE,KAAK;AACjB,QAAQ,OAAO,EAAE,0BAA0B;AAC3C,QAAQ,WAAW,EAAE;AACrB,OAAO;AACP,MAAM,EAAE,MAAM,EAAE,GAAG;AACnB,KAAK;AACL,EAAE;AACF;;;;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { j as json } from './index-wpIsICWW.js';
|
|
2
|
+
import { g as getSessionStore } from './sessions-CEbRx2vt.js';
|
|
3
|
+
|
|
4
|
+
const GET = async ({ params, url }) => {
|
|
5
|
+
const { quizId, sessionId } = params;
|
|
6
|
+
const store = getSessionStore();
|
|
7
|
+
const includeAnswers = url.searchParams.get("includeAnswers") === "true";
|
|
8
|
+
const session = store.getSession(quizId, sessionId);
|
|
9
|
+
if (!session) {
|
|
10
|
+
return json({
|
|
11
|
+
status: "not_found",
|
|
12
|
+
startedAt: "",
|
|
13
|
+
error: "Session not found or expired"
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
const progress = {
|
|
17
|
+
answered: session.answers?.size || 0,
|
|
18
|
+
total: session.quiz.questions.length,
|
|
19
|
+
percentage: session.quiz.questions.length > 0 ? Math.round((session.answers?.size || 0) / session.quiz.questions.length * 100) : 0
|
|
20
|
+
};
|
|
21
|
+
const response = {
|
|
22
|
+
status: session.status,
|
|
23
|
+
startedAt: session.startedAt,
|
|
24
|
+
completedAt: session.completedAt,
|
|
25
|
+
progress,
|
|
26
|
+
expiresAt: session.expiresAt
|
|
27
|
+
};
|
|
28
|
+
if (includeAnswers && session.status === "completed" && session.results) {
|
|
29
|
+
response.answers = session.results;
|
|
30
|
+
}
|
|
31
|
+
return json(response);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export { GET };
|
|
35
|
+
//# sourceMappingURL=_server.ts-uSNr19lE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_server.ts-uSNr19lE.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/quiz/_quizId_/session/_sessionId_/status/_server.ts.js"],"sourcesContent":["import { json } from \"@sveltejs/kit\";\nimport { g as getSessionStore } from \"../../../../../../../../chunks/sessions.js\";\nconst GET = async ({ params, url }) => {\n const { quizId, sessionId } = params;\n const store = getSessionStore();\n const includeAnswers = url.searchParams.get(\"includeAnswers\") === \"true\";\n const session = store.getSession(quizId, sessionId);\n if (!session) {\n return json({\n status: \"not_found\",\n startedAt: \"\",\n error: \"Session not found or expired\"\n });\n }\n const progress = {\n answered: session.answers?.size || 0,\n total: session.quiz.questions.length,\n percentage: session.quiz.questions.length > 0 ? Math.round((session.answers?.size || 0) / session.quiz.questions.length * 100) : 0\n };\n const response = {\n status: session.status,\n startedAt: session.startedAt,\n completedAt: session.completedAt,\n progress,\n expiresAt: session.expiresAt\n };\n if (includeAnswers && session.status === \"completed\" && session.results) {\n response.answers = session.results;\n }\n return json(response);\n};\nexport {\n GET\n};\n"],"names":[],"mappings":";;;AAEK,MAAC,GAAG,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK;AACvC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM;AACtC,EAAE,MAAM,KAAK,GAAG,eAAe,EAAE;AACjC,EAAE,MAAM,cAAc,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,MAAM;AAC1E,EAAE,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC;AACrD,EAAE,IAAI,CAAC,OAAO,EAAE;AAChB,IAAI,OAAO,IAAI,CAAC;AAChB,MAAM,MAAM,EAAE,WAAW;AACzB,MAAM,SAAS,EAAE,EAAE;AACnB,MAAM,KAAK,EAAE;AACb,KAAK,CAAC;AACN,EAAE;AACF,EAAE,MAAM,QAAQ,GAAG;AACnB,IAAI,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC;AACxC,IAAI,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM;AACxC,IAAI,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG;AACrI,GAAG;AACH,EAAE,MAAM,QAAQ,GAAG;AACnB,IAAI,MAAM,EAAE,OAAO,CAAC,MAAM;AAC1B,IAAI,SAAS,EAAE,OAAO,CAAC,SAAS;AAChC,IAAI,WAAW,EAAE,OAAO,CAAC,WAAW;AACpC,IAAI,QAAQ;AACZ,IAAI,SAAS,EAAE,OAAO,CAAC;AACvB,GAAG;AACH,EAAE,IAAI,cAAc,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE;AAC3E,IAAI,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO;AACtC,EAAE;AACF,EAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB;;;;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { F as noop, D as writable } from './exports-BNC8dbq3.js';
|
|
2
|
+
|
|
3
|
+
function create_updated_store() {
|
|
4
|
+
const { set, subscribe } = writable(false);
|
|
5
|
+
{
|
|
6
|
+
return {
|
|
7
|
+
subscribe,
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
9
|
+
check: async () => false
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
const is_legacy = noop.toString().includes("$$") || /function \w+\(\) \{\}/.test(noop.toString());
|
|
14
|
+
if (is_legacy) {
|
|
15
|
+
({
|
|
16
|
+
url: new URL("https://example.com")
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
const stores = {
|
|
20
|
+
updated: /* @__PURE__ */ create_updated_store()
|
|
21
|
+
};
|
|
22
|
+
({
|
|
23
|
+
check: stores.updated.check
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=client-Dw0t4rDL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-Dw0t4rDL.js","sources":["../../../.svelte-kit/adapter-node/chunks/client.js"],"sourcesContent":["import { n as noop } from \"./equality.js\";\nimport \"@sveltejs/kit/internal/server\";\nimport \"@sveltejs/kit/internal\";\nimport { w as writable } from \"./exports.js\";\nimport \"./utils.js\";\nfunction create_updated_store() {\n const { set, subscribe } = writable(false);\n {\n return {\n subscribe,\n // eslint-disable-next-line @typescript-eslint/require-await\n check: async () => false\n };\n }\n}\nconst is_legacy = noop.toString().includes(\"$$\") || /function \\w+\\(\\) \\{\\}/.test(noop.toString());\nif (is_legacy) {\n ({\n data: {},\n form: null,\n error: null,\n params: {},\n route: { id: null },\n state: {},\n status: -1,\n url: new URL(\"https://example.com\")\n });\n}\nconst stores = {\n updated: /* @__PURE__ */ create_updated_store()\n};\n({\n check: stores.updated.check\n});\n"],"names":[],"mappings":";;AAKA,SAAS,oBAAoB,GAAG;AAChC,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC;AAC5C,EAAE;AACF,IAAI,OAAO;AACX,MAAM,SAAS;AACf;AACA,MAAM,KAAK,EAAE,YAAY;AACzB,KAAK;AACL,EAAE;AACF;AACA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AACjG,IAAI,SAAS,EAAE;AACf,EAAE,CAAC;AACH,IAOI,GAAG,EAAE,IAAI,GAAG,CAAC,qBAAqB;AACtC,GAAG;AACH;AACA,MAAM,MAAM,GAAG;AACf,EAAE,OAAO,kBAAkB,oBAAoB;AAC/C,CAAC;AACD,CAAC;AACD,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC"}
|