Monorepo for QTI conversion, transformation, browser import, and TAO PCI support.
Published packages:
@citolab/qti-convert: core conversion and transformation APIs@citolab/qti-convert-cli: command line tools@citolab/qti-browser-import: browser-side QTI package import and cache URL rewriting@citolab/qti-convert-local-ai: browser-side CSV/XLSX to QTI package conversion helpers@citolab/qti-convert-tao-pci: TAO PCI conversion helpers
Install the package you need:
npm install @citolab/qti-convert
npm install @citolab/qti-convert-cli
npm install @citolab/qti-browser-import
npm install @citolab/qti-convert-local-ai
npm install @citolab/qti-convert-tao-pciCLI commands are published by @citolab/qti-convert-cli.
npx --package=@citolab/qti-convert-cli qti-convert-pkg yourpackage.zipnpx --package=@citolab/qti-convert-cli qti-convert-pkg /path/to/folder-with-zipsnpx --package=@citolab/qti-convert-cli qti-convert-folder yourfoldernpx --package=@citolab/qti-convert-cli qti-strip-media-pkg yourpackage.zipWith file type and size filters:
npx --package=@citolab/qti-convert-cli qti-strip-media-pkg yourpackage.zip audio,.css,300kbnpx --package=@citolab/qti-convert-cli qti-create-assessment yourfoldernpx --package=@citolab/qti-convert-cli qti-create-manifest yourfolderThe @citolab/qti-convert package exports these entry points:
@citolab/qti-convert/qti-convert@citolab/qti-convert/qti-convert-node@citolab/qti-convert/qti-transformer@citolab/qti-convert/qti-loader@citolab/qti-convert/qti-helper@citolab/qti-convert/qti-helper-node
import { convertQti2toQti3 } from '@citolab/qti-convert/qti-convert';
const qti2Xml = '<qti-assessment-item ...>...</qti-assessment-item>';
const qti3Xml = await convertQti2toQti3(qti2Xml);import { convertPackageStream } from '@citolab/qti-convert/qti-convert-node';
import { createReadStream, writeFileSync } from 'node:fs';
import * as unzipper from 'unzipper';
const inputZipStream = createReadStream('path/to/qti2.zip').pipe(unzipper.Parse({ forceStream: true }));
const outputBuffer = await convertPackageStream(inputZipStream);
writeFileSync('path/to/qti3.zip', outputBuffer);import { convertPackageFile } from '@citolab/qti-convert/qti-convert-node';
await convertPackageFile('path/to/qti2-package.zip', 'path/to/qti3-package.zip');import { qtiTransform } from '@citolab/qti-convert/qti-transformer';
const transformedXml = qtiTransform('<qti-assessment-item ...>...</qti-assessment-item>')
.stripStylesheets()
.objectToImg()
.customTypes()
.xml();import { createOrCompleteManifest, createAssessmentTest } from '@citolab/qti-convert/qti-helper-node';
const manifest = await createOrCompleteManifest('path/to/qti-folder');
const assessmentTest = await createAssessmentTest('path/to/qti-folder');import { getAllResourcesRecursively, QtiResource } from '@citolab/qti-convert/qti-helper-node';
const allResources: QtiResource[] = [];
getAllResourcesRecursively(allResources, 'path/to/qti-folder');@citolab/qti-browser-import provides browser-side package import helpers, package cache utilities, PCI path normalization, and QTI upgrader stylesheet helpers.
@citolab/qti-convert-local-ai provides browser-side CSV/XLSX parsing, LLM mapping helpers, and deterministic QTI 3.0 package generation.
@citolab/qti-convert-tao-pci provides TAO-specific PCI conversion helpers and bundled runtime assets.
Apache-2.0. See LICENSE.