@pie-element/math-templated 5.3.4-next.3 → 6.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,99 +1,50 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- var _typeof = require("@babel/runtime/helpers/typeof");
6
-
7
4
  Object.defineProperty(exports, "__esModule", {
8
5
  value: true
9
6
  });
10
7
  exports.validate = exports.prepareVal = exports.outcome = exports.normalizeSession = exports.model = exports.getPartialScore = exports.getCorrectness = exports.createDefaultModel = exports.createCorrectResponseSession = void 0;
11
-
12
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
-
14
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
15
-
16
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
-
18
8
  var _debug = _interopRequireDefault(require("debug"));
19
-
20
9
  var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
21
-
22
10
  var _translator = _interopRequireDefault(require("@pie-lib/translator"));
23
-
24
11
  var mv = _interopRequireWildcard(require("@pie-framework/math-validation"));
25
-
26
12
  var _defaults = _interopRequireDefault(require("./defaults"));
27
-
28
13
  var _controllerUtils = require("@pie-lib/controller-utils");
29
-
30
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
31
-
32
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
33
-
34
- function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
35
-
36
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
37
-
38
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
39
-
40
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
41
-
42
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
43
-
44
- var translator = _translator["default"].translator;
45
- var log = (0, _debug["default"])('@pie-element:math-templated:controller');
46
-
47
- var getFeedback = function getFeedback(value) {
48
- return value ? 'correct' : 'incorrect';
49
- };
50
-
51
- var getContent = function getContent(html) {
52
- return (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
53
- };
54
-
55
- var getIsAnswerCorrect = function getIsAnswerCorrect(correctResponse, answerItem) {
56
- var answerCorrect = false;
57
-
58
- var opts = _objectSpread({
59
- mode: correctResponse.validation || _defaults["default"].validationDefault
60
- }, correctResponse.validation === 'literal' && {
61
- literal: {
62
- allowTrailingZeros: correctResponse.allowTrailingZeros || false,
63
- ignoreOrder: correctResponse.ignoreOrder || false
64
- }
65
- });
66
-
14
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
15
+ const {
16
+ translator
17
+ } = _translator.default;
18
+ const log = (0, _debug.default)('@pie-element:math-templated:controller');
19
+ const getFeedback = value => value ? 'correct' : 'incorrect';
20
+ const getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
21
+ const getIsAnswerCorrect = (correctResponse, answerItem) => {
22
+ let answerCorrect = false;
23
+ const opts = {
24
+ mode: correctResponse.validation || _defaults.default.validationDefault,
25
+ ...(correctResponse.validation === 'literal' && {
26
+ literal: {
27
+ allowTrailingZeros: correctResponse.allowTrailingZeros || false,
28
+ ignoreOrder: correctResponse.ignoreOrder || false
29
+ }
30
+ })
31
+ };
67
32
  if (!answerCorrect) {
68
- var acceptedValues = [correctResponse.answer].concat((0, _toConsumableArray2["default"])(Object.values(correctResponse.alternates || {})));
69
-
33
+ const acceptedValues = [correctResponse.answer, ...Object.values(correctResponse.alternates || {})];
70
34
  try {
71
- var _iterator = _createForOfIteratorHelper(acceptedValues),
72
- _step;
73
-
74
- try {
75
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
76
- var value = _step.value;
77
- answerCorrect = mv.latexEqual(answerItem.value, value, opts);
78
- if (answerCorrect) break;
79
- }
80
- } catch (err) {
81
- _iterator.e(err);
82
- } finally {
83
- _iterator.f();
35
+ for (const value of acceptedValues) {
36
+ answerCorrect = mv.latexEqual(answerItem.value, value, opts);
37
+ if (answerCorrect) break;
84
38
  }
85
39
  } catch (e) {
86
40
  log('Parse failure when evaluating math', e, correctResponse, answerItem);
87
41
  answerCorrect = false;
88
42
  }
89
43
  }
90
-
91
44
  return answerCorrect;
92
45
  };
93
-
94
- var getResponseCorrectness = function getResponseCorrectness(question, sessionResponse) {
95
- var correctResponses = question.responses;
96
-
46
+ const getResponseCorrectness = (question, sessionResponse) => {
47
+ const correctResponses = question.responses;
97
48
  if (!sessionResponse) {
98
49
  return {
99
50
  correctness: 'unanswered',
@@ -101,21 +52,21 @@ var getResponseCorrectness = function getResponseCorrectness(question, sessionRe
101
52
  correct: false
102
53
  };
103
54
  } else {
104
- var correctAnswers = 0;
105
- var score = 0;
106
- var correctResponsesCount = Object.keys(correctResponses || {}).length;
107
- Object.keys(correctResponses).forEach(function (responseId) {
108
- var answerItem = sessionResponse['r' + responseId];
109
- var correctResponse = correctResponses[responseId] || {};
110
- var answerCorrect = getIsAnswerCorrect(correctResponse, answerItem);
111
-
55
+ let correctAnswers = 0;
56
+ let score = 0;
57
+ const correctResponsesCount = Object.keys(correctResponses || {}).length;
58
+ Object.keys(correctResponses).forEach(responseId => {
59
+ const answerItem = sessionResponse['r' + responseId];
60
+ const correctResponse = correctResponses[responseId] || {};
61
+ const answerCorrect = getIsAnswerCorrect(correctResponse, answerItem);
112
62
  if (answerCorrect) {
113
63
  correctAnswers++;
114
64
  }
115
65
  });
116
- var fullyCorrect = correctAnswers === correctResponsesCount; // partial credit scoring: each correct answer is worth 1 / total answers point
117
- // dichotomous scoring: for credit to be awarded, a correct answer must be entered for every response area
66
+ const fullyCorrect = correctAnswers === correctResponsesCount;
118
67
 
68
+ // partial credit scoring: each correct answer is worth 1 / total answers point
69
+ // dichotomous scoring: for credit to be awarded, a correct answer must be entered for every response area
119
70
  score = Number((correctAnswers / Object.keys(correctResponses).length).toFixed(2));
120
71
  return {
121
72
  correctness: getFeedback(fullyCorrect),
@@ -124,121 +75,102 @@ var getResponseCorrectness = function getResponseCorrectness(question, sessionRe
124
75
  };
125
76
  }
126
77
  };
127
-
128
- var getCorrectness = function getCorrectness(question, env, session) {
78
+ const getCorrectness = (question, env, session) => {
129
79
  if (env.mode === 'evaluate') {
130
80
  return getResponseCorrectness(question, session && session.answers);
131
81
  }
132
82
  };
133
-
134
83
  exports.getCorrectness = getCorrectness;
135
-
136
- var getPartialScore = function getPartialScore(question, session) {
137
- if (!session || (0, _isEmpty["default"])(session)) {
84
+ const getPartialScore = (question, session) => {
85
+ if (!session || (0, _isEmpty.default)(session)) {
138
86
  return 0;
139
87
  }
140
-
141
88
  return 1;
142
89
  };
143
-
144
90
  exports.getPartialScore = getPartialScore;
145
-
146
- var outcome = function outcome(question, session, env) {
147
- return new Promise(function (resolve) {
148
- if (!session || (0, _isEmpty["default"])(session)) {
149
- resolve({
150
- score: 0,
151
- empty: true
152
- });
153
- }
154
-
155
- var partialScoringEnabled = _controllerUtils.partialScoring.enabled(question, env);
156
-
157
- session = normalizeSession(session);
158
-
159
- if (env.mode !== 'evaluate') {
160
- resolve({
161
- score: undefined,
162
- completed: undefined
163
- });
164
- } else {
165
- var correctness = getCorrectness(question, env, session, true);
166
- var score = correctness.score;
167
- resolve({
168
- score: partialScoringEnabled ? score : score === 1 ? 1 : 0
169
- });
170
- }
171
- });
172
- };
173
-
91
+ const outcome = (question, session, env) => new Promise(resolve => {
92
+ if (!session || (0, _isEmpty.default)(session)) {
93
+ resolve({
94
+ score: 0,
95
+ empty: true
96
+ });
97
+ }
98
+ const partialScoringEnabled = _controllerUtils.partialScoring.enabled(question, env);
99
+ session = normalizeSession(session);
100
+ if (env.mode !== 'evaluate') {
101
+ resolve({
102
+ score: undefined,
103
+ completed: undefined
104
+ });
105
+ } else {
106
+ const correctness = getCorrectness(question, env, session, true);
107
+ const score = correctness.score;
108
+ resolve({
109
+ score: partialScoringEnabled ? score : score === 1 ? 1 : 0
110
+ });
111
+ }
112
+ });
174
113
  exports.outcome = outcome;
175
-
176
- var createDefaultModel = function createDefaultModel() {
177
- var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
178
- var validationDefault = model.validationDefault,
179
- allowTrailingZerosDefault = model.allowTrailingZerosDefault,
180
- ignoreOrderDefault = model.ignoreOrderDefault,
181
- _model$responses = model.responses,
182
- responses = _model$responses === void 0 ? {} : _model$responses;
183
- var updatedResponses = Object.keys(responses).reduce(function (acc, responseId) {
184
- var correctResponse = responses[responseId];
185
- acc[responseId] = _objectSpread(_objectSpread({}, correctResponse), {}, {
114
+ const createDefaultModel = (model = {}) => {
115
+ const {
116
+ validationDefault,
117
+ allowTrailingZerosDefault,
118
+ ignoreOrderDefault,
119
+ responses = {}
120
+ } = model;
121
+ const updatedResponses = Object.keys(responses).reduce((acc, responseId) => {
122
+ const correctResponse = responses[responseId];
123
+ acc[responseId] = {
124
+ ...correctResponse,
186
125
  validation: correctResponse.validation || validationDefault,
187
126
  allowTrailingZeros: correctResponse.allowTrailingZeros || allowTrailingZerosDefault,
188
127
  ignoreOrder: correctResponse.ignoreOrder || ignoreOrderDefault
189
- });
128
+ };
190
129
  return acc;
191
130
  }, {});
192
- return _objectSpread(_objectSpread(_objectSpread({}, _defaults["default"].model), model), {}, {
131
+ return {
132
+ ..._defaults.default.model,
133
+ ...model,
193
134
  responses: updatedResponses
194
- });
135
+ };
195
136
  };
196
-
197
137
  exports.createDefaultModel = createDefaultModel;
198
-
199
- var normalizeSession = function normalizeSession(s) {
200
- return _objectSpread({}, s);
201
- };
202
-
138
+ const normalizeSession = s => ({
139
+ ...s
140
+ });
203
141
  exports.normalizeSession = normalizeSession;
204
-
205
- var getTextFromHTML = function getTextFromHTML(html) {
206
- return (html || '').replace(/<\/?[^>]+(>|$)/g, '');
207
- };
208
-
209
- var prepareVal = function prepareVal(html) {
210
- return getTextFromHTML(html).trim();
211
- };
212
-
142
+ const getTextFromHTML = html => (html || '').replace(/<\/?[^>]+(>|$)/g, '');
143
+ const prepareVal = html => getTextFromHTML(html).trim();
213
144
  exports.prepareVal = prepareVal;
214
-
215
- var model = function model(question, session, env) {
216
- return new Promise(function (resolve) {
145
+ const model = (question, session, env) => {
146
+ return new Promise(resolve => {
217
147
  session = session || {};
218
- var normalizedQuestion = createDefaultModel(question);
219
- var correctness = getCorrectness(normalizedQuestion, env, session);
220
- var responses = normalizedQuestion.responses,
221
- language = normalizedQuestion.language;
222
- var note = normalizedQuestion.note;
223
- var showNote = false; // check if there is at least one alternate response or if the validation for at least one response is not literal
224
-
225
- Object.keys(responses).forEach(function (responseId) {
226
- var correctResponse = responses[responseId] || {};
227
-
148
+ const normalizedQuestion = createDefaultModel(question);
149
+ const correctness = getCorrectness(normalizedQuestion, env, session);
150
+ const {
151
+ responses,
152
+ language
153
+ } = normalizedQuestion;
154
+ let {
155
+ note
156
+ } = normalizedQuestion;
157
+ let showNote = false;
158
+
159
+ // check if there is at least one alternate response or if the validation for at least one response is not literal
160
+ Object.keys(responses).forEach(responseId => {
161
+ const correctResponse = responses[responseId] || {};
228
162
  if (correctResponse.alternates && Object.keys(correctResponse.alternates).length > 0) {
229
163
  showNote = true;
230
164
  } else if (correctResponse.validation !== 'literal') {
231
165
  showNote = true;
232
166
  }
233
167
  });
234
-
235
168
  if (!note) {
236
169
  note = translator.t('mathInline.primaryCorrectWithAlternates', {
237
170
  lng: language
238
171
  });
239
172
  }
240
-
241
- var out = {
173
+ const out = {
242
174
  prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
243
175
  markup: normalizedQuestion.markup,
244
176
  responses: env.mode === 'gather' ? null : normalizedQuestion.responses,
@@ -247,25 +179,21 @@ var model = function model(question, session, env) {
247
179
  customKeys: normalizedQuestion.customKeys,
248
180
  disabled: env.mode !== 'gather',
249
181
  view: env.mode === 'view',
250
- correctness: correctness,
251
- env: env,
182
+ correctness,
183
+ env,
252
184
  extraCSSRules: normalizedQuestion.extraCSSRules
253
185
  };
254
-
255
- var _ref = session || {},
256
- _ref$answers = _ref.answers,
257
- answers = _ref$answers === void 0 ? {} : _ref$answers;
258
-
259
- var feedback = {};
260
-
186
+ const {
187
+ answers = {}
188
+ } = session || {};
189
+ let feedback = {};
261
190
  if (env.mode === 'evaluate') {
262
- Object.keys(responses).forEach(function (responseId) {
263
- var answerItem = answers['r' + responseId];
264
- var correctResponse = responses[responseId];
191
+ Object.keys(responses).forEach(responseId => {
192
+ const answerItem = answers['r' + responseId];
193
+ const correctResponse = responses[responseId];
265
194
  feedback[responseId] = getIsAnswerCorrect(correctResponse, answerItem);
266
195
  });
267
196
  }
268
-
269
197
  if (env.mode === 'evaluate') {
270
198
  out.correctResponse = {};
271
199
  out.showNote = showNote;
@@ -275,7 +203,6 @@ var model = function model(question, session, env) {
275
203
  out.responses = {};
276
204
  out.showNote = false;
277
205
  }
278
-
279
206
  if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
280
207
  out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;
281
208
  out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
@@ -283,103 +210,80 @@ var model = function model(question, session, env) {
283
210
  out.rationale = null;
284
211
  out.teacherInstructions = null;
285
212
  }
286
-
287
213
  log('out: ', out);
288
214
  resolve(out);
289
215
  });
290
216
  };
291
-
292
217
  exports.model = model;
293
-
294
- var createCorrectResponseSession = function createCorrectResponseSession(question, env) {
295
- return new Promise(function (resolve) {
296
- if (env.mode !== 'evaluate' && env.role === 'instructor') {
297
- var correctResponse = Object.keys(question.responses).reduce(function (acc, responseId) {
298
- acc['r' + responseId] = {
299
- value: question.responses[responseId].answer
300
- };
301
- return acc;
302
- }, {});
303
- resolve({
304
- id: '1',
305
- answers: correctResponse
306
- });
307
- } else {
308
- resolve(null);
309
- }
310
- });
311
- };
312
-
218
+ const createCorrectResponseSession = (question, env) => new Promise(resolve => {
219
+ if (env.mode !== 'evaluate' && env.role === 'instructor') {
220
+ const correctResponse = Object.keys(question.responses).reduce((acc, responseId) => {
221
+ acc['r' + responseId] = {
222
+ value: question.responses[responseId].answer
223
+ };
224
+ return acc;
225
+ }, {});
226
+ resolve({
227
+ id: '1',
228
+ answers: correctResponse
229
+ });
230
+ } else {
231
+ resolve(null);
232
+ }
233
+ });
313
234
  exports.createCorrectResponseSession = createCorrectResponseSession;
314
-
315
- var validate = function validate() {
316
- var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
317
- var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
318
- var responses = model.responses,
319
- markup = model.markup;
320
- var maxResponseAreas = config.maxResponseAreas;
321
- var responsesErrors = {};
322
- var errors = {};
323
- ['teacherInstructions', 'prompt', 'rationale'].forEach(function (field) {
324
- var _config$field;
325
-
326
- if ((_config$field = config[field]) !== null && _config$field !== void 0 && _config$field.required && !getContent(model[field])) {
235
+ const validate = (model = {}, config = {}) => {
236
+ const {
237
+ responses,
238
+ markup
239
+ } = model;
240
+ const {
241
+ maxResponseAreas
242
+ } = config;
243
+ const responsesErrors = {};
244
+ const errors = {};
245
+ ['teacherInstructions', 'prompt', 'rationale'].forEach(field => {
246
+ if (config[field]?.required && !getContent(model[field])) {
327
247
  errors[field] = 'This field is required.';
328
248
  }
329
249
  });
330
- Object.entries(responses || {}).forEach(function (_ref2, index) {
331
- var _ref3 = (0, _slicedToArray2["default"])(_ref2, 2),
332
- key = _ref3[0],
333
- response = _ref3[1];
334
-
335
- var answer = response.answer;
336
- var reversedAlternates = (0, _toConsumableArray2["default"])(Object.entries(response.alternates || {})).reverse();
337
- var alternatesErrors = {};
338
- var responseError = {};
339
-
250
+ Object.entries(responses || {}).forEach(([key, response], index) => {
251
+ const {
252
+ answer
253
+ } = response;
254
+ const reversedAlternates = [...Object.entries(response.alternates || {})].reverse();
255
+ const alternatesErrors = {};
256
+ const responseError = {};
340
257
  if (answer === '') {
341
258
  responseError.answer = 'Content should not be empty.';
342
259
  }
343
-
344
- reversedAlternates.forEach(function (_ref4, index) {
345
- var _ref5 = (0, _slicedToArray2["default"])(_ref4, 2),
346
- key = _ref5[0],
347
- value = _ref5[1];
348
-
260
+ reversedAlternates.forEach(([key, value], index) => {
349
261
  if (value === '') {
350
262
  alternatesErrors[key] = 'Content should not be empty.';
351
263
  } else {
352
- var identicalAnswer = answer === value || reversedAlternates.slice(index + 1).some(function (_ref6) {
353
- var _ref7 = (0, _slicedToArray2["default"])(_ref6, 2),
354
- val = _ref7[1];
355
-
356
- return val === value;
357
- });
358
-
264
+ const identicalAnswer = answer === value || reversedAlternates.slice(index + 1).some(([, val]) => val === value);
359
265
  if (identicalAnswer) {
360
266
  alternatesErrors[key] = 'Content should be unique.';
361
267
  }
362
268
  }
363
269
  });
364
-
365
- if (!(0, _isEmpty["default"])(responseError) || !(0, _isEmpty["default"])(alternatesErrors)) {
366
- responsesErrors[index] = _objectSpread(_objectSpread({}, responseError), alternatesErrors);
270
+ if (!(0, _isEmpty.default)(responseError) || !(0, _isEmpty.default)(alternatesErrors)) {
271
+ responsesErrors[index] = {
272
+ ...responseError,
273
+ ...alternatesErrors
274
+ };
367
275
  }
368
276
  });
369
- var nbOfResponseAreas = (markup.match(/\{\{(\d+)\}\}/g) || []).length;
370
-
277
+ const nbOfResponseAreas = (markup.match(/\{\{(\d+)\}\}/g) || []).length;
371
278
  if (nbOfResponseAreas > maxResponseAreas) {
372
- errors.responseAreas = "No more than ".concat(maxResponseAreas, " response areas should be defined.");
279
+ errors.responseAreas = `No more than ${maxResponseAreas} response areas should be defined.`;
373
280
  } else if (nbOfResponseAreas < 1) {
374
281
  errors.responseAreas = 'There should be at least 1 response area defined.';
375
282
  }
376
-
377
- if (!(0, _isEmpty["default"])(responsesErrors)) {
283
+ if (!(0, _isEmpty.default)(responsesErrors)) {
378
284
  errors.responses = responsesErrors;
379
285
  }
380
-
381
286
  return errors;
382
287
  };
383
-
384
288
  exports.validate = validate;
385
289
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["translator","Translator","log","getFeedback","value","getContent","html","replace","getIsAnswerCorrect","correctResponse","answerItem","answerCorrect","opts","mode","validation","defaults","validationDefault","literal","allowTrailingZeros","ignoreOrder","acceptedValues","answer","Object","values","alternates","mv","latexEqual","e","getResponseCorrectness","question","sessionResponse","correctResponses","responses","correctness","score","correct","correctAnswers","correctResponsesCount","keys","length","forEach","responseId","fullyCorrect","Number","toFixed","getCorrectness","env","session","answers","getPartialScore","outcome","Promise","resolve","empty","partialScoringEnabled","partialScoring","enabled","normalizeSession","undefined","completed","createDefaultModel","model","allowTrailingZerosDefault","ignoreOrderDefault","updatedResponses","reduce","acc","s","getTextFromHTML","prepareVal","trim","normalizedQuestion","language","note","showNote","t","lng","out","prompt","promptEnabled","markup","equationEditor","customKeys","disabled","view","extraCSSRules","feedback","role","rationale","rationaleEnabled","teacherInstructions","teacherInstructionsEnabled","createCorrectResponseSession","id","validate","config","maxResponseAreas","responsesErrors","errors","field","required","entries","index","key","response","reversedAlternates","reverse","alternatesErrors","responseError","identicalAnswer","slice","some","val","nbOfResponseAreas","match","responseAreas"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport Translator from '@pie-lib/translator';\nimport * as mv from '@pie-framework/math-validation';\n\nimport defaults from './defaults';\nimport { partialScoring } from '@pie-lib/controller-utils';\n\nconst { translator } = Translator;\nconst log = debug('@pie-element:math-templated:controller');\n\nconst getFeedback = (value) => (value ? 'correct' : 'incorrect');\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nconst getIsAnswerCorrect = (correctResponse, answerItem) => {\n let answerCorrect = false;\n\n const opts = {\n mode: correctResponse.validation || defaults.validationDefault,\n ...(correctResponse.validation === 'literal' && {\n literal: {\n allowTrailingZeros: correctResponse.allowTrailingZeros || false,\n ignoreOrder: correctResponse.ignoreOrder || false,\n },\n }),\n };\n\n if (!answerCorrect) {\n const acceptedValues = [correctResponse.answer, ...Object.values(correctResponse.alternates || {})];\n\n try {\n for (const value of acceptedValues) {\n answerCorrect = mv.latexEqual(answerItem.value, value, opts);\n if (answerCorrect) break;\n }\n } catch (e) {\n log('Parse failure when evaluating math', e, correctResponse, answerItem);\n answerCorrect = false;\n }\n }\n\n return answerCorrect;\n};\n\nconst getResponseCorrectness = (question, sessionResponse) => {\n const correctResponses = question.responses;\n\n if (!sessionResponse) {\n return {\n correctness: 'unanswered',\n score: 0,\n correct: false,\n };\n } else {\n let correctAnswers = 0;\n let score = 0;\n const correctResponsesCount = Object.keys(correctResponses || {}).length;\n\n Object.keys(correctResponses).forEach((responseId) => {\n const answerItem = sessionResponse['r' + responseId];\n const correctResponse = correctResponses[responseId] || {};\n\n const answerCorrect = getIsAnswerCorrect(correctResponse, answerItem);\n if (answerCorrect) {\n correctAnswers++;\n }\n });\n\n const fullyCorrect = correctAnswers === correctResponsesCount;\n\n // partial credit scoring: each correct answer is worth 1 / total answers point\n // dichotomous scoring: for credit to be awarded, a correct answer must be entered for every response area\n score = Number((correctAnswers / Object.keys(correctResponses).length).toFixed(2));\n\n return {\n correctness: getFeedback(fullyCorrect),\n score: correctAnswers > 0 ? score : 0,\n correct: fullyCorrect,\n };\n }\n};\n\nexport const getCorrectness = (question, env, session) => {\n if (env.mode === 'evaluate') {\n return getResponseCorrectness(question, session && session.answers);\n }\n};\n\nexport const getPartialScore = (question, session) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n return 1;\n};\n\nexport const outcome = (question, session, env) =>\n new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n const partialScoringEnabled = partialScoring.enabled(question, env);\n session = normalizeSession(session);\n\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n const correctness = getCorrectness(question, env, session, true);\n const score = correctness.score;\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0 });\n }\n });\n\nexport const createDefaultModel = (model = {}) => {\n const { validationDefault, allowTrailingZerosDefault, ignoreOrderDefault, responses = {} } = model;\n\n const updatedResponses = Object.keys(responses).reduce((acc, responseId) => {\n const correctResponse = responses[responseId];\n\n acc[responseId] = {\n ...correctResponse,\n validation: correctResponse.validation || validationDefault,\n allowTrailingZeros: correctResponse.allowTrailingZeros || allowTrailingZerosDefault,\n ignoreOrder: correctResponse.ignoreOrder || ignoreOrderDefault,\n };\n\n return acc;\n }, {});\n\n return {\n ...defaults.model,\n ...model,\n responses: updatedResponses,\n };\n};\n\nexport const normalizeSession = (s) => ({ ...s });\n\nconst getTextFromHTML = (html) => (html || '').replace(/<\\/?[^>]+(>|$)/g, '');\n\nexport const prepareVal = (html) => getTextFromHTML(html).trim();\n\nexport const model = (question, session, env) => {\n return new Promise((resolve) => {\n session = session || {};\n const normalizedQuestion = createDefaultModel(question);\n const correctness = getCorrectness(normalizedQuestion, env, session);\n const { responses, language } = normalizedQuestion;\n let { note } = normalizedQuestion;\n let showNote = false;\n\n // check if there is at least one alternate response or if the validation for at least one response is not literal\n Object.keys(responses).forEach((responseId) => {\n const correctResponse = responses[responseId] || {};\n if (correctResponse.alternates && Object.keys(correctResponse.alternates).length > 0) {\n showNote = true;\n } else if (correctResponse.validation !== 'literal') {\n showNote = true;\n }\n });\n\n if (!note) {\n note = translator.t('mathInline.primaryCorrectWithAlternates', { lng: language });\n }\n\n const out = {\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n markup: normalizedQuestion.markup,\n responses: env.mode === 'gather' ? null : normalizedQuestion.responses,\n language: normalizedQuestion.language,\n equationEditor: normalizedQuestion.equationEditor,\n customKeys: normalizedQuestion.customKeys,\n disabled: env.mode !== 'gather',\n view: env.mode === 'view',\n correctness,\n env,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n const { answers = {} } = session || {};\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n Object.keys(responses).forEach((responseId) => {\n const answerItem = answers['r' + responseId];\n const correctResponse = responses[responseId];\n feedback[responseId] = getIsAnswerCorrect(correctResponse, answerItem);\n });\n }\n\n if (env.mode === 'evaluate') {\n out.correctResponse = {};\n out.showNote = showNote;\n out.note = note;\n out.feedback = feedback;\n } else {\n out.responses = {};\n out.showNote = false;\n }\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n log('out: ', out);\n resolve(out);\n });\n};\n\nexport const createCorrectResponseSession = (question, env) =>\n new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const correctResponse = Object.keys(question.responses).reduce((acc, responseId) => {\n acc['r' + responseId] = { value: question.responses[responseId].answer };\n return acc;\n }, {});\n\n resolve({ id: '1', answers: correctResponse });\n } else {\n resolve(null);\n }\n });\n\nexport const validate = (model = {}, config = {}) => {\n const { responses, markup } = model;\n const { maxResponseAreas } = config;\n const responsesErrors = {};\n const errors = {};\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 Object.entries(responses || {}).forEach(([key, response], index) => {\n const { answer } = response;\n const reversedAlternates = [...Object.entries(response.alternates || {})].reverse();\n const alternatesErrors = {};\n const responseError = {};\n\n if (answer === '') {\n responseError.answer = 'Content should not be empty.';\n }\n\n reversedAlternates.forEach(([key, value], index) => {\n if (value === '') {\n alternatesErrors[key] = 'Content should not be empty.';\n } else {\n const identicalAnswer =\n answer === value || reversedAlternates.slice(index + 1).some(([, val]) => val === value);\n\n if (identicalAnswer) {\n alternatesErrors[key] = 'Content should be unique.';\n }\n }\n });\n\n if (!isEmpty(responseError) || !isEmpty(alternatesErrors)) {\n responsesErrors[index] = { ...responseError, ...alternatesErrors };\n }\n });\n\n const nbOfResponseAreas = (markup.match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreas = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreas = 'There should be at least 1 response area defined.';\n }\n\n if (!isEmpty(responsesErrors)) {\n errors.responses = responsesErrors;\n }\n\n return errors;\n};\n"],"file":"index.js"}
1
+ {"version":3,"file":"index.js","names":["_debug","_interopRequireDefault","require","_isEmpty","_translator","mv","_interopRequireWildcard","_defaults","_controllerUtils","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","translator","Translator","log","debug","getFeedback","value","getContent","html","replace","getIsAnswerCorrect","correctResponse","answerItem","answerCorrect","opts","mode","validation","defaults","validationDefault","literal","allowTrailingZeros","ignoreOrder","acceptedValues","answer","values","alternates","latexEqual","getResponseCorrectness","question","sessionResponse","correctResponses","responses","correctness","score","correct","correctAnswers","correctResponsesCount","keys","length","forEach","responseId","fullyCorrect","Number","toFixed","getCorrectness","env","session","answers","exports","getPartialScore","isEmpty","outcome","Promise","resolve","empty","partialScoringEnabled","partialScoring","enabled","normalizeSession","undefined","completed","createDefaultModel","model","allowTrailingZerosDefault","ignoreOrderDefault","updatedResponses","reduce","acc","s","getTextFromHTML","prepareVal","trim","normalizedQuestion","language","note","showNote","lng","out","prompt","promptEnabled","markup","equationEditor","customKeys","disabled","view","extraCSSRules","feedback","role","rationale","rationaleEnabled","teacherInstructions","teacherInstructionsEnabled","createCorrectResponseSession","id","validate","config","maxResponseAreas","responsesErrors","errors","field","required","entries","key","response","index","reversedAlternates","reverse","alternatesErrors","responseError","identicalAnswer","slice","some","val","nbOfResponseAreas","match","responseAreas"],"sources":["../src/index.js"],"sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport Translator from '@pie-lib/translator';\nimport * as mv from '@pie-framework/math-validation';\n\nimport defaults from './defaults';\nimport { partialScoring } from '@pie-lib/controller-utils';\n\nconst { translator } = Translator;\nconst log = debug('@pie-element:math-templated:controller');\n\nconst getFeedback = (value) => (value ? 'correct' : 'incorrect');\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nconst getIsAnswerCorrect = (correctResponse, answerItem) => {\n let answerCorrect = false;\n\n const opts = {\n mode: correctResponse.validation || defaults.validationDefault,\n ...(correctResponse.validation === 'literal' && {\n literal: {\n allowTrailingZeros: correctResponse.allowTrailingZeros || false,\n ignoreOrder: correctResponse.ignoreOrder || false,\n },\n }),\n };\n\n if (!answerCorrect) {\n const acceptedValues = [correctResponse.answer, ...Object.values(correctResponse.alternates || {})];\n\n try {\n for (const value of acceptedValues) {\n answerCorrect = mv.latexEqual(answerItem.value, value, opts);\n if (answerCorrect) break;\n }\n } catch (e) {\n log('Parse failure when evaluating math', e, correctResponse, answerItem);\n answerCorrect = false;\n }\n }\n\n return answerCorrect;\n};\n\nconst getResponseCorrectness = (question, sessionResponse) => {\n const correctResponses = question.responses;\n\n if (!sessionResponse) {\n return {\n correctness: 'unanswered',\n score: 0,\n correct: false,\n };\n } else {\n let correctAnswers = 0;\n let score = 0;\n const correctResponsesCount = Object.keys(correctResponses || {}).length;\n\n Object.keys(correctResponses).forEach((responseId) => {\n const answerItem = sessionResponse['r' + responseId];\n const correctResponse = correctResponses[responseId] || {};\n\n const answerCorrect = getIsAnswerCorrect(correctResponse, answerItem);\n if (answerCorrect) {\n correctAnswers++;\n }\n });\n\n const fullyCorrect = correctAnswers === correctResponsesCount;\n\n // partial credit scoring: each correct answer is worth 1 / total answers point\n // dichotomous scoring: for credit to be awarded, a correct answer must be entered for every response area\n score = Number((correctAnswers / Object.keys(correctResponses).length).toFixed(2));\n\n return {\n correctness: getFeedback(fullyCorrect),\n score: correctAnswers > 0 ? score : 0,\n correct: fullyCorrect,\n };\n }\n};\n\nexport const getCorrectness = (question, env, session) => {\n if (env.mode === 'evaluate') {\n return getResponseCorrectness(question, session && session.answers);\n }\n};\n\nexport const getPartialScore = (question, session) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n return 1;\n};\n\nexport const outcome = (question, session, env) =>\n new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n const partialScoringEnabled = partialScoring.enabled(question, env);\n session = normalizeSession(session);\n\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n const correctness = getCorrectness(question, env, session, true);\n const score = correctness.score;\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0 });\n }\n });\n\nexport const createDefaultModel = (model = {}) => {\n const { validationDefault, allowTrailingZerosDefault, ignoreOrderDefault, responses = {} } = model;\n\n const updatedResponses = Object.keys(responses).reduce((acc, responseId) => {\n const correctResponse = responses[responseId];\n\n acc[responseId] = {\n ...correctResponse,\n validation: correctResponse.validation || validationDefault,\n allowTrailingZeros: correctResponse.allowTrailingZeros || allowTrailingZerosDefault,\n ignoreOrder: correctResponse.ignoreOrder || ignoreOrderDefault,\n };\n\n return acc;\n }, {});\n\n return {\n ...defaults.model,\n ...model,\n responses: updatedResponses,\n };\n};\n\nexport const normalizeSession = (s) => ({ ...s });\n\nconst getTextFromHTML = (html) => (html || '').replace(/<\\/?[^>]+(>|$)/g, '');\n\nexport const prepareVal = (html) => getTextFromHTML(html).trim();\n\nexport const model = (question, session, env) => {\n return new Promise((resolve) => {\n session = session || {};\n const normalizedQuestion = createDefaultModel(question);\n const correctness = getCorrectness(normalizedQuestion, env, session);\n const { responses, language } = normalizedQuestion;\n let { note } = normalizedQuestion;\n let showNote = false;\n\n // check if there is at least one alternate response or if the validation for at least one response is not literal\n Object.keys(responses).forEach((responseId) => {\n const correctResponse = responses[responseId] || {};\n if (correctResponse.alternates && Object.keys(correctResponse.alternates).length > 0) {\n showNote = true;\n } else if (correctResponse.validation !== 'literal') {\n showNote = true;\n }\n });\n\n if (!note) {\n note = translator.t('mathInline.primaryCorrectWithAlternates', { lng: language });\n }\n\n const out = {\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n markup: normalizedQuestion.markup,\n responses: env.mode === 'gather' ? null : normalizedQuestion.responses,\n language: normalizedQuestion.language,\n equationEditor: normalizedQuestion.equationEditor,\n customKeys: normalizedQuestion.customKeys,\n disabled: env.mode !== 'gather',\n view: env.mode === 'view',\n correctness,\n env,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n const { answers = {} } = session || {};\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n Object.keys(responses).forEach((responseId) => {\n const answerItem = answers['r' + responseId];\n const correctResponse = responses[responseId];\n feedback[responseId] = getIsAnswerCorrect(correctResponse, answerItem);\n });\n }\n\n if (env.mode === 'evaluate') {\n out.correctResponse = {};\n out.showNote = showNote;\n out.note = note;\n out.feedback = feedback;\n } else {\n out.responses = {};\n out.showNote = false;\n }\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n log('out: ', out);\n resolve(out);\n });\n};\n\nexport const createCorrectResponseSession = (question, env) =>\n new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const correctResponse = Object.keys(question.responses).reduce((acc, responseId) => {\n acc['r' + responseId] = { value: question.responses[responseId].answer };\n return acc;\n }, {});\n\n resolve({ id: '1', answers: correctResponse });\n } else {\n resolve(null);\n }\n });\n\nexport const validate = (model = {}, config = {}) => {\n const { responses, markup } = model;\n const { maxResponseAreas } = config;\n const responsesErrors = {};\n const errors = {};\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 Object.entries(responses || {}).forEach(([key, response], index) => {\n const { answer } = response;\n const reversedAlternates = [...Object.entries(response.alternates || {})].reverse();\n const alternatesErrors = {};\n const responseError = {};\n\n if (answer === '') {\n responseError.answer = 'Content should not be empty.';\n }\n\n reversedAlternates.forEach(([key, value], index) => {\n if (value === '') {\n alternatesErrors[key] = 'Content should not be empty.';\n } else {\n const identicalAnswer =\n answer === value || reversedAlternates.slice(index + 1).some(([, val]) => val === value);\n\n if (identicalAnswer) {\n alternatesErrors[key] = 'Content should be unique.';\n }\n }\n });\n\n if (!isEmpty(responseError) || !isEmpty(alternatesErrors)) {\n responsesErrors[index] = { ...responseError, ...alternatesErrors };\n }\n });\n\n const nbOfResponseAreas = (markup.match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreas = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreas = 'There should be at least 1 response area defined.';\n }\n\n if (!isEmpty(responsesErrors)) {\n errors.responses = responsesErrors;\n }\n\n return errors;\n};\n"],"mappings":"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","ignoreList":[]}