@pie-element/categorize 13.2.0-next.19 → 13.2.0-next.21

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.
@@ -138,7 +138,7 @@ async function v(e, t, n, r = "value") {
138
138
  let a = g(e);
139
139
  if (n && typeof n == "function") try {
140
140
  let e = h(a.map((e) => e[r]));
141
- _(e) ? console.error(`shuffledValues is an empty array - refusing to call updateSession. shuffledChoices: ${JSON.stringify(a)}, key: ${r}`) : t.id && t.element && await n(t.id, t.element, { shuffledValues: e });
141
+ _(e) ? console.error(`shuffledValues is an empty array - refusing to call updateSession. shuffledChoices: ${JSON.stringify(a)}, key: ${r}`) : await n(t.id, t.element, { shuffledValues: e });
142
142
  } catch (e) {
143
143
  console.warn("Unable to save shuffled order for choices"), console.error(e);
144
144
  }
@@ -146,7 +146,7 @@ async function v(e, t, n, r = "value") {
146
146
  return a;
147
147
  }
148
148
  function y(e, t, n) {
149
- return !!(e.lockChoiceOrder || n["@pie-element"]?.lockChoiceOrder || (n.role ?? "student") === "instructor");
149
+ return !!(e.lockChoiceOrder || n?.["@pie-element"]?.lockChoiceOrder);
150
150
  }
151
151
  var b = /* @__PURE__ */ m({ enabled: () => x });
152
152
  function x(e, t, n) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../../lib-react/categorize/dist/scoring.js","../../../../../shared/feedback/dist/index.js","../../../../../shared/controller-utils/dist/index.js","../../../src/controller/defaults.ts","../../../src/controller/utils.ts","../../../src/controller/index.ts"],"sourcesContent":["import e from \"debug\";\n//#region src/scoring.ts\nvar t = e(\"@pie-lib:categorize:scoring\"), n = (e) => !e || !e.weighting ? [] : e.weighting.enabled && e.weighting && e.weighting.rules || [], r = (e, n) => {\n\tif (t(\"partial? \", e), !(!e || !e.enabled)) {\n\t\tlet t = e.rules.find((e) => e.category === n);\n\t\treturn t && t.rules || [];\n\t}\n}, i = (e, i) => new Promise((a) => {\n\tt(\"categories: \", e, \"scoring: \", i);\n\tlet o = n(i), s = e.map((e) => ({\n\t\t...o.find((t) => t.category === e.id) || { points: 1 },\n\t\tcategory: e.id\n\t}));\n\tt(\"weights: \", s);\n\tlet c = e.reduce((e, t) => {\n\t\tlet n = s.find((e) => e.category === t.id);\n\t\treturn e += n.points;\n\t}, 0);\n\tt(\"total: \", c);\n\tlet l = e.map((e) => {\n\t\tlet n = s.find((t) => t.category === e.id).points;\n\t\tif (t(\"category: \", e), e.correct === !0) return {\n\t\t\tcategory: e.id,\n\t\t\tscore: n,\n\t\t\tpoints: n\n\t\t};\n\t\t{\n\t\t\tlet a = r(i.partial, e.id);\n\t\t\tif (t(\"partial rules for category: \", a), a) {\n\t\t\t\tlet r = (e.choices || []).filter((e) => e.correct).length;\n\t\t\t\tt(\"correctCount: \", r);\n\t\t\t\tlet i = a.find((e) => e.count === r);\n\t\t\t\tt(\"rule: \", i), i ||= {\n\t\t\t\t\tpercent: 0,\n\t\t\t\t\tcount: r\n\t\t\t\t};\n\t\t\t\tlet o = n * (i.percent / 100);\n\t\t\t\treturn {\n\t\t\t\t\tcategory: e.id,\n\t\t\t\t\tscore: o,\n\t\t\t\t\tpoints: n,\n\t\t\t\t\tpartial: {\n\t\t\t\t\t\tcorrectChoices: r,\n\t\t\t\t\t\trule: i\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t} else return {\n\t\t\t\tcategory: e.id,\n\t\t\t\tscore: 0,\n\t\t\t\tpoints: n\n\t\t\t};\n\t\t}\n\t}), u = l.reduce((e, t) => e += t.score, 0);\n\tt(\"weightedScore: \", u), a({\n\t\tscore: parseFloat((u / c).toFixed(2), 10),\n\t\tdetails: {\n\t\t\tweighted: {\n\t\t\t\ttotal: c,\n\t\t\t\tscore: u\n\t\t\t},\n\t\t\tcategories: l\n\t\t}\n\t});\n});\n//#endregion\nexport { i as score };\n","//#region src/defaults.ts\nvar e = {\n\tcorrect: {\n\t\ttype: \"default\",\n\t\tdefault: \"Correct\",\n\t\tcustom: \"Correct\"\n\t},\n\tincorrect: {\n\t\ttype: \"default\",\n\t\tdefault: \"Incorrect\",\n\t\tcustom: \"Incorrect\"\n\t},\n\tpartial: {\n\t\ttype: \"default\",\n\t\tdefault: \"Nearly\",\n\t\tcustom: \"Nearly\"\n\t},\n\tunanswered: {\n\t\ttype: \"default\",\n\t\tdefault: \"You have not entered a response\",\n\t\tcustom: \"You have not entered a response\"\n\t}\n};\n//#endregion\n//#region src/utils.ts\nfunction t(e) {\n\treturn e === \"partially-correct\" ? \"partial\" : e;\n}\n//#endregion\n//#region src/index.ts\nfunction n(n, i = {}) {\n\treturn new Promise((a) => {\n\t\tlet o = {\n\t\t\t...e,\n\t\t\t...i\n\t\t}, s = t(n), c = o[s], l = e[s];\n\t\tr(c, l[c.type]).then(a);\n\t});\n}\nfunction r(e, t) {\n\treturn new Promise((n) => {\n\t\tif (!e || e.type === \"none\") {\n\t\t\tn(void 0);\n\t\t\treturn;\n\t\t}\n\t\tn(e[e.type] || t);\n\t});\n}\nfunction i(n, r = {}) {\n\tlet i = {\n\t\t...e,\n\t\t...r\n\t}, o = t(n), s = i[o], c = e[o];\n\treturn a(s, c[s.type]);\n}\nfunction a(e, t) {\n\tif (!(!e || e.type === \"none\")) return e[e.type] || t;\n}\n//#endregion\nexport { e as defaultFeedback, a as getActualFeedback, i as getActualFeedbackForCorrectness, r as getFeedback, n as getFeedbackForCorrectness, t as normalizeCorrectness };\n","//#region \\0rolldown/runtime.js\nvar e = Object.defineProperty, t = (t, n) => {\n\tlet r = {};\n\tfor (var i in t) e(r, i, {\n\t\tget: t[i],\n\t\tenumerable: !0\n\t});\n\treturn n || e(r, Symbol.toStringTag, { value: \"Module\" }), r;\n};\n//#endregion\n//#region src/persistence.ts\nfunction n(e) {\n\treturn Array.isArray(e) ? e.filter((e) => e != null) : [];\n}\nfunction r(e) {\n\tlet t = [...e];\n\tfor (let e = t.length - 1; e > 0; e--) {\n\t\tlet n = Math.floor(Math.random() * (e + 1));\n\t\t[t[e], t[n]] = [t[n], t[e]];\n\t}\n\treturn t;\n}\nfunction i(e) {\n\treturn e == null ? !0 : Array.isArray(e) ? e.length === 0 : typeof e == \"object\" && Object.keys(e).length === 0;\n}\nasync function a(e, t, a, o = \"value\") {\n\tlet s = n(t?.data?.shuffledValues ?? t?.shuffledValues ?? []);\n\tif (!t) {\n\t\tconsole.warn(\"Unable to save shuffled choices because there's no session.\");\n\t\treturn;\n\t}\n\tif (!i(s)) return n(s.map((t) => e.find((e) => e[o] === t)));\n\tlet c = r(e);\n\tif (a && typeof a == \"function\") try {\n\t\tlet e = n(c.map((e) => e[o]));\n\t\ti(e) ? console.error(`shuffledValues is an empty array - refusing to call updateSession. shuffledChoices: ${JSON.stringify(c)}, key: ${o}`) : t.id && t.element && await a(t.id, t.element, { shuffledValues: e });\n\t} catch (e) {\n\t\tconsole.warn(\"Unable to save shuffled order for choices\"), console.error(e);\n\t}\n\telse console.warn(\"Unable to save shuffled choices, shuffle will happen every time.\");\n\treturn c;\n}\nfunction o(e, t, n) {\n\treturn !!(e.lockChoiceOrder || n[\"@pie-element\"]?.lockChoiceOrder || (n.role ?? \"student\") === \"instructor\");\n}\n//#endregion\n//#region src/partial-scoring.ts\nvar s = /* @__PURE__ */ t({ enabled: () => c });\nfunction c(e, t, n) {\n\treturn e?.partialScoring === !1 || t?.partialScoring === !1 ? !1 : typeof n != \"boolean\" || n;\n}\n//#endregion\nexport { a as getShuffledChoices, o as lockChoices, s as partialScoring };\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/categorize/controller/src/defaults.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\nexport default {\n alternates: [],\n categories: [],\n categoriesPerRow: 2,\n choices: [],\n choicesLabel: '',\n choicesPosition: 'below',\n correctResponse: [],\n feedbackEnabled: false,\n lockChoiceOrder: true,\n maxAnswerChoices: 6,\n maxChoicesPerCategory: 0,\n partialScoring: true,\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n rowLabels: [''],\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n minRowHeight: '80px',\n};\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/categorize/controller/src/utils.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\n// used in configure too, for consistency modify it there too\nexport const multiplePlacements = { enabled: 'Yes', disabled: 'No', perChoice: 'Set Per Choice' };\n\n// used to validate the config\nexport const isCorrectResponseDuplicated = (choices, alternate) => {\n if (choices.length < 1 || alternate.length < 1) {\n return -1;\n }\n\n const stringChoices = JSON.stringify(choices.sort());\n const stringAlternate = alternate.reduce(\n (total, current) => (current.length > 0 ? [...total, JSON.stringify(current.sort())] : total),\n [],\n );\n const foundIndexDuplicate = stringAlternate.findIndex((alternate) => alternate.length && alternate === stringChoices);\n\n return foundIndexDuplicate;\n};\n\nexport const isAlternateDuplicated = (alternate) => {\n if (alternate.length <= 1) {\n return -1;\n }\n\n const elementSet = new Set();\n const stringAlternate = alternate.reduce(\n (total, current) => (current.length > 0 ? [...total, JSON.stringify(current.sort())] : total),\n [],\n );\n\n for (let i = 0; i < stringAlternate.length; i++) {\n if (elementSet.has(stringAlternate[i]) && stringAlternate[i]) {\n return i;\n }\n\n elementSet.add(stringAlternate[i]);\n }\n\n return -1;\n};\n\n// calculate the minimum number of populated response areas (categories) in the correct answer or alternates\n// and create an array with the possible responses ids\nexport const getCompleteResponseDetails = (correctResponse, alternates, allChoices) => {\n const choicesPerCategory = correctResponse.map((category) => category.choices);\n const possibleResponses = [choicesPerCategory.flat()];\n let responseAreasToBeFilled = choicesPerCategory.filter((choices) => choices.length).length;\n\n if (alternates.length) {\n const alternatesPerChoice = alternates[0]?.length || 0; // number of alternates\n\n [...Array(alternatesPerChoice).keys()].forEach((index) => {\n const alternatesPerResponse = alternates.map((alternate) => alternate[index]);\n const filledCategories = alternatesPerResponse.filter((category) => category?.length).length;\n possibleResponses.push(alternatesPerResponse.flat());\n\n if (filledCategories < responseAreasToBeFilled) {\n responseAreasToBeFilled = filledCategories;\n }\n });\n }\n\n // check if any correct answer have any unplaced answer choices\n const hasUnplacedChoices = possibleResponses.some(\n (response) => !allChoices.every((val) => response.includes(val?.id)),\n );\n\n return { responseAreasToBeFilled, possibleResponses, hasUnplacedChoices };\n};\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/categorize/controller/src/index.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\nimport { isEmpty } from '@pie-element/shared-lodash';\nimport { buildState, score } from '@pie-lib/categorize';\nimport { getFeedbackForCorrectness } from '@pie-element/shared-feedback';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-element/shared-controller-utils';\nimport Translator from '@pie-lib/translator';\n\nconst { translator } = Translator;\nimport defaults from './defaults.js';\nimport { getCompleteResponseDetails, isAlternateDuplicated, isCorrectResponseDuplicated, multiplePlacements } from './utils.js';\n\n// eslint-disable-next-line no-console\n\nexport { score };\n\nexport const getPartialScore = (correctResponse, builtCategories) => {\n // in the resulted best scenario we make a sum with all the correct responses\n // and all the placements\n const { placements, score } = builtCategories.reduce(\n (acc, { choices = [] }) => ({\n placements: acc.placements + choices.length,\n score: acc.score + choices.filter((ch) => ch.correct).length,\n }),\n { placements: 0, score: 0 },\n );\n\n // in the correct response, we make a sum of the max possible score\n const { maxScore } = correctResponse.reduce(\n (acc, { choices }) => ({\n maxScore: acc.maxScore + choices.length,\n }),\n { maxScore: 0 },\n );\n\n // if there are any extra placements, we subtract from the obtained score\n const extraPlacements = placements > maxScore ? placements - maxScore : 0;\n const totalScore = (score - extraPlacements) / maxScore;\n\n return totalScore < 0 ? 0 : parseFloat(totalScore.toFixed(2));\n};\n\nconst getAlternates = (correctResponse) =>\n correctResponse.map((c) => c.alternateResponses).filter((alternate) => alternate);\n\nexport const getTotalScore = (question, session, env) => {\n if (!session) {\n return 0;\n }\n\n if (Object.keys(session).length === 0) {\n return 0;\n }\n const { categories, choices } = question || {};\n let { correctResponse } = question || {};\n let { answers } = session || {};\n answers = answers || [];\n correctResponse = correctResponse || [];\n\n // this function is used in pie-ui/categorize as well, in order to get the best scenario\n // so we get the best scenario and calculate the score\n const { categories: builtCategories, correct } = buildState(categories, choices, answers, correctResponse);\n\n const alternates = getAlternates(correctResponse);\n const enabled = partialScoring.enabled(question, env);\n\n // if there are any alternates, there will be no partial scoring!\n if (enabled && !alternates.length) {\n // we apply partial scoring\n return getPartialScore(correctResponse, builtCategories);\n }\n\n // else we apply dichotomous\n return correct ? 1 : 0;\n};\n\nexport const getCorrectness = (question, session, env) => {\n return new Promise((resolve) => {\n if (env.mode === 'evaluate') {\n const score = getTotalScore(question, session, env);\n if (score === 1) {\n resolve('correct');\n } else if (score === 0) {\n resolve('incorrect');\n } else {\n resolve('partially-correct');\n }\n } else {\n resolve(undefined);\n }\n });\n};\n\nexport const createDefaultModel = (model = {}) =>\n new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport const model = async (question, session, env, updateSession) => {\n const normalizedQuestion = normalize(question);\n const answerCorrectness = await getCorrectness(normalizedQuestion, session, env);\n\n const { mode, role } = env || {};\n\n const {\n categories,\n categoriesPerRow,\n choicesLabel,\n choicesPosition,\n correctResponse,\n feedback,\n feedbackEnabled,\n promptEnabled,\n prompt,\n rowLabels,\n rationaleEnabled,\n rationale,\n teacherInstructionsEnabled,\n teacherInstructions,\n language,\n maxChoicesPerCategory,\n extraCSSRules,\n minRowHeight,\n fontSizeFactor,\n autoplayAudioEnabled,\n completeAudioEnabled,\n customAudioButton,\n } = normalizedQuestion;\n let { choices, note } = normalizedQuestion;\n let fb;\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n const filteredCorrectResponse = correctResponse.map((response) => {\n const filteredChoices = (response.choices || []).filter((choice) => choice !== 'null');\n return { ...response, choices: filteredChoices };\n });\n\n if (mode === 'evaluate' && feedbackEnabled) {\n fb = await getFeedbackForCorrectness(answerCorrectness, feedback);\n }\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(choices, session, updateSession, 'id');\n }\n\n const resolvedAllowMultiple = (() => {\n if (question.allowMultiplePlacementsEnabled != null) {\n return question.allowMultiplePlacementsEnabled;\n }\n // Derive from correct response: if any choice id appears in more than one category, reuse is required\n const allChoiceIds = (correctResponse || []).flatMap((cr) => cr.choices || []);\n const isExclusive = allChoiceIds.length === new Set(allChoiceIds).size;\n return isExclusive ? multiplePlacements.disabled : multiplePlacements.enabled;\n })();\n\n choices = (choices || []).map((c) => {\n let categoryCount;\n if (resolvedAllowMultiple === multiplePlacements.enabled) {\n categoryCount = 0;\n } else if (resolvedAllowMultiple === multiplePlacements.disabled) {\n categoryCount = 1;\n } else {\n // perChoice — use the value set on each choice individually\n categoryCount = c.categoryCount || 0;\n }\n return { ...c, categoryCount };\n });\n\n if (!note) {\n note = translator.t('common:commonCorrectAnswerWithAlternates', { lng: language });\n }\n\n const alternates = getAlternates(filteredCorrectResponse);\n const { responseAreasToBeFilled, possibleResponses, hasUnplacedChoices } = getCompleteResponseDetails(\n filteredCorrectResponse,\n normalizedQuestion.allowAlternateEnabled ? alternates : [],\n normalizedQuestion.choices,\n );\n const out = {\n categories: categories || [],\n categoriesPerRow: categoriesPerRow || 2,\n maxChoicesPerCategory,\n correctness: answerCorrectness,\n choices: choices || [],\n choicesLabel: choicesLabel || '',\n choicesPosition,\n disabled: mode !== 'gather',\n feedback: fb,\n lockChoiceOrder,\n prompt: promptEnabled ? prompt : null,\n rowLabels,\n note,\n env,\n showNote: alternates && alternates.length > 0,\n correctResponse: mode === 'evaluate' ? filteredCorrectResponse : undefined,\n language,\n extraCSSRules,\n fontSizeFactor,\n minRowHeight: minRowHeight,\n autoplayAudioEnabled,\n completeAudioEnabled,\n customAudioButton,\n possibleResponses,\n responseAreasToBeFilled,\n hasUnplacedChoices,\n ...(question.allowMultiplePlacementsEnabled == null && { allowMultiplePlacementsEnabled: resolvedAllowMultiple }),\n };\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.rationale = rationaleEnabled ? rationale : null;\n out.teacherInstructions = teacherInstructionsEnabled ? teacherInstructions : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n return out;\n};\n\n /**\n * Generates detailed trace log for scoring evaluation\n * @param {Object} model - the question model\n * @param {Object} session - the student session\n * @param {Object} env - the environment\n * @returns {Array} traceLog - array of trace messages\n */\nexport const getLogTrace = (model, session, env) => {\n const traceLog = [];\n const { answers } = session || {};\n const { categories, choices, correctResponse } = model || {};\n\n const draggedChoices = answers.reduce(\n (sum, a) => sum + (a.choices?.length || 0),\n 0\n );\n\n const alternates = getAlternates(correctResponse);\n const hasAlternates = alternates.length > 0;\n const partialScoringEnabled = partialScoring.enabled(model, env);\n\n const builtState =\n draggedChoices > 0\n ? buildState(categories, choices, answers, correctResponse)\n : null;\n\n const builtCategories = builtState?.categories || [];\n \n if (draggedChoices > 0) {\n traceLog.push(`Student placed ${draggedChoices} choice(s) into categories.`);\n \n (categories || []).forEach((category) => {\n const categoryId = category.id;\n const builtCategory = builtCategories.find(c => c.id === categoryId);\n const studentChoices = builtCategory ? builtCategory.choices || [] : [];\n const correctResponseForCategory = (correctResponse || []).find(cr => cr.category === categoryId);\n const expectedChoices = correctResponseForCategory ? correctResponseForCategory.choices || [] : [];\n \n if (expectedChoices.length > 0) {\n if (studentChoices.length === 0) {\n traceLog.push(`Category ${categoryId}: student left empty (should contain ${expectedChoices.length} choice(s)).`);\n } else {\n const correctCount = studentChoices.filter(choice => choice.correct).length;\n const incorrectCount = studentChoices.length - correctCount;\n \n if (correctCount > 0 && incorrectCount === 0) {\n traceLog.push(`Category ${categoryId}: student placed ${correctCount} correct choice(s).`);\n } else if (correctCount === 0 && incorrectCount > 0) {\n traceLog.push(`Category ${categoryId}: student placed ${incorrectCount} incorrect choice(s).`);\n } else {\n traceLog.push(`Category ${categoryId}: student placed ${correctCount} correct and ${incorrectCount} incorrect choice(s).`);\n }\n }\n }\n });\n } else {\n traceLog.push('Student did not place any choices into categories.');\n }\n\n if (hasAlternates) {\n traceLog.push('Alternate response combinations are accepted for this question.');\n }\n\n if (hasAlternates) {\n traceLog.push('Score calculated using all-or-nothing scoring (alternate responses disable partial scoring).');\n traceLog.push('Student must get all categories completely correct to receive full credit.');\n } else if (partialScoringEnabled) {\n traceLog.push('Score calculated using partial scoring.');\n traceLog.push('Student receives credit for each correct placement, with deductions for incorrect placements beyond required amount.');\n \n if (draggedChoices > 0) {\n const totalCorrect = builtCategories.reduce((sum, cat) => \n sum + (cat.choices || []).filter(choice => choice.correct).length, 0);\n const totalIncorrect = draggedChoices - totalCorrect;\n const maxPossible = (correctResponse || []).reduce((sum, cat) => \n sum + (cat.choices || []).length, 0);\n \n traceLog.push(`Partial scoring calculation: ${totalCorrect} correct placements, ${totalIncorrect} incorrect placements.`);\n \n if (draggedChoices > maxPossible) {\n const extraPlacements = draggedChoices - maxPossible;\n traceLog.push(`${extraPlacements} extra placement(s) beyond required amount will be deducted from score.`);\n }\n }\n } else {\n traceLog.push('Score calculated using all-or-nothing scoring.');\n traceLog.push('Student must get all categories completely correct to receive full credit.');\n }\n\n const score = getTotalScore(model, session, env);\n traceLog.push(`Final score: ${score}.`);\n\n return traceLog;\n}\n\nexport const outcome = (question, session, env) => {\n if (env.mode !== 'evaluate') {\n return Promise.reject(new Error('Can not call outcome when mode is not evaluate'));\n } else {\n return new Promise((resolve) => {\n // A player sends an untouched item's session as `{ id, element }`, without `answers`.\n if (!session || isEmpty(session) || !session.answers) {\n resolve({\n score: 0,\n empty: true,\n traceLog: ['Student did not place any choices into categories. Score is 0.'],\n });\n } else {\n const traceLog = getLogTrace(question, session, env);\n const score = getTotalScore(question, session, env);\n \n resolve({\n score,\n empty: false,\n traceLog,\n });\n }\n });\n }\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n const { mode, role } = env || {};\n\n if (mode !== 'evaluate' && role === 'instructor') {\n const { correctResponse } = question;\n\n resolve({ answers: correctResponse, id: 1 });\n } else {\n return resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { categories, choices, correctResponse, maxAnswerChoices } = model;\n const {\n minChoices = 1,\n minCategories = 1,\n maxCategories = 12,\n maxLengthPerChoice = 300,\n maxLengthPerCategory = 150,\n } = config;\n const reversedChoices = [...(choices || [])].reverse();\n const errors = {};\n const choicesErrors = {};\n const categoriesErrors = {};\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n (categories || []).forEach((category) => {\n const { id, label } = category;\n\n if (getInnerText(label).length > maxLengthPerCategory) {\n categoriesErrors[id] = `Category labels should be no more than ${maxLengthPerCategory} characters long.`;\n }\n });\n\n (reversedChoices || []).forEach((choice, index) => {\n const { id, content } = choice;\n\n if (getInnerText(content).length > maxLengthPerChoice) {\n choicesErrors[id] = `Tokens should be no more than ${maxLengthPerChoice} characters long.`;\n }\n\n if (!getContent(content)) {\n choicesErrors[id] = 'Tokens should not be empty.';\n } else {\n const identicalAnswer = reversedChoices.slice(index + 1).some((c) => c.content === content);\n\n if (identicalAnswer) {\n choicesErrors[id] = 'Tokens content should be unique.';\n }\n }\n });\n\n const nbOfCategories = (categories || []).length;\n const nbOfChoices = (choices || []).length;\n\n if (nbOfCategories > maxCategories) {\n errors.categoriesError = `No more than ${maxCategories} categories should be defined.`;\n } else if (nbOfCategories < minCategories) {\n errors.categoriesError = `There should be at least ${minCategories} category defined.`;\n }\n\n if (nbOfChoices < minChoices) {\n errors.choicesError = `There should be at least ${minChoices} choices defined.`;\n } else if (nbOfChoices > maxAnswerChoices) {\n errors.choicesError = `No more than ${maxAnswerChoices} choices should be defined.`;\n }\n\n if (nbOfChoices && nbOfCategories) {\n let hasAssociations = false;\n\n (correctResponse || []).forEach((response) => {\n const { choices = [], alternateResponses = [] } = response;\n\n if (choices.length) {\n hasAssociations = true;\n } else {\n alternateResponses.forEach((alternate) => {\n if ((alternate || []).length) {\n hasAssociations = true;\n }\n });\n }\n });\n\n let duplicateAlternateIndex = -1;\n let duplicateCategory = '';\n (correctResponse || []).forEach((response) => {\n const { choices = [], alternateResponses = [], category } = response;\n\n if (duplicateAlternateIndex === -1) {\n duplicateAlternateIndex = isCorrectResponseDuplicated(choices, alternateResponses);\n\n if (duplicateAlternateIndex === -1) {\n duplicateAlternateIndex = isAlternateDuplicated(alternateResponses);\n }\n\n duplicateCategory = category;\n }\n });\n\n if (duplicateAlternateIndex > -1) {\n errors.duplicateAlternate = { index: duplicateAlternateIndex, category: duplicateCategory };\n }\n\n if (!hasAssociations) {\n errors.associationError = 'At least one token should be assigned to at least one category.';\n }\n }\n\n if (!isEmpty(choicesErrors)) {\n errors.choicesErrors = choicesErrors;\n }\n\n if (!isEmpty(categoriesErrors)) {\n errors.categoriesErrors = categoriesErrors;\n }\n\n return errors;\n};\n"],"mappings":";;AAEA,IAAI,KAAA,IAAA,wBAAA,EAAA,CAAA,QAAA,CAAM,6BAA6B,GAAG,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,IAAI,EAAE,UAAU,WAAW,EAAE,aAAa,EAAE,UAAU,SAAS,CAAC,GAAG,KAAK,GAAG,MAAM;CAC3J,IAAI,EAAE,aAAa,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,UAAU;EAC3C,IAAI,IAAI,EAAE,MAAM,MAAM,MAAM,EAAE,aAAa,CAAC;EAC5C,OAAO,KAAK,EAAE,SAAS,CAAC;CACzB;AACD,GAAG,KAAK,GAAG,MAAM,IAAI,SAAS,MAAM;CACnC,EAAE,gBAAgB,GAAG,aAAa,CAAC;CACnC,IAAI,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,OAAO;EAC/B,GAAG,EAAE,MAAM,MAAM,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;EACrD,UAAU,EAAE;CACb,EAAE;CACF,EAAE,aAAa,CAAC;CAChB,IAAI,IAAI,EAAE,QAAQ,GAAG,MAAM;EAC1B,IAAI,IAAI,EAAE,MAAM,MAAM,EAAE,aAAa,EAAE,EAAE;EACzC,OAAO,KAAK,EAAE;CACf,GAAG,CAAC;CACJ,EAAE,WAAW,CAAC;CACd,IAAI,IAAI,EAAE,KAAK,MAAM;EACpB,IAAI,IAAI,EAAE,MAAM,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;EAC3C,IAAI,EAAE,cAAc,CAAC,GAAG,EAAE,YAAY,CAAC,GAAG,OAAO;GAChD,UAAU,EAAE;GACZ,OAAO;GACP,QAAQ;EACT;EACA;GACC,IAAI,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE;GACzB,IAAI,EAAE,gCAAgC,CAAC,GAAG,GAAG;IAC5C,IAAI,KAAK,EAAE,WAAW,CAAC,EAAA,CAAG,QAAQ,MAAM,EAAE,OAAO,CAAC,CAAC;IACnD,EAAE,kBAAkB,CAAC;IACrB,IAAI,IAAI,EAAE,MAAM,MAAM,EAAE,UAAU,CAAC;IACnC,EAAE,UAAU,CAAC,GAAG,MAAM;KACrB,SAAS;KACT,OAAO;IACR;IACA,IAAI,IAAI,KAAK,EAAE,UAAU;IACzB,OAAO;KACN,UAAU,EAAE;KACZ,OAAO;KACP,QAAQ;KACR,SAAS;MACR,gBAAgB;MAChB,MAAM;KACP;IACD;GACD,OAAO,OAAO;IACb,UAAU,EAAE;IACZ,OAAO;IACP,QAAQ;GACT;EACD;CACD,CAAC,GAAG,IAAI,EAAE,QAAQ,GAAG,MAAM,KAAK,EAAE,OAAO,CAAC;CAC1C,EAAE,mBAAmB,CAAC,GAAG,EAAE;EAC1B,OAAO,YAAY,IAAI,EAAA,CAAG,QAAQ,CAAC,GAAG,EAAE;EACxC,SAAS;GACR,UAAU;IACT,OAAO;IACP,OAAO;GACR;GACA,YAAY;EACb;CACD,CAAC;AACF,CAAC,GC9DG,IAAI;CACP,SAAS;EACR,MAAM;EACN,SAAS;EACT,QAAQ;CACT;CACA,WAAW;EACV,MAAM;EACN,SAAS;EACT,QAAQ;CACT;CACA,SAAS;EACR,MAAM;EACN,SAAS;EACT,QAAQ;CACT;CACA,YAAY;EACX,MAAM;EACN,SAAS;EACT,QAAQ;CACT;AACD;AAGA,SAAS,EAAE,GAAG;CACb,OAAO,MAAM,sBAAsB,YAAY;AAChD;AAGA,SAAS,EAAE,GAAG,IAAI,CAAC,GAAG;CACrB,OAAO,IAAI,SAAS,MAAM;EACzB,IAAI,IAAI;GACP,GAAG;GACH,GAAG;EACJ,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE;EAC7B,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC;CACvB,CAAC;AACF;AACA,SAAS,EAAE,GAAG,GAAG;CAChB,OAAO,IAAI,SAAS,MAAM;EACzB,IAAI,CAAC,KAAK,EAAE,SAAS,QAAQ;GAC5B,EAAE,KAAK,CAAC;GACR;EACD;EACA,EAAE,EAAE,EAAE,SAAS,CAAC;CACjB,CAAC;AACF;;;AC9CA,IAAI,IAAI,OAAO,gBAAgB,KAAK,GAAG,MAAM;CAC5C,IAAI,IAAI,CAAC;CACT,KAAK,IAAI,KAAK,GAAG,EAAE,GAAG,GAAG;EACxB,KAAK,EAAE;EACP,YAAY,CAAC;CACd,CAAC;CACD,OAAO,KAAK,EAAE,GAAG,OAAO,aAAa,EAAE,OAAO,SAAS,CAAC,GAAG;AAC5D;AAGA,SAAS,EAAE,GAAG;CACb,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,QAAQ,MAAM,KAAK,IAAI,IAAI,CAAC;AACzD;AACA,SAAS,EAAE,GAAG;CACb,IAAI,IAAI,CAAC,GAAG,CAAC;CACb,KAAK,IAAI,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,KAAK;EACtC,IAAI,IAAI,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,EAAE;EAC1C,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE;CAC3B;CACA,OAAO;AACR;AACA,SAAS,EAAE,GAAG;CACb,OAAO,KAAK,OAAO,CAAC,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,WAAW,IAAI,OAAO,KAAK,YAAY,OAAO,KAAK,CAAC,CAAC,CAAC,WAAW;AAC/G;AACA,eAAe,EAAE,GAAG,GAAG,GAAG,IAAI,SAAS;CACtC,IAAI,IAAI,EAAE,GAAG,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,CAAC;CAC5D,IAAI,CAAC,GAAG;EACP,QAAQ,KAAK,6DAA6D;EAC1E;CACD;CACA,IAAI,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC3D,IAAI,IAAI,EAAE,CAAC;CACX,IAAI,KAAK,OAAO,KAAK,YAAY,IAAI;EACpC,IAAI,IAAI,EAAE,EAAE,KAAK,MAAM,EAAE,EAAE,CAAC;EAC5B,EAAE,CAAC,IAAI,QAAQ,MAAM,uFAAuF,KAAK,UAAU,CAAC,EAAE,SAAS,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAClN,SAAS,GAAG;EACX,QAAQ,KAAK,2CAA2C,GAAG,QAAQ,MAAM,CAAC;CAC3E;MACK,QAAQ,KAAK,kEAAkE;CACpF,OAAO;AACR;AACA,SAAS,EAAE,GAAG,GAAG,GAAG;CACnB,OAAO,CAAC,EAAE,EAAE,mBAAmB,EAAE,eAAe,EAAE,oBAAoB,EAAE,QAAQ,eAAe;AAChG;AAGA,IAAI,IAAoB,kBAAE,EAAE,eAAe,EAAE,CAAC;AAC9C,SAAS,EAAE,GAAG,GAAG,GAAG;CACnB,OAAO,GAAG,mBAAmB,CAAC,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,OAAO,KAAK,aAAa;AAC7F;;;ACxCA,IAAA,IAAe;CACb,YAAY,CAAC;CACb,YAAY,CAAC;CACb,kBAAkB;CAClB,SAAS,CAAC;CACV,cAAc;CACd,iBAAiB;CACjB,iBAAiB,CAAC;CAClB,iBAAiB;CACjB,iBAAiB;CACjB,kBAAkB;CAClB,uBAAuB;CACvB,gBAAgB;CAChB,QAAQ;CACR,eAAe;CACf,WAAW;CACX,kBAAkB;CAClB,WAAW,CAAC,EAAE;CACd,4BAA4B;CAC5B,qBAAqB;CACrB,4BAA4B;CAC5B,uBAAuB;CACvB,cAAc;AAChB,GCtBa,IAAqB;CAAE,SAAS;CAAO,UAAU;CAAM,WAAW;AAAiB,GAGnF,KAA+B,GAAS,MAAc;CACjE,IAAI,EAAQ,SAAS,KAAK,EAAU,SAAS,GAC3C,OAAO;CAGT,IAAM,IAAgB,KAAK,UAAU,EAAQ,KAAK,CAAC;CAOnD,OANwB,EAAU,QAC/B,GAAO,MAAa,EAAQ,SAAS,IAAI,CAAC,GAAG,GAAO,KAAK,UAAU,EAAQ,KAAK,CAAC,CAAC,IAAI,GACvF,CAAC,CAEyB,CAAA,CAAgB,WAAW,MAAc,EAAU,UAAU,MAAc,CAEhG;AACT,GAEa,KAAyB,MAAc;CAClD,IAAI,EAAU,UAAU,GACtB,OAAO;CAGT,IAAM,oBAAa,IAAI,IAAI,GACrB,IAAkB,EAAU,QAC/B,GAAO,MAAa,EAAQ,SAAS,IAAI,CAAC,GAAG,GAAO,KAAK,UAAU,EAAQ,KAAK,CAAC,CAAC,IAAI,GACvF,CAAC,CACH;CAEA,KAAK,IAAI,IAAI,GAAG,IAAI,EAAgB,QAAQ,KAAK;EAC/C,IAAI,EAAW,IAAI,EAAgB,EAAE,KAAK,EAAgB,IACxD,OAAO;EAGT,EAAW,IAAI,EAAgB,EAAE;CACnC;CAEA,OAAO;AACT,GAIa,KAA8B,GAAiB,GAAY,MAAe;CACrF,IAAM,IAAqB,EAAgB,KAAK,MAAa,EAAS,OAAO,GACvE,IAAoB,CAAC,EAAmB,KAAK,CAAC,GAChD,IAA0B,EAAmB,QAAQ,MAAY,EAAQ,MAAM,CAAC,CAAC;CAErF,IAAI,EAAW,QAAQ;EACrB,IAAM,IAAsB,EAAW,EAAE,EAAE,UAAU;EAErD,CAAC,GAAG,MAAM,CAAmB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,MAAU;GACxD,IAAM,IAAwB,EAAW,KAAK,MAAc,EAAU,EAAM,GACtE,IAAmB,EAAsB,QAAQ,MAAa,GAAU,MAAM,CAAC,CAAC;GAGtF,AAFA,EAAkB,KAAK,EAAsB,KAAK,CAAC,GAE/C,IAAmB,MACrB,IAA0B;EAE9B,CAAC;CACH;CAGA,IAAM,IAAqB,EAAkB,MAC1C,MAAa,CAAC,EAAW,OAAO,MAAQ,EAAS,SAAS,GAAK,EAAE,CAAC,CACrE;CAEA,OAAO;EAAE;EAAyB;EAAmB;CAAmB;AAC1E,GC9DM,EAAE,kBAAe,GAQV,KAAmB,GAAiB,MAAoB;CAGnE,IAAM,EAAE,eAAY,aAAU,EAAgB,QAC3C,GAAK,EAAE,aAAU,CAAC,SAAS;EAC1B,YAAY,EAAI,aAAa,EAAQ;EACrC,OAAO,EAAI,QAAQ,EAAQ,QAAQ,MAAO,EAAG,OAAO,CAAC,CAAC;CACxD,IACA;EAAE,YAAY;EAAG,OAAO;CAAE,CAC5B,GAGM,EAAE,gBAAa,EAAgB,QAClC,GAAK,EAAE,kBAAe,EACrB,UAAU,EAAI,WAAW,EAAQ,OACnC,IACA,EAAE,UAAU,EAAE,CAChB,GAIM,KAAc,KADI,IAAa,IAAW,IAAa,IAAW,MACzB;CAE/C,OAAO,IAAa,IAAI,IAAI,WAAW,EAAW,QAAQ,CAAC,CAAC;AAC9D,GAEM,KAAiB,MACrB,EAAgB,KAAK,MAAM,EAAE,kBAAkB,CAAC,CAAC,QAAQ,MAAc,CAAS,GAErE,KAAiB,GAAU,GAAS,MAAQ;CAKvD,IAJI,CAAC,KAID,OAAO,KAAK,CAAO,CAAC,CAAC,WAAW,GAClC,OAAO;CAET,IAAM,EAAE,eAAY,eAAY,KAAY,CAAC,GACzC,EAAE,uBAAoB,KAAY,CAAC,GACnC,EAAE,eAAY,KAAW,CAAC;CAE9B,AADA,MAAqB,CAAC,GACtB,MAAqC,CAAC;CAItC,IAAM,EAAE,YAAY,GAAiB,eAAY,EAAW,GAAY,GAAS,GAAS,CAAe,GAEnG,IAAa,EAAc,CAAe;CAUhD,OATgB,EAAe,QAAQ,GAAU,CAG7C,KAAW,CAAC,EAAW,SAElB,EAAgB,GAAiB,CAAe,IAIlD;AACT,GAEa,KAAkB,GAAU,GAAS,MACzC,IAAI,SAAS,MAAY;CAC9B,IAAI,EAAI,SAAS,YAAY;EAC3B,IAAM,IAAQ,EAAc,GAAU,GAAS,CAAG;EAClD,AACE,EADE,MAAU,IACJ,YACC,MAAU,IACX,cAEA,mBAAmB;CAE/B,OACE,EAAQ,KAAA,CAAS;AAErB,CAAC,GAGU,KAAsB,IAAQ,CAAC,MAC1C,IAAI,SAAS,MAAY;CACvB,EAAQ;EACN,GAAG;EACH,GAAG;CACL,CAAC;AACH,CAAC,GAEU,KAAa,OAAc;CAAE,GAAG;CAAU,GAAG;AAAS,IAStD,IAAQ,OAAO,GAAU,GAAS,GAAK,MAAkB;CACpE,IAAM,IAAqB,EAAU,CAAQ,GACvC,IAAoB,MAAM,EAAe,GAAoB,GAAS,CAAG,GAEzE,EAAE,SAAM,YAAS,KAAO,CAAC,GAEzB,EACJ,eACA,qBACA,iBACA,oBACA,oBACA,aACA,oBACA,kBACA,WACA,cACA,qBACA,cACA,+BACA,wBACA,aACA,0BACA,kBACA,iBACA,mBACA,yBACA,yBACA,yBACE,GACA,EAAE,YAAS,YAAS,GACpB,GAEE,IAAkB,EAAY,GAAoB,GAAS,CAAG,GAE9D,IAA0B,EAAgB,KAAK,MAAa;EAChE,IAAM,KAAmB,EAAS,WAAW,CAAC,EAAA,CAAG,QAAQ,MAAW,MAAW,MAAM;EACrF,OAAO;GAAE,GAAG;GAAU,SAAS;EAAgB;CACjD,CAAC;CAMD,AAJI,MAAS,cAAc,MACzB,IAAK,MAAM,EAA0B,GAAmB,CAAQ,IAG7D,MACH,IAAU,MAAM,EAAmB,GAAS,GAAS,GAAe,IAAI;CAG1E,IAAM,WAA+B;EACnC,IAAI,EAAS,kCAAkC,MAC7C,OAAO,EAAS;EAGlB,IAAM,KAAgB,KAAmB,CAAC,EAAA,CAAG,SAAS,MAAO,EAAG,WAAW,CAAC,CAAC;EAE7E,OADoB,EAAa,WAAW,IAAI,IAAI,CAAY,CAAC,CAAC,OAC7C,EAAmB,WAAW,EAAmB;CACxE,EAAA,CAAG;CAeH,AAbA,KAAW,KAAW,CAAC,EAAA,CAAG,KAAK,MAAM;EACnC,IAAI;EASJ,OARA,AAME,IANE,MAA0B,EAAmB,UAC/B,IACP,MAA0B,EAAmB,WACtC,IAGA,EAAE,iBAAiB,GAE9B;GAAE,GAAG;GAAG;EAAc;CAC/B,CAAC,GAED,AACE,MAAO,EAAW,EAAE,4CAA4C,EAAE,KAAK,EAAS,CAAC;CAGnF,IAAM,IAAa,EAAc,CAAuB,GAClD,EAAE,4BAAyB,sBAAmB,0BAAuB,EACzE,GACA,EAAmB,wBAAwB,IAAa,CAAC,GACzD,EAAmB,OACrB,GACM,IAAM;EACV,YAAY,KAAc,CAAC;EAC3B,kBAAkB,KAAoB;EACtC;EACA,aAAa;EACb,SAAS,KAAW,CAAC;EACrB,cAAc,KAAgB;EAC9B;EACA,UAAU,MAAS;EACnB,UAAU;EACV;EACA,QAAQ,IAAgB,IAAS;EACjC;EACA;EACA;EACA,UAAU,KAAc,EAAW,SAAS;EAC5C,iBAAiB,MAAS,aAAa,IAA0B,KAAA;EACjE;EACA;EACA;EACc;EACd;EACA;EACA;EACA;EACA;EACA;EACA,GAAI,EAAS,kCAAkC,QAAQ,EAAE,gCAAgC,EAAsB;CACjH;CAUA,OARI,MAAS,iBAAiB,MAAS,UAAU,MAAS,eACxD,EAAI,YAAY,IAAmB,IAAY,MAC/C,EAAI,sBAAsB,IAA6B,IAAsB,SAE7E,EAAI,YAAY,MAChB,EAAI,sBAAsB,OAGrB;AACT,GASa,KAAe,GAAO,GAAS,MAAQ;CAClD,IAAM,IAAW,CAAC,GACZ,EAAE,eAAY,KAAW,CAAC,GAC1B,EAAE,eAAY,YAAS,uBAAoB,KAAS,CAAC,GAErD,IAAiB,EAAQ,QAC5B,GAAK,MAAM,KAAO,EAAE,SAAS,UAAU,IACxC,CACF,GAGM,IADa,EAAc,CACX,CAAA,CAAW,SAAS,GACpC,IAAwB,EAAe,QAAQ,GAAO,CAAG,GAOzD,KAJJ,IAAiB,IACb,EAAW,GAAY,GAAS,GAAS,CAAe,IACxD,KAAA,EAE8B,cAAc,CAAC;CAqCnD,IAnCI,IAAiB,KACnB,EAAS,KAAK,kBAAkB,EAAe,4BAA4B,IAE1E,KAAc,CAAC,EAAA,CAAG,SAAS,MAAa;EACvC,IAAM,IAAa,EAAS,IACtB,IAAgB,EAAgB,MAAK,MAAK,EAAE,OAAO,CAAU,GAC7D,IAAiB,KAAgB,EAAc,WAAgB,CAAC,GAChE,KAA8B,KAAmB,CAAC,EAAA,CAAG,MAAK,MAAM,EAAG,aAAa,CAAU,GAC1F,IAAkB,KAA6B,EAA2B,WAAgB,CAAC;EAEjG,IAAI,EAAgB,SAAS,GAC3B,IAAI,EAAe,WAAW,GAC5B,EAAS,KAAK,YAAY,EAAW,uCAAuC,EAAgB,OAAO,aAAa;OAC3G;GACL,IAAM,IAAe,EAAe,QAAO,MAAU,EAAO,OAAO,CAAC,CAAC,QAC/D,IAAiB,EAAe,SAAS;GAE/C,AAAI,IAAe,KAAK,MAAmB,IACzC,EAAS,KAAK,YAAY,EAAW,mBAAmB,EAAa,oBAAoB,IAChF,MAAiB,KAAK,IAAiB,IAChD,EAAS,KAAK,YAAY,EAAW,mBAAmB,EAAe,sBAAsB,IAE7F,EAAS,KAAK,YAAY,EAAW,mBAAmB,EAAa,eAAe,EAAe,sBAAsB;EAE7H;CAEJ,CAAC,KAED,EAAS,KAAK,oDAAoD,GAGhE,KACF,EAAS,KAAK,iEAAiE,GAG7E,GAEF,AADA,EAAS,KAAK,8FAA8F,GAC5G,EAAS,KAAK,4EAA4E;MACrF,IAAI,GAIT;MAHA,EAAS,KAAK,yCAAyC,GACvD,EAAS,KAAK,sHAAsH,GAEhI,IAAiB,GAAG;GACtB,IAAM,IAAe,EAAgB,QAAQ,GAAK,MAChD,KAAO,EAAI,WAAW,CAAC,EAAA,CAAG,QAAO,MAAU,EAAO,OAAO,CAAC,CAAC,QAAQ,CAAC,GAChE,IAAiB,IAAiB,GAClC,KAAe,KAAmB,CAAC,EAAA,CAAG,QAAQ,GAAK,MACvD,KAAO,EAAI,WAAW,CAAC,EAAA,CAAG,QAAQ,CAAC;GAIrC,IAFA,EAAS,KAAK,gCAAgC,EAAa,uBAAuB,EAAe,uBAAuB,GAEpH,IAAiB,GAAa;IAChC,IAAM,IAAkB,IAAiB;IACzC,EAAS,KAAK,GAAG,EAAgB,wEAAwE;GAC3G;EACF;QAGA,AADA,EAAS,KAAK,gDAAgD,GAC9D,EAAS,KAAK,4EAA4E;CAG5F,IAAM,IAAQ,EAAc,GAAO,GAAS,CAAG;CAG/C,OAFA,EAAS,KAAK,gBAAgB,EAAM,EAAE,GAE/B;AACT,GAEa,KAAW,GAAU,GAAS,MACrC,EAAI,SAAS,aAGR,IAAI,SAAS,MAAY;CAE9B,IAAI,CAAC,KAAW,EAAQ,CAAO,KAAK,CAAC,EAAQ,SAC3C,EAAQ;EACN,OAAO;EACP,OAAO;EACP,UAAU,CAAC,gEAAgE;CAC7E,CAAC;MACI;EACL,IAAM,IAAW,EAAY,GAAU,GAAS,CAAG;EAGnD,EAAQ;GACN,OAHY,EAAc,GAAU,GAAS,CAG7C;GACA,OAAO;GACP;EACF,CAAC;CACH;AACF,CAAC,IApBM,QAAQ,OAAO,gBAAI,MAAM,gDAAgD,CAAC,GAwBxE,KAAgC,GAAU,MAC9C,IAAI,SAAS,MAAY;CAC9B,IAAM,EAAE,SAAM,YAAS,KAAO,CAAC;CAE/B,IAAI,MAAS,cAAc,MAAS,cAAc;EAChD,IAAM,EAAE,uBAAoB;EAE5B,EAAQ;GAAE,SAAS;GAAiB,IAAI;EAAE,CAAC;CAC7C,OACE,OAAO,EAAQ,IAAI;AAEvB,CAAC,GAIG,KAAgB,OAAU,KAAQ,GAAA,CAAI,WAAW,YAAY,EAAE,GAG/D,KAAc,OAAU,KAAQ,GAAA,CAAI,QAAQ,sCAAsC,EAAE,GAE7E,KAAY,IAAQ,CAAC,GAAG,IAAS,CAAC,MAAM;CACnD,IAAM,EAAE,eAAY,YAAS,oBAAiB,wBAAqB,GAC7D,EACJ,gBAAa,GACb,mBAAgB,GAChB,mBAAgB,IAChB,wBAAqB,KACrB,0BAAuB,QACrB,GACE,IAAkB,CAAC,GAAI,KAAW,CAAC,CAAE,CAAC,CAAC,QAAQ,GAC/C,IAAS,CAAC,GACV,IAAgB,CAAC,GACjB,IAAmB,CAAC;CAgB1B,AAdA;EAAC;EAAuB;EAAU;CAAW,CAAC,CAAC,SAAS,MAAU;EAChE,AAAI,EAAO,EAAM,EAAE,YAAY,CAAC,EAAW,EAAM,EAAM,MACrD,EAAO,KAAS;CAEpB,CAAC,IAEA,KAAc,CAAC,EAAA,CAAG,SAAS,MAAa;EACvC,IAAM,EAAE,OAAI,aAAU;EAEtB,AAAI,EAAa,CAAK,CAAC,CAAC,SAAS,MAC/B,EAAiB,KAAM,0CAA0C,EAAqB;CAE1F,CAAC,IAEA,KAAmB,CAAC,EAAA,CAAG,SAAS,GAAQ,MAAU;EACjD,IAAM,EAAE,OAAI,eAAY;EAMxB,AAJI,EAAa,CAAO,CAAC,CAAC,SAAS,MACjC,EAAc,KAAM,iCAAiC,EAAmB,qBAGrE,EAAW,CAAO,IAGG,EAAgB,MAAM,IAAQ,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,YAAY,CAE/E,MACF,EAAc,KAAM,sCALtB,EAAc,KAAM;CAQxB,CAAC;CAED,IAAM,KAAkB,KAAc,CAAC,EAAA,CAAG,QACpC,KAAe,KAAW,CAAC,EAAA,CAAG;CAcpC,IAZI,IAAiB,IACnB,EAAO,kBAAkB,gBAAgB,EAAc,kCAC9C,IAAiB,MAC1B,EAAO,kBAAkB,4BAA4B,EAAc,sBAGjE,IAAc,IAChB,EAAO,eAAe,4BAA4B,EAAW,qBACpD,IAAc,MACvB,EAAO,eAAe,gBAAgB,EAAiB,+BAGrD,KAAe,GAAgB;EACjC,IAAI,IAAkB;EAEtB,CAAC,KAAmB,CAAC,EAAA,CAAG,SAAS,MAAa;GAC5C,IAAM,EAAE,aAAU,CAAC,GAAG,wBAAqB,CAAC,MAAM;GAElD,AAAI,EAAQ,SACV,IAAkB,KAElB,EAAmB,SAAS,MAAc;IACxC,CAAK,KAAa,CAAC,EAAA,CAAG,WACpB,IAAkB;GAEtB,CAAC;EAEL,CAAC;EAED,IAAI,IAA0B,IAC1B,IAAoB;EAmBxB,CAlBC,KAAmB,CAAC,EAAA,CAAG,SAAS,MAAa;GAC5C,IAAM,EAAE,aAAU,CAAC,GAAG,wBAAqB,CAAC,GAAG,gBAAa;GAE5D,AAAI,MAA4B,OAC9B,IAA0B,EAA4B,GAAS,CAAkB,GAE7E,MAA4B,OAC9B,IAA0B,EAAsB,CAAkB,IAGpE,IAAoB;EAExB,CAAC,GAEG,IAA0B,OAC5B,EAAO,qBAAqB;GAAE,OAAO;GAAyB,UAAU;EAAkB,IAGvF,MACH,EAAO,mBAAmB;CAE9B;CAUA,OARK,EAAQ,CAAa,MACxB,EAAO,gBAAgB,IAGpB,EAAQ,CAAgB,MAC3B,EAAO,mBAAmB,IAGrB;AACT"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../../lib-react/categorize/dist/scoring.js","../../../../../shared/feedback/dist/index.js","../../../../../shared/controller-utils/dist/index.js","../../../src/controller/defaults.ts","../../../src/controller/utils.ts","../../../src/controller/index.ts"],"sourcesContent":["import e from \"debug\";\n//#region src/scoring.ts\nvar t = e(\"@pie-lib:categorize:scoring\"), n = (e) => !e || !e.weighting ? [] : e.weighting.enabled && e.weighting && e.weighting.rules || [], r = (e, n) => {\n\tif (t(\"partial? \", e), !(!e || !e.enabled)) {\n\t\tlet t = e.rules.find((e) => e.category === n);\n\t\treturn t && t.rules || [];\n\t}\n}, i = (e, i) => new Promise((a) => {\n\tt(\"categories: \", e, \"scoring: \", i);\n\tlet o = n(i), s = e.map((e) => ({\n\t\t...o.find((t) => t.category === e.id) || { points: 1 },\n\t\tcategory: e.id\n\t}));\n\tt(\"weights: \", s);\n\tlet c = e.reduce((e, t) => {\n\t\tlet n = s.find((e) => e.category === t.id);\n\t\treturn e += n.points;\n\t}, 0);\n\tt(\"total: \", c);\n\tlet l = e.map((e) => {\n\t\tlet n = s.find((t) => t.category === e.id).points;\n\t\tif (t(\"category: \", e), e.correct === !0) return {\n\t\t\tcategory: e.id,\n\t\t\tscore: n,\n\t\t\tpoints: n\n\t\t};\n\t\t{\n\t\t\tlet a = r(i.partial, e.id);\n\t\t\tif (t(\"partial rules for category: \", a), a) {\n\t\t\t\tlet r = (e.choices || []).filter((e) => e.correct).length;\n\t\t\t\tt(\"correctCount: \", r);\n\t\t\t\tlet i = a.find((e) => e.count === r);\n\t\t\t\tt(\"rule: \", i), i ||= {\n\t\t\t\t\tpercent: 0,\n\t\t\t\t\tcount: r\n\t\t\t\t};\n\t\t\t\tlet o = n * (i.percent / 100);\n\t\t\t\treturn {\n\t\t\t\t\tcategory: e.id,\n\t\t\t\t\tscore: o,\n\t\t\t\t\tpoints: n,\n\t\t\t\t\tpartial: {\n\t\t\t\t\t\tcorrectChoices: r,\n\t\t\t\t\t\trule: i\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t} else return {\n\t\t\t\tcategory: e.id,\n\t\t\t\tscore: 0,\n\t\t\t\tpoints: n\n\t\t\t};\n\t\t}\n\t}), u = l.reduce((e, t) => e += t.score, 0);\n\tt(\"weightedScore: \", u), a({\n\t\tscore: parseFloat((u / c).toFixed(2), 10),\n\t\tdetails: {\n\t\t\tweighted: {\n\t\t\t\ttotal: c,\n\t\t\t\tscore: u\n\t\t\t},\n\t\t\tcategories: l\n\t\t}\n\t});\n});\n//#endregion\nexport { i as score };\n","//#region src/defaults.ts\nvar e = {\n\tcorrect: {\n\t\ttype: \"default\",\n\t\tdefault: \"Correct\",\n\t\tcustom: \"Correct\"\n\t},\n\tincorrect: {\n\t\ttype: \"default\",\n\t\tdefault: \"Incorrect\",\n\t\tcustom: \"Incorrect\"\n\t},\n\tpartial: {\n\t\ttype: \"default\",\n\t\tdefault: \"Nearly\",\n\t\tcustom: \"Nearly\"\n\t},\n\tunanswered: {\n\t\ttype: \"default\",\n\t\tdefault: \"You have not entered a response\",\n\t\tcustom: \"You have not entered a response\"\n\t}\n};\n//#endregion\n//#region src/utils.ts\nfunction t(e) {\n\treturn e === \"partially-correct\" ? \"partial\" : e;\n}\n//#endregion\n//#region src/index.ts\nfunction n(n, i = {}) {\n\treturn new Promise((a) => {\n\t\tlet o = {\n\t\t\t...e,\n\t\t\t...i\n\t\t}, s = t(n), c = o[s], l = e[s];\n\t\tr(c, l[c.type]).then(a);\n\t});\n}\nfunction r(e, t) {\n\treturn new Promise((n) => {\n\t\tif (!e || e.type === \"none\") {\n\t\t\tn(void 0);\n\t\t\treturn;\n\t\t}\n\t\tn(e[e.type] || t);\n\t});\n}\nfunction i(n, r = {}) {\n\tlet i = {\n\t\t...e,\n\t\t...r\n\t}, o = t(n), s = i[o], c = e[o];\n\treturn a(s, c[s.type]);\n}\nfunction a(e, t) {\n\tif (!(!e || e.type === \"none\")) return e[e.type] || t;\n}\n//#endregion\nexport { e as defaultFeedback, a as getActualFeedback, i as getActualFeedbackForCorrectness, r as getFeedback, n as getFeedbackForCorrectness, t as normalizeCorrectness };\n","//#region \\0rolldown/runtime.js\nvar e = Object.defineProperty, t = (t, n) => {\n\tlet r = {};\n\tfor (var i in t) e(r, i, {\n\t\tget: t[i],\n\t\tenumerable: !0\n\t});\n\treturn n || e(r, Symbol.toStringTag, { value: \"Module\" }), r;\n};\n//#endregion\n//#region src/persistence.ts\nfunction n(e) {\n\treturn Array.isArray(e) ? e.filter((e) => e != null) : [];\n}\nfunction r(e) {\n\tlet t = [...e];\n\tfor (let e = t.length - 1; e > 0; e--) {\n\t\tlet n = Math.floor(Math.random() * (e + 1));\n\t\t[t[e], t[n]] = [t[n], t[e]];\n\t}\n\treturn t;\n}\nfunction i(e) {\n\treturn e == null ? !0 : Array.isArray(e) ? e.length === 0 : typeof e == \"object\" && Object.keys(e).length === 0;\n}\nasync function a(e, t, a, o = \"value\") {\n\tlet s = n(t?.data?.shuffledValues ?? t?.shuffledValues ?? []);\n\tif (!t) {\n\t\tconsole.warn(\"Unable to save shuffled choices because there's no session.\");\n\t\treturn;\n\t}\n\tif (!i(s)) return n(s.map((t) => e.find((e) => e[o] === t)));\n\tlet c = r(e);\n\tif (a && typeof a == \"function\") try {\n\t\tlet e = n(c.map((e) => e[o]));\n\t\ti(e) ? console.error(`shuffledValues is an empty array - refusing to call updateSession. shuffledChoices: ${JSON.stringify(c)}, key: ${o}`) : await a(t.id, t.element, { shuffledValues: e });\n\t} catch (e) {\n\t\tconsole.warn(\"Unable to save shuffled order for choices\"), console.error(e);\n\t}\n\telse console.warn(\"Unable to save shuffled choices, shuffle will happen every time.\");\n\treturn c;\n}\nfunction o(e, t, n) {\n\treturn !!(e.lockChoiceOrder || n?.[\"@pie-element\"]?.lockChoiceOrder);\n}\n//#endregion\n//#region src/partial-scoring.ts\nvar s = /* @__PURE__ */ t({ enabled: () => c });\nfunction c(e, t, n) {\n\treturn e?.partialScoring === !1 || t?.partialScoring === !1 ? !1 : typeof n != \"boolean\" || n;\n}\n//#endregion\nexport { a as getShuffledChoices, o as lockChoices, s as partialScoring };\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/categorize/controller/src/defaults.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\nexport default {\n alternates: [],\n categories: [],\n categoriesPerRow: 2,\n choices: [],\n choicesLabel: '',\n choicesPosition: 'below',\n correctResponse: [],\n feedbackEnabled: false,\n lockChoiceOrder: true,\n maxAnswerChoices: 6,\n maxChoicesPerCategory: 0,\n partialScoring: true,\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n rowLabels: [''],\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n minRowHeight: '80px',\n};\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/categorize/controller/src/utils.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\n// used in configure too, for consistency modify it there too\nexport const multiplePlacements = { enabled: 'Yes', disabled: 'No', perChoice: 'Set Per Choice' };\n\n// used to validate the config\nexport const isCorrectResponseDuplicated = (choices, alternate) => {\n if (choices.length < 1 || alternate.length < 1) {\n return -1;\n }\n\n const stringChoices = JSON.stringify(choices.sort());\n const stringAlternate = alternate.reduce(\n (total, current) => (current.length > 0 ? [...total, JSON.stringify(current.sort())] : total),\n [],\n );\n const foundIndexDuplicate = stringAlternate.findIndex((alternate) => alternate.length && alternate === stringChoices);\n\n return foundIndexDuplicate;\n};\n\nexport const isAlternateDuplicated = (alternate) => {\n if (alternate.length <= 1) {\n return -1;\n }\n\n const elementSet = new Set();\n const stringAlternate = alternate.reduce(\n (total, current) => (current.length > 0 ? [...total, JSON.stringify(current.sort())] : total),\n [],\n );\n\n for (let i = 0; i < stringAlternate.length; i++) {\n if (elementSet.has(stringAlternate[i]) && stringAlternate[i]) {\n return i;\n }\n\n elementSet.add(stringAlternate[i]);\n }\n\n return -1;\n};\n\n// calculate the minimum number of populated response areas (categories) in the correct answer or alternates\n// and create an array with the possible responses ids\nexport const getCompleteResponseDetails = (correctResponse, alternates, allChoices) => {\n const choicesPerCategory = correctResponse.map((category) => category.choices);\n const possibleResponses = [choicesPerCategory.flat()];\n let responseAreasToBeFilled = choicesPerCategory.filter((choices) => choices.length).length;\n\n if (alternates.length) {\n const alternatesPerChoice = alternates[0]?.length || 0; // number of alternates\n\n [...Array(alternatesPerChoice).keys()].forEach((index) => {\n const alternatesPerResponse = alternates.map((alternate) => alternate[index]);\n const filledCategories = alternatesPerResponse.filter((category) => category?.length).length;\n possibleResponses.push(alternatesPerResponse.flat());\n\n if (filledCategories < responseAreasToBeFilled) {\n responseAreasToBeFilled = filledCategories;\n }\n });\n }\n\n // check if any correct answer have any unplaced answer choices\n const hasUnplacedChoices = possibleResponses.some(\n (response) => !allChoices.every((val) => response.includes(val?.id)),\n );\n\n return { responseAreasToBeFilled, possibleResponses, hasUnplacedChoices };\n};\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/categorize/controller/src/index.js\n * @auto-generated\n *\n * This file is automatically synced from pie-elements and converted to TypeScript.\n * Manual edits will be overwritten on next sync.\n * To make changes, edit the upstream JavaScript file and run sync again.\n */\n\nimport { isEmpty } from '@pie-element/shared-lodash';\nimport { buildState, score } from '@pie-lib/categorize';\nimport { getFeedbackForCorrectness } from '@pie-element/shared-feedback';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-element/shared-controller-utils';\nimport Translator from '@pie-lib/translator';\n\nconst { translator } = Translator;\nimport defaults from './defaults.js';\nimport { getCompleteResponseDetails, isAlternateDuplicated, isCorrectResponseDuplicated, multiplePlacements } from './utils.js';\n\n// eslint-disable-next-line no-console\n\nexport { score };\n\nexport const getPartialScore = (correctResponse, builtCategories) => {\n // in the resulted best scenario we make a sum with all the correct responses\n // and all the placements\n const { placements, score } = builtCategories.reduce(\n (acc, { choices = [] }) => ({\n placements: acc.placements + choices.length,\n score: acc.score + choices.filter((ch) => ch.correct).length,\n }),\n { placements: 0, score: 0 },\n );\n\n // in the correct response, we make a sum of the max possible score\n const { maxScore } = correctResponse.reduce(\n (acc, { choices }) => ({\n maxScore: acc.maxScore + choices.length,\n }),\n { maxScore: 0 },\n );\n\n // if there are any extra placements, we subtract from the obtained score\n const extraPlacements = placements > maxScore ? placements - maxScore : 0;\n const totalScore = (score - extraPlacements) / maxScore;\n\n return totalScore < 0 ? 0 : parseFloat(totalScore.toFixed(2));\n};\n\nconst getAlternates = (correctResponse) =>\n correctResponse.map((c) => c.alternateResponses).filter((alternate) => alternate);\n\nexport const getTotalScore = (question, session, env) => {\n if (!session) {\n return 0;\n }\n\n if (Object.keys(session).length === 0) {\n return 0;\n }\n const { categories, choices } = question || {};\n let { correctResponse } = question || {};\n let { answers } = session || {};\n answers = answers || [];\n correctResponse = correctResponse || [];\n\n // this function is used in pie-ui/categorize as well, in order to get the best scenario\n // so we get the best scenario and calculate the score\n const { categories: builtCategories, correct } = buildState(categories, choices, answers, correctResponse);\n\n const alternates = getAlternates(correctResponse);\n const enabled = partialScoring.enabled(question, env);\n\n // if there are any alternates, there will be no partial scoring!\n if (enabled && !alternates.length) {\n // we apply partial scoring\n return getPartialScore(correctResponse, builtCategories);\n }\n\n // else we apply dichotomous\n return correct ? 1 : 0;\n};\n\nexport const getCorrectness = (question, session, env) => {\n return new Promise((resolve) => {\n if (env.mode === 'evaluate') {\n const score = getTotalScore(question, session, env);\n if (score === 1) {\n resolve('correct');\n } else if (score === 0) {\n resolve('incorrect');\n } else {\n resolve('partially-correct');\n }\n } else {\n resolve(undefined);\n }\n });\n};\n\nexport const createDefaultModel = (model = {}) =>\n new Promise((resolve) => {\n resolve({\n ...defaults,\n ...model,\n });\n });\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport const model = async (question, session, env, updateSession) => {\n const normalizedQuestion = normalize(question);\n const answerCorrectness = await getCorrectness(normalizedQuestion, session, env);\n\n const { mode, role } = env || {};\n\n const {\n categories,\n categoriesPerRow,\n choicesLabel,\n choicesPosition,\n correctResponse,\n feedback,\n feedbackEnabled,\n promptEnabled,\n prompt,\n rowLabels,\n rationaleEnabled,\n rationale,\n teacherInstructionsEnabled,\n teacherInstructions,\n language,\n maxChoicesPerCategory,\n extraCSSRules,\n minRowHeight,\n fontSizeFactor,\n autoplayAudioEnabled,\n completeAudioEnabled,\n customAudioButton,\n } = normalizedQuestion;\n let { choices, note } = normalizedQuestion;\n let fb;\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n const filteredCorrectResponse = correctResponse.map((response) => {\n const filteredChoices = (response.choices || []).filter((choice) => choice !== 'null');\n return { ...response, choices: filteredChoices };\n });\n\n if (mode === 'evaluate' && feedbackEnabled) {\n fb = await getFeedbackForCorrectness(answerCorrectness, feedback);\n }\n\n if (!lockChoiceOrder) {\n choices = await getShuffledChoices(choices, session, updateSession, 'id');\n }\n\n const resolvedAllowMultiple = (() => {\n if (question.allowMultiplePlacementsEnabled != null) {\n return question.allowMultiplePlacementsEnabled;\n }\n // Derive from correct response: if any choice id appears in more than one category, reuse is required\n const allChoiceIds = (correctResponse || []).flatMap((cr) => cr.choices || []);\n const isExclusive = allChoiceIds.length === new Set(allChoiceIds).size;\n return isExclusive ? multiplePlacements.disabled : multiplePlacements.enabled;\n })();\n\n choices = (choices || []).map((c) => {\n let categoryCount;\n if (resolvedAllowMultiple === multiplePlacements.enabled) {\n categoryCount = 0;\n } else if (resolvedAllowMultiple === multiplePlacements.disabled) {\n categoryCount = 1;\n } else {\n // perChoice — use the value set on each choice individually\n categoryCount = c.categoryCount || 0;\n }\n return { ...c, categoryCount };\n });\n\n if (!note) {\n note = translator.t('common:commonCorrectAnswerWithAlternates', { lng: language });\n }\n\n const alternates = getAlternates(filteredCorrectResponse);\n const { responseAreasToBeFilled, possibleResponses, hasUnplacedChoices } = getCompleteResponseDetails(\n filteredCorrectResponse,\n normalizedQuestion.allowAlternateEnabled ? alternates : [],\n normalizedQuestion.choices,\n );\n const out = {\n categories: categories || [],\n categoriesPerRow: categoriesPerRow || 2,\n maxChoicesPerCategory,\n correctness: answerCorrectness,\n choices: choices || [],\n choicesLabel: choicesLabel || '',\n choicesPosition,\n disabled: mode !== 'gather',\n feedback: fb,\n lockChoiceOrder,\n prompt: promptEnabled ? prompt : null,\n rowLabels,\n note,\n env,\n showNote: alternates && alternates.length > 0,\n correctResponse: mode === 'evaluate' ? filteredCorrectResponse : undefined,\n language,\n extraCSSRules,\n fontSizeFactor,\n minRowHeight: minRowHeight,\n autoplayAudioEnabled,\n completeAudioEnabled,\n customAudioButton,\n possibleResponses,\n responseAreasToBeFilled,\n hasUnplacedChoices,\n ...(question.allowMultiplePlacementsEnabled == null && { allowMultiplePlacementsEnabled: resolvedAllowMultiple }),\n };\n\n if (role === 'instructor' && (mode === 'view' || mode === 'evaluate')) {\n out.rationale = rationaleEnabled ? rationale : null;\n out.teacherInstructions = teacherInstructionsEnabled ? teacherInstructions : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n return out;\n};\n\n /**\n * Generates detailed trace log for scoring evaluation\n * @param {Object} model - the question model\n * @param {Object} session - the student session\n * @param {Object} env - the environment\n * @returns {Array} traceLog - array of trace messages\n */\nexport const getLogTrace = (model, session, env) => {\n const traceLog = [];\n const { answers } = session || {};\n const { categories, choices, correctResponse } = model || {};\n\n const draggedChoices = answers.reduce(\n (sum, a) => sum + (a.choices?.length || 0),\n 0\n );\n\n const alternates = getAlternates(correctResponse);\n const hasAlternates = alternates.length > 0;\n const partialScoringEnabled = partialScoring.enabled(model, env);\n\n const builtState =\n draggedChoices > 0\n ? buildState(categories, choices, answers, correctResponse)\n : null;\n\n const builtCategories = builtState?.categories || [];\n \n if (draggedChoices > 0) {\n traceLog.push(`Student placed ${draggedChoices} choice(s) into categories.`);\n \n (categories || []).forEach((category) => {\n const categoryId = category.id;\n const builtCategory = builtCategories.find(c => c.id === categoryId);\n const studentChoices = builtCategory ? builtCategory.choices || [] : [];\n const correctResponseForCategory = (correctResponse || []).find(cr => cr.category === categoryId);\n const expectedChoices = correctResponseForCategory ? correctResponseForCategory.choices || [] : [];\n \n if (expectedChoices.length > 0) {\n if (studentChoices.length === 0) {\n traceLog.push(`Category ${categoryId}: student left empty (should contain ${expectedChoices.length} choice(s)).`);\n } else {\n const correctCount = studentChoices.filter(choice => choice.correct).length;\n const incorrectCount = studentChoices.length - correctCount;\n \n if (correctCount > 0 && incorrectCount === 0) {\n traceLog.push(`Category ${categoryId}: student placed ${correctCount} correct choice(s).`);\n } else if (correctCount === 0 && incorrectCount > 0) {\n traceLog.push(`Category ${categoryId}: student placed ${incorrectCount} incorrect choice(s).`);\n } else {\n traceLog.push(`Category ${categoryId}: student placed ${correctCount} correct and ${incorrectCount} incorrect choice(s).`);\n }\n }\n }\n });\n } else {\n traceLog.push('Student did not place any choices into categories.');\n }\n\n if (hasAlternates) {\n traceLog.push('Alternate response combinations are accepted for this question.');\n }\n\n if (hasAlternates) {\n traceLog.push('Score calculated using all-or-nothing scoring (alternate responses disable partial scoring).');\n traceLog.push('Student must get all categories completely correct to receive full credit.');\n } else if (partialScoringEnabled) {\n traceLog.push('Score calculated using partial scoring.');\n traceLog.push('Student receives credit for each correct placement, with deductions for incorrect placements beyond required amount.');\n \n if (draggedChoices > 0) {\n const totalCorrect = builtCategories.reduce((sum, cat) => \n sum + (cat.choices || []).filter(choice => choice.correct).length, 0);\n const totalIncorrect = draggedChoices - totalCorrect;\n const maxPossible = (correctResponse || []).reduce((sum, cat) => \n sum + (cat.choices || []).length, 0);\n \n traceLog.push(`Partial scoring calculation: ${totalCorrect} correct placements, ${totalIncorrect} incorrect placements.`);\n \n if (draggedChoices > maxPossible) {\n const extraPlacements = draggedChoices - maxPossible;\n traceLog.push(`${extraPlacements} extra placement(s) beyond required amount will be deducted from score.`);\n }\n }\n } else {\n traceLog.push('Score calculated using all-or-nothing scoring.');\n traceLog.push('Student must get all categories completely correct to receive full credit.');\n }\n\n const score = getTotalScore(model, session, env);\n traceLog.push(`Final score: ${score}.`);\n\n return traceLog;\n}\n\nexport const outcome = (question, session, env) => {\n if (env.mode !== 'evaluate') {\n return Promise.reject(new Error('Can not call outcome when mode is not evaluate'));\n } else {\n return new Promise((resolve) => {\n // A player sends an untouched item's session as `{ id, element }`, without `answers`.\n if (!session || isEmpty(session) || !session.answers) {\n resolve({\n score: 0,\n empty: true,\n traceLog: ['Student did not place any choices into categories. Score is 0.'],\n });\n } else {\n const traceLog = getLogTrace(question, session, env);\n const score = getTotalScore(question, session, env);\n \n resolve({\n score,\n empty: false,\n traceLog,\n });\n }\n });\n }\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n const { mode, role } = env || {};\n\n if (mode !== 'evaluate' && role === 'instructor') {\n const { correctResponse } = question;\n\n resolve({ answers: correctResponse, id: 1 });\n } else {\n return resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { categories, choices, correctResponse, maxAnswerChoices } = model;\n const {\n minChoices = 1,\n minCategories = 1,\n maxCategories = 12,\n maxLengthPerChoice = 300,\n maxLengthPerCategory = 150,\n } = config;\n const reversedChoices = [...(choices || [])].reverse();\n const errors = {};\n const choicesErrors = {};\n const categoriesErrors = {};\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n (categories || []).forEach((category) => {\n const { id, label } = category;\n\n if (getInnerText(label).length > maxLengthPerCategory) {\n categoriesErrors[id] = `Category labels should be no more than ${maxLengthPerCategory} characters long.`;\n }\n });\n\n (reversedChoices || []).forEach((choice, index) => {\n const { id, content } = choice;\n\n if (getInnerText(content).length > maxLengthPerChoice) {\n choicesErrors[id] = `Tokens should be no more than ${maxLengthPerChoice} characters long.`;\n }\n\n if (!getContent(content)) {\n choicesErrors[id] = 'Tokens should not be empty.';\n } else {\n const identicalAnswer = reversedChoices.slice(index + 1).some((c) => c.content === content);\n\n if (identicalAnswer) {\n choicesErrors[id] = 'Tokens content should be unique.';\n }\n }\n });\n\n const nbOfCategories = (categories || []).length;\n const nbOfChoices = (choices || []).length;\n\n if (nbOfCategories > maxCategories) {\n errors.categoriesError = `No more than ${maxCategories} categories should be defined.`;\n } else if (nbOfCategories < minCategories) {\n errors.categoriesError = `There should be at least ${minCategories} category defined.`;\n }\n\n if (nbOfChoices < minChoices) {\n errors.choicesError = `There should be at least ${minChoices} choices defined.`;\n } else if (nbOfChoices > maxAnswerChoices) {\n errors.choicesError = `No more than ${maxAnswerChoices} choices should be defined.`;\n }\n\n if (nbOfChoices && nbOfCategories) {\n let hasAssociations = false;\n\n (correctResponse || []).forEach((response) => {\n const { choices = [], alternateResponses = [] } = response;\n\n if (choices.length) {\n hasAssociations = true;\n } else {\n alternateResponses.forEach((alternate) => {\n if ((alternate || []).length) {\n hasAssociations = true;\n }\n });\n }\n });\n\n let duplicateAlternateIndex = -1;\n let duplicateCategory = '';\n (correctResponse || []).forEach((response) => {\n const { choices = [], alternateResponses = [], category } = response;\n\n if (duplicateAlternateIndex === -1) {\n duplicateAlternateIndex = isCorrectResponseDuplicated(choices, alternateResponses);\n\n if (duplicateAlternateIndex === -1) {\n duplicateAlternateIndex = isAlternateDuplicated(alternateResponses);\n }\n\n duplicateCategory = category;\n }\n });\n\n if (duplicateAlternateIndex > -1) {\n errors.duplicateAlternate = { index: duplicateAlternateIndex, category: duplicateCategory };\n }\n\n if (!hasAssociations) {\n errors.associationError = 'At least one token should be assigned to at least one category.';\n }\n }\n\n if (!isEmpty(choicesErrors)) {\n errors.choicesErrors = choicesErrors;\n }\n\n if (!isEmpty(categoriesErrors)) {\n errors.categoriesErrors = categoriesErrors;\n }\n\n return errors;\n};\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { i as e } from "../rolldown-runtime-CWhphoD1.js";
