@inklyre/oes-core
v0.3.0
Published
Types, schema validation, and reference resolution for OES (Open Education Standards) content.
Readme
@inklyre/oes-core
Types, schema validation, and reference resolution for OES (Open Education Standards) content — the foundation every other OES tool is meant to build on rather than reimplement.
Install
npm install @inklyre/oes-coreWhat this does
- Types — hand-written TypeScript types for all 5 specs (OCF, OPF, OQF,
OAF, OVF), kept honest against the real JSON Schemas by a test suite that
runs every fixture in this repo's
conformance/through this package's own validator (test/conformance.test.ts) — a schema change with no matching type update fails that suite. - Validate — one JSON Schema validator (
ajv) per document type. - Resolve — walks a course/set's
path/*_urlreferences into one fully-resolved, validated tree, using a pluggableContentSourceso the exact same resolution logic runs from the local filesystem (a CLI, the desktop Studio app) or over HTTP (a browser LMS, the playground). Every reference'scontent_hash, where declared, is verified against the fetched content along the way — a mismatch is reported the same way a dangling reference is, viaResolveError, without failing the rest of the tree.
Usage
import { validateOqfQuestion } from "@inklyre/oes-core";
const result = validateOqfQuestion(someJson);
if (result.valid) {
// result.data is now typed as OqfQuestion, narrowed further by `type`
console.log(result.data.title);
} else {
console.error(result.errors);
}import { fsSource, resolveCourse } from "@inklyre/oes-core";
const { data, errors } = await resolveCourse(fsSource("./my-course"));
// data: the full course → module → lesson → article/video/practice-set →
// question → stimulus tree, every document already schema-validated.
// errors: any broken reference along the way — resolution of everything
// else still completes; see ResolveError.import { urlSource, resolveSet } from "@inklyre/oes-core";
// Same resolver, a URL-rooted source instead — works unchanged in a browser.
const { data, errors } = await resolveSet(
urlSource("https://raw.githubusercontent.com/example/practice-set/main/")
);What this doesn't do
- Referential-integrity linting beyond what
resolvenaturally checks (e.g. duplicateids across a whole tree,answer_keyfile existence independent of whether anything currently references it,match/orderanswer cross-references, poolselect≤from.length) — that's@inklyre/oes-lint, not this package.resolveonly reports references it actually walked. - Rendering — turning resolved content into UI is
@oes/renderer's job (planned), not this package's. - Progress, grading, or any runtime state — deliberately out of scope for OES itself; see the Versioning & Conformance page's "Scope: content, not runtime state" section.
