@intellectif/lk-core 1.1.0 → 1.2.0

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.
Files changed (64) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +2 -1
  3. package/dist/{activity-MBOYLBjR.d.cts → activity-D705CXng.d.cts} +324 -2
  4. package/dist/{activity-MBOYLBjR.d.ts → activity-D705CXng.d.ts} +324 -2
  5. package/dist/ai-check.cjs +174 -12
  6. package/dist/ai-check.cjs.map +1 -1
  7. package/dist/ai-check.d.cts +15 -3
  8. package/dist/ai-check.d.ts +15 -3
  9. package/dist/ai-check.js +166 -4
  10. package/dist/ai-check.js.map +1 -1
  11. package/dist/{chunk-TJJFKKH2.cjs → chunk-46BXIGLG.cjs} +4 -4
  12. package/dist/{chunk-TJJFKKH2.cjs.map → chunk-46BXIGLG.cjs.map} +1 -1
  13. package/dist/{chunk-VSH7ECQL.cjs → chunk-4YANYTFN.cjs} +43 -43
  14. package/dist/{chunk-VSH7ECQL.cjs.map → chunk-4YANYTFN.cjs.map} +1 -1
  15. package/dist/chunk-7KOWU4RO.js +2207 -0
  16. package/dist/chunk-7KOWU4RO.js.map +1 -0
  17. package/dist/{chunk-DSDXL3JO.cjs → chunk-7THXD7AN.cjs} +657 -197
  18. package/dist/chunk-7THXD7AN.cjs.map +1 -0
  19. package/dist/chunk-CYCTIXUN.cjs +118 -0
  20. package/dist/chunk-CYCTIXUN.cjs.map +1 -0
  21. package/dist/chunk-CYPA5BW5.js +118 -0
  22. package/dist/chunk-CYPA5BW5.js.map +1 -0
  23. package/dist/{chunk-SJVRUPJT.js → chunk-JTNDIBZO.js} +2 -2
  24. package/dist/{chunk-XS6U2ARZ.js → chunk-MV2N2WNS.js} +6 -112
  25. package/dist/chunk-MV2N2WNS.js.map +1 -0
  26. package/dist/chunk-MXI26H62.cjs +2207 -0
  27. package/dist/chunk-MXI26H62.cjs.map +1 -0
  28. package/dist/{chunk-FBKTION6.js → chunk-QS7B42ZR.js} +640 -180
  29. package/dist/chunk-QS7B42ZR.js.map +1 -0
  30. package/dist/{chunk-IARLJ5MW.js → chunk-QX2ERL72.js} +2 -2
  31. package/dist/{chunk-2JT2WUQ2.cjs → chunk-ZWXQSKCX.cjs} +14 -120
  32. package/dist/chunk-ZWXQSKCX.cjs.map +1 -0
  33. package/dist/{index-DlcqkM_L.d.ts → index-BChYtrEe.d.ts} +1 -1
  34. package/dist/{index-DlCW0XaQ.d.cts → index-VXt_v3YI.d.cts} +1 -1
  35. package/dist/index.cjs +68 -593
  36. package/dist/index.cjs.map +1 -1
  37. package/dist/index.d.cts +245 -60
  38. package/dist/index.d.ts +245 -60
  39. package/dist/index.js +68 -593
  40. package/dist/index.js.map +1 -1
  41. package/dist/schemas.cjs +5 -3
  42. package/dist/schemas.cjs.map +1 -1
  43. package/dist/schemas.d.cts +2 -2
  44. package/dist/schemas.d.ts +2 -2
  45. package/dist/schemas.js +5 -3
  46. package/dist/scoring.cjs +3 -3
  47. package/dist/scoring.d.cts +2 -2
  48. package/dist/scoring.d.ts +2 -2
  49. package/dist/scoring.js +2 -2
  50. package/dist/xapi.cjs +3 -3
  51. package/dist/xapi.d.cts +1 -1
  52. package/dist/xapi.d.ts +1 -1
  53. package/dist/xapi.js +2 -2
  54. package/package.json +1 -1
  55. package/dist/chunk-2JT2WUQ2.cjs.map +0 -1
  56. package/dist/chunk-DSDXL3JO.cjs.map +0 -1
  57. package/dist/chunk-FBKTION6.js.map +0 -1
  58. package/dist/chunk-LDFQUZII.cjs +0 -950
  59. package/dist/chunk-LDFQUZII.cjs.map +0 -1
  60. package/dist/chunk-NQHETFDA.js +0 -950
  61. package/dist/chunk-NQHETFDA.js.map +0 -1
  62. package/dist/chunk-XS6U2ARZ.js.map +0 -1
  63. /package/dist/{chunk-SJVRUPJT.js.map → chunk-JTNDIBZO.js.map} +0 -0
  64. /package/dist/{chunk-IARLJ5MW.js.map → chunk-QX2ERL72.js.map} +0 -0
