@memizy/oqse 0.1.6 → 1.0.0-rc.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +90 -75
  3. package/dist/answers.cjs +1 -0
  4. package/dist/answers.js +78 -0
  5. package/dist/assets.cjs +1 -0
  6. package/dist/assets.js +7 -0
  7. package/dist/checkAnswer.cjs +1 -0
  8. package/dist/checkAnswer.js +166 -0
  9. package/dist/compatibility.cjs +1 -0
  10. package/dist/compatibility.js +32 -0
  11. package/dist/features.cjs +1 -0
  12. package/dist/features.js +58 -0
  13. package/dist/fileValidation.cjs +2 -0
  14. package/dist/fileValidation.js +230 -0
  15. package/dist/headerValidation.cjs +1 -0
  16. package/dist/headerValidation.js +26 -0
  17. package/dist/index.cjs +1 -1
  18. package/dist/index.d.ts +10 -0
  19. package/dist/index.js +19 -1029
  20. package/dist/manifest.cjs +1 -0
  21. package/dist/manifest.js +75 -0
  22. package/dist/manifestValidation.cjs +1 -0
  23. package/dist/manifestValidation.js +69 -0
  24. package/dist/markdownSet.cjs +11 -0
  25. package/dist/markdownSet.js +232 -0
  26. package/dist/markdownUtils.cjs +5 -0
  27. package/dist/markdownUtils.js +47 -0
  28. package/dist/oqse.cjs +1 -0
  29. package/dist/oqse.js +108 -0
  30. package/dist/oqseValidation.cjs +1 -0
  31. package/dist/oqseValidation.js +586 -0
  32. package/dist/plainText.cjs +7 -0
  33. package/dist/plainText.js +9 -0
  34. package/dist/progressValidation.cjs +1 -0
  35. package/dist/progressValidation.js +52 -0
  36. package/dist/richTextFields.cjs +1 -0
  37. package/dist/richTextFields.js +101 -0
  38. package/dist/richTextProcessor.cjs +1 -0
  39. package/dist/richTextProcessor.js +51 -0
  40. package/dist/src/answers.d.ts +54 -0
  41. package/dist/src/answers.test.d.ts +1 -0
  42. package/dist/src/assets.d.ts +6 -0
  43. package/dist/src/checkAnswer.d.ts +2 -0
  44. package/dist/src/checkAnswer.test.d.ts +1 -0
  45. package/dist/src/compatibility.d.ts +40 -0
  46. package/dist/src/compatibility.test.d.ts +1 -0
  47. package/dist/src/features.d.ts +12 -0
  48. package/dist/src/features.test.d.ts +1 -0
  49. package/dist/src/fileValidation.d.ts +63 -0
  50. package/dist/src/fileValidation.test.d.ts +1 -0
  51. package/dist/src/index.d.ts +10 -0
  52. package/dist/src/manifest.d.ts +23 -14
  53. package/dist/src/manifestValidation.d.ts +13 -13
  54. package/dist/src/markdownSet.d.ts +47 -0
  55. package/dist/src/markdownSet.test.d.ts +1 -0
  56. package/dist/src/markdownUtils.d.ts +21 -0
  57. package/dist/src/oqse.d.ts +167 -146
  58. package/dist/src/oqseValidation.d.ts +3027 -710
  59. package/dist/src/plainText.d.ts +14 -0
  60. package/dist/src/plainText.test.d.ts +1 -0
  61. package/dist/src/progress.d.ts +2 -2
  62. package/dist/src/richTextFields.d.ts +8 -0
  63. package/dist/src/richTextProcessor.d.ts +33 -11
  64. package/dist/src/specExamples.test.d.ts +5 -0
  65. package/dist/src/utils.d.ts +4 -0
  66. package/dist/utils.cjs +1 -0
  67. package/dist/utils.js +29 -0
  68. package/oqse-header.md +56 -0
  69. package/oqse-manifest.md +249 -0
  70. package/oqse-progress.md +172 -0
  71. package/oqse.md +2232 -0
  72. package/package.json +19 -4
  73. package/schemas/{oqse-header-v0.1.json → oqse-header-v1.0.json} +11 -11
  74. package/schemas/{oqse-manifest-v0.1.json → oqse-manifest-v1.0.json} +37 -18
  75. package/schemas/{oqse-progress-v0.1.json → oqse-progress-v1.0.json} +1 -1
  76. package/schemas/oqse-v1.0.json +8268 -0
  77. package/schemas/oqse-v0.1.json +0 -7626