2
- import { Bt as t, C as n, Dt as r, E as i, F as a, H as o, Ht as s, Mt as c, Nt as l, St as u, T as d, Tt as f, _ as p, bt as m, d as h, f as g, g as ee, gt as _, h as v, jt as y, l as b, m as x, p as S, s as te, t as ne, u as re, w as C, yt as ie, zt as ae } from "../alert-dialog-D7zUk8HM.js";
2
+ import { Bt as t, C as n, Dt as r, E as i, F as a, H as o, Mt as s, Nt as c, St as l, T as u, Tt as d, Ut as f, _ as p, bt as m, d as h, f as g, g as ee, gt as _, h as v, jt as y, l as b, m as x, p as S, s as te, t as ne, u as re, w as C, yt as ie, zt as ae } from "../alert-dialog-Cxmcc8UK.js";
3
3
  import { D as oe, E as w, l as T, r as E, t as se } from "../dist-Denz71xw.js";
4
4
  import * as D from "react";
5
5
  import O, { useRef as k, useState as ce } from "react";
@@ -77,7 +77,7 @@ de.propTypes = {
77
77
  fgFill: M.default.string.isRequired,
78
78
  borderFill: M.default.string.isRequired
79
79
  };
80
- var fe = u("div")(({ size: e }) => ({
80
+ var fe = l("div")(({ size: e }) => ({
81
81
  width: e || "25px",
82
82
  height: e || "25px"
83
83
  })), N = ({ open: e, size: t }) => /* @__PURE__ */ A(fe, {
@@ -134,7 +134,7 @@ function he(e, t, n) {
134
134
  var ge = (e) => {
135
135
  let { draggingNodeRect: t, transform: n, scrollableAncestorRects: r } = e, i = r[0];
136
136
  return !t || !i ? n : he(n, t, i);
137
- }, _e = "height ease-in 300ms, opacity ease-in 300ms", ve = u("div")(() => ({
137
+ }, _e = "height ease-in 300ms, opacity ease-in 300ms", ve = l("div")(() => ({
138
138
  position: "relative",
139
139
  height: 0,
140
140
  overflow: "hidden",
@@ -202,21 +202,21 @@ function F(e) {
202
202
  function be(e, t) {
203
203
  return !e || F(e) ? e : F(e.default) ? e.default : t && F(e[t]) ? e[t] : t && F(e[t]?.default) ? e[t].default : e;
204
204
  }
205
- var xe = be(d, "Readable") || be(Se.Readable, "Readable"), I = p, L = I.default, Se = L && typeof L == "object" ? L : I, { translator: R } = w, Ce = {
205
+ var xe = be(u, "Readable") || be(Se.Readable, "Readable"), I = p, L = I.default, Se = L && typeof L == "object" ? L : I, { translator: R } = w, Ce = {
206
206
  WebkitTouchCallout: "none",
207
207
  WebkitUserSelect: "none",
208
208
  KhtmlUserSelect: "none",
209
209
  MozUserSelect: "none",
210
210
  msUserSelect: "none",
211
211
  userSelect: "none"
212
- }, we = u("div")(() => ({
212
+ }, we = l("div")(() => ({
213
213
  width: "100%",
214
214
  cursor: "pointer"
215
- })), Te = u("div")(() => ({
215
+ })), Te = l("div")(() => ({
216
216
  margin: "0 auto",
217
217
  textAlign: "center",
218
218
  display: "flex"
219
- })), Ee = u("div")(() => ({
219
+ })), Ee = l("div")(() => ({
220
220
  width: "fit-content",
221
221
  minWidth: "140px",
222
222
  alignSelf: "center",
@@ -224,7 +224,7 @@ var xe = be(d, "Readable") || be(Se.Readable, "Readable"), I = p, L = I.default,
224
224
  color: `var(--correct-answer-toggle-label-color, ${t.text()})`,
225
225
  fontWeight: "normal",
226
226
  ...Ce
227
- })), z = u("div")(() => ({
227
+ })), z = l("div")(() => ({
228
228
  position: "absolute",
229
229
  width: "25px",
230
230
  "&.enter": { opacity: "0" },
@@ -237,7 +237,7 @@ var xe = be(d, "Readable") || be(Se.Readable, "Readable"), I = p, L = I.default,
237
237
  opacity: "0",
238
238
  transition: "opacity 0.3s ease-in"
239
239
  }
240
- })), De = u("div")(() => ({
240
+ })), De = l("div")(() => ({
241
241
  width: "25px",
242
242
  marginRight: "5px",
243
243
  display: "flex",
@@ -332,7 +332,7 @@ var xe = be(d, "Readable") || be(Se.Readable, "Readable"), I = p, L = I.default,
332
332
  //#endregion
333
333
  //#region ../../../node_modules/.bun/@mui+material@7.3.11+eb26afe407ed7030/node_modules/@mui/material/esm/CardContent/cardContentClasses.js
334
334
  function ke(e) {
335
- return c("MuiCardContent", e);
335
+ return s("MuiCardContent", e);
336
336
  }
337
337
  y("MuiCardContent", ["root"]);
338
338
  //#endregion
@@ -340,7 +340,7 @@ y("MuiCardContent", ["root"]);
340
340
  var Ae = (e) => {
341
341
  let { classes: t } = e;
342
342
  return r({ root: ["root"] }, ke, t);
343
- }, je = u("div", {
343
+ }, je = l("div", {
344
344
  name: "MuiCardContent",
345
345
  slot: "Root"
346
346
  })({
@@ -356,7 +356,7 @@ var Ae = (e) => {
356
356
  };
357
357
  return /*#__PURE__*/ A(je, {
358
358
  as: i,
359
- className: l(Ae(o).root, r),
359
+ className: c(Ae(o).root, r),
360
360
  ownerState: o,
361
361
  ref: t,
362
362
  ...a
@@ -368,7 +368,7 @@ var Ae = (e) => {
368
368
  var B = {
369
369
  content: M.default.string.isRequired,
370
370
  id: M.default.string
371
- }, Ne = u("div", { shouldForwardProp: (e) => ![
371
+ }, Ne = l("div", { shouldForwardProp: (e) => ![
372
372
  "isDragging",
373
373
  "disabled",
374
374
  "correct",
@@ -381,12 +381,12 @@ var B = {
381
381
  ...i && { border: `solid 2px ${t.buttonFocusOutline()}` },
382
382
  ...r === !0 && { border: `solid 2px ${t.correct()}` },
383
383
  ...r === !1 && { border: `solid 2px ${t.incorrect()}` }
384
- })), Pe = u(te, { shouldForwardProp: (e) => e !== "isSelected" })(({ isSelected: e }) => ({
384
+ })), Pe = l(te, { shouldForwardProp: (e) => e !== "isSelected" })(({ isSelected: e }) => ({
385
385
  color: t.text(),
386
386
  backgroundColor: t.background(),
387
387
  width: "100%",
388
388
  opacity: e ? .5 : 1
389
- })), Fe = u(Me)(({ theme: e }) => ({
389
+ })), Fe = l(Me)(({ theme: e }) => ({
390
390
  color: t.text(),
391
391
  backgroundColor: t.white(),
392
392
  "&:last-child": { paddingBottom: e.spacing(2) },
@@ -469,14 +469,14 @@ var H = b.withUid(V);
469
469
  //#region src/delivery/categorize/droppable-placeholder.tsx
470
470
  (0, P.default)("@pie-ui:categorize:droppable-placeholder");
471
471
  var U = ({ children: e, grid: n, disabled: r, choiceBoard: i, minRowHeight: a, id: o, correct: s, selectedItem: c, onPlacementClick: l }) => {
472
- let u = f(), [d, p] = ce(!1), { setNodeRef: m, isOver: g } = ee({
472
+ let u = d(), [f, p] = ce(!1), { setNodeRef: m, isOver: g } = ee({
473
473
  id: o,
474
474
  data: {
475
475
  itemType: "categorize",
476
476
  categoryId: o
477
477
  },
478
478
  disabled: r
479
- }), _ = !!c, v = g || _ && d && !r, y = !r, b = () => {
479
+ }), _ = !!c, v = g || _ && f && !r, y = !r, b = () => {
480
480
  r || !c || l?.(o);
481
481
  }, x = (e) => {
482
482
  e.target === e.currentTarget && (e.code === "Space" || e.code === "Enter") && (e.preventDefault(), b());
@@ -535,10 +535,10 @@ U.propTypes = {
535
535
  };
536
536
  //#endregion
537
537
  //#region src/delivery/categorize/choices.tsx
538
- var Le = u("div")({
538
+ var Le = l("div")({
539
539
  flex: 1,
540
540
  touchAction: "none"
541
- }), Re = u("div")(({ theme: e }) => ({
541
+ }), Re = l("div")(({ theme: e }) => ({
542
542
  margin: "0 auto",
543
543
  textAlign: "center",
544
544
  paddingTop: e.spacing(1)
@@ -607,7 +607,7 @@ var Le = u("div")({
607
607
  children: t
608
608
  });
609
609
  }
610
- }, Ve = u("div")(({ theme: e }) => ({
610
+ }, Ve = l("div")(({ theme: e }) => ({
611
611
  display: "grid",
612
612
  columnGap: e.spacing(1),
613
613
  gridColumnGap: e.spacing(1),
@@ -655,7 +655,7 @@ var Le = u("div")({
655
655
  })
656
656
  });
657
657
  }
658
- }, We = u("div")(({ theme: e }) => ({
658
+ }, We = l("div")(({ theme: e }) => ({
659
659
  display: "flex",
660
660
  flexDirection: "column",
661
661
  flex: 2
@@ -705,18 +705,18 @@ var Le = u("div")({
705
705
  })
706
706
  });
707
707
  }
708
- }, Ke = u("div")(({ theme: e }) => ({
708
+ }, Ke = l("div")(({ theme: e }) => ({
709
709
  color: t.text(),
710
710
  backgroundColor: t.background(),
711
711
  textAlign: "center",
712
712
  paddingTop: e.spacing(1)
713
- })), qe = u("div")({
713
+ })), qe = l("div")({
714
714
  alignItems: "center",
715
715
  display: "flex",
716
716
  justifyContent: "center",
717
717
  flex: .5,
718
718
  marginRight: "12px"
719
- }), Je = u("div")({
719
+ }), Je = l("div")({
720
720
  display: "flex",
721
721
  flex: "2",
722
722
  flexDirection: "column"
@@ -777,7 +777,7 @@ var Qe = G(a, "UiLayout") || G(Y.UiLayout, "UiLayout"), K = G(i, "PreviewPrompt"
777
777
  static propTypes = { children: M.default.node };
778
778
  containerRef = O.createRef();
779
779
  componentDidMount() {
780
- this.containerRef.current && s(this.containerRef.current);
780
+ this.containerRef.current && f(this.containerRef.current);
781
781
  }
782
782
  render() {
783
783
  return /* @__PURE__ */ A("div", {
@@ -1055,19 +1055,19 @@ var Qe = G(a, "UiLayout") || G(Y.UiLayout, "UiLayout"), K = G(i, "PreviewPrompt"
1055
1055
  })
1056
1056
  });
1057
1057
  }
1058
- }, ot = u(Qe)({
1058
+ }, ot = l(Qe)({
1059
1059
  color: t.text(),
1060
1060
  backgroundColor: t.background(),
1061
1061
  position: "relative"
1062
- }), st = u("div")(({ theme: e }) => ({ marginBottom: e.spacing(2) })), ct = u("div")(({ theme: e }) => ({
1062
+ }), st = l("div")(({ theme: e }) => ({ marginBottom: e.spacing(2) })), ct = l("div")(({ theme: e }) => ({
1063
1063
  marginBottom: e.spacing(1),
1064
1064
  maxWidth: "100%",
1065
1065
  overflowX: "auto",
1066
1066
  overflowY: "hidden"
1067
- })), lt = u("div")(() => ({
1067
+ })), lt = l("div")(() => ({
1068
1068
  display: "flex",
1069
1069
  minWidth: "min-content"
1070
- })), ut = u($e)(({ theme: e }) => ({ paddingBottom: e.spacing(2) }));
1070
+ })), ut = l($e)(({ theme: e }) => ({ paddingBottom: e.spacing(2) }));
1071
1071
  //#endregion
1072
1072
  //#region src/delivery/index.ts
1073
1073
  function Q(e) {
@@ -1082,7 +1082,7 @@ var ft = dt("data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMC
1082
1082
  }
1083
1083
  _scheduleMathRender = () => {
1084
1084
  this._mathRenderPending || (this._mathRenderPending = !0, requestAnimationFrame(() => {
1085
- this._mathObserver && !this._mathObserverPaused && this._mathObserver.disconnect(), s(this), this._mathRenderPending = !1, setTimeout(() => {
1085
+ this._mathObserver && !this._mathObserverPaused && this._mathObserver.disconnect(), f(this), this._mathRenderPending = !1, setTimeout(() => {
1086
1086
  this._mathObserver && !this._mathObserverPaused && this._mathObserver.observe(this, {
1087
1087
  childList: !0,
1088
1088
  subtree: !0,
@@ -1144,7 +1144,7 @@ var ft = dt("data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMC
1144
1144
  this._session.answers = e, this._session.selector = "Mouse", this.dispatchEvent(new me(this.tagName.toLowerCase(), this.isComplete())), this.render();
1145
1145
  }
1146
1146
  onShowCorrectToggle() {
1147
- s(this);
1147
+ f(this);
1148
1148
  }
1149
1149
  _createAudioInfoToast() {
1150
1150
  let e = document.createElement("div");