@@ -15,7 +15,7 @@
15
15
 
16
16
 
17
17
 
18
- var _chunkDSDXL3JOcjs = require('./chunk-DSDXL3JO.cjs');
18
+ var _chunk7THXD7ANcjs = require('./chunk-7THXD7AN.cjs');
19
19
 
20
20
  // src/is-redacted.ts
21
21
  function isRedacted(data) {
@@ -451,12 +451,12 @@ function composeAssessmentScore(sections, policy) {
451
451
  function diffDictationChars(reference, attempt) {
452
452
  const referencePoints = Array.from(reference);
453
453
  const attemptPoints = Array.from(attempt);
454
- return _chunkDSDXL3JOcjs.alignSequences.call(void 0, referencePoints, attemptPoints).map(
454
+ return _chunk7THXD7ANcjs.alignSequences.call(void 0, referencePoints, attemptPoints).map(
455
455
  ({ step, referenceIndex, attemptIndex }) => {
456
- if (step === _chunkDSDXL3JOcjs.STEP.missing) {
456
+ if (step === _chunk7THXD7ANcjs.STEP.missing) {
457
457
  return { op: "missing", reference: referencePoints[referenceIndex], attempt: "" };
458
458
  }
459
- if (step === _chunkDSDXL3JOcjs.STEP.extra) {
459
+ if (step === _chunk7THXD7ANcjs.STEP.extra) {
460
460
  return { op: "extra", reference: "", attempt: attemptPoints[attemptIndex] };
461
461
  }
462
462
  const referencePoint = referencePoints[referenceIndex];
@@ -478,14 +478,14 @@ function heardTokens(words) {
478
478
  const tokens = [];
479
479
  let length = 0;
480
480
  for (const [wordIndex, word] of words.entries()) {
481
- const normalized = _chunkDSDXL3JOcjs.normalizeDictationText.call(void 0, word.text);
481
+ const normalized = _chunk7THXD7ANcjs.normalizeDictationText.call(void 0, word.text);
482
482
  if (normalized === "") {
483
483
  continue;
484
484
  }
485
485
  const inserted = word.error === "insertion";
486
486
  for (const text of normalized.split(" ")) {
487
- length += _chunkDSDXL3JOcjs.codePointLength.call(void 0, text) + (length === 0 ? 0 : 1);
488
- if (!inserted && length <= _chunkDSDXL3JOcjs.SPEECH_ASSESSMENT_MAX_TEXT_LENGTH) {
487
+ length += _chunk7THXD7ANcjs.codePointLength.call(void 0, text) + (length === 0 ? 0 : 1);
488
+ if (!inserted && length <= _chunk7THXD7ANcjs.SPEECH_ASSESSMENT_MAX_TEXT_LENGTH) {
489
489
  tokens.push({ text, wordIndex });
490
490
  }
491
491
  }
@@ -498,28 +498,28 @@ var Score = _v4.z.number().min(0).max(100);
498
498
  var Confidence = _v4.z.number().min(0).max(1);
499
499
  var Milliseconds = _v4.z.number().min(0);
500
500
  var PhonemeCandidateSchema = _v4.z.strictObject({
501
- symbol: _chunkDSDXL3JOcjs.maxUnits.call(void 0, _v4.z.string().min(1), 16),
501
+ symbol: _chunk7THXD7ANcjs.maxUnits.call(void 0, _v4.z.string().min(1), 16),
502
502
  score: Score
503
503
  });
504
504
  var PhonemeSchema = _v4.z.strictObject({
505
- symbol: _chunkDSDXL3JOcjs.maxUnits.call(void 0, _v4.z.string().min(1), 16).optional(),
505
+ symbol: _chunk7THXD7ANcjs.maxUnits.call(void 0, _v4.z.string().min(1), 16).optional(),
506
506
  accuracy: Score.optional(),
507
507
  startMs: Milliseconds.optional(),
508
508
  durationMs: Milliseconds.optional(),
509
509
  heardAs: _v4.z.array(PhonemeCandidateSchema).max(10).optional()
510
510
  });
511
511
  var SyllableSchema = _v4.z.strictObject({
512
- text: _chunkDSDXL3JOcjs.maxUnits.call(void 0, _v4.z.string().min(1), 64),
513
- grapheme: _chunkDSDXL3JOcjs.maxUnits.call(void 0, _v4.z.string(), 64).optional(),
512
+ text: _chunk7THXD7ANcjs.maxUnits.call(void 0, _v4.z.string().min(1), 64),
513
+ grapheme: _chunk7THXD7ANcjs.maxUnits.call(void 0, _v4.z.string(), 64).optional(),
514
514
  accuracy: Score.optional(),
515
515
  startMs: Milliseconds.optional(),
516
516
  durationMs: Milliseconds.optional()
517
517
  });
518
518
  var WordSchema = _v4.z.strictObject({
519
- text: _chunkDSDXL3JOcjs.maxUnits.call(void 0, _v4.z.string().min(1), 200),
519
+ text: _chunk7THXD7ANcjs.maxUnits.call(void 0, _v4.z.string().min(1), 200),
520
520
  accuracy: Score.optional(),
521
521
  error: _v4.z.enum(["none", "mispronunciation", "omission", "insertion"]),
522
- vendorError: _chunkDSDXL3JOcjs.maxUnits.call(void 0, _v4.z.string(), 64).optional(),
522
+ vendorError: _chunk7THXD7ANcjs.maxUnits.call(void 0, _v4.z.string(), 64).optional(),
523
523
  startMs: Milliseconds.optional(),
524
524
  durationMs: Milliseconds.optional(),
525
525
  syllables: _v4.z.array(SyllableSchema).max(50).optional(),
@@ -528,17 +528,17 @@ var WordSchema = _v4.z.strictObject({
528
528
  });
529
529
  var AssessorSchema = _v4.z.strictObject({
530
530
  kind: _v4.z.enum(["auto", "ai", "human"]),
531
- id: _chunkDSDXL3JOcjs.maxUnits.call(void 0, _v4.z.string(), 256).optional(),
532
- model: _chunkDSDXL3JOcjs.maxUnits.call(void 0, _v4.z.string(), 256).optional(),
533
- promptHash: _chunkDSDXL3JOcjs.maxUnits.call(void 0, _v4.z.string(), 256).optional()
531
+ id: _chunk7THXD7ANcjs.maxUnits.call(void 0, _v4.z.string(), 256).optional(),
532
+ model: _chunk7THXD7ANcjs.maxUnits.call(void 0, _v4.z.string(), 256).optional(),
533
+ promptHash: _chunk7THXD7ANcjs.maxUnits.call(void 0, _v4.z.string(), 256).optional()
534
534
  });
535
535
  var SpeechAssessmentSchema = _v4.z.strictObject({
536
536
  assessmentVersion: _v4.z.literal("1.0"),
537
537
  status: _v4.z.enum(["assessed", "no_speech"]),
538
538
  task: _v4.z.enum(["scripted", "unscripted"]),
539
- locale: _v4.z.string().regex(_chunkDSDXL3JOcjs.CANONICAL_LOCALE_RE),
540
- referenceText: _chunkDSDXL3JOcjs.maxUnits.call(void 0, _v4.z.string(), 8e3).optional(),
541
- recordingKey: _chunkDSDXL3JOcjs.maxUnits.call(void 0, _v4.z.string().min(1), 1024).optional(),
539
+ locale: _v4.z.string().regex(_chunk7THXD7ANcjs.CANONICAL_LOCALE_RE),
540
+ referenceText: _chunk7THXD7ANcjs.maxUnits.call(void 0, _v4.z.string(), 8e3).optional(),
541
+ recordingKey: _chunk7THXD7ANcjs.maxUnits.call(void 0, _v4.z.string().min(1), 1024).optional(),
542
542
  assessor: AssessorSchema,
543
543
  scale: _v4.z.literal(100),
544
544
  scores: _v4.z.strictObject({
@@ -548,10 +548,10 @@ var SpeechAssessmentSchema = _v4.z.strictObject({
548
548
  prosody: Score.optional(),
549
549
  overall: Score.optional()
550
550
  }),
551
- recognizedText: _chunkDSDXL3JOcjs.maxUnits.call(void 0, _v4.z.string(), 8e3).optional(),
551
+ recognizedText: _chunk7THXD7ANcjs.maxUnits.call(void 0, _v4.z.string(), 8e3).optional(),
552
552
  miscue: _v4.z.enum(["assessor", "none"]),
553
553
  phonemeAlphabet: _v4.z.enum(["ipa", "sapi"]).optional(),
554
- words: _v4.z.array(WordSchema).max(_chunkDSDXL3JOcjs.SPEECH_ASSESSMENT_MAX_WORDS),
554
+ words: _v4.z.array(WordSchema).max(_chunk7THXD7ANcjs.SPEECH_ASSESSMENT_MAX_WORDS),
555
555
  prosody: _v4.z.strictObject({ monotoneConfidence: Confidence.optional() }).optional(),
556
556
  signal: _v4.z.strictObject({ snrDb: _v4.z.number().optional() }).optional()
557
557
  });
@@ -573,21 +573,21 @@ function rawTextLength(words) {
573
573
  }
574
574
  function totalTextErrors(words) {
575
575
  const raw = rawTextLength(words);
576
- if (raw > _chunkDSDXL3JOcjs.SPEECH_ASSESSMENT_MAX_TEXT_LENGTH) {
576
+ if (raw > _chunk7THXD7ANcjs.SPEECH_ASSESSMENT_MAX_TEXT_LENGTH) {
577
577
  return [
578
578
  {
579
579
  path: ["words"],
580
- message: `The words of an assessment carry ${raw} characters between them, and at most ${_chunkDSDXL3JOcjs.SPEECH_ASSESSMENT_MAX_TEXT_LENGTH} can be aligned against the text of an item.`,
580
+ message: `The words of an assessment carry ${raw} characters between them, and at most ${_chunk7THXD7ANcjs.SPEECH_ASSESSMENT_MAX_TEXT_LENGTH} can be aligned against the text of an item.`,
581
581
  code: "too_big"
582
582
  }
583
583
  ];
584
584
  }
585
585
  const normalized = heardTokens(words).length;
586
- if (normalized > _chunkDSDXL3JOcjs.SPEECH_ASSESSMENT_MAX_TEXT_LENGTH) {
586
+ if (normalized > _chunk7THXD7ANcjs.SPEECH_ASSESSMENT_MAX_TEXT_LENGTH) {
587
587
  return [
588
588
  {
589
589
  path: ["words"],
590
- message: `The words of an assessment spell ${normalized} characters between them once they are normalised, and at most ${_chunkDSDXL3JOcjs.SPEECH_ASSESSMENT_MAX_TEXT_LENGTH} can be aligned against the text of an item. One character can stand for several.`,
590
+ message: `The words of an assessment spell ${normalized} characters between them once they are normalised, and at most ${_chunk7THXD7ANcjs.SPEECH_ASSESSMENT_MAX_TEXT_LENGTH} can be aligned against the text of an item. One character can stand for several.`,
591
591
  code: "too_big"
592
592
  }
593
593
  ];
@@ -657,16 +657,16 @@ function alignReadAloud(data, assessment) {
657
657
  return alignValidated(data, checked.data);
658
658
  }
659
659
  function alignValidated(data, assessment) {
660
- const reference = _chunkDSDXL3JOcjs.dictationReferenceWords.call(void 0, {
660
+ const reference = _chunk7THXD7ANcjs.dictationReferenceWords.call(void 0, {
661
661
  transcript: data.referenceText
662
662
  })[0];
663
663
  const heard = heardTokens(assessment.words).tokens;
664
664
  const entries = [];
665
- for (const { step, referenceIndex, attemptIndex } of _chunkDSDXL3JOcjs.alignSequences.call(void 0,
665
+ for (const { step, referenceIndex, attemptIndex } of _chunk7THXD7ANcjs.alignSequences.call(void 0,
666
666
  reference.map((word) => word.word),
667
667
  heard.map((token) => token.text)
668
668
  )) {
669
- if (step === _chunkDSDXL3JOcjs.STEP.extra) {
669
+ if (step === _chunk7THXD7ANcjs.STEP.extra) {
670
670
  const token2 = heard[attemptIndex];
671
671
  entries.push({
672
672
  reference: "",
@@ -678,7 +678,7 @@ function alignValidated(data, assessment) {
678
678
  continue;
679
679
  }
680
680
  const referenceWord = reference[referenceIndex];
681
- if (step === _chunkDSDXL3JOcjs.STEP.missing) {
681
+ if (step === _chunk7THXD7ANcjs.STEP.missing) {
682
682
  entries.push({
683
683
  itemId: referenceWord.itemId,
684
684
  reference: referenceWord.word,
@@ -731,7 +731,7 @@ function placeInsertions(assessment, entries) {
731
731
  reference: "",
732
732
  // Every insertion is accounted for, including one whose text normalises
733
733
  // to nothing: a reader of `wordIndex` must find each word it looks for.
734
- heard: _chunkDSDXL3JOcjs.normalizeDictationText.call(void 0, word.text),
734
+ heard: _chunk7THXD7ANcjs.normalizeDictationText.call(void 0, word.text),
735
735
  state: "inserted",
736
736
  ...accuracyOf(word),
737
737
  wordIndex
@@ -768,9 +768,9 @@ function readResponseRecording(value) {
768
768
  function spokenWordCount(assessment) {
769
769
  const recognized = assessment.recognizedText;
770
770
  if (recognized !== void 0 && recognized.trim() !== "") {
771
- return _chunkDSDXL3JOcjs.countWords.call(void 0, recognized);
771
+ return _chunk7THXD7ANcjs.countWords.call(void 0, recognized);
772
772
  }
773
- return _chunkDSDXL3JOcjs.countWords.call(void 0,
773
+ return _chunk7THXD7ANcjs.countWords.call(void 0,
774
774
  assessment.words.filter((word) => word.error !== "omission" && word.error !== "insertion").map((word) => word.text).join(" ")
775
775
  );
776
776
  }
@@ -794,9 +794,9 @@ function gradeReadAloud(data, response, assessment, options) {
794
794
  );
795
795
  }
796
796
  const rounding = roundingPolicyOf(_optionalChain([options, 'optionalAccess', _6 => _6.rounding]));
797
- const parsed = _chunkDSDXL3JOcjs.ReadAloudDataSchema.safeParse(data);
797
+ const parsed = _chunk7THXD7ANcjs.ReadAloudDataSchema.safeParse(data);
798
798
  if (!parsed.success) {
799
- throw new (0, _chunkDSDXL3JOcjs.ActivitySchemaError)(
799
+ throw new (0, _chunk7THXD7ANcjs.ActivitySchemaError)(
800
800
  "read-aloud",
801
801
  parsed.error.issues.map((issue) => ({
802
802
  path: issue.path.map(String),
@@ -806,7 +806,7 @@ function gradeReadAloud(data, response, assessment, options) {
806
806
  );
807
807
  }
808
808
  if (isRedacted(data) || isRedacted(parsed.data)) {
809
- throw new (0, _chunkDSDXL3JOcjs.RedactedScoringError)("read-aloud");
809
+ throw new (0, _chunk7THXD7ANcjs.RedactedScoringError)("read-aloud");
810
810
  }
811
811
  const item = parsed.data;
812
812
  const checkedResponse = readResponseRecording(response);
@@ -957,7 +957,7 @@ function gradeReadAloud(data, response, assessment, options) {
957
957
  };
958
958
  }
959
959
  function referenceWordsOf(data) {
960
- return _chunkDSDXL3JOcjs.dictationReferenceWords.call(void 0, { transcript: data.referenceText })[0];
960
+ return _chunk7THXD7ANcjs.dictationReferenceWords.call(void 0, { transcript: data.referenceText })[0];
961
961
  }
962
962
 
963
963
  // src/scoring/speech/wav.ts
@@ -1099,19 +1099,19 @@ function outcomeFromUnscorable(result) {
1099
1099
  // src/scoring/index.ts
1100
1100
  function score(activityType, activityData, learnerResponse, options) {
1101
1101
  const rounding = roundingPolicyOf(_optionalChain([options, 'optionalAccess', _9 => _9.rounding]));
1102
- const descriptor = _chunkDSDXL3JOcjs.getActivityTypeDescriptor.call(void 0, activityType);
1102
+ const descriptor = _chunk7THXD7ANcjs.getActivityTypeDescriptor.call(void 0, activityType);
1103
1103
  if (descriptor === void 0) {
1104
- throw new (0, _chunkDSDXL3JOcjs.UnknownActivityTypeError)(String(activityType));
1104
+ throw new (0, _chunk7THXD7ANcjs.UnknownActivityTypeError)(String(activityType));
1105
1105
  }
1106
1106
  if (descriptor.scoring.kind === "deferred") {
1107
- throw new (0, _chunkDSDXL3JOcjs.DeferredScoringError)(descriptor.type);
1107
+ throw new (0, _chunk7THXD7ANcjs.DeferredScoringError)(descriptor.type);
1108
1108
  }
1109
1109
  if (isRedacted(activityData)) {
1110
- throw new (0, _chunkDSDXL3JOcjs.RedactedScoringError)(descriptor.type);
1110
+ throw new (0, _chunk7THXD7ANcjs.RedactedScoringError)(descriptor.type);
1111
1111
  }
1112
1112
  const result = descriptor.scoring.score(activityData, learnerResponse);
1113
1113
  if (!Number.isFinite(result.score)) {
1114
- throw new (0, _chunkDSDXL3JOcjs.RedactedScoringError)(descriptor.type);
1114
+ throw new (0, _chunk7THXD7ANcjs.RedactedScoringError)(descriptor.type);
1115
1115
  }
1116
1116
  const passed = computePassThreshold(activityData, result.score, rounding);
1117
1117
  return { ...result, passed, feedback: _nullishCoalesce(result.feedback, () => ( selectFeedback(activityData, passed))) };
@@ -1128,7 +1128,7 @@ function evaluate(data, response, options) {
1128
1128
  }
1129
1129
  function evaluateAnswer(data, response, rounding) {
1130
1130
  const type = data.type;
1131
- const descriptor = typeof type === "string" ? _chunkDSDXL3JOcjs.getActivityTypeDescriptor.call(void 0, type) : void 0;
1131
+ const descriptor = typeof type === "string" ? _chunk7THXD7ANcjs.getActivityTypeDescriptor.call(void 0, type) : void 0;
1132
1132
  if (descriptor === void 0) {
1133
1133
  return {
1134
1134
  status: "unscorable",
@@ -1253,4 +1253,4 @@ function costed(data, opening, graded, rules, rounding) {
1253
1253
 
1254
1254
 
1255
1255
  exports.isGradeInRange = isGradeInRange; exports.DEFAULT_ITEM_SCORING_POLICY = DEFAULT_ITEM_SCORING_POLICY; exports.ITEM_SCORING_MAX_RETRIES = ITEM_SCORING_MAX_RETRIES; exports.validateItemScoringPolicy = validateItemScoringPolicy; exports.resolveItemScoringPolicy = resolveItemScoringPolicy; exports.scoreTries = scoreTries; exports.roundGrade = roundGrade; exports.gte = gte; exports.classifyBand = classifyBand; exports.DEFAULT_PASS_THRESHOLD = DEFAULT_PASS_THRESHOLD; exports.computePassThreshold = computePassThreshold; exports.gradeFromRubric = gradeFromRubric; exports.outcomeFromGrade = outcomeFromGrade; exports.hasGrade = hasGrade; exports.composeAssessmentScore = composeAssessmentScore; exports.diffDictationChars = diffDictationChars; exports.validateSpeechAssessment = validateSpeechAssessment; exports.alignReadAloud = alignReadAloud; exports.gradeReadAloud = gradeReadAloud; exports.inspectWav = inspectWav; exports.outcomeFromUnscorable = outcomeFromUnscorable; exports.score = score; exports.evaluate = evaluate; exports.evaluateTries = evaluateTries;
1256
- //# sourceMappingURL=chunk-VSH7ECQL.cjs.map
1256
+ //# sourceMappingURL=chunk-4YANYTFN.cjs.map