@@ -0,0 +1,230 @@
1
+ import { OFFICIAL_ITEM_TYPES as e } from "./oqse.js";
2
+ import { formatPath as t, validateJsonDepth as n } from "./utils.js";
3
+ import { OQSEMetaSchema as r, getItemSchema as i } from "./oqseValidation.js";
4
+ import { OFFICIAL_FEATURE_KEYS as a, OFFICIAL_ITEM_PROPERTIES as o, OFFICIAL_META_PROPERTIES as s } from "./manifest.js";
5
+ import { findHeadings as c, splitLines as l } from "./markdownUtils.js";
6
+ import { findAssetKeys as u, findRawHtml as d } from "./richTextProcessor.js";
7
+ import { resolveAsset as f } from "./assets.js";
8
+ import { itemRichText as p, metaRichText as m } from "./richTextFields.js";
9
+ import { detectFeatures as h, looksLikeLatex as g } from "./features.js";
10
+ //#region src/fileValidation.ts
11
+ var _ = class extends Error {
12
+ errors;
13
+ warnings;
14
+ constructor(e, t) {
15
+ super(`Invalid OQSE file:\n${v(e).join("\n")}`), this.name = "OQSEValidationError", this.errors = e, this.warnings = t;
16
+ }
17
+ };
18
+ function v(e) {
19
+ return e.map((e) => e.path ? `${e.path}: ${e.message}` : e.message);
20
+ }
21
+ var y = 1, b = "1.0";
22
+ function x(e) {
23
+ return E(e, "load");
24
+ }
25
+ function S(e) {
26
+ let t = E(e, "strict"), n = t.success && t.errors.length === 0;
27
+ return {
28
+ success: n,
29
+ data: n ? t.data : void 0,
30
+ errors: t.errors,
31
+ warnings: t.warnings
32
+ };
33
+ }
34
+ function C(e) {
35
+ let t = S(e);
36
+ if (!t.success) throw new _(t.errors, t.warnings);
37
+ return t.data;
38
+ }
39
+ var w = new Set(e), T = class {
40
+ errors = [];
41
+ warnings = [];
42
+ add(e, n, r, i, a) {
43
+ let o = {
44
+ severity: e,
45
+ code: n,
46
+ message: r,
47
+ path: t(i)
48
+ };
49
+ a && (o.itemId = a), (e === "error" ? this.errors : this.warnings).push(o);
50
+ }
51
+ addZod(e, t, n, r) {
52
+ for (let i of e.issues) this.add("error", t, i.message, [...n, ...i.path], r);
53
+ }
54
+ };
55
+ function E(e, t) {
56
+ let c = new T(), l = () => ({
57
+ success: !1,
58
+ errors: c.errors,
59
+ warnings: c.warnings
60
+ }), u = t === "strict" ? "error" : "warning";
61
+ try {
62
+ n(e, 10);
63
+ } catch (e) {
64
+ return c.add("error", "SECURITY_LIMIT", e.message, []), l();
65
+ }
66
+ if (!M(e) || !M(e.meta) || !Array.isArray(e.items)) return c.add("error", "INVALID_ROOT", "An OQSE file must be an object with \"version\", \"meta\" and \"items\" (array).", []), l();
67
+ let f = structuredClone(e);
68
+ if (f.$schema !== void 0 && typeof f.$schema != "string") return c.add("error", "INVALID_ROOT", "\"$schema\" must be a string URL.", ["$schema"]), l();
69
+ if (typeof f.version != "string" || !/^\d+\.\d+$/.test(f.version)) return c.add("error", "INVALID_VERSION", "Version must be in MAJOR.MINOR format (e.g. \"1.0\").", ["version"]), l();
70
+ let _ = Number(f.version.split(".")[0]);
71
+ if (_ === 0) return c.add("error", "UNSUPPORTED_VERSION", `OQSE ${f.version} is a pre-release version; this library reads OQSE 1.x (convert the set to 1.0).`, ["version"]), l();
72
+ if (_ !== 1 && c.add("warning", "UNSUPPORTED_VERSION", `Unsupported MAJOR version ${f.version}; loading in best-effort mode.`, ["version"]), f.items.length > 1e4) return c.add("error", "TOO_MANY_ITEMS", "Maximum 10000 items per set.", ["items"]), l();
73
+ if (t === "load" && !j(f.meta, ["meta", "assets"], c)) return l();
74
+ let v = r.safeParse(f.meta);
75
+ if (!v.success) return c.addZod(v.error, "INVALID_META", ["meta"]), l();
76
+ let y = v.data, b = {
77
+ features: a,
78
+ itemProperties: o,
79
+ metaProperties: s
80
+ };
81
+ for (let [e, t] of Object.entries(b)) for (let n of y.requirements?.[e] ?? []) !n.startsWith("x-") && !t.includes(n) && c.add("warning", "UNKNOWN_FEATURE", `Unknown ${e === "features" ? "feature" : "property"} "${n}" in requirements.${e} (ignored).`, [
82
+ "meta",
83
+ "requirements",
84
+ e
85
+ ]);
86
+ let x = new Set(y.requirements?.features ?? []), S = x.has("html"), C = x.has("latex");
87
+ O(y.assets, ["meta", "assets"], c, t), y.thumbnail && !y.assets?.[y.thumbnail] && (c.add(u, "MISSING_THUMBNAIL_ASSET", `Thumbnail references non-existent asset "${y.thumbnail}".`, ["meta", "thumbnail"]), t === "load" && delete y.thumbnail);
88
+ for (let [e, n] of m(y)) {
89
+ let r = S ? null : d(n, { latex: C });
90
+ r && (c.add(u, "RAW_HTML_NOT_ALLOWED", N(r), e), t === "load" && P(y, e.slice(1)));
91
+ }
92
+ let E = /* @__PURE__ */ new Set([y.id]), k = [];
93
+ f.items.forEach((e, n) => {
94
+ let r = ["items", n], a = M(e) && typeof e.id == "string" ? e.id : void 0, o = M(e) ? e.type : void 0;
95
+ if (typeof o == "string" && !o.startsWith("x-") && !w.has(o)) {
96
+ c.add(u, "UNKNOWN_ITEM_TYPE", `Unknown item type "${o}" (custom types must use the "x-" prefix).`, [...r, "type"], a);
97
+ return;
98
+ }
99
+ if (t === "load" && M(e) && !j(e, [...r, "assets"], c, a)) return;
100
+ let s = i(e).safeParse(e);
101
+ if (!s.success) {
102
+ c.addZod(s.error, "INVALID_ITEM", r, a);
103
+ return;
104
+ }
105
+ let l = s.data;
106
+ if (E.has(l.id)) {
107
+ c.add("error", "DUPLICATE_ID", `Duplicate ID "${l.id}" (IDs must be unique within the set, including meta.id).`, [...r, "id"], l.id);
108
+ return;
109
+ }
110
+ E.add(l.id), O(l.assets, [...r, "assets"], c, t, l.id), D(l, r, y, S, C, c, u) && k.push({
111
+ item: l,
112
+ index: n
113
+ });
114
+ });
115
+ let A = k.map((e) => e.item), F = new Set(A.map((e) => e.id)), I = new Set((y.sourceMaterials ?? []).map((e) => e.id));
116
+ for (let { item: e, index: n } of k) {
117
+ let r = ["items", n];
118
+ for (let n of ["relatedItems", "dependencyItems"]) {
119
+ let i = e[n];
120
+ if (!i) continue;
121
+ let a = i.filter((t) => t !== e.id && F.has(t));
122
+ a.length !== i.length && (c.add(u, "DANGLING_REFERENCE", `${n} contains IDs that do not exist in the set or reference the item itself.`, [...r, n], e.id), t === "load" && (e[n] = a));
123
+ }
124
+ if (e.sources) {
125
+ let n = e.sources.filter((e) => I.has(e.id));
126
+ n.length !== e.sources.length && (c.add(u, "DANGLING_REFERENCE", "sources reference source materials that do not exist in meta.sourceMaterials.", [...r, "sources"], e.id), t === "load" && (e.sources = n));
127
+ }
128
+ }
129
+ for (let e of h({
130
+ meta: y,
131
+ items: A
132
+ })) e !== "html" && !x.has(e) && c.add("warning", "UNDECLARED_FEATURE", `The content uses "${e}", but meta.requirements.features does not declare it.`, [
133
+ "meta",
134
+ "requirements",
135
+ "features"
136
+ ]);
137
+ if (!C) for (let { item: e, index: t } of k) {
138
+ let n = p(e).find(([, e]) => g(e));
139
+ n && c.add("warning", "LOOKS_LIKE_LATEX", "The text looks like a LaTeX formula; if it is one, declare the \"latex\" feature (otherwise $ is an ordinary character).", [
140
+ "items",
141
+ t,
142
+ ...n[0]
143
+ ], e.id);
144
+ }
145
+ return {
146
+ success: !0,
147
+ data: {
148
+ ...f,
149
+ meta: y,
150
+ items: A
151
+ },
152
+ errors: c.errors,
153
+ warnings: c.warnings
154
+ };
155
+ }
156
+ function D(e, t, n, r, i, a, o) {
157
+ let s = !0;
158
+ if (!r) for (let [n, r] of p(e)) {
159
+ let o = d(r, { latex: i });
160
+ o && (a.add("error", "RAW_HTML_NOT_ALLOWED", N(o), [...t, ...n], e.id), s = !1);
161
+ }
162
+ if ("targetAsset" in e && typeof e.targetAsset == "string" && !e.type.startsWith("x-")) {
163
+ let r = f(e.targetAsset, e, n), i = e.type === "pin-on-model" ? "model" : "image";
164
+ r ? r.type !== i && (a.add("error", "INVALID_TARGET_ASSET", `targetAsset "${e.targetAsset}" must be of type "${i}".`, [...t, "targetAsset"], e.id), s = !1) : (a.add("error", "MISSING_TARGET_ASSET", `targetAsset "${e.targetAsset}" does not exist in item.assets or meta.assets.`, [...t, "targetAsset"], e.id), s = !1);
165
+ }
166
+ let m = e.type === "timeline" ? e.events : e.type === "categorize" ? e.items : void 0;
167
+ if (m) {
168
+ let n = m.map((e) => e.id);
169
+ new Set(n).size !== n.length && (a.add("error", "DUPLICATE_ID", "Internal IDs must be unique within the item.", [...t, e.type === "timeline" ? "events" : "items"], e.id), s = !1);
170
+ }
171
+ if (e.type === "chess-puzzle" && e.correctAnswers.some((e) => e.length % 2 == 0) && a.add("warning", "CHESS_SEQUENCE_LENGTH", "Each move sequence should end with the learner's move (an odd number of moves; the application plays the replies).", [...t, "correctAnswers"], e.id), e.type === "note") for (let n of ["content", "hiddenContent"]) {
172
+ let r = e[n];
173
+ r && c(l(r)).some((e) => e.level === 1) && a.add("warning", "NOTE_HEADING_LEVEL", "Headings inside a note should start at level 2 (##); the note title is level 1.", [...t, n], e.id);
174
+ }
175
+ let h = e.type === "fill-in-blanks" || e.type === "fill-in-select";
176
+ for (let [n, r] of p(e)) {
177
+ for (let i of k(r)) {
178
+ if (/^https:\/\//i.test(i)) continue;
179
+ let r = /^http:\/\//i.test(i);
180
+ a.add(r ? "warning" : o, "INVALID_IMAGE_URL", r ? `Image "${i}" uses http:// (prefer https://).` : `Image "${i}" needs an absolute https:// URL (use <asset:key /> for other media).`, [...t, ...n], e.id);
181
+ }
182
+ !(h && n.length === 1 && n[0] === "text") && /<blank:[a-zA-Z0-9_-]+\s*\/>/i.test(r) && a.add("warning", "BLANK_OUTSIDE_TEXT", "Blank tags belong only in the text of fill-in-blanks and fill-in-select (shown here as an empty line).", [...t, ...n], e.id);
183
+ }
184
+ for (let [r, i] of p(e)) for (let o of u(i)) f(o, e, n) || a.add("warning", "MISSING_ASSET", `<asset:${o} /> does not exist in item.assets or meta.assets.`, [...t, ...r], e.id);
185
+ for (let r of Object.keys(e.assets ?? {})) n.assets?.[r] && a.add("warning", "ASSET_SHADOWED", `Item asset "${r}" shadows a global asset with the same key; use unique keys.`, [
186
+ ...t,
187
+ "assets",
188
+ r
189
+ ], e.id);
190
+ return s;
191
+ }
192
+ function O(e, t, n, r, i) {
193
+ for (let [a, o] of Object.entries(e ?? {})) o.type !== "image" || o.altText?.trim() || (n.add(r === "strict" ? "error" : "warning", "MISSING_ALT_TEXT", `Image "${a}" has no altText (alternative text for screen readers).`, [
194
+ ...t,
195
+ a,
196
+ "altText"
197
+ ], i), r === "load" && (o.altText = A(o.value) || a));
198
+ }
199
+ function k(e) {
200
+ return [...e.replace(/^ {0,3}(`{3,}|~{3,})[^\n]*\n[\s\S]*?(?:^ {0,3}\1[`~]*[ \t]*$|(?![\s\S]))/gm, "").replace(/`[^`\n]+`/g, "").matchAll(/!\[[^\]\n]*\]\(\s*<?([^)\s>]+)/g)].map((e) => e[1]);
201
+ }
202
+ function A(e) {
203
+ return (e.split(/[?#]/)[0].split("/").pop() ?? "").replace(/\.[a-z0-9]+$/i, "").replace(/[-_]+/g, " ").trim();
204
+ }
205
+ function j(e, t, n, r) {
206
+ let i = e.assets;
207
+ if (!M(i)) return !0;
208
+ let a = {};
209
+ for (let [e, o] of Object.entries(i)) {
210
+ let i = e.toLowerCase();
211
+ if (i in a) return n.add("error", "ASSET_KEY_COLLISION", `Asset keys collide after lowercasing ("${e}").`, [...t, e], r), !1;
212
+ i !== e && n.add("warning", "ASSET_KEY_NORMALIZED", `Asset key "${e}" was converted to "${i}".`, [...t, e], r), a[i] = o;
213
+ }
214
+ e.assets = a;
215
+ for (let t of ["thumbnail", "targetAsset"]) typeof e[t] == "string" && (e[t] = e[t].toLowerCase());
216
+ return !0;
217
+ }
218
+ function M(e) {
219
+ return typeof e == "object" && !!e && !Array.isArray(e);
220
+ }
221
+ function N(e) {
222
+ return `Raw HTML ${e} is not allowed unless the set declares the "html" feature (use Markdown instead).`;
223
+ }
224
+ function P(e, t) {
225
+ let n = e;
226
+ for (let e of t.slice(0, -1)) n = n[e];
227
+ delete n[t[t.length - 1]];
228
+ }
229
+ //#endregion
230
+ export { _ as OQSEValidationError, b as OQSE_VERSION, y as SUPPORTED_OQSE_MAJOR_VERSION, v as formatOQSEIssues, x as loadOQSEFile, S as safeValidateOQSEFile, C as validateOQSEFile };
@@ -0,0 +1 @@
1
+ const e=require("./oqseValidation.cjs");let t=require("zod");var n=t.z.object(e.OQSEMetaSchema.shape).pick({id:!0,title:!0,language:!0,updatedAt:!0,description:!0,author:!0,subject:!0,tags:!0,createdAt:!0,estimatedTime:!0,requirements:!0}).partial({createdAt:!0}).extend({url:e.AbsoluteURLSchema,$schema:t.z.string().url().optional()});function r(e){return n.parse(e)}function i(e){return n.safeParse(e)}exports.OQSEHeaderSchema=n,exports.safeValidateOQSEHeader=i,exports.validateOQSEHeader=r;
@@ -0,0 +1,26 @@
1
+ import { AbsoluteURLSchema as e, OQSEMetaSchema as t } from "./oqseValidation.js";
2
+ import { z as n } from "zod";
3
+ var r = n.object(t.shape).pick({
4
+ id: !0,
5
+ title: !0,
6
+ language: !0,
7
+ updatedAt: !0,
8
+ description: !0,
9
+ author: !0,
10
+ subject: !0,
11
+ tags: !0,
12
+ createdAt: !0,
13
+ estimatedTime: !0,
14
+ requirements: !0
15
+ }).partial({ createdAt: !0 }).extend({
16
+ url: e,
17
+ $schema: n.string().url().optional()
18
+ });
19
+ function i(e) {
20
+ return r.parse(e);
21
+ }
22
+ function a(e) {
23
+ return r.safeParse(e);
24
+ }
25
+ //#endregion
26
+ export { r as OQSEHeaderSchema, a as safeValidateOQSEHeader, i as validateOQSEHeader };
package/dist/index.cjs CHANGED
@@ -1 +1 @@
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 s(e){return[`note`,`flashcard`,`mcq-single`,`short-answer`].includes(e.type)}function ge(e){return!s(e)}var c=[`render`,`edit`,`validate`,`import`,`export`],l=[`markdown`,`math`,`rtl`,`html`,`syntax-highlighting`,`mermaid`,`smiles`,`abc-notation`,`text-to-speech`,`voice-input`,`handwriting-recognition`],u=[`hints`,`explanation`,`incorrectFeedback`,`sources`,`relatedItems`,`dependencyItems`,`timeLimit`,`lang`,`topic`,`pedagogy`],d=[`description`,`thumbnail`,`subject`,`language`,`author`,`contributors`,`license`,`ageRestriction`,`tags`,`tagDefinitions`,`sourceMaterials`,`estimatedTime`,`prerequisites`,`translations`,`relatedSets`];function f(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 p(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 ve(e){if(typeof e!=`object`||!e)return!1;let t=e,n=t.author;return typeof t.version==`string`&&typeof t.id==`string`&&typeof t.appName==`string`&&t.appName!==``&&(n===void 0||typeof n==`object`&&!!n)&&typeof t.capabilities==`object`&&t.capabilities!==null&&Array.isArray(t.capabilities.actions)}function ye(e,t){return!(!f(e)||t.minOqseVersion&&f(t.minOqseVersion)&&p(e,t.minOqseVersion)<0||t.maxOqseVersion&&f(t.maxOqseVersion)&&p(e,t.maxOqseVersion)>0)}var be=/^(?:[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 xe(e){return typeof e==`string`&&be.test(e)}var m=[];for(let e=0;e<256;++e)m.push((e+256).toString(16).slice(1));function Se(e,t=0){return(m[e[t+0]]+m[e[t+1]]+m[e[t+2]]+m[e[t+3]]+`-`+m[e[t+4]]+m[e[t+5]]+`-`+m[e[t+6]]+m[e[t+7]]+`-`+m[e[t+8]]+m[e[t+9]]+`-`+m[e[t+10]]+m[e[t+11]]+m[e[t+12]]+m[e[t+13]]+m[e[t+14]]+m[e[t+15]]).toLowerCase()}var Ce=new Uint8Array(16);function we(){return crypto.getRandomValues(Ce)}var h={};function Te(e,t,n){let r;if(e)r=De(e.random??e.rng?.()??we(),e.msecs,e.seq,t,n);else{let e=Date.now(),i=we();Ee(h,e,i),r=De(i,h.msecs,h.seq,t,n)}return t??Se(r)}function Ee(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 De(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 Oe(e){return xe(e)}function ke(){return Te()}function g(e,t=10,n=0){if(n>t)throw Error(`OQSE Security Error: Maximum nesting depth exceeded limit of ${t} levels.`);if(typeof e==`object`&&e){let r=Array.isArray(e)?e:Object.values(e);for(let e of r)g(e,t,n+1)}}function Ae(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 _=e.z.string().uuid({message:`Invalid UUID format`}),v=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")`),y=e.z.string().min(1,`License identifier must not be empty`),b=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")`),x=e.z.string().url({message:`Must be a valid absolute URL`}),S=e.z.string().regex(/^[a-z0-9_-]+$/,`Asset key must contain only lowercase letters, numbers, hyphens and underscores`),C=e.z.string().min(1,`Text must not be empty`),w=e.z.string().min(1,`Content must not be empty`),T=e.z.string().max(1e4,`Question must not be longer than 10000 characters`).optional(),E=e.z.string().regex(/^[a-zA-Z0-9_-]{1,64}$/,`Token must be alphanumeric, max 64 chars`),D=e.z.object({lang:v,value:e.z.string().min(1,`Subtitle URI must not be empty`).regex(/\.(vtt|srt)(\?.*)?$/i,`Subtitle URI must end with .vtt or .srt`),label:e.z.string().optional(),kind:e.z.enum([`captions`,`subtitles`,`descriptions`]).optional()}),O=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:w.optional(),caption:w.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(D).optional(),license:y.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`]}),k=e.z.record(S,O),A=e.z.object({name:C,role:e.z.string().optional(),email:e.z.string().email(`Invalid email format`).optional(),url:x.optional()}),j=e.z.enum([`url`,`doi`,`isbn`,`pdf`,`textbook`,`video`,`audio`,`image`,`model`,`other`]),M=e.z.object({id:C,type:j,value:C,title:C,description:e.z.string().optional(),authors:e.z.array(C).optional(),publishedDate:b.optional(),retrievedAt:b.optional(),license:y.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`]}),N=e.z.object({id:C,location:e.z.string().optional(),quote:w.optional()}),P=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()}),je=e.z.record(e.z.string(),P),F=e.z.object({features:e.z.array(e.z.string().refine(e=>l.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=>u.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=>d.includes(e)||e.startsWith(`x-`),{message:`Meta property must be an official key or have prefix "x-"`})).optional()}),Me=e.z.object({lang:v,id:_,title:C,downloadUrl:x.optional()}),I=e.z.object({id:_,title:C,downloadUrl:x.optional()}),Ne=e.z.enum([`remember`,`understand`,`apply`,`analyze`,`evaluate`,`create`]),Pe=e.z.enum([`low`,`medium`,`high`]),Fe=e.z.object({bloomLevel:Ne.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:Pe.optional(),partialCredit:e.z.boolean().optional(),penaltyPerWrong:e.z.number().min(0).max(1,`Penalty must be between 0 and 1`).optional()}),L=e.z.object({id:_,language:v,title:C.max(500,`Title must not be longer than 500 characters`),description:w.max(5e3,`Description must not be longer than 5000 characters`).optional(),thumbnail:S.optional(),assets:k.optional(),ageMin:e.z.number().int().nonnegative().optional(),ageMax:e.z.number().int().nonnegative().optional(),subject:e.z.string().optional(),createdAt:b,updatedAt:b,author:A.optional(),contributors:e.z.array(A).optional(),license:y.optional(),licenseUrl:x.optional(),requirements:F.optional(),tags:e.z.array(C).optional(),tagDefinitions:je.optional(),translations:e.z.array(Me).optional(),sourceMaterials:e.z.array(M).optional(),estimatedTime:e.z.number().positive().optional(),prerequisites:e.z.array(I).optional(),relatedSets:e.z.array(I).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`]}),R=e.z.object({id:_,type:e.z.string(),assets:k.optional(),lang:v.optional(),tags:e.z.array(C).optional(),topic:C.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(w.max(2e3,`Hint must not be longer than 2000 characters`)).max(20,`Maximum 20 hints per item`).optional(),explanation:w.max(1e4,`Explanation must not be longer than 10000 characters`).optional(),incorrectFeedback:w.optional(),sources:e.z.array(N).optional(),relatedItems:e.z.array(_).optional(),dependencyItems:e.z.array(_).optional(),pedagogy:Fe.optional(),customData:e.z.record(e.z.string(),e.z.unknown()).optional(),appSpecific:e.z.record(e.z.string(),e.z.unknown()).optional()}),Ie=e.z.object({options:e.z.array(w).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`]}),z=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%`)}),B=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%`)}),V=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`)}),H=e.z.object({type:e.z.literal(`mesh`),label:e.z.string().optional(),targetName:C}),Le=e.z.discriminatedUnion(`type`,[z,B,V,H]),Re=e.z.discriminatedUnion(`type`,[z,B,V]),U=e.z.object({x:e.z.number(),y:e.z.number(),z:e.z.number()}),ze=e.z.object({position:U.optional(),target:U.optional()}),Be=e.z.object({id:C,text:w,correctCategoryIndex:e.z.number().int().nonnegative()}),Ve=e.z.enum([`year`,`month`,`day`,`datetime`]),He=e.z.object({id:C,text:w,date:b,precision:Ve.optional()}),Ue=e.z.union([z.extend({correctLabelIndex:e.z.number().int().nonnegative()}),B.extend({correctLabelIndex:e.z.number().int().nonnegative()}),V.extend({correctLabelIndex:e.z.number().int().nonnegative()})]),We=e.z.object({label:C,percentage:e.z.number().min(0,`Percentage must be non-negative`).max(100,`Percentage must not exceed 100`),description:e.z.string().optional()}),Ge=e.z.object({criteria:e.z.array(We).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`]}),W=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`]}),Ke=R.extend({type:e.z.literal(`note`),title:e.z.string().optional(),content:w.max(1e4,`Content must not be longer than 10000 characters`),hiddenContent:w.max(1e4,`Content must not be longer than 10000 characters`).optional()}),qe=R.extend({type:e.z.literal(`flashcard`),front:w.max(1e4,`Front side must not be longer than 10000 characters`),back:w.max(1e4,`Back side must not be longer than 10000 characters`)}),Je=R.extend({type:e.z.literal(`true-false`),question:w.max(1e4,`Question must not be longer than 10000 characters`),answer:e.z.boolean()}),Ye=R.extend({type:e.z.literal(`mcq-single`),question:w.max(1e4,`Question must not be longer than 10000 characters`),options:e.z.array(w.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([w,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`]}).refine(e=>new Set(e.options.map(e=>e.toLowerCase())).size===e.options.length,{message:`Options must not contain duplicates (case-insensitive)`,path:[`options`]}),Xe=R.extend({type:e.z.literal(`mcq-multi`),question:w.max(1e4,`Question must not be longer than 10000 characters`),options:e.z.array(w.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([w,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.minSelections?e.minSelections<=e.options.length:!0,{message:`minSelections cannot be greater than the number of options`,path:[`minSelections`]}).refine(e=>e.optionExplanations?e.optionExplanations.length===e.options.length:!0,{message:`Number of option explanations must match number of options`,path:[`optionExplanations`]}).refine(e=>new Set(e.options.map(e=>e.toLowerCase())).size===e.options.length,{message:`Options must not contain duplicates (case-insensitive)`,path:[`options`]}),Ze=R.extend({type:e.z.literal(`short-answer`),question:w.max(1e4,`Question must not be longer than 10000 characters`),answers:e.z.array(C).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()}),Qe=R.extend({type:e.z.literal(`fill-in-blanks`),question:T,text:w.max(1e4,`Text must not be longer than 10000 characters`),blanks:e.z.record(E,e.z.array(C).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`]}),$e=R.extend({type:e.z.literal(`fill-in-select`),question:T,text:w.max(1e4,`Text must not be longer than 10000 characters`),blanks:e.z.record(E,Ie)}).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`]}),et=R.extend({type:e.z.literal(`match-pairs`),question:T,prompts:e.z.array(w).min(2,`Must have at least 2 pairs to match`).max(100,`Maximum 100 pairs`),matches:e.z.array(w).min(2,`Must have at least 2 pairs to match`).max(100,`Maximum 100 pairs`)}).refine(e=>e.prompts.length===e.matches.length,{message:`Number of prompts must match number of matches`,path:[`matches`]}),tt=R.extend({type:e.z.literal(`match-complex`),question:T,leftItems:e.z.array(w).min(1,`Must have at least 1 item on left`),rightItems:e.z.array(w).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`]}),nt=R.extend({type:e.z.literal(`sort-items`),question:w.max(1e4,`Question must not be longer than 10000 characters`),items:e.z.array(w).min(2,`Must have at least 2 items to sort`)}),rt=R.extend({type:e.z.literal(`slider`),question:w.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`]}),it=R.extend({type:e.z.literal(`pin-on-image`),question:w.max(1e4,`Question must not be longer than 10000 characters`),targetAsset:S,hotspots:e.z.array(Re).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`]}),at=R.extend({type:e.z.literal(`categorize`),question:w.max(1e4,`Question must not be longer than 10000 characters`),categories:e.z.array(C).min(2,`Must have at least 2 categories`),items:e.z.array(Be).min(1,`Must have at least 1 item to categorize`)}).refine(e=>new Set(e.categories.map(e=>e.toLowerCase())).size===e.categories.length,{message:`Categories must not contain duplicates (case-insensitive)`,path:[`categories`]}).refine(e=>e.items.every(t=>t.correctCategoryIndex<e.categories.length),{message:`Some item references non-existent category`,path:[`items`]}),ot=R.extend({type:e.z.literal(`timeline`),question:w.max(1e4,`Question must not be longer than 10000 characters`),events:e.z.array(He).min(2,`Must have at least 2 events`),randomize:e.z.boolean().optional()}),st=R.extend({type:e.z.literal(`matrix`),question:w.max(1e4,`Question must not be longer than 10000 characters`),rows:e.z.array(C).min(1,`Must have at least 1 row`),columns:e.z.array(C).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`]}),ct=R.extend({type:e.z.literal(`math-input`),question:w.max(1e4,`Question must not be longer than 10000 characters`),correctAnswer:C,alternativeAnswers:e.z.array(C).optional(),tolerance:e.z.number().nonnegative().optional()}),lt=R.extend({type:e.z.literal(`diagram-label`),question:w.max(1e4,`Question must not be longer than 10000 characters`),targetAsset:S,labels:e.z.array(w).min(1,`Must have at least 1 label`),caseSensitive:e.z.boolean().optional(),requireTyping:e.z.boolean().optional(),zones:e.z.array(Ue).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`]}),ut=R.extend({type:e.z.literal(`open-ended`),question:w.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:w.optional(),rubric:Ge.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`]}),dt=R.extend({type:e.z.literal(`numeric-input`),question:w.max(1e4,`Question must not be longer than 10000 characters`),value:e.z.number(),tolerance:e.z.number().nonnegative().optional(),range:W.optional(),unit:e.z.string().optional()}),ft=R.extend({type:e.z.literal(`pin-on-model`),question:w.max(1e4,`Question must not be longer than 10000 characters`),targetAsset:S,hotspots:e.z.array(H).min(1,`Must have at least 1 hotspot`),multipleCorrect:e.z.boolean().optional(),minCorrect:e.z.number().int().positive().optional(),camera:ze.optional()}).refine(e=>e.minCorrect?e.minCorrect<=e.hotspots.length:!0,{message:`Minimum correct answers must not exceed number of hotspots`,path:[`minCorrect`]}),pt=R.extend({type:e.z.literal(`chess-puzzle`),question:w.max(1e4,`Question must not be longer than 10000 characters`),fen:C,answers:e.z.array(e.z.array(C).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()}),G=e.z.discriminatedUnion(`type`,[Ke,qe,Je,Ye,Xe,Ze,Qe,$e,et,tt,nt,rt,it,at,ot,st,ct,lt,ut,dt,ft,pt]),K=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:L,items:e.z.array(G).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)||n.id===e)return!1}if(n.dependencyItems){for(let e of n.dependencyItems)if(!t.has(e)||n.id===e)return!1}}return!0},{message:`Some item references non-existent relatedItems, dependencyItems, or references itself`,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 mt(t){let n=t instanceof Error?t.message:`OQSE Security Error: Maximum nesting depth exceeded limit of 10 levels.`;return new e.z.ZodError([{code:e.z.ZodIssueCode.custom,message:n,path:[]}])}function ht(e){return g(e,10),K.parse(e)}function gt(e){try{g(e,10)}catch(e){return{success:!1,error:mt(e)}}let t=K.safeParse(e);return t.success?{success:!0,data:t.data}:{success:!1,error:t.error}}function _t(e){return g(e,10),G.parse(e)}function vt(e){try{g(e,10)}catch(e){return{success:!1,error:mt(e)}}let t=G.safeParse(e);return t.success?{success:!0,data:t.data}:{success:!1,error:t.error}}var q=e.z.string().min(1,`Value must not be empty`).trim(),yt=e.z.string().regex(/^[a-zA-Z]{2,8}(-[a-zA-Z0-9\-]+)*$/,`Must be a valid BCP 47 locale (e.g., "en", "cs")`),J=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`}),bt=e.z.string().regex(/^urn:uuid:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,`Must be a valid URN UUID (urn:uuid:...)`),Y=e.z.string().regex(/^\d+\.\d+$/,`Version must be in MAJOR.MINOR format (e.g. "0.1")`),xt=[`note`,`flashcard`,`true-false`,`mcq-single`,`mcq-multi`,`short-answer`,`fill-in-blanks`,`fill-in-select`,`match-pairs`,`match-complex`,`sort-items`,`slider`,`pin-on-image`,`categorize`,`timeline`,`matrix`,`math-input`,`diagram-label`,`open-ended`,`numeric-input`,`pin-on-model`,`chess-puzzle`],St=q.refine(e=>xt.includes(e)||e.startsWith(`x-`),{message:`Custom types MUST use the "x-" prefix`}),Ct=e.z.string().refine(e=>c.includes(e)||e.startsWith(`x-`),{message:`Action must be one of [render, edit, validate, import, export] or have prefix "x-"`}),wt=e.z.enum([`game`,`fun`,`drill`]),Tt=e.z.enum([`low`,`medium`,`high`]),Et=e.z.string().refine(e=>l.includes(e)||e.startsWith(`x-`),{message:`Feature must be one of official keys or have prefix "x-"`}),Dt=e.z.string().refine(e=>u.includes(e)||e.startsWith(`x-`),{message:`Item property must be an official key or have prefix "x-"`}),Ot=e.z.string().refine(e=>d.includes(e)||e.startsWith(`x-`),{message:`Meta property must be an official key or have prefix "x-"`});function X(t){return e.z.union([e.z.tuple([e.z.literal(`*`)]),e.z.array(t),e.z.null()])}var kt=e.z.string().refine(e=>e.startsWith(`image/`),{message:`Must be a valid image MIME type (image/...)`}),At=e.z.string().refine(e=>e.startsWith(`audio/`),{message:`Must be a valid audio MIME type (audio/...)`}),jt=e.z.string().refine(e=>e.startsWith(`video/`),{message:`Must be a valid video MIME type (video/...)`}),Mt=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)`}),Nt=e.z.object({image:X(kt).optional(),audio:X(At).optional(),video:X(jt).optional(),model:X(Mt).optional()}),Pt=F.extend({actions:e.z.array(Ct).min(1,`Application must support at least one action`),types:X(St).optional(),assets:Nt.optional()}).superRefine((t,n)=>{(t.actions.includes(`render`)||t.actions.includes(`edit`))&&(!Array.isArray(t.types)||t.types.length===0)&&n.addIssue({code:e.z.ZodIssueCode.custom,message:`types array MUST be declared and non-empty when actions include "render" or "edit"`,path:[`types`]})}),Z=e.z.object({$schema:J.optional(),id:e.z.union([J,bt]),appName:q.max(200,`Name must not be longer than 200 characters`),version:Y,pluginVersion:e.z.string().optional(),minOqseVersion:Y.optional(),maxOqseVersion:Y.optional(),capabilities:Pt,author:A.optional(),contributors:e.z.array(A).optional(),license:e.z.string().max(100,`License must not be longer than 100 characters`).optional(),licenseUrl:J.optional(),locales:e.z.array(yt).optional(),description:e.z.string().max(5e3,`Description must not be longer than 5000 characters`).optional(),emoji:e.z.string().optional(),tags:e.z.array(q).optional(),studyMode:wt.optional(),questionDensity:Tt.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 Ft(e){return Z.parse(e)}function It(e){return Z.safeParse(e)}function Lt(e){return Z.safeParse(e).success}var Rt=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`]}),zt=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:b,timeSpent:e.z.number().int().nonnegative().optional(),hintsUsed:e.z.number().int().nonnegative().default(0),isSkipped:e.z.boolean().optional()}),Bt=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:b.optional(),stats:Rt,lastAnswer:zt.optional(),appSpecific:e.z.record(e.z.string(),e.z.unknown()).optional()}),Vt=e.z.object({setId:_,exportedAt:b,algorithm:e.z.string().regex(/^[a-z0-9-]+$/,`algorithm must be lowercase alphanumeric with hyphens format`).optional()}),Q=e.z.object({$schema:e.z.url().optional(),version:e.z.string().regex(/^\d+\.\d+$/,`Version must be in MAJOR.MINOR format`),meta:Vt,records:e.z.record(_,Bt)});function Ht(e){return Q.parse(e)}function Ut(e){return Q.safeParse(e)}var $=e.z.object(L.shape).pick({id:!0,title:!0,language:!0,updatedAt:!0,description:!0,author:!0,subject:!0,tags:!0,createdAt:!0,estimatedTime:!0,requirements:!0}).partial({createdAt:!0}).extend({url:x,$schema:e.z.string().url().optional()});function Wt(e){return $.parse(e)}function Gt(e){return $.safeParse(e)}function Kt(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 qt(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 Jt(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 Yt(e,t,n){if(!e)return``;let r=t?.features?.includes(`html`)??!1,{text:i,tokens:a}=Kt(e);r||qt(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 Jt(o,a,n)}exports.AbsoluteURLSchema=x,exports.AssetDictionarySchema=k,exports.AssetKeySchema=S,exports.AudioMimeTypeSchema=At,exports.BaseItemSchema=R,exports.BlankTokenSchema=E,exports.BloomLevelSchema=Ne,exports.CameraSetupSchema=ze,exports.CategorizeItemObjectSchema=Be,exports.CategorizeItemSchema=at,exports.ChessPuzzleItemSchema=pt,exports.CircleHotspotSchema=B,exports.CognitiveLoadSchema=Pe,exports.DiagramLabelItemSchema=lt,exports.DiagramZoneSchema=Ue,exports.FeatureFlagSchema=Et,exports.FeatureProfileSchema=F,exports.FillInBlanksItemSchema=Qe,exports.FillInSelectItemSchema=$e,exports.FlashcardItemSchema=qe,exports.Hotspot2DSchema=Re,exports.HotspotObjectSchema=Le,exports.ISO8601DateTimeSchema=b,exports.ImageMimeTypeSchema=kt,exports.ItemPropertyKeySchema=Dt,exports.LanguageCodeSchema=v,exports.LastAnswerObjectSchema=zt,exports.LinkedSetObjectSchema=I,exports.MCQMultiItemSchema=Xe,exports.MCQSingleItemSchema=Ye,exports.ManifestAssetsSchema=Nt,exports.ManifestCapabilitiesSchema=Pt,exports.MatchComplexItemSchema=tt,exports.MatchPairsItemSchema=et,exports.MathInputItemSchema=ct,exports.MatrixItemSchema=st,exports.MediaObjectSchema=O,exports.MeshHotspotSchema=H,exports.MetaPropertyKeySchema=Ot,exports.ModelMimeTypeSchema=Mt,exports.NoteItemSchema=Ke,exports.NumericInputItemSchema=dt,exports.NumericRangeSchema=W,exports.OFFICIAL_ACTIONS=c,exports.OFFICIAL_FEATURE_KEYS=l,exports.OFFICIAL_ITEM_PROPERTIES=u,exports.OFFICIAL_META_PROPERTIES=d,exports.OQSEActionSchema=Ct,exports.OQSEFileSchema=K,exports.OQSEHeaderSchema=$,exports.OQSEItemSchema=G,exports.OQSEManifestSchema=Z,exports.OQSEMetaSchema=L,exports.OQSEProgressSchema=Q,exports.OQSEQuestionDensitySchema=Tt,exports.OQSEStudyModeSchema=wt,exports.OpenEndedItemSchema=ut,exports.OptionalRichContentSchema=T,exports.PedagogySchema=Fe,exports.PersonObjectSchema=A,exports.PinOnImageItemSchema=it,exports.PinOnModelItemSchema=ft,exports.PlainTextSchema=C,exports.PolygonHotspotSchema=V,exports.ProgressMetaSchema=Vt,exports.ProgressRecordSchema=Bt,exports.RectHotspotSchema=z,exports.RichContentSchema=w,exports.RubricCriterionSchema=We,exports.RubricSchema=Ge,exports.SPDXLicenseSchema=y,exports.SelectBlankObjectSchema=Ie,exports.ShortAnswerItemSchema=Ze,exports.SliderItemSchema=rt,exports.SortItemsItemSchema=nt,exports.SourceMaterialSchema=M,exports.SourceMaterialTypeSchema=j,exports.SourceReferenceSchema=N,exports.StatsObjectSchema=Rt,exports.SubtitleTrackSchema=D,exports.TagDefinitionDictionarySchema=je,exports.TagDefinitionSchema=P,exports.TimelineEventSchema=He,exports.TimelineItemSchema=ot,exports.TimelinePrecisionSchema=Ve,exports.TranslationObjectSchema=Me,exports.TrueFalseItemSchema=Je,exports.UUIDSchema=_,exports.Vector3Schema=U,exports.VideoMimeTypeSchema=jt,exports.compareManifestVersions=p,exports.detokenizeOqseTags=Jt,exports.formatOQSEErrors=Ae,exports.generateUUID=ke,exports.isCategorize=se,exports.isChessPuzzle=he,exports.isCoreItem=s,exports.isDiagramLabel=de,exports.isExtendedItem=ge,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=ve,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=f,exports.isValidOQSEManifest=Lt,exports.isValidSemVer=_e,exports.isValidUUID=Oe,exports.isVersionCompatible=ye,exports.prepareRichTextForDisplay=Yt,exports.safeValidateOQSEFile=gt,exports.safeValidateOQSEHeader=Gt,exports.safeValidateOQSEItem=vt,exports.safeValidateOQSEManifest=It,exports.safeValidateOQSEProgress=Ut,exports.tokenizeOqseTags=Kt,exports.validateJsonDepth=g,exports.validateOQSEFile=ht,exports.validateOQSEHeader=Wt,exports.validateOQSEItem=_t,exports.validateOQSEManifest=Ft,exports.validateOQSEProgress=Ht,exports.validateTier1Markdown=qt;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./oqse.cjs"),t=require("./utils.cjs"),n=require("./answers.cjs"),r=require("./oqseValidation.cjs"),i=require("./manifest.cjs"),a=require("./manifestValidation.cjs"),o=require("./progressValidation.cjs"),s=require("./headerValidation.cjs"),c=require("./markdownUtils.cjs"),l=require("./richTextProcessor.cjs"),u=require("./assets.cjs"),d=require("./richTextFields.cjs"),f=require("./features.cjs"),p=require("./fileValidation.cjs"),m=require("./markdownSet.cjs"),h=require("./checkAnswer.cjs"),g=require("./plainText.cjs"),_=require("./compatibility.cjs");exports.AbsoluteURLSchema=r.AbsoluteURLSchema,exports.AnyOQSEItemSchema=r.AnyOQSEItemSchema,exports.AssetDictionarySchema=r.AssetDictionarySchema,exports.AssetKeySchema=r.AssetKeySchema,exports.AudioMimeTypeSchema=a.AudioMimeTypeSchema,exports.BaseItemSchema=r.BaseItemSchema,exports.BlankTokenSchema=r.BlankTokenSchema,exports.BloomLevelSchema=r.BloomLevelSchema,exports.CORE_ITEM_TYPES=e.CORE_ITEM_TYPES,exports.CameraSetupSchema=r.CameraSetupSchema,exports.CategorizeEntrySchema=r.CategorizeEntrySchema,exports.CategorizeItemSchema=r.CategorizeItemSchema,exports.ChessPuzzleItemSchema=r.ChessPuzzleItemSchema,exports.ChoiceIdSchema=r.ChoiceIdSchema,exports.ChoiceSchema=r.ChoiceSchema,exports.CircleHotspotSchema=r.CircleHotspotSchema,exports.CognitiveLoadSchema=r.CognitiveLoadSchema,exports.CustomItemSchema=r.CustomItemSchema,exports.CustomItemTypeSchema=r.CustomItemTypeSchema,exports.DEFAULT_NOTE_HEADING_LEVEL=m.DEFAULT_NOTE_HEADING_LEVEL,exports.DiagramLabelItemSchema=r.DiagramLabelItemSchema,exports.DiagramZoneSchema=r.DiagramZoneSchema,exports.FeatureFlagSchema=a.FeatureFlagSchema,exports.FeatureKeySchema=r.FeatureKeySchema,exports.FeatureProfileSchema=r.FeatureProfileSchema,exports.FillInBlanksItemSchema=r.FillInBlanksItemSchema,exports.FillInSelectItemSchema=r.FillInSelectItemSchema,exports.FlashcardItemSchema=r.FlashcardItemSchema,exports.HIDDEN_CALLOUT_MARKER=m.HIDDEN_CALLOUT_MARKER,exports.Hotspot2DSchema=r.Hotspot2DSchema,exports.HotspotObjectSchema=r.HotspotObjectSchema,exports.ISO8601DateTimeSchema=r.ISO8601DateTimeSchema,exports.ImageMimeTypeSchema=a.ImageMimeTypeSchema,exports.ItemPropertyKeySchema=a.ItemPropertyKeySchema,exports.LanguageCodeSchema=r.LanguageCodeSchema,exports.LastAnswerObjectSchema=o.LastAnswerObjectSchema,exports.LinkedSetObjectSchema=r.LinkedSetObjectSchema,exports.MCQMultiItemSchema=r.MCQMultiItemSchema,exports.MCQSingleItemSchema=r.MCQSingleItemSchema,exports.ManifestAssetsSchema=a.ManifestAssetsSchema,exports.ManifestCapabilitiesSchema=a.ManifestCapabilitiesSchema,exports.MarkdownSetError=m.MarkdownSetError,exports.MatchComplexItemSchema=r.MatchComplexItemSchema,exports.MatchPairsItemSchema=r.MatchPairsItemSchema,exports.MathInputItemSchema=r.MathInputItemSchema,exports.MatrixItemSchema=r.MatrixItemSchema,exports.MediaObjectSchema=r.MediaObjectSchema,exports.MeshHotspotSchema=r.MeshHotspotSchema,exports.MetaPropertyKeySchema=a.MetaPropertyKeySchema,exports.ModelMimeTypeSchema=a.ModelMimeTypeSchema,exports.NoteItemSchema=r.NoteItemSchema,exports.NumericInputItemSchema=r.NumericInputItemSchema,exports.OFFICIAL_ACTIONS=i.OFFICIAL_ACTIONS,exports.OFFICIAL_FEATURE_KEYS=i.OFFICIAL_FEATURE_KEYS,exports.OFFICIAL_ITEM_PROPERTIES=i.OFFICIAL_ITEM_PROPERTIES,exports.OFFICIAL_ITEM_TYPES=e.OFFICIAL_ITEM_TYPES,exports.OFFICIAL_META_PROPERTIES=i.OFFICIAL_META_PROPERTIES,exports.OQSEActionSchema=a.OQSEActionSchema,exports.OQSEFileSchema=r.OQSEFileSchema,exports.OQSEHeaderSchema=s.OQSEHeaderSchema,exports.OQSEItemSchema=r.OQSEItemSchema,exports.OQSEManifestSchema=a.OQSEManifestSchema,exports.OQSEMetaSchema=r.OQSEMetaSchema,exports.OQSEProgressSchema=o.OQSEProgressSchema,exports.OQSEQuestionDensitySchema=a.OQSEQuestionDensitySchema,exports.OQSEStudyModeSchema=a.OQSEStudyModeSchema,exports.OQSEValidationError=p.OQSEValidationError,exports.OQSE_TAG_PATTERN=l.OQSE_TAG_PATTERN,exports.OQSE_VERSION=p.OQSE_VERSION,exports.OpenEndedItemSchema=r.OpenEndedItemSchema,exports.OptionalRichContentSchema=r.OptionalRichContentSchema,exports.PedagogySchema=r.PedagogySchema,exports.PersonObjectSchema=r.PersonObjectSchema,exports.PinOnImageItemSchema=r.PinOnImageItemSchema,exports.PinOnModelItemSchema=r.PinOnModelItemSchema,exports.PlainTextSchema=r.PlainTextSchema,exports.PolygonHotspotSchema=r.PolygonHotspotSchema,exports.ProgressMetaSchema=o.ProgressMetaSchema,exports.ProgressRecordSchema=o.ProgressRecordSchema,exports.PropertyKeySchema=r.PropertyKeySchema,exports.RTL_LANGUAGES=f.RTL_LANGUAGES,exports.RawLatexSchema=r.RawLatexSchema,exports.RectHotspotSchema=r.RectHotspotSchema,exports.RichContentSchema=r.RichContentSchema,exports.RubricCriterionSchema=r.RubricCriterionSchema,exports.RubricSchema=r.RubricSchema,exports.SPDXLicenseSchema=r.SPDXLicenseSchema,exports.SUPPORTED_OQSE_MAJOR_VERSION=p.SUPPORTED_OQSE_MAJOR_VERSION,exports.SelectBlankObjectSchema=r.SelectBlankObjectSchema,exports.ShortAnswerItemSchema=r.ShortAnswerItemSchema,exports.SkillIdSchema=r.SkillIdSchema,exports.SliderItemSchema=r.SliderItemSchema,exports.SortItemsItemSchema=r.SortItemsItemSchema,exports.SourceMaterialSchema=r.SourceMaterialSchema,exports.SourceMaterialTypeSchema=r.SourceMaterialTypeSchema,exports.SourceReferenceSchema=r.SourceReferenceSchema,exports.StatsObjectSchema=o.StatsObjectSchema,exports.SubtitleTrackSchema=r.SubtitleTrackSchema,exports.TagDefinitionDictionarySchema=r.TagDefinitionDictionarySchema,exports.TagDefinitionSchema=r.TagDefinitionSchema,exports.TimelineDateSchema=r.TimelineDateSchema,exports.TimelineEventSchema=r.TimelineEventSchema,exports.TimelineItemSchema=r.TimelineItemSchema,exports.TimelinePrecisionSchema=r.TimelinePrecisionSchema,exports.TranslationObjectSchema=r.TranslationObjectSchema,exports.TrueFalseItemSchema=r.TrueFalseItemSchema,exports.UUIDSchema=r.UUIDSchema,exports.Vector3Schema=r.Vector3Schema,exports.VideoMimeTypeSchema=a.VideoMimeTypeSchema,exports.allowedTypos=n.allowedTypos,exports.assertNoRawHtml=l.assertNoRawHtml,exports.checkAnswer=h.checkAnswer,exports.checkCompatibility=_.checkCompatibility,exports.choiceList=r.choiceList,exports.compareManifestVersions=i.compareManifestVersions,exports.compareTimelineEvents=n.compareTimelineEvents,exports.detectFeatures=f.detectFeatures,exports.detokenizeOqseTags=l.detokenizeOqseTags,exports.editDistance=n.editDistance,exports.effectiveFeatures=f.effectiveFeatures,exports.findAssetKeys=l.findAssetKeys,exports.findRawHtml=l.findRawHtml,exports.formatOQSEErrors=t.formatOQSEErrors,exports.formatOQSEIssues=p.formatOQSEIssues,exports.formatPath=t.formatPath,exports.generateUUID=t.generateUUID,exports.getItemSchema=r.getItemSchema,exports.isCategorize=e.isCategorize,exports.isChessPuzzle=e.isChessPuzzle,exports.isCoreItem=e.isCoreItem,exports.isCustomItem=e.isCustomItem,exports.isDiagramLabel=e.isDiagramLabel,exports.isExtendedItem=e.isExtendedItem,exports.isFillInBlanks=e.isFillInBlanks,exports.isFillInSelect=e.isFillInSelect,exports.isFlashcard=e.isFlashcard,exports.isMCQMulti=e.isMCQMulti,exports.isMCQSingle=e.isMCQSingle,exports.isMatchComplex=e.isMatchComplex,exports.isMatchPairs=e.isMatchPairs,exports.isMathInput=e.isMathInput,exports.isMatrix=e.isMatrix,exports.isNote=e.isNote,exports.isNumericInput=e.isNumericInput,exports.isOQSEManifest=i.isOQSEManifest,exports.isOpenEnded=e.isOpenEnded,exports.isPinOnImage=e.isPinOnImage,exports.isPinOnModel=e.isPinOnModel,exports.isShortAnswer=e.isShortAnswer,exports.isSlider=e.isSlider,exports.isSortItems=e.isSortItems,exports.isTimeline=e.isTimeline,exports.isTimelineDate=n.isTimelineDate,exports.isTimelineOrderCorrect=n.isTimelineOrderCorrect,exports.isTrueFalse=e.isTrueFalse,exports.isValidManifestVersion=i.isValidManifestVersion,exports.isValidOQSEManifest=a.isValidOQSEManifest,exports.isValidSemVer=i.isValidSemVer,exports.isValidUUID=t.isValidUUID,exports.isVersionCompatible=i.isVersionCompatible,exports.itemRichText=d.itemRichText,exports.loadOQSEFile=p.loadOQSEFile,exports.looksLikeLatex=f.looksLikeLatex,exports.metaRichText=d.metaRichText,exports.normalizeAnswerText=n.normalizeAnswerText,exports.parseMarkdownSet=m.parseMarkdownSet,exports.prepareRichTextForDisplay=l.prepareRichTextForDisplay,exports.resolveAsset=u.resolveAsset,exports.safeParseMarkdownSet=m.safeParseMarkdownSet,exports.safeValidateOQSEFile=p.safeValidateOQSEFile,exports.safeValidateOQSEHeader=s.safeValidateOQSEHeader,exports.safeValidateOQSEItem=r.safeValidateOQSEItem,exports.safeValidateOQSEManifest=a.safeValidateOQSEManifest,exports.safeValidateOQSEProgress=o.safeValidateOQSEProgress,exports.serializeMarkdownSet=m.serializeMarkdownSet,exports.shiftHeadings=c.shiftHeadings,exports.textAnswerMatches=n.textAnswerMatches,exports.toPlainText=g.toPlainText,exports.tokenizeOqseTags=l.tokenizeOqseTags,exports.validateJsonDepth=t.validateJsonDepth,exports.validateOQSEFile=p.validateOQSEFile,exports.validateOQSEHeader=s.validateOQSEHeader,exports.validateOQSEItem=r.validateOQSEItem,exports.validateOQSEManifest=a.validateOQSEManifest,exports.validateOQSEProgress=o.validateOQSEProgress,exports.withManifestDefaults=i.withManifestDefaults;
package/dist/index.d.ts CHANGED
@@ -8,3 +8,13 @@ export * from './src/header';
8
8
  export * from './src/headerValidation';
9
9
  export * from './src/utils';
10
10
  export * from './src/richTextProcessor';
11
+ export * from './src/markdownSet';
12
+ export { shiftHeadings } from './src/markdownUtils';
13
+ export * from './src/fileValidation';
14
+ export * from './src/richTextFields';
15
+ export * from './src/assets';
16
+ export * from './src/answers';
17
+ export * from './src/checkAnswer';
18
+ export * from './src/plainText';
19
+ export * from './src/features';
20
+ export * from './src/compatibility';