@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.
- package/CHANGELOG.md +15 -0
- package/README.md +2 -1
- package/dist/{activity-MBOYLBjR.d.cts → activity-D705CXng.d.cts} +324 -2
- package/dist/{activity-MBOYLBjR.d.ts → activity-D705CXng.d.ts} +324 -2
- package/dist/ai-check.cjs +174 -12
- package/dist/ai-check.cjs.map +1 -1
- package/dist/ai-check.d.cts +15 -3
- package/dist/ai-check.d.ts +15 -3
- package/dist/ai-check.js +166 -4
- package/dist/ai-check.js.map +1 -1
- package/dist/{chunk-TJJFKKH2.cjs → chunk-46BXIGLG.cjs} +4 -4
- package/dist/{chunk-TJJFKKH2.cjs.map → chunk-46BXIGLG.cjs.map} +1 -1
- package/dist/{chunk-VSH7ECQL.cjs → chunk-4YANYTFN.cjs} +43 -43
- package/dist/{chunk-VSH7ECQL.cjs.map → chunk-4YANYTFN.cjs.map} +1 -1
- package/dist/chunk-7KOWU4RO.js +2207 -0
- package/dist/chunk-7KOWU4RO.js.map +1 -0
- package/dist/{chunk-DSDXL3JO.cjs → chunk-7THXD7AN.cjs} +657 -197
- package/dist/chunk-7THXD7AN.cjs.map +1 -0
- package/dist/chunk-CYCTIXUN.cjs +118 -0
- package/dist/chunk-CYCTIXUN.cjs.map +1 -0
- package/dist/chunk-CYPA5BW5.js +118 -0
- package/dist/chunk-CYPA5BW5.js.map +1 -0
- package/dist/{chunk-SJVRUPJT.js → chunk-JTNDIBZO.js} +2 -2
- package/dist/{chunk-XS6U2ARZ.js → chunk-MV2N2WNS.js} +6 -112
- package/dist/chunk-MV2N2WNS.js.map +1 -0
- package/dist/chunk-MXI26H62.cjs +2207 -0
- package/dist/chunk-MXI26H62.cjs.map +1 -0
- package/dist/{chunk-FBKTION6.js → chunk-QS7B42ZR.js} +640 -180
- package/dist/chunk-QS7B42ZR.js.map +1 -0
- package/dist/{chunk-IARLJ5MW.js → chunk-QX2ERL72.js} +2 -2
- package/dist/{chunk-2JT2WUQ2.cjs → chunk-ZWXQSKCX.cjs} +14 -120
- package/dist/chunk-ZWXQSKCX.cjs.map +1 -0
- package/dist/{index-DlcqkM_L.d.ts → index-BChYtrEe.d.ts} +1 -1
- package/dist/{index-DlCW0XaQ.d.cts → index-VXt_v3YI.d.cts} +1 -1
- package/dist/index.cjs +68 -593
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +245 -60
- package/dist/index.d.ts +245 -60
- package/dist/index.js +68 -593
- package/dist/index.js.map +1 -1
- package/dist/schemas.cjs +5 -3
- package/dist/schemas.cjs.map +1 -1
- package/dist/schemas.d.cts +2 -2
- package/dist/schemas.d.ts +2 -2
- package/dist/schemas.js +5 -3
- package/dist/scoring.cjs +3 -3
- package/dist/scoring.d.cts +2 -2
- package/dist/scoring.d.ts +2 -2
- package/dist/scoring.js +2 -2
- package/dist/xapi.cjs +3 -3
- package/dist/xapi.d.cts +1 -1
- package/dist/xapi.d.ts +1 -1
- package/dist/xapi.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-2JT2WUQ2.cjs.map +0 -1
- package/dist/chunk-DSDXL3JO.cjs.map +0 -1
- package/dist/chunk-FBKTION6.js.map +0 -1
- package/dist/chunk-LDFQUZII.cjs +0 -950
- package/dist/chunk-LDFQUZII.cjs.map +0 -1
- package/dist/chunk-NQHETFDA.js +0 -950
- package/dist/chunk-NQHETFDA.js.map +0 -1
- package/dist/chunk-XS6U2ARZ.js.map +0 -1
- /package/dist/{chunk-SJVRUPJT.js.map → chunk-JTNDIBZO.js.map} +0 -0
- /package/dist/{chunk-IARLJ5MW.js.map → chunk-QX2ERL72.js.map} +0 -0
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
getActivityTypeDescriptor,
|
|
16
16
|
maxUnits,
|
|
17
17
|
normalizeDictationText
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-QS7B42ZR.js";
|
|
19
19
|
|
|
20
20
|
// src/is-redacted.ts
|
|
21
21
|
function isRedacted(data) {
|
|
@@ -1253,4 +1253,4 @@ export {
|
|
|
1253
1253
|
evaluate,
|
|
1254
1254
|
evaluateTries
|
|
1255
1255
|
};
|
|
1256
|
-
//# sourceMappingURL=chunk-
|
|
1256
|
+
//# sourceMappingURL=chunk-QX2ERL72.js.map
|
|
@@ -6,20 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
var _chunkDSDXL3JOcjs = require('./chunk-DSDXL3JO.cjs');
|
|
20
|
-
|
|
21
|
-
// src/schemas/item-group.ts
|
|
22
|
-
var _v4 = require('zod/v4');
|
|
9
|
+
var _chunk7THXD7ANcjs = require('./chunk-7THXD7AN.cjs');
|
|
23
10
|
|
|
24
11
|
// src/timeline-limits.ts
|
|
25
12
|
var INTERACTIVE_VIDEO_ITEM_TYPES = [
|
|
@@ -38,6 +25,7 @@ var TIMELINE_MAX_CHAPTERS = 100;
|
|
|
38
25
|
var TIMELINE_MAX_TITLE_LENGTH = 120;
|
|
39
26
|
|
|
40
27
|
// src/schemas/item-group.ts
|
|
28
|
+
var _v4 = require('zod/v4');
|
|
41
29
|
var SlotKeySchema = _v4.z.string().min(1).refine((key) => !key.includes("."), {
|
|
42
30
|
error: 'slotKey must not contain "." \u2014 that character separates a group from its item in a slot id, so a key containing one would make the slot ambiguous.'
|
|
43
31
|
});
|
|
@@ -62,7 +50,7 @@ var StimulusSchema = _v4.z.looseObject({
|
|
|
62
50
|
title: _v4.z.string().optional(),
|
|
63
51
|
body: _v4.z.string().optional(),
|
|
64
52
|
bodyHtml: _v4.z.string().optional(),
|
|
65
|
-
media:
|
|
53
|
+
media: _chunk7THXD7ANcjs.MediaSchema.optional(),
|
|
66
54
|
transcript: _v4.z.string().optional(),
|
|
67
55
|
locale: _v4.z.string().optional(),
|
|
68
56
|
attribution: _v4.z.string().optional()
|
|
@@ -85,13 +73,13 @@ var StimulusSchema = _v4.z.looseObject({
|
|
|
85
73
|
path: ["media", "type"]
|
|
86
74
|
}
|
|
87
75
|
);
|
|
88
|
-
var TimelineTitleSchema =
|
|
76
|
+
var TimelineTitleSchema = _chunk7THXD7ANcjs.maxUnits.call(void 0, _v4.z.string(), TIMELINE_MAX_TITLE_LENGTH).refine(
|
|
89
77
|
(title) => title.trim().length > 0,
|
|
90
78
|
{ error: "A title must not be empty." }
|
|
91
79
|
);
|
|
92
80
|
var TimelineTimeSchema = _v4.z.number().min(0, { error: "A time is 0 seconds or more." });
|
|
93
81
|
var TimelineCueSchema = _v4.z.strictObject({
|
|
94
|
-
id:
|
|
82
|
+
id: _chunk7THXD7ANcjs.maxUnits.call(void 0, _v4.z.string().min(1), 64),
|
|
95
83
|
at: TimelineTimeSchema,
|
|
96
84
|
itemIds: _v4.z.array(_v4.z.string().min(1)).min(1).max(TIMELINE_MAX_ITEMS),
|
|
97
85
|
title: TimelineTitleSchema.optional(),
|
|
@@ -275,7 +263,7 @@ var RedactedStimulusSchema = _v4.z.strictObject({
|
|
|
275
263
|
title: _v4.z.string().optional(),
|
|
276
264
|
body: _v4.z.string().optional(),
|
|
277
265
|
bodyHtml: _v4.z.string().optional(),
|
|
278
|
-
media:
|
|
266
|
+
media: _chunk7THXD7ANcjs.RedactedMediaSchema.optional(),
|
|
279
267
|
locale: _v4.z.string().optional(),
|
|
280
268
|
attribution: _v4.z.string().optional()
|
|
281
269
|
});
|
|
@@ -294,12 +282,12 @@ var RedactedItemGroupSchema = _v4.z.strictObject({
|
|
|
294
282
|
for (const issue of timelineIssues(ctx.value, "redacted")) {
|
|
295
283
|
ctx.issues.push({ code: "custom", ...issue });
|
|
296
284
|
}
|
|
297
|
-
const captions =
|
|
285
|
+
const captions = _chunk7THXD7ANcjs.groupCaptionsField.call(void 0, ctx.value);
|
|
298
286
|
if (captions !== void 0) {
|
|
299
287
|
ctx.issues.push({
|
|
300
288
|
code: "custom",
|
|
301
289
|
input: _optionalChain([ctx, 'access', _ => _.value, 'access', _2 => _2.stimulus, 'access', _3 => _3.media, 'optionalAccess', _4 => _4[captions]]),
|
|
302
|
-
message:
|
|
290
|
+
message: _chunk7THXD7ANcjs.GROUP_CAPTIONS_REVEAL_DICTATION,
|
|
303
291
|
path: ["stimulus", "media", captions]
|
|
304
292
|
});
|
|
305
293
|
}
|
|
@@ -319,7 +307,7 @@ function validateItemGroup(data) {
|
|
|
319
307
|
const errors = [];
|
|
320
308
|
const items = [];
|
|
321
309
|
container.data.items.forEach((item, index) => {
|
|
322
|
-
const descriptor =
|
|
310
|
+
const descriptor = _chunk7THXD7ANcjs.getActivityTypeDescriptor.call(void 0, item.type);
|
|
323
311
|
if (descriptor === void 0) {
|
|
324
312
|
errors.push({
|
|
325
313
|
path: ["items", String(index), "type"],
|
|
@@ -328,18 +316,18 @@ function validateItemGroup(data) {
|
|
|
328
316
|
});
|
|
329
317
|
return;
|
|
330
318
|
}
|
|
331
|
-
const parsed =
|
|
319
|
+
const parsed = _chunk7THXD7ANcjs.readSchema.call(void 0, descriptor.schema, item, `Activity type "${descriptor.type}"`);
|
|
332
320
|
if (!parsed.success) {
|
|
333
321
|
errors.push(...toValidationErrors(parsed.issues, ["items", String(index)]));
|
|
334
322
|
return;
|
|
335
323
|
}
|
|
336
324
|
items.push(parsed.data);
|
|
337
325
|
});
|
|
338
|
-
const captions =
|
|
326
|
+
const captions = _chunk7THXD7ANcjs.groupCaptionsField.call(void 0, container.data);
|
|
339
327
|
if (captions !== void 0) {
|
|
340
328
|
errors.push({
|
|
341
329
|
path: ["stimulus", "media", captions],
|
|
342
|
-
message:
|
|
330
|
+
message: _chunk7THXD7ANcjs.GROUP_CAPTIONS_REVEAL_DICTATION,
|
|
343
331
|
code: "custom"
|
|
344
332
|
});
|
|
345
333
|
}
|
|
@@ -349,100 +337,6 @@ function validateItemGroup(data) {
|
|
|
349
337
|
return { success: true, data: { ...container.data, items } };
|
|
350
338
|
}
|
|
351
339
|
|
|
352
|
-
// src/schemas/json-schema.ts
|
|
353
|
-
|
|
354
|
-
var stimulusJsonSchema = _v4.z.toJSONSchema(StimulusSchema, {
|
|
355
|
-
target: "draft-7"
|
|
356
|
-
});
|
|
357
|
-
var itemGroupJsonSchema = _v4.z.toJSONSchema(ItemGroupSchema, {
|
|
358
|
-
target: "draft-7"
|
|
359
|
-
});
|
|
360
|
-
var gapSelectJsonSchema = _v4.z.toJSONSchema(_chunkDSDXL3JOcjs.GapSelectDataSchema, {
|
|
361
|
-
target: "draft-7"
|
|
362
|
-
});
|
|
363
|
-
var dictationJsonSchema = _v4.z.toJSONSchema(_chunkDSDXL3JOcjs.DictationDataSchema, {
|
|
364
|
-
target: "draft-7"
|
|
365
|
-
});
|
|
366
|
-
var readAloudJsonSchema = _v4.z.toJSONSchema(_chunkDSDXL3JOcjs.ReadAloudDataSchema, {
|
|
367
|
-
target: "draft-7"
|
|
368
|
-
});
|
|
369
|
-
var multipleChoiceJsonSchema = _v4.z.toJSONSchema(
|
|
370
|
-
_chunkDSDXL3JOcjs.MultipleChoiceDataSchema,
|
|
371
|
-
{
|
|
372
|
-
target: "draft-7"
|
|
373
|
-
}
|
|
374
|
-
);
|
|
375
|
-
var fillInTheBlanksJsonSchema = _v4.z.toJSONSchema(
|
|
376
|
-
_chunkDSDXL3JOcjs.FillInTheBlanksDataSchema,
|
|
377
|
-
{
|
|
378
|
-
target: "draft-7"
|
|
379
|
-
}
|
|
380
|
-
);
|
|
381
|
-
var writtenResponseJsonSchema = _v4.z.toJSONSchema(
|
|
382
|
-
_chunkDSDXL3JOcjs.WrittenResponseDataSchema,
|
|
383
|
-
{
|
|
384
|
-
target: "draft-7"
|
|
385
|
-
}
|
|
386
|
-
);
|
|
387
|
-
function jsonSchemaFor(type) {
|
|
388
|
-
const descriptor = _chunkDSDXL3JOcjs.getActivityTypeDescriptor.call(void 0, type);
|
|
389
|
-
if (descriptor === void 0) {
|
|
390
|
-
throw new (0, _chunkDSDXL3JOcjs.UnknownActivityTypeError)(type);
|
|
391
|
-
}
|
|
392
|
-
if (_chunkDSDXL3JOcjs.isOwnSchema.call(void 0, descriptor.schema)) {
|
|
393
|
-
return _v4.z.toJSONSchema(descriptor.schema, { target: "draft-7" });
|
|
394
|
-
}
|
|
395
|
-
if (descriptor.jsonSchema !== void 0) {
|
|
396
|
-
return structuredClone(descriptor.jsonSchema);
|
|
397
|
-
}
|
|
398
|
-
const generated = _chunkDSDXL3JOcjs.standardJsonSchemaOf.call(void 0, descriptor.schema);
|
|
399
|
-
if (generated === void 0) {
|
|
400
|
-
throw new Error(
|
|
401
|
-
`Activity type "${descriptor.type}" has no JSON Schema: its schema implements no Standard JSON Schema converter ('~standard'.jsonSchema). Give its descriptor a \`jsonSchema\`.`
|
|
402
|
-
);
|
|
403
|
-
}
|
|
404
|
-
return generated;
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
// src/schemas/index.ts
|
|
408
|
-
function validateMedia(value) {
|
|
409
|
-
return asValidation(_chunkDSDXL3JOcjs.readSchema.call(void 0, _chunkDSDXL3JOcjs.MediaSchema, value, "Media"));
|
|
410
|
-
}
|
|
411
|
-
function validateOptionMedia(value) {
|
|
412
|
-
return asValidation(_chunkDSDXL3JOcjs.readSchema.call(void 0, _chunkDSDXL3JOcjs.MultipleChoiceOptionMediaSchema, value, "Option media"));
|
|
413
|
-
}
|
|
414
|
-
function asValidation(reading) {
|
|
415
|
-
if (reading.success) {
|
|
416
|
-
return { success: true, data: reading.data };
|
|
417
|
-
}
|
|
418
|
-
return {
|
|
419
|
-
success: false,
|
|
420
|
-
errors: reading.issues.map((issue) => ({
|
|
421
|
-
path: issue.path.map(String),
|
|
422
|
-
message: issue.message,
|
|
423
|
-
code: issue.code
|
|
424
|
-
}))
|
|
425
|
-
};
|
|
426
|
-
}
|
|
427
|
-
function validateActivity(type, data) {
|
|
428
|
-
const descriptor = _chunkDSDXL3JOcjs.getActivityTypeDescriptor.call(void 0, type);
|
|
429
|
-
if (descriptor === void 0) {
|
|
430
|
-
throw new (0, _chunkDSDXL3JOcjs.UnknownActivityTypeError)(String(type));
|
|
431
|
-
}
|
|
432
|
-
return asValidation(_chunkDSDXL3JOcjs.readSchema.call(void 0, descriptor.schema, data, `Activity type "${descriptor.type}"`));
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
340
|
|
|
447
341
|
|
|
448
342
|
|
|
@@ -454,5 +348,5 @@ function validateActivity(type, data) {
|
|
|
454
348
|
|
|
455
349
|
|
|
456
350
|
|
|
457
|
-
exports.INTERACTIVE_VIDEO_ITEM_TYPES = INTERACTIVE_VIDEO_ITEM_TYPES; exports.isInteractiveVideoItemType = isInteractiveVideoItemType; exports.TIMELINE_MAX_QUIZZES = TIMELINE_MAX_QUIZZES; exports.TIMELINE_MAX_ITEMS = TIMELINE_MAX_ITEMS; exports.TIMELINE_MAX_CHAPTERS = TIMELINE_MAX_CHAPTERS; exports.TIMELINE_MAX_TITLE_LENGTH = TIMELINE_MAX_TITLE_LENGTH; exports.
|
|
458
|
-
//# sourceMappingURL=chunk-
|
|
351
|
+
exports.INTERACTIVE_VIDEO_ITEM_TYPES = INTERACTIVE_VIDEO_ITEM_TYPES; exports.isInteractiveVideoItemType = isInteractiveVideoItemType; exports.TIMELINE_MAX_QUIZZES = TIMELINE_MAX_QUIZZES; exports.TIMELINE_MAX_ITEMS = TIMELINE_MAX_ITEMS; exports.TIMELINE_MAX_CHAPTERS = TIMELINE_MAX_CHAPTERS; exports.TIMELINE_MAX_TITLE_LENGTH = TIMELINE_MAX_TITLE_LENGTH; exports.StimulusSchema = StimulusSchema; exports.ItemGroupSchema = ItemGroupSchema; exports.RedactedItemGroupSchema = RedactedItemGroupSchema; exports.validateItemGroup = validateItemGroup;
|
|
352
|
+
//# sourceMappingURL=chunk-ZWXQSKCX.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/learning-kit/learning-kit/packages/lk-core/dist/chunk-ZWXQSKCX.cjs","../src/timeline-limits.ts","../src/schemas/item-group.ts"],"names":[],"mappings":"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","file":"/home/runner/work/learning-kit/learning-kit/packages/lk-core/dist/chunk-ZWXQSKCX.cjs","sourcesContent":[null,"/**\n * The bounds of an interactive video — an item group with a `timeline`.\n *\n * A leaf module on purpose: the schemas, the authoring checks and the timeline\n * helpers all read these, and nothing here may import any of them back.\n */\n\n/**\n * The item types an interactive video may present. CLOSED on purpose: a type\n * added to the SDK later, or a custom type a host registers, is not silently\n * embeddable. Each one here was chosen, and each works inside a paused video —\n * a read-aloud's microphone included, because every quiz pauses the video\n * first.\n */\nexport const INTERACTIVE_VIDEO_ITEM_TYPES = [\n 'multiple-choice',\n 'fill-in-the-blanks',\n 'gap-select',\n 'dictation',\n 'read-aloud',\n] as const;\n\n/** One of {@link INTERACTIVE_VIDEO_ITEM_TYPES}. */\nexport type InteractiveVideoItemType = (typeof INTERACTIVE_VIDEO_ITEM_TYPES)[number];\n\n/** Whether `type` is one of the item types an interactive video may present. */\nexport function isInteractiveVideoItemType(type: unknown): type is InteractiveVideoItemType {\n return (INTERACTIVE_VIDEO_ITEM_TYPES as readonly unknown[]).includes(type);\n}\n\n/** The most quizzes one video may hold. */\nexport const TIMELINE_MAX_QUIZZES = 100;\n\n/**\n * The most questions one interactive video may hold, across all its quizzes.\n * The player keeps every one of them mounted, so an answer survives the\n * learner rewinding past its quiz.\n */\nexport const TIMELINE_MAX_ITEMS = 200;\n\n/** The most chapters one video may hold. */\nexport const TIMELINE_MAX_CHAPTERS = 100;\n\n/** The longest quiz or chapter title, in UTF-16 units. A title sits on one line of the player. */\nexport const TIMELINE_MAX_TITLE_LENGTH = 120;\n","import { z } from 'zod/v4';\nimport { getActivityTypeDescriptor } from '../registry/index.js';\nimport {\n INTERACTIVE_VIDEO_ITEM_TYPES,\n isInteractiveVideoItemType,\n TIMELINE_MAX_CHAPTERS,\n TIMELINE_MAX_ITEMS,\n TIMELINE_MAX_QUIZZES,\n TIMELINE_MAX_TITLE_LENGTH,\n} from '../timeline-limits.js';\nimport type { ActivityData, ValidationError, ValidationResult } from '../types/activity.js';\nimport type { ItemGroup, StimulusKind } from '../types/item-group.js';\nimport { GROUP_CAPTIONS_REVEAL_DICTATION, groupCaptionsField } from './dictation.js';\nimport { MediaSchema, RedactedMediaSchema } from './media.js';\nimport { readSchema } from './read-schema.js';\nimport { maxUnits } from './text-length.js';\n\n/**\n * An authored slot key.\n *\n * A `.` is rejected here, not at render time: `flattenSequence` uses the first\n * `.` to separate a group from its item, so a key containing one would produce\n * an ambiguous slot id. `keyOf` already threw on it — this moves the rejection\n * to `validateItemGroup`, where an author finds it, instead of leaving it to\n * surface when a learner opens the paper. Content that would newly fail\n * validation already threw at flatten time, so it can never have been sat.\n */\nconst SlotKeySchema = z\n .string()\n .min(1)\n .refine((key) => !key.includes('.'), {\n error:\n 'slotKey must not contain \".\" — that character separates a group from its item in a slot id, so a key containing one would make the slot ambiguous.',\n });\n\nfunction hasBody(stimulus: { body?: string | undefined }): boolean {\n return typeof stimulus.body === 'string' && stimulus.body.trim().length > 0;\n}\n\n/** Which media types can carry a stimulus of each kind. `text`/`mixed` accept any. */\nfunction mediaFits(kind: StimulusKind, mediaType: string | undefined): boolean {\n switch (kind) {\n case 'audio':\n return mediaType === 'audio';\n case 'video':\n return mediaType === 'video' || mediaType === 'embed';\n case 'image':\n return mediaType === 'image';\n default:\n return true;\n }\n}\n\n/**\n * Zod schema for a {@link Stimulus}. Loose: unknown keys preserved.\n *\n * The semantic guards exist because a stimulus that does not carry what its\n * `kind` promises is an authoring error that must not reach an exam: an\n * \"audio\" stimulus with no recording renders as a blank panel above six\n * listening questions. Unrepresentable in JSON Schema; dropped from\n * `stimulusJsonSchema` by design.\n */\nexport const StimulusSchema = z\n .looseObject({\n id: z.string().min(1),\n kind: z.enum(['text', 'audio', 'video', 'image', 'mixed']),\n title: z.string().optional(),\n body: z.string().optional(),\n bodyHtml: z.string().optional(),\n media: MediaSchema.optional(),\n transcript: z.string().optional(),\n locale: z.string().optional(),\n attribution: z.string().optional(),\n })\n .refine((stimulus) => stimulus.bodyHtml === undefined || hasBody(stimulus), {\n error:\n 'bodyHtml requires a plain-text body: it is the accessible fallback rendered when no sanitiser is supplied.',\n path: ['body'],\n })\n .refine(\n (stimulus) => (stimulus.kind !== 'text' && stimulus.kind !== 'mixed') || hasBody(stimulus),\n {\n error: 'A text or mixed stimulus needs a non-empty body.',\n path: ['body'],\n },\n )\n .refine((stimulus) => stimulus.kind === 'text' || stimulus.media !== undefined, {\n error: 'An audio, video, image or mixed stimulus needs media.',\n path: ['media'],\n })\n .refine(\n (stimulus) => stimulus.media === undefined || mediaFits(stimulus.kind, stimulus.media.type),\n {\n error:\n 'media.type does not fit the stimulus kind: audio needs audio; video needs video or embed; image needs image.',\n path: ['media', 'type'],\n },\n );\n\nconst TimelineTitleSchema = maxUnits(z.string(), TIMELINE_MAX_TITLE_LENGTH).refine(\n (title) => title.trim().length > 0,\n { error: 'A title must not be empty.' },\n);\n\n/** Seconds from the start of the video. zod rejects NaN and ±Infinity itself. */\nconst TimelineTimeSchema = z.number().min(0, { error: 'A time is 0 seconds or more.' });\n\n/**\n * A quiz. STRICT, like every part of a timeline: a misspelt `requried` would\n * otherwise be kept and the quiz silently optional on a paper that believed it\n * was required.\n */\nexport const TimelineCueSchema = z.strictObject({\n id: maxUnits(z.string().min(1), 64),\n at: TimelineTimeSchema,\n itemIds: z.array(z.string().min(1)).min(1).max(TIMELINE_MAX_ITEMS),\n title: TimelineTitleSchema.optional(),\n required: z.boolean().optional(),\n});\n\nexport const TimelineChapterSchema = z.strictObject({\n at: TimelineTimeSchema,\n title: TimelineTitleSchema,\n});\n\n/**\n * A timeline on its own: its quizzes, chapters and navigation. The rules that\n * need the group — every item in exactly one quiz, a video stimulus, the five\n * item types — are {@link timelineIssues}, which both group schemas run.\n */\nexport const MediaTimelineSchema = z\n .strictObject({\n cues: z.array(TimelineCueSchema).max(TIMELINE_MAX_QUIZZES),\n chapters: z.array(TimelineChapterSchema).max(TIMELINE_MAX_CHAPTERS).optional(),\n navigation: z.enum(['free', 'no-skip-ahead']).optional(),\n })\n .check((ctx) => {\n const seen = new Set<string>();\n ctx.value.cues.forEach((cue, index) => {\n if (seen.has(cue.id)) {\n ctx.issues.push({\n code: 'custom',\n input: cue.id,\n message: `Quiz id \"${cue.id}\" is used twice: events, drafts and the contents panel name a quiz by its id.`,\n path: ['cues', index, 'id'],\n });\n }\n seen.add(cue.id);\n });\n // Strictly increasing, not merely sorted: two chapters starting at one\n // moment leave the first with no length, and the scrubber no room to draw it.\n const chapters = ctx.value.chapters ?? [];\n chapters.forEach((chapter, index) => {\n const previous = chapters[index - 1];\n if (previous !== undefined && chapter.at <= previous.at) {\n ctx.issues.push({\n code: 'custom',\n input: chapter.at,\n message: 'Chapter times must be strictly increasing.',\n path: ['chapters', index, 'at'],\n });\n }\n });\n });\n\n/** A URL only this document can resolve, or one that inlines the bytes. */\nfunction isLocalOnlyUrl(url: unknown): boolean {\n return typeof url === 'string' && /^(data|blob):/i.test(url);\n}\n\n/**\n * The rules of an interactive video that span the timeline, the stimulus and\n * the items. Run by the content schema and, for everything but the two\n * authoring-only rules, by the strict redacted schema — a projection built by\n * hand never passed through the content schema.\n *\n * Items are read defensively: the redacted schema leaves them opaque, and each\n * is proven against its own type's schema elsewhere.\n */\nfunction timelineIssues(\n group: {\n stimulus: {\n kind: string;\n media?:\n | {\n type: string;\n url: string;\n poster?: string | undefined;\n tracks?: readonly { src: string }[] | undefined;\n }\n | undefined;\n };\n items: readonly unknown[];\n shuffle?: string | undefined;\n timeline?: { cues: readonly { itemIds: readonly string[] }[] } | undefined;\n },\n scope: 'content' | 'redacted',\n): { path: (string | number)[]; message: string; input: unknown }[] {\n const timeline = group.timeline;\n if (timeline === undefined) {\n return [];\n }\n const issues: { path: (string | number)[]; message: string; input: unknown }[] = [];\n const media = group.stimulus.media;\n\n // Reported at the field that is wrong, so an editor's own check at that path\n // can stand in for it without hiding anything else about the stimulus.\n if (group.stimulus.kind !== 'video') {\n issues.push({\n path: ['stimulus', 'kind'],\n input: group.stimulus.kind,\n message:\n 'An interactive video needs a video stimulus: quizzes open at moments of a video, and nothing else has them.',\n });\n } else if (media !== undefined && media.type !== 'video') {\n issues.push({\n path: ['stimulus', 'media', 'type'],\n input: media.type,\n message:\n 'An interactive video needs a video file. An embedded provider player cannot be paused at the moment a quiz opens.',\n });\n }\n if (group.shuffle === 'within-group') {\n issues.push({\n path: ['shuffle'],\n input: group.shuffle,\n message:\n 'An interactive video presents its questions in the order its quizzes open; shuffle: \"within-group\" cannot apply to it.',\n });\n }\n if (group.items.length > TIMELINE_MAX_ITEMS) {\n issues.push({\n path: ['items'],\n input: group.items.length,\n message: `An interactive video holds at most ${TIMELINE_MAX_ITEMS} questions.`,\n });\n }\n\n const itemIds = new Map<string, number>();\n group.items.forEach((item, index) => {\n const {\n id,\n type,\n media: itemMedia,\n } = (item ?? {}) as { id?: unknown; type?: unknown; media?: unknown };\n if (typeof id === 'string') {\n itemIds.set(id, index);\n }\n if (!isInteractiveVideoItemType(type)) {\n issues.push({\n path: ['items', index, 'type'],\n input: type,\n message: `An interactive video may hold only ${INTERACTIVE_VIDEO_ITEM_TYPES.join(', ')} questions.`,\n });\n }\n // The \"play the stimulus\" fallback a dictation has in a listening group\n // means nothing halfway through a video.\n if (scope === 'content' && type === 'dictation' && itemMedia === undefined) {\n issues.push({\n path: ['items', index, 'media'],\n input: itemMedia,\n message: 'A dictation inside an interactive video needs its own recording.',\n });\n }\n });\n\n const placed = new Set<string>();\n timeline.cues.forEach((cue, cueIndex) => {\n cue.itemIds.forEach((itemId, position) => {\n const path = ['timeline', 'cues', cueIndex, 'itemIds', position];\n if (!itemIds.has(itemId)) {\n issues.push({\n path,\n input: itemId,\n message: `No item in this group has the id \"${itemId}\".`,\n });\n } else if (placed.has(itemId)) {\n issues.push({\n path,\n input: itemId,\n message: `Item \"${itemId}\" is placed twice: every question belongs to exactly one quiz.`,\n });\n }\n placed.add(itemId);\n });\n });\n for (const [itemId, index] of itemIds) {\n if (!placed.has(itemId)) {\n issues.push({\n path: ['items', index],\n input: itemId,\n message: `Item \"${itemId}\" is in no quiz, so the video would never show it.`,\n });\n }\n }\n\n // A `data:` video swells the payload and every fingerprint over it; a stored\n // `blob:` URL means nothing in another document.\n if (scope === 'content' && media !== undefined) {\n const urls: [unknown, (string | number)[]][] = [\n [media.url, ['stimulus', 'media', 'url']],\n [media.poster, ['stimulus', 'media', 'poster']],\n ...(media.tracks ?? []).map((track, index): [unknown, (string | number)[]] => [\n track.src,\n ['stimulus', 'media', 'tracks', index, 'src'],\n ]),\n ];\n for (const [url, path] of urls) {\n if (isLocalOnlyUrl(url)) {\n issues.push({\n path,\n input: url,\n message:\n 'An interactive video is stored and served: its URLs cannot be data: or blob: URLs.',\n });\n }\n }\n }\n return issues;\n}\n\n/**\n * The structural minimum of an item as seen by the CONTAINER schema. Each\n * item's own contract is checked against its registered schema by\n * {@link validateItemGroup} — a zod schema cannot dispatch on a registry\n * that consumers extend at runtime.\n */\nconst ItemShapeSchema = z.looseObject({\n type: z.string().min(1),\n id: z.string().min(1),\n slotKey: SlotKeySchema.optional(),\n});\n\n/**\n * Zod schema for an {@link ItemGroup} CONTAINER. Loose: unknown keys\n * preserved. Validates the group's own fields and the stimulus in full, and\n * each item only structurally (`type` and `id`); use {@link validateItemGroup}\n * to validate the items against their registered schemas as well.\n */\nexport const ItemGroupSchema = z\n .looseObject({\n schemaVersion: z.literal('1.0'),\n type: z.literal('item-group'),\n id: z.string().min(1),\n title: z.string().optional(),\n slotKey: SlotKeySchema.optional(),\n stimulus: StimulusSchema,\n items: z.array(ItemShapeSchema).min(1),\n shuffle: z.enum(['none', 'within-group']).optional(),\n timeline: MediaTimelineSchema.optional(),\n })\n .refine((group) => group.items.every((item) => item.type !== 'item-group'), {\n error: 'Item groups do not nest: every item must be an activity.',\n path: ['items'],\n })\n .refine((group) => new Set(group.items.map((item) => item.id)).size === group.items.length, {\n error: 'Item ids must be unique within a group.',\n path: ['items'],\n })\n .check((ctx) => {\n for (const issue of timelineIssues(ctx.value, 'content')) {\n ctx.issues.push({ code: 'custom', ...issue });\n }\n });\n\n/** Strict learner-safe stimulus: everything but the author-only `transcript`. */\nexport const RedactedStimulusSchema = z.strictObject({\n id: z.string().min(1),\n kind: z.enum(['text', 'audio', 'video', 'image', 'mixed']),\n title: z.string().optional(),\n body: z.string().optional(),\n bodyHtml: z.string().optional(),\n media: RedactedMediaSchema.optional(),\n locale: z.string().optional(),\n attribution: z.string().optional(),\n});\n\n/**\n * Strict learner-safe item group. Items are left opaque here — each is proven\n * learner-safe by `assertRedacted` against its OWN type's redacted schema,\n * which is the only place that knowledge lives. The one exception is the one\n * rule that spans the container and an item: a captioned stimulus recording\n * played to a dictation is not learner-safe, because the captions are the\n * dictation's answer.\n */\nexport const RedactedItemGroupSchema = z\n .strictObject({\n redacted: z.literal(true),\n schemaVersion: z.literal('1.0'),\n type: z.literal('item-group'),\n id: z.string().min(1),\n title: z.string().optional(),\n slotKey: SlotKeySchema.optional(),\n stimulus: RedactedStimulusSchema,\n items: z.array(z.unknown()).min(1),\n shuffle: z.enum(['none', 'within-group']).optional(),\n timeline: MediaTimelineSchema.optional(),\n })\n .check((ctx) => {\n for (const issue of timelineIssues(ctx.value, 'redacted')) {\n ctx.issues.push({ code: 'custom', ...issue });\n }\n const captions = groupCaptionsField(ctx.value);\n if (captions !== undefined) {\n ctx.issues.push({\n code: 'custom',\n input: ctx.value.stimulus.media?.[captions],\n message: GROUP_CAPTIONS_REVEAL_DICTATION,\n path: ['stimulus', 'media', captions],\n });\n }\n });\n\nfunction toValidationErrors(\n issues: readonly { path: readonly PropertyKey[]; message: string; code: string }[],\n prefix: string[],\n): ValidationError[] {\n return issues.map((issue) => ({\n path: [...prefix, ...issue.path.map(String)],\n message: issue.message,\n code: issue.code,\n }));\n}\n\n/**\n * Validates an item group in full: the container and stimulus against\n * {@link ItemGroupSchema}, then every item against the schema registered for\n * its `type`. Errors from items are reported at `items.<index>.…`.\n *\n * Unlike `validateActivity`, an item whose type is not registered is REPORTED\n * (code `unknown_activity_type`) rather than thrown: a group is validated as\n * a whole, and an author fixing a six-item group wants every problem listed,\n * not the first one that happened to throw.\n */\nexport function validateItemGroup(data: unknown): ValidationResult<ItemGroup> {\n const container = ItemGroupSchema.safeParse(data);\n if (!container.success) {\n return { success: false, errors: toValidationErrors(container.error.issues, []) };\n }\n\n const errors: ValidationError[] = [];\n const items: ActivityData[] = [];\n container.data.items.forEach((item, index) => {\n const descriptor = getActivityTypeDescriptor(item.type);\n if (descriptor === undefined) {\n errors.push({\n path: ['items', String(index), 'type'],\n message: `Activity type \"${item.type}\" is not registered`,\n code: 'unknown_activity_type',\n });\n return;\n }\n const parsed = readSchema(descriptor.schema, item, `Activity type \"${descriptor.type}\"`);\n if (!parsed.success) {\n errors.push(...toValidationErrors(parsed.issues, ['items', String(index)]));\n return;\n }\n items.push(parsed.data as ActivityData);\n });\n const captions = groupCaptionsField(container.data);\n if (captions !== undefined) {\n errors.push({\n path: ['stimulus', 'media', captions],\n message: GROUP_CAPTIONS_REVEAL_DICTATION,\n code: 'custom',\n });\n }\n\n if (errors.length > 0) {\n return { success: false, errors };\n }\n // zod4 optional outputs are `T | undefined`; the wire type uses exact\n // optionals. Structurally identical at runtime — the cast is type-level.\n return { success: true, data: { ...container.data, items } as unknown as ItemGroup };\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as ActivityData, d as ActivityMedia,
|
|
1
|
+
import { a as ActivityData, d as ActivityMedia, aX as ValidationResult, f as ActivityType, b as ActivityDataMap, aI as MultipleChoiceOptionMedia } from './activity-D705CXng.js';
|
|
2
2
|
|
|
3
3
|
/** What a stimulus primarily is. Drives validation and layout, never scoring. */
|
|
4
4
|
type StimulusKind = 'text' | 'audio' | 'video' | 'image' | 'mixed';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as ActivityData, d as ActivityMedia,
|
|
1
|
+
import { a as ActivityData, d as ActivityMedia, aX as ValidationResult, f as ActivityType, b as ActivityDataMap, aI as MultipleChoiceOptionMedia } from './activity-D705CXng.cjs';
|
|
2
2
|
|
|
3
3
|
/** What a stimulus primarily is. Drives validation and layout, never scoring. */
|
|
4
4
|
type StimulusKind = 'text' | 'audio' | 'video' | 'image' | 'mixed';
|