@pie-element/number-line 13.1.2-next.7 → 13.1.2-next.8

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.
@@ -1,7 +1,7 @@
1
- import { $r as e, Et as t, G as n, In as r, Kr as i, Q as a, a as o, bn as s, c, cn as l, d as u, f as d, ga as f, h as p, ha as m, i as h, ja as g, l as _, li as v, m as y, n as b, vr as x, yr as S, zn as C } from "../dist-DkCincUw.js";
2
- import { t as w } from "../impureFunctionsAny.generated-DlzbJQpQ.js";
1
+ import { Et as e, G as t, Jr as n, Ln as r, Pn as i, Q as a, Vr as o, a as s, c, ca as l, d as u, f as d, h as f, hr as p, i as m, l as h, la as g, m as _, mr as v, n as y, ni as b, on as x, vn as S, wa as C } from "../dist-clbS3pcd.js";
2
+ import { t as ee } from "../impureFunctionsAny.generated-DOBSXSdK.js";
3
3
  //#region ../../shared/feedback/dist/index.js
4
- var T = {
4
+ var w = {
5
5
  correct: {
6
6
  type: "default",
7
7
  default: "Correct",
@@ -23,15 +23,15 @@ var T = {
23
23
  custom: "You have not entered a response"
24
24
  }
25
25
  };
26
- function E(e) {
26
+ function T(e) {
27
27
  return e === "partially-correct" ? "partial" : e;
28
28
  }
29
- function ee(e, t = {}) {
29
+ function E(e, t = {}) {
30
30
  return new Promise((n) => {
31
31
  let r = {
32
- ...T,
32
+ ...w,
33
33
  ...t
34
- }, i = E(e), a = r[i], o = T[i];
34
+ }, i = T(e), a = r[i], o = w[i];
35
35
  te(a, o[a.type]).then(n);
36
36
  });
37
37
  }
@@ -116,7 +116,7 @@ var A = {
116
116
  .2,
117
117
  .25,
118
118
  .5
119
- ], ne = [
119
+ ], M = [
120
120
  "1/1000",
121
121
  "1/100",
122
122
  "1/64",
@@ -136,7 +136,7 @@ var A = {
136
136
  "1/4",
137
137
  "1/3",
138
138
  "1/2"
139
- ], M = {
139
+ ], N = {
140
140
  1: [
141
141
  1,
142
142
  2,
@@ -257,57 +257,57 @@ var A = {
257
257
  8,
258
258
  10
259
259
  ]
260
- }, re = (e, t, r) => {
261
- if (!s(i(n(e), n(r)), 0)) throw Error("start point must be divisible by interval");
262
- if (s(e, t)) return [];
263
- let o = g(t, i(t, n(r))), c = x(r, 0) ? "positive" : "negative";
264
- if (c === "negative" && S(t, e)) throw Error("start must be > than end when doing a negative decrement");
265
- if (c === "positive" && f(t, e)) throw Error("start must be < end when doing increments");
266
- let l = c === "positive" ? f : s(o, t) ? S : x, u = [], d = e;
267
- for (; l(d, o);) u.push(d), d = a(d, r);
268
- return u;
269
- }, ie = (e, t) => `Can only do a positive or negative range, but got: start: ${e} and end:${t}`, N = (t, r, o) => {
270
- if (t = C(t), r = C(r), o = C(o), x(n(g(r, t)), n(r))) throw Error(ie(t, r));
271
- let s = {
272
- start: n(t),
273
- end: n(r),
274
- interval: n(o),
275
- multiplier: m(o, 0) ? -1 : 1
276
- }, c = i(s.start, s.interval), l = re(x(c, 0) ? a(g(s.start, c), s.interval) : s.start, s.end, s.interval), u = s.multiplier === -1 ? l.map((t) => e(t, -1)) : l;
277
- return m(o, 0) && u.reverse(), u;
278
- }, ae = (e, t) => (e = C(e), t = C(t), m(e, t) ? e : t), oe = (e, t) => (e = C(e), t = C(t), x(e, t) ? e : t), se = (t, n, r) => {
279
- t = C(t), n = C(n), r = C(r);
280
- let i = x(n, 0) ? N(oe(0, t), n, r) : [];
281
- return d((m(t, 0) ? N(ae(0, n), t, e(r, -1)) : []).concat(i), s);
282
- }, P = (e, t, n) => {
260
+ }, ne = (e, n, r) => {
261
+ if (!S(o(t(e), t(r)), 0)) throw Error("start point must be divisible by interval");
262
+ if (S(e, n)) return [];
263
+ let i = C(n, o(n, t(r))), s = v(r, 0) ? "positive" : "negative";
264
+ if (s === "negative" && p(n, e)) throw Error("start must be > than end when doing a negative decrement");
265
+ if (s === "positive" && g(n, e)) throw Error("start must be < end when doing increments");
266
+ let c = s === "positive" ? g : S(i, n) ? p : v, l = [], u = e;
267
+ for (; c(u, i);) l.push(u), u = a(u, r);
268
+ return l;
269
+ }, re = (e, t) => `Can only do a positive or negative range, but got: start: ${e} and end:${t}`, P = (e, i, s) => {
270
+ if (e = r(e), i = r(i), s = r(s), v(t(C(i, e)), t(i))) throw Error(re(e, i));
271
+ let c = {
272
+ start: t(e),
273
+ end: t(i),
274
+ interval: t(s),
275
+ multiplier: l(s, 0) ? -1 : 1
276
+ }, u = o(c.start, c.interval), d = ne(v(u, 0) ? a(C(c.start, u), c.interval) : c.start, c.end, c.interval), f = c.multiplier === -1 ? d.map((e) => n(e, -1)) : d;
277
+ return l(s, 0) && f.reverse(), f;
278
+ }, ie = (e, t) => (e = r(e), t = r(t), l(e, t) ? e : t), ae = (e, t) => (e = r(e), t = r(t), v(e, t) ? e : t), oe = (e, t, i) => {
279
+ e = r(e), t = r(t), i = r(i);
280
+ let a = v(t, 0) ? P(ae(0, e), t, i) : [];
281
+ return d((l(e, 0) ? P(ie(0, t), e, n(i, -1)) : []).concat(a), S);
282
+ }, se = (e, t, n) => {
283
283
  n ||= 2;
284
284
  let r = 10 ** -n / 2;
285
285
  return Math.abs(e - t) < r;
286
- }, F = (e, t, n) => m(R(e), R(t)) ? t : x(R(e), R(n)) ? n : e, I = (t, n) => {
287
- let r = v(e(10, l(C(t.max - t.min), n)));
286
+ }, F = (e, t, n) => l(R(e), R(t)) ? t : v(R(e), R(n)) ? n : e, I = (e, t) => {
287
+ let i = b(n(10, x(r(e.max - e.min), t)));
288
288
  return {
289
- min: r,
290
- max: v(e(20, r))
289
+ min: i,
290
+ max: b(n(20, i))
291
291
  };
292
- }, L = (e, t) => s(i(e, t), 0), R = (e) => {
293
- if (h(e)) return C(e.n * e.s, e.d);
294
- if (_(e)) return C(e);
295
- }, z = (t, n, r, i) => {
296
- let a = !i || i.limit !== !1, o = I(t, n), s = a ? F(R(r.minor), o.min, o.max) : R(r.minor), c = a ? F(R(r.major), s, e(s, 20)) : R(r.major);
292
+ }, L = (e, t) => S(o(e, t), 0), R = (e) => {
293
+ if (m(e)) return r(e.n * e.s, e.d);
294
+ if (h(e)) return r(e);
295
+ }, z = (e, t, r, i) => {
296
+ let a = !i || i.limit !== !1, o = I(e, t), s = a ? F(R(r.minor), o.min, o.max) : R(r.minor), c = a ? F(R(r.major), s, n(s, 20)) : R(r.major);
297
297
  if (!L(c, s)) {
298
- let t = l(c, s);
298
+ let e = x(c, s);
299
299
  return {
300
300
  minor: s,
301
- major: e(s, t <= 2 ? 2 : Math.round(t))
301
+ major: n(s, e <= 2 ? 2 : Math.round(e))
302
302
  };
303
303
  }
304
304
  return {
305
305
  major: c,
306
306
  minor: s
307
307
  };
308
- }, B = (e, t, n, r) => (n = z(e, t, n, r), se(e.min, e.max, n.minor).filter((t) => f(t, C(e.max))).map((e) => {
308
+ }, B = (e, t, n, i) => (n = z(e, t, n, i), oe(e.min, e.max, n.minor).filter((t) => g(t, r(e.max))).map((e) => {
309
309
  let t = "minor";
310
- return P(v(i(e, n.major)), 0) && (t = "major"), {
310
+ return se(b(o(e, n.major)), 0) && (t = "major"), {
311
311
  x: e,
312
312
  type: t
313
313
  };
@@ -318,33 +318,33 @@ var A = {
318
318
  };
319
319
  return j.forEach((n) => {
320
320
  n >= e.min && n <= e.max && t.decimal.push(n);
321
- }), ne.forEach((n) => {
322
- let r = v(C(n));
323
- r >= e.min && r <= e.max && t.fraction.push(n);
321
+ }), M.forEach((n) => {
322
+ let i = b(r(n));
323
+ i >= e.min && i <= e.max && t.fraction.push(n);
324
324
  }), t;
325
- }, H = (t, n, r) => {
326
- let i = {
325
+ }, H = (e, t, i) => {
326
+ let a = {
327
327
  decimal: [],
328
328
  fraction: []
329
- }, a = C(v(v(t))), o = a.n, s = a.d;
330
- if (o >= 1 && s === 1) for (let a = 1; a <= 10; a++) {
331
- let s = v(e(o, a));
332
- U(n, r, {
333
- minor: t,
334
- major: s
335
- }, { fraction: void 0 }).filter((e) => e.type === "major").length > 1 && (i.fraction.push(s.toString()), i.decimal.push(s));
329
+ }, o = r(b(b(e))), s = Number(o.n), c = Number(o.d);
330
+ if (s >= 1 && c === 1) for (let r = 1; r <= 10; r++) {
331
+ let o = b(n(s, r));
332
+ U(t, i, {
333
+ minor: e,
334
+ major: o
335
+ }, { fraction: void 0 }).filter((e) => e.type === "major").length > 1 && (a.fraction.push(o.toString()), a.decimal.push(o));
336
336
  }
337
- else for (let a in M[s]) {
338
- let c = e(C(o, s), M[s][a]);
339
- U(n, r, {
340
- minor: t,
341
- major: v(c)
342
- }, { fraction: void 0 }).filter((e) => e.type === "major").length > 1 && (c.d === 1 ? i.fraction.push(c.n.toString()) : i.fraction.push(c.n + "/" + c.d), i.decimal.push(v(c)));
337
+ else for (let o in N[c]) {
338
+ let l = n(r(s, c), N[c][o]);
339
+ U(t, i, {
340
+ minor: e,
341
+ major: b(l)
342
+ }, { fraction: void 0 }).filter((e) => e.type === "major").length > 1 && (Number(l.d) === 1 ? a.fraction.push(Number(l.n).toString()) : a.fraction.push(Number(l.n) + "/" + Number(l.d)), a.decimal.push(b(l)));
343
343
  }
344
- return i;
344
+ return a;
345
345
  }, U = (e, t, n, r) => B(e, t, n, r).map((e) => r.fraction ? e : {
346
346
  ...e,
347
- x: v(e.x) || 0
347
+ x: b(e.x) || 0
348
348
  }), W = (e) => {
349
349
  let { domain: t, ticks: n, width: r } = e, i = H(n.minor, t, r);
350
350
  if (i.decimal.indexOf(n.major) === -1) {
@@ -355,57 +355,57 @@ var A = {
355
355
  ...e,
356
356
  ticks: n
357
357
  };
358
- }, G = (e) => {
359
- let { domain: n, ticks: i = {}, width: a } = e;
360
- i.tickIntervalType || (i.minor > .5 ? i.tickIntervalType = "Integer" : i.tickIntervalType = "Decimal");
361
- let o = I(n, a);
362
- if (o.min >= 1) i.tickIntervalType = "Integer", i.minor = i.minor < 1 ? v(t(o.min)) : i.minor >= v(t(o.min)) && i.minor <= v(r(o.max)) ? i.minor : v(t(o.min)), i.integerTick = i.minor, i.fractionTick = "0", i.decimalTick = 0;
363
- else if (o.min >= 0 && o.max < 1) {
364
- i.tickIntervalType === "Integer" && (i.tickIntervalType = "Fraction");
365
- let e = V(o), t = v(C(e.fraction[0])), n = v(C(e.fraction[e.fraction.length - 1]));
366
- if (i.minor < t || i.minor > n) switch (i.tickIntervalType) {
358
+ }, G = (t) => {
359
+ let { domain: n, ticks: a = {}, width: o } = t;
360
+ a.tickIntervalType || (a.minor > .5 ? a.tickIntervalType = "Integer" : a.tickIntervalType = "Decimal");
361
+ let s = I(n, o);
362
+ if (s.min >= 1) a.tickIntervalType = "Integer", a.minor = a.minor < 1 ? b(e(s.min)) : a.minor >= b(e(s.min)) && a.minor <= b(i(s.max)) ? a.minor : b(e(s.min)), a.integerTick = a.minor, a.fractionTick = "0", a.decimalTick = 0;
363
+ else if (s.min >= 0 && s.max < 1) {
364
+ a.tickIntervalType === "Integer" && (a.tickIntervalType = "Fraction");
365
+ let e = V(s), t = b(r(e.fraction[0])), n = b(r(e.fraction[e.fraction.length - 1]));
366
+ if (a.minor < t || a.minor > n) switch (a.tickIntervalType) {
367
367
  case "Fraction":
368
- i.minor = v(C(e.fraction[e.fraction.length - 1])), i.fractionTick = e.fraction[e.fraction.length - 1], i.decimalTick = e.decimal[0];
368
+ a.minor = b(r(e.fraction[e.fraction.length - 1])), a.fractionTick = e.fraction[e.fraction.length - 1], a.decimalTick = e.decimal[0];
369
369
  break;
370
370
  case "Decimal":
371
- case "Integer": i.minor = e.decimal[e.decimal.length - 1], i.decimalTick = e.decimal[e.decimal.length - 1], i.fractionTick = e.fraction[0];
371
+ case "Integer": a.minor = e.decimal[e.decimal.length - 1], a.decimalTick = e.decimal[e.decimal.length - 1], a.fractionTick = e.fraction[0];
372
372
  }
373
- else switch (i.tickIntervalType) {
373
+ else switch (a.tickIntervalType) {
374
374
  case "Fraction":
375
- let t = C(v(i.minor));
376
- i.fractionTick = t.n + "/" + t.d, i.decimalTick = i.decimalTick ? i.decimalTick : e.decimal[0];
375
+ let t = r(b(a.minor));
376
+ a.fractionTick = t.n + "/" + t.d, a.decimalTick = a.decimalTick ? a.decimalTick : e.decimal[0];
377
377
  break;
378
378
  case "Decimal":
379
- case "Integer": i.decimalTick = i.minor, i.fractionTick = i.fractionTick ? i.fractionTick : e.fraction[0];
379
+ case "Integer": a.decimalTick = a.minor, a.fractionTick = a.fractionTick ? a.fractionTick : e.fraction[0];
380
380
  }
381
- i.integerTick = 1;
382
- } else if (o.min < 1 && o.max >= 1) {
383
- let e = V(o);
384
- if (i.minor >= o.min && i.minor <= o.max) switch (i.tickIntervalType) {
381
+ a.integerTick = 1;
382
+ } else if (s.min < 1 && s.max >= 1) {
383
+ let t = V(s);
384
+ if (a.minor >= s.min && a.minor <= s.max) switch (a.tickIntervalType) {
385
385
  case "Integer":
386
- i.integerTick = i.minor, i.decimalTick = o.min > .5 ? 0 : e.decimal[0], i.fractionTick = o.min > .5 ? "0" : e.fraction[0];
386
+ a.integerTick = a.minor, a.decimalTick = s.min > .5 ? 0 : t.decimal[0], a.fractionTick = s.min > .5 ? "0" : t.fraction[0];
387
387
  break;
388
388
  case "Decimal":
389
- i.integerTick = 1, i.decimalTick = i.minor, i.fractionTick = e.fraction[0];
389
+ a.integerTick = 1, a.decimalTick = a.minor, a.fractionTick = t.fraction[0];
390
390
  break;
391
391
  case "Fraction":
392
- i.integerTick = 1, i.decimalTick = e.decimal[0];
393
- let t = C(v(i.minor));
394
- i.fractionTick = t.n + "/" + t.d;
392
+ a.integerTick = 1, a.decimalTick = t.decimal[0];
393
+ let e = r(b(a.minor));
394
+ a.fractionTick = e.n + "/" + e.d;
395
395
  }
396
- else switch (o.min > .5 && (i.tickIntervalType = "Integer"), i.tickIntervalType) {
396
+ else switch (s.min > .5 && (a.tickIntervalType = "Integer"), a.tickIntervalType) {
397
397
  case "Integer":
398
- i.minor = v(t(o.min)), i.integerTick = i.minor, i.decimalTick = o.min > .5 ? 0 : e.decimal[0], i.fractionTick = o.min > .5 ? "0" : e.fraction[0];
398
+ a.minor = b(e(s.min)), a.integerTick = a.minor, a.decimalTick = s.min > .5 ? 0 : t.decimal[0], a.fractionTick = s.min > .5 ? "0" : t.fraction[0];
399
399
  break;
400
400
  case "Decimal":
401
- i.minor = e.decimal[0], i.integerTick = 1, i.decimalTick = i.minor, i.fractionTick = e.fraction[0];
401
+ a.minor = t.decimal[0], a.integerTick = 1, a.decimalTick = a.minor, a.fractionTick = t.fraction[0];
402
402
  break;
403
- case "Fraction": i.minor = v(C(e.fraction[0])), i.integerTick = 1, i.decimalTick = e.decimal[0], i.fractionTick = e.fraction[0];
403
+ case "Fraction": a.minor = b(r(t.fraction[0])), a.integerTick = 1, a.decimalTick = t.decimal[0], a.fractionTick = t.fraction[0];
404
404
  }
405
405
  }
406
406
  return W({
407
- ...e,
408
- ticks: i
407
+ ...t,
408
+ ticks: a
409
409
  });
410
410
  }, K = (e) => ({ score: { scaled: e } }), ce = (e, t) => {
411
411
  let { correct: n } = e, r = t.find((e) => e.numberOfCorrect === n.length);
@@ -413,10 +413,10 @@ var A = {
413
413
  }, le = (e) => (t, n) => t + +!!e.some((e) => Y(e)(n)), q = (e, t, n) => {
414
414
  let r = [], i = t?.answer || [], a = e?.correctResponse || [];
415
415
  if (!i.length) return ["Student did not interact with the number line."];
416
- let { correct: o, incorrect: s, notInAnswer: c, noCorrectResponse: l } = X(i, p(a));
416
+ let { correct: o, incorrect: s, notInAnswer: c, noCorrectResponse: l } = X(i, f(a));
417
417
  if (l) return ["No correct response is defined for this item."];
418
- let u = o.length, d = s.length, f = c.length;
419
- u > 0 && r.push(`${u} object(s) correctly placed.`), d > 0 && r.push(`${d} incorrect object(s) placed.`), f > 0 && r.push(`${f} expected object(s) were not placed.`);
418
+ let u = o.length, d = s.length, p = c.length;
419
+ u > 0 && r.push(`${u} object(s) correctly placed.`), d > 0 && r.push(`${d} incorrect object(s) placed.`), p > 0 && r.push(`${p} expected object(s) were not placed.`);
420
420
  let m = [...i];
421
421
  [...a], o.forEach((e) => {
422
422
  let t = m[e], n = t?.type || "object";
@@ -458,7 +458,7 @@ function de(e, t) {
458
458
  if (!t || c(t)) n({ score: { scaled: 0 } });
459
459
  else {
460
460
  t.answer = t.answer || [];
461
- let r = X(t.answer, p(e.correctResponse)), i = Z(r);
461
+ let r = X(t.answer, f(e.correctResponse)), i = Z(r);
462
462
  if (i === "correct") n(K(1));
463
463
  else if (i === "incorrect") n(K(0));
464
464
  else if (i === "partial") {
@@ -472,7 +472,7 @@ var fe = 3, J = (e, t, n) => {
472
472
  n ||= 5;
473
473
  let r = 10 ** -n / 2;
474
474
  return Math.abs(e - t) <= r;
475
- }, Y = (e) => (t) => y(e, t, (e, t) => {
475
+ }, Y = (e) => (t) => _(e, t, (e, t) => {
476
476
  if (typeof e == "number" && typeof t == "number") return J(e, t, 3);
477
477
  }), X = (e, t) => c(t) && e.length > 0 ? {
478
478
  correct: [],
@@ -495,7 +495,7 @@ var fe = 3, J = (e, t, n) => {
495
495
  return i ? "unknown" : t.length === 0 && n.length === 0 ? "unanswered" : t.length === 0 && r.length === 0 ? "correct" : t.length > 0 || r.length > 0 ? n.length > 0 ? "partial" : "incorrect" : "unknown";
496
496
  };
497
497
  function Q(e) {
498
- let t = b(A.feedback, e.feedback);
498
+ let t = y(A.feedback, e.feedback);
499
499
  return {
500
500
  ...A,
501
501
  ...e,
@@ -504,7 +504,7 @@ function Q(e) {
504
504
  }
505
505
  function pe(e = {}) {
506
506
  return new Promise((t) => {
507
- t(o({
507
+ t(s({
508
508
  ...e,
509
509
  graph: {
510
510
  ...A.graph,
@@ -518,7 +518,7 @@ var me = (e) => {
518
518
  let { graph: { domain: t, labelStep: n, ticks: r = {} } = {} } = e, { minor: i, major: a } = r;
519
519
  if (t && (t.min = Number((t.min || 0).toFixed(2)), t.max = Number((t.max || 0).toFixed(2))), n && typeof n == "string" && n.match(/^[1-9][0-9]*\/[1-9][0-9]*$/g)) {
520
520
  e.graph.fraction = !0, r.tickIntervalType = "Fraction";
521
- let t = w(n);
521
+ let t = ee(n);
522
522
  t !== a && (r.major = t, r.minor = t / (a / i));
523
523
  }
524
524
  return e;
@@ -527,19 +527,19 @@ async function he(e, t, n) {
527
527
  if (!e) throw Error("question is null");
528
528
  let r = await Q(e), i = G(me(r).graph);
529
529
  if (i) {
530
- let e = n.mode === "evaluate", a = p(r.correctResponse), s = e && X(t && t.answer || [], a), c = e && Z(s), { exhibitOnly: l } = i, u = n.mode !== "gather" || l === !0, d = null;
530
+ let e = n.mode === "evaluate", a = f(r.correctResponse), o = e && X(t && t.answer || [], a), c = e && Z(o), { exhibitOnly: l } = i, u = n.mode !== "gather" || l === !0, d = null;
531
531
  n.role === "instructor" && (n.mode === "view" || e) && (d = r.teacherInstructions);
532
- let f = e ? await ee(c, r.feedback) : void 0;
533
- return o({
532
+ let p = e ? await E(c, r.feedback) : void 0;
533
+ return s({
534
534
  prompt: r.prompt,
535
535
  teacherInstructions: d,
536
536
  graph: i,
537
537
  disabled: u,
538
- corrected: s,
538
+ corrected: o,
539
539
  correctResponse: e && ["unanswered", "correct"].indexOf(c) === -1 && r.correctResponse,
540
- feedback: f && {
540
+ feedback: p && {
541
541
  type: c,
542
- message: f
542
+ message: p
543
543
  },
544
544
  colorContrast: n.accessibility && n.accessibility.colorContrast || "black_on_white",
545
545
  language: r.language,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../../shared/feedback/dist/index.js","../../../../../shared/controller-utils/dist/index.js","../../../src/controller/defaults.ts","../../../src/controller/tickUtils.ts","../../../src/controller/utils.ts","../../../src/controller/index.ts"],"sourcesContent":["//#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/number-line/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 correctResponse: [],\n feedback: {\n correct: { default: 'Correct', type: 'none' },\n incorrect: { default: 'Incorrect', type: 'none' },\n partial: { default: 'Nearly', type: 'none' },\n },\n graph: {\n arrows: { left: true, right: true },\n availableTypes: {\n PF: true,\n },\n domain: { min: -1, max: 1 },\n exhibitOnly: false,\n initialElements: [],\n initialType: 'PF',\n maxNumberOfPoints: 1,\n ticks: { minor: 0.125, major: 0.5, tickIntervalType: 'Decimal' },\n title: '',\n width: 500,\n },\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n widthEnabled: true,\n};\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/number-line/controller/src/tickUtils.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 * as math from 'mathjs';\nimport { isNumber, isObject, uniqWith } from '@pie-element/shared-lodash';\n\n// All these functions are duplicated in src/number-line/graph/tick-utils\n\n/*This will store the possible decimal tick values*/\nconst decimalTickValues = [0.001, 0.01, 0.02, 0.04, 0.05, 0.1, 0.125, 0.2, 0.25, 0.5];\n\n/*This will store the possible fraction tick values*/\nconst fractionTickValues = [\n '1/1000',\n '1/100',\n '1/64',\n '1/50',\n '1/32',\n '1/25',\n '1/20',\n '1/16',\n '1/15',\n '1/12',\n '1/10',\n '1/9',\n '1/8',\n '1/7',\n '1/6',\n '1/5',\n '1/4',\n '1/3',\n '1/2',\n];\n\n/*This const will store possible multiplier for label interval that needs to be multiplied\nwith tick interval with denominator represented with object key.*/\nconst labelMultiplier = {\n 1: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n 2: [1, 2, 4, 6, 8, 10],\n 3: [1, 3, 6, 9],\n 4: [1, 2, 4, 8],\n 5: [1, 5, 10],\n 6: [1, 2, 3, 6],\n 7: [1, 7],\n 8: [1, 2, 4, 8],\n 9: [1, 3, 9],\n 10: [1, 2, 5, 10],\n 12: [1, 2, 3, 4, 6],\n 15: [1, 3, 5],\n 16: [1, 2, 4, 8],\n 20: [1, 2, 4, 5, 10],\n 25: [1, 5],\n 32: [1, 2, 4, 8],\n 50: [1, 2, 5, 10],\n 64: [1, 2, 4, 8],\n 100: [1, 2, 4, 5, 10],\n 1000: [1, 2, 4, 5, 8, 10],\n};\n\nconst fractionRange = (start, end, interval) => {\n const m = math.mod(math.abs(start), math.abs(interval));\n if (!math.equal(m, 0)) {\n throw new Error('start point must be divisible by interval');\n }\n\n if (math.equal(start, end)) {\n return [];\n }\n\n const e = math.subtract(end, math.mod(end, math.abs(interval)));\n\n const direction = math.larger(interval, 0) ? 'positive' : 'negative';\n\n if (direction === 'negative' && math.largerEq(end, start)) {\n throw new Error('start must be > than end when doing a negative decrement');\n }\n if (direction === 'positive' && math.smallerEq(end, start)) {\n throw new Error('start must be < end when doing increments');\n }\n const compareFn = direction === 'positive' ? math.smallerEq : math.equal(e, end) ? math.largerEq : math.larger;\n const out = [];\n\n let next = start;\n while (compareFn(next, e)) {\n out.push(next);\n next = math.add(next, interval);\n }\n return out;\n};\n\nconst zbrErrorMessage = (start, end) =>\n `Can only do a positive or negative range, but got: start: ${start} and end:${end}`;\n\nconst zeroBasedRange = (start, end, interval) => {\n start = math.fraction(start);\n end = math.fraction(end);\n interval = math.fraction(interval);\n\n const length = math.abs(math.subtract(end, start));\n\n if (math.larger(length, math.abs(end))) {\n throw new Error(zbrErrorMessage(start, end));\n }\n const a = {\n start: math.abs(start),\n end: math.abs(end),\n interval: math.abs(interval),\n multiplier: math.smaller(interval, 0) ? -1 : 1,\n };\n\n const m = math.mod(a.start, a.interval);\n const s = math.larger(m, 0) ? math.add(math.subtract(a.start, m), a.interval) : a.start;\n\n const r = fractionRange(s, a.end, a.interval);\n const out = a.multiplier === -1 ? r.map((v) => math.multiply(v, -1)) : r;\n\n if (math.smaller(interval, 0)) {\n out.reverse();\n }\n return out;\n};\n\nconst fmin = (a, b) => {\n a = math.fraction(a);\n b = math.fraction(b);\n return math.smaller(a, b) ? a : b;\n};\n\nconst fmax = (a, b) => {\n a = math.fraction(a);\n b = math.fraction(b);\n return math.larger(a, b) ? a : b;\n};\n/**\n * the lodash range was causing too much variance in the rounding errors\n * such that it was hard to round the numbers.\n * This is a more simplistic version but makes rounding work.\n */\nconst simpleRange = (start, end, interval) => {\n start = math.fraction(start);\n end = math.fraction(end);\n interval = math.fraction(interval);\n\n const positiveRange = math.larger(end, 0) ? zeroBasedRange(fmax(0, start), end, interval) : [];\n\n const negativeRange = math.smaller(start, 0) ? zeroBasedRange(fmin(0, end), start, math.multiply(interval, -1)) : [];\n let together = negativeRange.concat(positiveRange);\n\n const out = uniqWith(together, math.equal);\n return out;\n};\n\nconst closeTo = (a, b, precision) => {\n precision = precision || 2;\n const expectedDiff = Math.pow(10, -precision) / 2;\n const receivedDiff = Math.abs(a - b);\n return receivedDiff < expectedDiff;\n};\n\nconst limit = (v, min, max) => {\n if (math.smaller(fraction(v), fraction(min))) {\n return min;\n }\n\n if (math.larger(fraction(v), fraction(max))) {\n return max;\n }\n\n return v;\n};\n\n/*\n * Function to get tick interval limits based on min, max and width entered by the user.\n * @param domain object containing max and min value.\n * @param width number represents width of number line.\n * */\nexport const getMinorLimits = (domain, width) => {\n const end = domain.max - domain.min;\n const min = math.number(math.multiply(10, math.divide(math.fraction(end), width)));\n const max = math.number(math.multiply(20, min));\n return {\n min: min,\n max: max,\n };\n};\n\nconst isMultiple = (multiple, src) => {\n const mod = math.mod(multiple, src);\n return math.equal(mod, 0);\n};\n\n/**\n * Accepts a fraction object {n,d,s} or number.\n * @param {*} v\n * @return mathjs.fraction\n */\nconst fraction = (v) => {\n if (isObject(v)) {\n return math.fraction(v.n * v.s, v.d);\n } else if (isNumber(v)) {\n return math.fraction(v);\n }\n};\n\nconst normalizeTicks = (domain, width, ticks, opts) => {\n const useLimit = opts ? opts.limit !== false : true;\n const minorLimits = getMinorLimits(domain, width);\n\n const minor = useLimit ? limit(fraction(ticks.minor), minorLimits.min, minorLimits.max) : fraction(ticks.minor);\n const major = useLimit ? limit(fraction(ticks.major), minor, math.multiply(minor, 20)) : fraction(ticks.major);\n\n const isMajorMultiple = isMultiple(major, minor);\n\n if (!isMajorMultiple) {\n const multiplier = math.divide(major, minor);\n const multiplyBy = multiplier <= 2 ? 2 : Math.round(multiplier);\n\n // major must be a multiple of minor\n return { minor, major: math.multiply(minor, multiplyBy) };\n }\n\n return { major, minor };\n};\n\n/**\n * Build ticks as an array of mathjs Fractions\n */\nconst buildTickDataAsFractions = (domain, width, ticks, opts) => {\n ticks = normalizeTicks(domain, width, ticks, opts);\n const rng = simpleRange(domain.min, domain.max, ticks.minor);\n\n const o = rng\n .filter((x) => math.smallerEq(x, math.fraction(domain.max)))\n .map((x) => {\n let type = 'minor';\n const modulo = math.mod(x, ticks.major);\n\n if (closeTo(math.number(modulo), 0)) {\n type = 'major';\n }\n\n return { x, type };\n });\n\n return o;\n};\n\n/*\n * This function will generate tick interval values based on min and max limits of ticks.\n * @param minorLimits object containing min and max values\n * @return out object containing three arrays 1. fraction values, 2. decimal values,\n * */\nexport const generateMinorValues = (minorLimits) => {\n let out = { fraction: [], decimal: [] };\n decimalTickValues.forEach((value) => {\n if (value >= minorLimits.min && value <= minorLimits.max) {\n out.decimal.push(value);\n }\n });\n fractionTickValues.forEach((value) => {\n let decimalValue = math.number(math.fraction(value));\n if (decimalValue >= minorLimits.min && decimalValue <= minorLimits.max) {\n out.fraction.push(value);\n }\n });\n return out;\n};\n\n/*\n * This function will generate label interval values for provided tick interval value.\n * @param minor number representing tick interval value.\n * @param domain object containing min and max values.\n * @param width number representing width of number line.\n * @return out object containing three arrays 1. fraction values, 2. decimal values,\n * */\nexport const generateMajorValuesForMinor = (minor, domain, width) => {\n let out = { decimal: [], fraction: [] };\n let fraction = math.fraction(math.number(math.number(minor)));\n let n = fraction.n;\n let d = fraction.d;\n if (n >= 1 && d === 1) {\n for (let i = 1; i <= 10; i++) {\n let num = math.number(math.multiply(n, i));\n //Here we check if this major value can plot at least 2 points on number line.\n let ticksData = { minor: minor, major: num };\n let output = buildTickData(domain, width, ticksData, { fraction: undefined });\n if (output.filter((x) => x.type === 'major').length > 1) {\n out.fraction.push(num.toString());\n out.decimal.push(num);\n }\n }\n } else {\n for (const multiplierKey in labelMultiplier[d]) {\n let num = math.multiply(math.fraction(n, d), labelMultiplier[d][multiplierKey]);\n //Here we check if this major value can plot at least 2 points on number line.\n let ticksData = { minor: minor, major: math.number(num) };\n let output = buildTickData(domain, width, ticksData, { fraction: undefined });\n if (output.filter((x) => x.type === 'major').length > 1) {\n if (num.d !== 1) {\n out.fraction.push(num.n + '/' + num.d);\n } else {\n out.fraction.push(num.n.toString());\n }\n out.decimal.push(math.number(num));\n }\n }\n }\n return out;\n};\n\nconst buildTickData = (domain, width, ticks, opts) => {\n const result = buildTickDataAsFractions(domain, width, ticks, opts);\n\n const out = result.map((o) => (opts.fraction ? o : { ...o, x: math.number(o.x) || 0 }));\n\n return out;\n};\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/number-line/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\nimport * as math from 'mathjs';\nimport { generateMajorValuesForMinor, generateMinorValues, getMinorLimits } from './tickUtils.js';\n\n/*\n * This function is duplicated in configure/main.js\n * This function will update major value whenever minor value is changed or tick type is changed\n * @param graph object containing domain, ticks and width value\n * @return graph object with updated ticks values\n * */\nconst updateMajorValue = (graph) => {\n const { domain, ticks, width } = graph;\n const majorValues = generateMajorValuesForMinor(ticks.minor, domain, width);\n if (majorValues.decimal.indexOf(ticks.major) === -1) {\n let currIndex = 0;\n if (ticks.tickIntervalType === 'Integer') {\n currIndex = majorValues.decimal.length > 4 ? 4 : majorValues.decimal.length - 1;\n } else {\n currIndex = majorValues.decimal.length - 1;\n }\n ticks.major = majorValues.decimal[currIndex];\n }\n graph.fraction = ticks.tickIntervalType === 'Fraction' && ticks.major < 1;\n return { ...graph, ticks };\n};\n\n/*\n * This function is duplicated in configure/main.js\n * This function will reload ticks data whenever graph object is changed and also sets required tick object\n * for rendering Ticks Components.\n * @param graph object containing domain, ticks and width value\n * @return graph object with updated ticks values\n * */\n\nexport const reloadTicksData = (graph) => {\n const { domain, ticks = {}, width } = graph;\n //Set tick interval type if not present for legacy number line models depending upon minor value\n if (!ticks.tickIntervalType) {\n if (ticks.minor > 0.5) {\n ticks.tickIntervalType = 'Integer';\n } else {\n ticks.tickIntervalType = 'Decimal';\n }\n }\n // This section will calculate minor and major values array and assign respective value\n // to different tick types object\n const minorLimits = getMinorLimits(domain, width);\n if (minorLimits.min >= 1) {\n /*\n * In this scenario only integer tick will be enabled\n * */\n ticks.tickIntervalType = 'Integer';\n ticks.minor =\n ticks.minor < 1\n ? math.number(math.ceil(minorLimits.min))\n : ticks.minor >= math.number(math.ceil(minorLimits.min)) &&\n ticks.minor <= math.number(math.floor(minorLimits.max))\n ? ticks.minor\n : math.number(math.ceil(minorLimits.min));\n ticks.integerTick = ticks.minor;\n const minorValues = { decimal: [], fraction: [] };\n ticks.fractionTick = '0';\n ticks.decimalTick = 0;\n } else if (minorLimits.min >= 0 && minorLimits.max < 1) {\n /*\n * In this scenario only decimal or fraction tick will be enabled\n * */\n if (ticks.tickIntervalType === 'Integer') {\n ticks.tickIntervalType = 'Fraction';\n }\n const minorValues = generateMinorValues(minorLimits);\n let minValue = math.number(math.fraction(minorValues.fraction[0]));\n let maxValue = math.number(math.fraction(minorValues.fraction[minorValues.fraction.length - 1]));\n if (ticks.minor < minValue || ticks.minor > maxValue) {\n switch (ticks.tickIntervalType) {\n case 'Fraction':\n ticks.minor = math.number(math.fraction(minorValues.fraction[minorValues.fraction.length - 1]));\n ticks.fractionTick = minorValues.fraction[minorValues.fraction.length - 1];\n ticks.decimalTick = minorValues.decimal[0];\n break;\n case 'Decimal':\n case 'Integer':\n ticks.minor = minorValues.decimal[minorValues.decimal.length - 1];\n ticks.decimalTick = minorValues.decimal[minorValues.decimal.length - 1];\n ticks.fractionTick = minorValues.fraction[0];\n }\n } else {\n switch (ticks.tickIntervalType) {\n case 'Fraction':\n let fraction = math.fraction(math.number(ticks.minor));\n ticks.fractionTick = fraction.n + '/' + fraction.d;\n ticks.decimalTick = ticks.decimalTick ? ticks.decimalTick : minorValues.decimal[0];\n break;\n case 'Decimal':\n case 'Integer':\n ticks.decimalTick = ticks.minor;\n ticks.fractionTick = ticks.fractionTick ? ticks.fractionTick : minorValues.fraction[0];\n }\n }\n ticks.integerTick = 1;\n } else if (minorLimits.min < 1 && minorLimits.max >= 1) {\n /*\n * In this scenario all integer, decimal or fraction tick will be enabled\n * */\n const minorValues = generateMinorValues(minorLimits);\n if (!(ticks.minor >= minorLimits.min && ticks.minor <= minorLimits.max)) {\n if (minorLimits.min > 0.5) {\n ticks.tickIntervalType = 'Integer';\n }\n switch (ticks.tickIntervalType) {\n case 'Integer':\n ticks.minor = math.number(math.ceil(minorLimits.min));\n ticks.integerTick = ticks.minor;\n ticks.decimalTick = minorLimits.min > 0.5 ? 0 : minorValues.decimal[0];\n ticks.fractionTick = minorLimits.min > 0.5 ? '0' : minorValues.fraction[0];\n break;\n case 'Decimal':\n ticks.minor = minorValues.decimal[0];\n ticks.integerTick = 1;\n ticks.decimalTick = ticks.minor;\n ticks.fractionTick = minorValues.fraction[0];\n break;\n case 'Fraction':\n ticks.minor = math.number(math.fraction(minorValues.fraction[0]));\n ticks.integerTick = 1;\n ticks.decimalTick = minorValues.decimal[0];\n ticks.fractionTick = minorValues.fraction[0];\n }\n } else {\n switch (ticks.tickIntervalType) {\n case 'Integer':\n ticks.integerTick = ticks.minor;\n ticks.decimalTick = minorLimits.min > 0.5 ? 0 : minorValues.decimal[0];\n ticks.fractionTick = minorLimits.min > 0.5 ? '0' : minorValues.fraction[0];\n break;\n case 'Decimal':\n ticks.integerTick = 1;\n ticks.decimalTick = ticks.minor;\n ticks.fractionTick = minorValues.fraction[0];\n break;\n case 'Fraction':\n ticks.integerTick = 1;\n ticks.decimalTick = minorValues.decimal[0];\n let fraction = math.fraction(math.number(ticks.minor));\n ticks.fractionTick = fraction.n + '/' + fraction.d;\n }\n }\n }\n return updateMajorValue({ ...graph, ticks });\n};\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/number-line/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 { cloneDeep, find, isEmpty, isEqualWith, merge, omitBy } from '@pie-element/shared-lodash';\nimport { getFeedbackForCorrectness } from '@pie-element/shared-feedback';\nimport { partialScoring } from '@pie-element/shared-controller-utils';\nimport * as math from 'mathjs';\n\nimport defaults from './defaults.js';\nimport { reloadTicksData } from './utils.js';\n\nconst score = (number) => {\n return {\n score: {\n scaled: number,\n },\n };\n};\n\nconst getPartialScore = (corrected, ps) => {\n const { correct } = corrected;\n const rule = ps.find((r) => r.numberOfCorrect === correct.length);\n\n if (rule) {\n return 1.0 * (rule.scorePercentage / 100);\n } else {\n return 0;\n }\n};\n\nconst accumulateAnswer = (correctResponse) => (total, answer) => {\n const isCorrectResponse = correctResponse.some((cr) => matches(cr)(answer));\n return total + (isCorrectResponse ? 1 : 0);\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\n const studentAnswers = session?.answer || [];\n const correctResponse = model?.correctResponse || [];\n\n if (!studentAnswers.length) {\n return ['Student did not interact with the number line.'];\n }\n\n const corrected = getCorrected(studentAnswers, cloneDeep(correctResponse));\n const { correct, incorrect, notInAnswer, noCorrectResponse } = corrected;\n\n if (noCorrectResponse) {\n return ['No correct response is defined for this item.'];\n }\n\n const correctCount = correct.length;\n const incorrectCount = incorrect.length;\n const missingCount = notInAnswer.length;\n\n if (correctCount > 0) {\n traceLog.push(`${correctCount} object(s) correctly placed.`);\n }\n\n if (incorrectCount > 0) {\n traceLog.push(`${incorrectCount} incorrect object(s) placed.`);\n }\n\n if (missingCount > 0) {\n traceLog.push(`${missingCount} expected object(s) were not placed.`);\n }\n\n const studentAnswersCopy = [...studentAnswers];\n const correctResponseCopy = [...correctResponse];\n\n correct.forEach((index) => {\n const answer = studentAnswersCopy[index];\n const objectType = answer?.type || 'object';\n traceLog.push(`${objectType.charAt(0).toUpperCase() + objectType.slice(1)} at position ${answer.domainPosition} is correct.`);\n });\n\n incorrect.forEach((index) => {\n const answer = studentAnswersCopy[index];\n const objectType = answer?.type || 'object';\n traceLog.push(`${objectType.charAt(0).toUpperCase() + objectType.slice(1)} at position ${answer.domainPosition} does not match the expected response.`);\n });\n\n notInAnswer.forEach((expectedObject) => {\n const objectType = expectedObject?.type || 'object';\n traceLog.push(`Expected ${objectType} at position ${expectedObject.domainPosition} was not placed by the student.`);\n });\n\n const partialScoringEnabled = partialScoring.enabled(model, env);\n\n if (partialScoringEnabled) {\n traceLog.push('Score calculated using partial scoring.');\n traceLog.push(`Partial scoring is based on the number of correct objects, with deductions for extras.`);\n } else {\n traceLog.push('Score calculated using all-or-nothing scoring.');\n }\n\n const total = correctResponse.length || 1;\n const extraPlacements =\n studentAnswers.length > total ? studentAnswers.length - total : 0;\n\n if (extraPlacements > 0) {\n traceLog.push(\n `${extraPlacements} extra object(s) beyond the required amount were placed and deducted.`,\n );\n }\n\n const rawScore = Math.max(0, (correctCount - extraPlacements) / total);\n const finalScore = partialScoringEnabled ? rawScore : rawScore === 1 ? 1 : 0;\n\n traceLog.push(`Final score: ${finalScore}.`);\n\n return traceLog;\n};\n\n\n/**\n */\nexport function outcome(model, session, env) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true, logTrace: ['Student did not interact with the number line.'] });\n } else {\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const numCorrect = (session.answer || []).reduce(accumulateAnswer(model.correctResponse), 0);\n\n let total = model.correctResponse.length;\n let numIncorrect = 0;\n\n if ((session.answer || []).length > total) {\n numIncorrect = (session.answer || []).length - total;\n }\n\n if (total === 0) {\n total = 1;\n }\n\n let score = numCorrect < 0 ? 0 : (numCorrect - numIncorrect) / total;\n\n if (score < 0) {\n score = 0;\n }\n\n resolve({ \n score: partialScoringEnabled ? score : score === 1 ? 1 : 0,\n logTrace: getLogTrace(model, session, env)\n });\n }\n });\n}\n\nexport function getScore(question, session) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: { scaled: 0 } });\n } else {\n session.answer = session.answer || [];\n\n const corrected = getCorrected(session.answer, cloneDeep(question.correctResponse));\n\n const correctness = getCorrectness(corrected);\n\n if (correctness === 'correct') {\n resolve(score(1.0));\n } else if (correctness === 'incorrect') {\n resolve(score(0.0));\n } else if (correctness === 'partial') {\n const { allowPartialScoring, partialScoring } = question;\n const ps = (partialScoring || []).filter((o) => !isEmpty(o));\n const canDoPartialScoring = allowPartialScoring && ps.length > 0;\n if (canDoPartialScoring) {\n resolve(score(getPartialScore(corrected, ps)));\n } else {\n resolve(score(0.0));\n }\n } else {\n resolve({ score: { scaled: -1 } });\n }\n }\n });\n}\n\nexport const CLOSE_TO_PRECISION = 3;\n\nexport const closeTo = (a, b, precision) => {\n precision = precision || 5;\n const expectedDiff = Math.pow(10, -precision) / 2;\n const receivedDiff = Math.abs(a - b);\n const close = receivedDiff <= expectedDiff;\n return close;\n};\n\nconst matches = (a) => (v) => {\n return isEqualWith(a, v, (v, ov) => {\n if (typeof v === 'number' && typeof ov === 'number') {\n return closeTo(v, ov, CLOSE_TO_PRECISION);\n }\n });\n};\n\nexport const getCorrected = (answer, correctResponse) => {\n if (isEmpty(correctResponse) && answer.length > 0) {\n return {\n correct: [],\n incorrect: [],\n notInAnswer: [],\n noCorrectResponse: true,\n };\n }\n\n return answer.reduce(\n (acc, a, index) => {\n const { correct, incorrect, notInAnswer } = acc;\n\n const match = find(notInAnswer, matches(a));\n if (match) {\n correct.push(index);\n notInAnswer.splice(notInAnswer.indexOf(match), 1);\n } else {\n incorrect.push(index);\n }\n\n return {\n correct: correct,\n incorrect: incorrect,\n notInAnswer: notInAnswer,\n };\n },\n {\n correct: [],\n incorrect: [],\n notInAnswer: correctResponse,\n },\n );\n};\n\nexport const getCorrectness = (corrected) => {\n const { incorrect, correct, notInAnswer, noCorrectResponse } = corrected;\n\n if (noCorrectResponse) {\n return 'unknown';\n }\n\n if (incorrect.length === 0 && correct.length === 0) {\n return 'unanswered';\n }\n\n if (incorrect.length === 0 && notInAnswer.length === 0) {\n return 'correct';\n }\n\n if (incorrect.length > 0 || notInAnswer.length > 0) {\n if (correct.length > 0) {\n return 'partial';\n } else {\n return 'incorrect';\n }\n }\n\n return 'unknown';\n};\n\n/**\n * A sample of a normalize function see:\n * https://github.com/pie-framework/pie-elements/issues/21\n */\nexport function normalize(question) {\n const feedback = merge(defaults.feedback, question.feedback);\n\n return { ...defaults, ...question, feedback };\n}\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n const out = {\n ...model,\n graph: {\n ...defaults.graph,\n ...model.graph,\n },\n colorContrast: 'black_on_white',\n };\n\n resolve(omitBy(out, (v) => !v));\n });\n}\n\n// this function is duplicated in configure; at some point, use the same shared function\nconst updateTicks = (model) => {\n const { graph: { domain, labelStep, ticks = {} } = {} } = model;\n const { minor, major } = ticks;\n\n if (domain) {\n domain.min = Number((domain.min || 0).toFixed(2));\n domain.max = Number((domain.max || 0).toFixed(2));\n }\n\n if (labelStep && typeof labelStep === 'string' && labelStep.match(/^[1-9][0-9]*\\/[1-9][0-9]*$/g)) {\n model.graph.fraction = true;\n ticks.tickIntervalType = 'Fraction';\n\n // update the ticks frequency and label value to match the label step if needed\n const step = math.evaluate(labelStep);\n\n if (step !== major) {\n ticks.major = step;\n ticks.minor = step / (major / minor);\n }\n }\n\n return model;\n};\n\nexport async function model(question, session, env) {\n if (!question) {\n throw new Error('question is null');\n }\n\n const normalizedQuestion = await normalize(question);\n const normalizedModel = updateTicks(normalizedQuestion);\n // this function is also called in configure, it is a duplicate to maintain consistency and correctness\n const graph = reloadTicksData(normalizedModel.graph);\n\n if (graph) {\n const evaluateMode = env.mode === 'evaluate';\n\n const correctResponse = cloneDeep(normalizedQuestion.correctResponse);\n const corrected = evaluateMode && getCorrected(session ? session.answer || [] : [], correctResponse);\n const correctness = evaluateMode && getCorrectness(corrected);\n\n const { exhibitOnly } = graph;\n const disabled = env.mode !== 'gather' || exhibitOnly === true;\n let teacherInstructions = null;\n\n if (env.role === 'instructor' && (env.mode === 'view' || evaluateMode)) {\n teacherInstructions = normalizedQuestion.teacherInstructions;\n }\n\n const feedbackMessage = evaluateMode\n ? await getFeedbackForCorrectness(correctness, normalizedQuestion.feedback)\n : undefined;\n\n const out = {\n prompt: normalizedQuestion.prompt,\n teacherInstructions,\n graph,\n disabled,\n corrected,\n correctResponse:\n evaluateMode && ['unanswered', 'correct'].indexOf(correctness) === -1 && normalizedQuestion.correctResponse,\n feedback: feedbackMessage && {\n type: correctness,\n message: feedbackMessage,\n },\n colorContrast: (env.accessibility && env.accessibility.colorContrast) || 'black_on_white',\n language: normalizedQuestion.language,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n return omitBy(out, (v) => !v);\n } else {\n throw new Error('graph is undefined');\n }\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { correctResponse: answer } = question;\n\n resolve({\n answer,\n id: '1',\n });\n } else {\n 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 { graph, correctResponse } = model || {};\n const { maxMaxElements = 20, numberLineDimensions: { min: minWidth = 200, max: maxWidth = 800 } = {} } = config || {};\n const { width, domain, maxNumberOfPoints } = graph || {};\n const { min, max } = domain || {};\n const errors = {};\n\n ['teacherInstructions', 'prompt'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n if (width < minWidth || width > maxWidth) {\n errors.widthError = `Width should be a value between ${minWidth} and ${maxWidth}.`;\n }\n\n const MIN_DOMAIN = -100000;\n const MAX_DOMAIN = 100000;\n\n if (min < MIN_DOMAIN || min > MAX_DOMAIN || max < MIN_DOMAIN || max > MAX_DOMAIN) {\n errors.domainError = `Min and max values must both be in the range [${MIN_DOMAIN}, ${MAX_DOMAIN}].`;\n }\n\n if (min >= max) {\n errors.maxError = 'Max value must be greater than min value.';\n }\n\n if (maxNumberOfPoints < 1 || maxNumberOfPoints > maxMaxElements) {\n errors.pointsError = `Max number of elements should be between 1 and ${maxMaxElements}.`;\n }\n\n if (correctResponse && correctResponse.length === 0) {\n errors.correctResponseError = 'The correct answer should include at least one number line object.';\n }\n\n return errors;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../../shared/feedback/dist/index.js","../../../../../shared/controller-utils/dist/index.js","../../../src/controller/defaults.ts","../../../src/controller/tickUtils.ts","../../../src/controller/utils.ts","../../../src/controller/index.ts"],"sourcesContent":["//#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/number-line/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 correctResponse: [],\n feedback: {\n correct: { default: 'Correct', type: 'none' },\n incorrect: { default: 'Incorrect', type: 'none' },\n partial: { default: 'Nearly', type: 'none' },\n },\n graph: {\n arrows: { left: true, right: true },\n availableTypes: {\n PF: true,\n },\n domain: { min: -1, max: 1 },\n exhibitOnly: false,\n initialElements: [],\n initialType: 'PF',\n maxNumberOfPoints: 1,\n ticks: { minor: 0.125, major: 0.5, tickIntervalType: 'Decimal' },\n title: '',\n width: 500,\n },\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n widthEnabled: true,\n};\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/number-line/controller/src/tickUtils.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 * as math from 'mathjs';\nimport { isNumber, isObject, uniqWith } from '@pie-element/shared-lodash';\n\n// All these functions are duplicated in src/number-line/graph/tick-utils\n\n/*This will store the possible decimal tick values*/\nconst decimalTickValues = [0.001, 0.01, 0.02, 0.04, 0.05, 0.1, 0.125, 0.2, 0.25, 0.5];\n\n/*This will store the possible fraction tick values*/\nconst fractionTickValues = [\n '1/1000',\n '1/100',\n '1/64',\n '1/50',\n '1/32',\n '1/25',\n '1/20',\n '1/16',\n '1/15',\n '1/12',\n '1/10',\n '1/9',\n '1/8',\n '1/7',\n '1/6',\n '1/5',\n '1/4',\n '1/3',\n '1/2',\n];\n\n/*This const will store possible multiplier for label interval that needs to be multiplied\nwith tick interval with denominator represented with object key.*/\nconst labelMultiplier = {\n 1: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n 2: [1, 2, 4, 6, 8, 10],\n 3: [1, 3, 6, 9],\n 4: [1, 2, 4, 8],\n 5: [1, 5, 10],\n 6: [1, 2, 3, 6],\n 7: [1, 7],\n 8: [1, 2, 4, 8],\n 9: [1, 3, 9],\n 10: [1, 2, 5, 10],\n 12: [1, 2, 3, 4, 6],\n 15: [1, 3, 5],\n 16: [1, 2, 4, 8],\n 20: [1, 2, 4, 5, 10],\n 25: [1, 5],\n 32: [1, 2, 4, 8],\n 50: [1, 2, 5, 10],\n 64: [1, 2, 4, 8],\n 100: [1, 2, 4, 5, 10],\n 1000: [1, 2, 4, 5, 8, 10],\n};\n\nconst fractionRange = (start, end, interval) => {\n const m = math.mod(math.abs(start), math.abs(interval));\n if (!math.equal(m, 0)) {\n throw new Error('start point must be divisible by interval');\n }\n\n if (math.equal(start, end)) {\n return [];\n }\n\n const e = math.subtract(end, math.mod(end, math.abs(interval)));\n\n const direction = math.larger(interval, 0) ? 'positive' : 'negative';\n\n if (direction === 'negative' && math.largerEq(end, start)) {\n throw new Error('start must be > than end when doing a negative decrement');\n }\n if (direction === 'positive' && math.smallerEq(end, start)) {\n throw new Error('start must be < end when doing increments');\n }\n const compareFn = direction === 'positive' ? math.smallerEq : math.equal(e, end) ? math.largerEq : math.larger;\n const out = [];\n\n let next = start;\n while (compareFn(next, e)) {\n out.push(next);\n next = math.add(next, interval);\n }\n return out;\n};\n\nconst zbrErrorMessage = (start, end) =>\n `Can only do a positive or negative range, but got: start: ${start} and end:${end}`;\n\nconst zeroBasedRange = (start, end, interval) => {\n start = math.fraction(start);\n end = math.fraction(end);\n interval = math.fraction(interval);\n\n const length = math.abs(math.subtract(end, start));\n\n if (math.larger(length, math.abs(end))) {\n throw new Error(zbrErrorMessage(start, end));\n }\n const a = {\n start: math.abs(start),\n end: math.abs(end),\n interval: math.abs(interval),\n multiplier: math.smaller(interval, 0) ? -1 : 1,\n };\n\n const m = math.mod(a.start, a.interval);\n const s = math.larger(m, 0) ? math.add(math.subtract(a.start, m), a.interval) : a.start;\n\n const r = fractionRange(s, a.end, a.interval);\n const out = a.multiplier === -1 ? r.map((v) => math.multiply(v, -1)) : r;\n\n if (math.smaller(interval, 0)) {\n out.reverse();\n }\n return out;\n};\n\nconst fmin = (a, b) => {\n a = math.fraction(a);\n b = math.fraction(b);\n return math.smaller(a, b) ? a : b;\n};\n\nconst fmax = (a, b) => {\n a = math.fraction(a);\n b = math.fraction(b);\n return math.larger(a, b) ? a : b;\n};\n/**\n * the lodash range was causing too much variance in the rounding errors\n * such that it was hard to round the numbers.\n * This is a more simplistic version but makes rounding work.\n */\nconst simpleRange = (start, end, interval) => {\n start = math.fraction(start);\n end = math.fraction(end);\n interval = math.fraction(interval);\n\n const positiveRange = math.larger(end, 0) ? zeroBasedRange(fmax(0, start), end, interval) : [];\n\n const negativeRange = math.smaller(start, 0) ? zeroBasedRange(fmin(0, end), start, math.multiply(interval, -1)) : [];\n let together = negativeRange.concat(positiveRange);\n\n const out = uniqWith(together, math.equal);\n return out;\n};\n\nconst closeTo = (a, b, precision) => {\n precision = precision || 2;\n const expectedDiff = Math.pow(10, -precision) / 2;\n const receivedDiff = Math.abs(a - b);\n return receivedDiff < expectedDiff;\n};\n\nconst limit = (v, min, max) => {\n if (math.smaller(fraction(v), fraction(min))) {\n return min;\n }\n\n if (math.larger(fraction(v), fraction(max))) {\n return max;\n }\n\n return v;\n};\n\n/*\n * Function to get tick interval limits based on min, max and width entered by the user.\n * @param domain object containing max and min value.\n * @param width number represents width of number line.\n * */\nexport const getMinorLimits = (domain, width) => {\n const end = domain.max - domain.min;\n const min = math.number(math.multiply(10, math.divide(math.fraction(end), width)));\n const max = math.number(math.multiply(20, min));\n return {\n min: min,\n max: max,\n };\n};\n\nconst isMultiple = (multiple, src) => {\n const mod = math.mod(multiple, src);\n return math.equal(mod, 0);\n};\n\n/**\n * Accepts a fraction object {n,d,s} or number.\n * @param {*} v\n * @return mathjs.fraction\n */\nconst fraction = (v) => {\n if (isObject(v)) {\n return math.fraction(v.n * v.s, v.d);\n } else if (isNumber(v)) {\n return math.fraction(v);\n }\n};\n\nconst normalizeTicks = (domain, width, ticks, opts) => {\n const useLimit = opts ? opts.limit !== false : true;\n const minorLimits = getMinorLimits(domain, width);\n\n const minor = useLimit ? limit(fraction(ticks.minor), minorLimits.min, minorLimits.max) : fraction(ticks.minor);\n const major = useLimit ? limit(fraction(ticks.major), minor, math.multiply(minor, 20)) : fraction(ticks.major);\n\n const isMajorMultiple = isMultiple(major, minor);\n\n if (!isMajorMultiple) {\n const multiplier = math.divide(major, minor);\n const multiplyBy = multiplier <= 2 ? 2 : Math.round(multiplier);\n\n // major must be a multiple of minor\n return { minor, major: math.multiply(minor, multiplyBy) };\n }\n\n return { major, minor };\n};\n\n/**\n * Build ticks as an array of mathjs Fractions\n */\nconst buildTickDataAsFractions = (domain, width, ticks, opts) => {\n ticks = normalizeTicks(domain, width, ticks, opts);\n const rng = simpleRange(domain.min, domain.max, ticks.minor);\n\n const o = rng\n .filter((x) => math.smallerEq(x, math.fraction(domain.max)))\n .map((x) => {\n let type = 'minor';\n const modulo = math.mod(x, ticks.major);\n\n if (closeTo(math.number(modulo), 0)) {\n type = 'major';\n }\n\n return { x, type };\n });\n\n return o;\n};\n\n/*\n * This function will generate tick interval values based on min and max limits of ticks.\n * @param minorLimits object containing min and max values\n * @return out object containing three arrays 1. fraction values, 2. decimal values,\n * */\nexport const generateMinorValues = (minorLimits) => {\n let out = { fraction: [], decimal: [] };\n decimalTickValues.forEach((value) => {\n if (value >= minorLimits.min && value <= minorLimits.max) {\n out.decimal.push(value);\n }\n });\n fractionTickValues.forEach((value) => {\n let decimalValue = math.number(math.fraction(value));\n if (decimalValue >= minorLimits.min && decimalValue <= minorLimits.max) {\n out.fraction.push(value);\n }\n });\n return out;\n};\n\n/*\n * This function will generate label interval values for provided tick interval value.\n * @param minor number representing tick interval value.\n * @param domain object containing min and max values.\n * @param width number representing width of number line.\n * @return out object containing three arrays 1. fraction values, 2. decimal values,\n * */\nexport const generateMajorValuesForMinor = (minor, domain, width) => {\n let out = { decimal: [], fraction: [] };\n let fraction = math.fraction(math.number(math.number(minor)));\n // mathjs >= 13 (fraction.js 5) exposes Fraction n/d/s as BigInt; coerce so the\n // strict comparisons below (d === 1) and the labelMultiplier lookup still work.\n let n = Number(fraction.n);\n let d = Number(fraction.d);\n if (n >= 1 && d === 1) {\n for (let i = 1; i <= 10; i++) {\n let num = math.number(math.multiply(n, i));\n //Here we check if this major value can plot at least 2 points on number line.\n let ticksData = { minor: minor, major: num };\n let output = buildTickData(domain, width, ticksData, { fraction: undefined });\n if (output.filter((x) => x.type === 'major').length > 1) {\n out.fraction.push(num.toString());\n out.decimal.push(num);\n }\n }\n } else {\n for (const multiplierKey in labelMultiplier[d]) {\n let num = math.multiply(math.fraction(n, d), labelMultiplier[d][multiplierKey]);\n //Here we check if this major value can plot at least 2 points on number line.\n let ticksData = { minor: minor, major: math.number(num) };\n let output = buildTickData(domain, width, ticksData, { fraction: undefined });\n if (output.filter((x) => x.type === 'major').length > 1) {\n if (Number(num.d) !== 1) {\n out.fraction.push(Number(num.n) + '/' + Number(num.d));\n } else {\n out.fraction.push(Number(num.n).toString());\n }\n out.decimal.push(math.number(num));\n }\n }\n }\n return out;\n};\n\nconst buildTickData = (domain, width, ticks, opts) => {\n const result = buildTickDataAsFractions(domain, width, ticks, opts);\n\n const out = result.map((o) => (opts.fraction ? o : { ...o, x: math.number(o.x) || 0 }));\n\n return out;\n};\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/number-line/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\nimport * as math from 'mathjs';\nimport { generateMajorValuesForMinor, generateMinorValues, getMinorLimits } from './tickUtils.js';\n\n/*\n * This function is duplicated in configure/main.js\n * This function will update major value whenever minor value is changed or tick type is changed\n * @param graph object containing domain, ticks and width value\n * @return graph object with updated ticks values\n * */\nconst updateMajorValue = (graph) => {\n const { domain, ticks, width } = graph;\n const majorValues = generateMajorValuesForMinor(ticks.minor, domain, width);\n if (majorValues.decimal.indexOf(ticks.major) === -1) {\n let currIndex = 0;\n if (ticks.tickIntervalType === 'Integer') {\n currIndex = majorValues.decimal.length > 4 ? 4 : majorValues.decimal.length - 1;\n } else {\n currIndex = majorValues.decimal.length - 1;\n }\n ticks.major = majorValues.decimal[currIndex];\n }\n graph.fraction = ticks.tickIntervalType === 'Fraction' && ticks.major < 1;\n return { ...graph, ticks };\n};\n\n/*\n * This function is duplicated in configure/main.js\n * This function will reload ticks data whenever graph object is changed and also sets required tick object\n * for rendering Ticks Components.\n * @param graph object containing domain, ticks and width value\n * @return graph object with updated ticks values\n * */\n\nexport const reloadTicksData = (graph) => {\n const { domain, ticks = {}, width } = graph;\n //Set tick interval type if not present for legacy number line models depending upon minor value\n if (!ticks.tickIntervalType) {\n if (ticks.minor > 0.5) {\n ticks.tickIntervalType = 'Integer';\n } else {\n ticks.tickIntervalType = 'Decimal';\n }\n }\n // This section will calculate minor and major values array and assign respective value\n // to different tick types object\n const minorLimits = getMinorLimits(domain, width);\n if (minorLimits.min >= 1) {\n /*\n * In this scenario only integer tick will be enabled\n * */\n ticks.tickIntervalType = 'Integer';\n ticks.minor =\n ticks.minor < 1\n ? math.number(math.ceil(minorLimits.min))\n : ticks.minor >= math.number(math.ceil(minorLimits.min)) &&\n ticks.minor <= math.number(math.floor(minorLimits.max))\n ? ticks.minor\n : math.number(math.ceil(minorLimits.min));\n ticks.integerTick = ticks.minor;\n const minorValues = { decimal: [], fraction: [] };\n ticks.fractionTick = '0';\n ticks.decimalTick = 0;\n } else if (minorLimits.min >= 0 && minorLimits.max < 1) {\n /*\n * In this scenario only decimal or fraction tick will be enabled\n * */\n if (ticks.tickIntervalType === 'Integer') {\n ticks.tickIntervalType = 'Fraction';\n }\n const minorValues = generateMinorValues(minorLimits);\n let minValue = math.number(math.fraction(minorValues.fraction[0]));\n let maxValue = math.number(math.fraction(minorValues.fraction[minorValues.fraction.length - 1]));\n if (ticks.minor < minValue || ticks.minor > maxValue) {\n switch (ticks.tickIntervalType) {\n case 'Fraction':\n ticks.minor = math.number(math.fraction(minorValues.fraction[minorValues.fraction.length - 1]));\n ticks.fractionTick = minorValues.fraction[minorValues.fraction.length - 1];\n ticks.decimalTick = minorValues.decimal[0];\n break;\n case 'Decimal':\n case 'Integer':\n ticks.minor = minorValues.decimal[minorValues.decimal.length - 1];\n ticks.decimalTick = minorValues.decimal[minorValues.decimal.length - 1];\n ticks.fractionTick = minorValues.fraction[0];\n }\n } else {\n switch (ticks.tickIntervalType) {\n case 'Fraction':\n let fraction = math.fraction(math.number(ticks.minor));\n ticks.fractionTick = fraction.n + '/' + fraction.d;\n ticks.decimalTick = ticks.decimalTick ? ticks.decimalTick : minorValues.decimal[0];\n break;\n case 'Decimal':\n case 'Integer':\n ticks.decimalTick = ticks.minor;\n ticks.fractionTick = ticks.fractionTick ? ticks.fractionTick : minorValues.fraction[0];\n }\n }\n ticks.integerTick = 1;\n } else if (minorLimits.min < 1 && minorLimits.max >= 1) {\n /*\n * In this scenario all integer, decimal or fraction tick will be enabled\n * */\n const minorValues = generateMinorValues(minorLimits);\n if (!(ticks.minor >= minorLimits.min && ticks.minor <= minorLimits.max)) {\n if (minorLimits.min > 0.5) {\n ticks.tickIntervalType = 'Integer';\n }\n switch (ticks.tickIntervalType) {\n case 'Integer':\n ticks.minor = math.number(math.ceil(minorLimits.min));\n ticks.integerTick = ticks.minor;\n ticks.decimalTick = minorLimits.min > 0.5 ? 0 : minorValues.decimal[0];\n ticks.fractionTick = minorLimits.min > 0.5 ? '0' : minorValues.fraction[0];\n break;\n case 'Decimal':\n ticks.minor = minorValues.decimal[0];\n ticks.integerTick = 1;\n ticks.decimalTick = ticks.minor;\n ticks.fractionTick = minorValues.fraction[0];\n break;\n case 'Fraction':\n ticks.minor = math.number(math.fraction(minorValues.fraction[0]));\n ticks.integerTick = 1;\n ticks.decimalTick = minorValues.decimal[0];\n ticks.fractionTick = minorValues.fraction[0];\n }\n } else {\n switch (ticks.tickIntervalType) {\n case 'Integer':\n ticks.integerTick = ticks.minor;\n ticks.decimalTick = minorLimits.min > 0.5 ? 0 : minorValues.decimal[0];\n ticks.fractionTick = minorLimits.min > 0.5 ? '0' : minorValues.fraction[0];\n break;\n case 'Decimal':\n ticks.integerTick = 1;\n ticks.decimalTick = ticks.minor;\n ticks.fractionTick = minorValues.fraction[0];\n break;\n case 'Fraction':\n ticks.integerTick = 1;\n ticks.decimalTick = minorValues.decimal[0];\n let fraction = math.fraction(math.number(ticks.minor));\n ticks.fractionTick = fraction.n + '/' + fraction.d;\n }\n }\n }\n return updateMajorValue({ ...graph, ticks });\n};\n","// @ts-nocheck\n/**\n * @synced-from pie-elements/packages/number-line/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 { cloneDeep, find, isEmpty, isEqualWith, merge, omitBy } from '@pie-element/shared-lodash';\nimport { getFeedbackForCorrectness } from '@pie-element/shared-feedback';\nimport { partialScoring } from '@pie-element/shared-controller-utils';\nimport * as math from 'mathjs';\n\nimport defaults from './defaults.js';\nimport { reloadTicksData } from './utils.js';\n\nconst score = (number) => {\n return {\n score: {\n scaled: number,\n },\n };\n};\n\nconst getPartialScore = (corrected, ps) => {\n const { correct } = corrected;\n const rule = ps.find((r) => r.numberOfCorrect === correct.length);\n\n if (rule) {\n return 1.0 * (rule.scorePercentage / 100);\n } else {\n return 0;\n }\n};\n\nconst accumulateAnswer = (correctResponse) => (total, answer) => {\n const isCorrectResponse = correctResponse.some((cr) => matches(cr)(answer));\n return total + (isCorrectResponse ? 1 : 0);\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\n const studentAnswers = session?.answer || [];\n const correctResponse = model?.correctResponse || [];\n\n if (!studentAnswers.length) {\n return ['Student did not interact with the number line.'];\n }\n\n const corrected = getCorrected(studentAnswers, cloneDeep(correctResponse));\n const { correct, incorrect, notInAnswer, noCorrectResponse } = corrected;\n\n if (noCorrectResponse) {\n return ['No correct response is defined for this item.'];\n }\n\n const correctCount = correct.length;\n const incorrectCount = incorrect.length;\n const missingCount = notInAnswer.length;\n\n if (correctCount > 0) {\n traceLog.push(`${correctCount} object(s) correctly placed.`);\n }\n\n if (incorrectCount > 0) {\n traceLog.push(`${incorrectCount} incorrect object(s) placed.`);\n }\n\n if (missingCount > 0) {\n traceLog.push(`${missingCount} expected object(s) were not placed.`);\n }\n\n const studentAnswersCopy = [...studentAnswers];\n const correctResponseCopy = [...correctResponse];\n\n correct.forEach((index) => {\n const answer = studentAnswersCopy[index];\n const objectType = answer?.type || 'object';\n traceLog.push(`${objectType.charAt(0).toUpperCase() + objectType.slice(1)} at position ${answer.domainPosition} is correct.`);\n });\n\n incorrect.forEach((index) => {\n const answer = studentAnswersCopy[index];\n const objectType = answer?.type || 'object';\n traceLog.push(`${objectType.charAt(0).toUpperCase() + objectType.slice(1)} at position ${answer.domainPosition} does not match the expected response.`);\n });\n\n notInAnswer.forEach((expectedObject) => {\n const objectType = expectedObject?.type || 'object';\n traceLog.push(`Expected ${objectType} at position ${expectedObject.domainPosition} was not placed by the student.`);\n });\n\n const partialScoringEnabled = partialScoring.enabled(model, env);\n\n if (partialScoringEnabled) {\n traceLog.push('Score calculated using partial scoring.');\n traceLog.push(`Partial scoring is based on the number of correct objects, with deductions for extras.`);\n } else {\n traceLog.push('Score calculated using all-or-nothing scoring.');\n }\n\n const total = correctResponse.length || 1;\n const extraPlacements =\n studentAnswers.length > total ? studentAnswers.length - total : 0;\n\n if (extraPlacements > 0) {\n traceLog.push(\n `${extraPlacements} extra object(s) beyond the required amount were placed and deducted.`,\n );\n }\n\n const rawScore = Math.max(0, (correctCount - extraPlacements) / total);\n const finalScore = partialScoringEnabled ? rawScore : rawScore === 1 ? 1 : 0;\n\n traceLog.push(`Final score: ${finalScore}.`);\n\n return traceLog;\n};\n\n\n/**\n */\nexport function outcome(model, session, env) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true, logTrace: ['Student did not interact with the number line.'] });\n } else {\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const numCorrect = (session.answer || []).reduce(accumulateAnswer(model.correctResponse), 0);\n\n let total = model.correctResponse.length;\n let numIncorrect = 0;\n\n if ((session.answer || []).length > total) {\n numIncorrect = (session.answer || []).length - total;\n }\n\n if (total === 0) {\n total = 1;\n }\n\n let score = numCorrect < 0 ? 0 : (numCorrect - numIncorrect) / total;\n\n if (score < 0) {\n score = 0;\n }\n\n resolve({ \n score: partialScoringEnabled ? score : score === 1 ? 1 : 0,\n logTrace: getLogTrace(model, session, env)\n });\n }\n });\n}\n\nexport function getScore(question, session) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: { scaled: 0 } });\n } else {\n session.answer = session.answer || [];\n\n const corrected = getCorrected(session.answer, cloneDeep(question.correctResponse));\n\n const correctness = getCorrectness(corrected);\n\n if (correctness === 'correct') {\n resolve(score(1.0));\n } else if (correctness === 'incorrect') {\n resolve(score(0.0));\n } else if (correctness === 'partial') {\n const { allowPartialScoring, partialScoring } = question;\n const ps = (partialScoring || []).filter((o) => !isEmpty(o));\n const canDoPartialScoring = allowPartialScoring && ps.length > 0;\n if (canDoPartialScoring) {\n resolve(score(getPartialScore(corrected, ps)));\n } else {\n resolve(score(0.0));\n }\n } else {\n resolve({ score: { scaled: -1 } });\n }\n }\n });\n}\n\nexport const CLOSE_TO_PRECISION = 3;\n\nexport const closeTo = (a, b, precision) => {\n precision = precision || 5;\n const expectedDiff = Math.pow(10, -precision) / 2;\n const receivedDiff = Math.abs(a - b);\n const close = receivedDiff <= expectedDiff;\n return close;\n};\n\nconst matches = (a) => (v) => {\n return isEqualWith(a, v, (v, ov) => {\n if (typeof v === 'number' && typeof ov === 'number') {\n return closeTo(v, ov, CLOSE_TO_PRECISION);\n }\n });\n};\n\nexport const getCorrected = (answer, correctResponse) => {\n if (isEmpty(correctResponse) && answer.length > 0) {\n return {\n correct: [],\n incorrect: [],\n notInAnswer: [],\n noCorrectResponse: true,\n };\n }\n\n return answer.reduce(\n (acc, a, index) => {\n const { correct, incorrect, notInAnswer } = acc;\n\n const match = find(notInAnswer, matches(a));\n if (match) {\n correct.push(index);\n notInAnswer.splice(notInAnswer.indexOf(match), 1);\n } else {\n incorrect.push(index);\n }\n\n return {\n correct: correct,\n incorrect: incorrect,\n notInAnswer: notInAnswer,\n };\n },\n {\n correct: [],\n incorrect: [],\n notInAnswer: correctResponse,\n },\n );\n};\n\nexport const getCorrectness = (corrected) => {\n const { incorrect, correct, notInAnswer, noCorrectResponse } = corrected;\n\n if (noCorrectResponse) {\n return 'unknown';\n }\n\n if (incorrect.length === 0 && correct.length === 0) {\n return 'unanswered';\n }\n\n if (incorrect.length === 0 && notInAnswer.length === 0) {\n return 'correct';\n }\n\n if (incorrect.length > 0 || notInAnswer.length > 0) {\n if (correct.length > 0) {\n return 'partial';\n } else {\n return 'incorrect';\n }\n }\n\n return 'unknown';\n};\n\n/**\n * A sample of a normalize function see:\n * https://github.com/pie-framework/pie-elements/issues/21\n */\nexport function normalize(question) {\n const feedback = merge(defaults.feedback, question.feedback);\n\n return { ...defaults, ...question, feedback };\n}\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n const out = {\n ...model,\n graph: {\n ...defaults.graph,\n ...model.graph,\n },\n colorContrast: 'black_on_white',\n };\n\n resolve(omitBy(out, (v) => !v));\n });\n}\n\n// this function is duplicated in configure; at some point, use the same shared function\nconst updateTicks = (model) => {\n const { graph: { domain, labelStep, ticks = {} } = {} } = model;\n const { minor, major } = ticks;\n\n if (domain) {\n domain.min = Number((domain.min || 0).toFixed(2));\n domain.max = Number((domain.max || 0).toFixed(2));\n }\n\n if (labelStep && typeof labelStep === 'string' && labelStep.match(/^[1-9][0-9]*\\/[1-9][0-9]*$/g)) {\n model.graph.fraction = true;\n ticks.tickIntervalType = 'Fraction';\n\n // update the ticks frequency and label value to match the label step if needed\n const step = math.evaluate(labelStep);\n\n if (step !== major) {\n ticks.major = step;\n ticks.minor = step / (major / minor);\n }\n }\n\n return model;\n};\n\nexport async function model(question, session, env) {\n if (!question) {\n throw new Error('question is null');\n }\n\n const normalizedQuestion = await normalize(question);\n const normalizedModel = updateTicks(normalizedQuestion);\n // this function is also called in configure, it is a duplicate to maintain consistency and correctness\n const graph = reloadTicksData(normalizedModel.graph);\n\n if (graph) {\n const evaluateMode = env.mode === 'evaluate';\n\n const correctResponse = cloneDeep(normalizedQuestion.correctResponse);\n const corrected = evaluateMode && getCorrected(session ? session.answer || [] : [], correctResponse);\n const correctness = evaluateMode && getCorrectness(corrected);\n\n const { exhibitOnly } = graph;\n const disabled = env.mode !== 'gather' || exhibitOnly === true;\n let teacherInstructions = null;\n\n if (env.role === 'instructor' && (env.mode === 'view' || evaluateMode)) {\n teacherInstructions = normalizedQuestion.teacherInstructions;\n }\n\n const feedbackMessage = evaluateMode\n ? await getFeedbackForCorrectness(correctness, normalizedQuestion.feedback)\n : undefined;\n\n const out = {\n prompt: normalizedQuestion.prompt,\n teacherInstructions,\n graph,\n disabled,\n corrected,\n correctResponse:\n evaluateMode && ['unanswered', 'correct'].indexOf(correctness) === -1 && normalizedQuestion.correctResponse,\n feedback: feedbackMessage && {\n type: correctness,\n message: feedbackMessage,\n },\n colorContrast: (env.accessibility && env.accessibility.colorContrast) || 'black_on_white',\n language: normalizedQuestion.language,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n return omitBy(out, (v) => !v);\n } else {\n throw new Error('graph is undefined');\n }\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { correctResponse: answer } = question;\n\n resolve({\n answer,\n id: '1',\n });\n } else {\n 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 { graph, correctResponse } = model || {};\n const { maxMaxElements = 20, numberLineDimensions: { min: minWidth = 200, max: maxWidth = 800 } = {} } = config || {};\n const { width, domain, maxNumberOfPoints } = graph || {};\n const { min, max } = domain || {};\n const errors = {};\n\n ['teacherInstructions', 'prompt'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n if (width < minWidth || width > maxWidth) {\n errors.widthError = `Width should be a value between ${minWidth} and ${maxWidth}.`;\n }\n\n const MIN_DOMAIN = -100000;\n const MAX_DOMAIN = 100000;\n\n if (min < MIN_DOMAIN || min > MAX_DOMAIN || max < MIN_DOMAIN || max > MAX_DOMAIN) {\n errors.domainError = `Min and max values must both be in the range [${MIN_DOMAIN}, ${MAX_DOMAIN}].`;\n }\n\n if (min >= max) {\n errors.maxError = 'Max value must be greater than min value.';\n }\n\n if (maxNumberOfPoints < 1 || maxNumberOfPoints > maxMaxElements) {\n errors.pointsError = `Max number of elements should be between 1 and ${maxMaxElements}.`;\n }\n\n if (correctResponse && correctResponse.length === 0) {\n errors.correctResponseError = 'The correct answer should include at least one number line object.';\n }\n\n return errors;\n};\n"],"mappings":"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"}