@memizy/oqse 0.1.0 → 0.1.2
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/README.md +15 -8
- package/dist/index.cjs +2 -2
- package/dist/index.d.ts +8 -1
- package/dist/index.js +514 -415
- package/dist/src/index.d.ts +1 -0
- package/dist/src/manifest.d.ts +9 -5
- package/dist/src/manifestValidation.d.ts +6 -5
- package/dist/src/oqse.d.ts +0 -28
- package/dist/src/oqseValidation.d.ts +3 -44
- package/dist/src/richTextProcessor.d.ts +46 -0
- package/dist/src/richTextProcessor.test.d.ts +1 -0
- package/dist/src/utils.d.ts +9 -0
- package/package.json +6 -3
- package/schemas/oqse-manifest-v0.1.json +3 -6
- package/schemas/oqse-v0.1.json +3 -34
- package/SPECIFICATION.md +0 -2444
package/README.md
CHANGED
|
@@ -2,27 +2,34 @@
|
|
|
2
2
|
|
|
3
3
|
Official TypeScript SDK for the Open Quiz & Study Exchange ecosystem, published as @memizy/oqse.
|
|
4
4
|
|
|
5
|
+
🚀 **[OQSE Web Validator](https://memizy.github.io/oqse-specification/)** - Online tool for easy testing and debugging of OQSE JSON structures in the browser.
|
|
6
|
+
|
|
5
7
|
This repository contains:
|
|
8
|
+
- The human-readable specifications split into three standalone documents:
|
|
9
|
+
- [OQSE (Study Sets)](./oqse.md)
|
|
10
|
+
- [OQSEM (Application Manifests)](./oqse-manifest.md)
|
|
11
|
+
- [OQSEP (User Progress)](./oqse-progress.md)
|
|
6
12
|
- Runtime validators built with Zod.
|
|
7
13
|
- Manually authored TypeScript types for developer ergonomics.
|
|
8
14
|
- Auto-generated JSON Schemas distributed with the package.
|
|
9
|
-
- The human-readable specification in SPECIFICATION.md.
|
|
10
15
|
|
|
11
16
|
## Package
|
|
12
17
|
|
|
13
18
|
- Name: @memizy/oqse
|
|
14
|
-
- Purpose: validate, parse, and type OQSE,
|
|
19
|
+
- Purpose: validate, parse, and type OQSE, OQSEM (Application Manifest), and OQSEP (User Progress) data.
|
|
15
20
|
|
|
16
21
|
## Architecture & Single Source of Truth
|
|
17
22
|
|
|
18
|
-
|
|
19
|
-
|
|
23
|
+
The human-readable Markdown specifications are the **absolute single source of truth** for the OQSE ecosystem.
|
|
24
|
+
|
|
25
|
+
1. **The Specifications**
|
|
26
|
+
The three Markdown files ([oqse.md](./oqse.md), [oqse-manifest.md](./oqse-manifest.md), and [oqse-progress.md](./oqse-progress.md)) constitute the normative documentation for concepts, rules, and semantics.
|
|
20
27
|
|
|
21
|
-
2. Zod
|
|
22
|
-
Runtime
|
|
28
|
+
2. **Zod Schemas**
|
|
29
|
+
Runtime validators (`*Validation.ts`) are implementations. They **MUST match** the rules defined in the Markdown specs. They are not the source of truth; if they disagree with the text spec, the code is considered a bug.
|
|
23
30
|
|
|
24
|
-
3. TypeScript
|
|
25
|
-
|
|
31
|
+
3. **TypeScript Types**
|
|
32
|
+
TypeScript types (`oqse.ts`, `manifest.ts`, `progress.ts`) manually mirror the Zod schemas for better Developer Experience. They must also strictly adhere to the Markdown specifications.
|
|
26
33
|
|
|
27
34
|
4. JSON schemas are strictly auto-generated using npm run generate:schemas and contributors MUST NOT edit them manually.
|
|
28
35
|
If validation behavior changes, update the Zod schemas first, then regenerate.
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`zod`);function t(e){return e.type===`note`}function n(e){return e.type===`flashcard`}function r(e){return e.type===`true-false`}function i(e){return e.type===`mcq-single`}function a(e){return e.type===`mcq-multi`}function ee(e){return e.type===`short-answer`}function te(e){return e.type===`fill-in-blanks`}function ne(e){return e.type===`fill-in-select`}function re(e){return e.type===`match-pairs`}function ie(e){return e.type===`match-complex`}function ae(e){return e.type===`sort-items`}function oe(e){return e.type===`slider`}function se(e){return e.type===`pin-on-image`}function ce(e){return e.type===`categorize`}function le(e){return e.type===`timeline`}function ue(e){return e.type===`matrix`}function de(e){return e.type===`math-input`}function fe(e){return e.type===`diagram-label`}function pe(e){return e.type===`open-ended`}function me(e){return e.type===`numeric-input`}function he(e){return e.type===`pin-on-model`}function ge(e){return e.type===`chess-puzzle`}function o(e){return[`note`,`flashcard`,`mcq-single`,`short-answer`].includes(e.type)}function _e(e){return!o(e)}var s=e.z.string().uuid({message:`Neplatn+� form+�t UUID`}),c=e.z.string().min(2,`K+-d jazyka mus+� m+�t alespo+� 2 znaky`).regex(/^[a-z]{2,3}(-[A-Z][a-z]{3})?(-[A-Z]{2})?$/,`Neplatn+� form+�t BCP 47 (nap+�. "cs", "en-US")`),l=e.z.string().min(1,`Identifik+�tor licence nesm+� b+�t pr+�zdn+�`),u=e.z.string().regex(/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d{3})?(Z|[+-]\d{2}:\d{2})?)?$/,`Neplatn+� form+�t ISO 8601 (nap+�. "2025-11-21T14:30:00Z")`),d=e.z.string().url({message:`Mus+� b+�t platn+� absolutn+� URL adresa`}),f=e.z.string().regex(/^[a-z0-9_-]+$/,`Kl+��� assetu mus+� obsahovat pouze mal+� p+�smena, ��+�sla, poml��ky a podtr+�+�tka`),p=e.z.string().min(1,`Text nesm+� b+�t pr+�zdn+�`),m=e.z.string().min(1,`Obsah nesm+� b+�t pr+�zdn+�`),h=e.z.string().optional(),g=e.z.object({lang:c,value:e.z.string().min(1,`URI titulk+� nesm+� b+�t pr+�zdn+�`),label:e.z.string().optional(),kind:e.z.enum([`captions`,`subtitles`,`descriptions`]).optional()}),ve=e.z.object({type:e.z.enum([`image`,`audio`,`video`,`model`]),value:e.z.string().min(1,`URI m+�dia nesm+� b+�t pr+�zdn+�`),mimeType:e.z.string().optional(),altText:e.z.string().optional(),transcript:m.optional(),caption:m.optional(),width:e.z.number().int().positive().optional(),height:e.z.number().int().positive().optional(),start:e.z.number().nonnegative().optional(),end:e.z.number().positive().optional(),loop:e.z.boolean().optional(),subtitles:e.z.array(g).optional(),license:l.optional(),attribution:e.z.string().optional(),checksums:e.z.record(e.z.string(),e.z.string()).optional()}).refine(e=>e.start!==void 0&&e.end!==void 0?e.start<e.end:!0,{message:`Po��+�te��n+� ��as mus+� b+�t men+�+� ne+� koncov+� ��as`,path:[`end`]}).refine(e=>!(e.type===`image`&&!e.altText),{message:`Obr+�zky mus+� m+�t definovan+� alternativn+� text (altText) pro p+�+�stupnost`,path:[`altText`]}),_=e.z.record(f,ve),v=e.z.object({name:p,role:e.z.string().optional(),email:e.z.string().email(`Neplatn+� form+�t e-mailov+� adresy`).optional(),url:d.optional()}),y=e.z.enum([`url`,`doi`,`isbn`,`pdf`,`textbook`,`video`,`audio`,`image`,`model`,`other`]),b=e.z.object({id:p,type:y,value:p,title:p,description:e.z.string().optional(),authors:e.z.array(p).optional(),publishedDate:u.optional(),retrievedAt:u.optional(),license:l.optional()}).refine(e=>{if([`url`,`pdf`,`video`,`audio`,`image`].includes(e.type))try{return new URL(e.value),!0}catch{return!1}return!0},{message:`Pro typy url, pdf, video, audio a image mus+� b+�t value platn+� URL adresa`,path:[`value`]}),x=e.z.object({id:p,location:e.z.string().optional(),quote:m.optional()}),S=e.z.object({wikidataId:e.z.string().regex(/^Q\d+$/,`Wikidata ID mus+� m+�t form+�t Q n+�sledovan+� ��+�slem`).optional(),description:e.z.string().optional()}),C=e.z.record(e.z.string(),S),w=e.z.object({features:e.z.array(e.z.string().min(1,`Kl+��� funkce nesm+� b+�t pr+�zdn+�`)).optional(),latexPackages:e.z.array(e.z.string().min(1,`N+�zev bal+���ku nesm+� b+�t pr+�zdn+�`)).optional(),itemProperties:e.z.array(e.z.string().min(1,`Kl+��� vlastnosti nesm+� b+�t pr+�zdn+�`)).optional(),metaProperties:e.z.array(e.z.string().min(1,`Kl+��� vlastnosti nesm+� b+�t pr+�zdn+�`)).optional()}),T=e.z.enum([`official`,`experimental`,`proprietary`]),ye=e.z.enum([`math`,`media-image`,`media-audio`,`media-video`,`hotspots`,`complex-pairing`,`open-text`]),E=e.z.object({name:p,type:T,vendor:e.z.string().optional()}).refine(e=>!(e.type===`proprietary`&&!e.vendor),{message:`Propriet+�rn+� funkce mus+� m+�t definovan+� vendor (nap+�. "memizy.com")`,path:[`vendor`]}),D=e.z.object({lang:c,id:s,title:p,downloadUrl:d.optional()}),O=e.z.object({id:s,title:p,downloadUrl:d.optional()}),k=e.z.enum([`remember`,`understand`,`apply`,`analyze`,`evaluate`,`create`]),A=e.z.enum([`low`,`medium`,`high`]),j=e.z.object({bloomLevel:k.optional(),irtDifficulty:e.z.number().optional(),irtDiscrimination:e.z.number().optional(),irtGuessing:e.z.number().min(0).max(1,`IRT guessing mus+� b+�t mezi 0 a 1`).optional(),avgTime:e.z.number().positive().optional(),cognitiveLoad:A.optional(),partialCredit:e.z.boolean().optional(),penaltyPerWrong:e.z.number().min(0).max(1,`Penalizace mus+� b+�t mezi 0 a 1`).optional()}),M=e.z.enum([`katex`,`mathjax`]),N=e.z.object({renderer:M.optional(),packages:e.z.array(e.z.string()).optional()}),P=e.z.object({id:s,language:c,title:p.max(500,`Titulek nesm+� b+�t del+�+� ne+� 500 znak+�`),description:m.max(5e3,`Popis nesm+� b+�t del+�+� ne+� 5000 znak+�`).optional(),thumbnail:f.optional(),assets:_.optional(),ageMin:e.z.number().int().nonnegative().optional(),ageMax:e.z.number().int().nonnegative().optional(),subject:e.z.string().optional(),createdAt:u,updatedAt:u,author:v.optional(),contributors:e.z.array(v).optional(),license:l.optional(),licenseUrl:d.optional(),requirements:w.optional(),requiredFeatures:e.z.array(E).optional(),tags:e.z.array(p).optional(),tagDefinitions:C.optional(),translations:e.z.array(D).optional(),sourceMaterials:e.z.array(b).optional(),estimatedTime:e.z.number().positive().optional(),prerequisites:e.z.array(O).optional(),relatedSets:e.z.array(O).optional(),mathSettings:N.optional(),customData:e.z.record(e.z.string(),e.z.unknown()).optional(),appSpecific:e.z.record(e.z.string(),e.z.unknown()).optional()}).refine(e=>e.ageMin!==void 0&&e.ageMax!==void 0?e.ageMin<=e.ageMax:!0,{message:`Minim+�ln+� v��k (ageMin) mus+� b+�t men+�+� nebo roven maxim+�ln+�mu v��ku (ageMax)`,path:[`ageMax`]}).refine(e=>new Date(e.createdAt)<=new Date(e.updatedAt),{message:`Datum vytvo+�en+� (createdAt) mus+� b+�t p+�ed nebo stejn+� jako datum aktualizace (updatedAt)`,path:[`updatedAt`]}),F=e.z.object({id:s,type:e.z.string(),assets:_.optional(),lang:c.optional(),tags:e.z.array(p).optional(),difficulty:e.z.number().int().min(1,`Obt+�+�nost mus+� b+�t minim+�ln�� 1`).max(5,`Obt+�+�nost mus+� b+�t maxim+�ln�� 5`).optional(),timeLimit:e.z.number().positive(`��asov+� limit mus+� b+�t kladn+� ��+�slo`).optional(),hints:e.z.array(m.max(2e3,`N+�pov��da nesm+� b+�t del+�+� ne+� 2000 znak+�`)).max(20,`Maxim+�ln�� 20 n+�pov��d na polo+�ku`).optional(),explanation:m.max(1e4,`Vysv��tlen+� nesm+� b+�t del+�+� ne+� 10000 znak+�`).optional(),incorrectFeedback:m.optional(),sources:e.z.array(x).optional(),relatedItems:e.z.array(s).optional(),dependencyItems:e.z.array(s).optional(),pedagogy:j.optional(),customData:e.z.record(e.z.string(),e.z.unknown()).optional(),appSpecific:e.z.record(e.z.string(),e.z.unknown()).optional()}),I=e.z.object({options:e.z.array(m).min(1,`Mus+� b+�t alespo+� 1 mo+�nost`),correctIndex:e.z.number().int().nonnegative()}).refine(e=>e.correctIndex<e.options.length,{message:`Index spr+�vn+� odpov��di odkazuje na neexistuj+�c+� mo+�nost`,path:[`correctIndex`]}),L=e.z.object({type:e.z.literal(`rect`),label:e.z.string().optional(),x:e.z.number().min(0).max(100,`X mus+� b+�t v rozmez+� 0-100%`),y:e.z.number().min(0).max(100,`Y mus+� b+�t v rozmez+� 0-100%`),width:e.z.number().min(0).max(100,`+�+�+�ka mus+� b+�t v rozmez+� 0-100%`),height:e.z.number().min(0).max(100,`V+�+�ka mus+� b+�t v rozmez+� 0-100%`)}),R=e.z.object({type:e.z.literal(`circle`),label:e.z.string().optional(),x:e.z.number().min(0).max(100,`X mus+� b+�t v rozmez+� 0-100%`),y:e.z.number().min(0).max(100,`Y mus+� b+�t v rozmez+� 0-100%`),radius:e.z.number().min(0).max(100,`Polom��r mus+� b+�t v rozmez+� 0-100%`)}),z=e.z.object({type:e.z.literal(`polygon`),label:e.z.string().optional(),points:e.z.array(e.z.object({x:e.z.number().min(0).max(100),y:e.z.number().min(0).max(100)})).min(3,`Polygon mus+� m+�t alespo+� 3 body`)}),B=e.z.object({type:e.z.literal(`mesh`),label:e.z.string().optional(),targetName:p}),V=e.z.discriminatedUnion(`type`,[L,R,z,B]),H=e.z.object({x:e.z.number(),y:e.z.number(),z:e.z.number()}),U=e.z.object({position:H.optional(),target:H.optional()}),be=e.z.object({id:p,text:m,correctCategoryIndex:e.z.number().int().nonnegative()}),xe=e.z.enum([`year`,`month`,`day`,`datetime`]),Se=e.z.object({id:p,text:m,date:u,precision:xe.optional()}),Ce=e.z.union([L.extend({correctLabelIndex:e.z.number().int().nonnegative()}),R.extend({correctLabelIndex:e.z.number().int().nonnegative()}),z.extend({correctLabelIndex:e.z.number().int().nonnegative()})]),we=e.z.object({label:p,percentage:e.z.number().min(0,`Procenta mus+� b+�t nez+�porn+�`).max(100,`Procenta nesm+� p+�es+�hnout 100`),description:e.z.string().optional()}),Te=e.z.object({criteria:e.z.array(we).min(1,`Rubrika mus+� m+�t alespo+� 1 krit+�rium`)}).refine(e=>e.criteria.reduce((e,t)=>e+t.percentage,0)>0,{message:`Sou��et procent v+�ech krit+�ri+� mus+� b+�t v��t+�+� ne+� 0`,path:[`criteria`]}),Ee=e.z.object({min:e.z.number(),max:e.z.number()}).refine(e=>e.min<=e.max,{message:`Minim+�ln+� hodnota mus+� b+�t men+�+� nebo rovna maxim+�ln+� hodnot��`,path:[`max`]}),De=F.extend({type:e.z.literal(`note`),title:e.z.string().optional(),content:m.max(1e4,`Obsah nesm+� b+�t del+�+� ne+� 10000 znak+�`)}),Oe=F.extend({type:e.z.literal(`flashcard`),front:m.max(1e4,`P+�edn+� strana nesm+� b+�t del+�+� ne+� 10000 znak+�`),back:m.max(1e4,`Zadn+� strana nesm+� b+�t del+�+� ne+� 10000 znak+�`)}),ke=F.extend({type:e.z.literal(`true-false`),question:m.max(1e4,`Ot+�zka nesm+� b+�t del+�+� ne+� 10000 znak+�`),answer:e.z.boolean()}),Ae=F.extend({type:e.z.literal(`mcq-single`),question:m.max(1e4,`Ot+�zka nesm+� b+�t del+�+� ne+� 10000 znak+�`),options:e.z.array(m.max(2e3,`Mo+�nost nesm+� b+�t del+�+� ne+� 2000 znak+�`)).min(2,`Ot+�zka mus+� m+�t alespo+� 2 mo+�nosti`).max(100,`Maxim+�ln�� 100 mo+�nost+�`),correctIndex:e.z.number().int().nonnegative(),shuffleOptions:e.z.boolean().optional(),optionExplanations:e.z.array(e.z.union([m,e.z.null()])).optional()}).refine(e=>e.correctIndex<e.options.length,{message:`Index spr+�vn+� odpov��di odkazuje na neexistuj+�c+� mo+�nost`,path:[`correctIndex`]}).refine(e=>e.optionExplanations?e.optionExplanations.length===e.options.length:!0,{message:`Po��et vysv��tlen+� mo+�nost+� mus+� b+�t stejn+� jako po��et mo+�nost+�`,path:[`optionExplanations`]}),je=F.extend({type:e.z.literal(`mcq-multi`),question:m.max(1e4,`Ot+�zka nesm+� b+�t del+�+� ne+� 10000 znak+�`),options:e.z.array(m.max(2e3,`Mo+�nost nesm+� b+�t del+�+� ne+� 2000 znak+�`)).min(2,`Ot+�zka mus+� m+�t alespo+� 2 mo+�nosti`).max(100,`Maxim+�ln�� 100 mo+�nost+�`),correctIndices:e.z.array(e.z.number().int().nonnegative()).min(1,`Mus+� b+�t alespo+� 1 spr+�vn+� odpov����`),minSelections:e.z.number().int().positive().optional(),maxSelections:e.z.number().int().positive().optional(),shuffleOptions:e.z.boolean().optional(),optionExplanations:e.z.array(e.z.union([m,e.z.null()])).optional()}).refine(e=>e.correctIndices.every(t=>t<e.options.length),{message:`N��kter+� z index+� spr+�vn+�ch odpov��d+� odkazuje na neexistuj+�c+� mo+�nost`,path:[`correctIndices`]}).refine(e=>new Set(e.correctIndices).size===e.correctIndices.length,{message:`Indexy spr+�vn+�ch odpov��d+� obsahuj+� duplicity`,path:[`correctIndices`]}).refine(e=>e.minSelections&&e.maxSelections?e.minSelections<=e.maxSelections:!0,{message:`Minim+�ln+� po��et v+�b��r+� mus+� b+�t men+�+� nebo roven maxim+�ln+�mu po��tu`,path:[`maxSelections`]}).refine(e=>e.maxSelections?e.maxSelections<=e.options.length:!0,{message:`Maxim+�ln+� po��et v+�b��r+� nesm+� p+�es+�hnout po��et mo+�nost+�`,path:[`maxSelections`]}).refine(e=>e.optionExplanations?e.optionExplanations.length===e.options.length:!0,{message:`Po��et vysv��tlen+� mo+�nost+� mus+� b+�t stejn+� jako po��et mo+�nost+�`,path:[`optionExplanations`]}),W=F.extend({type:e.z.literal(`short-answer`),question:m.max(1e4,`Ot+�zka nesm+� b+�t del+�+� ne+� 10000 znak+�`),answers:e.z.array(p).min(1,`Mus+� b+�t alespo+� 1 spr+�vn+� odpov����`),caseSensitive:e.z.boolean().optional(),trimWhitespace:e.z.boolean().optional(),acceptPartial:e.z.boolean().optional(),ignoreDiacritics:e.z.boolean().optional()}),Me=F.extend({type:e.z.literal(`fill-in-blanks`),question:h,text:m.max(1e4,`Text nesm+� b+�t del+�+� ne+� 10000 znak+�`),blanks:e.z.record(e.z.string(),e.z.array(p).min(1,`Ka+�d+� mezera mus+� m+�t alespo+� 1 spr+�vnou odpov����`)),caseSensitive:e.z.boolean().optional(),trimWhitespace:e.z.boolean().optional()}).refine(e=>Object.keys(e.blanks).length>0,{message:`Text mus+� obsahovat alespo+� 1 mezeru k dopln��n+�`,path:[`blanks`]}).refine(e=>{let t=/<blank:([a-zA-Z0-9_-]{1,64})\s*\/>/g,n=new Set,r;for(;(r=t.exec(e.text))!==null;)r[1]&&n.add(r[1]);let i=new Set(Object.keys(e.blanks));for(let e of n)if(!i.has(e))return!1;for(let e of i)if(!n.has(e))return!1;return!0},{message:`V+�echny tokeny v textu mus+� m+�t definici v blanks a v+�echny definice mus+� b+�t pou+�ity v textu`,path:[`blanks`]}),Ne=F.extend({type:e.z.literal(`fill-in-select`),question:h,text:m.max(1e4,`Text nesm+� b+�t del+�+� ne+� 10000 znak+�`),blanks:e.z.record(e.z.string(),I)}).refine(e=>Object.keys(e.blanks).length>0,{message:`Text mus+� obsahovat alespo+� 1 mezeru k v+�b��ru`,path:[`blanks`]}).refine(e=>{let t=/<blank:([a-zA-Z0-9_-]{1,64})\s*\/>/g,n=new Set,r;for(;(r=t.exec(e.text))!==null;)r[1]&&n.add(r[1]);let i=new Set(Object.keys(e.blanks));for(let e of n)if(!i.has(e))return!1;for(let e of i)if(!n.has(e))return!1;return!0},{message:`V+�echny tokeny v textu mus+� m+�t definici v blanks a v+�echny definice mus+� b+�t pou+�ity v textu`,path:[`blanks`]}),Pe=F.extend({type:e.z.literal(`match-pairs`),question:h,prompts:e.z.array(m).min(2,`Mus+� b+�t alespo+� 2 p+�ry k p+�i+�azen+�`),matches:e.z.array(m).min(2,`Mus+� b+�t alespo+� 2 p+�ry k p+�i+�azen+�`)}).refine(e=>e.prompts.length===e.matches.length,{message:`Po��et ot+�zek (prompts) mus+� b+�t stejn+� jako po��et odpov��d+� (matches)`,path:[`matches`]}),Fe=F.extend({type:e.z.literal(`match-complex`),question:h,leftItems:e.z.array(m).min(1,`Mus+� b+�t alespo+� 1 polo+�ka vlevo`),rightItems:e.z.array(m).min(1,`Mus+� b+�t alespo+� 1 polo+�ka vpravo`),connections:e.z.array(e.z.tuple([e.z.number().int().nonnegative(),e.z.number().int().nonnegative()])).min(1,`Mus+� b+�t alespo+� 1 propojen+�`),minCorrect:e.z.number().int().positive().optional()}).refine(e=>e.connections.every(([t,n])=>t<e.leftItems.length&&n<e.rightItems.length),{message:`N��kter+� propojen+� odkazuje na neexistuj+�c+� polo+�ku`,path:[`connections`]}).refine(e=>new Set(e.connections.map(e=>`${e[0]}-${e[1]}`)).size===e.connections.length,{message:`Propojen+� obsahuj+� duplicity`,path:[`connections`]}).refine(e=>e.minCorrect?e.minCorrect<=e.connections.length:!0,{message:`Minim+�ln+� po��et spr+�vn+�ch odpov��d+� nesm+� p+�es+�hnout celkov+� po��et propojen+�`,path:[`minCorrect`]}),Ie=F.extend({type:e.z.literal(`sort-items`),question:m.max(1e4,`Ot+�zka nesm+� b+�t del+�+� ne+� 10000 znak+�`),items:e.z.array(m).min(2,`Mus+� b+�t alespo+� 2 polo+�ky k se+�azen+�`)}),Le=F.extend({type:e.z.literal(`slider`),question:m.max(1e4,`Ot+�zka nesm+� b+�t del+�+� ne+� 10000 znak+�`),min:e.z.number(),max:e.z.number(),step:e.z.number().positive(`Krok mus+� b+�t kladn+� ��+�slo`),correctAnswer:e.z.number(),tolerance:e.z.number().nonnegative(`Tolerance mus+� b+�t nez+�porn+�`),unit:e.z.string().optional()}).refine(e=>e.min<e.max,{message:`Minim+�ln+� hodnota mus+� b+�t men+�+� ne+� maxim+�ln+� hodnota`,path:[`max`]}).refine(e=>e.correctAnswer>=e.min&&e.correctAnswer<=e.max,{message:`Spr+�vn+� odpov���� mus+� b+�t v rozmez+� min-max`,path:[`correctAnswer`]}).refine(e=>{let t=(e.correctAnswer-e.min)/e.step;return Math.abs(t-Math.round(t))<1e-4},{message:`Spr+�vn+� odpov���� mus+� b+�t dosa+�iteln+� pomoc+� definovan+�ho kroku`,path:[`correctAnswer`]}).refine(e=>e.tolerance<=(e.max-e.min)/2,{message:`Tolerance nesm+� b+�t v��t+�+� ne+� polovina rozsahu hodnot`,path:[`tolerance`]}),Re=F.extend({type:e.z.literal(`pin-on-image`),question:m.max(1e4,`Ot+�zka nesm+� b+�t del+�+� ne+� 10000 znak+�`),targetAsset:f,hotspots:e.z.array(V).min(1,`Mus+� b+�t alespo+� 1 hotspot`),multipleCorrect:e.z.boolean().optional(),minCorrect:e.z.number().int().positive().optional()}).refine(e=>e.minCorrect?e.minCorrect<=e.hotspots.length:!0,{message:`Minim+�ln+� po��et spr+�vn+�ch odpov��d+� nesm+� p+�es+�hnout po��et hotspot+�`,path:[`minCorrect`]}),ze=F.extend({type:e.z.literal(`categorize`),question:m.max(1e4,`Ot+�zka nesm+� b+�t del+�+� ne+� 10000 znak+�`),categories:e.z.array(p).min(2,`Mus+� b+�t alespo+� 2 kategorie`),items:e.z.array(be).min(1,`Mus+� b+�t alespo+� 1 polo+�ka ke kategorizaci`)}).refine(e=>e.items.every(t=>t.correctCategoryIndex<e.categories.length),{message:`N��kter+� polo+�ka odkazuje na neexistuj+�c+� kategorii`,path:[`items`]}),Be=F.extend({type:e.z.literal(`timeline`),question:m.max(1e4,`Ot+�zka nesm+� b+�t del+�+� ne+� 10000 znak+�`),events:e.z.array(Se).min(2,`Mus+� b+�t alespo+� 2 ud+�losti`),randomize:e.z.boolean().optional()}),Ve=F.extend({type:e.z.literal(`matrix`),question:m.max(1e4,`Ot+�zka nesm+� b+�t del+�+� ne+� 10000 znak+�`),rows:e.z.array(p).min(1,`Mus+� b+�t alespo+� 1 +�+�dek`),columns:e.z.array(p).min(1,`Mus+� b+�t alespo+� 1 sloupec`),correctCells:e.z.array(e.z.tuple([e.z.number().int().nonnegative(),e.z.number().int().nonnegative()])).min(1,`Mus+� b+�t alespo+� 1 spr+�vn+� bu+�ka`),multiplePerRow:e.z.boolean().optional()}).refine(e=>e.correctCells.every(([t,n])=>t<e.rows.length&&n<e.columns.length),{message:`N��kter+� sou+�adnice bu+�ky odkazuj+� na neexistuj+�c+� +�+�dek nebo sloupec`,path:[`correctCells`]}).refine(e=>new Set(e.correctCells.map(e=>`${e[0]}-${e[1]}`)).size===e.correctCells.length,{message:`Spr+�vn+� bu+�ky obsahuj+� duplicity`,path:[`correctCells`]}).refine(e=>{if(!e.multiplePerRow){let t=new Map;for(let[n]of e.correctCells)t.set(n,(t.get(n)||0)+1);return Array.from(t.values()).every(e=>e<=1)}return!0},{message:`Pokud multiplePerRow je false, ka+�d+� +�+�dek sm+� m+�t maxim+�ln�� 1 spr+�vnou bu+�ku`,path:[`correctCells`]}),He=F.extend({type:e.z.literal(`math-input`),question:m.max(1e4,`Ot+�zka nesm+� b+�t del+�+� ne+� 10000 znak+�`),correctAnswer:p,alternativeAnswers:e.z.array(p).optional(),tolerance:e.z.number().nonnegative().optional()}),Ue=F.extend({type:e.z.literal(`diagram-label`),question:m.max(1e4,`Ot+�zka nesm+� b+�t del+�+� ne+� 10000 znak+�`),targetAsset:f,labels:e.z.array(m).min(1,`Mus+� b+�t alespo+� 1 +�t+�tek`),caseSensitive:e.z.boolean().optional(),requireTyping:e.z.boolean().optional(),zones:e.z.array(Ce).min(1,`Mus+� b+�t alespo+� 1 z+-na`)}).refine(e=>e.zones.every(t=>t.correctLabelIndex<e.labels.length),{message:`N��kter+� z+-na odkazuje na neexistuj+�c+� +�t+�tek`,path:[`zones`]}),We=F.extend({type:e.z.literal(`open-ended`),question:m.max(1e4,`Ot+�zka nesm+� b+�t del+�+� ne+� 10000 znak+�`),minWords:e.z.number().int().positive().optional(),maxWords:e.z.number().int().positive().optional(),sampleAnswer:m.optional(),rubric:Te.optional()}).refine(e=>e.minWords&&e.maxWords?e.minWords<=e.maxWords:!0,{message:`Minim+�ln+� po��et slov mus+� b+�t men+�+� nebo roven maxim+�ln+�mu po��tu`,path:[`maxWords`]}),Ge=F.extend({type:e.z.literal(`numeric-input`),question:m.max(1e4,`Ot+�zka nesm+� b+�t del+�+� ne+� 10000 znak+�`),value:e.z.number(),tolerance:e.z.number().nonnegative().optional(),range:Ee.optional(),unit:e.z.string().optional()}),Ke=F.extend({type:e.z.literal(`pin-on-model`),question:m.max(1e4,`Ot+�zka nesm+� b+�t del+�+� ne+� 10000 znak+�`),targetAsset:f,hotspots:e.z.array(B).min(1,`Mus+� b+�t alespo+� 1 hotspot`),multipleCorrect:e.z.boolean().optional(),minCorrect:e.z.number().int().positive().optional(),camera:U.optional()}).refine(e=>e.minCorrect?e.minCorrect<=e.hotspots.length:!0,{message:`Minim+�ln+� po��et spr+�vn+�ch odpov��d+� nesm+� p+�es+�hnout po��et hotspot+�`,path:[`minCorrect`]}),qe=F.extend({type:e.z.literal(`chess-puzzle`),question:m.max(1e4,`Ot+�zka nesm+� b+�t del+�+� ne+� 10000 znak+�`),fen:p,answers:e.z.array(e.z.array(p).min(1,`Sekvence tah+� nesm+� b+�t pr+�zdn+�`)).min(1,`Mus+� b+�t alespo+� 1 spr+�vn+� sekvence tah+�`),elo:e.z.number().int().nonnegative(`ELO mus+� b+�t nez+�porn+� cel+� ��+�slo`).optional()}),G=e.z.discriminatedUnion(`type`,[De,Oe,ke,Ae,je,W,Me,Ne,Pe,Fe,Ie,Le,Re,ze,Be,Ve,He,Ue,We,Ge,Ke,qe]),K=e.z.object({$schema:e.z.string().url().optional(),version:e.z.string().regex(/^\d+\.\d+$/,`Verze musi byt ve formatu "X.Y" (napr. "0.1")`),meta:P,items:e.z.array(G).max(1e4,`Maxim+�ln�� 10000 polo+�ek na sadu`)}).refine(e=>{let t=new Set(e.items.map(e=>e.id));for(let n of e.items){if(n.relatedItems){for(let e of n.relatedItems)if(!t.has(e))return!1}if(n.dependencyItems){for(let e of n.dependencyItems)if(!t.has(e))return!1}}return!0},{message:`N��kter+� polo+�ka odkazuje na neexistuj+�c+� relatedItems nebo dependencyItems`,path:[`items`]}).refine(e=>e.meta.thumbnail&&e.meta.assets?e.meta.thumbnail in e.meta.assets:!0,{message:`Thumbnail odkazuje na neexistuj+�c+� asset`,path:[`meta`,`thumbnail`]}).refine(e=>{let t=new Set((e.meta.sourceMaterials||[]).map(e=>e.id));for(let n of e.items)if(n.sources){for(let e of n.sources)if(!t.has(e.id))return!1}return!0},{message:`N��kter+� polo+�ka odkazuje na neexistuj+�c+� source material`,path:[`items`]});function Je(e){return K.parse(e)}function Ye(e){let t=K.safeParse(e);return t.success?{success:!0,data:t.data}:{success:!1,error:t.error}}function Xe(e){return G.parse(e)}function Ze(e){let t=G.safeParse(e);return t.success?{success:!0,data:t.data}:{success:!1,error:t.error}}function Qe(e){return e.issues.map(e=>{let t=e.path.join(` ��� `);return t?`${t}: ${e.message}`:e.message})}function q(e){return/^\d+\.\d+$/.test(e)}function $e(e){return/^\d+\.\d+\.\d+(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$/.test(e)}function J(e,t){let[n=0,r=0]=e.split(`.`).map(Number),[i=0,a=0]=t.split(`.`).map(Number);return n===i?r-a:n-i}function et(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.version==`string`&&typeof t.id==`string`&&typeof t.appName==`string`&&t.appName!==``&&typeof t.capabilities==`object`&&t.capabilities!==null&&Array.isArray(t.capabilities.actions)}function tt(e,t){return!(!q(e)||t.minOqseVersion&&q(t.minOqseVersion)&&J(e,t.minOqseVersion)<0||t.maxOqseVersion&&q(t.maxOqseVersion)&&J(e,t.maxOqseVersion)>0)}var Y=e.z.string().min(1,`Hodnota nesm+� b+�t pr+�zdn+�`).trim(),nt=e.z.string().url(`Mus+� b+�t platn+� absolutn+� URL`).refine(e=>e.startsWith(`http://`)||e.startsWith(`https://`),{message:`URL mus+� pou+�+�vat sch+�ma http nebo https`}),X=e.z.string().regex(/^\d+\.\d+$/,`Verze mus+� b+�t ve form+�tu MAJOR.MINOR (nap+�. "0.1")`),rt=e.z.string().regex(/^\d+\.\d+\.\d+$/,`Verze mus+� b+�t ve form+�tu MAJOR.MINOR.PATCH (nap+�. "1.2.3")`),it=[`render`,`edit`,`validate`,`import`,`export`],at=e.z.string().refine(e=>it.includes(e)||e.startsWith(`x-`),{message:`Akce mus+� b+�t jedna z [render, edit, validate, import, export] nebo m+�t prefix "x-"`}),ot=e.z.enum([`game`,`fun`,`drill`]),st=e.z.enum([`low`,`medium`,`high`]),ct=[`math`,`media`,`media-image`,`media-audio`,`media-video`,`media-model`,`hotspots`,`hotspots-3d`,`complex-pairing`,`open-text`,`chess`],lt=e.z.string().refine(e=>ct.includes(e)||e.startsWith(`x-`),{message:`Funkce mus+� b+�t jedna z ofici+�ln+�ch kl+���+� nebo m+�t prefix "x-"`}),ut=e.z.string().min(1,`Kl+��� vlastnosti polo+�ky nesm+� b+�t pr+�zdn+�`),dt=e.z.string().min(1,`Kl+��� vlastnosti metadat nesm+� b+�t pr+�zdn+�`);function Z(t){return e.z.union([e.z.tuple([e.z.literal(`*`)]),e.z.array(t),e.z.null()])}var ft=e.z.string().refine(e=>e.startsWith(`image/`),{message:`Mus+� b+�t platn+� MIME typ obr+�zku (image/...)`}),pt=e.z.string().refine(e=>e.startsWith(`audio/`),{message:`Mus+� b+�t platn+� MIME typ zvuku (audio/...)`}),mt=e.z.string().refine(e=>e.startsWith(`video/`),{message:`Mus+� b+�t platn+� MIME typ videa (video/...)`}),ht=e.z.string().refine(e=>e.startsWith(`model/`)||e===`application/octet-stream`,{message:`Mus+� b+�t platn+� MIME typ 3D modelu (model/... nebo application/octet-stream)`}),gt=e.z.object({image:Z(ft).optional(),audio:Z(pt).optional(),video:Z(mt).optional(),model:Z(ht).optional()}),_t=w.extend({actions:e.z.array(at).min(1,`Aplikace mus+� podporovat alespo+� jednu akci`),types:Z(Y).optional(),assets:gt.optional()}),Q=e.z.object({$schema:nt.optional(),id:Y.regex(/^[a-z0-9-]+(\.[a-z0-9-]+)*$/,`ID mus+� b+�t ve tvaru reverse-domain (nap+�. "com.acme.app")`),appName:Y.max(100,`N+�zev nesm+� b+�t del+�+� ne+� 100 znak+�`),version:X,pluginVersion:rt.optional(),minOqseVersion:X.optional(),maxOqseVersion:X.optional(),capabilities:_t,author:e.z.string().max(100,`N+�zev autora nesm+� b+�t del+�+� ne+� 100 znak+�`).optional(),authorUrl:nt.optional(),locales:e.z.array(Y).optional(),description:e.z.string().max(500,`Popis nesm+� b+�t del+�+� ne+� 500 znak+�`).optional(),emoji:e.z.string().optional(),tags:e.z.array(Y).optional(),studyMode:ot.optional(),questionDensity:st.optional(),appSpecific:e.z.record(e.z.string(),e.z.unknown()).optional()}).refine(e=>{if(!e.minOqseVersion||!e.maxOqseVersion)return!0;let t=e.minOqseVersion.split(`.`),n=e.maxOqseVersion.split(`.`),r=Number(t[0]),i=Number(t[1]),a=Number(n[0]),ee=Number(n[1]);return r===a?i<=ee:r<a},{message:`minOqseVersion nesm+� b+�t vy+�+�+� ne+� maxOqseVersion`,path:[`minOqseVersion`]});function vt(e){return Q.parse(e)}function yt(e){return Q.safeParse(e)}function bt(e){return e.issues.map(e=>{let t=e.path.map(e=>String(e)).join(`.`);return t?`${t}: ${e.message}`:e.message}).join(`
|
|
2
|
-
`)}function
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`zod`);function t(e){return e.type===`note`}function n(e){return e.type===`flashcard`}function r(e){return e.type===`true-false`}function i(e){return e.type===`mcq-single`}function a(e){return e.type===`mcq-multi`}function o(e){return e.type===`short-answer`}function ee(e){return e.type===`fill-in-blanks`}function te(e){return e.type===`fill-in-select`}function ne(e){return e.type===`match-pairs`}function re(e){return e.type===`match-complex`}function ie(e){return e.type===`sort-items`}function ae(e){return e.type===`slider`}function oe(e){return e.type===`pin-on-image`}function se(e){return e.type===`categorize`}function ce(e){return e.type===`timeline`}function le(e){return e.type===`matrix`}function ue(e){return e.type===`math-input`}function de(e){return e.type===`diagram-label`}function fe(e){return e.type===`open-ended`}function pe(e){return e.type===`numeric-input`}function me(e){return e.type===`pin-on-model`}function he(e){return e.type===`chess-puzzle`}function ge(e){return[`note`,`flashcard`,`mcq-single`,`short-answer`].includes(e.type)}function _e(e){return!ge(e)}var ve=[`render`,`edit`,`validate`,`import`,`export`],s=[`markdown`,`math`,`rtl`,`html`,`syntax-highlighting`,`mermaid`,`smiles`,`abc-notation`,`text-to-speech`,`voice-input`,`handwriting-recognition`],c=[`hints`,`explanation`,`incorrectFeedback`,`sources`,`relatedItems`,`dependencyItems`,`timeLimit`,`lang`,`topic`,`pedagogy`],l=[`description`,`thumbnail`,`subject`,`language`,`author`,`contributors`,`license`,`ageRestriction`,`tags`,`tagDefinitions`,`sourceMaterials`,`estimatedTime`,`prerequisites`,`translations`,`relatedSets`];function u(e){return/^\d+\.\d+$/.test(e)}function ye(e){return/^\d+\.\d+\.\d+(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$/.test(e)}function d(e,t){let[n=0,r=0]=e.split(`.`).map(Number),[i=0,a=0]=t.split(`.`).map(Number);return n===i?r-a:n-i}function be(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.version==`string`&&typeof t.id==`string`&&typeof t.appName==`string`&&t.appName!==``&&typeof t.capabilities==`object`&&t.capabilities!==null&&Array.isArray(t.capabilities.actions)}function xe(e,t){return!(!u(e)||t.minOqseVersion&&u(t.minOqseVersion)&&d(e,t.minOqseVersion)<0||t.maxOqseVersion&&u(t.maxOqseVersion)&&d(e,t.maxOqseVersion)>0)}var f=e.z.string().uuid({message:`Invalid UUID format`}),p=e.z.string().min(2,`Language code must have at least 2 characters`).regex(/^[a-z]{2,3}(-[A-Z][a-z]{3})?(-[A-Z]{2})?$/,`Invalid BCP 47 format (e.g. "cs", "en-US")`),m=e.z.string().min(1,`License identifier must not be empty`),h=e.z.string().regex(/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d{3})?(Z|[+-]\d{2}:\d{2})?)?$/,`Invalid ISO 8601 format (e.g. "2025-11-21T14:30:00Z")`),g=e.z.string().url({message:`Must be a valid absolute URL`}),_=e.z.string().regex(/^[a-z0-9_-]+$/,`Asset key must contain only lowercase letters, numbers, hyphens and underscores`),v=e.z.string().min(1,`Text must not be empty`),y=e.z.string().min(1,`Content must not be empty`),b=e.z.string().optional(),Se=e.z.object({lang:p,value:e.z.string().min(1,`Subtitle URI must not be empty`),label:e.z.string().optional(),kind:e.z.enum([`captions`,`subtitles`,`descriptions`]).optional()}),Ce=e.z.object({type:e.z.enum([`image`,`audio`,`video`,`model`]),value:e.z.string().min(1,`Media URI must not be empty`),mimeType:e.z.string().optional(),altText:e.z.string().optional(),transcript:y.optional(),caption:y.optional(),width:e.z.number().int().positive().optional(),height:e.z.number().int().positive().optional(),start:e.z.number().nonnegative().optional(),end:e.z.number().positive().optional(),loop:e.z.boolean().optional(),subtitles:e.z.array(Se).optional(),license:m.optional(),attribution:e.z.string().optional(),checksums:e.z.record(e.z.string(),e.z.string()).optional()}).refine(e=>e.start!==void 0&&e.end!==void 0?e.start<e.end:!0,{message:`Start time must be less than end time`,path:[`end`]}).refine(e=>!(e.type===`image`&&!e.altText),{message:`Images must have alternative text (altText) defined for accessibility`,path:[`altText`]}),x=e.z.record(_,Ce),S=e.z.object({name:v,role:e.z.string().optional(),email:e.z.string().email(`Invalid email format`).optional(),url:g.optional()}),C=e.z.enum([`url`,`doi`,`isbn`,`pdf`,`textbook`,`video`,`audio`,`image`,`model`,`other`]),w=e.z.object({id:v,type:C,value:v,title:v,description:e.z.string().optional(),authors:e.z.array(v).optional(),publishedDate:h.optional(),retrievedAt:h.optional(),license:m.optional()}).refine(e=>{if([`url`,`pdf`,`video`,`audio`,`image`].includes(e.type))try{return new URL(e.value),!0}catch{return!1}return!0},{message:`For url, pdf, video, audio and image types, value must be a valid URL`,path:[`value`]}),T=e.z.object({id:v,location:e.z.string().optional(),quote:y.optional()}),E=e.z.object({wikidataId:e.z.string().regex(/^Q\d+$/,`Wikidata ID must have format Q followed by number`).optional(),description:e.z.string().optional()}),we=e.z.record(e.z.string(),E),D=e.z.object({features:e.z.array(e.z.string().refine(e=>s.includes(e)||e.startsWith(`x-`),{message:`Feature must be an official key or have prefix "x-"`})).optional(),latexPackages:e.z.array(e.z.string().min(1,`Package name must not be empty`)).optional(),itemProperties:e.z.array(e.z.string().refine(e=>c.includes(e)||e.startsWith(`x-`),{message:`Item property must be an official key or have prefix "x-"`})).optional(),metaProperties:e.z.array(e.z.string().refine(e=>l.includes(e)||e.startsWith(`x-`),{message:`Meta property must be an official key or have prefix "x-"`})).optional()}),Te=e.z.object({lang:p,id:f,title:v,downloadUrl:g.optional()}),O=e.z.object({id:f,title:v,downloadUrl:g.optional()}),Ee=e.z.enum([`remember`,`understand`,`apply`,`analyze`,`evaluate`,`create`]),De=e.z.enum([`low`,`medium`,`high`]),Oe=e.z.object({bloomLevel:Ee.optional(),irtDifficulty:e.z.number().optional(),irtDiscrimination:e.z.number().optional(),irtGuessing:e.z.number().min(0).max(1,`IRT guessing must be between 0 and 1`).optional(),avgTime:e.z.number().positive().optional(),cognitiveLoad:De.optional(),partialCredit:e.z.boolean().optional(),penaltyPerWrong:e.z.number().min(0).max(1,`Penalty must be between 0 and 1`).optional()}),ke=e.z.enum([`katex`,`mathjax`]),Ae=e.z.object({renderer:ke.optional(),packages:e.z.array(e.z.string()).optional()}),je=e.z.object({id:f,language:p,title:v.max(500,`Title must not be longer than 500 characters`),description:y.max(5e3,`Description must not be longer than 5000 characters`).optional(),thumbnail:_.optional(),assets:x.optional(),ageMin:e.z.number().int().nonnegative().optional(),ageMax:e.z.number().int().nonnegative().optional(),subject:e.z.string().optional(),createdAt:h,updatedAt:h,author:S.optional(),contributors:e.z.array(S).optional(),license:m.optional(),licenseUrl:g.optional(),requirements:D.optional(),tags:e.z.array(v).optional(),tagDefinitions:we.optional(),translations:e.z.array(Te).optional(),sourceMaterials:e.z.array(w).optional(),estimatedTime:e.z.number().positive().optional(),prerequisites:e.z.array(O).optional(),relatedSets:e.z.array(O).optional(),mathSettings:Ae.optional(),customData:e.z.record(e.z.string(),e.z.unknown()).optional(),appSpecific:e.z.record(e.z.string(),e.z.unknown()).optional()}).refine(e=>e.ageMin!==void 0&&e.ageMax!==void 0?e.ageMin<=e.ageMax:!0,{message:`Minimum age (ageMin) must be less than or equal to maximum age (ageMax)`,path:[`ageMax`]}).refine(e=>new Date(e.createdAt)<=new Date(e.updatedAt),{message:`Creation date (createdAt) must be before or equal to update date (updatedAt)`,path:[`updatedAt`]}),k=e.z.object({id:f,type:e.z.string(),assets:x.optional(),lang:p.optional(),tags:e.z.array(v).optional(),difficulty:e.z.number().int().min(1,`Difficulty must be at least 1`).max(5,`Difficulty must be at most 5`).optional(),timeLimit:e.z.number().positive(`Time limit must be a positive number`).optional(),hints:e.z.array(y.max(2e3,`Hint must not be longer than 2000 characters`)).max(20,`Maximum 20 hints per item`).optional(),explanation:y.max(1e4,`Explanation must not be longer than 10000 characters`).optional(),incorrectFeedback:y.optional(),sources:e.z.array(T).optional(),relatedItems:e.z.array(f).optional(),dependencyItems:e.z.array(f).optional(),pedagogy:Oe.optional(),customData:e.z.record(e.z.string(),e.z.unknown()).optional(),appSpecific:e.z.record(e.z.string(),e.z.unknown()).optional()}),Me=e.z.object({options:e.z.array(y).min(1,`Must have at least 1 option`),correctIndex:e.z.number().int().nonnegative()}).refine(e=>e.correctIndex<e.options.length,{message:`Correct answer index references non-existent option`,path:[`correctIndex`]}),A=e.z.object({type:e.z.literal(`rect`),label:e.z.string().optional(),x:e.z.number().min(0).max(100,`X must be in range 0-100%`),y:e.z.number().min(0).max(100,`Y must be in range 0-100%`),width:e.z.number().min(0).max(100,`Width must be in range 0-100%`),height:e.z.number().min(0).max(100,`Height must be in range 0-100%`)}),j=e.z.object({type:e.z.literal(`circle`),label:e.z.string().optional(),x:e.z.number().min(0).max(100,`X must be in range 0-100%`),y:e.z.number().min(0).max(100,`Y must be in range 0-100%`),radius:e.z.number().min(0).max(100,`Radius must be in range 0-100%`)}),M=e.z.object({type:e.z.literal(`polygon`),label:e.z.string().optional(),points:e.z.array(e.z.object({x:e.z.number().min(0).max(100),y:e.z.number().min(0).max(100)})).min(3,`Polygon must have at least 3 points`)}),N=e.z.object({type:e.z.literal(`mesh`),label:e.z.string().optional(),targetName:v}),P=e.z.discriminatedUnion(`type`,[A,j,M,N]),F=e.z.object({x:e.z.number(),y:e.z.number(),z:e.z.number()}),I=e.z.object({position:F.optional(),target:F.optional()}),L=e.z.object({id:v,text:y,correctCategoryIndex:e.z.number().int().nonnegative()}),R=e.z.enum([`year`,`month`,`day`,`datetime`]),z=e.z.object({id:v,text:y,date:h,precision:R.optional()}),B=e.z.union([A.extend({correctLabelIndex:e.z.number().int().nonnegative()}),j.extend({correctLabelIndex:e.z.number().int().nonnegative()}),M.extend({correctLabelIndex:e.z.number().int().nonnegative()})]),V=e.z.object({label:v,percentage:e.z.number().min(0,`Percentage must be non-negative`).max(100,`Percentage must not exceed 100`),description:e.z.string().optional()}),H=e.z.object({criteria:e.z.array(V).min(1,`Rubric must have at least 1 criterion`)}).refine(e=>e.criteria.reduce((e,t)=>e+t.percentage,0)>0,{message:`Sum of percentages of all criteria must be greater than 0`,path:[`criteria`]}),Ne=e.z.object({min:e.z.number(),max:e.z.number()}).refine(e=>e.min<=e.max,{message:`Minimum value must be less than or equal to maximum value`,path:[`max`]}),Pe=k.extend({type:e.z.literal(`note`),title:e.z.string().optional(),content:y.max(1e4,`Content must not be longer than 10000 characters`)}),Fe=k.extend({type:e.z.literal(`flashcard`),front:y.max(1e4,`Front side must not be longer than 10000 characters`),back:y.max(1e4,`Back side must not be longer than 10000 characters`)}),Ie=k.extend({type:e.z.literal(`true-false`),question:y.max(1e4,`Question must not be longer than 10000 characters`),answer:e.z.boolean()}),Le=k.extend({type:e.z.literal(`mcq-single`),question:y.max(1e4,`Question must not be longer than 10000 characters`),options:e.z.array(y.max(2e3,`Option must not be longer than 2000 characters`)).min(2,`Question must have at least 2 options`).max(100,`Maximum 100 options`),correctIndex:e.z.number().int().nonnegative(),shuffleOptions:e.z.boolean().optional(),optionExplanations:e.z.array(e.z.union([y,e.z.null()])).optional()}).refine(e=>e.correctIndex<e.options.length,{message:`Correct answer index references non-existent option`,path:[`correctIndex`]}).refine(e=>e.optionExplanations?e.optionExplanations.length===e.options.length:!0,{message:`Number of option explanations must match number of options`,path:[`optionExplanations`]}),Re=k.extend({type:e.z.literal(`mcq-multi`),question:y.max(1e4,`Question must not be longer than 10000 characters`),options:e.z.array(y.max(2e3,`Option must not be longer than 2000 characters`)).min(2,`Question must have at least 2 options`).max(100,`Maximum 100 options`),correctIndices:e.z.array(e.z.number().int().nonnegative()).min(1,`Must have at least 1 correct answer`),minSelections:e.z.number().int().positive().optional(),maxSelections:e.z.number().int().positive().optional(),shuffleOptions:e.z.boolean().optional(),optionExplanations:e.z.array(e.z.union([y,e.z.null()])).optional()}).refine(e=>e.correctIndices.every(t=>t<e.options.length),{message:`Some of correct answer indices reference non-existent option`,path:[`correctIndices`]}).refine(e=>new Set(e.correctIndices).size===e.correctIndices.length,{message:`Correct answer indices contain duplicates`,path:[`correctIndices`]}).refine(e=>e.minSelections&&e.maxSelections?e.minSelections<=e.maxSelections:!0,{message:`Minimum number of selections must be less than or equal to maximum`,path:[`maxSelections`]}).refine(e=>e.maxSelections?e.maxSelections<=e.options.length:!0,{message:`Maximum number of selections must not exceed number of options`,path:[`maxSelections`]}).refine(e=>e.optionExplanations?e.optionExplanations.length===e.options.length:!0,{message:`Number of option explanations must match number of options`,path:[`optionExplanations`]}),ze=k.extend({type:e.z.literal(`short-answer`),question:y.max(1e4,`Question must not be longer than 10000 characters`),answers:e.z.array(v).min(1,`Must have at least 1 correct answer`),caseSensitive:e.z.boolean().optional(),trimWhitespace:e.z.boolean().optional(),acceptPartial:e.z.boolean().optional(),ignoreDiacritics:e.z.boolean().optional()}),Be=k.extend({type:e.z.literal(`fill-in-blanks`),question:b,text:y.max(1e4,`Text must not be longer than 10000 characters`),blanks:e.z.record(e.z.string(),e.z.array(v).min(1,`Each blank must have at least 1 correct answer`)),caseSensitive:e.z.boolean().optional(),trimWhitespace:e.z.boolean().optional()}).refine(e=>Object.keys(e.blanks).length>0,{message:`Text must contain at least 1 blank to fill`,path:[`blanks`]}).refine(e=>{let t=/<blank:([a-zA-Z0-9_-]{1,64})\s*\/>/g,n=new Set,r;for(;(r=t.exec(e.text))!==null;)r[1]&&n.add(r[1]);let i=new Set(Object.keys(e.blanks));for(let e of n)if(!i.has(e))return!1;for(let e of i)if(!n.has(e))return!1;return!0},{message:`All tokens in text must have definition in blanks and all definitions must be used in text`,path:[`blanks`]}),Ve=k.extend({type:e.z.literal(`fill-in-select`),question:b,text:y.max(1e4,`Text must not be longer than 10000 characters`),blanks:e.z.record(e.z.string(),Me)}).refine(e=>Object.keys(e.blanks).length>0,{message:`Text must contain at least 1 blank to select`,path:[`blanks`]}).refine(e=>{let t=/<blank:([a-zA-Z0-9_-]{1,64})\s*\/>/g,n=new Set,r;for(;(r=t.exec(e.text))!==null;)r[1]&&n.add(r[1]);let i=new Set(Object.keys(e.blanks));for(let e of n)if(!i.has(e))return!1;for(let e of i)if(!n.has(e))return!1;return!0},{message:`All tokens in text must have definition in blanks and all definitions must be used in text`,path:[`blanks`]}),He=k.extend({type:e.z.literal(`match-pairs`),question:b,prompts:e.z.array(y).min(2,`Must have at least 2 pairs to match`),matches:e.z.array(y).min(2,`Must have at least 2 pairs to match`)}).refine(e=>e.prompts.length===e.matches.length,{message:`Number of prompts must match number of matches`,path:[`matches`]}),Ue=k.extend({type:e.z.literal(`match-complex`),question:b,leftItems:e.z.array(y).min(1,`Must have at least 1 item on left`),rightItems:e.z.array(y).min(1,`Must have at least 1 item on right`),connections:e.z.array(e.z.tuple([e.z.number().int().nonnegative(),e.z.number().int().nonnegative()])).min(1,`Must have at least 1 connection`),minCorrect:e.z.number().int().positive().optional()}).refine(e=>e.connections.every(([t,n])=>t<e.leftItems.length&&n<e.rightItems.length),{message:`Some connection references non-existent item`,path:[`connections`]}).refine(e=>new Set(e.connections.map(e=>`${e[0]}-${e[1]}`)).size===e.connections.length,{message:`Connections contain duplicates`,path:[`connections`]}).refine(e=>e.minCorrect?e.minCorrect<=e.connections.length:!0,{message:`Minimum correct answers must not exceed total number of connections`,path:[`minCorrect`]}),We=k.extend({type:e.z.literal(`sort-items`),question:y.max(1e4,`Question must not be longer than 10000 characters`),items:e.z.array(y).min(2,`Must have at least 2 items to sort`)}),Ge=k.extend({type:e.z.literal(`slider`),question:y.max(1e4,`Question must not be longer than 10000 characters`),min:e.z.number(),max:e.z.number(),step:e.z.number().positive(`Step must be a positive number`),correctAnswer:e.z.number(),tolerance:e.z.number().nonnegative(`Tolerance must be non-negative`),unit:e.z.string().optional()}).refine(e=>e.min<e.max,{message:`Minimum value must be less than maximum value`,path:[`max`]}).refine(e=>e.correctAnswer>=e.min&&e.correctAnswer<=e.max,{message:`Correct answer must be in range min-max`,path:[`correctAnswer`]}).refine(e=>{let t=(e.correctAnswer-e.min)/e.step;return Math.abs(t-Math.round(t))<1e-4},{message:`Correct answer must be reachable by defined step`,path:[`correctAnswer`]}).refine(e=>e.tolerance<=(e.max-e.min)/2,{message:`Tolerance must not be greater than half of value range`,path:[`tolerance`]}),Ke=k.extend({type:e.z.literal(`pin-on-image`),question:y.max(1e4,`Question must not be longer than 10000 characters`),targetAsset:_,hotspots:e.z.array(P).min(1,`Must have at least 1 hotspot`),multipleCorrect:e.z.boolean().optional(),minCorrect:e.z.number().int().positive().optional()}).refine(e=>e.minCorrect?e.minCorrect<=e.hotspots.length:!0,{message:`Minimum correct answers must not exceed number of hotspots`,path:[`minCorrect`]}),qe=k.extend({type:e.z.literal(`categorize`),question:y.max(1e4,`Question must not be longer than 10000 characters`),categories:e.z.array(v).min(2,`Must have at least 2 categories`),items:e.z.array(L).min(1,`Must have at least 1 item to categorize`)}).refine(e=>e.items.every(t=>t.correctCategoryIndex<e.categories.length),{message:`Some item references non-existent category`,path:[`items`]}),Je=k.extend({type:e.z.literal(`timeline`),question:y.max(1e4,`Question must not be longer than 10000 characters`),events:e.z.array(z).min(2,`Must have at least 2 events`),randomize:e.z.boolean().optional()}),Ye=k.extend({type:e.z.literal(`matrix`),question:y.max(1e4,`Question must not be longer than 10000 characters`),rows:e.z.array(v).min(1,`Must have at least 1 row`),columns:e.z.array(v).min(1,`Must have at least 1 column`),correctCells:e.z.array(e.z.tuple([e.z.number().int().nonnegative(),e.z.number().int().nonnegative()])).min(1,`Must have at least 1 correct cell`),multiplePerRow:e.z.boolean().optional()}).refine(e=>e.correctCells.every(([t,n])=>t<e.rows.length&&n<e.columns.length),{message:`Some cell coordinates reference non-existent row or column`,path:[`correctCells`]}).refine(e=>new Set(e.correctCells.map(e=>`${e[0]}-${e[1]}`)).size===e.correctCells.length,{message:`Correct cells contain duplicates`,path:[`correctCells`]}).refine(e=>{if(!e.multiplePerRow){let t=new Map;for(let[n]of e.correctCells)t.set(n,(t.get(n)||0)+1);return Array.from(t.values()).every(e=>e<=1)}return!0},{message:`If multiplePerRow is false, each row may have maximum 1 correct cell`,path:[`correctCells`]}),Xe=k.extend({type:e.z.literal(`math-input`),question:y.max(1e4,`Question must not be longer than 10000 characters`),correctAnswer:v,alternativeAnswers:e.z.array(v).optional(),tolerance:e.z.number().nonnegative().optional()}),Ze=k.extend({type:e.z.literal(`diagram-label`),question:y.max(1e4,`Question must not be longer than 10000 characters`),targetAsset:_,labels:e.z.array(y).min(1,`Must have at least 1 label`),caseSensitive:e.z.boolean().optional(),requireTyping:e.z.boolean().optional(),zones:e.z.array(B).min(1,`Must have at least 1 zone`)}).refine(e=>e.zones.every(t=>t.correctLabelIndex<e.labels.length),{message:`Some zone references non-existent label`,path:[`zones`]}),Qe=k.extend({type:e.z.literal(`open-ended`),question:y.max(1e4,`Question must not be longer than 10000 characters`),minWords:e.z.number().int().positive().optional(),maxWords:e.z.number().int().positive().optional(),sampleAnswer:y.optional(),rubric:H.optional()}).refine(e=>e.minWords&&e.maxWords?e.minWords<=e.maxWords:!0,{message:`Minimum word count must be less than or equal to maximum`,path:[`maxWords`]}),$e=k.extend({type:e.z.literal(`numeric-input`),question:y.max(1e4,`Question must not be longer than 10000 characters`),value:e.z.number(),tolerance:e.z.number().nonnegative().optional(),range:Ne.optional(),unit:e.z.string().optional()}),et=k.extend({type:e.z.literal(`pin-on-model`),question:y.max(1e4,`Question must not be longer than 10000 characters`),targetAsset:_,hotspots:e.z.array(N).min(1,`Must have at least 1 hotspot`),multipleCorrect:e.z.boolean().optional(),minCorrect:e.z.number().int().positive().optional(),camera:I.optional()}).refine(e=>e.minCorrect?e.minCorrect<=e.hotspots.length:!0,{message:`Minimum correct answers must not exceed number of hotspots`,path:[`minCorrect`]}),tt=k.extend({type:e.z.literal(`chess-puzzle`),question:y.max(1e4,`Question must not be longer than 10000 characters`),fen:v,answers:e.z.array(e.z.array(v).min(1,`Move sequence must not be empty`)).min(1,`Must have at least 1 correct move sequence`),elo:e.z.number().int().nonnegative(`ELO must be non-negative integer`).optional()}),U=e.z.discriminatedUnion(`type`,[Pe,Fe,Ie,Le,Re,ze,Be,Ve,He,Ue,We,Ge,Ke,qe,Je,Ye,Xe,Ze,Qe,$e,et,tt]),W=e.z.object({$schema:e.z.string().url().optional(),version:e.z.string().regex(/^\d+\.\d+$/,`Version must be in MAJOR.MINOR format (e.g. "0.1")`),meta:je,items:e.z.array(U).max(1e4,`Maximum 10000 items per set`)}).refine(e=>{let t=new Set(e.items.map(e=>e.id));for(let n of e.items){if(n.relatedItems){for(let e of n.relatedItems)if(!t.has(e))return!1}if(n.dependencyItems){for(let e of n.dependencyItems)if(!t.has(e))return!1}}return!0},{message:`Some item references non-existent relatedItems or dependencyItems`,path:[`items`]}).refine(e=>e.meta.thumbnail&&e.meta.assets?e.meta.thumbnail in e.meta.assets:!0,{message:`Thumbnail references non-existent asset`,path:[`meta`,`thumbnail`]}).refine(e=>{let t=new Set((e.meta.sourceMaterials||[]).map(e=>e.id));for(let n of e.items)if(n.sources){for(let e of n.sources)if(!t.has(e.id))return!1}return!0},{message:`Some item references non-existent source material`,path:[`items`]});function nt(e){return W.parse(e)}function rt(e){let t=W.safeParse(e);return t.success?{success:!0,data:t.data}:{success:!1,error:t.error}}function it(e){return U.parse(e)}function at(e){let t=U.safeParse(e);return t.success?{success:!0,data:t.data}:{success:!1,error:t.error}}function ot(e){return e.issues.map(e=>{let t=``;return e.path.forEach((n,r)=>{if(typeof n==`number`)t+=`[${n}]`;else{let i=r===0||typeof e.path[r-1]==`number`;t+=(i?``:`.`)+String(n)}}),t?`${t}: ${e.message}`:e.message})}var G=e.z.string().min(1,`Value must not be empty`).trim(),st=e.z.string().url(`Must be a valid absolute URL`).refine(e=>e.startsWith(`http://`)||e.startsWith(`https://`),{message:`URL must use http or https scheme`}),K=e.z.string().regex(/^\d+\.\d+$/,`Version must be in MAJOR.MINOR format (e.g. "0.1")`),ct=e.z.string().regex(/^\d+\.\d+\.\d+$/,`Version must be in MAJOR.MINOR.PATCH format (e.g. "1.2.3")`),lt=e.z.string().refine(e=>ve.includes(e)||e.startsWith(`x-`),{message:`Action must be one of [render, edit, validate, import, export] or have prefix "x-"`}),ut=e.z.enum([`game`,`fun`,`drill`]),dt=e.z.enum([`low`,`medium`,`high`]),ft=e.z.string().refine(e=>s.includes(e)||e.startsWith(`x-`),{message:`Feature must be one of official keys or have prefix "x-"`}),pt=e.z.string().refine(e=>c.includes(e)||e.startsWith(`x-`),{message:`Item property must be an official key or have prefix "x-"`}),mt=e.z.string().refine(e=>l.includes(e)||e.startsWith(`x-`),{message:`Meta property must be an official key or have prefix "x-"`});function q(t){return e.z.union([e.z.tuple([e.z.literal(`*`)]),e.z.array(t),e.z.null()])}var ht=e.z.string().refine(e=>e.startsWith(`image/`),{message:`Must be a valid image MIME type (image/...)`}),gt=e.z.string().refine(e=>e.startsWith(`audio/`),{message:`Must be a valid audio MIME type (audio/...)`}),_t=e.z.string().refine(e=>e.startsWith(`video/`),{message:`Must be a valid video MIME type (video/...)`}),vt=e.z.string().refine(e=>e.startsWith(`model/`)||e===`application/octet-stream`,{message:`Must be a valid 3D model MIME type (model/... or application/octet-stream)`}),yt=e.z.object({image:q(ht).optional(),audio:q(gt).optional(),video:q(_t).optional(),model:q(vt).optional()}),bt=D.extend({actions:e.z.array(lt).min(1,`Application must support at least one action`),types:q(G).optional(),assets:yt.optional()}),J=e.z.object({$schema:st.optional(),id:G.regex(/^[a-z0-9-]+(\.[a-z0-9-]+)*$/,`ID must be in reverse-domain format (e.g. "com.acme.app")`),appName:G.max(100,`Name must not be longer than 100 characters`),version:K,pluginVersion:ct.optional(),minOqseVersion:K.optional(),maxOqseVersion:K.optional(),capabilities:bt,author:e.z.string().max(100,`Author name must not be longer than 100 characters`).optional(),authorUrl:st.optional(),locales:e.z.array(G).optional(),description:e.z.string().max(500,`Description must not be longer than 500 characters`).optional(),emoji:e.z.string().optional(),tags:e.z.array(G).optional(),studyMode:ut.optional(),questionDensity:dt.optional(),appSpecific:e.z.record(e.z.string(),e.z.unknown()).optional()}).refine(e=>{if(!e.minOqseVersion||!e.maxOqseVersion)return!0;let t=e.minOqseVersion.split(`.`),n=e.maxOqseVersion.split(`.`),r=Number(t[0]),i=Number(t[1]),a=Number(n[0]),o=Number(n[1]);return r===a?i<=o:r<a},{message:`minOqseVersion must not be greater than maxOqseVersion`,path:[`minOqseVersion`]});function xt(e){return J.parse(e)}function St(e){return J.safeParse(e)}function Ct(e){return e.issues.map(e=>{let t=e.path.map(e=>String(e)).join(`.`);return t?`${t}: ${e.message}`:e.message}).join(`
|
|
2
|
+
`)}function wt(e){return J.safeParse(e).success}var Tt=e.z.object({attempts:e.z.number().int().nonnegative(),incorrect:e.z.number().int().nonnegative(),streak:e.z.number().int().nonnegative()}).refine(e=>e.incorrect<=e.attempts,{message:`incorrect cannot be higher than attempts`,path:[`incorrect`]}),Y=e.z.object({isCorrect:e.z.boolean(),confidence:e.z.union([e.z.literal(1),e.z.literal(2),e.z.literal(3),e.z.literal(4)]).optional(),answeredAt:h,timeSpent:e.z.number().int().nonnegative().optional(),hintsUsed:e.z.number().int().nonnegative().optional(),isSkipped:e.z.boolean().optional()}).refine(e=>!e.isSkipped||e.isCorrect===!1,{message:`If isSkipped=true, isCorrect must be false`,path:[`isCorrect`]}),Et=e.z.object({bucket:e.z.union([e.z.literal(0),e.z.literal(1),e.z.literal(2),e.z.literal(3),e.z.literal(4)]),nextReviewAt:h.optional(),stats:Tt,lastAnswer:Y.optional(),appSpecific:e.z.record(e.z.string(),e.z.unknown()).optional()}),Dt=e.z.object({setId:f,exportedAt:h,algorithm:e.z.string().regex(/^[a-z0-9-]+$/,`algorithm must be lowercase alphanumeric with hyphens format`).optional()}),X=e.z.object({$schema:e.z.string().url().optional(),version:e.z.string().regex(/^\d+\.\d+$/,`Version must be in MAJOR.MINOR format`),meta:Dt,records:e.z.record(f,Et)});function Ot(e){return X.parse(e)}function kt(e){return X.safeParse(e)}var At=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i;function jt(e){return typeof e==`string`&&At.test(e)}var Z=[];for(let e=0;e<256;++e)Z.push((e+256).toString(16).slice(1));function Mt(e,t=0){return(Z[e[t+0]]+Z[e[t+1]]+Z[e[t+2]]+Z[e[t+3]]+`-`+Z[e[t+4]]+Z[e[t+5]]+`-`+Z[e[t+6]]+Z[e[t+7]]+`-`+Z[e[t+8]]+Z[e[t+9]]+`-`+Z[e[t+10]]+Z[e[t+11]]+Z[e[t+12]]+Z[e[t+13]]+Z[e[t+14]]+Z[e[t+15]]).toLowerCase()}var Q,Nt=new Uint8Array(16);function Pt(){if(!Q){if(typeof crypto>`u`||!crypto.getRandomValues)throw Error(`crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported`);Q=crypto.getRandomValues.bind(crypto)}return Q(Nt)}var $={};function Ft(e,t,n){let r;if(e)r=Lt(e.random??e.rng?.()??Pt(),e.msecs,e.seq,t,n);else{let e=Date.now(),i=Pt();It($,e,i),r=Lt(i,$.msecs,$.seq,t,n)}return t??Mt(r)}function It(e,t,n){return e.msecs??=-1/0,e.seq??=0,t>e.msecs?(e.seq=n[6]<<23|n[7]<<16|n[8]<<8|n[9],e.msecs=t):(e.seq=e.seq+1|0,e.seq===0&&e.msecs++),e}function Lt(e,t,n,r,i=0){if(e.length<16)throw Error(`Random bytes length must be >= 16`);if(!r)r=new Uint8Array(16),i=0;else if(i<0||i+16>r.length)throw RangeError(`UUID byte range ${i}:${i+15} is out of buffer bounds`);return t??=Date.now(),n??=e[6]*127<<24|e[7]<<16|e[8]<<8|e[9],r[i++]=t/1099511627776&255,r[i++]=t/4294967296&255,r[i++]=t/16777216&255,r[i++]=t/65536&255,r[i++]=t/256&255,r[i++]=t&255,r[i++]=112|n>>>28&15,r[i++]=n>>>20&255,r[i++]=128|n>>>14&63,r[i++]=n>>>6&255,r[i++]=n<<2&255|e[10]&3,r[i++]=e[11],r[i++]=e[12],r[i++]=e[13],r[i++]=e[14],r[i++]=e[15],r}function Rt(e){return jt(e)}function zt(){return Ft()}function Bt(e){let t={};return{text:e.replace(/<(asset|blank):([a-zA-Z0-9_-]+)\s*\/>/gi,(e,n,r)=>{let i=`[[__OQSE_TOKEN_${Math.random().toString(36).substring(2,15)}__]]`;return t[i]={type:n.toLowerCase(),key:r.toLowerCase(),originalTag:e},i}),tokens:t}}function Vt(e){let t=e.replace(/`{1,}[^`]*`{1,}/g,``).replace(/~{3,}[\s\S]*?~{3,}/g,``);if(/<[a-zA-Z\/][^>]*>/.test(t))throw Error(`OQSE Security Error: Raw HTML tags are not allowed in Tier 1 (Pure Markdown). If the set requires HTML formatting, it MUST declare the 'html' feature in meta.requirements.`)}function Ht(e,t,n){let r=e;for(let[e,i]of Object.entries(t)){let t=i.originalTag;i.type===`asset`&&n.assetReplacer?t=n.assetReplacer(i.key):i.type===`blank`&&n.blankReplacer&&(t=n.blankReplacer(i.key)),r=r.replace(e,t)}return r}function Ut(e,t,n){if(!e)return``;let r=t?.features?.includes(`html`)??!1,{text:i,tokens:a}=Bt(e);r||Vt(i);let o=n.markdownParser(i);if(r){if(!n.htmlSanitizer)throw Error(`OQSE Security Error: Set requires 'html' (Tier 2), but no htmlSanitizer (like DOMPurify) was provided to the options.`);o=n.htmlSanitizer(o)}return Ht(o,a,n)}exports.AbsoluteURLSchema=g,exports.AssetDictionarySchema=x,exports.AssetKeySchema=_,exports.AudioMimeTypeSchema=gt,exports.BaseItemSchema=k,exports.BloomLevelSchema=Ee,exports.CameraSetupSchema=I,exports.CategorizeItemObjectSchema=L,exports.CategorizeItemSchema=qe,exports.ChessPuzzleItemSchema=tt,exports.CircleHotspotSchema=j,exports.CognitiveLoadSchema=De,exports.DiagramLabelItemSchema=Ze,exports.DiagramZoneSchema=B,exports.FeatureFlagSchema=ft,exports.FeatureProfileSchema=D,exports.FillInBlanksItemSchema=Be,exports.FillInSelectItemSchema=Ve,exports.FlashcardItemSchema=Fe,exports.HotspotObjectSchema=P,exports.ISO8601DateTimeSchema=h,exports.ImageMimeTypeSchema=ht,exports.ItemPropertyKeySchema=pt,exports.LanguageCodeSchema=p,exports.LastAnswerObjectSchema=Y,exports.LinkedSetObjectSchema=O,exports.MCQMultiItemSchema=Re,exports.MCQSingleItemSchema=Le,exports.ManifestAssetsSchema=yt,exports.ManifestCapabilitiesSchema=bt,exports.MatchComplexItemSchema=Ue,exports.MatchPairsItemSchema=He,exports.MathInputItemSchema=Xe,exports.MathRendererSchema=ke,exports.MathSettingsSchema=Ae,exports.MatrixItemSchema=Ye,exports.MediaObjectSchema=Ce,exports.MeshHotspotSchema=N,exports.MetaPropertyKeySchema=mt,exports.ModelMimeTypeSchema=vt,exports.NoteItemSchema=Pe,exports.NumericInputItemSchema=$e,exports.NumericRangeSchema=Ne,exports.OFFICIAL_ACTIONS=ve,exports.OFFICIAL_FEATURE_KEYS=s,exports.OFFICIAL_ITEM_PROPERTIES=c,exports.OFFICIAL_META_PROPERTIES=l,exports.OQSEActionSchema=lt,exports.OQSEFileSchema=W,exports.OQSEItemSchema=U,exports.OQSEManifestSchema=J,exports.OQSEMetaSchema=je,exports.OQSEPFileSchema=X,exports.OQSEQuestionDensitySchema=dt,exports.OQSEStudyModeSchema=ut,exports.OpenEndedItemSchema=Qe,exports.OptionalRichContentSchema=b,exports.PedagogySchema=Oe,exports.PersonObjectSchema=S,exports.PinOnImageItemSchema=Ke,exports.PinOnModelItemSchema=et,exports.PlainTextSchema=v,exports.PolygonHotspotSchema=M,exports.ProgressMetaSchema=Dt,exports.ProgressRecordSchema=Et,exports.RectHotspotSchema=A,exports.RichContentSchema=y,exports.RubricCriterionSchema=V,exports.RubricSchema=H,exports.SPDXLicenseSchema=m,exports.SelectBlankObjectSchema=Me,exports.ShortAnswerItemSchema=ze,exports.SliderItemSchema=Ge,exports.SortItemsItemSchema=We,exports.SourceMaterialSchema=w,exports.SourceMaterialTypeSchema=C,exports.SourceReferenceSchema=T,exports.StatsObjectSchema=Tt,exports.SubtitleTrackSchema=Se,exports.TagDefinitionDictionarySchema=we,exports.TagDefinitionSchema=E,exports.TimelineEventSchema=z,exports.TimelineItemSchema=Je,exports.TimelinePrecisionSchema=R,exports.TranslationObjectSchema=Te,exports.TrueFalseItemSchema=Ie,exports.UUIDSchema=f,exports.Vector3Schema=F,exports.VideoMimeTypeSchema=_t,exports.compareManifestVersions=d,exports.detokenizeOqseTags=Ht,exports.formatManifestErrors=Ct,exports.formatValidationErrors=ot,exports.generateUUID=zt,exports.isCategorize=se,exports.isChessPuzzle=he,exports.isCoreItem=ge,exports.isDiagramLabel=de,exports.isExtendedItem=_e,exports.isFillInBlanks=ee,exports.isFillInSelect=te,exports.isFlashcard=n,exports.isMCQMulti=a,exports.isMCQSingle=i,exports.isMatchComplex=re,exports.isMatchPairs=ne,exports.isMathInput=ue,exports.isMatrix=le,exports.isNote=t,exports.isNumericInput=pe,exports.isOQSEManifest=be,exports.isOpenEnded=fe,exports.isPinOnImage=oe,exports.isPinOnModel=me,exports.isShortAnswer=o,exports.isSlider=ae,exports.isSortItems=ie,exports.isTimeline=ce,exports.isTrueFalse=r,exports.isValidManifestVersion=u,exports.isValidOQSEManifest=wt,exports.isValidSemVer=ye,exports.isValidUUID=Rt,exports.isVersionCompatible=xe,exports.prepareRichTextForDisplay=Ut,exports.safeValidateManifest=St,exports.safeValidateOQSEFile=rt,exports.safeValidateOQSEItem=at,exports.safeValidateOQSEPFile=kt,exports.tokenizeOqseTags=Bt,exports.validateManifest=xt,exports.validateOQSEFile=nt,exports.validateOQSEItem=it,exports.validateOQSEPFile=Ot,exports.validateTier1Markdown=Vt;
|
package/dist/index.d.ts
CHANGED
|
@@ -1 +1,8 @@
|
|
|
1
|
-
export
|
|
1
|
+
export * from './src/oqse';
|
|
2
|
+
export * from './src/oqseValidation';
|
|
3
|
+
export * from './src/manifest';
|
|
4
|
+
export * from './src/manifestValidation';
|
|
5
|
+
export * from './src/progress';
|
|
6
|
+
export * from './src/progressValidation';
|
|
7
|
+
export * from './src/utils';
|
|
8
|
+
export * from './src/richTextProcessor';
|